Highlights
- π License migrated from MIT to Apache-2.0 (#848)
- π New upstream authentication filters: Azure AD (#815), GCP ADC β experimental (#828), and AWS SigV4 request signing (#802)
- βοΈ Routing: provider load balancing (#731) and a secure provider gateway boundary (#386)
- π§© Extensibility:
http_calloutfilter (#760); llm-dext_proccompatibility moved into AI (#334) - π Observability: OpenTelemetry routing spans (#729) and provider backend route tracing (#834)
Features
- feat(routing): add provider load balancing (#731) β @nerdalert
- feat(routing): add secure provider gateway boundary (#386) β @nerdalert
- feat(token_rate_limit): sliding-window / token-bucket rate limiting (#796) β @jordigilh
- feat(azure): add
azure_adupstream authentication filter (#815) β @szedan-rh - feat: add experimental
gcp_adcupstream authentication filter (#828) β @szedan-rh - aws: add
aws_sigv4_signfilter for signing upstream AWS requests (#802) β @szedan-rh - feat(callout): add
http_calloutfilter β supersedes #727 (#760) β @usize - feat(llm-d): move
ext_proccompatibility into AI (#334) β @nerdalert - feat(filters): add OpenTelemetry routing spans (#729) β @nerdalert
- feat(observability): trace provider backend routes (#834) β @nerdalert
- feat(openai): generalize the operation registry and matcher (#772) β @cdoern
- feat(token-count): report prompt cache token breakdown (#582) β @noyitz
- feat(file_search): full-flow-agentic example with IRR file search callout (#737) β @leseb
Security
- fix(web_search): validate
base_urlagainst SSRF and credential disclosure (#851) β @leseb - fix(mcp_tool_resolve): strip credentials and honor
tool_choiceon empty resolve (#852) β @leseb - fix(a2a): defer route commit until EOS to prevent prefix-poisoning (#733) β @mkoushni
- fix(a2a): reject oversized task-routing TTLs before
Instantoverflow (#823) β @mkoushni - fix(deps): update
h2for security audit (#764) β @nerdalert
Bug Fixes
- fix(web_search): don't forward hosted
web_search_callto inference backend (#853) β @leseb - fix(token_count): add OpenAI Responses API usage extraction (#714) β @yossiovadia
- fix(token_count): preserve OpenAI Responses cache writes and parse once (#858) β @leseb
- fix(token_usage): recover from SSE overflow instead of silently dropping usage (#782) β @mkoushni
- fix(mcp_dispatch): preserve non-text MCP result content (#807) (#850) β @leseb
- fix(mcp): bound dynamic session and protocol values (#655) β @skamenan7
- fix(subrequest): honor
runtime.subrequest_circuit_breakeron the shared client (#830) β @mkoushni - fix(azure_ad): schedule token refresh within skewed validity window (#829) β @szedan-rh
- fix(responses): support the
includequery parameter on store retrieval (#822) β @r-papso - fix(responses): disable parallel tools on first inference (#711) β @skamenan7
- fix(conversations): percent-decode conversation ID path segments (#824) β @mkoushni
- fix(conversations): align create and update request contracts (#625) β @leseb
- fix(guardrails): align NeMo status with
/v1/guardrail/checksendpoint (#792) β @liavweiss - fix(openai): preserve non-2xx OGX responses in file resolution (#799) β @skamenan7
Refactors
- refactor(responses): centralize usage accumulation (#702) β @rkaplan-hub
- refactor(filters): rename
agentic_looptoopenai_agentic_loop(#748) β @leseb
Praxis core compatibility
- fix(compat): align AI with Praxis main body and branch routing (#787) β @nerdalert
- fix: keep Praxis main compatibility fixtures current (#757) β @nerdalert
- fix: adapt to
praxis-proxy-filter0.5.3 API changes - chore(deps): switch Praxis crates from git tags to crates.io (#725) β @leseb
Tests & CI
- test(integration): cover IRR delivery of agentic-loop 400/508 rejections (#847) β @leseb
- Document and test provider fallback via the Iterative Request Router (#730) β @usize
- test: opt loopback fixtures into
allow_private_endpoints(#800) β @usize - fix(test): init new praxis-main context fields (#816) β @aslakknutsen
- ci(store): add PostgreSQL CI coverage for the response store (#739) β @leseb
- ci: add job timeouts, persist-credentials, and CodeQL on PRs / merge queue
Docs & Governance
- chore(license): complete migration from MIT to Apache-2.0 (#848) β @leseb
- docs: add attribution rules; correct architecture Key Files paths; fix stale version/image/module references
- docs: migrate proposals to the centralized enhancements repo; update governance docs
Dependencies
- chore(deps): bump
rust1.97-alpine β 1.98-alpine (#817) - chore(deps): update Cargo.lock dependencies (#738) β @leseb
- chore(deps): routine dependabot bumps (codeql-action #819/#820/#776/#777, setup-buildx #818, setup-uv #775) and
cargo upgraderefreshes
Reverts
- Revert "fix(guardrails): fail closed on NeMo redact verdict until body replacement" (#821, reverting #721) β @szedan-rh
New Contributors
- @noyitz, @rkaplan-hub, @yossiovadia, @liavweiss, @jordigilh, @szedan-rh, and @r-papso made their first contributions in this release π
Full Changelog: https://github.com/praxis-proxy/ai/commits/v0.3.0