网络代理机制
ScienceDiscovery 提供实例级代理注册表和统一代理策略。本页解释策略解析、出站接入与安全边界;具体配置步骤见配置网络代理,接口字段见 REST API 参考。
配置模型
代理记录支持三种来源:
| 类型 | 行为 | 适用场景 |
|---|---|---|
custom_url |
使用加密保存的 http://、https:// 或 socks5:// URL |
企业提供固定代理地址或带凭据 URL |
environment |
读取服务进程的 HTTP_PROXY、HTTPS_PROXY、ALL_PROXY 与 NO_PROXY(含小写形式) |
容器、systemd 或启动脚本统一注入代理 |
system |
读取 GNOME gsettings 的手工 HTTP/HTTPS 代理 |
带桌面配置的 Linux 工作站 |
模块策略统一使用以下值:
inherit:继承全局默认值;这是 LLM、Web 和未单独配置 MCP server 的默认策略。none:明确直连,并忽略进程代理环境变量。proxy:<id>:选择注册表中的一条代理。
全局默认值只能是 none 或 proxy:<id>,避免形成递归继承。仍被全局默认、模型、Web 或 MCP 引用的代理记录不能删除,必须先修改引用方。
出站接入机制
Node 控制面是 registry、策略和密文的事实源。调用方先通过 SessionStore.resolveProxy(policy) 得到不依赖存储的结果:
type ResolvedProxy =
| { mode: "direct" }
| { mode: "environment" }
| { mode: "url"; url: string };
Node fetch 调用可用 proxyDispatcher(resolved, targetUrl) 获得按目标协议和 NO_PROXY 解析的 undici dispatcher;子进程可用 proxyEnvOverlay(resolved, baseEnv) 生成规范化代理环境覆盖。调用方只能记录 mode 和是否使用代理,不能记录完整 URL。
当前接入路径:
- LLM:Node 在每次 run 开始时解析模型策略,并按模型 base URL 把 environment 策略固化为最终
url或direct,再由packages/model/src/client.ts为该次请求固定 undici dispatcher。native run 直接调用该客户端;JiuwenSwarm 模型调用经 adapter 和 API 模型网关回到同一产品模型层。 - WebSearch/Web fetch:
WebBroker每次调用解析一次 Web 策略,把解析结果直接交给进程内的 provider 层,由同一套共享 dispatcher 生效。 - MCP/论文源:Node broker 按
mcpServerId独立解析;内建 stdio MCP server 以进程环境覆盖连接上游。MCP 产物字节下载也复用同一 server 策略和 Node dispatcher。
新增出站路径时,应接收 ProxyPolicy,在最靠近请求的位置调用 resolveProxy,然后使用统一 dispatcher/环境覆盖;不要自行读取代理密文或复制策略解析逻辑。随包的 Python MCP server 由 Node 传入已解析的环境覆盖,不读取 Node 数据目录。
迁移、安全与限制
- 旧 Web
environment/custom/direct设置在首次加载时迁移为统一策略;旧 custom URL 会重新加密到 registry,迁移后删除旧密文记录。 - custom URL 使用与模型 token 相同的 AES-256-GCM 密钥文件保护;catalog 与数据库密文字段不保存明文。备份或迁移数据目录时必须连同密钥文件一起保护。
- 完整 custom URL 和有效 environment 值只在受认证的代理 settings API 及其设置页面明文显示。运行日志、审计数据、错误响应和其他 API 不得记录或返回完整代理 URL;运维人员应按凭据管理界面保护登录 token 与浏览器会话。
system当前只支持 GNOME 手工代理。headless Linux、PAC/auto 模式或无法读取gsettings时会明确报错,不会静默直连;服务器部署优先使用environment。解析结果(含失败)会缓存约 60 秒,因此修复gsettings配置后最多需等待 60 秒才会生效。- 内建 MCP 当前是 stdio transport,代理通过子进程环境注入。未来 HTTP/SSE MCP transport 需要在对应客户端显式接入 dispatcher/client proxy。
- MCP stdio 的 environment 代理读取 Gateway 进程环境,而非 Node 控制面的 environment 投影;标准
.env部署下两者一致,但 Node 与 Gateway 环境变量不同的非标准部署下,UI 显示与 MCP 出站可能不一致。 - Runner 引导托管科学环境时下载 micromamba,不经过这里的代理策略:它发生在 Runner 进程内、Session 与模型策略之外,控制面的 registry 对它不可见。无法直连发布站点的机器有三条受支持的路径:由控制面在部署 Runner 时把固定版本的 micromamba 一并送过去(SSH 部署默认如此)、用
SCIENCE_AGENT_MICROMAMBA_BASE_URL指向可达镜像、或用SCIENCE_AGENT_PROVISIONER_PATH指向机器上已有的可执行文件。三条路径都仍按固定版本校验 SHA-256。 - 本功能不提供代理健康检查、自动切换、流量审计看板,也不提供 Project/Session 级 registry 覆盖。