/ README.md
README.md
  1  # Erlang Agent Framework
  2  
  3  基于 Erlang/OTP 的高性能 AI Agent 应用框架。
  4  
  5  ## 特性
  6  
  7  - **🤖 Simple Agent**: 基于 Graph 引擎的 ReAct Agent
  8    - 支持自定义工具和系统提示词
  9    - 内置 Scratchpad 执行历史
 10    - 支持 Checkpoint 持久化
 11    - 完整的回调系统
 12  
 13  - **🔄 协调器模式**: 统一的多 Agent 协调
 14    - **Multi 模式**: 顺序协调(研究员 → 写作者 → 审核员)
 15    - **Supervisor 模式**: 并行协调(多个专家同时工作)
 16  
 17  - **🧠 Deep Agent**: 递归规划 Agent
 18    - 支持任务规划(Planning)
 19    - 支持自我反思(Reflection)
 20    - 支持子任务分发
 21  
 22  - **📦 Output Parser**: 结构化输出
 23    - JSON Schema 解析
 24    - 自动重试机制
 25  
 26  ## 快速开始
 27  
 28  ### 1. 启动 Shell
 29  
 30  ```bash
 31  export ZHIPU_API_KEY=your_key_here
 32  rebar3 shell
 33  ```
 34  
 35  ### 2. Simple Agent
 36  
 37  ```erlang
 38  %% 创建 Agent
 39  {ok, Agent} = beamai_agent:start_link(<<"my_agent">>, #{
 40      system_prompt => <<"你是一个有帮助的助手。"/utf8>>,
 41      tools => [
 42          #{
 43              name => <<"search">>,
 44              description => <<"搜索信息"/utf8>>,
 45              input_schema => #{
 46                  type => object,
 47                  properties => #{
 48                      <<"query">> => #{
 49                          type => string,
 50                          description => <<"搜索关键词"/utf8>>
 51                      }
 52                  },
 53                  required => [<<"query">>]
 54              },
 55              handler => fun(#{<<"query">> := Query}) ->
 56                  %% 你的搜索逻辑
 57                  {ok, <<"搜索结果: ", Query/binary>>}
 58              end
 59          }
 60      ],
 61      llm => #{
 62          provider => anthropic,
 63          model => <<"glm-4.7">>,
 64          api_key => list_to_binary(os:getenv("ZHIPU_API_KEY")),
 65          base_url => <<"https://open.bigmodel.cn/api/anthropic">>
 66      }
 67  }).
 68  
 69  %% 运行 Agent
 70  {ok, Result} = beamai_agent:run(Agent, <<"搜索 Erlang 教程"/utf8>>).
 71  
 72  %% 查看结果
 73  Response = maps:get(final_response, Result).
 74  ```
 75  
 76  ### 3. Multi 模式协调器(顺序协调)
 77  
 78  ```erlang
 79  %% 创建研究团队(研究员 → 写作者 → 审核员)
 80  {ok, Team} = beamai_agent:start_multi(<<"content_team">>, #{
 81      agents => [
 82          #{
 83              name => <<"researcher">>,
 84              role => <<"研究员"/utf8>>,
 85              system_prompt => <<"你是研究员,负责收集资料。"/utf8>>
 86          },
 87          #{
 88              name => <<"writer">>,
 89              role => <<"写作者"/utf8>>,
 90              system_prompt => <<"你是写作者,负责撰写文章。"/utf8>>
 91          },
 92          #{
 93              name => <<"reviewer">>,
 94              role => <<"审核员"/utf8>>,
 95              system_prompt => <<"你是审核员,负责质量检查。"/utf8>>
 96          }
 97      ],
 98      llm => LLMConfig
 99  }).
100  
101  %% 运行任务
102  {ok, Result} = beamai_agent:run(Team,
103      <<"研究并撰写一篇关于 Erlang 并发模型的 100 字介绍。"/utf8>>).
104  ```
105  
106  ### 4. Supervisor 模式协调器(并行协调)
107  
108  ```erlang
109  %% 创建开发团队(前端 + 后端并行工作)
110  {ok, Team} = beamai_agent:start_supervisor(<<"dev_team">>, #{
111      agents => [
112          #{
113              name => <<"frontend">>,
114              role => <<"前端专家"/utf8>>,
115              system_prompt => <<"你是前端开发专家。"/utf8>>
116          },
117          #{
118              name => <<"backend">>,
119              role => <<"后端专家"/utf8>>,
120              system_prompt => <<"你是后端开发专家。"/utf8>>
121          }
122      ],
123      llm => LLMConfig
124  }).
125  
126  %% 运行任务
127  {ok, Result} = beamai_agent:run(Team,
128      <<"从不同角度介绍 RESTful API 的设计。"/utf8>>).
129  ```
130  
131  ### 5. Deep Agent(规划 + 反思)
132  
133  ```erlang
134  %% 创建带规划的深度 Agent
135  {ok, Agent} = beamai_deepagent:start_link(<<"deep_agent">>, #{
136      max_depth => 3,
137      planning_enabled => true,
138      reflection_enabled => true,
139      system_prompt => <<"你是一个研究专家。"/utf8>>,
140      tools => [...],
141      llm => LLMConfig
142  }).
143  
144  %% 运行复杂任务
145  {ok, Result} = beamai_deepagent:run(Agent,
146      <<"分析这个代码库的架构并给出优化建议。"/utf8>>).
147  
148  %% 查看执行计划
149  {ok, Plan} = beamai_deepagent:get_plan(Agent).
150  
151  %% 查看执行轨迹
152  {ok, Trace} = beamai_deepagent:get_execution_trace(Agent).
153  ```
154  
155  ## 架构
156  
157  ### 应用结构
158  
159  ```
160  apps/
161  ├── beamai_core/      # 核心功能 + Persistence
162  │   ├── Behaviours   # beamai_behaviour, agent_persistence_behaviour
163  │   ├── HTTP         # beamai_http (Hackney 客户端)
164  │   ├── Graph        # Graph 执行引擎
165  │   ├── Pregel       # Pregel 分布式计算
166  │   └── Persistence      # agent_storage_ets, agent_storage_sup
167168  ├── beamai_llm/       # LLM 客户端
169  │   └── Providers    # OpenAI, Anthropic, Zhipu, Ollama
170171  ├── beamai_rag/       # RAG 功能
172  │   ├── Embeddings   # 向量嵌入
173  │   └── Vector Store # 向量存储
174175  ├── beamai_memory/    # 内存和上下文存储
176  │   ├── Context      # 上下文管理
177  │   └── Store        # ETS/SQLite 存储后端
178179  ├── beamai_a2a/       # A2A 协议实现
180  │   ├── Server       # A2A 服务端
181  │   └── Client       # A2A 客户端
182183  ├── beamai_mcp/       # MCP 协议实现
184  │   ├── Server       # MCP 服务端
185  │   └── Client       # MCP 客户端
186187  ├── beamai_agent/    # Simple Agent + 协调器
188  │   ├── Graph Engine # 基于 Graph 的执行
189  │   ├── Scratchpad   # 执行历史
190  │   ├── Checkpoint   # 状态持久化
191  │   ├── Callbacks    # 回调系统
192  │   └── Coordinator  # Multi/Supervisor 协调器
193194  └── beamai_deepagent/      # Deep Agent
195      ├── Planning     # 任务规划
196      ├── Reflection   # 自我反思
197      └── Router      # 智能路由
198  ```
199  
200  ### 依赖关系
201  
202  ```
203  ┌─────────────────────────────────┐
204  │   Agent 实现                     │
205  │  (beamai_agent, beamai_deepagent)     │
206  └────────────┬────────────────────┘
207208  ┌────────────┴────────────────────┐
209  │   服务层                         │
210  │  (beamai_llm, beamai_rag,         │
211  │   beamai_a2a, beamai_mcp)         │
212  └────────────┬────────────────────┘
213214  ┌────────────┴────────────────────┐
215  │   核心层                         │
216  │  (beamai_core, beamai_memory)     │
217  └─────────────────────────────────┘
218  ```
219  
220  详见 [DEPENDENCIES.md](DEPENDENCIES.md)
221  
222  ## 核心概念
223  
224  ### 1. Graph 执行引擎
225  
226  beamai_agent 使用 Graph 引擎执行 Agent:
227  
228  ```erlang
229  %% Graph 定义
230  Graph = #{
231      nodes => #{
232          llm => {beamai_llm_node, #{}},
233          tools => {beamai_tools_node, #{}}
234      },
235      edges => [
236          {llm, tools, {condition, fun should_use_tools/1}}
237      ]
238  }
239  
240  %% 执行 Graph
241  {ok, Result} = graph_runner:run(Graph, Input).
242  ```
243  
244  ### 2. Scratchpad(执行历史)
245  
246  Scratchpad 记录每一步的执行过程:
247  
248  ```erlang
249  %% 获取 Scratchpad
250  {ok, Steps} = beamai_agent:get_scratchpad(Agent).
251  
252  %% 每一步包含:
253  %% - step_id: 步骤 ID
254  %% - type: 步骤类型 (llm_call, tool_use, tool_result)
255  %% - content: 内容
256  %% - timestamp: 时间戳
257  ```
258  
259  ### 3. Checkpoint(状态持久化)
260  
261  保存和恢复 Agent 状态:
262  
263  ```erlang
264  %% 保存检查点
265  {ok, CheckpointId} = beamai_agent:save_checkpoint(Agent, #{
266      metadata => #{tag => <<"v1">>}
267  }).
268  
269  %% 列出所有检查点
270  {ok, Checkpoints} = beamai_agent:list_checkpoints(Agent).
271  
272  %% 从检查点恢复
273  ok = beamai_agent:restore_from_checkpoint(Agent, CheckpointId).
274  ```
275  
276  ### 4. Callbacks(回调系统)
277  
278  监听 Agent 执行事件:
279  
280  ```erlang
281  {ok, Agent} = beamai_agent:start_link(<<"my_agent">>, #{
282      callbacks => #{
283          on_llm_start => fun(Prompts, Meta) ->
284              io:format("LLM 调用开始...~n")
285          end,
286          on_llm_end => fun(Response, Meta) ->
287              io:format("LLM 响应收到~n")
288          end,
289          on_tool_use => fun(ToolName, Args, Meta) ->
290              io:format("使用工具: ~ts~n", [ToolName])
291          end
292      }
293  }).
294  ```
295  
296  ## 配置
297  
298  ### LLM 配置
299  
300  ```erlang
301  %% 方式 1: GLM-4.7 + Anthropic Provider
302  LLMConfig = #{
303      provider => anthropic,
304      model => <<"glm-4.7">>,
305      api_key => ApiKey,
306      base_url => <<"https://open.bigmodel.cn/api/anthropic">>,
307      timeout => 60000
308  }.
309  
310  %% 方式 2: GLM-4.6 + Zhipu Provider
311  LLMConfig = #{
312      provider => zhipu,
313      model => <<"glm-4.6">>,
314      api_key => ApiKey,
315      timeout => 60000
316  }.
317  ```
318  
319  ### Agent 配置选项
320  
321  ```erlang
322  Opts = #{
323      %% 基础配置
324      id => <<"agent_id">>,
325      system_prompt => Prompt,
326      tools => [Tool1, Tool2],
327  
328      %% LLM 配置
329      llm => LLMConfig,
330  
331      %% 执行配置
332      max_iterations => 10,       %% 最大迭代次数
333      timeout => 300000,          %% 超时时间
334  
335      %% Checkpoint 配置
336      enable_storage => true,     %% 启用存储
337      auto_save => true,          %% 自动保存检查点
338  
339      %% 回调配置
340      callbacks => #{
341          on_llm_start => fun(...), ...
342      }
343  }.
344  ```
345  
346  ## 高级功能
347  
348  ### 自定义工具
349  
350  ```erlang
351  #{name => <<"my_tool">>,
352    description => <<"工具描述"/utf8>>,
353    input_schema => #{
354        type => object,
355        properties => #{
356            <<"param1">> => #{type => string},
357            <<"param2">> => #{type => integer}
358        },
359        required => [<<"param1">>]
360    },
361    handler => fun(Args, Context) ->
362        %% 工具逻辑
363        {ok, Result}
364    end}
365  ```
366  
367  ### Output Parser
368  
369  ```erlang
370  %% 定义输出 schema
371  Schema = #{
372      type => object,
373      properties => #{
374          <<"title">> => #{type => string},
375          <<"count">> => #{type => integer},
376          <<"items">> => #{
377              type => array,
378              items => #{type => string}
379          }
380      },
381      required => [<<"title">>, <<"count">>]
382  }.
383  
384  %% 使用 Parser
385  {ok, Parsed} = agent_output_parser:parse(
386      LLMResponse,
387      Schema,
388      #{max_retries => 3}
389  ).
390  ```
391  
392  ## 文档
393  
394  ### 核心文档
395  
396  - **[doc/API_REFERENCE.md](doc/API_REFERENCE.md)** - API 参考文档
397  - **[doc/MIDDLEWARE.md](doc/MIDDLEWARE.md)** - Middleware 系统文档
398  - **[doc/ARCHITECTURE.md](doc/ARCHITECTURE.md)** - 架构设计
399  - **[doc/QUICK_START.md](doc/QUICK_START.md)** - 快速开始
400  - **[DEPENDENCIES.md](DEPENDENCIES.md)** - 依赖关系详解
401  
402  ### 模块文档
403  
404  | 模块 | 说明 | 文档 |
405  |------|------|------|
406  | **beamai_core** | 核心框架:Graph 引擎、Pregel 分布式计算、行为定义 | [README](apps/beamai_core/README.md) |
407  | **beamai_llm** | LLM 客户端:支持 OpenAI、Anthropic、Zhipu、Ollama | [README](apps/beamai_llm/README.md) |
408  | **beamai_agent** | Simple Agent:ReAct 模式、回调系统、Checkpoint | [README](apps/beamai_agent/README.md) |
409  | **beamai_deepagent** | Deep Agent:任务规划、并行执行、自我反思 | [README](apps/beamai_deepagent/README.md) |
410  | **beamai_memory** | 记忆管理:Checkpoint、Store、时间旅行 | [README](apps/beamai_memory/README.md) |
411  | **beamai_tools** | 工具库:Provider 机制、工具注册表、内置工具 | [README](apps/beamai_tools/README.md) |
412  | **beamai_a2a** | A2A 协议:Agent 间通信、服务端/客户端 | [README](apps/beamai_a2a/README.md) |
413  | **beamai_mcp** | MCP 协议:Model Context Protocol 实现 | [README](apps/beamai_mcp/README.md) |
414  | **beamai_rag** | RAG 功能:向量嵌入、相似度搜索 | [README](apps/beamai_rag/README.md) |
415  
416  ### 其他文档
417  
418  - **[doc/DESIGN_PATTERNS.md](doc/DESIGN_PATTERNS.md)** - 设计模式
419  - **[doc/OUTPUT_PARSER.md](doc/OUTPUT_PARSER.md)** - Output Parser 指南
420  - **[REFACTORING_REPORT.md](REFACTORING_REPORT.md)** - 重构总结报告
421  
422  ## 运行示例
423  
424  ```bash
425  # 编译
426  rebar3 compile
427  
428  # 启动 Shell
429  rebar3 shell
430  
431  # 运行交互式 Deep Agent
432  examples/interactive_deep_agent.erl
433  ```
434  
435  ## 项目统计
436  
437  - **应用数量**: 8 个
438  - **代码行数**: ~15,000 行
439  - **测试覆盖**: 持续改进中
440  - **文档**: 完整的 API 和架构文档
441  
442  ## 性能
443  
444  - ✅ 基于 Erlang/OTP 轻量级进程
445  - ✅ Graph 引擎优化执行路径
446  - ✅ 并发工具调用
447  - ✅ HTTP 连接池(Hackney)
448  - ✅ ETS 高速存储
449  
450  ## 设计原则
451  
452  - **简单**: 清晰的 API,易于理解
453  - **模块化**: 每个模块职责单一
454  - **可扩展**: Behaviour 设计,易于自定义
455  - **高性能**: 利用 Erlang 并发特性
456  - **可观测**: 完善的日志、追踪、监控
457  
458  ## 许可证
459  
460  Apache-2.0
461  
462  ## 贡献
463  
464  欢迎提交 Issue 和 Pull Request!
465  
466  ---
467  
468  **开始构建你的 AI Agent 应用!** 🚀