目录

AegisRT

AegisRT是一个面向openEuler、从零设计并独立实现的通用Agent Runtime。系统将Agent及其任务视为可调度的运行时实体,在应用工作流层之下统一管理任务依赖、资源准入、操作系统资源限制、AI资源配额、逻辑上下文、生命周期和故障恢复。

AegisRT不依赖特定的多Agent应用或工作流框架。管理员通过本地不可变注册表加载通用Agent配置,应用则通过版本化Runtime API提交任务图,并使用Agent ID引用已经注册的Agent。

当前实现状态

当前master分支已经实现由daemon统一管理的单节点进程型Agent Runtime,并具备任务边界持久化和ContextVM投递能力,主要包括:

  • 统一的AgentSpecTaskSpecResourceVectorAgentAttempt模型;
  • 线程安全的动态DAG管理和生命周期校验;
  • FIFO、Priority和DAG-DRCFS三种调度策略;
  • 面向CPU、内存、LLM并发槽、Token和工具槽的多资源准入;
  • 版本化的loopback HTTP控制API和CLI daemon;
  • 有界的进程Worker执行器,支持超时、取消、输出限制、显式环境注入以及执行前后的准备与清理钩子;
  • 进程型Worker Manager,负责校验Agent与Task绑定、提供结构化任务输入、选择Agent和Task超时中的较短者,并记录AgentAttempt
  • 严格且有界的aegisrt.agent-output/v1标准输出协议:空标准输出表示无Artifact的有效结果;非空标准输出必须是单个JSON Envelope;Agent诊断信息必须写入标准错误;
  • 内部ControlPlane Coordinator,按照“调度→进程Worker→完成、失败或取消”的顺序执行,并确保资源预留只释放一次,同时强制执行单Agent并发上限;
  • 有界并发RunService,支持合并唤醒、优雅取消、运行统计和安全的执行事件观察;
  • 严格的本地Agent配置加载器,支持不可变快照、文件大小和JSON Schema边界、仅进程型入口、可选根目录约束以及面向openEuler的权限检查;
  • 面向CPU、内存和PID限制、进程归属以及CPU和内存统计的cgroup v2文件接口驱动;
  • 能够解析CPU、内存和I/O压力数据的PSI采集器;
  • ContextVM核心,支持不可变内容寻址Page、Scope和ACL、Manifest、写时复制来源、Token预算组装、精确引用复用指标、可追溯摘要、有界Provider适配器接口,以及不保留原始文本的逻辑Prompt前缀观测;
  • 持久化Context仓库,支持去重Blob、Manifest来源链、任务绑定写入、有界幂等账本、严格恢复校验,以及文件持久化模式下独立的原子Checkpoint;
  • ContextChannel,在任务完成前通过一次Context Checkpoint原子发布成功Agent的Envelope;即使输出为空也会保存显式标记;结果只投递给生产者自身以及DAG直接依赖任务所对应的Agent Principal,并兼容发布后或重启后才进入系统的Principal;
  • AegisLab确定性四Agent菱形任务,不依赖LLM或网络服务,用于验证并发分支、依赖汇合、摘要绑定的Context传递和私有最终报告;
  • AegisRepoOps真实六Agent GitLink仓库质量检查任务,对固定提交并发执行构建、测试、静态分析和依赖清点,再将来源信息汇总为JSON和Markdown证据,全程不依赖LLM;
  • Context投递适配器,根据已调度工作流和Agent Principal解析Manifest,通过结构化标准输入将组装文本传递给进程Agent,不将Context放入环境变量;
  • 有界、线程安全、进程内事件日志,支持单调递增ID、重放游标、淘汰缺口报告和载荷限制,并只允许投影执行与ContextVM安全指标;认证轮询API使用进程级随机流标识、重启安全游标拒绝、十进制字符串ID和第二层失败关闭响应投影;
  • 仅在启动阶段加载本地Agent注册表和Bearer Token文件;提供认证后的安全Agent目录投影、任务提交、任务列表和取消操作;Token使用常量时间校验,并在监听器创建前执行失败关闭检查;
  • 任务绑定的Context查询和追加API,支持强ETag前置条件、持久幂等、由所有权推导的可见性,以及请求、Page、Manifest和Checkpoint配额;
  • 从认证任务图提交开始,自动完成调度、Context组装、进程执行、终态迁移和安全结果事件投影;
  • 支持排队中和执行中的幂等取消;活动Worker退出后才释放资源预留;Attempt总超时覆盖Context解析和进程执行,并分别统计取消与超时;
  • Linux进程组隔离,以及可选的cgroup v2执行路径;该路径使用clone-into-cgroup完成进程初始放置,并负责终止残留进程和清理精确目录;
  • 版本化且带完整性校验的文件Checkpoint,保存TaskGraph状态、调度器资源预留、DAG-DRCFS公平状态、就绪时间、Attempt计数和显式取消意图;
  • 原子状态替换、Unix所有者独占权限、进程级单写者租约、严格恢复校验,以及阻止不兼容重启的配置指纹;
  • 持久化Runtime实例ID,用于绑定Runtime与Context Checkpoint来源,避免仅因Agent配置相同而误接收其他Runtime的Context快照;
  • 优雅关闭中断和重试,并向Agent传递稳定的Attempt编号及幂等元数据;
  • 失败关闭的活动Attempt恢复机制,要求先清理cgroup孤儿进程;每个Runtime具有稳定的cgroup命名空间,避免同机daemon因Attempt ID相同而发生冲突;
  • 分别统计成功、失败、取消、超时和关闭中断,并通过Runtime统计暴露持久化健康状态和代际信息;
  • 同源内嵌Web Console,不依赖前端构建工具或CDN;支持仅内存Bearer认证、通用任务DAG与Agent视图、有界事件游标恢复、Context元数据与追加控制,以及严格内容安全策略下的任务图提交和取消;
  • 外层HTTP Host Guard只接受localhost或loopback IP Authority,与仅监听loopback的策略共同防御DNS Rebinding。

cgroup v2驱动、PSI采集器和生命周期路径已经通过单元测试、跨平台构建和openEuler 24.03实机检查。已封存的内核机制验证证据包括固定工作量下的cpu.max节流、禁用swap后的memory.max OOM边界、pids.max任务上限、真实clone-into-cgroup放置,以及daemon硬崩溃后的孤儿进程清理。单种子资源实验和双种子F4实验属于机制门禁,不代表正式性能或长期可靠性统计。详见openEuler证据索引M1资源控制证据

daemon当前统一持有RunService和Coordinator。HTTP客户端只能提交任务图,不能手动推进调度器或声明进程已经完成。Agent命令和参数只能来自本地不可变注册表,不能通过任务请求注入。已经移除的手动tick和完成接口会返回404

ContextVM已经接入daemon执行路径和受控HTTP写入路径。GET /v1/tasks/{taskID}/context返回Manifest元数据和强ETag;POST /v1/tasks/{taskID}/context/pages使用If-MatchIdempotency-Key追加工作流或Agent可见内容。任务ID只用于绑定不可变的(workflow_id, agent_id) Principal,不构成独立授权身份。在文件持久化模式下,Page、去重Blob、Manifest历史、Head和幂等账本保存在<state-file>.context中,并在任务投递前恢复。每次任务图补丁最多包含256个任务;Context容量耗尽时返回HTTP 507,不会使原本健康的仓库进入损坏状态。

当前Bearer Token是daemon级管理员凭据,不提供用户级或多租户授权。Context文件是带完整性保护的明文JSON Envelope,在Unix上使用所有者独占权限写入,但未进行应用层加密,Windows权限语义也较弱。持久化daemon的Token统计目前采用确定性空白切分,而不是Provider Tokenizer。ContextVM提供有界的命名Provider Tokenizer和Summarizer适配器,并包含确定性抽取式参考摘要器;在配置Provider策略前,持久化daemon默认不启用摘要。

系统尚未实现物理模型KV Cache管理。Context持久化是有界的单节点全量快照,不是分布式存储、跨主机协议或目录级CAS与GC服务。输出完成记录受Context账本条目上限单独约束,目前没有GC;上限耗尽后,新的任务完成操作会失败关闭。Runtime和Context文件分别保证原子性,但不构成跨文件事务。缺少依赖输出标记时,Context解析会失败,而不是在空Context下继续运行;目前尚未保存两份文件共享的统一代际。

Context所有权采用(workflow_id, agent_id),而不是逐任务所有权。直接依赖任务会授权结果传递给其Agent Principal,该Principal也可能被同一工作流中的其他任务复用。早期format-v1 Context Checkpoint可以以兼容方式读取,但其中没有输出完成标记,系统也不会自动补齐来源信息;升级前应先排空未完成DAG并备份状态。EventLog仍是进程内有界事件流,查询API只暴露有界的安全终态投影,而不是持久审计日志。Telemetry导出、SDK和完整远程Worker仍属于后续工作,详见路线图

恢复语义为任务边界的至少一次执行。优雅重启会将被中断工作重新入队;只有在cgroup隔离能够先清理精确孤儿Attempt时,系统才接受包含活动工作的硬崩溃快照。这不是恰好一次执行、Worker重连或受支持的跨主机迁移协议。如果Context发布成功但Runtime完成状态尚未持久化,重试必须生成语义相同的Artifact Envelope;同一任务产生不同输出时会被判定为幂等冲突。openEuler上已经观察到有界的硬崩溃清理效果,但尚未完成大规模重复可靠性实验。

为什么采用DAG-DRCFS?

传统工作流引擎理解任务顺序,却不了解资源竞争;传统CPU调度器理解处理器公平性,却不了解DAG关键路径、LLM Token和工具并发。DAG-DRCFS将以下机制结合起来:

  1. 工作流级主导资源公平;
  2. 任务级优先级继承、关键路径价值、依赖解锁价值和等待老化;
  3. 投递前的强资源准入;
  4. 每次调度决策均生成可审计原因。

固定的S1、S2、S3正式调度实验已经在干净提交上完成,每个实验单元包含30对匹配样本。DAG-DRCFS降低了S1依赖解锁延迟,将S2 Jain完成速率公平性中位数从0.8262提高到0.9974,并将S3关键路径逻辑延迟从184降低到59逻辑毫秒,同时消除了预先声明的饥饿事件。封存的原始数据和配对区间位于evidence/scheduler/。这些结果来自确定性逻辑时钟策略实验,不代表宿主机或内核执行耗时。

快速开始

环境要求

  • Go 1.23或更高版本;正式构建应使用所选Go发行系列的最新安全补丁版;
  • Windows或Linux均可运行当前单元测试;
  • 内核资源控制实验需要启用cgroup v2委派的openEuler。

运行完整验证

./scripts/verify.ps1

启动daemon

1.创建包含32至256个允许字符的本地Token。Token文件已被Git忽略。在Linux和openEuler上,该文件必须仅允许所有者访问,通常使用0600权限。

$rng = [Security.Cryptography.RandomNumberGenerator]::Create()
$tokenBytes = New-Object byte[] 32
$rng.GetBytes($tokenBytes)
$rng.Dispose()
[Convert]::ToBase64String($tokenBytes) | Set-Content -NoNewline api.token

2.创建agents.local.json并填写本地可执行文件的绝对路径。以下内容是配置结构示例,使用前应替换entrypoint

{
  "agents": [
    {
      "id": "example-agent",
      "name": "Example Agent",
      "runtime": "process",
      "entrypoint": "C:\absolute\path\to\agent.exe",
      "args": [],
      "capabilities": ["example"],
      "resources": {
        "cpu_milli": 500,
        "memory_mib": 256,
        "llm_slots": 1,
        "token_budget": 8000
      },
      "max_concurrency": 1,
      "execution_timeout": "30s"
    }
  ]
}

进程Agent通过标准输入接收一条JSON请求,可以将诊断日志写入标准错误。执行成功时,标准输出必须为空、只含空白字符,或者包含一个严格的aegisrt.agent-output/v1 JSON Envelope。标准输出出现普通日志文本会导致Attempt失败。最小无Artifact响应如下:

{"version":"aegisrt.agent-output/v1","artifacts":[]}

Artifact可见性、接收者规则、配额、示例、失败行为和完整标准输入结构见进程Agent协议

如果不希望先编写Agent,可以直接运行AegisLab参考任务。它使用确定性的菱形DAG和本地进程Agent,不需要外部模型或网络服务。

真实应用验证见AegisRepoOps。该应用针对固定的公开GitLink Go仓库提交运行六任务扇出与汇合DAG,并生成可复核的质量证据。

3.启动daemon。由于服务当前不负责TLS终止,HTTP监听器仅允许绑定loopback地址。

go run ./cmd/aegisrt `
  -listen 127.0.0.1:8080 `
  -agents-file agents.local.json `
  -auth-token-file api.token `
  -scheduler-policy dag-drcfs `
  -state-file runtime.state

在浏览器中打开http://127.0.0.1:8080/console/。静态Console Shell可以匿名加载,但服务器不会向页面发送daemon凭据。将本地Token文件中的内容粘贴到连接表单后,Token只保存在当前页面的JavaScript内存中,并在刷新或锁定时清除。Console不依赖业务角色:它从安全Agent目录获取Agent ID,并根据任务依赖渲染工作流。

在由systemd管理的openEuler主机上,应使用已经审核的openEuler部署包。服务单元使用-cgroup-root auto时,AegisRT只发现被委派的服务cgroup,将daemon移入manager叶节点,并在接受Agent前通过私有层级启用cpumemorypids控制器。系统会拒绝直接使用全局cgroup v2挂载根目录。显式指定-cgroup-root属于管理员管理模式,需要提前准备好对应层级。

系统必须选择且只能选择一种状态模式。正式持久化运行使用-state-file;一次性本地实验可改用-ephemeral-scheduler-policy只接受fifoprioritydag-drcfs,默认值为dag-drcfs。所选策略会写入Runtime统计和持久化配置指纹,因此切换策略时必须使用新的状态文件,系统不会静默恢复不兼容的调度器状态。

Runtime文件可能包含任务目标及其他TaskSpec字段,相邻的<state-file>.context保存已提交的Context明文。应确保目录仅对当前用户可见,并禁止提交这两类文件。

默认情况下,系统会拒绝持久化Context格式出现之前生成的Checkpoint。对于受支持的Runtime v1升级,应先备份,再使用-migrate-legacy-state启动一次。由于v1不包含持久化Context内容,迁移只会创建空Context Head。该参数不能为正常的当前格式Runtime重建缺失或不匹配的Context文件。

健康检查

curl http://127.0.0.1:8080/healthz

认证自动执行流程见HTTP API指南。其他验证材料包括:

项目目录

cmd/aegisrt/                daemon和CLI入口
cmd/aegisrepo-config/       RepoOps注册表和任务图生成器
cmd/aegisrepo-agent/        真实GitLink仓库进程Agent
internal/domain/            Runtime领域模型和生命周期
internal/taskgraph/         动态DAG管理器
internal/scheduler/         调度策略、资源账本和统计
internal/runtimecore/       调度核心、Checkpoint和恢复逻辑
internal/statefile/         原子且带完整性校验的本地Checkpoint存储
internal/api/               版本化HTTP API
internal/apitoken/          受限本地Bearer Token加载器
internal/executor/          有界本地进程执行器
internal/worker/            进程Agent执行和Attempt记录
internal/agentprotocol/     严格有界的进程Agent标准输出协议
internal/controlplane/      调度、执行、完成或失败闭环
internal/runservice/        有界并发所有权循环和事件适配器
internal/agentconfig/       严格不可变的本地Agent注册表加载器
internal/resourcecontrol/   cgroup v2和PSI适配器
internal/contextvm/         逻辑Context数据模型、存储和组装
internal/contextstate/      持久化Context仓库和Checkpoint
internal/contextdispatch/   Manifest注册表和投递时ACL解析
internal/eventlog/          有界进程内可重放事件历史
internal/repoops/           真实GitLink仓库多Agent任务
internal/runtimeapp/        事务化daemon控制组合
internal/webconsole/        内嵌同源运维Console
deploy/openeuler/           非特权systemd部署资源
docs/                       架构、协议和需求映射
evidence/                   验证记录、证据和适用边界
experiments/                预注册实验和原始数据契约
scripts/                    可复现的本地验证脚本

开发原则

  • 核心包不得包含特定业务Agent角色名称;
  • 新增公共行为必须配套测试和设计决策记录;
  • CI采用失败关闭策略:格式、go vet、竞态测试、普通测试或构建失败都会使CI失败;
  • 实验结论必须关联原始数据、配置和Commit SHA;
  • 平台相关测试必须明确说明所验证的内核行为;
  • 禁止提交密钥、.env、运行日志和生成的二进制文件。

开源许可证

本项目采用Apache License 2.0,详见LICENSE

关于

面向 openEuler 的通用多智能体运行时,提供 DAG 多资源调度、进程隔离、上下文虚拟化与故障恢复能力。

17.3 MB
邀请码
    Gitlink(确实开源)
  • 加入我们
  • 官网邮箱:gitlink@ccf.org.cn
  • QQ群
  • QQ群
  • 公众号
  • 公众号

版权所有:中国计算机学会技术支持:开源发展技术委员会
京ICP备13000930号-9 京公网安备 11010802047560号