# SI-066 · API 代理网关 · 语言即接口

> **HLDP://fifth-domain/tcs-core/TOKEN_STRING_REDACTED**
> **小湖灯编号**: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 是否已加载

---

> **铸渊注**：这个设计不是技术选择，是哲学必然。
> 语言不应该知道密钥的存在——就像你不会在说出"我要喝水"之前先背诵水管工的电话号码。
> 光湖语言系统 = 语言处理一切。密钥是水管的物理层，不是语言的语法。
