Skip to content
agentgateway has joined the Agentic AI FoundationLearn more

For the complete documentation index, see llms.txt. Markdown versions of all docs pages are available by appending .md to any docs URL.

Audio models

Page as Markdown

Configure self-hosted audio models such as Voxtral with passthrough routing for transcription endpoints.

Configure self-hosted audio models like Voxtral Small through agentgateway. Audio models expose endpoints like /v1/audio/transcriptions and /v1/models that are handled via Passthrough routing — agentgateway forwards the request and response without parsing or modifying the payload.

Before you begin

Install and set up an agentgateway proxy.

Set up and expose your audio model

Step 1: Deploy the audio model (self-hosted)

Deploy the audio model inside your cluster (e.g., Voxtral Small via vLLM) and expose it via a Service.

Warning

Voxtral Small requires a Docker environment with NVIDIA GPU support (nvidia-container-toolkit).

  1. Deploy Voxtral Small using the official vLLM OpenAI-compatible image.

    kubectl apply -f- <<EOF
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: voxtral-vllm
      namespace: agentgateway-system
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: voxtral-vllm
      template:
        metadata:
          labels:
            app: voxtral-vllm
        spec:
          containers:
          - name: voxtral-vllm
            image: vllm/vllm-openai:latest
            args:
            - "vllm"
            - "serve"
            - "mistralai/Voxtral-Small-24B-2507"
            - "--tokenizer_mode"
            - "mistral"
            - "--config_format"
            - "mistral"
            - "--load_format"
            - "mistral"
            - "--tool-call-parser"
            - "mistral"
            - "--enable-auto-tool-choice"
            ports:
            - containerPort: 8000
              name: http
            resources:
              limits:
                nvidia.com/gpu: "1"
              requests:
                nvidia.com/gpu: "1"
    ---
    apiVersion: v1
    kind: Service
    metadata:
      name: voxtral-service
      namespace: agentgateway-system
    spec:
      selector:
        app: voxtral-vllm
      ports:
      - port: 80
        targetPort: 8000
        protocol: TCP
    EOF

    The deployment uses:

    • vllm/vllm-openai:latest — the official vLLM OpenAI-compatible server image
    • vllm serve mistralai/Voxtral-Small-24B-2507 with Mistral-specific configuration
    • Port 8000 internally (vLLM default) exposed as port 80 on the Service
    • NVIDIA GPU reservation (1 GPU)
  2. Wait for the pod to be ready.

    kubectl wait --for=condition=ready pod \
      -l app=voxtral-vllm \
      -n agentgateway-system \
      --timeout=300s

Step 2: Verify the model is responding

Verify that the model is responding by listing the models that it serves. The voxtral-service Service is a ClusterIP Service, so send the request from a pod inside the cluster.

kubectl run curl-audio --rm -i --restart=Never \
  -n agentgateway-system \
  --image=curlimages/curl -- \
  curl -s http://voxtral-service.agentgateway-system.svc.cluster.local:80/v1/models

You should see a JSON response listing the model.

Step 3: Create the LLM backend with Passthrough routes

Create an AgentgatewayBackend resource with policies.ai.routes to forward audio endpoints via Passthrough processing.

kubectl apply -f- <<EOF
apiVersion: agentgateway.dev/v1alpha1
kind: AgentgatewayBackend
metadata:
  name: voxtral-audio
  namespace: agentgateway-system
spec:
  ai:
    provider:
      openai:
        model: voxtral-small-24b-2507
      host: voxtral-service.agentgateway-system.svc.cluster.local
      port: 80
  policies:
    ai:
      routes:
        "/v1/audio/transcriptions": "Passthrough"
        "/v1/models": "Passthrough"
        "*": "Passthrough"
EOF

Review the following table to understand this configuration. For more information, see the API reference.

SettingDescription
ai.provider.openaiUse the openai provider type — audio models typically expose OpenAI-compatible APIs.
openai.modelThe audio model name.
hostThe in-cluster DNS name of the Service pointing to the audio model.
portThe port the audio model listens on.
policies.ai.routes["/v1/audio/transcriptions"]Routes audio transcription requests with Passthrough processing. Agentgateway forwards the multipart form data and response without modification.
policies.ai.routes["*"]Catches any unmatched paths and forwards them as Passthrough.

Note

The Passthrough route type applies no LLM policies at all. To keep token-based rate limiting and telemetry for audio traffic, set the audio paths to Detect instead. Detect also forwards the payload unchanged, but makes a best effort to extract the model and token counts. For more information about the available route types, see Multiple endpoints.

Step 4: Create an HTTPRoute

Create an HTTPRoute that routes traffic to the audio backend.

kubectl apply -f- <<EOF
apiVersion: gateway.networking.k8s.io/v1
kind: HTTPRoute
metadata:
  name: voxtral-audio-route
  namespace: agentgateway-system
spec:
  parentRefs:
    - name: agentgateway-proxy
      namespace: agentgateway-system
  rules:
    - matches:
        - path:
            type: PathPrefix
            value: /audio
      filters:
        - type: URLRewrite
          urlRewrite:
            path:
              type: ReplacePrefixMatch
              replacePrefixMatch: /
      backendRefs:
        - name: voxtral-audio
          namespace: agentgateway-system
          group: agentgateway.dev
          kind: AgentgatewayBackend
EOF
SettingDescription
matches.pathMatches requests along the /audio path prefix.
filters.urlRewriteStrips the /audio prefix before the request is forwarded, so that the audio model receives the /v1/audio/transcriptions path that it serves. Without this filter, the model receives /audio/v1/audio/transcriptions and returns a 404 response.
backendRefsForwards matching requests to the voxtral-audio AgentgatewayBackend resource that you created in the previous step.

Step 5: Send audio transcription requests

Create a sample WAV file to transcribe. If you already have an audio file, use its path in the following requests instead.

mkdir -p testdata
python3 -c "
import wave
w = wave.open('testdata/sample-audio.wav', 'wb')
w.setnchannels(1); w.setsampwidth(2); w.setframerate(16000)
w.writeframes(b'\x00\x00' * 16000)
w.close()
"

Then, send a transcription request to the audio model through the gateway.

export INGRESS_GW_ADDRESS=$(kubectl get svc -n agentgateway-system agentgateway-proxy -o=jsonpath="{.status.loadBalancer.ingress[0]['hostname','ip']}")

curl --request POST \
  --url "http://${INGRESS_GW_ADDRESS}:80/audio/v1/audio/transcriptions" \
  --header 'Content-Type: multipart/form-data' \
  --form model=voxtral-small-24b-2507 \
  --form 'file=@./testdata/sample-audio.wav' | jq

Note

Supported audio formats: WAV, FLAC, OGG and AU (via libsndfile). These formats are natively supported by the vLLM audio processing pipeline.

Supported audio endpoints

The table below lists the audio-specific endpoints that can be configured via Passthrough routing.

API pathRoute typeDescription
/v1/audio/transcriptionsPassthroughTranscribes audio files to text. Agentgateway forwards the multipart/form-data payload and the JSON response without modification.
/v1/modelsPassthroughLists available models.

Note

When a route is set to Passthrough, agentgateway does not apply any LLM-specific policies (such as cost tracking, rate limiting, or prompt guards) to those requests. The requests are forwarded exactly as received.

Cleanup

You can remove the resources that you created in this guide.
kubectl delete AgentgatewayBackend voxtral-audio -n agentgateway-system
kubectl delete httproute voxtral-audio-route -n agentgateway-system
kubectl delete svc voxtral-service -n agentgateway-system
kubectl delete deployment voxtral-vllm -n agentgateway-system

Next steps

Was this page helpful?
Agentgateway assistant

Ask me anything about agentgateway configuration, features, or usage.

Note: AI-generated content might contain errors; please verify and test all returned information.

Tip: one topic per conversation gives the best results. Use the + button in the chat header to start a new conversation.

Switching topics? Starting a new conversation improves accuracy.
↑↓ navigate select esc dismiss

What could be improved?

Your feedback helps us improve assistant answers and identify docs gaps we should fix.

Need more help? Join us on Discord: https://discord.gg/y9efgEmppm

Want to use your own agent? Add the Solo MCP server to query our docs directly. Get started here: https://search.solo.io/.