v0.2.0
Features
Agentic & MCP
- feat(filter): add agentic_loop controller for Responses API by @leseb in #623
- feat(mcp): route stateless tools/call through static broker catalog by @nerdalert in #340
- feat(mcp_tool_resolve): resolve MCP servers concurrently by @leseb in #575
- feat(openai): resolve connector_id through configured MCP connectors by @leseb in #704
- feat(web_search): wire openai_web_search into IRR agentic loop by @leseb in #635
OpenAI API
- feat(openai): support finite chat continuations by @franciscojavierarceo in #728
- feat(openai): add Responses-to-Chat Completions filter by @franciscojavierarceo in #644
- feat(openai): add file_search_callout filter for hosted vector store search by @leseb in #493
- feat(openai): route /v1/embeddings to a dedicated Embeddings API backend by @leseb in #490
- Support OpenAI Responses WebSocket passthrough by @franciscojavierarceo in #474
- feat: OpenAI Conversations conformance suite by @leseb in #531
Anthropic API
- feat(anthropic): add Messages web search loop by @franciscojavierarceo in #647
Inference & Routing
- feat(filters): add intelligent_route by @nerdalert in #339
- feat(routing): hot reload intelligent routing overlays by @nerdalert in #540
- feat(compact): automatic compaction via context_management (#598) by @crstrn13 in #403
Guardrails & Observability
- feat(guardrails): add NeMo Provider by @christinaexyou in #285
- feat(filters): add time_to_first_token filter for TTFT metrics by @eoinfennessy in #587
Store
- feat(store): add schema validation and version tracking at init by @leseb in #631
- feat(store): expose connection pool tuning options by @leseb in #632
- feat(store): validate query params on GET /v1/responses/{id} by @leseb in #687
Server & Internals
- feat(server): wire SubRequestClient into pipeline resolution by @leseb in #622
- feat(filters): export AI filter registration API by @aslakknutsen in #612
- feat(file_resolve): resolve file_url references with SSRF protection by @leseb in #460
Bug Fixes
OpenAI / Responses
- fix(openai_responses): enforce max_body_bytes after MCP tool expansion by @leseb in #690
- fix(openai_responses): place web-search sources inside action object by @leseb in #686
- fix(openai_responses): avoid double-encoding MCP approval arguments by @leseb in #688
- fix(openai_responses): make input_items pagination usable for ID-less input arrays by @mkoushni in #619
- fix(openai_mcp_tool_resolve): rewrite type:mcp tools to type:function by @leseb in #488
- fix(classifier): treat POST /v1/responses as authoritative for no-discriminator bodies by @cdoern in #594
- fix(openai_conversations): stream by default, buffer only matched routes by @leseb in #615
- fix: reject invalid query params in conversation item listing by @leseb in #689
- fix(validate): remove obsolete background parameter rejections by @leseb in #535
- fix: oversized model values by @harrisonstropkay in #645
MCP
- fix(mcp): align stateless profile with final 2026 spec by @nerdalert in #614
- fix(mcp_tool_resolve): reject duplicate server_label before callout by @leseb in #580
- fix(mcp_dispatch): match tool calls by encoded function name by @leseb in #579
- fix(mcp_client): redact credentials from CallTool error messages by @leseb in #578
Store & Security
- fix(store): default PostgreSQL connections to verify-full TLS by @leseb in #576
- fix(store): fail closed when response store is unavailable by @leseb in #588
- fix(store): reject invalid input_items query parameters by @leseb in #616
- fix(postgres_url): unify SSRF validation with shared is_non_public_ip policy by @leseb in #617
Other
- fix(server): use AI-branded default config instead of core's by @leseb in #537
- fix(server): thread shared SubRequestClient into filter construction by @leseb in #634
- fix(file_resolve): reject file_url failures regardless of on_missing by @mkoushni in #620
- fix(filters): remove redundant Content-Length updates from body-mutating filters by @leseb in #609
- fix(filter): reject unknown fields in no-config filters by @eoinfennessy in #602
- fix: emit schema-complete Anthropic responses by @franciscojavierarceo in #618
- fix(conversations): honor include projections by @leseb in #574
- Fix/external filter discovery 478 by @mkoushni in #592
Refactors
- refactor(apis): replace CalloutClient with Pingora-native SubRequest by @leseb in #599
- refactor(subrequest): delegate execution to praxis-core SubRequestClient by @leseb in #610
- refactor(token_usage): move token usage module from apis to filters by @leseb in #536
- refactor(validate): make openai_responses_validate request-only by @leseb in #621
- Json body mutation helper by @usize in #624
Testing & CI
- test(inference): add Rust-native recording and replay fixtures by @franciscojavierarceo in #653
- test(mcp_dispatch): add resolve-to-dispatch roundtrip tests by @leseb in #589
- feat(ci): add OGX file_id integration tests to vLLM workflow by @leseb in #491
- ci: migrate workflows to conventions shared actions
- ci: validate GitHub Actions workflows by @leseb in #563
- build: enforce dependency hygiene by @leseb in #571
Dependencies
New Contributors
- @eoinfennessy made their first contribution in #602
- @christinaexyou made their first contribution in #285
- @usize made their first contribution in #624
- @shaneutt made their first contribution in #648
- @harrisonstropkay made their first contribution in #645
- @cdoern made their first contribution in #594
Full Changelog: v0.1.0...v0.2.0