v0.3.0
中文
一次面向使用者的大修,含多项破坏性变更。
修复(都来自真机验收,不是推断)
畸形请求体被原样转发上游。 /v1/chat/completions 是透传路由,从前一次本地校验都没有,于是每个畸形请求都白烧一次整个网关共享的限流额度。上游那层 Cloudflare 约两次快请求就限流 ⇒ 一个客户端 bug 循环重试,几秒内能把所有人的通道打死。而且这条路径不受注册机退避状态保护。
结构不对的请求体回 500 而不是 400。 触发条件很现实:{"model":"agnes-2.5-flash"}(模型名合法、只是漏写 messages)就够了,而用户看到「网关内部错误」会以为网关挂了来报障。OpenAI 官方 SDK 对 5xx 默认重试 2 次 ⇒ 一个永远修不好的错误被放大成 3 倍请求。
兜成 500 时一条线索都不留(实测 14 次 500 之后事件流零记录)。现在留痕,但响应体一个字都没多给。
Anthropic 流式:usage 两处写死 0(0 比缺字段更坏,它长得像一个真值);上游中途断流会静默退出、照常声称 stop_reason: "end_turn" ⇒ 客户端把「被截断」当成「正常说完」。两条都修了。
/v1/models 漏掉上游 12 个模型里的 8 个,含唯一实测能对话的那个 ⇒ 做模型发现的客户端永远选不到能用的。
面板从来没有过响应式:三份 CSS 里 @media 零命中,而其中一份还写着「本仓不写媒体查询」。侧栏死宽任何宽度都不收、顶栏溢出、六张表全部裸奔。补了 1024 / 900 / 640 三档断点。
404 是纯文本而非 JSON;方法错也回 404。 现在 404 走同族 JSON 信封,方法不匹配回 405 + Allow。
新增
逐模型连通性测试:一颗按钮把目录里能对话的模型逐个试一遍。串行发不并发,护栏用常量而不是带模型名的 —— 与单把凭据验活那条刻意相反:那边不该互相挡,这边恰恰要互相挡,那就是节流。只测对话模型,图片视频硬拒(测一次图片是真出一张图,测视频是建任务加最多 60 次轮询)。
两族凭据都能在面板上掩码 / 点击显示明文 / 复制。 明文走专门端点、绝不进列表响应(列表是高频无意识调用的),每次取明文留一条只含 id 的审计事件。
💥 破坏性变更
对外 API 密钥改为同时存明文。 这是使用者拍板的、以安全性换便利性的取舍,代价如实登记:面板一旦被打穿,全部客户端密钥明文一次性泄漏;存储介质从「不含可直接使用的客户端凭据」变成「含」,备份与快照的处置级别要跟着升。升级之前签发的没有明文,如实回 null 并说明,不用掩码或空串冒充。鉴权热路径一个字都没动。
结构不对的请求体从 500 变 400(依赖「5xx 会被 SDK 重试」的客户端会受影响)。模型目录 4 → 12。
English
A user-facing overhaul with several breaking changes.
Fixed — malformed request bodies were forwarded upstream verbatim, burning the gateway's shared rate-limit budget (a looping client bug could kill everyone's upstream channel in seconds); shape errors returned 500 instead of 400 (a body missing only messages was enough, and SDKs retry 5xx twice); 500s left no trace at all; Anthropic streaming hardcoded usage to 0 (worse than absent — it looks like a real value) and reported mid-stream upstream failure as a normal end_turn; /v1/models was missing 8 of the 12 upstream models including the only one that actually works; the panel never had any breakpoints; 404 was plain text and method mismatches also returned 404.
Added — per-model connectivity test (serial, throttled, chat models only); reveal & copy for both credential families, via a dedicated audited endpoint that never puts plaintext in list responses.
💥 Breaking — gateway-issued API keys are now stored in plaintext (an owner-decided security-for-convenience trade-off: a compromised panel now leaks every client key; storage media change classification). Shape errors are 400 instead of 500. Model catalog 4 → 12.
繁體中文
一次面向使用者的大修,含多項破壞性變更。 修復:畸形請求體被原樣轉發上游、白燒整個閘道共用的限流額度;結構錯回 500 而非 400;500 不留任何線索;Anthropic 串流 usage 恆 0 且上游斷流被報成正常結束;模型清單漏掉十二個裡的八個;面板從來沒有過響應式。新增:逐模型連通性測試、兩族憑證可在面板顯示明文並複製。💥 破壞性:對外金鑰改為同時存明文(使用者拍板的取捨,代價見 CHANGELOG)。
日本語
利用者向けの大改修(破壊的変更あり)。 不正な形のリクエストボディが上流へそのまま転送され、ゲートウェイ全体で共有するレート制限枠を浪費していた問題、構造エラーが 400 ではなく 500 を返していた問題、500 が痕跡を一切残さない問題、Anthropic ストリーミングの usage が 0 固定で上流の中断が正常終了として報告される問題、モデル一覧が 12 個中 8 個を欠いていた問題、パネルにブレークポイントが一つも無かった問題を修正。モデル別の疎通テストと、資格情報の平文表示・コピーを追加。💥 破壊的:外部向けキーを平文でも保存するようになりました(利用者判断のトレードオフ)。
한국어
사용자 대상 대규모 개편(파괴적 변경 포함). 잘못된 형식의 요청 본문이 업스트림으로 그대로 전달되어 게이트웨이 전체가 공유하는 레이트 리밋을 소모하던 문제, 구조 오류가 400이 아닌 500을 반환하던 문제, 500이 아무 흔적도 남기지 않던 문제, Anthropic 스트리밍의 usage가 0으로 고정되고 업스트림 중단이 정상 종료로 보고되던 문제, 모델 목록이 12개 중 8개를 누락하던 문제, 패널에 브레이크포인트가 하나도 없던 문제를 수정했습니다. 모델별 연결성 테스트와 자격 증명 평문 표시·복사를 추가했습니다. 💥 파괴적: 외부용 키를 평문으로도 저장합니다(사용자가 결정한 절충).
📦 ghcr.io/xwteam/agnes2api:0.3.0 · 📄 CHANGELOG