docs: add pipeline-model-proxy reference for D601 model proxy architecture
This commit is contained in:
@@ -56,4 +56,5 @@ UniDesk 是一个以主 server 为统一入口的分布式工作平台;本文
|
||||
- `docs/reference/constar-d601.md`:D601 上 ConStart/constar 固件工作区的 UniDesk SSH 入口、WSL skill wrapper、Keil 编译下载和串口/JSON-RPC 验证简要引导。
|
||||
- `docs/reference/oa-event-flow.md`:统一 OA 事件流微服务、事件表、tag 订阅、Trace/STEP 统计中心和前端可见性规则。
|
||||
- `docs/reference/pipeline-oa-event-flow.md`:Pipeline/OA 事件流、审核/无审核流转、单步调试、甘特图渲染和最终去残留规则。
|
||||
- `docs/reference/pipeline-model-proxy.md`:Pipeline v2 model proxy 链路架构、D601 宿主 proxy 服务部署、harness token 注入规则和 smoke test 验证流程。
|
||||
- `reference`:兼容旧路径的符号链接,指向 `docs/reference/`。
|
||||
|
||||
@@ -0,0 +1,109 @@
|
||||
# Pipeline v2 Model Proxy Architecture
|
||||
|
||||
Pipeline v2 procedure runner 通过 model proxy 链路将容器内 OpenCode 的模型请求路由到外部 API 提供商。本文档记录 proxy 链路的稳定架构、各 model 组件的差异和 D601 宿主服务部署约束。
|
||||
|
||||
## Proxy Chain 总体架构
|
||||
|
||||
```text
|
||||
OpenCode (container)
|
||||
↓ HTTP (127.0.0.1:17655)
|
||||
In-container model proxy (opencodeContainerHarness)
|
||||
↓ HTTP/HTTPS
|
||||
Upstream origin (per model config)
|
||||
↓ (if host proxy)
|
||||
External API provider (HTTPS)
|
||||
```
|
||||
|
||||
每个 model 组件在 `config.json` 的 `proxy` 字段声明 in-container proxy 的监听端口和上游地址。OpenCode 的 provider config 中 `baseUrl` 固定指向 `http://127.0.0.1:{proxy.port}/{path}`,由 harness 在容器启动时写入。
|
||||
|
||||
In-container proxy 的职责:
|
||||
- 注入 auth token(从容器环境变量读取,按 `ANTHROPIC_AUTH_TOKEN` → `ANTHROPIC_API_KEY` → `OPENAI_API_KEY` 优先级查找)
|
||||
- 429 rate limit 自动重试与 quota pause 计时(暂停时间不计入 node active timeout)
|
||||
- 请求/响应透传(streaming 兼容)
|
||||
|
||||
## Model 组件 Proxy 配置对比
|
||||
|
||||
| Model | proxy.upstreamOrigin | 宿主服务 | Auth env |
|
||||
|-------|---------------------|----------|----------|
|
||||
| `minimax-m27` | `https://api.minimaxi.com` | 无(容器直连) | `ANTHROPIC_AUTH_TOKEN` |
|
||||
| `gpt-5.5` | `http://host.docker.internal:17680` | `hyueapi-proxy.service` | `OPENAI_API_KEY` |
|
||||
|
||||
### minimax-m27(直连模式)
|
||||
|
||||
容器内 proxy 直接 HTTPS 连接 `api.minimaxi.com`,无需宿主中间层。适用于上游 API 不需要 Host header 覆盖或 TLS SNI 特殊处理的场景。
|
||||
|
||||
### gpt-5.5(宿主 proxy 模式)
|
||||
|
||||
容器内 proxy 通过 Docker `host.docker.internal` 连接宿主 port 17680 的 HTTP reverse proxy,由宿主 proxy 完成 HTTP→HTTPS 升级和 `Host: hyueapi.com` header 注入。
|
||||
|
||||
两跳设计原因:hyueapi.com 使用 Cloudflare,要求 TLS SNI 与 Host header 匹配;容器内 Node.js HTTP proxy 只做 HTTP 转发,TLS 终止由宿主 proxy 完成,避免容器内处理 Cloudflare 证书验证和 SNI 问题。
|
||||
|
||||
## D601 宿主 hyueapi-proxy 服务
|
||||
|
||||
部署路径:`~/pipeline/services/hyueapi-proxy/proxy.mjs`
|
||||
|
||||
systemd user service:`~/.config/systemd/user/hyueapi-proxy.service`
|
||||
|
||||
```bash
|
||||
# 状态检查
|
||||
systemctl --user status hyueapi-proxy.service
|
||||
|
||||
# 重启
|
||||
systemctl --user restart hyueapi-proxy.service
|
||||
|
||||
# 验证(需要 auth)
|
||||
KEY=$(cat ~/pipeline/.state/secrets/gpt-5.5/OPENAI_API_KEY)
|
||||
curl -H "Authorization: Bearer $KEY" http://127.0.0.1:17680/v1/models
|
||||
```
|
||||
|
||||
服务行为:
|
||||
- 监听 `0.0.0.0:17680`(容器通过 `host.docker.internal` 访问)
|
||||
- 上游 `hyueapi.com:443`(HTTPS)
|
||||
- 覆盖 `Host` header 为 `hyueapi.com`
|
||||
- 透传所有其他 header(包括 `Authorization`)
|
||||
- 无认证、无缓存、无日志(生产态)
|
||||
|
||||
## Harness Token 注入规则
|
||||
|
||||
`scripts/src/opencodeContainerHarness.ts` 中 in-container proxy 的 token 查找顺序:
|
||||
|
||||
```
|
||||
ANTHROPIC_AUTH_TOKEN → ANTHROPIC_API_KEY → OPENAI_API_KEY
|
||||
```
|
||||
|
||||
model 组件的 `auth.envNames` 声明注入到容器的环境变量名。对于 OpenAI-compatible 提供商(如 gpt-5.5),`envNames` 必须包含 `OPENAI_API_KEY`,harness 才能在 proxy 层自动注入 Bearer token。
|
||||
|
||||
## Smoke Test 验证
|
||||
|
||||
每个 model 组件应配套一个 smoke-test pipeline 用于验证端到端连通性:
|
||||
|
||||
```text
|
||||
components/pipeline/gpt-5.5-smoke-test/config.json
|
||||
components/procedure/gpt-5.5-smoke-connectivity/config.json
|
||||
```
|
||||
|
||||
Smoke test 验证链路:
|
||||
1. 容器启动,harness 写入 OpenCode provider config 并启动 in-container proxy
|
||||
2. OpenCode server 启动,harness 创建 session 并发送 prompt
|
||||
3. 模型通过 proxy chain 完成请求(`POST /v1/responses`)
|
||||
4. 模型执行任务并通过 OA skill 提交 `benchmark-repair-result-v1`
|
||||
5. Harness 验证 OA submission 存在且 container exit code = 0
|
||||
|
||||
运行方式:
|
||||
```bash
|
||||
cd ~/pipeline
|
||||
npx tsx scripts/pipeline-cli.ts procedure start \
|
||||
--pipeline gpt-5.5-smoke-test \
|
||||
--node smoke \
|
||||
--task "Connectivity test: ..."
|
||||
```
|
||||
|
||||
## 新增 Model 组件检查清单
|
||||
|
||||
1. 创建 `components/model/{id}/config.json`,声明 `opencode`、`auth`、`proxy` 和 `runtimeEnv`
|
||||
2. 创建 `.state/secrets/{id}/{ENV_NAME}` 存放 API key
|
||||
3. 如果上游需要 Host header 覆盖或 TLS 特殊处理,部署宿主 proxy 服务并将 `proxy.upstreamOrigin` 指向 `http://host.docker.internal:{port}`
|
||||
4. 确认 `auth.envNames` 中的变量名在 harness token 查找链中(当前支持 `ANTHROPIC_AUTH_TOKEN`、`ANTHROPIC_API_KEY`、`OPENAI_API_KEY`)
|
||||
5. 创建 smoke-test pipeline 和 procedure 组件
|
||||
6. 运行 smoke test 验证端到端连通性
|
||||
7. 提交到 pipeline 仓库
|
||||
Reference in New Issue
Block a user