Skip to content

Latest commit

 

History

25 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lithe AI Core

Lithe AI Core 是一个面向 IDE 的、Capability 驱动的 Rust Agent Runtime 微内核。

它要解决的不是“再做一个聊天页面”,也不是“再封装一层大模型 API”,而是提供一套稳定、可组合、可替换的 Agent 执行底座:IDE 或其他宿主只描述这次运行需要什么能力,Runtime 负责解析能力、执行 Agent Loop、调用模型与工具、记录事件,并把结果可靠地返回给宿主。

当前版本是 0.1.0 alpha。仓库已经打通一条可运行的纵向链路,但完整插件生命周期、可执行可视化 Graph 和正式 IDE 集成仍在建设中。

这个项目到底要做什么

常见 Agent 应用会把下面这些东西写死在一个程序里:

  • Agent Loop 如何推进;
  • 使用哪个模型供应商;
  • 工具如何注册和调用;
  • 会话和事件保存在哪里;
  • 输入输出经过哪些策略;
  • UI、业务逻辑和执行逻辑如何连接。

这种写法做 Demo 很快,但一旦要更换 Provider、增加新的 Loop、接入 IDE、隔离第三方插件,或者让用户通过图形界面组合 Agent,代码就会迅速耦合。

Lithe 的方向是把稳定的执行语义留在微内核,把可变化的具体能力交给内置实现或插件:

Runtime = 稳定内核语义 + Capability 契约 + 本次运行的能力绑定
Agent   = Agent Loop + Provider + Tools + Storage + Policies + ...

Runtime 不应该偷偷决定使用哪个模型、数据库或工具。每次运行都要显式绑定所需 Capability;能力不存在或配置无效时,直接返回可诊断错误,而不是静默降级。

核心心智模型

Lithe 把一个 Agent 看成一组可替换能力的组合,而不是一个不可拆分的大对象。

Capability 负责什么 当前状态
agent.loop 决定一次运行如何迭代、何时调用模型或工具、何时结束 已实现基础有界 Loop
provider.model 调用模型并返回统一结果 已实现 OpenAI、DeepSeek 和离线 Echo
tool 向 Agent 暴露外部动作 已实现注册、解析与调用链路
storage.session-events 保存和重放有序会话事件 已实现进程内 Memory Store
policy.input / policy.output 校验、脱敏、拒绝或审核输入输出 规划中
events.sink 日志、指标、审计和实时事件分发 规划中
memory / prompt / sandbox / telemetry 提供长期记忆、提示词、隔离和可观测能力 规划中

例如,同一个 Runtime 可以组合成不同 Agent:

Coding Agent
  = bounded-agent
  + OpenAI Provider
  + filesystem / terminal Tools
  + durable Session Store
  + command approval Policy

Offline Test Agent
  = bounded-agent
  + echo-round-trip Provider
  + echo Tool
  + memory Session Store

两者共享同一套协议、生命周期边界、错误模型和事件顺序,但具体能力完全不同。

整体架构

flowchart TB
    subgraph Hosts["宿主层"]
        Studio["Agent Studio"]
        CLI["CLI / 其他客户端"]
        IDEA["future Lithe-IDEA"]
    end

    Agentd["lithe-agentd<br/>协议分发与能力组装"]

    subgraph Kernel["微内核层:lithe-runtime"]
        Registry["Capability Registry<br/>注册、发现、route 解析"]
        Executor["Session Executor<br/>绑定校验、取消、运行控制"]
        Loop["Agent Loop<br/>模型与工具迭代"]
        Events["Session Events<br/>有序记录与重放"]
    end

    subgraph Capabilities["可替换 Capability 实现"]
        Provider["Provider Adapter<br/>OpenAI / DeepSeek / Echo"]
        Tools["Tools<br/>Echo / future plugins"]
        Store["Session Store<br/>Memory / future durable stores"]
        Policies["Policies / Sandbox / Telemetry<br/>规划中"]
    end

    Protocol["lithe-protocol<br/>版本化 DTO、错误与事件契约"]

    Studio -->|"versioned requests"| Agentd
    CLI -->|"versioned requests"| Agentd
    IDEA -->|"future host bridge"| Agentd
    Agentd --> Registry
    Agentd --> Executor
    Executor --> Registry
    Executor --> Loop
    Loop --> Provider
    Loop --> Tools
    Executor --> Store
    Executor --> Events
    Policies -.->|"future capability routes"| Executor
    Protocol -.->|"定义通信与领域契约"| Agentd
    Protocol -.->|"定义稳定类型"| Kernel
Loading

上图描述的是一次运行中的调用关系。Rust crate 的编译依赖方向与调用方向并不完全相同;下图的箭头表示“左侧依赖右侧”:

flowchart LR
    Host["Studio / CLI / future IDE hosts"] --> Agentd["lithe-agentd"]
    Agentd --> Runtime["lithe-runtime"]
    Agentd --> OpenAI["lithe-provider-openai"]
    Agentd --> DeepSeek["lithe-provider-deepseek"]
    Agentd --> Protocol["lithe-protocol"]
    OpenAI --> Runtime
    OpenAI --> HTTP["lithe-provider-http"]
    OpenAI --> Protocol
    DeepSeek --> Runtime
    DeepSeek --> HTTP
    DeepSeek --> Protocol
    Runtime --> Protocol
Loading

lithe-protocol 不依赖 Runtime 或任何 Provider;应用入口负责选择具体实现,Runtime 本身不硬编码产品组合。

一次 session.run 怎么执行

  1. Host 启动 lithe-agentd,通过 initialize 完成协议版本协商。
  2. Host 使用 capability.register 注册本次进程可用的 Loop、Provider、Tool 和 Session Store 路由。
  3. Host 可以通过 capability.list 查询 Registry,Studio 的 Provider、模型和 Tool 列表也来自这里。
  4. Host 发送 session.run,显式指定每类 Capability 的 route、模型和运行参数。
  5. Runtime 从 Registry 获取不可变的路由快照,并验证绑定、模型、工具和 Loop 上限。
  6. 选中的 Agent Loop 调用 Provider;如果模型请求 Tool,Loop 执行 Tool 后把结果送回 Provider,直到完成或达到上限。
  7. Session Store 按顺序记录输入、模型调用、工具调用、输出或失败事件。
  8. Sidecar 返回最终消息和有序 SessionEvent;缺少能力、重复运行或配置错误会返回稳定错误,而不是自动换实现。

当前协议请求和结果示例位于:

代码骨架为什么这样拆

路径 当前职责 边界
src/crates/lithe-protocol 版本化 wire DTO、ID、消息、Capability 注册与绑定、Graph / Plugin 文档、稳定错误、Session Event 最稳定的公共契约,不依赖 Runtime 和 Adapter
src/crates/lithe-runtime Capability trait、分类 Registry、route 解析、有界 Agent Loop、取消、Memory Store、事件重放和确定性测试实现 只依赖 Protocol,不知道 OpenAI、DeepSeek 或 UI
src/crates/lithe-provider-http SecretRef 解析和可注入 HTTP Transport 复用网络与凭证边界,不拥有 Agent 语义
src/crates/lithe-provider-openai 将统一 Provider 能力映射到 OpenAI Responses API Provider 专属 payload 留在 Adapter 内部
src/crates/lithe-provider-deepseek 将统一 Provider 能力映射到 DeepSeek Chat Completions API 不向 Runtime 泄漏供应商类型
src/crates/lithe-agentd stdio NDJSON sidecar、请求分发、内置能力和 Adapter 组装 Composition Root;决定当前进程实际提供什么
src/studio 浏览器对话工作区、Agent 配置无限画布、Node Host Bridge UI 布局和草稿不是 Runtime Graph
scripts Studio 启动和仓库检查入口 开发辅助,不参与 Runtime 执行
.agent 产品计划、迭代记录和仓库开发约束 设计文档,不是产品运行时

这样的拆分不是为了制造 crate 数量,而是为了守住三个关键边界:

  1. 协议可以独立演进:IDE、sidecar 和插件围绕稳定 DTO 协作。
  2. Runtime 不依赖具体服务:增加 Provider 或 Storage 不需要修改内核语义。
  3. 宿主只负责组合和交互:Studio 的画布布局不会直接污染可执行 Graph。

目前已经能做什么

  • 通过版本化 NDJSON 请求执行 initializecapability.registercapability.listcapability.unregistersession.run
  • 分别注册和解析 provider.modelagent.loopstorage.session-eventstool
  • 每次运行显式绑定 Capability route,不依赖隐式默认实现。
  • 使用有界 Agent Loop 完成模型调用、Tool round trip、最大步数校验和重复运行保护。
  • 生成并重放有序 SessionEvent,使用进程内 Memory Store 保存当前会话事件。
  • 使用确定性的 echo-round-trip Provider 和 echo Tool 完成完全离线测试。
  • 通过第一方 Adapter 调用 OpenAI Responses API 和 DeepSeek Chat Completions API。
  • 只在实际执行时通过 SecretRef 解析 Provider 环境变量,不把密钥写入配置和事件。
  • 在 Studio 中进行真实对话、动态发现 Registry 能力,并查看 Runtime 事件轨迹。
  • 在 Studio 的 Agent 设置中使用无限画布平移、缩放、适配和编排 Agent Loop 配置。

现在还不能做什么

下面这些是明确的后续工作,不应从当前原型中误判为已经完成:

  • 完整插件系统:尚无插件包安装、Supervisor、健康检查、EffectScope、route lease、drain、rollback 和 hot unload。
  • 第三方隔离宿主:尚无 WASM Component 或受监管 subprocess 插件 Host。
  • 可执行可视化 Graph:Studio 已有无限画布和 graph-shaped 草稿,但节点与边还不会编译为 Runtime 执行计划。
  • Graph Compiler:尚无从 GraphDocument 到不可变 RuntimePlan 的校验、编译和执行链路。
  • 策略能力:输入 Policy、输出 Policy、审批流和 Sandbox 仍在规划中。
  • 持久化能力:当前 Session Store 只在进程内;SQLite、远程存储和跨进程恢复尚未实现。
  • 流式执行:Provider 当前是同步、非流式完成;实时事件通知和可取消的在途 HTTP 流尚未实现。
  • 正式 IDE 集成:尚未完成 Lithe-IDEA、Tauri 或 WKWebView 的生产级 Host Bridge、权限代理和打包。

最重要的边界是:Studio 里的无限画布目前是 Agent 配置界面,不是已经可以执行的 Runtime Graph 编辑器。 UI 坐标、视口和布局必须继续与可执行 Graph 语义分离。

快速开始

启动 Agent Studio

需要 Rust 1.85+ 和 Node.js。Studio 本身没有第三方前端依赖,不需要执行 npm install

./scripts/run-studio.sh

脚本会启动本地 Host Bridge,等待健康检查通过,然后打开 http://127.0.0.1:4173。按 Ctrl+C 停止。

不自动打开浏览器:

LITHE_STUDIO_NO_OPEN=1 ./scripts/run-studio.sh

修改端口:

LITHE_STUDIO_PORT=5173 ./scripts/run-studio.sh

浏览 Provider 和编辑 Agent 配置不需要 API Key。发起真实模型请求前设置对应环境变量:

export OPENAI_API_KEY="..."
export DEEPSEEK_API_KEY="..."

更多 Studio 操作和当前 UI 边界见 src/studio/README_ZH.md

单独启动 Sidecar

cargo run -p lithe-agentd --locked

lithe-agentd 从 stdin 按行读取 JSON 请求,并向 stdout 按行返回 JSON 响应。客户端需要先初始化、注册 Capability,再发送带显式 bindings 的 session.run。如果依赖已经在本机缓存,可以追加 --offline

Provider 的注册字段、凭证引用和手工调用说明见 docs/providers.md

开发验证

./scripts/check.sh

该脚本依次执行:

  • cargo fmt --all -- --check
  • cargo clippy --workspace --all-targets --all-features --locked --offline -- -D warnings
  • cargo test --workspace --locked --offline
  • npm --prefix src/studio run check

只检查 Studio:

npm --prefix src/studio run check

路线图

当前:最小纵向 Agent Runtime
  ↓
Capability 生命周期与插件 Supervisor
  ↓
GraphDocument 校验与 RuntimePlan 编译
  ↓
可调试、可取消、事件驱动的 Graph 执行
  ↓
Lithe-IDEA / Tauri / WKWebView 正式集成
  ↓
第三方 Provider、Tool、Storage 与 Policy 插件生态

路线图的原则不是把所有功能都塞进 Runtime,而是逐步稳定微内核必须拥有的语义,让其余能力可以安全地注册、替换、组合和卸载。

文档导航

About

一个参考 DSH 实现的基于 Rust 的 Agent 内核,目标是接入我们写的 IDE 中去,实现新手很容易进行配置和定制化的目的,而且高手还可以更加定制化的修改任何内容

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages