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