添加比赛材料:演示视频、PPT、项目说明书和承诺书
本项目实现一套面向多智能体协作的低开销运行时原型,围绕赛题要求完成以下核心机制:
系统面向 openEuler 24.03-LTS-SP3 开发,核心运行时仅依赖 Python 3.10+ 标准库。
. ├── src/ │ └── agent_collab/ │ ├── agents.py # LLM 决策解析及四类 Agent │ ├── runtime.py # 双模式运行时和任务生命周期 │ ├── protocol.py # 握手、能力发现及动作路由 │ ├── state.py # OS 共享内存 arena 和状态引用 │ ├── memory.py # SQLite/JSON 记忆存储及混合检索 │ ├── tools.py # 可复现的 openEuler 运维工具注册表 │ ├── llm.py # OpenAI-compatible Provider、重试及缓存 │ ├── embeddings.py # 本地确定性语义向量生成 │ ├── models.py # 消息模型及评测指标 │ ├── benchmark.py # 双模式实验和结果生成 │ ├── visualize.py # 静态 HTML 页面 │ └── sandbox.py # 可选的受限 CodeAct 执行环境 ├── scripts/ │ ├── run_benchmark.py # 唯一完整实验入口 │ ├── verify_requirements.py # 赛题要求验收 │ ├── check_llm_config.py # LLM 配置和连通性检查 │ └── install.sh # openEuler 安装脚本 ├── reports/ │ └── run_YYYYMMDD_HHMMSS_xxxxxx/ │ ├── benchmark_summary.json # 机器可读的指标事实来源 │ ├── experiment_report.md # 自动生成的中文实验结果 │ ├── dashboard.html # 独立静态可视化页面 │ ├── structured_messages.json # 结构化协议模式的消息轨迹 │ ├── text_messages.json # 纯文本协作模式的消息轨迹 │ ├── structured_memory.sqlite # 结构化模式的共享记忆数据库 │ └── text_memory.sqlite # 纯文本模式的共享记忆数据库 ├── tasks.json # 两组连续任务及可复现实验数据 ├── .env.example # 不含真实密钥的配置模板 ├── pyproject.toml ├── requirements.txt └── LICENSE
用户任务 | v AgentRuntime |-- 协议握手、能力发现、动作路由 | |-- PlannerAgent ---- 真实 LLM JSON 决策 | | | v | 计划状态写入共享内存 | | |-- RetrieverAgent -- SQLite 混合检索 | | | v | plan_ref + retrieval_ref | | |-- ExecutorAgent --- 工具执行 / 历史产物复用 | | | v | execution_ref | | `-- SummarizerAgent - 证据、摘要、策略写入共享记忆
结构化模式启动时,Agent 向 ProtocolRegistry 发布角色和动作能力。运行时建立 action 到 Agent 的映射,例如 plan_task -> planner、execute_plan -> executor,随后所有控制消息都通过统一协议路由。
plan_task -> planner
execute_plan -> executor
每项任务的状态依次经历:
纯文本模式表示传统多 Agent 协作。任务、计划、完整记忆记录和执行结果被编码为带边界标记的自然语言与 JSON 文本。接收 Agent 必须从文本中定位载荷并执行 JSON 解码,之后才能继续处理。
该模式不加入等待、循环或人为延迟。所有耗时均来自实际序列化、解析、检索、工具执行和存储操作。
结构化模式将消息收敛为动作、参数、结果、能力、状态引用和记忆引用:
{ "from": "retriever", "to": "executor", "action": "execute_plan", "capability": "executes LLM-selected registered tools", "params": {"task_id": "incident-02"}, "result": { "plan_state_id": "state_xxx", "retrieval_state_id": "state_yyy" }, "state_refs": [ { "state_id": "state_xxx", "segment_name": "ac_xxx", "offset": 0, "schema": "agent_collab.plan.v1", "payload_bytes": 1024, "vector_bytes": 384, "sha256": "..." } ], "memory_refs": ["mem_xxx"] }
接收 Agent 不会通过 Python 变量直接获得计划或执行结果,而是根据 segment_name + offset + length 读取共享内存。两种模式使用相同任务、相同 LLM 决策、相同工具和独立记忆数据库,唯一主要变量是协作通信方式。
segment_name + offset + length
StateStore 在运行开始时创建一个固定容量的 OS 共享内存 arena。所有 Agent 复用同一次映射,并使用 64 字节对齐的偏移分配状态,避免为每条状态反复创建共享内存段。
每条状态包括:
state_id
segment_name
offset
schema
payload_bytes
vector_bytes
sha256
owner_agent
kind
created_at
语义向量由状态摘要生成,用于表达中间状态的紧凑语义特征。接收流程为:校验 task/plan/retrieval/execution schema、映射共享内存、按偏移读取、校验 SHA-256、反序列化负载、读取 float32 向量。评测分别统计状态负载和向量数据量。
SharedMemoryStore 正式实验使用 SQLite。每条记忆包含:
检索综合关键词、标签和余弦相似度。任务组标签作为强制过滤条件,避免故障诊断记忆误命中部署加固任务。每组第一个任务没有历史记忆,后续任务才能命中该组的相关记忆。
Executor 按 artifact_key 检查历史 evidence。若历史记忆已保存同一工具产物,Executor 直接复用并增加 avoided_tool_calls;否则执行注册工具并保存新产物。因此记忆命中会实际减少工具执行,而不是只在结果中记录 memory_id。
artifact_key
avoided_tool_calls
Planner 要求模型返回严格 JSON:
{ "steps": ["分析证据", "调用工具", "生成结论"], "memory_query": "agent-api.service startup failure", "tool_calls": [ { "name": "inspect_journal", "arguments": {"service": "agent-api.service"}, "artifact_key": "incident.journal" } ], "memory_summary": "可供后续任务复用的结论" }
模型输出会实际决定步骤、检索查询、工具及参数和记忆摘要。Runtime 只允许调用任务声明的工具,并补齐场景必须执行的能力。若模型没有返回合法 JSON 或没有选择有效工具,该任务会标记为 task-fallback,正式验收失败,不能再把“成功请求过模型”当作模型已生效。
task-fallback
为了公平比较通信机制,完整实验先为每个唯一任务请求一次真实模型,再让文本模式和结构化模式通过精确 payload 缓存复用同一决策。这样能够同时满足:
Provider 支持 timeout、指数退避、可重试 HTTP 状态码、thinking 开关、精确响应缓存和脱敏运行元数据。公开使用只保留一次完整真实模型实验。
Executor 使用 ToolRegistry 执行注册工具。当前可复现实验工具包括:
这些工具处理 tasks.json 中固定的日志、unit、网络和权限快照,保证评委可以在相同输入上复现实验。sandbox.py 另提供可选 CodeAct 原型,使用 AST 白名单限制 import、属性访问和危险调用;正式基准默认不依赖 CodeAct 加分项。
tasks.json 包含两个任务组,每组 5 个连续任务。
实验数据使用 fixture 与 task 分离的结构,避免重复内容,同时保留任务依赖、工具约束、预期证据和复用键。10 轮覆盖两组完整任务,满足不少于 10 轮连续运行要求。
端到端时间会受 SQLite I/O 和系统调度影响,因此报告同时公开任务总耗时和更聚焦于通信机制的 protocol_seconds,不隐藏负收益或外部波动。
protocol_seconds
每次运行只创建一个独立目录:
reports/run_YYYYMMDD_HHMMSS_xxxxxx/ ├── benchmark_summary.json ├── experiment_report.md ├── dashboard.html ├── structured_messages.json ├── text_messages.json ├── structured_memory.sqlite └── text_memory.sqlite
benchmark_summary.json 是机器可读事实来源;experiment_report.md 是自动生成的中文实验结果;dashboard.html、消息日志和 SQLite 数据库均由同一次运行产生。项目不会生成 latest_run.txt、根目录结果副本或预置历史结果。
scripts/verify_requirements.py 不只检查文件存在,还检查:
cd /home/openeuler/vv/openos bash scripts/install.sh source .venv/bin/activate
也可以不创建虚拟环境,直接在项目根目录运行脚本。
cp .env.example .env
编辑 .env:
AGENT_COLLAB_LLM_PROVIDER=openai-compatible AGENT_COLLAB_LLM_ENDPOINT=https://your-provider.example/v1/chat/completions AGENT_COLLAB_LLM_API_KEY=REPLACE_WITH_YOUR_API_KEY AGENT_COLLAB_LLM_MODEL=REPLACE_WITH_YOUR_MODEL AGENT_COLLAB_LLM_TIMEOUT_SECONDS=90 AGENT_COLLAB_LLM_MAX_TOKENS=512 AGENT_COLLAB_LLM_MAX_RETRIES=3 AGENT_COLLAB_LLM_RETRY_BACKOFF_SECONDS=2 AGENT_COLLAB_LLM_THINKING_MODE=disabled
检查配置和真实响应:
python3 scripts/check_llm_config.py --require-real python3 scripts/check_llm_config.py --probe
检查结果只显示 api_key_present,不输出密钥明文。
项目只保留这一套实验流程。首次运行前检查配置:
python3 scripts/check_llm_config.py --require-real
执行完整实验:
python3 scripts/run_benchmark.py
默认自动完成:
运行结束后验收:
python3 scripts/verify_requirements.py
不需要为正常实验传入 rounds、tasks、output、memory 或 LLM 调优参数;默认配置就是完整比赛实验。
RUN_DIR=$(find reports -maxdepth 1 -type d -name 'run_*' | sort | tail -n 1) cat "$RUN_DIR/experiment_report.md"
生成的 dashboard.html 是独立静态文件,可以下载到本机后直接打开,不依赖 Web 服务。
版权所有:中国计算机学会技术支持:开源发展技术委员会 京ICP备13000930号-9 京公网安备 11010802047560号
1. 系统简介
本项目实现一套面向多智能体协作的低开销运行时原型,围绕赛题要求完成以下核心机制:
系统面向 openEuler 24.03-LTS-SP3 开发,核心运行时仅依赖 Python 3.10+ 标准库。
2. 目录结构
3. 系统总体设计
结构化模式启动时,Agent 向 ProtocolRegistry 发布角色和动作能力。运行时建立 action 到 Agent 的映射,例如
plan_task -> planner、execute_plan -> executor,随后所有控制消息都通过统一协议路由。每项任务的状态依次经历:
4. 双模式通信设计
4.1 纯文本协作模式
纯文本模式表示传统多 Agent 协作。任务、计划、完整记忆记录和执行结果被编码为带边界标记的自然语言与 JSON 文本。接收 Agent 必须从文本中定位载荷并执行 JSON 解码,之后才能继续处理。
该模式不加入等待、循环或人为延迟。所有耗时均来自实际序列化、解析、检索、工具执行和存储操作。
4.2 结构化协议协作模式
结构化模式将消息收敛为动作、参数、结果、能力、状态引用和记忆引用:
接收 Agent 不会通过 Python 变量直接获得计划或执行结果,而是根据
segment_name + offset + length读取共享内存。两种模式使用相同任务、相同 LLM 决策、相同工具和独立记忆数据库,唯一主要变量是协作通信方式。5. 非文本状态传递设计
StateStore 在运行开始时创建一个固定容量的 OS 共享内存 arena。所有 Agent 复用同一次映射,并使用 64 字节对齐的偏移分配状态,避免为每条状态反复创建共享内存段。
每条状态包括:
state_id:状态唯一标识。segment_name:共享内存 arena 名称。offset:状态在 arena 中的起始偏移。schema:计划、检索或执行状态版本。payload_bytes:pickle protocol 5 二进制负载长度。vector_bytes:float32 语义向量长度。sha256:负载和向量的完整性校验值。owner_agent、kind、created_at:状态元数据。语义向量由状态摘要生成,用于表达中间状态的紧凑语义特征。接收流程为:校验 task/plan/retrieval/execution schema、映射共享内存、按偏移读取、校验 SHA-256、反序列化负载、读取 float32 向量。评测分别统计状态负载和向量数据量。
6. 共享记忆设计
SharedMemoryStore 正式实验使用 SQLite。每条记忆包含:
检索综合关键词、标签和余弦相似度。任务组标签作为强制过滤条件,避免故障诊断记忆误命中部署加固任务。每组第一个任务没有历史记忆,后续任务才能命中该组的相关记忆。
Executor 按
artifact_key检查历史 evidence。若历史记忆已保存同一工具产物,Executor 直接复用并增加avoided_tool_calls;否则执行注册工具并保存新产物。因此记忆命中会实际减少工具执行,而不是只在结果中记录 memory_id。7. LLM 接入与统一实验
Planner 要求模型返回严格 JSON:
模型输出会实际决定步骤、检索查询、工具及参数和记忆摘要。Runtime 只允许调用任务声明的工具,并补齐场景必须执行的能力。若模型没有返回合法 JSON 或没有选择有效工具,该任务会标记为
task-fallback,正式验收失败,不能再把“成功请求过模型”当作模型已生效。为了公平比较通信机制,完整实验先为每个唯一任务请求一次真实模型,再让文本模式和结构化模式通过精确 payload 缓存复用同一决策。这样能够同时满足:
Provider 支持 timeout、指数退避、可重试 HTTP 状态码、thinking 开关、精确响应缓存和脱敏运行元数据。公开使用只保留一次完整真实模型实验。
8. 工具执行与 CodeAct
Executor 使用 ToolRegistry 执行注册工具。当前可复现实验工具包括:
这些工具处理 tasks.json 中固定的日志、unit、网络和权限快照,保证评委可以在相同输入上复现实验。sandbox.py 另提供可选 CodeAct 原型,使用 AST 白名单限制 import、属性访问和危险调用;正式基准默认不依赖 CodeAct 加分项。
9. 任务设计
tasks.json 包含两个任务组,每组 5 个连续任务。
9.1 服务故障诊断组
9.2 部署加固组
实验数据使用 fixture 与 task 分离的结构,避免重复内容,同时保留任务依赖、工具约束、预期证据和复用键。10 轮覆盖两组完整任务,满足不少于 10 轮连续运行要求。
10. 实验报告设计
10.1 对照原则
10.2 指标体系
端到端时间会受 SQLite I/O 和系统调度影响,因此报告同时公开任务总耗时和更聚焦于通信机制的
protocol_seconds,不隐藏负收益或外部波动。10.3 输出文件
每次运行只创建一个独立目录:
benchmark_summary.json 是机器可读事实来源;experiment_report.md 是自动生成的中文实验结果;dashboard.html、消息日志和 SQLite 数据库均由同一次运行产生。项目不会生成 latest_run.txt、根目录结果副本或预置历史结果。
10.4 验收规则
scripts/verify_requirements.py 不只检查文件存在,还检查:
11. 部署与运行
11.1 环境要求
11.2 安装
也可以不创建虚拟环境,直接在项目根目录运行脚本。
11.3 配置真实模型
编辑 .env:
检查配置和真实响应:
检查结果只显示 api_key_present,不输出密钥明文。
11.4 运行完整实验
项目只保留这一套实验流程。首次运行前检查配置:
执行完整实验:
默认自动完成:
运行结束后验收:
不需要为正常实验传入 rounds、tasks、output、memory 或 LLM 调优参数;默认配置就是完整比赛实验。
11.5 查看结果
生成的 dashboard.html 是独立静态文件,可以下载到本机后直接打开,不依赖 Web 服务。