agentjido/jido

GitHub: agentjido/jido

基于 Elixir/OTP 的自主智能体框架,采用不可变架构和指令式副作用处理,支持多智能体编排与 LLM 集成。

Stars: 1352 | Forks: 73

# Jido [![Hex.pm](https://img.shields.io/hexpm/v/jido.svg)](https://hex.pm/packages/jido) [![Hex Docs](https://img.shields.io/badge/hex-docs-lightgreen.svg)](https://hexdocs.pm/jido/) [![CI](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/b6efd812bc230322.svg)](https://github.com/agentjido/jido/actions/workflows/ci.yml) [![License](https://img.shields.io/hexpm/l/jido.svg)](https://github.com/agentjido/jido/blob/main/LICENSE) [![Coverage Status](https://coveralls.io/repos/github/agentjido/jido/badge.svg?branch=main)](https://coveralls.io/github/agentjido/jido?branch=main) _名称 "Jido" (自動) 源自日语词汇,意为 "自动" 或 "自动化",其中 自 (ji) 意为 "自己",動 (dō) 意为 "运动"。_ _了解更多关于 Jido 的信息,请访问 [agentjido.xyz](https://agentjido.xyz)。_ ## 概述 使用 Jido,您的 Agent 是具有单一命令函数的不可变数据结构: ``` defmodule MyAgent do use Jido.Agent, name: "my_agent", description: "My custom agent", schema: [ count: [type: :integer, default: 0] ] end end {agent, directives} = MyAgent.cmd(agent, action) ``` 状态更改是纯粹的数据转换;副作用被描述为指令并由 OTP runtime 执行。您可以获得确定性的 Agent 逻辑、无需进程的可测试性,以及在生产环境中运行这些 Agent 的清晰路径。 ## Jido 生态系统 Jido 是 Jido 生态系统的核心包。该生态系统围绕核心 Jido Agent 行为构建,并提供多个可选包以扩展核心行为。 | Package | Description | | ------------------------------------------------------- | --------------------------------------------------------------------------------------------- | | [req_llm](https://github.com/agentjido/req_llm) | LLM API 的 HTTP 客户端 | | [jido_action](https://github.com/agentjido/jido_action) | 可组合、经验证的操作,支持 AI 工具集成 | | [jido_signal](https://github.com/agentjido/jido_signal) | 基于 CloudEvents 的消息封装及支持路由和发布/订阅消息的工具 | | [jido](https://github.com/agentjido/jido) | 核心 Agent 框架,包含状态管理、指令和 runtime | | [jido_ai](https://github.com/agentjido/jido_ai) | Agent 的 AI/LLM 集成 | 有关使用 Jido 生态系统可以构建内容的演示和示例,请参阅 [https://agentjido.xyz](https://agentjido.xyz)。 ## 为什么选择 Jido? OTP 原语非常出色。您可以使用原生 GenServer 构建 Agent 系统。但在构建*多个协作 Agent* 时,您会重新发明: | 原生 OTP | Jido 形式化 | | ----------------------------------- | --------------------------------------- | | 每个 GenServer 的临时消息形状 | 作为标准封装的 Signal | | 混合在回调中的业务逻辑 | 作为可重用命令模式的 Action | | 代码中分散的隐式效果 | 作为类型化效果描述的指令 | | 每个服务器的自定义子级跟踪 | 内置父/子层级 | | 进程退出 = 完成 | 基于状态的完成语义 | Jido 不是“更好的 GenServer”——它是在 GenServer *之上*构建的形式化 Agent 模式。 ## 关键特性 ### 不可变 Agent 架构 - 受 Elm/Redux 启发的纯函数式 Agent 设计 - `cmd/2` 作为核心操作:输入 Action,输出更新的 Agent + 指令 - 使用 NimbleOptions 或 Zoi 进行 Schema 验证的状态 ### 基于指令的效果 - Action 转换状态;指令描述外部效果 - 内置指令:Emit、Spawn、SpawnAgent、StopChild、Schedule、Stop - 基于协议的可扩展性,支持自定义指令 ### OTP Runtime 集成 - 基于 GenServer 的 AgentServer,用于生产部署 - 具有生命周期管理的父子 Agent 层级结构 - 具有可配置策略的 Signal 路由 - 用于多租户部署的实例范围监督 ### 可组合的插件 - 扩展 Agent 的可重用能力模块 - 每个插件的状态隔离,具有自动 Schema 合并 - 用于初始化和 Signal 处理的生命周期钩子 ### 执行策略 - 用于简单工作流的直接执行 - 用于状态驱动工作流的 FSM(有限状态机)策略 - 用于自定义执行模式的可扩展策略协议 ### 多 Agent 编排 - 具有可配置策略的多 Agent 工作流 - 用于复杂工作流的基于计划的编排 - 用于自定义执行模式的可扩展策略协议 ## 安装 ### 使用 Igniter(推荐) 开始使用最快的方式是使用 [Igniter](https://hex.pm/packages/igniter): ``` mix igniter.install jido ``` 这会自动: - 将 Jido 添加到您的依赖项 - 创建一个 `MyApp.Jido` 实例模块 (`use Jido, otp_app: :my_app`) - 在 `config/config.exs` 中创建配置 - 将 `MyApp.Jido` 添加到您的监督树 生成一个示例 Agent 以开始使用: ``` mix igniter.install jido --example ``` ### 手动安装 将 `jido` 添加到 `mix.exs` 的依赖项列表中: ``` def deps do [ {:jido, "~> 2.0"} ] end ``` 然后定义一个 Jido 实例模块并将其添加到您的监督树: ``` # 在 lib/my_app/jido.ex 中 defmodule MyApp.Jido do use Jido, otp_app: :my_app end ``` ``` # 在 config/config.exs 中 config :my_app, MyApp.Jido, max_tasks: 1000, agent_pools: [] ``` ``` # 在你的 application.ex 中 children = [ MyApp.Jido ] Supervisor.start_link(children, strategy: :one_for_one) ``` ## 快速开始 ### 1. 定义 Agent ``` 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} ] end ``` ### 2. 定义 Action ``` 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 end ``` ### 3. 执行命令 ``` # 创建 agent agent = MyApp.CounterAgent.new() # 执行 action - 返回更新后的 agent + 指令 {agent, directives} = MyApp.CounterAgent.cmd(agent, {MyApp.Actions.Increment, %{amount: 5}}) # 检查 state agent.state.count # => 5 ``` ### 4. 使用 AgentServer 运行 ``` # 启动 agent 服务器 {:ok, pid} = MyApp.Jido.start_agent(MyApp.CounterAgent, id: "counter-1") # 向运行中的 agent 发送 signal (同步) # Signal 类型必须在 signal_routes 中声明 {:ok, agent} = Jido.AgentServer.call(pid, Jido.Signal.new!("increment", %{amount: 10}, source: "/user")) # 通过 ID 查找 agent pid = MyApp.Jido.whereis("counter-1") # 列出所有运行中的 agent agents = MyApp.Jido.list_agents() ``` ## 核心概念 ### `cmd/2` 契约 Jido 中的基本操作: ``` {agent, directives} = MyAgent.cmd(agent, action) ``` 关键不变量: - 返回的 `agent` 始终是完整的——不需要“应用指令”步骤 - `directives` 仅描述外部效果——它们从不修改 Agent 状态 - `cmd/2` 是一个纯函数——相同的输入总是产生相同的输出 ### Action 与 指令 与 状态操作 | Action | 指令 | 状态操作 | | ------------------------------------------ | ------------------------------------- | ------------------------------- | | 转换状态,可能执行副作用 | 描述外部效果 | 描述内部状态变化 | | 由 `cmd/2` 执行,更新 `agent.state` | Agent 发出的裸结构体 | 由策略层应用 | | 可以调用 API、读取文件、查询数据库 | Runtime (AgentServer) 解释它们 | 永不离开策略 | ### 状态操作 (`Jido.Agent.StateOp`) 状态操作是由策略层在 `cmd/2` 期间处理的内部状态转换。与指令不同,它们永远不会到达 runtime。 | StateOp | Purpose | | -------------- | -------------------------------- | | `SetState` | 深度合并属性到状态 | | `ReplaceState` | 完全替换状态 wholesale | | `DeleteKeys` | 删除顶级键 | | `SetPath` | 在嵌套路径设置值 | | `DeletePath` | 删除嵌套路径的值 | ### 指令类型 | Directive | Purpose | | ------------ | ------------------------------------------------ | | `Emit` | 通过配置的适配器分发 Signal | | `Error` | 从 cmd/2 发出错误信号 | | `Spawn` | 生成一个通用 BEAM 子进程 | | `SpawnAgent` | 生成一个带有层级跟踪的子 Jido Agent | | `StopChild` | 优雅地停止被跟踪的子 Agent | | `Schedule` | 调度延迟消息 | | `Stop` | 停止 Agent 进程 | ## 文档 **从这里开始:** - [快速开始](guides/getting-started.livemd) - 在 5 分钟内构建您的第一个 Agent - [核心循环](guides/core-loop.md) - 理解思维模型 **指南:** - [构建 Agent](guides/agents.md) - Agent 定义和状态管理 - [Signal 与路由](guides/signals.md) - 基于 Signal 的通信 - [Agent 指令](guides/directives.md) - Runtime 的效果描述 - [Runtime 和 AgentServer](guides/runtime.md) - 基于进程的 Agent 执行 - [持久化与存储](guides/storage.md) - Hibernate、thaw 和 InstanceManager 生命周期 - [调度](guides/scheduling.md) - 声明式和动态 cron 调度 - [插件](guides/plugins.md) - 可组合的能力束 - [策略](guides/strategies.md) - 执行策略(Direct、FSM) **高级:** - [FSM 策略深入探讨](guides/fsm-strategy.livemd) - 状态机工作流 - [Worker Pool](guides/worker-pools.md) - 预热的 Agent 池以提高吞吐量 - [测试 Agent](guides/testing.md) - 测试模式和最佳实践 **API 参考:** [hexdocs.pm/jido](https://hexdocs.pm/jido) ## 开发 ### 前置条件 - Elixir 1.17+ - Erlang/OTP 26+ ### 运行测试 ``` mix test ``` ### 质量检查 ``` mix quality # Runs formatter, dialyzer, and credo ``` ## 贡献 我们欢迎贡献!请参阅我们的[贡献指南](CONTRIBUTING.md)了解有关以下内容的详细信息: - 设置您的开发环境 - 运行测试和质量检查 - 提交 Pull Request - 代码风格指南 ## 许可证 Copyright 2024-2025 Mike Hostetler 根据 Apache License 2.0 版本授权。详情请参阅 [LICENSE](LICENSE)。 ## 链接 - **文档**: [https://hexdocs.pm/jido](https://hexdocs.pm/jido) - **GitHub**: [https://github.com/agentjido/jido](https://github.com/agentjido/jido) - **AgentJido**: [https://agentjido.xyz](https://agentjido.xyz) - **Jido Workbench**: [https://github.com/agentjido/jido_workbench](https://github.com/agentjido/jido_workbench)
标签:Agent框架, AI开发框架, C2, DLL 劫持, Elixir, Erlang虚拟机, Jido, LLM集成, OTP, 不可变数据结构, 企业级AI, 函数式编程, 分布式系统, 动态工作流, 响应大小分析, 大语言模型, 并发编程, 状态机, 网络调试, 自主智能体, 自动化