场景: 客户端等待,且没有观察到新的上游 bytes。
选择: 检查 transport 连通性和 read_idle_timeout_secs。
原因: 这是 idle-read 问题,不一定是协议语义问题。
Recipes 是面向任务的短路径。它们会把精确字段、默认值和行为契约反链到 reference 页面,而不是在每个任务里重复全部规则。
目标: 把 config.toml 作为运行时事实来源。
[routing.default_provider_names] 下设置按协议分组的默认 provider。protocol、base_url 和 api_key。验证: 使用对应入站协议的请求会选中默认 provider。
目标: 让客户端流量发给 ProxAI,而不是直接发给 provider。
/v1 base URL。验证: ProxAI 日志能看到本地入站流量和上游 provider 选择。
[routing.default_provider_names]openai_responses = "openai"openai_chat_completions = "openai"
[providers.openai]protocol = "openai_responses"base_url = "https://api.openai.com"api_key = "..."[routing.default_provider_names]openai_responses = "anthropic_upstream"
[providers.anthropic_upstream]protocol = "anthropic_messages"base_url = "https://example.invalid"api_key = "..."compatibility = "anthropic_compatible"目标: 只为选中的 model pattern 覆盖 defaults。
match_kind 和 model_pattern。provider 设置为目标 provider 名称。upstream_model。验证: 命中的显式 route 优先于协议 defaults。
目标: 避免同一个 model pattern 在不同 endpoint 上产生歧义。
request_protocol。验证: 模型命中但显式 request_protocol 不匹配时会失败,而不是静默 fallback。
[[routing.routes]]name = "m3_chat_to_anthropic"request_protocol = "openai_chat_completions"match_kind = "exact"model_pattern = "MiniMax-M3-preview"provider = "minimax"upstream_model = "MiniMax-M3"
[providers.minimax]protocol = "anthropic_messages"base_url = "https://example.invalid"api_key = "..."compatibility = "anthropic_compatible"| Provider protocol | 发给上游的认证 header | 事实来源 |
|---|---|---|
openai_responses / openai_chat_completions | Authorization: Bearer <provider api_key> | providers.<name>.api_key |
anthropic_messages | x-api-key: <provider api_key> | providers.<name>.api_key |
如果客户端强制要求 API key 字段,可以填 dummy local value,真实 key 放在 config.toml。见 行为契约。
目标: 调试时让 SDK 客户端收到结构化错误。
[error_responses].format = "json"。text。验证: 错误 payload 符合稳定错误响应参考。
[error_responses]format = "json"目标: 最小化私有数据暴露面。
provider_request,provider 返回问题优先 upstream_response。验证: 你能解释为什么这个 phase 已经足够。
目标: 避免积累私有产物。
验证: Capture 产物只在本地存在,且不会被提交。
proxai capture enable provider-request# 复现一次proxai capture disable provider-request| 问题 | Phase |
|---|---|
| 客户端到底发了什么? | inbound_request |
| ProxAI 发给上游的是什么? | provider_request |
| Provider 返回了什么? | upstream_response |
| 客户端最终收到什么? | outbound_response |
不想修改长期配置时,可以用 CLI route override 做一次性运行:
proxai --route-override m3_chat_to_anthropic.model_pattern=MiniMax-M3-preview \ --route-override m3_chat_to_anthropic.upstream_model=MiniMax-M3支持覆盖的字段包括 request_protocol、match_kind、model_pattern、provider 和 upstream_model。见 CLI。
场景: 客户端等待,且没有观察到新的上游 bytes。
选择: 检查 transport 连通性和 read_idle_timeout_secs。
原因: 这是 idle-read 问题,不一定是协议语义问题。
场景: Tool-call deltas 已开始,但语义完成事件没有到达。
选择: 检查 [tool_calls].timeout_secs 和 provider stream events。
原因: ProxAI 会可预测地关闭卡住的 tool-call argument streams。
场景: 客户端收到 bytes,但无法解析事件序列。
选择: 检查协议转换和 SSE reconstruction。
原因: Carrier 可能健康,但翻译后的事件流无效。