From 5720e60fc99c9c7af5265ee00f1613dea5699183 Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Wed, 14 Oct 2026 15:51:22 +0800 Subject: [PATCH] =?UTF-8?q?fix(channels):=20account=5Fdelete=20=E7=95=99?= =?UTF-8?q?=E4=B8=8B=E9=99=88=E6=97=A7=E6=BA=90=EF=BC=88=E6=97=A7=E5=8F=A3?= =?UTF-8?q?=E5=BE=84=20base=5Furl=20=E2=86=92=20=E6=8E=A8=E7=90=86?= =?UTF-8?q?=E8=BF=94=E5=9B=9E=E7=A9=BA=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 真实缺陷(排查"推理返回空内容"时抓到):旧版单账号路径建的源 `channels-` **不随账号删除而消失**。它的 base_url 是**旧口径** —— buddy 缺 `/v2/chat/completions` 前缀,于是: base_url=https://copilot.tencent.com + openai 适配器的 /chat/completions = https://copilot.tencent.com/chat/completions ← 错的 这个源以**同名模型**对外服务(挑的是模型名,不是源名),于是同一个 `codebuddy_deepseek-v4.1-flash` 请求可能落到正确源(新口径)也可能落到陈旧源 (旧口径)—— 表现为**时好时坏**:一会儿正常、一会儿返回空内容(HTTP 200 但无正文)。 我为此绕了很久,因为轮转使得单次测量不可复现。 修法:删账号后若池**已空**,清掉 `channels-`。 ⚠️ 只在池空时清 —— 还有账号时不动它(它可能是运维手工配的兼容源)。 ★ 排查过程中的另一条重要澄清(免得下次误判): `content=""` 且 `reasoning_content` 有内容、`finish_reason="length"` **不是缺陷** —— 那是**推理模型**把 max_tokens 全花在思考上了。实测: max_tokens=8 → content='' finish=length(思考用光预算) max_tokens=40 → content='OK' finish=stop 判据若用 max_tokens=8 去测推理模型,会得到"空内容"的假故障。 回归:internal/{core,lua} 全绿。 --- internal/lua/plugins/channels.lua | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/internal/lua/plugins/channels.lua b/internal/lua/plugins/channels.lua index 842862e..feb5fc3 100644 --- a/internal/lua/plugins/channels.lua +++ b/internal/lua/plugins/channels.lua @@ -5671,6 +5671,17 @@ function plugin.account_delete(req) dropAccountSource(plat.id, acct.id) __llmsproxy_secrets.delete(acct.credentialRef) poolRemove(plat.id, acct.id) + -- ⚠️ 删完最后一个账号时,必须**清掉旧版单账号源** `channels-`。 + -- + -- 真实缺陷(本次实测抓到):旧代码建的 `channels-` 源的 base_url 是 + -- **旧口径**(buddy 缺 `/v2/chat/completions` 前缀)。它不随账号删除而消失, + -- 于是以同名模型对外服务,但打的是**错的 URL** —— + -- 症状是推理返回**空内容**(HTTP 200 但没有正文),而列表里模型看着正常。 + -- 我在这上面绕了很久(一会儿 'OK' 一会儿 '',因为内核在多个源之间轮转)。 + -- ⚠️ 只在池**已空**时清:还有账号时不该动它(它可能是运维手工配的兼容源)。 + if #poolList(plat.id) == 0 then + __llmsproxy_kernel.call("remove_source", { name = "channels-" .. plat.id }) + end logEvent("账号删除 " .. plat.id .. "/" .. acct.id) return { status = 200, json = { ok = true } } end