fix(agent): skip prompt_cache_key for NVIDIA inference endpoints (fixes #353) - #355
Conversation
英伟达免费推理接口(integrate.api.nvidia.com)不认 OpenAI 的 prompt_cache_key 扩展字段,带上会直接 400 (Unsupported parameter(s): prompt_cache_key,见 issue ILoveBingLu#353)。 Agent 子系统在 openai-compatible 协议下从两条路径注入该字段: 1. electron/services/agent/provider.ts 的 transformRequestBody 2. electron/services/agent/cache.ts 的 buildProviderOptions(经 providerOptions 透传, agent 实际请求走这里,故这是关键修复点) 两处都改为按 baseURL 域名判定:命中 nvidia.com 时跳过注入; 其余 OpenAI 兼容端点(OpenAI / DeepSeek / 火山方舟等)行为完全不变。 公共判定逻辑抽到零依赖的 promptCacheCompat.ts,并加单测覆盖。 Fixes ILoveBingLu#353
ILoveBingLu
left a comment
There was a problem hiding this comment.
感谢 PR,根因定位准确:main 上 prompt_cache_key 只在 agent/provider.ts(transformRequestBody)和 agent/cache.ts(buildProviderOptions)两处注入,主聊天路径确实不注入;非 NVIDIA 端点行为零改动(已用 mock fetch 验证 openai / deepseek / notnvidia 仍带该字段)。整体方向同意,合并前请处理两点:
1. isNvidiaInferenceBaseURL 改为解析 hostname(必改)
electron/services/agent/promptCacheCompat.ts:18 用正则 /(^|\.)nvidia\.com(\/|$)/i 扫整串 URL,nvidia.com 后只允许 / 或行尾,带端口时漏判:https://integrate.api.nvidia.com:443/v1 会判为 false,仍然注入 prompt_cache_key(实测)。建议与同目录 arkContextFetch.ts 的 isArkBaseURL、cache.ts 的 hostFromUrl 同风格:
export function isNvidiaInferenceBaseURL(baseURL?: string): boolean {
if (!baseURL) return false
try {
const host = new URL(baseURL).hostname.toLowerCase()
return host === 'nvidia.com' || host.endsWith('.nvidia.com')
} catch {
return false
}
}2. PR 描述与提交内容不一致 / 测试未接入
- 描述中大篇幅引用的
scripts/e2e-nvidia-proof.ts不在本 PR 中(diff 只有 4 个文件)。不把外网调用脚本放进仓库是对的,但请把描述改成与实际提交一致。 scripts/test-nvidia-prompt-cache.ts请按仓库惯例接到package.json:"test:nvidia-prompt-cache": "node --experimental-strip-types scripts/test-nvidia-prompt-cache.ts",并补一条断言buildProviderOptions在 nvidia baseURL 下不含prompt_cache_key(PR 自己说这是关键修复点,目前只测了纯函数)。
可选:cache.ts 的 buildProviderCacheStatus 对 nvidia 仍会返回"已通过 transformRequestBody 注入 prompt_cache_key",UI 上会显示误导信息,顺手加个分支更好。
改完 @ 我,合并没问题。
跟进 #355: - isNvidiaInferenceBaseURL 改为 new URL().hostname 判断,修复带端口(:443)时漏判仍注入 prompt_cache_key;与 isArkBaseURL 同风格 - buildProviderCacheStatus 对 NVIDIA 返回未启用,不再显示"已注入 prompt_cache_key"的误导信息 - 新增 npm script test:nvidia-prompt-cache,测试补端口/大写/同形域名/非法 URL 用例 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
|
已合并,感谢!评审里提到的几点我在 4853a1a 直接补上了: |
问题
英伟达免费推理接口(
integrate.api.nvidia.com)在 CipherTalk 的 Agent 子系统里调用时报:400 Unsupported parameter(s): prompt_cache_key无论用户在设置里选「自定义 OpenAI 兼容端点」填英伟达地址,还是选内置的「英伟达」接口,
只要 baseURL 指向 nvidia.com,都会触发该错误(
prompt_cache_key是 OpenAI prompt-caching 扩展字段,英伟达接口不认)。
根因
Agent 子系统在
openai-compatible协议下从两条路径把prompt_cache_key塞进请求体:electron/services/agent/provider.ts的transformRequestBody(直接改请求体)electron/services/agent/cache.ts的buildProviderOptions(经providerOptions透传——agent 实际请求走这里,所以这是关键修复点)
英伟达接口对这两个字段都不接受,直接 400。
修复
electron/services/agent/promptCacheCompat.ts,集中维护「哪些端点不支持prompt_cache_key」的判定(isNvidiaInferenceBaseURL仅匹配nvidia.com域名)。provider.ts的transformRequestBody与cache.ts的buildProviderOptions都改为:命中英伟达域名时跳过注入,其余 OpenAI 兼容端点完全不变(已用单测验证 OpenAI / DeepSeek /
火山方舟仍保留
prompt_cache_key)。范围
nvidia.com的请求;自定义 OpenAI / DeepSeek / 方舟等端点行为零改动。prompt_cache_key,不受影响。测试
npx tsx scripts/test-nvidia-prompt-cache.ts通过:prompt_cache_key;prompt_cache_key;真机验证(Verification)
修复已用英伟达真实接口验证(脚本
scripts/e2e-nvidia-proof.ts:直接 import 本 PR 的promptCacheCompat.ts生成请求体,再真实 POST 到integrate.api.nvidia.com/v1/chat/completions):prompt_cache_key结论:
prompt_cache_key);400 Unsupported parameter(s): prompt_cache_key,可确认该字段就是根因。验证用模型qwen/qwen3.5-122b-a10b已于 2026-07-20 EOL(返回 410),故改用minimaxai/minimax-m3。如需对 B 复现干净的 400,可等限流过后单独跑对照:
ONLY_B=1 DELAY_B=10 npx tsx scripts/e2e-nvidia-proof.ts。关联
Fixes #353
注:补丁合入源码 ≠ 已安装的 App 立即修复;若需立即可用,仍可用 LiteLLM 反向代理
(
drop_params=True)临时兜掉该字段。