Jido:Elixir自治代理框架的终极指南
Jido:Elixir自治代理框架的终极指南
【免费下载链接】jido🤖 Autonomous agent framework for Elixir. Built for distributed, autonomous behavior and dynamic workflows.项目地址: https://gitcode.com/GitHub_Trending/ji/jido
Jido 是一个为 Elixir 打造的自治代理框架,专为工作流和多代理系统设计。它让你能够定义代理、连接动作、信号和指令,并内置监督和容错机制,使软件能够检查上下文、选择多个步骤、与其他代理协作,并长时间可靠运行。
为什么选择 Jido?
OTP 原语非常出色,你可以使用原始的 GenServer 构建代理系统。但是当构建多个协作代理时,你会重新发明许多轮子:
| 原始 OTP | Jido 形式化 |
|---|---|
| 每个 GenServer 的特定消息形状 | 作为标准信封的信号 |
| 业务逻辑混合在回调中 | 作为可重用命令模式的动作 |
| 代码中分散的隐式效果 | 作为类型化效果描述的指令 |
| 每个服务器的自定义子跟踪 | 内置的父/子层次结构 |
| 进程退出 = 完成 | 基于状态的完成语义 |
Jido 不是“更好的 GenServer”——它是构建在 GenServer 之上的形式化代理模式。
核心特性
- 不可变代理架构:受 Elm/Redux 启发的功能代理状态模型,
cmd/2作为核心操作,带 NimbleOptions 或 Zoi 的模式验证状态 - 基于指令的效果:动作转换状态并可能执行所需工作,指令描述运行时拥有的外部效果,内置多种指令及可扩展的自定义指令协议
- OTP 运行时集成:基于 GenServer 的 AgentServer 用于生产部署,带生命周期管理的父子代理层次结构,可配置策略的信号路由
- 可组合插件:扩展代理的可重用功能模块,每个插件的状态隔离与自动模式合并,初始化和信号处理的生命周期钩子
- 执行策略:简单工作流的直接执行,状态驱动工作流的 FSM(有限状态机)策略,自定义执行模式的可扩展策略协议
- 多代理编排:带可配置策略的多代理工作流,复杂工作流的基于计划的编排,具有命名拓扑的持久代理组
快速安装 Jido
使用 Igniter(推荐)
最快的入门方式是使用 Igniter:
mix igniter.install jido这会自动:
- 将 Jido 添加到依赖项
- 创建
MyApp.Jido实例模块(use Jido, otp_app: :my_app) - 在
config/config.exs中创建配置 - 将
MyApp.Jido添加到监督树
生成示例代理开始使用:
mix igniter.install jido --example手动安装
将jido添加到mix.exs中的依赖项列表:
def deps do [ {:jido, "~> 2.0"} ] end然后定义 Jido 实例模块并将其添加到监督树:
# In lib/my_app/jido.ex defmodule MyApp.Jido do use Jido, otp_app: :my_app end# In config/config.exs config :my_app, MyApp.Jido, max_tasks: 1000, agent_pools: []# In your application.ex children = [ MyApp.Jido ] Supervisor.start_link(children, strategy: :one_for_one)快速上手 Jido
1. 定义代理
defmodule MyApp.CounterAgent do use Jido.Agent, name: "counter", description: "A simple counter agent", schema: [ count: [type: :integer, default: 0] ], signal_routes: [ {"increment", MyApp.Actions.Increment} ] end2. 定义动作
defmodule MyApp.Actions.Increment do use Jido.Action, name: "increment", description: "Increments the counter by a given amount", schema: [ amount: [type: :integer, default: 1] ] def run(params, context) do current = context.state[:count] || 0 {:ok, %{count: current + params.amount}} end end3. 执行命令
# 创建代理 agent = MyApp.CounterAgent.new() # 执行动作 - 返回更新的代理 + 指令 {agent, directives} = MyApp.CounterAgent.cmd(agent, {MyApp.Actions.Increment, %{amount: 5}}) # 检查状态 agent.state.count # => 54. 使用 AgentServer 运行
# 启动代理服务器 {:ok, pid} = MyApp.Jido.start_agent(MyApp.CounterAgent, id: "counter-1") # 向运行中的代理发送信号(同步) # 信号类型必须在 signal_routes 中声明 {:ok, agent} = Jido.AgentServer.call(pid, Jido.Signal.new!("increment", %{amount: 10}, source: "/user")) # 通过 ID 查找代理 pid = MyApp.Jido.whereis("counter-1") # 列出所有运行中的代理 agents = MyApp.Jido.list_agents()Jido 核心概念
cmd/2契约
Jido 中的基本操作:
{agent, directives} = MyAgent.cmd(agent, action)关键不变量:
- 返回的
agent始终是完整的 - 不需要“应用指令”步骤 directives仅描述运行时拥有的外部效果 - 它们从不修改代理状态- 代理决策逻辑保持显式和可测试;确定性动作产生确定性
cmd/2结果
动作 vs 指令 vs 状态操作
| 动作 | 指令 | 状态操作 |
|---|---|---|
| 转换状态,可能执行副作用 | 描述运行时拥有的效果 | 描述内部状态变化 |
由cmd/2执行,更新agent.state | 代理发出的裸结构体 | 由策略层应用 |
| 可以调用 API、读取文件、查询数据库 | 运行时(AgentServer)解释它们 | 从不离开策略 |
状态操作(Jido.Agent.StateOp)
状态操作是在cmd/2期间由策略层处理的内部状态转换。与指令不同,它们永远不会到达运行时。
| 状态操作 | 目的 |
|---|---|
SetState | 将属性深度合并到状态中 |
ReplaceState | 完全替换状态 |
DeleteKeys | 删除顶级键 |
SetPath | 在嵌套路径设置值 |
DeletePath | 删除嵌套路径的值 |
指令类型
| 指令 | 目的 |
|---|---|
Emit | 通过配置的适配器调度信号 |
Error | 从 cmd/2 发出错误信号 |
Spawn | 生成通用 BEAM 子进程 |
SpawnAgent | 生成跟踪的子 Jido 代理(默认restart: :transient) |
StopChild | 优雅地停止并移除跟踪的子代理 |
StartSensor | 启动或替换标记的传感器运行时 |
StopSensor | 停止标记的传感器运行时 |
Schedule | 安排延迟消息 |
Stop | 停止代理进程 |
Jido 生态系统
Jido 是 Jido 生态系统的核心包。生态系统围绕核心 Jido Agent 行为构建,并提供多个可选包来扩展核心行为。
| 包 | 描述 |
|---|---|
| req_llm | LLM API 的 HTTP 客户端 |
| jido_action | 具有 AI 工具集成的可组合、已验证动作 |
| jido_signal | 基于 CloudEvents 的消息信封和用于路由和发布/订阅消息的支持工具 |
| jido | 具有状态管理、指令和运行时的核心代理框架 |
| jido_ai | 代理的 AI/LLM 集成 |
深入学习 Jido
从这里开始:
- 快速入门 - 在 5 分钟内构建你的第一个代理
- 核心循环 - 理解思维模型
指南:
- 构建代理 - 代理定义和状态管理
- 信号与路由 - 基于信号的通信
- 代理指令 - 运行时的效果描述
- 运行时和 AgentServer - 基于进程的代理执行
- 选择运行时模式 - 何时使用
SpawnAgent、InstanceManager、Pod和partition - Pods - 具有命名拓扑、延迟激活、嵌套 pod 和实时添加/删除突变的持久代理组
- 多租户 - 具有分区和 Pod 优先持久工作区的共享实例租户
- 持久性和存储 - 休眠、解冻和 InstanceManager 生命周期
- 调度 - 声明式和动态 cron 调度
- 插件 - 可组合功能包
- 策略 - 执行策略(直接、FSM)
高级:
- FSM 策略深入探讨 - 状态机工作流
- 工作池 - 用于吞吐量的预热代理池
- 测试代理 - 测试模式和最佳实践
API 参考:hexdocs.pm/jido
常见问题解答
一般问题
Q: Jido 是什么,它与其他代理框架有何不同?
A: Jido 是一个为 Elixir 打造的自治代理框架,专为工作流和多代理系统设计。主要区别:
- OTP 原生架构:构建在 GenServer 之上,内置监督和容错
- 不可变代理:受 Elm/Redux 启发的功能状态模型
- AI 可选:核心包提供代理架构,不需要 AI/LLM
- 显式效果边界:动作可以拥有即时工作;指令描述运行时拥有的效果
Q: AI 是 Jido 必需的吗?
A:不!核心包 (jido) 提供代理架构和运行时而无需 AI。AI/LLM 集成可通过配套包可选添加:
jido_ai:代理的 AI/LLM 集成req_llm:LLM API 的 HTTP 客户端
当软件需要检查上下文、选择步骤、协调代理并可靠运行时使用 Jido - AI 是可选的。
功能
Q: 有哪些可用的指令?
A: 内置指令:
- Emit:向系统发出信号
- Error:从
cmd/2发出错误信号 - Spawn:生成子进程
- SpawnAgent:生成子代理
- AdoptChild:将孤立或未附加的子项附加到当前父项
- StopChild:停止子进程/代理
- StartSensor:启动或替换所有者监控的标记传感器运行时
- StopSensor:停止标记的传感器运行时
- Schedule:安排未来动作
- RunInstruction:在运行时执行指令并将结果路由回
cmd/2 - Stop:停止代理
- Cron / CronCancel:注册和取消基于 cron 的计划
外部包也可以定义自定义指令结构体。有关详细信息,请参见 代理指令。
Q: 插件如何工作?
A: 可组合插件通过以下方式扩展代理:
- 可重用功能模块
- 每个插件的状态隔离与自动模式合并
- 跨代理的轻松功能共享
有关详细信息,请参见 插件指南。
Q: 有哪些可用的执行策略?
A:
- 直接策略:立即执行
- FSM 策略:状态机工作流
请参见 策略指南 和 FSM 策略深入探讨。
帮助资源
- 文档:hexdocs.pm/jido
- 网站:jido.run
- 生态系统:jido.run/ecosystem
- Discord:jido.run/discord
- GitHub:github.com/agentjido/jido
- Jido Workbench:github.com/agentjido/jido_workbench
【免费下载链接】jido🤖 Autonomous agent framework for Elixir. Built for distributed, autonomous behavior and dynamic workflows.项目地址: https://gitcode.com/GitHub_Trending/ji/jido
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考