Envoy AI Gateway v1.1.0 is the first minor release on the stable 1.x API. It adds token counting across providers, per-request upstream credentials, stream idle timeout with failover, MCP hostname routing and CEL backend selection, optional OpenTelemetry GenAI tracing, and HTTP CONNECT egress. Upgrading from v1.0 needs no CRD migrations; the only operator-facing change is Helm's restricted controller security context.
✨ New Features
Token Counting APIs
- vLLM-compatible
/tokenizeacross providers — Count tokens for a prompt without generating a completion. Chat messages and completion prompts use the vLLM tokenize request shape against vLLM, Vertex AI Gemini, GCP Anthropic, AWS Bedrock Converse, and AWS Anthropic. Native Anthropic clients can use/anthropic/v1/messages/count_tokens; Responses API clients can use/v1/responses/input_tokens(OpenAI and Azure OpenAI). - Anthropic-format
/anthropic/v1/models— Claude clients that call Anthropic's model list endpoint now get the gateway's configured catalog in Anthropic's response shape, scoped by hostname the same way/v1/modelsis.
Per-Request Credentials & Egress
- Per-request upstream credentials via
credentialOverride— A trusted filter can supply the backend credential per request instead of sharing one static key inBackendSecurityPolicy. Source from Envoy dynamic metadata (preferred) or a request header the gateway strips before the backend. API keys, Anthropic, Azure, GCP, and AWS SigV4 are supported. - HTTP CONNECT forward proxy —
GatewayConfig.spec.forwardProxytunnels upstream LLM connections through an HTTP CONNECT proxy (host:port). Bedrock requests through PrivateLink now sign over the actual upstream host, so VPC endpoints no longer fail with a silent 403.
Streaming Resilience
- Stream idle timeout with failover —
AIGatewayRouteRule.streamIdleTimeoutbounds how long Envoy waits without upstream bytes on a streaming response. If it fires before the first token, a retry policy can fail over to the next backend; mid-stream it returns 504. Pair with aBackendTrafficPolicywhose retry covers reset.
MCP Gateway
- Hostname routing and backend selection —
MCPRoute.spec.hostnamesscopes an MCP endpoint to specific hosts.backendSelectorrestricts which backends a session fans out to via CEL rules evaluated at initialize (default Deny). Initialize now advertises merged backend capabilities, and the controller shares one Envoy GatewayBackendper namespace.
Observability
- OpenTelemetry GenAI conventions and Grafana dashboard — Set
AI_GATEWAY_TRACING_SEMCONV=gen_aion the ext-proc to emitgen_ai.*span attributes. An example dashboard forgen_ai_*Prometheus metrics ships inexamples/monitoring/grafana-dashboard.json. Controller and ext-proc logs accept--logFormat=json; MCP resource reads populatemcp_resource_uriin access-log metadata.
Provider Translation & API Compatibility
- Structured output for Claude on Vertex AI — JSON-schema constrained decoding now works for Claude models on Vertex AI that advertise
output_config. OpenAIreasoning_effortis forwarded to Bedrock asreasoning_config. - Responses API
tool_search, unknown tools, and Codex inputs — The Responses API accepts the built-intool_searchtool andadditional_tools, preserves unknown tool types, and accepts Codex-style agent input items.
Helm & Operations
- Controller hardening and sharded config secrets — The chart can emit a PDB, honour
topologySpreadConstraints, and attach extrapodLabels. Filter configuration is split across multiple Secrets so large Gateway configs no longer hit Kubernetes' 1 MiB Secret size limit.
🔗 API Updates
AIGatewayRouteRule.name— Optional unique name copied onto the generatedHTTPRouterule.route-not-foundis reserved.AIGatewayRouteRule.streamIdleTimeout— Optional Gateway API duration; unset means no per-try idle timeout.BackendSecurityPolicy.spec.credentialOverride— Optional per-request credential source. Exactly one offromRequestHeadersorfromDynamicMetadata.fallbackToConfigureddefaults totrue.GatewayConfig.spec.forwardProxy— Optional HTTP CONNECT proxy.addressis required (host:port).MCPRoute.spec.hostnames— Optional list of hostnames (max 16).MCPRoute.spec.backendSelector— Optional CEL selector evaluated at session initialize.defaultActiondefaults to Deny.
⚠️ Breaking Changes
- Helm controller security context defaults — The Helm chart now sets a restricted
podSecurityContextand containersecurityContexton the controller (non-root UID/GID 65532, all capabilities dropped, no privilege escalation, RuntimeDefault seccomp). Previously both were empty. If you run a custom controller image that cannot use UID 65532, overridecontroller.podSecurityContextandcontroller.securityContextin your values.
📖 Upgrade Guidance
Upgrading from v1.0 requires no CRD migrations. New fields are optional and backward compatible. Review the Helm security-context change if you override the controller image.
If the official controller image works for you, no action is needed. To restore empty security contexts:
controller:
podSecurityContext: {}
securityContext: {}JSON logs: set controller.logFormat and extProc.logFormat to json. Enable a PDB with controller.podDisruptionBudget.enabled: true when you run more than one replica.
📦 Dependency Versions
| Dependency | Version |
|---|---|
| Go | 1.26.4 |
| Envoy Gateway | v1.8.1 |
| Envoy Proxy | v1.38.1 |
| Gateway API | v1.5.1 |
| Gateway API Inference Extension | v1.0.2 |
| MCP Go SDK | v1.7.0 |
🙏 Acknowledgements
Thank you to everyone who made v1.1 possible.