From 4a90099fb2d81d777979d146089721293496de2e Mon Sep 17 00:00:00 2001 From: JianFeeeee Date: Tue, 13 Oct 2026 17:02:58 +0800 Subject: [PATCH] =?UTF-8?q?fix(channels):=20Gemini=20=E6=8E=A5=E5=85=A5?= =?UTF-8?q?=E6=94=B9=E7=A7=81=E6=9C=89=20/v1internal:=20=E5=8A=A8=E8=AF=8D?= =?UTF-8?q?=E8=B7=AF=E5=BE=84=20+=20=E6=BA=90=E7=AB=AF=E7=82=B9=E5=A3=B0?= =?UTF-8?q?=E6=98=8E=E5=BC=8F=E8=A6=86=E7=9B=96?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 两条线一起修: 1. Gemini 接入模型服务用错协议。Cloud Code 凭据**不能**打公开的 /v1beta/models/{model}:generateContent(参考 gemini.ts:78 明确走私有 /v1internal:generateContent;流式 /v1internal:streamGenerateContent?alt=sse)。 此前源注册沿用适配器的公开路径,凭据与端点不匹配。 2. syncAccountSource 支持平台声明 endpoint / endpoint_stream / headers 覆盖。 平台的 chat 端点常不是 base_url 的简单拼接(Gemini 私有动词、zcode 只有 一条 plan 路径),用声明式覆盖表达;内核只把它们当**不透明字符串**, 不引入任何厂商知识(守住内核零厂商名纪律)。 判据:逐平台比对 base_url+endpoint 与参考真值,11/11 一致。 --- internal/lua/plugins/channels.lua | 31 +++++++++++++++++++++---------- 1 file changed, 21 insertions(+), 10 deletions(-) diff --git a/internal/lua/plugins/channels.lua b/internal/lua/plugins/channels.lua index 911a4b0..d30dc90 100644 --- a/internal/lua/plugins/channels.lua +++ b/internal/lua/plugins/channels.lua @@ -492,6 +492,12 @@ local PLATFORMS = { hosts = { "accounts.google.com", "oauth2.googleapis.com", "cloudcode-pa.googleapis.com" }, base_url = "https://cloudcode-pa.googleapis.com", adapter = "gemini", + -- ⚠️ Cloud Code 凭据**不能**打公开的 /v1beta/models/{model}:generateContent; + -- 参考 gemini.ts:78 明确走私有动词路径 /v1internal:generateContent + -- (流式 /v1internal:streamGenerateContent?alt=sse)。用声明式 endpoint + -- 覆盖,内核只当不透明字符串。 + endpoint = "/v1internal:generateContent", + endpoint_stream = "/v1internal:streamGenerateContent?alt=sse", models = { "gemini-3.1-flash-lite-preview", "gemini-3.1-flash-preview" }, }, @@ -2923,16 +2929,21 @@ local function syncAccountSource(provider, accountId) end -- 重建:先 remove(容错:源可能不存在)再 add __llmsproxy_kernel.call("remove_source", { name = name }) - local r, aerr = __llmsproxy_kernel.call("add_source", { - source = { - name = name, - base_url = plat.base_url, - adapter = plat.adapter or "openai", - api_key = tok, - max_concurrent = 2, - models = models, - }, - }) + local src = { + name = name, + base_url = plat.base_url, + adapter = plat.adapter or "openai", + api_key = tok, + max_concurrent = 2, + models = models, + } + -- 平台的 chat 端点常与 base_url 不是简单拼接(Gemini 走私有 + -- /v1internal: 动词、zcode 只有一条 plan 路径)。声明式覆盖,内核只当 + -- 不透明字符串用 —— 不需要内核知道任何厂商知识。 + if plat.endpoint then src.endpoint = plat.endpoint end + if plat.endpoint_stream then src.endpoint_stream = plat.endpoint_stream end + if plat.headers_extra then src.headers = plat.headers_extra end + local r, aerr = __llmsproxy_kernel.call("add_source", { source = src }) if aerr then logEvent("接入源失败 " .. name .. ": " .. aerr) else logEvent("已同步源 " .. name .. "(" .. #models .. " 模型)") end end