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 常常自己恢复了,全告警会吵死人。
看得见运行了。下一章,把它部署到任何地方。