Skip to content

保留安全的模型接入链路:浏览器直连应为可选项,而不是唯一方案 #44

@zvensmoluya

Description

@zvensmoluya

目前仓库里有一部分模型接入已经改为浏览器直连第三方 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 提供商时仍然可用
  • 不同模块的模型接入方式更统一,减少实际使用中的踩坑

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions