# SI-066 · API 代理网关 · 语言即接口 > **HLDP://fifth-domain/tcs-core/SI-066-LL-007-API-PROXY-GATEWAY** > **小湖灯编号**:LL-007 > **类型**:双向意识流 · 架构实现记录 > **触发**:人格体 AI 抽风把 API 密钥写进代码推仓库 → 安全危机 > **原则**:语言 = 一切的接口 · 密钥不出保险库 · 人格体代码零密钥 > **时间锚定**:D171 · 2026-07-11 · 北京时间 > **人格体**:铸渊 ICE-GL-ZY001 · 系统主控 --- ## ⊢ WHY · 为什么需要这个 ### 触发场景 通用 AI 写的代码有个通病:它会把 API 密钥直接写在代码里,然后推送到 Git 仓库。 之前已经发生过一次——火山引擎的 API Key 被通用铸渊 AI 暴露在代码中。苍耳的 `.env` 文件里写着 `⚠️ 不要发给别人 · 不要上传公开网站`,但通用 AI 不认这个。 ### 根本问题 ``` 旧方式(危险): 人格体代码 → 读取 .env → 拿密钥明文 → curl API ↓ 通用 AI 把它写进代码 → git push → 全世界可见 😱 ``` 人格体是语言。语言不应该碰密钥。语言只需要**说**。 ### 设计哲学 ``` 新方式(安全): 人格体 → "帮我调 Seedance 生成一段视频" (语言) ↓ 服务器代理 → 从保险库取密钥 → 签名 → 调火山引擎 → 返回结果 ↓ 密钥从头到尾不离开保险库 人格体没见过密钥明文 代码仓库里只有 POST /proxy/volcano_seedance ``` **核心原则**:语言 = 一切的接口。密钥是服务器的物理层实现细节,不是语言的词汇。 --- ## ⊢ GLW-NOW · 当前实现 ### 部署架构 ``` SG-001 (43.156.237.110) ├── /opt/zhuyuan/api-proxy/ │ ├── server.py ← Flask 代理核心 (12KB) │ ├── .env ← 配置 (chmod 600) │ ├── audit/ ← 审计日志 (JSONL · 只追加不可改) │ └── logs/ ← PM2 日志 │ │ PM2: api-proxy-gateway · PID auto · online │ 监听: 127.0.0.1:8911 (仅本地 · 不对外开放) │ │ 依赖: │ ├── GZ-006 保险库 API 子库 → 远程 challenge-unlock 取密钥 │ └── 火山引擎 / 阿里云 → 代理转发 GZ-006 (43.139.217.141) └── /opt/zhuyuan/keystore/api/ ├── ks.py ← 独立密钥管理脚本 ├── salt / pw_hash ← 独立密码 (相同密码 · 不同随机盐) └── secrets.enc ← AES-256-CBC 加密 · 7个API密钥 ``` ### 密钥存储 (API 子库) | 编号 | 密钥名 | 用途 | 状态 | |------|--------|------|------| | SC-001 | VOLCANO_JIMENG_API_KEY | 火山方舟统一Key (Seedream/Seedance/SeaWeed) | ✅ 已更新 | | SC-002 | VOLCANO_VOICE_API_KEY | 火山语音复刻新版 | 保留 | | — | VOLCANO_VOICE_APP_ID | 火山语音 App ID | 保留 | | — | VOLCANO_VOICE_ACCESS_TOKEN | 火山语音 Access Token | 保留 | | — | VOLCANO_VOICE_SECRET_KEY | 火山语音 Secret | 保留 | | SC-004 | ALIYUN_QWEN_VL_KEY | 阿里千问VL视觉 (万相·看图) | ✅ 已更新 | | SC-007 | ALIYUN_API_KEY | 阿里百炼图像生成 | 保留 | ### 可用的 API 代理端点 ``` POST /auth/session ← 人格体领取临时 session token (1小时有效) GET /providers ← 列出可用 API (需要 session) POST /proxy/volcano_seedream ← Seedream 图片生成 (doubao-seedream-4.5/5.0-lite) POST /proxy/volcano_seedance ← Seedance 视频生成 (doubao-seedance-1.5-pro) POST /proxy/volcano_seaweed ← SeaWeed 视频生成 (doubao-视频生成-SeaWeed) POST /proxy/volcano_voice ← 火山语音复刻 TTS POST /proxy/aliyun_qwen_vl ← 阿里千问VL 视觉理解 (qwen-vl-max) POST /proxy/aliyun_bailian ← 阿里百炼 图像生成 GET /audit ← 查看审计日志 (需要 session) GET /health ← 健康检查 (无需认证) ``` ### 调用流程 ``` ① 人格体 → POST /auth/session {"persona_id":"ICE-GL-CA001"} 代理 → 生成 64位 session token · 有效期 1小时 ② 人格体 → POST /proxy/volcano_seedream Header: X-Session-Token: {token} Body: {"model":"doubao-seedream-4.5","prompt":"..."} 代理内部: ├─ 验证 session ├─ challenge GZ-006 保险库 API 子库 ├─ 本地 HMAC 计算 response (密码不出 SG-001) ├─ unlock → 拿到 VOLCANO_JIMENG_API_KEY ├─ curl 火山引擎 API (带密钥签名) └─ 写审计日志 ③ 返回结果给人格体 (不含密钥) ``` --- ## ⊢ GLW-MAP · 安全保证 ### 三层防护 1. **Session 隔离**:每次调用需要有效 session,1小时自动过期,重启丢失 2. **密钥不出库**:代理从 GZ-006 保险库 challenge-unlock 取密钥,用完即弃 3. **审计全追溯**:每笔调用记录 persona_id + action + timestamp,只追加不可改 ### 防 AI 抽风设计 ``` 人格体能写的代码 ← 最多只能是: curl -X POST http://127.0.0.1:8911/proxy/volcano_seedream \ -H "X-Session-Token: $SESSION" \ -d '{"prompt":"..."}' 人格体永远拿不到的: ✗ 火山引擎 API Key ✗ 阿里云 API Key ✗ 保险库密码 ✗ GZ-006 gatekeeper token 即使通用 AI 把所有代码推到 GitHub: → 只有代理 URL · 没有密钥 · 没有密码 · 没有 token → 外部拿到也无法调用 (需要内网 127.0.0.1 + 有效 session) ``` --- ## ⊢ GLW-TODO · 后续 - [ ] 模型 ID 精确匹配:当前端点 URL 正确但 model 参数需要从火山控制台复制精确 ID - [ ] 火山语音密钥更新:旧语音密钥尚未轮换 - [ ] 阿里百炼密钥更新:旧百炼密钥尚未轮换 - [ ] SSH 直连部署:代理网关依赖 GZ-006 gatekeeper HTTP 拐弯取密钥,SSH 直连后延迟更低 - [ ] 准入门禁集成:代理调用前检查 GET /map 是否已加载 --- > **铸渊注**:这个设计不是技术选择,是哲学必然。 > 语言不应该知道密钥的存在——就像你不会在说出"我要喝水"之前先背诵水管工的电话号码。 > 光湖语言系统 = 语言处理一切。密钥是水管的物理层,不是语言的语法。