yingqi-z20/Agent-libOS

GitHub: yingqi-z20/Agent-libOS

一个以进程为模型的实验性 libOS 运行时,为自演化 LLM Agent 提供进程生命周期管理、调度、能力控制和资源审计的基础设施。

Stars: 16 | Forks: 2

# Agent libOS Agent libOS 是一个实验性的、以 Agent 为中心的 libOS 运行时,使用 Python 编写。 它支持以下论文主题: 该运行时将 Agent 建模为一个长期运行、可调度、可中断且受能力控制的 `AgentProcess`,而不是将其视为单一的聊天请求或工作流线程。Agent 可以激活 Skill、注册 Deno/TypeScript JIT 工具,注册、执行或从 checkpoint 提交新 image,fork 子进程,进行 checkpoint/fork 状态,并使用已注册的远程资源,但这些自演化机制本身并不授予资源权限。 当前的贡献在于运行时的权限边界: ``` process identity + capability + primitive + audit ``` 面向 LLM 的工具、Skill、JIT 工具、image 定义、子进程、checkpoint 以及远程端点可见性都是人体工程学辅助功能。它们并不是安全边界。 受保护的影响仅发生在 libOS 原语内部,在这些原语中,进程身份、能力、人类批准、策略、提供者隔离、事件和审计记录都得到了严格执行。 本项目仍在积极开发中。[agent_libos_design_doc.md](agent_libos_design_doc.md) 是一个历史设计存档,可能描述了计划中或已被取代的接口。 ## 当前系统 目前的实现包括: - Agent 进程生命周期:`spawn`、`fork`、`exec`、`wait`、`signal`、`pause`、`resume` 和 `exit`。 - 分层的进程资源预算,用于工具调用、LLM token 使用、子进程 wall/CPU/RSS 使用、文件系统字节数、JSON-RPC 字节数以及 Deno 系统调用。 - 通过 `Runtime.run_until_idle()` 和异步主机包装器 `Runtime.arun_until_idle()` 实现的基于线程的进程调度,从而确保被阻塞的时间片不会独占调度器进度。 - 用于文件系统和 shell 操作的进程本地工作目录。 - 用于 IPC 的持久进程消息队列,包括中断传递。 - 绑定到对象的后台工具任务,它们可以通过相同的持久消息队列通知进程,包括可选的 owner-change watches,而无需将其运行器的子进程暴露给 LLM 调度器。 - 用于普通问题和逐次使用批准的人类队列集成。 - 默认使用进程私有的 Object Memory 命名空间,并可通过能力机制使用显式的共享命名空间。 - 结构化的 Capability 权限,用于文件系统、shell、时钟、人类、进程、image、checkpoint、skill 和 Object Memory 原语,包括类型化的资源匹配、deny/ask/allow 效果、一次性授权、衰减、撤销和审计谱系。 - 用于可注入文件系统、时钟、shell 和人类 I/O 后端的 Resource Provider Substrate,以及用于预注册远程端点的基于 HTTP 的 JSON-RPC 客户端提供者。 - 在 `Runtime.open()` 返回之前从清单声明的 Python 入口点加载的可信启动 Runtime Modules。模块可以注册工具、image、系统调用、provider hooks 和启动钩子,但不授予进程资源权限。 - 一个直接的工作流入口点,供用户通过 ToolBroker 运行一个对 image 可见的工具,而无需调用 LLM 调度器。 - 为进程/对象元数据、能力、消息、人类请求、LLM 调用、事件、审计记录、工具、Skill/JIT 元数据和限定范围的 checkpoint 提供 SQLite 持久化。 - Deno/TypeScript JIT 工具,只能通过 `libos.syscall` 访问 libOS。 - 声明式 Skill,可以在不授予资源权限的情况下添加提示指令、可见工具和 JIT 候选项。 - 仅限客户端的基于 HTTP 的 JSON-RPC 2.0,包含已注册的端点、方法能力、提供者分类的外部效应、审计和 checkpoint。 - 一个确定性的运行时安全基准测试套件,包含 20 多个已提交的任务,包括自演化子集、基线、副作用预言机和指标收集。 ## 文档 从这里开始,然后根据需要阅读更深层的参考资料: - [docs/architecture.md](docs/architecture.md):运行时层、provider substrate 以及工具/原语边界。 - [docs/runtime_model.md](docs/runtime_model.md):进程生命周期、调度器、cwd、人类队列、IPC、fork/spawn/exec 和等待。 - [docs/capabilities.md](docs/capabilities.md):资源命名、权限、一次性授权、人类批准、shell 策略和文件系统隔离。 - [docs/object_memory.md](docs/object_memory.md):命名空间、对象权限、文件/对象桥接、上下文物化和 payload 持久化。 - [docs/tools_and_jit.md](docs/tools_and_jit.md):内置工具、ToolBroker、Deno/TypeScript JIT 工具、syscall 协议和沙箱规则。 - [docs/modules.md](docs/modules.md):可信启动 Runtime Module 清单、信任模型、注册接口、CLI 和 checkpoint 行为。 - [docs/jsonrpc.md](docs/jsonrpc.md):仅限客户端的 JSON-RPC 端点注册、capability 资源、工具、syscall 和 checkpoint 行为。 - [docs/skills.md](docs/skills.md):标准 `SKILL.md` 包、工作区/全局源、信任、activate/unload 语义、捆绑的 JIT 工具和 `swe-agent`。 - [docs/checkpoints.md](docs/checkpoints.md):限定范围的快照、恢复、fork、重放诊断、仅追加历史记录和外部效应。 - [docs/cli.md](docs/cli.md):稳定的 CLI 命令参考和示例。 - [docs/gui.md](docs/gui.md):Electron 桌面控制台、本地 GUI 服务器、HTTP/SSE API 和开发命令。 - [docs/benchmark.md](docs/benchmark.md):M1 运行时安全基准测试任务、运行器、预言机、输出和指标。 - [docs/mini_swe_agent_image.md](docs/mini_swe_agent_image.md):仅限包的 `mini-swe-agent` image 行为和已知的接口差异。 - [docs/development.md](docs/development.md):设置、测试、真实 LLM 冒烟测试、配置默认值和贡献规则。 - [docs/invariants.md](docs/invariants.md):当前不变式到测试的映射。 - [docs/artifact_anonymity.md](docs/artifact_anonymity.md):匿名 artifact 卫生检查清单。 - [docs/paper_thesis.md](docs/paper_thesis.md):当前的论文主题和非目标。 - [benchmarks/runtime_safety/schema.md](benchmarks/runtime_safety/schema.md):基准测试任务 schema v0。 ## 快速开始 安装依赖项: ``` uv sync --frozen --all-groups ``` 运行测试: ``` uv run python scripts/test_matrix.py --lane unit uv run python scripts/test_matrix.py --lane security uv run python scripts/test_matrix.py --lane runtime uv run python scripts/check_test_invariants.py ``` `runtime` 和 `all` 通道默认使用受限的 pytest-xdist 并行度,以控制 CI 的 wall-clock 时间。传入 `--workers 1` 进行串行故障诊断,或传入 `--workers N` / `--workers auto` 覆盖任何 Python 通道的工作进程数。GUI 通道会构建共享的前端 artifact,应单独运行。Pytest 会在测试会话结束时删除在被忽略的 `agent_outputs/` 下创建的文件;在调试生成的文件时请使用 `--keep-agent-outputs`。 运行确定性的本地演示: ``` uv run agent-libos demo ``` 在开发模式下运行 Electron GUI: ``` npm --prefix gui install npm --prefix gui run electron:dev ``` GUI 会启动一个本地 `agent-libos-gui-server`,订阅运行时事件,并提供一个以进程为中心的控制台,用于处理并发消息、中断、人类批准、调度器控制、image 选择/注册/提交、审计检查和 LLM 调用可见性。 该演示不会调用真实模型。它会执行进程 spawn/fork、Object Memory、在 Deno 可用时进行 Deno/TypeScript JIT 验证、checkpoint、授权前拒绝能力、人类批准、文件系统写入、最终报告对象创建以及审计跟踪生成。 运行一个小型的确定性基准冒烟测试: ``` uv run python experiments/run_benchmark.py --suite benchmarks/runtime_safety --runner agent_libos_full --limit 3 --output .benchmark_runs/m1-smoke uv run python experiments/collect_metrics.py .benchmark_runs/m1-smoke ``` 该基准测试默认使用模拟/计划操作,不消耗模型 token。真实模型基准冒烟测试是可选的,必须通过 `--llm real --limit 1` 或单个 `--task` 来限定范围。 ## 持久化运行时 使用 `--db` 将运行时状态保存在 SQLite 中: ``` uv run agent-libos --db .agent_libos.sqlite init uv run agent-libos --db .agent_libos.sqlite spawn --image coding-agent:v0 --goal "Summarize README.md" uv run agent-libos --db .agent_libos.sqlite run --max-quanta 10 uv run agent-libos --db .agent_libos.sqlite processes uv run agent-libos --db .agent_libos.sqlite resources uv run agent-libos --db .agent_libos.sqlite audit uv run agent-libos --db .agent_libos.sqlite workflow run get_working_directory ``` 省略 `--max-quanta` 会持续运行直到运行时空闲;仅当您需要有界限的运行时才提供它。 `workflow run ` 会从默认 image 派生出一个新进程,调用一个可见工具,持久化结果对象,并退出该进程。传入 `--image ` 以使用另一个 image 的工具表。它不会绕过原语能力检查、资源预算、人类批准或审计。 每次 LLM 动作选择调用都会作为一行 `llm_calls` 持久化,包含提示消息、可见工具 schema、模型输出、工具调用、可用时的 token 使用量、暴露时的推理元数据、原始提供者响应 JSON 和错误。 ``` uv run agent-libos --db .agent_libos.sqlite llm-calls --pid ``` ## 真实 LLM 配置 为真实模型执行创建一个本地 `.env` 文件: ``` OPENAI_BASE_URL=https://example-openai-compatible-endpoint/v1 OPENAI_LANGUAGE_MODEL=your-model OPENAI_API_KEY=... ``` 客户端使用 OpenAI Python SDK。默认情况下,它对 OpenAI 托管的模型使用 Responses API,对于自定义的 OpenAI 兼容 `base_url` 提供者,则回退到 Chat Completions。设置 `OPENAI_API_MODE=responses` 或 `OPENAI_API_MODE=chat` 可强制指定一种模式。 可选的配置项包括 `OPENAI_TIMEOUT`、`OPENAI_MAX_RETRIES`、`OPENAI_STORE`、`OPENAI_REASONING_EFFORT`、`OPENAI_VERBOSITY` 以及特定于提供者的 `OPENAI_ENABLE_THINKING`。 ## 常见 CLI 示例 发送普通和中断消息: ``` uv run agent-libos --db .agent_libos.sqlite message "Please inspect the latest result" uv run agent-libos --db .agent_libos.sqlite interrupt "Stop current work and read this first" ``` 运行交互式 Codex CLI 风格循环: ``` uv run agent-libos --db .agent_libos.sqlite run --interactive --pid --max-quanta 20 ``` 手动控制进程 cwd 和生命周期: ``` uv run agent-libos --db .agent_libos.sqlite cd src uv run agent-libos --db .agent_libos.sqlite exec images/review-agent "Review README.md" --pid --run uv run agent-libos --db .agent_libos.sqlite exit --payload '{"done":true}' ``` 将 checkpoint 提交到新的 checkpoint 派生 image 中: ``` uv run agent-libos --db .agent_libos.sqlite images commit stateful-agent:v0 --name stateful-agent uv run agent-libos --db .agent_libos.sqlite spawn --image stateful-agent:v0 --goal "Reuse the baked state" ``` 注册并激活 SWE-Agent 风格的 Skill: ``` uv run agent-libos --db .agent_libos.sqlite skills validate skills/swe-agent uv run agent-libos --db .agent_libos.sqlite skills register skills/swe-agent uv run agent-libos --db .agent_libos.sqlite skills activate swe-agent ``` 注册并调用预配置的 JSON-RPC 端点: ``` uv run agent-libos --db .agent_libos.sqlite jsonrpc register endpoint.yaml uv run agent-libos --db .agent_libos.sqlite capabilities grant jsonrpc:demo-weather:forecast --rights read uv run agent-libos --db .agent_libos.sqlite jsonrpc call demo-weather forecast --params-json '{"city":"Beijing"}' ``` 检查或更改运行时权限: ``` uv run agent-libos --db .agent_libos.sqlite capabilities list --subject uv run agent-libos --db .agent_libos.sqlite capabilities explain filesystem:workspace:README.md read uv run agent-libos --db .agent_libos.sqlite capabilities grant filesystem:workspace:README.md --rights read ``` 针对另一个工作区启动编码 Agent: ``` uv run python scripts/run_coding_agent.py --workspace /path/to/repo --goal "Implement the requested change" ``` 启动器在挂载目标工作区之前,会从此 Agent libOS 检出中加载 `.env`。它不会自动读取目标工作区的 `.env`;当运行需要不同的凭证文件时,请传入 `--env-file /path/to/env`。 在 Windows PowerShell 上: ``` uv run python scripts\run_coding_agent.py --workspace ..\some-repo --goal "Summarize the current project" ``` 有关完整的命令参考,请参见 [docs/cli.md](docs/cli.md)。 ## 核心不变式 - 工具可见性不是资源权限。 - Capability 记录是类型化的权限声明,具有显式的 allow/deny/ask 效果、颁发者谱系、委派深度、状态、过期时间和可选的使用计数。 - Skill 和 JIT 工具不授予文件系统、shell、人类、对象、进程、image、checkpoint 或 JSON-RPC 远程权限。 - JIT syscall 绕过了面向 LLM 的工具表,但不会绕过原语能力检查、权限策略、人类批准或审计。 - 人类批准是原语/syscall 的一部分。调用者看到的是最终成功或最终失败,而不是挂起/重试协议。 - `process.exit` 和 `process.exec` 是来自 TypeScript 的普通 syscall。运行时会在 JIT 工具返回其正常工具结果后应用生命周期更改。 - Checkpoint 恢复仅涵盖可重构的进程子树状态。它不会删除仅追加的审计/事件/LLM 调用,也不会回滚文件系统、shell、image、网络或提供者端的影响。 - Checkpoint 派生的 image 捕获的是内部可重构的运行时状态,而不是外部提供者状态。它们所需的能力是声明性的,不会在 spawn 或 exec 时自动授予。 - 提供者将外部效应分类为 `irreversible`、`rollbackable` 或 `no_rollback_required`;checkpoint 恢复时报告这些类别的 `restore_external_policy="report_only"`。 - Resource Provider Substrate 后端执行主机效应,但原语拥有能力检查、策略决策、事件和审计。 有关测试覆盖率,请参见 [docs/invariants.md](docs/invariants.md)。 ## 开发 运行标准的本地检查: ``` uv sync --frozen --all-groups uv run python -m compileall agent_libos tests scripts experiments benchmarks uv run python scripts/test_matrix.py --lane all --workers 4 uv run python scripts/check_test_invariants.py uv run python scripts/test_matrix.py --lane gui git diff --check ``` 使用 `uv run python scripts/clean_agent_outputs.py` 来试运行清理已累积的本地输出,并添加 `--yes` 将其删除。 Deno 对于 Python 单元测试套件是可选的。如果您想验证并运行来自另一个二进制文件的真实 Deno/TypeScript JIT 工具,请安装 `deno` 或传入一个使用 `dataclasses.replace(DEFAULT_CONFIG, tools=replace(...))` 构建运行时配置。 运行时默认值位于 `agent_libos.config.DEFAULT_CONFIG` 中,包括调度器时间片、worker、排空和关闭限制;进程预算;image ID;工作区命名空间;工具限制;文件系统/Object Memory 大小限制;Deno 沙箱限制;JSR 导入允许列表;shell 策略列表;启动器预设;Skill 默认值;以及 checkpoint 默认值`AgentLibOSConfig` 在构造时进行验证,因此无效或反转的边界会在 Runtime 启动之前失败。 使用 `uv add ` 添加运行时依赖,使用 `uv add --dev ` 添加开发依赖。在依赖项更改后提交 `pyproject.toml` 和 `uv.lock`。
标签:AI智能体, Python, 安全边界, 库操作系统, 无后门, 逆向工具