一次执行的完整旅程
把前四天串成一条故事线:你在前端点"运行"一个 Agent(Graph),到它执行完,数据在整个平台里怎么流动。这是理解 AutoGPT Platform 全局的关键一天。
👶 小白:为什么要"先扣费、再入队",不直接开跑、跑完再按实际用量收钱?
👨🏫 老师:跟快递"先付运费才收件"一个道理。若先跑后收,用户余额不足时钱已经烧在半路(LLM 调用真花了钱),平台亏定了。所以先预扣(押运费)挡住余额不足的,再入队解耦——前端点完就能走、不用盯着,执行进程从队列慢慢取件处理。Day 16 会讲这套"预扣 + 对账"如何多退少补。
旅程全景
假设你搭好了"网页摘要邮件"Agent(Day 01 的例子:读网页→LLM总结→发邮件),点了"运行"。整条链路:
① 触发与扣费
前端 POST /api/graphs/{id}/execute/{version}(api/features/v1.py:1862)。REST 先做付费墙检查:
# v1.py:1848 挂了 Depends(enforce_payment_paywall)
# 先查余额 ≤0 → 返回 402(付费墙),否则 add_graph_execution(...)
② 入队解耦
add_graph_execution(executor/utils.py:1171)建库记录 + 发 MQ:
# utils.py 概念
create_graph_execution(...) # 在 DB 建执行记录(含起始节点 QUEUED)
publish_message(routing_key="graph_execution.run", ...) # 发到 RabbitMQ
# REST 立刻返回执行 id,不等它跑完
③ 起始节点开跑
executor 进程(ExecutionManager)从 RabbitMQ 消费到任务,交给线程池的 ExecutionProcessor。核心调度在 _on_graph_execution(executor/manager.py:942):
# 概念:建一个进程内的 ExecutionQueue,预填起始节点
# 起始节点(Day 03 的 starting_nodes)在 create_graph_execution 时已建为 QUEUED
# 主调度循环:从队列取节点 → 预扣费 → 异步执行 → 取输出 → 入队下游
data/execution.py:137-164,一个正常跑通的"读网页"节点会经历:QUEUED(已入队等 executor 取)→ RUNNING(executor 取到、正在跑 run())→ COMPLETED(成功,输出已产出)。若中途出错(比如网页 404 触发
yield "error"):RUNNING → FAILED。整张图(graph execution)也有同一套状态,全部节点跑完才 COMPLETED。这套转移表限制了"合法的下一个状态",防止乱跳。④ 数据流向下游(拓扑执行的核心)
validate_exec 检查"这个下游的必填输入齐了没"——不齐就只落库等待,齐了才标 QUEUED 入队。这样无论图多复杂,节点永远在输入完整时才执行。一个节点跑完,它的输出怎么触发下游?_enqueue_next_nodes(manager.py:389):
# 对当前节点每条 output_link:
# 1. 输出值匹配连线的 source_name 才继续
# 2. upsert_execution_input:把值写给下游节点执行(攒输入)
# 3. validate_exec 检查下游输入齐了吗:
# - 不齐 → 只落库,不入队(等其它输入到)
# - 齐了 → 标 QUEUED,入执行队列
validate_exec "齐了才跑"的规则。⑤ 凭证注入执行
单个节点执行 execute_node(manager.py:142)执行前,注入凭证(manager.py:263):
# 遍历 Block input schema 里的凭证字段
credentials, lock = await creds_manager.acquire(user_id, credentials_meta.id)
extra_exec_kwargs[field_name] = credentials # 以 kwarg 注入
# 然后:block.execute(input_data, **extra_exec_kwargs)
run()(Day 08/17 细讲)。执行前还 charge_usage 预扣 credit(Day 16)。凭证加锁保证"同一套凭证同一时刻只被一个 Block 用"。run(self, input_data, *, credentials, **kwargs)——这个 credentials 就是在这里被框架注入的真实凭证实体。Block 代码里从不硬编码密钥,密钥只在执行瞬间注入——安全(Day 17)。⑥ 实时推送与对账
两件收尾事:
- 实时推送:每次节点状态变化,executor publish 事件到 Redis 事件总线;WebSocket 进程订阅后转发给前端(
conn_manager.py)——你在画布上看到节点一个个亮起、数据流动(Day 15)。 - 对账:Block 跑完拿到真实用量,
charge_reconciled_usage(billing.py:200)算delta = 真实成本 - 预扣——多退少补(Day 16)。
🎓 第 1 周收官 + 动手
第 1 周(Day 01-05)你已建立完整心智
- Day 01 全景:从自主智能体到平台、Block+Graph 心智
- Day 02 Block:有输入输出口和 run() 的积木
- Day 03 Graph:Node+Link 连成的智能体
- Day 04 运行平台:多进程 + 队列 + 中间件
- Day 05 执行旅程:触发→扣费→入队→拓扑执行→注入→推送→对账
你现在理解了"一个 Agent 如何被执行"的全局。下周(Day 06-10)深入 Block 系统——基类、真实块、凭证、成本、SDK。
✋ 动手:验证旅程
P=autogpt_platform/backend/backend
grep -n 'def add_graph_execution\|publish_message' $P/executor/utils.py | head
grep -n 'def _on_graph_execution\|_enqueue_next_nodes\|upsert_execution_input' $P/executor/manager.py | head
grep -n 'creds_manager.acquire\|charge_usage\|charge_reconciled' $P/executor/manager.py $P/executor/billing.py | head