Changelog
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog,
and this project adheres to Semantic Versioning.
Unreleased
[0.6.0] - 2026-08-12
Added
- feat(providers): preserve Meta Llama and v0 catalog policies (#1165)
- feat(providers): wire native Ollama factory (#1164)
- feat(responses): add Codex tool protocol compatibility (#1160)
- feat(gemini): refresh developer API model catalog (#1159)
- Merge pull request #1125 from majiayu000/impl/gh1105-model-alias-priority
- feat(gateway): implement GH1105 model aliases and priorities
- Merge pull request #1094 from majiayu000/impl/gh837-t13-github-0-6-policy
- Merge pull request #1122 from majiayu000/workflow/gh1107-retained-branch-disposition
- feat(specrail): gate retained branch dispositions
- Merge pull request #1110 from majiayu000/codex/gh1107-codex-responses-compat
- feat(responses): accept Codex wire items (GH1107 T1)
- feat(providers): add GitHub Models catalog policy for 0.6 (GH837 T13)
- Merge pull request #1090 from majiayu000/codex/gh838-guardrails-ip-access
- Merge pull request #1093 from majiayu000/impl/gh837-amazon-nova-0-6-policy
- feat(providers): add Amazon Nova catalog policy
- feat(providers): deprecate custom API for 0.6
- feat(core): wire guardrails and IP access for GH838
- feat(admin): add built-in dashboard (#1085)
- feat(observability): wire external lifecycle callbacks (#1078)
- feat: adopt SpecRail workflow pack (#1071)
- feat(gemini): execute SDK routes through runtime providers (#1019)
- Merge pull request #996 from majiayu000/codex/issue-968-propagate-shared-endpoint-access
- feat: propagate provider endpoint access contract
- Merge pull request #994 from majiayu000/codex/issue-968-wire-gateway-runtime-policy
- feat: stage provider endpoint access configuration
- feat: enforce endpoint policy for gateway OpenAI runtimes
- feat(security): add policy-aware provider HTTP client (#985)
- feat(security): add provider endpoint policy foundation (#984)
- feat(spend): expose unpriced model metrics
- Merge pull request #901 from majiayu000/harness/issue-831-unpriced-usage-record
- feat(keys): track unpriced usage records
- feat(pricing): add usage-aware dry run (#899)
- feat(config): add unpriced model policy (#897)
- feat(anthropic): allow compatible model ids (#704)
- feat(deepseek): update v4 model metadata
- feat(catalog): refresh gemini and cohere models
- feat(openai): add gpt-5.5 catalog entries
- feat(bedrock): introduce unified catalog
- feat(bedrock): wire native provider
Fixed
- fix(security): upgrade jsonwebtoken to patched 10.x (#1167)
- fix(core)!: resolve unwired subsystem dispositions (#1163)
- fix(gemini): complete Google tool result loop (#1158)
- fix(vertex-ai): unify Google pricing authority (#1156)
- fix(pricing): preserve Google unit semantics
- fix(gemini): keep pricing surface-specific
- fix(pricing): preserve Google exact lookup semantics
- fix(vertex-ai): resolve canonical catalog models
- fix(vertex-ai): preserve canonical pricing IDs
- fix(pricing): resolve exact Google provider rows
- fix(vertex-ai): unify Google pricing authority
- Merge pull request #1155 from majiayu000/impl/gh1128-guardrail-input-minimal
- fix(guardrails): scan tool definitions and partial args
- fix(guardrails): close structured input bypasses
- fix(guardrails): scan structured chat input
- Merge pull request #1154 from majiayu000/impl/gh1127-stream-output-guardrails-minimal
- fix(guardrails): address streaming review feedback
- fix(guardrails): enforce streaming output checks
- fix(storage): gate S3-only helpers by feature (#1151)
- fix(files): enforce tenant-isolated ownership and access (GH1130) (#1149)
- Merge pull request #1144 from majiayu000/codex/gh1129-usage-normalization-recovery
- fix(streaming): ignore empty usage sentinels for billing
- fix(streaming): ignore empty usage sentinels for billing
- fix(streaming): distinguish output from heartbeat frames
- fix(gemini): isolate cloned stream usage state
- fix(streaming): keep Gemini usage state private
- fix(streaming): invalidate malformed Gemini usage
- fix(billing): reject malformed final stream usage
- fix(billing): fail closed on malformed provider usage
- Merge pull request #1139 from majiayu000/impl/gh1132-dev-config-pricing
- fix(config): make dev pricing example usable
- fix(config): reject padded model alias names
- fix(gateway): preserve alias compatibility edges
- fix(gateway): route aliases across specialized endpoints
- fix(gateway): reject duplicate generated deployment ids
- fix(gateway): address PR1125 hosted review
- fix(gateway): satisfy GH1105 strict clippy
- Merge pull request #1124 from vrieswang/issue-1123-factory-auto-detect
- fix(factory): auto-detect private network for localhost catalog providers
- fix(specrail): allow verified merged retained branches
- fix(specrail): revalidate duplicate evidence at gate time
- fix(router): align credential provenance with provider construction
- fix(responses): close final Codex review gaps
- fix(responses): close final Codex review gaps
- fix(responses): address Codex wire review gaps
- fix(responses): enforce Codex T1 wire boundary
- fix(providers): address T13 review findings on github deprecation
- fix(providers): expose Amazon Nova catalog metadata
- fix(providers): unify Amazon Nova model authority
- fix(providers): wire Amazon Nova catalog runtime
- fix(guardrails): fail closed on unsupported policy config
- Merge pull request #1083 from majiayu000/security/gh1066-callback-runtime-hardening
- fix(opentelemetry): serialize export state handoff
- fix(opentelemetry): reap completed export tasks
- Merge pull request #1086 from majiayu000/refactor/gh965-t012-provider-error-redaction
- fix(errors): preserve redacted provider response details
- fix(errors): redact provider gateway responses
- fix(observability): harden Datadog export boundary (#1081)
- fix(callbacks): preserve terminal delivery and shutdown
- Merge pull request #1080 from majiayu000/security/gh1066-stream-terminal-hardening
- fix(observability): report streaming terminal delivery failures
- fix(observability): harden webhook admission redaction
- fix(auth): reject corrupt persisted user state (#1049)
- fix(teams): reject deletes for missing rows (#1061)
- fix(teams): reject updates for missing rows (#1058)
- fix(teams): fail closed on corrupt legacy data (#1055)
- fix(mcp): enforce initialization lifecycle (#1043)
- fix(batch): canonicalize persisted status encoding (#1052)
- fix(auth): reject corrupt API key JSON (#1046)
- fix(deps): update anyhow to 1.0.103 (#1034)
- fix(router): preserve model group insertion order (#1029)
- fix(gemini): preserve endpoint policy errors (#1021)
- fix(vertex-ai): shrink provider runtime state (#1016)
- fix(bedrock): narrow failed dependency retries (#1014)
- fix(bedrock): preserve InvokeAgent compatibility (#1013)
- fix(security): reject private access to official OpenAI endpoint (#1012)
- fix(bedrock): close protocol review gaps (#1011)
- fix(security): close provider endpoint policy gaps (#1010)
- fix(providers): activate endpoint policy runtime (#1007)
- fix(routes): enforce endpoint policy for remaining AI proxies (#1006)
- fix(routes): enforce endpoint policy for direct AI proxies (#1005)
- fix(azure-ai): enforce native endpoint policy (#1003)
- fix(azure): enforce native endpoint policy (#1001)
- Merge pull request #1000 from majiayu000/codex/issue-968-native-anthropic-gemini-vertex
- fix(providers): enforce native endpoint policy
- fix(providers): enforce policy for shared runtime extras (#999)
- fix(providers): wire shared providers to endpoint policy (#997)
- fix: allow policy-bound private OpenAI test paths
- fix: stage private endpoint access until all routes are wired
- fix: retain DNS validation for unwired providers
- fix: use standard image edit test module
- fix(storage): restrict API key owner deletion (#983)
- fix(auth): redact session identifiers from logs (#982)
- fix(auth): redact AuthMethod debug credentials (#981)
- fix(auth): distinguish infrastructure failures from invalid credentials (#980)
- fix(auth): make API key lifecycle database authoritative (#979)
- fix(auth): reject API keys with invalid owners (#978)
- fix(providers): derive Tier-1 capabilities from catalog (#977)
- fix(router): honor provider health check config (#976)
- fix(router): apply per-provider retry policy (#975)
- fix(openai): preserve legacy functions in upstream payloads (#972)
- fix(build): pin Rust toolchain (#956)
- fix(providers): restore deepgram feature gate
- fix(providers): keep gradient_ai pricing rows
- fix(providers): remove stale gradient_ai cfg
- fix(providers): drop google_pse pricing metadata
- Merge pull request #926 from majiayu000/harness/runtime-wf-github-issue-pr-d657b8f7
- fix(error): normalize OpenAI middleware errors
- fix(error): scope OpenAI extractor handlers
- fix(error): normalize OpenAI route boundary errors
- Merge pull request #929 from majiayu000/harness/runtime-wf-github-issue-pr-c6556130
- fix(cache): bound eviction sampling queue
- fix(cache): preserve indexed eviction semantics
- fix(cache): guard stale eviction metadata
- fix(cache): address in-memory eviction feedback
- fix(cache): remove global in-memory lru mutex
- fix(error): address HTTP mapping review feedback
- fix(error): unify gateway HTTP mappings
- fix(error): unify HTTP error mapping
- fix(ai): reserve image proxy budgets atomically
- fix(spend): fail closed unpriced runtime models
- fix(core): classify unwired subsystems (#889)
- fix(rate-limit): fail closed on Redis degradation (#887)
- fix(routes): map unconfigured batch image to client errors (#890)
- fix(error): preserve rate-limit response headers
- fix(images): require model before image generation authz
- fix(server): let CORS preflight bypass auth
- fix(cache): wire response cache runtime (#804)
- fix(anthropic): preserve rich request content (#802)
- fix(anthropic): keep stream chunk message id (#801)
- fix(openai): preserve upstream error envelopes (#800)
- fix: wire http metrics into prometheus output (#790)
- fix: add OpenAI-compatible files routes (#768)
- Merge pull request #734 from majiayu000/fix/issue-728-support-matrix
- fix: unify provider route support matrix
- Merge pull request #733 from majiayu000/fix/issue-729-provider-capability
- fix(provider): enforce capability dispatch contract
- Merge pull request #732 from majiayu000/fix/issue-726-pricing-service
- fix: apply tiered pricing in provider route
- fix: address pricing authority review gaps
- fix: cover xai pricing authority
- fix: converge pricing service spend authority
- Merge pull request #731 from majiayu000/fix/issue-725-provider-instantiation
- fix: preserve custom catalog provider construction
- fix: gate catalog selectors through provider registry
- fix: converge provider instantiation registry
- Merge pull request #730 from majiayu000/fix/issue-724-canonical-type-tree
- fix: forward OpenAI stream options
- fix: converge canonical chat model types
- Merge pull request #721 from majiayu000/fix/issue-713-provider-contract
- fix: align provider contract docs
- Merge pull request #720 from majiayu000/fix/issue-711-budget-reserve-settle
- fix: settle no-usage completion reservations
- fix: close response stream budget gaps
- fix: settle stream budget review gaps
- fix: align core router budget fallback
- fix: tighten budget fallback review handling
- fix: close budget reservation review gaps
- fix: price provider budget reservations
- fix: make bedrock budget reservations model aware
- fix: align budget reservations with provider output caps
- fix: add atomic budget reservations
- fix(router): install atomic routing snapshots (#719)
- fix(router): harden deployment reservations (#717)
- Merge pull request #712 from majiayu000/fix/main-ci-quinn-proto-audit
- fix(ci): update quinn-proto audit advisory
- fix(pricing): tolerate LiteLLM schema drift (#708)
- fix(cost): price Xiaomi MiMo anthropic-compatible routes (#706)
- fix(server): require admin role for budget mutation endpoints (#683)
- fix(provider): wire replicate native dispatch (#698)
- fix(provider): wire fal ai native image dispatch (#697)
- fix(provider): wire Cohere native dispatch (#696)
- fix(provider): wire gemini native dispatch (#695)
- fix(provider): wire vertex ai native dispatch (#694)
- fix(provider): wire github copilot native dispatch (#693)
- fix(streaming): avoid shared request timeout (#692)
- fix(server): reject chat completions when budget is exhausted
- fix(providers): preserve choice index, usage, logprobs and refusal in streaming
- fix(anthropic): reject n!=1 and preserve cache usage details
- fix(provider): catalogify OpenAI-like adapter providers
- fix(server): record budget spend and key usage for chat completions
- fix(cost): error on missing model pricing instead of charging zero
- fix(config): surface not-yet-implemented cache and rate-limit config
- fix(auth): fail closed when no auth method is enabled (#685)
- fix(audio): fail closed for unwired routes (#680)
- fix(audio): enforce multipart upload limits (#678)
- fix(config): redact secrets in config exports (#679)
- fix(ci): restore clippy baseline (#682)
- Merge pull request #673 from majiayu000/harness/runtime-wf-github-issue-pr-63a99a35
- fix(rate-limit): reserve before auth verification
- Merge pull request #671 from majiayu000/split/issue-599-azure-native-dispatch-wire
- fix(provider): patch Azure review follow-ups (#672)
- fix(provider): wire Azure native dispatch
- Merge pull request #668 from majiayu000/split/issue-599-azure-native-dispatch
- fix(provider): harden Azure native parity
- Merge pull request #670 from majiayu000/split/issue-653-rate-limit-reservation-core
- fix(rate-limit): add releaseable reservations
- Merge pull request #667 from majiayu000/harness/runtime-wf-github-issue-pr-5fabd280
- fix(provider): migrate openai stream callers
- fix(provider): add bounded streaming request helper
- fix(security): resolve outbound hostnames for SSRF guard (#662)
- fix(bedrock): reject invalid tool call arguments (#656)
- fix(bedrock): stabilize streaming chunk metadata (#654)
- fix(bedrock): harden runtime model-id fallback (#640)
- fix(router): distinguish unsupported capability (#661)
- fix(config): fail fast for explicit config files (#660)
- fix(providers): report requested factory provider (#659)
- fix(ci): scope release token permissions (#663)
- fix(config): preserve pricing source on merge
- fix(sse): parse Gemini uppercase finish reasons
- fix(guardrails): redact moderation error bodies
- fix(config): preserve auto migrate overlay intent
- fix(router): prefer xai key for api base overrides
- fix(openai): advertise forwarded chat params
- fix(health): reuse readiness aggregates
- fix(openai): preserve streaming audio metadata and reasoning deltas
- fix(storage): simplify Redis init status
- fix(providers): reconcile Mistral Nova xAI and Llama catalogs
- fix(anthropic): lock opus alias metadata
- Merge pull request #613 from majiayu000/codex/issue-611-startup-migrations
- fix(storage): respect budget degradation during schema check
- fix(storage): address migration review feedback
- fix(storage): migrate sqlite fallback on startup
- fix(storage): make startup migrations configurable
- Merge pull request #609 from majiayu000/codex/pricing-review-fixes
- fix(pricing): reject nan pricing inputs
- fix(pricing): validate negative costs and duration dispatch
- Merge pull request #607 from majiayu000/codex/phase0-provider-dispatch
- fix(provider): enforce dispatch classification contract
- Merge pull request #598 from majiayu000/codex/phase0-cache
- fix(cache): reject unwired gateway cache config
- Merge pull request #597 from majiayu000/codex/phase0-pricing
- fix(pricing): reject missing pricing costs
- fix(storage): migrate database during startup
- fix(openai): forward typed chat parameters
- fix(bedrock): enforce model parameter policy (#589)
- fix(ollama): add missing audio field to streaming ChatDelta literals (#585)
- fix(health): treat configured-but-unknown providers as not-ready (#583)
- Merge pull request #586 from majiayu000/fix/issue-556-runtime-degradation
- fix(runtime): fail-fast on enabled-but-failed dependencies (#556)
- fix(ollama): add missing audio field to streaming ChatDelta literals
- fix(bedrock): drop redundant model-id re-parse and allow IAM credential chain
- fix(bedrock): reject prompt arns from converse fallback
- fix(bedrock): stream converse tool calls
- fix(bedrock): parse converse stream events
- fix(bedrock): use converse body for streaming
- fix(bedrock): stream converse catalog models
- fix(bedrock): encode runtime model ids
- fix(bedrock): preserve converse tool calls
- fix(bedrock): allow runtime-resolved model ARNs
- fix(health): treat configured-but-unknown providers as not-ready (#555)
- fix bedrock family hint parsing
- fix bedrock sigv4 clippy lint
- Merge pull request #568 from majiayu000/codex/issue552-openai-stream-audio
- fix(openai): preserve streaming audio deltas
- fix(config): reject unsupported sticky router fields (#562)
- fix(security): stop logging raw upstream response bodies (#551)
- fix(chat): preserve audio in core message round trips (#550)
- fix(server): drain budget persistence on shutdown (#548)
- fix(storage): return retrievable s3 file ids (#547)
- fix(responses): include reasoning items in completed stream output (#546)
- fix(cache): keep volatile extras out of keys (#545)
- fix(cache): preserve nested schema ids in keys (#544)
- fix(oauth): redact generic oidc error bodies (#543)
- fix(responses-stream): emit reasoning_summary_text events for delta.thinking (#532)
- fix(oauth): redact response bodies in error logs (#504)
- fix(http): wire HttpServer::shutdown_signal into start() and close storage (#527)
- fix(http): stop disabling pricing source when semantic_cache is enabled (#502)
- fix(cache): split llm_cache tests + fix invalidate_chat user_specific (#531)
- fix(openai_like): route Tier-1 responses through OpenAIResponseTransformer (#528)
- fix(rate-limit): bound fallback DashMap to prevent memory DoS (#525)
- fix(s3): wire S3Config credentials and endpoint into the AWS client (#523)
- fix(storage): validate file_id in LocalStorage to block path traversal (#524)
- fix(anthropic-stream): extract cache_creation/read tokens in message_delta (#526)
- fix(sse): map Anthropic/Gemini finish reasons in default parse_finish_reason (#500)
- fix(openai): propagate tool_calls and function_call through stream delta (#498)
- fix(cache): include output-affecting fields in chat key, bump schema to v3 (#506)
Changed
- refactor(router): converge completion and SDK runtime (#1162)
- refactor(cost): deprecate legacy compatibility surface (#1161)
- refactor(google): share Gemini catalog with Vertex (#1157)
- Merge pull request #1121 from majiayu000/impl/gh965-t013b-credential-provenance
- refactor(router): normalize credential provenance
- refactor(completion): route unary facade through runtime (#1098)
- Merge pull request #1096 from majiayu000/impl/gh965-t017-retry-helper-deprecation
- refactor(errors): deprecate six provider retry helpers for 0.6 (GH965 D1E-c)
- perf(providers): map GitHub ModelInfos directly from catalog entries
- Merge pull request #1092 from majiayu000/impl/gh837-custom-api-0-6-deprecation
- refactor(sdk): deprecate legacy provider error (T023b) (#1074)
- refactor(errors): add canonical provider redaction (T023a) (#1073)
- Merge pull request #1070 from majiayu000/refactor/gh965-d1e-a1-canonical-retry
- refactor(errors): converge provider retry facts
- refactor(router): pin canonical runtime generations
- refactor(gemini): discover providers from runtime router (#1026)
- refactor(providers): remove unreachable codestral module (#1028)
- refactor(gemini): keep selected runtime identity (#1023)
- Merge pull request #995 from majiayu000/codex/issue-968-normalize-base-config-literals
- refactor: normalize BaseConfig construction
- refactor(providers): delete 14 approved GH837 orphan modules (#971)
- refactor(providers): delete unwired oci module (#952)
- refactor(providers): delete unwired huggingface module (#951)
- refactor(providers): delete unwired langgraph module (#950)
- Merge pull request #949 from majiayu000/harness/gh837-delete-deepl
- refactor(providers): delete unwired deepl module
- Merge pull request #948 from majiayu000/harness/gh837-delete-datarobot
- refactor(providers): delete unwired datarobot module
- Merge pull request #947 from majiayu000/harness/gh837-delete-spark
- refactor(providers): delete unwired spark module
- Merge pull request #946 from majiayu000/harness/gh837-delete-gradient-ai
- refactor(providers): remove unreachable gradient_ai module
- Merge pull request #945 from majiayu000/harness/gh837-delete-google-pse
- refactor(providers): remove unreachable google_pse module
- Merge pull request #944 from majiayu000/harness/gh837-delete-nlp-cloud
- refactor(providers): remove unreachable nlp_cloud module
- Merge pull request #942 from majiayu000/harness/gh842-share-chat-request
- perf(chat): share chat request budget views
- Merge pull request #941 from majiayu000/harness/gh837-delete-triton
- refactor(providers): remove unreachable triton module
- Merge pull request #940 from majiayu000/harness/gh837-delete-predibase
- refactor(providers): remove unreachable predibase module
- Merge pull request #939 from majiayu000/harness/gh837-delete-ragflow
- refactor(providers): remove unreachable ragflow module
- Merge pull request #938 from majiayu000/harness/gh837-delete-morph
- refactor(providers): remove unreachable morph module
- Merge pull request #937 from majiayu000/harness/gh837-delete-manus
- refactor(providers): remove unreachable manus module
- Merge pull request #936 from majiayu000/harness/gh837-delete-exa-ai
- refactor(providers): remove unreachable exa_ai module
- Merge pull request #935 from majiayu000/harness/gh837-delete-databricks
- refactor(providers): remove unreachable databricks module
- Merge pull request #934 from majiayu000/harness/gh837-delete-clarifai
- refactor(providers): remove unreachable clarifai module
- Merge pull request #932 from majiayu000/harness/gh837-delete-baseten
- refactor(providers): remove unreachable baseten module
- Merge pull request #931 from majiayu000/harness/gh837-delete-petals
- refactor(providers): remove unreachable petals module
- Merge pull request #930 from majiayu000/harness/gh837-delete-ai21
- refactor(providers): remove unreachable ai21 module
- Merge pull request #927 from majiayu000/harness/runtime-wf-github-issue-pr-c95565e9
- Merge pull request #928 from majiayu000/harness/runtime-wf-github-issue-pr-cc57a939
- refactor(providers): remove unreachable gigachat module
- perf(ai): remove redundant context clones
- perf(ai): share request context handles
- refactor(providers): remove unreachable firecrawl module
- Merge pull request #923 from majiayu000/codex/issue-837-delete-empower
- refactor(providers): remove unreachable empower module
- Merge pull request #922 from majiayu000/codex/issue-837-delete-vercel-ai
- refactor(providers): remove unreachable vercel ai module
- Merge pull request #921 from majiayu000/codex/issue-842-request-context-arc
- perf(context): share request context extensions
- Merge pull request #920 from majiayu000/codex/issue-837-delete-sap-ai
- refactor(providers): remove unreachable sap ai module
- Merge pull request #919 from majiayu000/codex/issue-842-key-manager-arc
- perf(keys): share hmac secret across key manager clones
- Merge pull request #918 from majiayu000/codex/issue-837-delete-topaz
- refactor(providers): remove unreachable topaz module
- Merge pull request #916 from majiayu000/codex/issue-840-execution-gate
- refactor(ai): route execution through budgeted entrypoints
- Merge pull request #915 from majiayu000/codex/issue-840-image-proxy-budgeted
- refactor(ai): route image proxy budgets through executor
- Merge pull request #914 from majiayu000/codex/issue-840-response-cache-budgeted
- refactor(ai): route cache pricing through budgeted executor
- Merge pull request #913 from majiayu000/codex/issue-840-gemini-budgeted
- refactor(ai): route gemini budgets through executor
- Merge pull request #912 from majiayu000/codex/issue-840-responses-stream-budgeted
- refactor(ai): route responses stream budgets through executor
- Merge pull request #911 from majiayu000/codex/issue-840-images-budgeted
- refactor(ai): route image generation budgets through executor
- Merge pull request #910 from majiayu000/codex/issue-840-audio-budgeted
- refactor(ai): route audio budgets through executor
- Merge pull request #909 from majiayu000/codex/issue-840-chat-budget-manager-access
- refactor(ai): use budgeted key reservations in chat routes
- Merge pull request #908 from majiayu000/codex/issue-840-embeddings-budgeted
- refactor(ai): route embeddings budgets through executor
- Merge pull request #907 from majiayu000/codex/issue-840-availability-routes
- refactor(ai): route availability checks through budgeted
- Merge pull request #906 from majiayu000/codex/issue-840-chat-stream-driver
- refactor(ai): route chat streams through settled finalizer
- Merge pull request #905 from majiayu000/codex/issue-840-settled-stream
- refactor(ai): centralize stream settlement finalizer
- Merge pull request #895 from majiayu000/harness/runtime-wf-github-issue-pr-ab9b0b2b
- refactor(ai): add budgeted executor scaffold
- refactor(ai): centralize budgeted provider calls
- refactor(user-management): split type tests for GH727
- refactor(sync): split versioned map tests for GH727
- refactor(sync): split concurrent vec tests for GH727
- refactor(observability): split metrics tests for GH727
- refactor(openai): split client tests for GH727
- refactor(tests): split moderation routes for GH727
- refactor(anthropic): split client tests for GH727
- refactor(langfuse): split types tests for GH727
- refactor(integrations): split manager tests for GH727
- refactor(gemini): split provider tests for GH727 (#867)
- refactor(virtual-keys): split type tests for GH727 (#866)
- refactor(budget): split alert tests for GH727 (#865)
- refactor(user): split user type tests for GH727
- refactor(teams): split manager tests for GH727
- refactor(config): split server config tests for GH727
- refactor(audio): split audio type tests for GH727
- refactor(tests): split auth middleware integration suite for GH727
- refactor(net): split client utils tests for GH727
- refactor(config): split helper tests for GH727
- refactor(metrics): split aggregate tests for GH727
- refactor(v0): split provider tests for GH727 (#856)
- refactor(observability): split type tests for GH727
- refactor(analytics): split report tests for GH727
- refactor(cache): split type tests for GH727
- refactor(bedrock): split provider tests for GH727 (#852)
- refactor(monitoring): split type tests for GH727 (#851)
- refactor(validation): split request validator for GH727 (#850)
- refactor(oauth): split session module for GH727 (#849)
- refactor(router): split strategy implementation tests for GH727
- refactor(event): split event tests for GH727
- refactor(observability): split OpenTelemetry integration
- refactor(utils): split DataUtils tests for GH727 (#824)
- refactor(storage): split SeaORM team repository for GH727 (#823)
- refactor(cost): extract cost type tests for GH727 (#822)
- refactor(server): extract teams route tests for GH727 (#821)
- refactor(security): extract security type tests for GH727 (#820)
- refactor(providers): split unified provider error facade for GH727 (#819)
- refactor(analytics): split analytics types facade for GH727 (#818)
- refactor(bedrock): project model config from catalog for GH727 (#816)
- refactor(sdk): split SDK types facade for GH727 (#815)
- refactor(vertex): split client modules for GH727 (#814)
- Merge pull request #723 from majiayu000/fix/issue-715-provider-failure-policy
- refactor: split provider retry policy
- style(cache): use validate method syntax
- refactor(openai-models): re-export Usage / *TokensDetails from canonical types (#535)
- refactor(types): collapse FunctionCallDelta / ToolCallDelta to canonical (#538)
- refactor(providers/base): extract shared ProviderModelEntry struct (#537)
- refactor(pricing): collapse pricing::Usage into core::types::responses::Usage (#536)
Added
- Wired the
ollamaselector to its native chat, streaming, embeddings, tools, and health runtime behindproviders-extended, with policy-bound public/private endpoint handling for #837. - Wired
guardrailsinto canonical chat request/response execution with default-on prompt-injection protection and an explicitguardrails.enabled: falseopt-out. - Added gateway
ip_accessconfiguration and registered its middleware ahead of authentication, handlers, and provider execution; default empty rules remain allow-all. - Wired
enterprise.audit_logginginto request audit middleware with structured JSON stderr/file output, and aligned the observability facade with configured Langfuse/OpenTelemetry/Datadog lifecycle callbacks. - Added real default-off Cargo gates for the module-only
a2a,mcp, andwebhooksexperimental libraries. - Added the
pricing.unpriced_model_policyandpricing.unpriced_fallback_cost_per_1k_tokensconfiguration surface for #831 fail-closed unpriced-model enforcement;pricing.allow_degradedremains startup-only. - Added
gateway_unpriced_events_total{provider,model_bucket,policy,outcome}andgateway_unpriced_spend_total{provider,model_bucket,policy,outcome}Prometheus metrics for unpriced-model rejects, router candidate exclusions, and fallback settlements.
Changed
- Breaking behavior: runtime requests for unpriced models now fail closed by default even when
pricing.allow_degraded=true; deployments that intentionally allow unpriced traffic must setpricing.unpriced_model_policy=allow_unpricedand configure a finitepricing.unpriced_fallback_cost_per_1k_tokens.
Deprecated
- Deprecated the unreachable
core::batch::BatchProcessor, duplicatecore::virtual_keys::VirtualKeyManager,core::semantic_cache,core::analytics, default-offcore::a2a/core::mcp/core::realtime/core::webhooks, and optionalcore::user_management::UserManagerpublic surfaces for the 0.6 line. They remain available behind their documented compatibility/features until the approved 0.7 removal; seedocs/architecture/GH838-subsystem-migration-0.6-to-0.7.md. - Deprecated the
providers-extendedpublicamazon_novanative module for the 0.6.0 line while preserving its symbols, constructors, and runtime behavior. The catalog policy now records the same Amazon Nova endpoint/auth contract, five canonical models, token pricing, multimodal/tool metadata, and provider capabilities as the native implementation. Direct Rust imports should migrate to theamazon_novacatalog selector before the planned 0.7.0 native demotion; seedocs/providers/GH837-migration-0.6-to-0.7.md. - Deprecated the
providers-extendedpublicgithubnative module for the 0.6.0 line while preserving its symbols, constructors, and runtime behavior. The catalog policy now records the sameGITHUB_MODELS_API_BASE(https://models.inference.ai.azure.com) endpoint/BearerGITHUB_TOKENauth contract, all 16 GitHub Models, token pricing, multimodal/tool metadata, and provider capabilities as the native implementation, with health served by the OpenAI-compatible catalog route. Direct Rust imports should migrate to thegithubcatalog selector before the planned 0.7.0 native demotion; seedocs/providers/GH837-migration-0.6-to-0.7.md. - Deprecated the
providers-extendedpubliccustom_apimodule and itsCustomHttpxConfig,CustomApiErrorMapper, andCustomHttpxProviderexports for the 0.6.0 line. Existing symbols, signatures, and runtime behavior remain available in 0.6.x, but arbitrary URL/method/template/parser support is no longer a product goal and the surface is scheduled for removal in 0.7.0. Seedocs/providers/GH837-migration-0.6-to-0.7.mdfor alternatives.
Removed
- Removed the module-only
topazprovider implementation from theproviders-extendedsurface for #837. It had no gateway factory or dispatch path, so runtime provider selection is unchanged; downstream crates directly importinglitellm_rs::core::providers::topazmust remove that import or restore the old implementation from git history. - Removed the module-only
sap_aiprovider implementation from theproviders-extendedsurface for #837. It had no gateway factory or dispatch path, so runtime provider selection is unchanged; downstream crates directly importinglitellm_rs::core::providers::sap_aimust remove that import or restore the old implementation from git history. - Removed the module-only
vercel_aiprovider implementation from theproviders-extendedsurface for #837. It had no gateway factory or dispatch path, so runtime provider selection is unchanged; downstream crates directly importinglitellm_rs::core::providers::vercel_aimust remove that import or restore the old implementation from git history. - Removed the module-only
empowerprovider implementation from theproviders-extendedsurface for #837. It had no gateway factory or dispatch path, so runtime provider selection is unchanged; downstream crates directly importinglitellm_rs::core::providers::empowermust remove that import or restore the old implementation from git history.
Fixed
- Fixed IP access denial so blocked requests no longer execute the downstream service before returning
403 Forbidden. - Redis-backed distributed rate limiting now fails closed by default when Redis commands fail, emits
rate_limiter_degraded_total{operation,mode}, and keeps the old local fallback only behindrate_limit.redis_failure_mode: fail_open_local.
[0.5.0] - 2026-04-30
Added
- Merge pull request #412 from majiayu000/feat/provider-model-refresh-2026-04-21
- feat(models): update model catalogs for OpenAI, Anthropic, and Zhipu AI (#388)
- feat(router): add zai prefix alias to zhipu routing
- feat(router): add moonshot/minimax/zhipu dynamic and prefix routing
- feat(router): add atomic routing metrics counters (#376)
- feat(anthropic): add beta headers, structured outputs, and built-in tool types (#324)
- feat(openai): add store/metadata/service_tier params, update image models, mark deprecated (#322)
- feat: replace wildcard re-exports with explicit pub use in lib.rs (#315)
- feat(providers): reject unknown provider type strings with clear error at parse time (#311)
- feat(mistral): add missing params - frequency_penalty, presence_penalty, n, parallel_tool_calls, guardrails (#302)
- feat(core): enable user_management module with stub DB implementations (#296)
- feat: add CI job to compile-check disabled modules (#295)
- feat: enable virtual_keys module with stub database implementations (#292)
- feat(openai): add GPT-5.4 family and fix GPT-4.1 context window (#287)
- feat(gemini): add Gemini 3.1 models, fix systemInstruction and tool call handling (#291)
- feat(mistral): overhaul model catalog with 36+ current models (#290)
- feat: add reasoning_effort parameter and Developer message role for o-series models (#289)
- feat(anthropic): add claude-sonnet-4-6, claude-haiku-4-5; fix opus-4-6 limits and thinking serialization (#288)
- feat(openai-like): forward extra_params to upstream provider (#286)
- feat(config): implement YAML env var substitution in Config::from_file (#285)
- feat(mcp): add lightweight JSON Schema validation for tool arguments (#212) (#232)
- feat(a2a): add periodic health checks and exclude Unknown agents from routing (#213) (#227)
- feat(storage): add cache-aside pattern for API key verification (#207) (#228)
- feat(router): add structured tracing for routing decisions (#229)
- feat(config): add environment variable support for cache/rate-limit/enterprise (#66)
- feat(config): add schema_version field to GatewayConfig (#68)
- feat(examples): add hello example and fix broken bin references (#57)
Fixed
- fix(cli): add gateway release entrypoint
- fix(router): execute with capability-aware deployments
- fix(auth): normalize brute-force lockout keys
- Merge pull request #455 from majiayu000/fix/issue-408-rate-limit-stable-client-key
- fix(rate-limit): ignore untrusted auth headers
- Merge pull request #454 from majiayu000/fix/issue-407-cors-validation-gate
- fix(server): fail fast on invalid cors config
- Merge pull request #453 from majiayu000/fix/issue-409-embedding-array-validation
- fix(embeddings): reject non-string array input
- Merge pull request #452 from majiayu000/fix/issue-413-sdk-chat-model
- fix(sdk): preserve explicit chat model
- Merge pull request #451 from majiayu000/fix/issue-414-vertex-gemini3-models
- fix(vertex-ai): route Gemini 3 models
- Merge pull request #450 from majiayu000/fix/issue-424-gemini-thinking-pricing
- fix(pricing): align Gemini thinking cost
- Merge pull request #449 from majiayu000/fix/issue-436-storage-file-config
- fix(storage): honor configured file storage
- Merge pull request #448 from majiayu000/fix/issue-438-streaming-deployment-lifecycle
- fix(ai): hold deployment leases for streams
- Merge pull request #447 from majiayu000/fix/issue-439-openai-error-envelope
- fix(ai): return OpenAI error envelopes
- Merge pull request #446 from majiayu000/fix/issue-433-filtered-key-pagination
- fix(keys): paginate filtered key listings
- Merge pull request #445 from majiayu000/fix/issue-432-key-admin-promotion
- fix(keys): block non-admin management permission grants
- fix(models): align GPT-5.4 Pro token limits
- Merge pull request #418 from majiayu000/fix/gstack-health-2026-04-24
- fix(deps): address TLS migration review
- Merge pull request #441 from majiayu000/fix/issue-434-key-manager
- Merge pull request #444 from majiayu000/fix/issue-440-virtual-key-persistence
- fix(storage): keep virtual key last-used monotonic
- fix: align Homebrew release automation (#429)
- fix(storage): require explicit sqlite fallback (#442)
- fix: add utility pricing for Gemini flash variants (#425)
- fix(storage): preserve virtual key spend during usage updates
- fix(storage): reject placeholder vector backends (#443)
- fix(storage): avoid virtual key usage races
- fix(keys): bound last used cache
- fix(storage): persist virtual keys
- fix(keys): share key manager across requests
- fix(release): publish gateway binary only (#431)
- fix(deps): eliminate vulnerable TLS and YAML chains
- fix(sdk): wire execute_stream_request to provider dispatch (#396) (#402)
- fix(sdk): parse data URI to extract correct media_type for Anthropic multimodal (#401)
- fix(sdk): implement atomic round-robin rotation in LoadBalancer (#397)
- fix(auth): guard is_admin_route() against prefix confusion (SEC-04) (#393)
- fix(auth): replace prefix match with exact equality in is_public_route (#390)
- fix(errors): replace Box with typed errors at trait boundaries (#384)
- fix(a2a): auto-trigger agent health checks before routing (#381)
- fix(mcp): add optional JSON Schema validation for MCP tool parameters (#380)
- fix(storage): wrap multi-step DB operations in SeaORM transactions (#377)
- fix(storage): add cache-aside invalidation on API key usage write (#378)
- fix(streaming): add CancellationToken to cancel provider streams on client disconnect (#379)
- fix(providers): wire 6 unreachable provider types into factory (#374)
- fix(security): redact sensitive fields in Debug impls for config structs (#369)
- fix(auth): tighten password reset rate limit to 5 requests per 15 minutes (#371)
- fix(rust): add rust-toolchain.toml pinning stable channel (#368)
- fix(router): wire min_requests and success_threshold into circuit breaker (#367)
- fix(providers): implement 5 missing from_config_async branches (#365)
- fix(a2a): replace hardcoded request ID=1 with unique IDs (#361)
- fix(streaming): add VecDeque buffer size limit to prevent OOM (#362)
- fix(responses): address 6 correctness issues from code review (#329)
- fix(responses): resolve CI failures in Responses API implementation (#328)
- fix(macros): remove dead helper functions from provider_config! macro (#321)
- fix(dead_code): resolve 55 of 56 dead_code suppressions (#278) (#320)
- fix(lib): restore FunctionCall and ToolCall to public re-exports (#319)
- fix(errors): replace .unwrap() in production hot paths (#261) (#312)
- fix(openai): update capability lists for GPT-5.4, o3, o4-mini (#274) (#306)
- fix(config): replace hardcoded default string comparison in StorageConfig merge logic (#310)
- fix(config): remove dead hot_reload entries from ConfigPresets (#308)
- fix(core): gate user_management behind storage feature flag (#300)
- fix: deep-merge reasoning object and make effort/max_tokens mutually exclusive (#301)
- fix(openrouter): add HTTP-Referer/X-Title headers and wire reasoning param (#299)
- fix: implement user_management DB ops and wire TeamManager to persistent storage (#298)
- fix: gate virtual_keys module behind gateway feature flag (#294)
- fix: resolve critical TODOs in teams, redis pubsub, and monitoring (#293)
- fix(security): migrate API key hashing to HMAC-SHA256 with server secret (#254)
- fix(auth): implement basic RBAC with admin/user roles in check_permission (#242) (#251)
- fix(security): enforce minimum 32-byte JWT secret length (#240) (#250)
- fix(security): reject empty OAuth allowed_origins instead of permitting all (#241) (#247)
- fix(router): add circular alias and fallback cycle detection (#214) (#234)
- fix(streaming): add idle timeout to SSE streams to prevent zombie connections (#205)
- fix(auth): reject empty JWT secret on startup instead of warn (#204)
- fix(auth): separate access and refresh token verification (#203)
- fix(router): use min_requests and success_threshold in circuit breaker (#200)
- fix(streaming): cancel upstream provider stream on client disconnect (#198)
- fix(provider): add missing from_config_async branches for catalog-covered provider types (#197)
- fix(config): change Redis default to enabled=false (#196)
- fix(streaming): handle SSE errors with proper error events instead of HTTP 200 (#185)
- fix(storage): replace relative ./data path with absolute path in local file storage (#184)
- fix(config): fix boolean merge one-way override in CacheConfig (#183)
- fix(a2a): replace hardcoded request ID=1 with atomic counter (#182)
- fix(config): validate port range to reject values >65535 (#181)
- fix(auth): add input validation for API key creation (#180)
- fix(router): rename CostBased strategy to PriorityBased (#178)
- fix(storage): implement 4 unimplemented S3 methods (#177)
- fix(streaming): add VecDeque buffer capacity limit to prevent OOM (#176)
- fix(security): redact secrets in Debug impl for AuthConfig and ProviderConfig (#175)
- fix(auth): add rate limiting to password reset endpoint (#174)
- fix(storage): replace hardcoded relative SQLite path with platform-aware default_sqlite_path() (#156)
- fix(perf): throttle api_key last_used DB writes to every 5 minutes (#153)
- fix(storage): apply max_connections config to Redis connection pool (#148)
- fix(storage): remove dead BatchOperations referencing nonexistent Database enum (#147)
- fix(security): mask usernames in login log messages to prevent PII leak (#146)
- fix(provider): replace from_f64().unwrap() with safe error handling across providers (#130)
- fix(auth): use transactional reset_password_with_token to eliminate TOCTOU race (#129)
- fix(perf): replace blocking parking_lot::Mutex with tokio::sync::Mutex in memory cache (#133)
- fix(api): forward stream_options field in chat completion requests (#131)
- fix: remove unwrap() panic in Mistral transform_request (closes #77) (#127)
- fix: remove unwrap() panics in vertex_ai provider (closes #78) (#128)
- fix: remove unwrap() panic in S3 cache storage_class parse (closes #76) (#126)
- fix: remove unwrap() panics in openai provider (closes #79) (#125)
- fix(server): mount missing auth/keys/teams/budget/health routes in create_app (#112)
- fix(provider): OpenAILikeProvider::name() returns actual provider name (#117)
- fix(middleware): X-Request-ID generated twice and not returned in responses (#111)
- fix(api): unify pricing routes from /api/v1/ to /v1/ prefix (#123)
- fix(cache): log Redis write failure in dual-cache set_with_size (#121)
- fix(middleware): remove no-op CorsMiddleware implementation (#120)
- fix(budget): eliminate TOCTOU race in create_budget() via Entry API (#116)
- fix(error): replace wildcard with explicit match arms for 11 GatewayError variants (#115)
- fix(sync): eliminate read-modify-write race in AtomicValue::update() (#114)
- fix(security): add ownership verification to API key CRUD endpoints (IDOR) (#110)
- fix(security): SSRF protection for custom API endpoint_url (#109)
- fix(auth): add IP-based rate limiting to /auth/login endpoint (#108)
- fix(api): GET /auth/me incorrectly registered as POST method (#113)
- fix(security): CORS empty origins list no longer defaults to wildcard '*' (#107)
- fix(auth): wrap password reset token ops in database transaction (#73)
- fix(server): add X-Forwarded-For trusted proxy validation (#72)
- fix(auth): replace unwrap_or_else with proper error handling in auth middleware (#67)
- fix(config): correct boolean merge logic in config system (#65)
- fix(deps): consolidate reqwest to single version 0.12.x (#48)
- fix(deps): upgrade quinn-proto to fix CVE-2026-0037 (#50)
- fix(deps): upgrade rand from 0.8 to 0.9 (#47)
- fix(lint): resolve 314 collapsible_if warnings for clippy 1.94.0 (#49)
- fix(security): add rate limiting and unify error messages for registration (#42)
- fix(security): reject session auth until proper session store is implemented (#41)
- fix(security): reject refresh tokens in authenticate_jwt (#39)
- fix(security): use SHA-256 for rate limit key hashing (#40)
- fix(ci): pin rust toolchain and add PR guardrails (#34)
- fix(security): consolidated security hardening — audit fixes, auth hash, env validation, route bypass, OAuth, concurrency (#33)
- fix(error): preserve provider identity in map_http_status_to_error (FUT-59) (#22)
- fix: harden boundary guard and stabilize router/error mapping integration (#14)
- fix(sse): map reasoning_content to thinking delta (#11)
Changed
- style(config): format serde_norway migration cleanup
- refactor(deps): use explicit maintained crate names
- refactor(router): remove redundant dead-code zai/ prefix check (#405)
- refactor(providers): split LLMProvider into focused sub-traits (#383)
- fix(a2a): auto-trigger agent health checks before routing (#381)
- refactor: split factory.rs into registry, resolver, builder, coordinator modules (#317)
- refactor(config): split gateway.rs tests and fix pricing source path (#318)
- refactor(errors): split utils.rs (1435 lines) into focused sub-modules (#316)
- refactor(deps): replace async-trait with native AFIT in core traits (#246) (#252)
- refactor(provider): eliminate unwrap() in provider request/response paths (#245) (#248)
- refactor(provider): remove associated types from LLMProvider trait (#238)
- refactor: extract test modules from oversized gateway_error files (#221) (#237)
- refactor(config): consolidate default values into single source of truth (#235)
- refactor(error): simplify From to use GatewayError::Provider directly (#233)
- refactor(storage): add transaction wrapping and optimistic locking for DB operations (#206) (#230)
- refactor(config): replace Arc with AtomicValue for atomic hot reload (#209) (#226)
- refactor(provider): consolidate 5 dispatch macros into single parametric macro (#224)
- refactor(quality): eliminate unwrap() calls in auth and security paths (#215) (#231)
- refactor(storage): remove dead legacy migration files (#222)
- refactor(error): consolidate GatewayError from 29 to 15 variants (#160)
- refactor(provider): remove orphan LLMProvider implementations (#159)
- refactor: split openai/transformer.rs into focused sub-modules (#154)
- refactor(provider): remove standalone impls for catalog-covered providers (#151)
- refactor(provider): remove dead Provider enum variants without factory paths (#150)
- refactor(provider): consolidate OpenAI dual LLMProvider implementations (#149)
- refactor: remove deprecated legacy config types (#132)
- refactor: remove duplicate LiteLLMError and OpenAIError type definitions (#124)
- refactor: 3-phase architectural refactoring (God Module, Type, Error) (#58)
- perf(observability): shorten record_request write lock hold time (#19)
- perf(recovery): remove blocking mutexes in circuit breaker async path (#15)
- perf(health): replace std rwlock with async monitor locks (#20)
- perf(cache): remove deep clone in hit path via Arc payload (#16)
- refactor(streaming): dedupe done marker handling for pilot providers (#24)
Removed
- Removed the legacy
google-gatewaybinary from Cargo, release archives, CI artifacts, and Docker images. The published gateway distribution now focuses on the maingatewayexecutable.
[0.4.2] - 2026-02-28
Fixed
- fix(ci): fallback to grep when ripgrep is unavailable
[0.4.1] - 2026-02-28
Fixed
- fix(clippy): satisfy strict lints in audio service and router tests
[0.4.0] - 2026-02-28
Changed
- Provider Infra:
BaseConfig::for_provider()now delegates environment loading with the original provider input while keeping normalized default resolution in one place, removing duplicated normalization flow. - Provider Infra:
BaseConfig::provider_env_key()env-key normalization now explicitly covers trimmed/case-variant provider input via regression test. - Provider Infra:
BaseConfig::provider_env_key()now normalizes provider names internally, andfrom_env()reuses normalized env helpers directly to remove duplicated normalization flow. - Provider Infra: Centralized provider environment variable key/value resolution in
BaseConfighelpers (provider_env_key,env_value) to remove repeated env lookup formatting. - Provider Infra: Centralized endpoint URL construction in
BaseConfig::build_endpoint()and reused it for chat/embeddings endpoints to remove duplicated formatting logic. - Provider Infra: Centralized default API version assignment in
BaseConfig::default_api_version()to remove repeated provider-specific conditionals. - Provider Infra:
BaseConfig::for_providernow normalizes provider names (trim + lowercase) before catalog/fallback resolution to prevent casing/spacing drift. - Provider Infra: Removed legacy alias fallback in
BaseConfigand kept canonical provider-name defaults only to avoid alias drift. - Provider Infra: Extracted
legacy_default_base_url()helper inBaseConfigto isolate non-catalog fallback mapping and simplify maintenance while preserving behavior. - Provider Infra:
BaseConfig::for_providernow consults Tier-1 provider catalog defaults first, reducing duplicated base URL definitions while preserving existing fallback behavior. - Provider Infra: Removed the unused
CommonProviderConfigduplicate fromcore::providers::shared, keeping provider base config responsibilities centralized incore::providers::baseand reducing schema duplication.
Added
- Provider Tests: Added B1 batch coverage to validate
aiml_api,anyscale,bytez, andcomet_apiselectors and creation paths resolve through Tier-1 catalog toOpenAILikeproviders. - Provider Tests: Added B2 batch coverage to validate
compactifai,aleph_alpha,yi, andlambda_aiselector and creation paths resolve through Tier-1 catalog toOpenAILikeproviders. - Provider Tests: Added B3 batch coverage to validate
ovhcloud,maritalk,siliconflow, andlemonadeselector and creation paths resolve through Tier-1 catalog toOpenAILikeproviders.
0.3.0 - 2026-02-05
Added
- Agent Coordinator: New
core::agentmodule for managing concurrent agent lifecycles with cancellation, timeouts, and stats. - Utilities: Added
utils::eventpublish/subscribe broker andutils::syncconcurrent containers.
Changed
- Providers: Migrated
ai21,amazon_nova,datarobot, anddeepseekto pooled HTTP provider hooks. - HTTP Client: Standardized pooled client usage and shared client caching across core/providers.
- Routing: Refined provider routing and OpenAI-compatible request/response handling.
Fixed
- Auth Context: Corrected user/api-key context propagation in auth routes and middleware.
- SSRF Validation: DNS resolution failures no longer hard-fail SSRF checks while preserving IP safety.
- Observability: Prometheus label handling now safely maps provider identifiers.
- Concurrency: Event broker handles zero capacity; VersionedMap retry now guarantees progress under contention.
- Packaging: Track core cache sources and add root README for crates.io.
0.1.3 - 2025-09-18
Fixed
- docs.rs Build: Fixed documentation build failure on docs.rs by excluding
vector-dbfeature- Added
all-features = falsetopackage.metadata.docs.rsconfiguration - Explicitly listed features that work with docs.rs read-only filesystem
- Added
- Internationalization: Translated all Chinese comments and documentation to English
- Cleaned 40+ files with hundreds of Chinese comments
- Improved accessibility for international developers
- Maintained technical accuracy in all translations
Changed
- Configuration: Updated
Cargo.tomlmetadata for better docs.rs compatibility - Documentation: All code comments are now in English
0.1.1 - 2025-7-28
Fixed
- Security: Excluded sensitive configuration file
config/gateway.yamlfrom published package - Package: Only include example configuration files (
.example,.template) in published crate - Privacy: Prevent accidental exposure of API keys and secrets in published package
0.1.0 - 2025-07-28
Added
- Initial release of Rust LiteLLM Gateway
- High-performance AI Gateway with OpenAI-compatible APIs
- Intelligent routing and load balancing capabilities
- Support for multiple AI providers (OpenAI, Anthropic, Google, etc.)
- Enterprise features including authentication and monitoring
- Actix-web based web server with async/await support
- PostgreSQL and Redis integration for data persistence and caching
- Comprehensive configuration management via YAML
- Rate limiting and request throttling
- WebSocket support for real-time communication
- Prometheus metrics integration
- OpenTelemetry tracing support
- Vector database integration (Qdrant)
- S3-compatible object storage support
- JWT-based authentication system
- Docker and Kubernetes deployment configurations
- Comprehensive API documentation
- Integration tests and examples
Features
- Core Gateway: OpenAI-compatible API endpoints
- Multi-Provider Support: Seamless integration with various AI providers
- Load Balancing: Intelligent request distribution
- Caching: Redis-based response caching
- Monitoring: Prometheus metrics and OpenTelemetry tracing
- Authentication: JWT-based security
- Rate Limiting: Configurable request throttling
- WebSocket: Real-time streaming support
- Storage: PostgreSQL for persistence, S3 for object storage
- Vector DB: Qdrant integration for embeddings
- Deployment: Docker, Kubernetes, and systemd configurations