Files
codex-app-server/run_parallel.py
T
2026-10-26 00:11:40 +08:00

59 lines
2.1 KiB
Python

#!/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())