fix(channels): account_delete 留下陈旧源(旧口径 base_url → 推理返回空)

真实缺陷(排查"推理返回空内容"时抓到):旧版单账号路径建的源 `channels-<plat>`
**不随账号删除而消失**。它的 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-<plat>`。
⚠️ 只在池空时清 —— 还有账号时不动它(它可能是运维手工配的兼容源)。

★ 排查过程中的另一条重要澄清(免得下次误判):
`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} 全绿。
This commit is contained in:
JianFeeeee
2026-10-14 15:51:22 +08:00
parent 42ec552c6d
commit 5720e60fc9

View File

@ -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-<plat>`。
--
-- 真实缺陷(本次实测抓到):旧代码建的 `channels-<plat>` 源的 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