zizi 091b66a9bb 重构: 收敛 Agent/Skill 运行时与创作质量闭环
将角色与 Skill 从 .claude 迁入 .agent,移除 Claude CLI 运行时并接入固定 Opus 角色 profile、完整 schema、预算 deadline、raw 与回执证据链。

同步拆分 Skill 职责、复利 lesson、Gate 回放、Dashboard 人审入口、数据库登记和机械门禁;候选设计正文不包含在本提交中。
2026-08-22 02:12:32 +08:00

80 lines
5.3 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

---
name: call-content-model
description: 通过 New-API 的统一治理入口调用内容模型,执行额度窗口、模型降级、重试和 JSON 提取。清洗、拆书或知识审核需要 MiniMax 等内容模型时使用;不得裸调外部服务。
---
# 调用内容模型
创始人拍板(2026-07-13):清洗与拆书的内容生产 LLM **全部走 New-API 的 MiniMax-M3**;主会话(Fable5)只固化 agent/提示词/skill 与发起调用。本 skill 是唯一出口。
管线内容生产调用的**标准入口是 `chat_governed`**(受 5 小时额度窗 + 全局降级链治理);`chat`/`chat` CLI 是不受治理的直连,仅供调试。治理政策的机械事实源是运行配置、共享额度账本 `example_llm_quota` 和模型运行适配器——库实现装为共享包 `muse-llm`(`-e ./muse-llm`),调用方 `from muse_llm import chat_governed`,`scripts/llm.py` 只是本 Skill 的 CLI;模型链切换必须由该 skill 治理并留下日志。
## 用法
管线内所有内容生产型 LLM 调用(清洗探测、拆书抽取、知识卡审核等)**必须用 `chat_governed`**:
```python
from muse_llm import chat_governed, extract_json
content, usage, used_model = chat_governed(prompt, system=IDENTITY)
if used_model is None:
# 全链耗尽(所有模型敏感/不可用):失败关闭,由调用方裁决
# (拆书硬停 / 判重保守 keep / 审核标 blocked / 清洗该窗跳过),绝不拿空内容当成功
...
data = extract_json(content)
```
### 治理合同(chat_governed)
- **5 小时额度窗**:共享账本 `example_llm_quota` 按窗计钱计次(窗起点 00/05/10/15/20 点,末窗 20–24=4h)。
- MiniMax 模型(M3/M2.7)累计花费 ≥ **$24/窗** → 本窗降级链去掉 MiniMax 前缀,只剩 `glm-5.2 → deepseek-v4-flash`;
- 全模型成功调用 ≥ **6000 次/窗** → 打日志、睡到下一窗边界(睡眠期不持 DB 连接)续跑。
- **全局降级链 `BUDGET_CHAIN`** = `MiniMax-M3 → MiniMax-M2.7 → glm-5.2 → deepseek-v4-flash`。
调用方**不自写降级链**;`model` 参数仅作兼容保留,实际用哪个模型由全局额度策略决定。
- **立即熔断**:上游内容安全拦截(`SensitiveError`)或模型 Token Plan 耗尽(`PlanQuotaExhausted`)
不在同模型退避(退避必再触发、空烧),立即沿链换下一个模型;普通 429/5xx 仍指数退避重试。
- **返回值合同**:成功 → `(content, usage, actual_model)` 三元组;**全链耗尽 → `(None, None, None)`**。
调用方必须判 `used_model is None` 走失败关闭,不得静默拿空内容当成功。
- **记账**:只有 MiniMax 模型计入 $24/窗预算,其余模型成本计 0(只占调用数)。
### 调试入口(chat / chat CLI)——仅调试,默认失败关闭
`chat()` 是直连单轮对话(返回 `(content, usage)`),**不进额度账本、不走全局降级链**:
网络错/5xx/普通 429 指数退避重试,撞敏感/Token Plan 耗尽直接抛异常。
默认失败关闭:未传 `allow_ungoverned=True` 且未设 `MUSE_LLM_ALLOW_UNGOVERNED=1` 时直接抛 `RuntimeError`。
仅供人工调试与单点验证;任何烧真实余额的管线内容生产一律走 `chat_governed`。`chat` CLI 同理,须加 `--ungoverned`:
```bash
# 仅调试:显式 --ungoverned 后读 prompt 文件直连调用
.venv/bin/python .agent/skills/call-content-model/scripts/llm.py chat --ungoverned --prompt-file /tmp/p.txt [--model MiniMax-M3] [--max-tokens 32000] [--out /tmp/resp.txt] [--extract-json]
```
## 内建保障(chat 与 chat_governed 共用的单次调用机制,调用方不必重复实现)
- `trust_env=False`:本机代理环境变量会劫持内网直连(教训固化);
- 默认总 deadline 900s;网络错/5xx/普通 429 可在同一 deadline 内指数退避重试 2 次,额度窗等待超过 deadline 时失败关闭;
- `max_tokens` 仅对有实测硬上限的模型(M2.7/GLM)请求前主动裁剪,避免依赖含混的 HTTP 400 文案;
- `system` 段与任务材料分离(角色遵从更稳、身份段利于上游缓存);
- `extract_json()` 三级容错:直接解析 → 首尾括号截取 → json-repair 兜底(修中文引号/缺逗号/尾逗号——opus 试拆已实测两类 JSON 病,任何模型都可能犯);
- 每次调用向 stderr 打印 token 用量与耗时(成本审计)。
## 凭据与约束
- New-API 普通令牌只从 `MUSE_LLM_TOKEN` 环境变量读取,base URL 可由 `MUSE_LLM_BASE_URL` 覆盖;仓库不得保存令牌,严禁使用管理令牌调用 `/v1`。
- 可用模型以 `/v1/models` 为准(2026-07-13 在列:MiniMax-M3 / M2.x 系 / deepseek-v4-* / glm-5.2 / Qwen 嵌入与重排)。
- 嵌入调用不走本 Skill(已有 `embed-knowledge`,模型与维度钉死)。
## 数据边界
- 可发起受治理的外部模型调用;不落库除非合同另有声明。
- 不写 Canonical、不改正式规划。
## 输出
- 面向当前任务的可执行判断、检查清单或改写建议(Markdown 结构化段落)。
- 不直接落库、不代替 `write-next-chapter` / `decide-candidate` 写 Canonical。
## 复利合同
- **模式 C(平台底座)**:`lifecycle=platform`,D8 不适用;不登记创作经验 `example_lesson`。本 Skill 只提供受治理模型调用,供上游挂 raw/`run_id`。