数据截至 (上游 commit 610a2f575c46)
Agent 类栈:从纯 LLM 到智能编码 agent 的继承链
30 秒导读: fast-agent 里所有能对话、能调工具、能连 MCP、能跑
/slash命令的 agent,都不是各写一套,而是一条单继承链从下往上一层层叠出来的。本章讲清这条链每一层「在上一层基础上补了什么能力」,给你一张继承图和一张对照表。
本章是 [Agent 类栈] 这一章,属于 fast-agent 文档组。它只讲类之间的继承与分工;工具循环一次 turn 内部怎么跑留给 03-tool-loop-engine,provider 细节留给 04-llm-provider-abstraction,MCP 聚合器内部留给 05-mcp-integration。想先看 agent 是怎么被声明出来的,回 01-declarative-frontend。
1. 这是什么(零基础也能懂)
一句话定义: 这是 fast-agent 里 agent 对象的「能力继承阶梯」——从一个只会把消息转发给模型的空壳,一路继承、加料,直到一个能在终端里帮你改代码、连外部工具、跑命令的智能编码 agent。
它解决什么问题: 一个 agent 框架要支持很多形态——最简单的「纯问答」、能调本地函数的、能连 MCP 服务器的、带完整交互式编码体验的。如果每种形态都从零写一套,代码会重复且容易走样。fast-agent 的选择是:把能力切成一层一层,每层是上一层的子类,只负责补一件新事。你要哪种 agent,就用到链上哪一层。
用起来什么样: 你几乎从不直接 new 这些类(声明式前端替你选类,见 01 章),但理解这条链能让你看懂「为什么一个 SmartAgent 既能对话、又能调工具、又能连 MCP」——因为这些能力分别来自它继承链上的不同祖先。
一句话直觉/类比: 把它想成咖啡的加料:先是一杯 espresso(只会调模型),加奶变拿铁(能显示、能流式),加糖浆(能调工具),再加一份浓缩(接上 MCP 运行时),最后拉花装盘(交互命令)。每一步都基于上一步,不推翻它。
2. 顶层全景(这条链大概怎么转)
整条链是单继承(每层只有一个直接父类,外加少量 mixin/Protocol),从抽象到具体是这样的:
怎么读这张图:从上到下是「越来越能干」,每个框第二行是它新增的核心能力,括号里是真实类所在文件。
┌─────────────────────────────────────────────────────────┐
│ ① LlmDecorator llm_decorator.py │
│ 门面:__call__/send/generate、attach_llm、历史与生命周期 │
└───────────────────────────┬─────────────────────────────┘
│ 继承
┌───────────────────────────▼─────────────────────────────┐
│ ② LlmAgent llm_agent.py │
│ 加:UI 显示、流式、停止原因、取消回滚 │
└───────────────────────────┬─────────────────────────────┘
│ 继承 (+ _ToolLoopAgent mixin)
┌───────────────────────────▼─────────────────────────────┐
│ ③ ToolAgent tool_agent.py │
│ 加:本地函数工具、并行/串行执行、agent-as-tool │
└───────────────────────────┬─────────────────────────────┘
│ 继承 (名义挂 ABC,但无抽象方法)
┌───────────────────────────▼─────────────────────────────┐
│ ④ McpAgent mcp_agent.py │
│ 加:MCP 聚合器、shell/文件系统运行时、skills、指令模板 │
└───────────────────────────┬─────────────────────────────┘
│ 继承
┌───────────────────────────▼─────────────────────────────┐
│ ⑤ harness 工具 + 能力模式 core/harness_tools.py │
│ 加:/slash 命令工具、get_resource(不再是独立继承层) │
└─────────────────────────────────────────────────────────┘
每层一句话职责:
| 层 | 类 | 文件 | 补了什么(一句话) |
|---|---|---|---|
| ① | LlmDecorator | agents/llm_decorator.py:167 | 对外门面 + 挂载 LLM + 会话历史,但自己不加任何 LLM 交互行为 |
| ② | LlmAgent | agents/llm_agent.py:109 | 把一次回复显示出来:流式渲染、停止原因文案、取消回滚 |
| ③ | ToolAgent | agents/tool_agent.py:50 | 让 agent会用工具:注册本地函数、并行/串行跑、把别的 agent 当工具 |
| ④ | McpAgent | agents/mcp_agent.py:178 | 接上外部世界:MCP 服务器、shell、文件系统、skills、指令模板渲染;它就是「普通 agent」(AgentType.BASIC)本体 |
| ⑤ | harness 工具(slash_command/get_resource) + AgentCapabilityMode | core/harness_tools.py:68、core/agent_capabilities.py:32 | 交互式操作面板:/slash 命令、运行时 /mcp 热接服务器(旧 SmartAgent 独立子类已移除) |