fix(channels): Gemini 接入改私有 /v1internal: 动词路径 + 源端点声明式覆盖

两条线一起修:

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 一致。
This commit is contained in:
JianFeeeee
2026-10-13 17:02:58 +08:00
parent 59229990ac
commit 4a90099fb2

View File

@ -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