AIOS Rust 重写脚手架 aios-rs 源码解读:核心 Trait 契约与最小参考实现
2026/9/17 10:23:30 网站建设 项目流程

AIOS Rust 重写脚手架 aios-rs 源码解读:核心 Trait 契约与最小参考实现

【免费下载链接】AIOSAIOS: AI Agent Operating System项目地址: https://gitcode.com/GitHub_Trending/ai/AIOS

导读

aios-rs是 AIOS(AI Agent Operating System)框架的实验性 Rust 重写脚手架,本期文章基于 aios-rs/README.md 并结合其全部源码,系统拆解该脚手架定义的 context、memory、storage、tool、scheduler、llm adapter 六大核心 Trait 契约及各自的占位实现。读完本文,你将理解 AIOS 如何以 Trait 抽象承载 Agent 操作系统的子系统边界,掌握在 Rust 侧增量移植 Python 组件的装配方式与渐进式路线,并可直接上手cargo test验证脚手架可用性。

一、定位:Python 系统的 Rust 移植试验田

AIOS 本身是一个以 Python 实现的 Agent 操作系统(仓库根目录下的 aios 包即为 Python 主实现,包含llm_corememoryschedulerstoragesyscall等子系统)。而aios-rs的定位在 README 开头就写得很清楚:

Experimental Rust rewrite scaffold of the AIOS framework. This is an early foundation providing core trait definitions and minimal reference implementations so that the Python system can be incrementally ported / inter-operated.

它不是一个功能完整的重写版本,而是一个"脚手架"(scaffold):先定义核心 Trait 契约,再提供最小可运行的参考实现,为 Python 系统的逐步移植(incrementally ported)和未来混合语言互操作(inter-operated)打下地基。这一点在 src/lib.rs 的 crate 文档注释中再次确认:目标是在保持混合语言操作清晰边界的前提下,迭代式移植功能。

从 Cargo 配置看,Cargo.toml 中该 crate 名为aios-rs,版本0.1.0,使用 Rust2024edition,依赖仅有一个anyhow(用于统一错误类型),license 为 Apache-2.0——极简的依赖面正符合"脚手架先行"的设计意图。

二、现状速览:已完成什么、尚未做什么

README 的 Status 小节给出了这个脚手架的准确边界,逐条解读如下:

状态项含义源码佐证
Traits defined: context, memory, storage, tool, scheduler, llm adapter六个子系统的核心 Trait 均已定义src/context.rs、src/memory.rs、src/storage.rs、src/tool.rs、src/scheduler.rs、src/llm.rs
Minimal in-memory / filesystem / echo implementations提供内存态、文件系统、echo 三类最小实现内存态InMemoryMemoryManager、文件系统FsStorageManager、echo 型EchoLLM
No async runtime yet (Tokio not added)尚未引入 Tokio,全部为同步代码Cargo.toml 依赖中仅有anyhow
No vector DB / embedding integration yet尚未接入向量数据库与 embedding源码中无任何向量库引用
No FFI bridge to Python yet尚未打通与 Python 的 FFI 桥无 pyo3 / JSON-RPC 相关代码

这一现状意味着:当前阶段最适合用来理解"接口契约"而非"生产性能"。所有实现都是单线程、同步的占位实现,真正的高并发与混合语言协作要等路线图后续阶段。

三、六大核心 Trait 契约逐一拆解

这一节是本文的主体。六个子系统各自对应 Python 侧同名模块(如 Python 的 aios/context、aios/memory、aios/scheduler、aios/storage、aios/llm_core、aios/tool),Rust 侧以 Trait 方式抽象其核心行为。

3.1 ContextManager:上下文快照与恢复

src/context.rs 定义了上下文管理器契约,对应 Agent 运行时的上下文快照(snapshot)与恢复(recover)能力:

pub trait ContextManager: Send + Sync { fn start(&mut self) -> anyhow::Result<()> { Ok(()) } fn gen_snapshot(&self, pid: u64, context: &str) -> anyhow::Result<PathBuf>; fn gen_recover(&self, pid: u64) -> anyhow::Result<Option<String>>; fn stop(&mut self) -> anyhow::Result<()> { Ok(()) } }

关键点:

  • Send + Sync约束:所有 Trait 都要求实现满足线程安全,这是为后续引入 Tokio 异步运行时预留的契约前提。
  • pid: u64:快照按进程(Agent 会话)ID 维度组织,gen_snapshot把某进程的上下文写入磁盘并返回文件路径,gen_recover依据 pid 取回上下文文本。
  • 默认方法start/stop提供了空实现默认值,实现者可按需覆写,降低接入成本。

参考实现InMemoryContextManager(src/context.rs)虽然名字带 "InMemory",实际采用文件落盘方式:以ctx_{pid}.txt为文件名写入root目录,gen_recover在文件不存在时返回Ok(None)(体现Option<String>的"可能无快照"语义)。

3.2 MemoryManager:记忆增删改查与统一响应

src/memory.rs 是六个模块中数据结构最完整的一个,直接镜像 Python 侧 base memory manager(见文件头部注释 "Memory subsystem mirroring Python base memory manager (simplified)")。

数据模型(src/memory.rs):

pub struct MemoryNote { pub id: String, pub content: String, pub keywords: Vec<String>, pub tags: Vec<String>, pub category: Option<String>, pub timestamp: u64, }

MemoryNote是记忆的最小单元,idcontent必填,keywords(关键词)、tags(标签)、category(分类)为可选元数据,timestampMemoryNote::new中自动取当前 Unix 秒。

查询与响应(src/memory.rs):

pub struct MemoryQuery { pub operation: String, pub params: HashMap<String, String> } pub struct MemoryResponse { pub success: bool, pub memory_id: Option<String>, pub content: Option<String>, pub error: Option<String> }
  • MemoryQueryoperation字符串 + 参数表来表达操作意图,保留灵活性;
  • MemoryResponse统一携带success标志、memory_idcontenterror四个字段,并提供了ok_id/ok_content/err三个构造辅助方法,让实现者不必手写结构体字面量。

Trait 契约(src/memory.rs)是一个标准的增删改查接口:

pub trait MemoryManager: Send + Sync { fn add_memory(&mut self, note: MemoryNote) -> MemoryResponse; fn remove_memory(&mut self, id: &str) -> MemoryResponse; fn update_memory(&mut self, note: MemoryNote) -> MemoryResponse; fn get_memory(&self, id: &str) -> MemoryResponse; }

参考实现InMemoryMemoryManager(src/memory.rs)用HashMap<String, MemoryNote>存数据:update_memory在 id 不存在时返回err("not found")remove_memory同样对缺失 key 报"not found"get_memory不存在时返回err。这一"操作失败即返回带 error 的响应"而非 panic 的风格,为未来对接 Mem0、Zep 等真实记忆后端(Python 侧见 aios/memory/providers)提供了稳定契约。

3.3 StorageManager:字节级键值存取

src/storage.rs 的存储契约非常简洁,直接操作字节数组:

pub trait StorageManager: Send + Sync { fn put(&self, key: &str, data: &[u8]) -> anyhow::Result<()>; fn get(&self, key: &str) -> anyhow::Result<Option<Vec<u8>>>; }

参考实现FsStorageManager(src/storage.rs)将 key 映射为root下的文件路径,put前自动create_dir_all创建父目录,get在文件不存在时返回Ok(None)。这一抽象对应 Python 侧 aios/storage 的存储子系统(含 lsfs.py 本地文件系统与 vector_db.py 向量库),目前 Rust 侧只保留了最朴素的字节存取语义。

3.4 ToolManager:工具调用的统一入口

src/tool.rs 定义了 Agent 调用外部工具的契约:

pub trait ToolManager: Send + Sync { fn invoke(&self, name: &str, input: &str) -> Result<String>; }

参考实现NoopToolManager(src/tool.rs)是纯 echo 占位:invoke("foo", "bar")返回tool:foo echo -> bar。这对应 Python 侧庞大的工具体系(aios/tool 下包含 manager、mcp_server、virtual_env 桌面虚拟环境等),Rust 侧现阶段仅抽象出"按名字调用、入参出参均为字符串"的最简形态。

3.5 Scheduler:调度器装配 Agent 四件套

调度器是 AIOS 中最能体现"操作系统"意味的模块。src/scheduler.rs 的 Trait 只定义生命周期:

pub trait Scheduler: Send + Sync { fn start(&mut self) -> anyhow::Result<()>; fn stop(&mut self) -> anyhow::Result<()>; }

NoopScheduler(src/scheduler.rs)的结构体本身揭示了 AIOS 的组件装配模型——调度器把其余四大子系统聚合起来:

pub struct NoopScheduler { pub llm: Arc<dyn LLMAdapter>, pub memory: Arc<std::sync::Mutex<dyn MemoryManager>>, pub storage: Arc<dyn StorageManager>, pub tool: Arc<dyn ToolManager>, running: bool, }

注意两个细节:

  • 四个字段全部以Arc<dyn Trait>形式持有,即通过 Trait 对象实现运行时多态,这正是"插件式替换子系统"的基石;
  • memory特别包了一层Mutex,因为MemoryManager的增删改是&mut self方法,需要内部可变性;其余三个 Trait 的方法均为&self,因此只需Arc

NoopScheduler::start/stop目前仅翻转running布尔标志,真正的任务调度逻辑(如 Python 侧的 FIFO、RR 调度,见 aios/scheduler/fifo_scheduler.py 与 aios/scheduler/rr_scheduler.py)留待路线图后续移植。

3.6 LLMAdapter:模型推理的最小抽象

src/llm.rs 定义了 LLM 适配器契约:

pub trait LLMAdapter: Send + Sync { fn infer(&self, request: LLMRequest) -> Result<LLMResponse>; } #[derive(Debug, Clone)] pub struct LLMRequest { pub prompt: String } #[derive(Debug, Clone)] pub struct LLMResponse { pub content: String }

EchoLLM(src/llm.rs)把 prompt 原样回显为echo: {prompt},用于链路自测。它对应 Python 侧功能丰富的 aios/llm_core(含 adapter、routing、local 推理等),Rust 侧现阶段仅保留"prompt 进、文本出"的最简形态。

3.7 prelude 与 lib.rs:一键导入所有核心类型

为了让使用者免于逐个use,src/prelude.rs 将所有核心 Trait 与占位实现一次性导出:

pub use crate::context::{ContextManager, InMemoryContextManager}; pub use crate::memory::{MemoryManager, InMemoryMemoryManager, MemoryNote, MemoryQuery, MemoryResponse}; pub use crate::scheduler::{Scheduler, NoopScheduler}; pub use crate::storage::{StorageManager, FsStorageManager}; pub use crate::tool::{ToolManager, NoopToolManager}; pub use crate::llm::{LLMAdapter, EchoLLM, LLMRequest, LLMResponse};

src/lib.rs 进一步在 crate 根做了一次再导出,并定义了脚手架版本常量AIOS_RS_SCAFFOLD_VERSION = "0.0.1-alpha"(src/lib.rs),且带一个基础单测version_constant_present验证该常量(src/lib.rs)——说明脚手架对"可测试性"是有明确要求的。

四、快速开始:验证脚手架与示例装配

README 给出的快速开始方式非常轻量。在仓库根目录执行:

cd aios-rs cargo test

cargo test会编译整个 crate 并运行所有测试(目前包括 lib.rs 中的版本常量测试),由于依赖面极小(仅 anyhow),首次构建也很快。若要在自己的 crate 中作为路径依赖使用(开发期联调):

[dependencies] aios-rs = { path = "../aios-rs" }

README 还提供了一个完整的示例程序,把六大子系统的占位实现全部装配起来,是理解整体组件关系的"最小可运行全景":

use aios_rs::prelude::*; fn main() -> anyhow::Result<()> { let llm = std::sync::Arc::new(EchoLLM); let memory = std::sync::Arc::new(std::sync::Mutex::new(InMemoryMemoryManager::new())); let storage = std::sync::Arc::new(FsStorageManager::new("/tmp/aios_store")); let tool = std::sync::Arc::new(NoopToolManager); let mut scheduler = NoopScheduler::new(llm, memory, storage, tool); scheduler.start()?; scheduler.stop()?; Ok(()) }

对照第 3.5 节的NoopScheduler定义,这段示例展示了完整的装配约束:

  • EchoLLM / InMemoryMemoryManager / FsStorageManager / NoopToolManager分别实现四个 Trait,因此可被包装为Arc<dyn ...>传入调度器;
  • memory必须额外加Mutex才能适配Arc<dyn MemoryManager>的字段类型;
  • FsStorageManager::new("/tmp/aios_store")指定了存储根目录(示例中为/tmp/aios_store);
  • 调度器start()stop()的生命周期调用清晰展示了 Agent 运行时的启停骨架。

五、渐进式路线图:从 Trait 到完整移植

README 的 Goals 小节给出了七步增量路线图,前文源码分析正对应其中第一步的完成态:

  1. 完善 Trait 契约(进行中):引入 streaming、结构化错误、async 支持——对应各 Trait 目前同步、anyhow::Result的形态;
  2. 提供具体异步实现:引入 Tokio + channels,替换目前的同步占位实现;
  3. 增加向量存储抽象:接入可插拔的向量库后端(对应 Python 侧FsStorageManager中已存在的 vector_db.py);
  4. 引入 pyo3 / JSON-RPC 桥:实现与 Python 的混合运行,这是 README 反复强调的 inter-operation 目标的关键一步;
  5. 移植调度策略:将 FIFO、RR 调度器从 Python 移植到 Rust 并保持测试对齐(Python 侧实现见 fifo_scheduler.py、rr_scheduler.py);
  6. 增加 feature flagsvectorpython-bridgetokio-scheduler三个可选特性开关,按需编译子系统;
  7. 性能与内存基准测试:与 Python 版本做对照评测。

从源码结构看(NoopSchedulerArc<dyn Trait>聚合四子系统、Trait 均要求Send + Sync),当前契约已为步骤 2、4、6 预留了明确接口——比如Send + Sync是 Tokio 任务在线程池间迁移的前提,Trait 对象化是 feature flag 与桥接替换的前提。

六、贡献范围与许可

README 的 Contributing 小节明确约束了协作方式:脚手架刻意保持范围收窄(intentionally keeps scope narrow),扩展新子系统前需先开 issue 或 discussion;欢迎的方向聚焦在**异步设计(async design)、错误模型(error model)、桥接策略(bridging strategy)、与 Python 的测试对齐(test parity)**四项。这与路线图步骤完全呼应。

许可证为 Apache-2.0(见 Cargo.toml 的license字段与仓库根 LICENSE)。

结语

aios-rs的价值不在于其占位实现的"功能量",而在于它用不到两百行代码把 AIOS 的子系统边界以 Rust 生态的方式(Trait + Trait 对象 + 统一错误处理 + 模块化 re-export)重新表达了一遍。如果你关心的是"AIOS 的架构抽象如何在另一种语言中落地",或正在规划把 Python 组件渐进式移植到 Rust,这个脚手架是绝佳的起点——六个 Trait 契约即是最小契约面,NoopScheduler装配示例即是最小可运行骨架。后续随着 Tokio、向量后端与 pyo3 桥的逐步落地,这条试验田将真正长成完整的 Rust 版 AIOS。

【免费下载链接】AIOSAIOS: AI Agent Operating System项目地址: https://gitcode.com/GitHub_Trending/ai/AIOS

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询