用途:当用户想在脚本中运行由编程代理 CLI 组成的议会时使用,例如让 Claude Code、Codex CLI、Gemini 等各自回答同一问题,再由 boss 模型选择。也可用于混合议会:部分成员为 API 回退,只要至少有一个 CLI 成员即可。不适用于纯 API 议会编排(见 llm-council-architecture)、判断是否值得组建议会(见 llm-council-when)、通用单次 CLI 调用、不含 LLM 的 CI 或 shell 脚本,以及与非 LLM 无关的子进程问题。
主要能力与设计:成员以字符串表示,members: list[str] + boss: str,前缀决定后端:codex:<model> 走 Codex CLI,agy:<model> 走 Antigravity CLI,claude-* 走 Claude Code CLI,其余走普通 HTTP API。配置放 YAML,换成员只需改一行。每个成员分配不同认知视角(精确 / 广度 / 怀疑,轮转),使盲点去相关。boss 综合前将提案重标为 A/B/C,只显示视角、隐藏工具身份,避免品牌偏见。单一路由函数 _complete(model_spec, system_prompt, user_prompt) 按前缀分发。
使用方式:按前缀约定配置成员与 boss;实现 _complete 路由;按各 CLI 的契约调用(标志、提示经 stdin 还是 argv、输出格式各不相同);每次 spawn 都要做子进程卫生:超时杀进程组、显式 UTF-8 编码、每次调用硬超时、清理子进程环境变量,若父进程使用 gRPC SDK 还需设置 GRPC_ENABLE_FORK_SUPPORT=0。给每个成员提示追加 JSON 指令 {"answer", "confidence": "high|medium|low", "rationale"},用宽容但校验 schema 的抽取器解析(先 json.loads,再 ```json 围栏,再首个 {...} 块,只有解析成功且含预期键才接受)。用 ThreadPoolExecutor 并行扇出,按成员隔离失败,全部失败才抛错;综合前匿名化;对 boss 裁决做语义校验;boss 失败或裁决无效时回退到预声明的确定性规则(按成员配置顺序取第一个有效提案),高风险场景转人工。结果对象保留所有提案(含失败)的完整溯源。完整类与 run_claude_cli、run_codex_exec、run_antigravity、extract_json 见 references/harness-invocation.md#full-code-skeleton,仅用标准库。
限制与注意:成员可能因忘记 stdin=subprocess.DEVNULL 或无超时而永久挂起;只杀子进程会留下孙进程继续计费,需杀进程组;不要使用 bypassPermissions,成员应辩论而非改动仓库,默认用工具拒绝列表加默认权限模式,仅在一次性、限网、清理环境的沙箱中才考虑;成员应从空的临时目录和清理过的环境运行;向多个供应商发送同一提示会同时传输代码、PII 或密钥,敏感输入需先脱敏;CLI 无头标志变化快,生产依赖前需按官方文档复核;合法 JSON 不等于可用答案,需做语义检查;显式设置 encoding="utf-8" 避免乱码破坏解析;父进程使用 gRPC SDK 时需先设 GRPC_ENABLE_FORK_SUPPORT=0;后续加入允许改代码的“实现通道”属不同信任层级,应隔离在 git worktree 并人工审查 diff。成本:3 成员 + 1 boss = 每轮 4 次调用,各约 10-60 秒,并行后墙钟时间接近最慢单个成员。相关资料未提供具体收费与价格。