目前仓库里有一部分模型接入已经改为浏览器直连第三方 API,这在某些场景下确实减少了宿主依赖,但也带来了两个比较明显的问题。
1. 兼容性问题
很多 API 提供商即使“协议兼容 OpenAI”,也不会允许浏览器直接跨域访问 /models、/chat/completions 等接口。
如果服务商的 CORS、预检请求、Authorization 头策略更严格,前端直连会直接失败。这会导致一种比较尴尬的情况:
- 服务本身是可用的
- 但插件内功能会因为浏览器跨域限制而不可用
尤其是模型列表拉取和实际调用这两步,都很容易被安全策略拦截。
2. 安全边界问题
浏览器直连意味着第三方 API key 会进入前端运行时上下文。
在扩展本身会处理复杂前端内容、iframe、脚本渲染的前提下,这种做法的风险会高于走宿主代理或可信后端。即使这不是立即可利用的漏洞,也会明显扩大密钥暴露面。
我的理解
我理解前端直连可能是为了:
- 保留更完整的请求结构
- 减少对宿主后端的依赖
- 提高配置灵活度
这些目标本身都合理,我并不是反对“允许前端直连”这件事。
建议
我的建议是:至少保留一条默认可用、兼容性更高、风险更低的安全接入方式,而不是只保留浏览器直连。
可以考虑:
- 保留或恢复通过宿主服务、可信后端或代理层发起模型请求的方式
- 将浏览器直连改为显式可选项,而不是默认/唯一方案
- 模型列表拉取也支持代理/宿主链路,而不是只在前端直接
fetch
- 当提供商不支持浏览器跨域直连时,在 UI 中明确提示用户切换到安全链路
相关位置
modules/story-summary/vector/llm/llm-service.js
modules/assistant/app-src/adapters/openai-compatible.js
modules/assistant/app-src/adapters/openai-responses.js
modules/assistant/app-src/adapters/anthropic.js
modules/assistant/app-src/settings-panel.js
仓库内已有的参考实现
仓库内部其实已经存在更安全或更稳的模式可参考,例如:
modules/tts/tts-api.js 中通过 /proxy/ 发起请求
bridges/call-generate-service.js 中对宿主能力的复用
最后说明
我的诉求不是要求删除前端直连,而是希望项目至少保留一条“安全且兼容”的模型接入链路,让:
- 对安全边界敏感的用户可以继续使用
- 遇到严格 CORS 策略的 API 提供商时仍然可用
- 不同模块的模型接入方式更统一,减少实际使用中的踩坑
目前仓库里有一部分模型接入已经改为浏览器直连第三方 API,这在某些场景下确实减少了宿主依赖,但也带来了两个比较明显的问题。
1. 兼容性问题
很多 API 提供商即使“协议兼容 OpenAI”,也不会允许浏览器直接跨域访问
/models、/chat/completions等接口。如果服务商的 CORS、预检请求、
Authorization头策略更严格,前端直连会直接失败。这会导致一种比较尴尬的情况:尤其是模型列表拉取和实际调用这两步,都很容易被安全策略拦截。
2. 安全边界问题
浏览器直连意味着第三方 API key 会进入前端运行时上下文。
在扩展本身会处理复杂前端内容、iframe、脚本渲染的前提下,这种做法的风险会高于走宿主代理或可信后端。即使这不是立即可利用的漏洞,也会明显扩大密钥暴露面。
我的理解
我理解前端直连可能是为了:
这些目标本身都合理,我并不是反对“允许前端直连”这件事。
建议
我的建议是:至少保留一条默认可用、兼容性更高、风险更低的安全接入方式,而不是只保留浏览器直连。
可以考虑:
fetch相关位置
modules/story-summary/vector/llm/llm-service.jsmodules/assistant/app-src/adapters/openai-compatible.jsmodules/assistant/app-src/adapters/openai-responses.jsmodules/assistant/app-src/adapters/anthropic.jsmodules/assistant/app-src/settings-panel.js仓库内已有的参考实现
仓库内部其实已经存在更安全或更稳的模式可参考,例如:
modules/tts/tts-api.js中通过/proxy/发起请求bridges/call-generate-service.js中对宿主能力的复用最后说明
我的诉求不是要求删除前端直连,而是希望项目至少保留一条“安全且兼容”的模型接入链路,让: