59 lines
2.1 KiB
Python
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())
|