数据截至 (上游 commit 610a2f575c46)
声明式前端:FastAgent 应用、装饰器与工厂
30 秒导读: fast-agent 让你用
@fast.agent(...)这样的装饰器来「声明」一个 agent,而不是手写它的构造过程。装饰器当场并不创建任何 agent 对象——它只是往一个字典里塞一份配置(AgentConfig)。真正把配置变成活的 agent 实例,发生在你async with fast.run()的那一刻,由一套工厂函数按依赖顺序统一完成。本章讲的就是这条「声明 → 登记 → 实例化」的流水线。
本章聚焦「用户怎么声明 agent、框架怎么把声明变成活的实例」。各 agent 类的内部实现见 Agent 类栈;一次 turn 怎么跑见 工具循环引擎;各工作流(chain/parallel/router…)的语义见 工作流模式。
1. 这是什么(零基础也能懂)
一句话定义: 声明式前端是 fast-agent 面向用户的那层 API——你用装饰器「描述」想要什么样的 agent,框架负责把描述变成实例。
它解决什么问题。 想象你要搭一个多 agent 应用:一个负责写代码、一个负责评审、再来一个 router 决定把请求发给谁。如果每个 agent 都要你手动 new 出对象、挂上 LLM、连好 MCP server、还要处理谁依赖谁的初始化顺序,代码会很啰嗦。fast-agent 把这些收进装饰器背后,你只写「声明」。
用起来什么样。 一个最小应用长这样:
from fast_agent import FastAgent # 示意,非源码
fast = FastAgent("my-app") # ① 建应用对象
@fast.agent(name="assistant", # ② 声明一个 agent
instruction="You are helpful.",
servers=["fetch"]) # 要连的 MCP server
async def main():
async with fast.run() as agent: # ③ 此刻才真正构造实例
await agent.assistant.send("hi")
# asyncio.run(main())
一句话直觉: 把装饰器想成「点菜单」——你在菜单上勾选想要的菜(声明),但厨房(工厂)要等到 fast.run() 下单那一刻才开火做菜(实例化)。菜单和成品是两回事,这就是本章反复强调的**「声明与实例分离」**。