API7 Gateway 3.9.10
OpenAPI to MCP — The OpenAPI2MCP service is no longer bundled inside the gateway image.
Release Date: 2026-04-22
Breaking Changes
Plugins
-
OpenAPI to MCP (opens in Plugin Hub docs)
Upgrade note
The OpenAPI2MCP service is no longer bundled inside the gateway image. It now runs as a separate sidecar container (
api7/openapi-to-mcp), reducing the gateway image size by approximately 150 MB. If you use theopenapi-to-mcpormcp-tools-aclplugins, you must deploy the OpenAPI2MCP sidecar alongside the gateway. In Kubernetes, enableopenapiToMcp.enabled=truein the gateway Helm chart. In Docker Compose, run theapi7/openapi-to-mcpcontainer in the same network namespace as the gateway.
Upgrade Notes
Upgrade note — additional plugin secret fields are encrypted at rest
The Control Plane now encrypts additional credential-bearing plugin fields at rest. Because API7 EE upgrades the Control Plane before the Data Plane, during the upgrade window a 3.9.10 Control Plane encrypts these fields while an older 3.9.9 Data Plane cannot decrypt them, which can cause the affected plugins to fail until the Data Plane is also upgraded.
The newly encrypted fields, by plugin, are:
- AI Proxy:
auth.header,auth.query,auth.gcp.service_account_json - AI Proxy Multi: the same fields under
instances.* - AI RAG:
embeddings_provider.azure_openai.api_key,vector_search_provider.azure_ai_search.api_key - AWS Lambda:
authorization.apikey,authorization.iam.accesskey,authorization.iam.secretkey - OpenID Connect:
client_rsa_private_key - SAML Auth:
secret_fallbacks
If you use any of these plugins with the listed fields, upgrade the Data Plane to 3.9.10 promptly after the Control Plane, and avoid editing those plugins until both sides are on 3.9.10.
Features
Plugins
- AI Proxy (opens in Plugin Hub docs), AI Proxy Multi (opens in Plugin Hub docs)
- Added
override.request_bodyfor per-protocol deep-merge request body overrides andoverride.llm_optionsfor provider-awaremax_tokensmapping. Operators can set protocol-specific parameters (such asmax_tokens,stop_sequences) as defaults or enforced settings using therequest_body_force_overrideflag. Precedence order: model options → LLM options (always force) → request body (per-protocol deep merge). All three new fields (request_body,llm_options,request_body_force_override) are also available per instance under AI Proxy Multi'sinstances[].override. - Added
max_stream_duration_msandmax_response_bytessafeguards to prevent unbounded LLM streaming responses from pinning a worker process at high CPU. When either limit is exceeded, the stream is terminated gracefully with appropriate error signaling. - The gateway now detects client disconnection during streaming and immediately stops reading from the LLM upstream, freeing worker resources and avoiding unnecessary API quota consumption.
- Added
- AI RAG (opens in Plugin Hub docs)
- Added a top-level
ssl_verifyfield (defaulttrue) that controls TLS certificate verification when the plugin calls the embeddings and vector search endpoints.
- Added a top-level
- Prometheus (opens in Plugin Hub docs), OpenTelemetry (opens in Plugin Hub docs), Zipkin (opens in Plugin Hub docs)
- Added a new
response_sourcelabel (Prometheus) andapisix.response_sourcespan attribute (OpenTelemetry, Zipkin) that classifies each response as"apisix"(generated by APISIX, such as plugin rejections or route-not-found),"nginx"(NGINX proxy errors such as connection refused or upstream timeout), or"upstream"(real response from the upstream service). This enables more precise error attribution in dashboards and alerts.
- Added a new
Control Plane
- Added Consul as a service discovery source. Gateways can now discover upstream services registered in Consul, with support for metadata-based filtering and health-check-aware node selection.
- The Control Plane can now dynamically push telemetry configuration (such as trace sampling ratio and export endpoints) to Data Planes via heartbeat, without requiring a gateway restart.
- Added
skip_mtls_uri_regexto SSL/SNI configuration, allowing specific URI patterns to bypass mTLS client certificate verification while keeping mTLS enforced for all other URIs. - Added
POST /apisix/admin/configs/validateendpoint for batch configuration validation. Operators can validate route, service, upstream, and plugin configurations before applying them, catching schema errors without affecting live traffic. - DP Manager now supports native gRPC etcd protocol on port 7943 via cmux, providing Data Planes with an additional connectivity option alongside the existing HTTP-based etcd protocol.
- The
encrypt_fieldsmechanism now supports nested and complex field structures, including arbitrary-depth dotted paths, arrays, and maps. Plugin configurations with deeply nested sensitive fields (such asauth.gcp.service_account_json) are now encrypted at rest correctly.
Console (Dashboard)
- Added form-based configuration modes for the Key Auth and Basic Auth plugins, enabling visual credential setup without manual JSON editing.
- Added OpenID Connect quick start presets with pre-filled configuration templates for common identity providers, simplifying initial OIDC plugin setup.
- Added Consul as a selectable service discovery type in the upstream configuration UI.
- Supported specifying the SNI when configuring
skip_mtls_uri_regex.
Fixes
Plugins
- AI Proxy (opens in Plugin Hub docs)
- Fixed issue: When an LLM provider emitted many small SSE chunks per second (such as single-character reasoning tokens), a single streaming request could monopolize a worker process at 100% CPU, degrading availability for all other traffic on that worker.
- Fixed issue: When a protocol converter was active (for example, Anthropic-to-OpenAI) and the upstream returned SSE events in an unexpected format, the gateway returned a 500 error instead of 502. The gateway now correctly returns 502 Bad Gateway when the upstream response format is incompatible with the configured protocol conversion.
- Fixed issue: When LLM providers returned JSON
nullfor nullable response fields (such asprompt_tokens_detailsorusage), the gateway crashed because the JSON null sentinel value passed Lua truthiness checks but could not be indexed as a table.
- AI Rate Limiting (opens in Plugin Hub docs)
- Fixed issue: Upstream-provided usage keys (from LLM response usage data) that collided with reserved expression environment names (such as
mathorabs) could shadow built-in functions, potentially breaking rate limiting expression evaluation or bypassing limits.
- Fixed issue: Upstream-provided usage keys (from LLM response usage data) that collided with reserved expression environment names (such as
Control Plane
- Fixed issue: Creating OAuth credentials via Developer Portal with an OIDC-type DCR Provider failed on identity providers (such as Keycloak) that require the
client_namefield. Theclient_nameis now included in both DCR register and update requests, using the Application name as the value.
Ingress Controller
- Fixed issue: The Ingress Controller set
hostson both Route and Service when translating ApisixRoute resources. For backends that do not support route-level hosts, this caused a false diff every sync cycle, triggering unnecessary PUT requests and generating massive audit log growth. In one production environment, this resulted in 8 GB / 4.2 million redundantUpdateServiceaudit log entries.
Console (Dashboard)
- Fixed issue: The service discovery loading indicator remained visible indefinitely when the discovery request failed.
- Fixed issue: Nacos service metadata was not refreshed when switching between services in the upstream configuration.
- Fixed issue: Switching login option provider types did not clean up configuration fields from the previous provider, leaving stale values in the form.
- Fixed issue: The IAM policy statements editor crashed with a null reference error when policies data was not yet loaded.
- Fixed issue: The InviteUser and ResetPassword actions did not display error messages when the API call failed, making it unclear why the operation did not succeed.
- Fixed issue: The login option name uniqueness check loaded the full list of login options unnecessarily. It now uses a lightweight API call.
- Fixed issue: The IAM delete role operation used the wrong permission action (
iam:UpdateRoleinstead ofiam:DeleteRole).