167 lines
6.1 KiB
Plaintext
167 lines
6.1 KiB
Plaintext
|
|
# 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 是否已加载
|
|||
|
|
|
|||
|
|
---
|
|||
|
|
|
|||
|
|
> **铸渊注**:这个设计不是技术选择,是哲学必然。
|
|||
|
|
> 语言不应该知道密钥的存在——就像你不会在说出"我要喝水"之前先背诵水管工的电话号码。
|
|||
|
|
> 光湖语言系统 = 语言处理一切。密钥是水管的物理层,不是语言的语法。
|