agentjido/jido

🤖 Autonomous agent framework for Elixir. Built for distributed, autonomous behavior and dynamic workflows.

Jido – Elixir 的自主代理框架

它是什么 – Jido 是一个让你能够将自主代理构建为普通 Elixir/OTP 组件的库。代理是一个不可变的数据结构,实现了一个单一的 cmd/2 函数:你输入一个动作,它会返回一个新的代理状态以及一系列描述运行时应执行副作用的指令(例如,发出信号、生成子进程、调度未来任务)。核心包提供了代理模型、基于 GenServer 的 AgentServer 运行时,以及一组内置指令;AI/LLM 集成通过配套包可选。


核心概念

概念 角色
Agent 具有模式验证状态的不可变结构;定义 cmd/2。
Action 接收验证参数和当前上下文的纯函数或副作用函数,返回状态更新(以及可选的指令)。
Signal 用于将外部事件路由到代理的 CloudEvents 风格信封。
Directive 运行时拥有的效果的类型化描述(发出、生成、调度、停止等)。
Strategy 决定 cmd/2 如何运行的执行策略(Direct、FSM 或自定义)。
Plugin 可重用的功能模块,可以为代理添加状态、动作和指令。

为什么使用 Jido?

  • OTP 原生 – 基于 GenServer 和监督树构建,因此您可以免费获得容错能力和热代码升级。
  • 不可变、Elm 风格的状态 – 使推理和测试变得简单直接。
  • 明确的效果边界 – 动作改变状态;指令描述副作用,保持业务逻辑纯净。
  • 多代理编排 – 分层的父/子代理、信号路由以及用于分组代理的持久化 pods。
  • AI 可选 – 核心功能无需任何 LLM;仅在需要时添加 jido_ai 或 req_llm。

核心功能(如 README 中所列)

  • 不可变代理架构,通过 NimbleOptions/Zoi 进行模式验证。
  • 基于指令的效果 (Emit, Spawn, SpawnAgent, StopChild, StartSensor, Schedule, Stop, …) 以及自定义指令的协议。
  • OTP 运行时集成 – AgentServer 处理监督、父子层次结构和信号路由。
  • 可组合插件,将其自身的模式合并到代理中并提供生命周期钩子。
  • 多种执行策略 – 直接执行、有限状态机 (FSM) 工作流和可扩展的自定义策略。
  • 多代理编排 – 命名拓扑、嵌套 pods、分区安全租户和持久化组。
  • 内置调度与 cron 支持。
  • 广泛的文档(快速入门、指南、API 参考)和 Discord 社区。

典型使用案例

  • 工作流引擎,其中每个步骤都是一个动作,整个过程建模为一个代理。
  • 协调的微服务,需要可靠的状态编排(例如,订单处理、IoT 设备管理)。
  • LLM 增强机器人 – 添加 jido_ai 让代理调用 LLM 进行推理,同时保持核心循环纯净。
  • 多租户 SaaS 后端 – 使用 pods 和分区来隔离租户工作负载,同时共享同一个 BEAM 节点。
  • 传感器/边缘设备编排 – 通过 StartSensor/StopSensor 指令启动/停止传感器运行时。

安装与快速入门

# Add to mix.exs
{:jido, "~> 2.0"}

然后创建一个 Jido 实例模块并将其放入您的监督树中:

defmodule MyApp.Jido do
  use Jido, otp_app: :my_app
end

# application.ex
children = [MyApp.Jido]
Supervisor.start_link(children, strategy: :one_for_one)

定义一个代理和一个动作:

defmodule MyApp.CounterAgent do
  use Jido.Agent,
    name: "counter",
    schema: [count: [type: :integer, default: 0]],
    signal_routes: [{"increment", MyApp.Actions.Increment}]
end

defmodule MyApp.Actions.Increment do
  use Jido.Action,
    name: "increment",
    schema: [amount: [type: :integer, default: 1]]

  def run(params, ctx) do
    current = ctx.state[:count] || 0
    {:ok, %{count: current + params.amount}}
  end
end

运行它:

agent = MyApp.CounterAgent.new()
{agent, dirs} = MyApp.CounterAgent.cmd(agent, {MyApp.Actions.Increment, %{amount: 5}})
# agent.state.count => 5

或者在运行时下启动它:

{:ok, pid} = MyApp.Jido.start_agent(MyApp.CounterAgent, id: "c1")
Jido.AgentServer.call(pid, Jido.Signal.new!("increment", %{amount: 10}, source: "/user"))

生态系统包

包 增加的功能
req_llm 用于 LLM API 的轻量级 HTTP 客户端
jido_action 用于可组合动作、验证和 AI 工具集成的辅助宏
jido_signal CloudEvents 信封 + 用于发布/订阅路由的工具
jido (core) 代理框架、指令、运行时
jido_ai 用于代理的可选 LLM/AI 集成

成熟度与社区

  • 版本:2.x (在 Hex.pm 上稳定)。
  • CI:GitHub Actions 徽章显示持续集成。
  • 文档:hexdocs.pm 上的完整 API 参考和仓库中的广泛指南。
  • 支持:Discord 社区、带有演示的网站以及用于可视化实验的 workbench 仓库。
  • 授权:Apache-2.0 (宽松,商业友好)。

总结

Jido 为 Elixir 开发人员提供了一种正式的、OTP 原生的方式来编写自主代理。状态是不可变的,副作用由指令描述,运行时处理监督、信号路由和多代理编排。AI 是一个可选的附加组件,使 Jido 既适用于纯工作流引擎,也适用于 LLM 增强机器人。

相关

  • 项目
  • 项目
  • 项目
  • 项目
  • 项目