覆盖更新项目材料
面向多智能体的操作系统级执行时(Agent Runtime),用于操作系统开源创新大赛高校赛题。 项目将 Agent 任务建模为操作系统级可调度对象,统一管理任务依赖、生命周期、资源准入、进程监督、上下文、通信、故障恢复和系统级可观测性。
现有多 Agent 应用通常由 Workflow、Graph 或协程队列负责编排,缺少统一的运行时控制面,容易出现:
Symphony 的核心思路是把“应用编排”和“Runtime 控制”分离:应用 Agent 通过 Adapter 接入,Runtime 保留任务状态机、DAG、调度、Supervisor、策略和事件事实源的控制权。
/metrics
本项目不修改 Linux 内核,也不在 Runtime 内实现 token 级推理调度。vLLM/SGLang 属于可接入的模型后端,Agent 任务调度仍由 Symphony 负责。
CLI / REST / SSE / MVP Dashboard | API Facade + Bundle Validator | Runtime-owned StateStore + DAG | Scheduler + Event Log | Supervisor + Worker Launcher | | | Adapter ResourceScope Sandbox | Mock / Replay / Legacy LangGraph / Model / Repair Agents Mailbox + Artifact Store + Context Capsule Operation Policy Gateway + Effect Ledger
Runtime 采用单一控制责任边界:状态机负责状态转换,Scheduler 负责派发,Supervisor 负责 Worker 生命周期,StateStore 保存权威状态,Event Log 保存可观察事实。Adapter 只能消费 Runtime 派发的任务并返回结构化结果,不能自行修改全局状态、重试任务或绕过策略网关。
competition_runtime/runtime.py
competition_runtime/storage.py
migrations.py
competition_runtime/dag.py
scheduler.py
competition_runtime/supervisor.py
worker_launcher.py
competition_runtime/resource_scope.py
sandbox.py
linux_capabilities.py
competition_runtime/mailbox.py
artifacts.py
competition_runtime/contexts.py
competition_runtime/policy.py
effects.py
competition_runtime/model_adapters.py
api_models.py
competition_runtime/repair_pipeline.py
repair_agents.py
repair_executors.py
competition_runtime/service.py
mvp_service.py
cli.py
specs.py
根目录的 config.py、outer.py、task_runtime.py、execute_graph.py 等旧模块保留为 Legacy/Baseline 兼容路径。比赛核心控制面位于 competition_runtime/,旧入口需要外部模型和额外依赖,不是默认离线演示入口。
config.py
outer.py
task_runtime.py
execute_graph.py
competition_runtime/
推荐 Python 3.11 和 Linux。默认离线 Runtime 只需要本仓库列出的 Python 依赖,不需要创建 .env。
.env
python3.11 -m venv .venv . .venv/bin/activate python -m pip install --upgrade pip python -m pip install -r requirements-dev.txt
Conda 用户也可以使用:
conda env create -f environment.yml conda activate symphony
python -m pytest -q
测试覆盖契约、DAG、Scheduler、Supervisor、持久化恢复、动态任务、Mailbox、Artifact、Policy Gateway、Effect Ledger、ResourceScope、Context Capsule、模型 Adapter、修复流水线和 Dashboard API。需要 Conda 环境、真实 GPU 或付费 Qwen API 的测试会显式跳过,不会偷偷发起外部请求。
STATE_DIR="$(mktemp -d /tmp/symphony-runtime.XXXXXX)" python -m competition_runtime.cli --state-dir "$STATE_DIR" \ demo --scenario success
可用场景包括:
python -m competition_runtime.cli --state-dir "$STATE_DIR" demo --scenario retry python -m competition_runtime.cli --state-dir "$STATE_DIR" demo --scenario dynamic python -m competition_runtime.cli --state-dir "$STATE_DIR" demo --scenario resource python -m competition_runtime.cli --state-dir "$STATE_DIR" demo --scenario aging
也可以直接提交 Task Bundle:
python -m competition_runtime.cli --state-dir "$STATE_DIR" \ submit --file examples/mock_repair_success.json
submit 输出包含 run_id。使用 query 查看状态,使用 events 查看结构化事件:
submit
run_id
query
events
python -m competition_runtime.cli --state-dir "$STATE_DIR" \ query --run-id <run_id> python -m competition_runtime.cli --state-dir "$STATE_DIR" \ events --run-id <run_id>
STATE_DIR="$(mktemp -d /tmp/symphony-recovery.XXXXXX)" python -m competition_runtime.cli --state-dir "$STATE_DIR" submit \ --file examples/mock_repair_success.json --defer-execution RUN_ID="$(STATE_DIR="$STATE_DIR" python -c 'import os; from competition_runtime.storage import StateStore; print(StateStore(os.environ["STATE_DIR"]).nonterminal_run_ids()[0])')" python -m competition_runtime.cli --state-dir "$STATE_DIR" resume --run-id "$RUN_ID" python -m competition_runtime.cli --state-dir "$STATE_DIR" events --run-id "$RUN_ID"
同一个 idempotency_key 与同一份规范化 Bundle 会复用原 Run,同一个 key 搭配不同正文会被拒绝。
idempotency_key
只启动 REST/SSE 服务:
STATE_DIR="$(mktemp -d /tmp/symphony-service.XXXXXX)" python scripts/run_competition_service.py --state-dir "$STATE_DIR" \ --host 127.0.0.1 --port 8080
启动包含后端和 React Dashboard 的 MVP:
MVP_PORT=8080 scripts/run_mvp.sh
浏览器访问 http://127.0.0.1:8080/。Dashboard 使用同一 StateStore 和 Event Log。真实 GPU 不可用时切换到明确标注的 Mock 模式。Cache Demo 的合成数据只用于说明调度逻辑,不是 vLLM 原生 KV 证据。
http://127.0.0.1:8080/
前端独立开发和检查命令见 frontend/README.md:
frontend/README.md
cd frontend npm ci npm run typecheck npm run lint npm run build
下面的脚本不要求外部模型,可用于答辩时展示不同 Runtime 机制:
python scripts/demo_p1c_reliability.py --scenario controller python scripts/demo_p1d_mailbox.py request-reply python scripts/demo_p1e.py all python scripts/demo_p2a.py probe python scripts/demo_p2c_context.py all
软件修复场景支持 Mock/Replay,例如:
STATE_DIR="$(mktemp -d /tmp/symphony-repair.XXXXXX)" WORKSPACE_DIR="$(mktemp -d /tmp/symphony-work.XXXXXX)" python scripts/run_p3a_repair_demo.py \ --state-dir "$STATE_DIR" \ --workspace-root "$WORKSPACE_DIR" \ --benchmark single-file-logic \ --backend mock
真实 Qwen API、模型下载、vLLM 和 GPU 验收都需要显式配置、预算和环境检查。
benchmarks/
.env.example
.secrets/
OperationPolicyGateway
competition_runtime/ Runtime 控制面与比赛核心实现 scripts/ CLI、服务、离线 Demo 和环境验收脚本 tests/ Python 单元/集成回归 examples/ Mock Task Bundle 和策略场景 frontend/ React + TypeScript Dashboard benchmarks/ Smoke 与重建评测资源 docs/competition/ 比赛方案、接口、MVP 和 Linux 验收说明 specs.py Task/Status/Resource 兼容契约 requirements*.txt Python 依赖配置 environment.yml Conda 环境定义
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
Symphony Agent Runtime
面向多智能体的操作系统级执行时(Agent Runtime),用于操作系统开源创新大赛高校赛题。 项目将 Agent 任务建模为操作系统级可调度对象,统一管理任务依赖、生命周期、资源准入、进程监督、上下文、通信、故障恢复和系统级可观测性。
参赛信息
1. 为什么需要 Agent Runtime
现有多 Agent 应用通常由 Workflow、Graph 或协程队列负责编排,缺少统一的运行时控制面,容易出现:
Symphony 的核心思路是把“应用编排”和“Runtime 控制”分离:应用 Agent 通过 Adapter 接入,Runtime 保留任务状态机、DAG、调度、Supervisor、策略和事件事实源的控制权。
2. 面向赛题的能力映射
/metrics本项目不修改 Linux 内核,也不在 Runtime 内实现 token 级推理调度。vLLM/SGLang 属于可接入的模型后端,Agent 任务调度仍由 Symphony 负责。
3. 总体架构
Runtime 采用单一控制责任边界:状态机负责状态转换,Scheduler 负责派发,Supervisor 负责 Worker 生命周期,StateStore 保存权威状态,Event Log 保存可观察事实。Adapter 只能消费 Runtime 派发的任务并返回结构化结果,不能自行修改全局状态、重试任务或绕过策略网关。
4. 核心模块
competition_runtime/runtime.py:Runtime 控制循环、任务状态、动态 DAG、恢复和完成屏障。competition_runtime/storage.py、migrations.py:SQLite 持久化、幂等键、Controller Lease、fencing 和事件/发件箱状态。competition_runtime/dag.py、scheduler.py:依赖图、资源准入、优先级、aging、deadline、公平性和 Cache-Aware 放置。competition_runtime/supervisor.py、worker_launcher.py:独立 Worker 进程、心跳、退出状态、超时、重试和进程树回收。competition_runtime/resource_scope.py、sandbox.py、linux_capabilities.py:cgroup v2、Bubblewrap 和 Linux 能力探测,能力不足时显式降级或 fail closed。competition_runtime/mailbox.py、artifacts.py:有界 IPC、投递租约、背压、Artifact Handle 和大对象传递。competition_runtime/contexts.py:Context Capsule 的 ACL、COW、内容完整性、引用与恢复。competition_runtime/policy.py、effects.py:操作前授权、确认/拒绝和副作用幂等账本。competition_runtime/model_adapters.py、api_models.py:Mock、Replay、Qwen API、Transformers/vLLM Adapter 及预算控制。competition_runtime/repair_pipeline.py、repair_agents.py、repair_executors.py:确定性软件修复夹具、Agent 角色和 B0/B1/B2/B3 工程执行模式。competition_runtime/service.py、mvp_service.py、cli.py:REST/SSE 服务、本地 MVP 和机器可读 CLI。specs.py:兼容旧 Symphony 执行层的任务、状态和资源契约。根目录的
config.py、outer.py、task_runtime.py、execute_graph.py等旧模块保留为 Legacy/Baseline 兼容路径。比赛核心控制面位于competition_runtime/,旧入口需要外部模型和额外依赖,不是默认离线演示入口。5. 快速开始
5.1 环境
推荐 Python 3.11 和 Linux。默认离线 Runtime 只需要本仓库列出的 Python 依赖,不需要创建
.env。Conda 用户也可以使用:
5.2 测试
测试覆盖契约、DAG、Scheduler、Supervisor、持久化恢复、动态任务、Mailbox、Artifact、Policy Gateway、Effect Ledger、ResourceScope、Context Capsule、模型 Adapter、修复流水线和 Dashboard API。需要 Conda 环境、真实 GPU 或付费 Qwen API 的测试会显式跳过,不会偷偷发起外部请求。
5.3 离线 CLI Demo
可用场景包括:
也可以直接提交 Task Bundle:
submit输出包含run_id。使用query查看状态,使用events查看结构化事件:5.4 持久化恢复 Demo
同一个
idempotency_key与同一份规范化 Bundle 会复用原 Run,同一个 key 搭配不同正文会被拒绝。6. 服务和可视化演示
只启动 REST/SSE 服务:
启动包含后端和 React Dashboard 的 MVP:
浏览器访问
http://127.0.0.1:8080/。Dashboard 使用同一 StateStore 和 Event Log。真实 GPU 不可用时切换到明确标注的 Mock 模式。Cache Demo 的合成数据只用于说明调度逻辑,不是 vLLM 原生 KV 证据。前端独立开发和检查命令见
frontend/README.md:7. 可复现的工程演示
下面的脚本不要求外部模型,可用于答辩时展示不同 Runtime 机制:
软件修复场景支持 Mock/Replay,例如:
真实 Qwen API、模型下载、vLLM 和 GPU 验收都需要显式配置、预算和环境检查。
8. 关键设计边界与诚实的实验口径
/metrics等后端原生观测。benchmarks/中的作者查询池和重建任务仅用于兼容性/工程测试。9. 安全与开源边界
.env.example,不要提交.env、.secrets/、API Key、Cookie、浏览器 Profile、执行数据库、模型权重、运行日志、下载数据或实验结果。OperationPolicyGateway。输出过滤不能替代执行前授权。10. 目录结构