#!/usr/bin/env python3 """ 宿主层多 agent 编排示例:这层开源 core 里没有,得自己写。 做法不是让一个 thread 内部无限派生,而是宿主并行开多个 thread, 每个 thread 一个独立工作目录(最好是 git worktree,互不污染), 最后由宿主收集各 thread 的 turn 结果再汇总。桌面版“多线程指挥台” 的感觉,核心就是这一层,而不是 app-server 本身。 用法: python3 run_parallel.py --jobs jobs.json jobs.json 格式: [{"cwd": "/tmp/job-a", "prompt": "检查 a 模块的安全问题,只读,不要改代码"}, {"cwd": "/tmp/job-b", "prompt": "检查 b 模块的测试覆盖,只读,不要改代码"}] 每个 job 默认 sandbox=read-only、approval-policy=never,只做并行审查; 要并行改代码时,把 cwd 换成各自的 worktree,并把下面的参数改成 workspace-write,且事后逐个 review diff 再合并,冲突仍需人工处理。 """ import argparse import json import subprocess import sys import os HERE = os.path.dirname(os.path.abspath(__file__)) def main(): ap = argparse.ArgumentParser() ap.add_argument("--jobs", required=True) ap.add_argument("--codex-home", default=None) args = ap.parse_args() jobs = json.load(open(args.jobs)) procs = [] for i, job in enumerate(jobs): cwd = job["cwd"] if not os.path.isabs(cwd): cwd = os.path.join(HERE, cwd) cmd = [sys.executable, os.path.join(HERE, "client.py"), "--prompt", job["prompt"], "--cwd", cwd, "--sandbox", job.get("sandbox", "read-only"), "--approval-policy", "never"] if args.codex_home: cmd += ["--codex-home", args.codex_home] print(f"[job {i}] cwd={job['cwd']} prompt={job['prompt'][:60]}") procs.append((i, subprocess.Popen(cmd))) failed = 0 for i, p in procs: rc = p.wait() print(f"[job {i}] exit={rc}") failed += rc != 0 print(f"完成:{len(procs) - failed}/{len(procs)} 成功") return 1 if failed else 0 if __name__ == "__main__": raise SystemExit(main())