Flue 框架从入门到精通
Part 3 · 进阶实战

§10 流式输出与可观测:让 Agent 的运行看得见

SSE 流式输出与 observe 全局可观测

📑 本章目录

10.1 用户盯着空白屏,以为卡了

我第一次上线 Agent,用户说"它卡了"。其实它在思考。我才明白要流式输出。

Agent 思考要几秒。你只回最终答案,用户面对空白,会以为挂了。

解决两件事:流式输出让用户看到过程,可观测让你看到运行。

10.2 SSE:把思考过程推给前端

加一个 Accept: text/event-stream 头,就能收到实时事件:

curl -N -X POST http://localhost:3583/agents/social-search/my-session \
  -H "Content-Type: application/json" \
  -H "Accept: text/event-stream" \
  -d '{"message":"微博热搜Top3"}'

事件类型一览:

事件 含义
thinking_start / thinking_delta / thinking_end Agent 推理过程
tool_execution_start / tool_execution_end 工具开始/结束
text_delta 最终回答的片段流
agent_end Agent 结束

每个事件都是 data: <JSON>\n\n 格式。前端边收边渲染,体验立刻不一样。

10.3 可观测:用 observe 看全局

上线后,你要知道"哪个工作流慢了、哪个失败了"。在 app.ts 注册观察者:

import { observe } from '@flue/runtime';

observe((event) => {
  // 这行是关键:慢操作告警
  if (event.type === 'operation' && event.durationMs > 5000) {
    console.warn('Slow operation', event.operationKind, event.durationMs);
  }
});

工作流内部还能写结构化日志:

export async function run({ init, log, payload }: FlueContext<{ text: string }>) {
  log.info('Summarization requested', { characters: payload.text.length });
  // ... 干活 ...
  log.info('Completed', { tokens: response.usage.totalTokens });
}

标叔的经验:先盯"结果类"信号。

失败的工作流、慢操作、模型用量,这三样先接上。嵌套的工具报错别全都当事故,Agent 常常自己恢复了,全告警会吵死人。

看得见运行了。下一章,把它部署到任何地方。