Flue Agent SDK
Flue Agent SDK(@flue/sdk)是用于已部署 Flue 应用中单个智能体会话的 TypeScript 客户端。一个客户端封装了一个会话 URL — 即智能体路由(createAgentRouter(...))的挂载路径加上调用方选择的会话 ID — 并在该 URL 提供的 HTTP 路由上暴露类型化方法:接收消息、等待结算、读取或观察已物化的会话、中止进行中的工作,以及解析附件字节。
该包仅支持 ESM,可在任何有 fetch 的环境运行(浏览器、Node.js、边缘运行时),只有一个依赖 @durable-streams/client,它为 wait() 和 observe() 提供了可重连的流传输。
安装
npm install @flue/sdk
最小化往返示例
import { createFlueClient } from '@flue/sdk';
const conversation = createFlueClient({
url: 'https://example.com/agents/support/ticket-8472',
token: process.env.FLUE_TOKEN,
});
// 发送一条消息。服务器在智能体运行之前返回 202。
const admission = await conversation.send({
message: { kind: 'user', body: 'Summarize the open issues in my case.' },
});
// 等待提交结算并读取回复。
// 当运行失败或被中止时抛出 FlueExecutionError。
const reply = await conversation.read(admission);
发送操作是即发即忘的 — 智能体的响应会落到会话中,而 read() 是组合的往返操作,它等待提交结算后再读取回复。底层原语也是公开的:wait() 在结算时解析但不获取回复(适用于只需要结果的调用方),history() 读取一个物化快照,observe() 维护一个跨追赶和实时更新的实时视图,而纯函数 readSubmissionReply() 辅助方法从任一方式中提取提交的回复 — 包括当发送加入了一个繁忙响应时的合并回复。所有这些都记录在 FlueClient 页面上。
每个客户端对应一个会话
没有部署级客户端,也没有按智能体名称寻址。框架不知道应用在哪里挂载了其智能体 — 应用的路由映射(app.ts)知道 — 因此客户端通过 URL 精确寻址一个会话。结果:
- 开始新会话就是在挂载 URL 后附加一个新 ID 来构造客户端。会话本身在接收到第一条消息时创建;
createFlueClient()不执行任何 I/O 操作。 - 没有枚举会话、按名称查找智能体或删除会话的 API。这些是应用路由背后的应用层关注点。
- 认证方式取决于应用路由的要求:客户端在每个请求(包括流重连)上附加 bearer
token或自定义headers。构造选项记录在CreateFlueClientOptions中。
它所封装的 HTTP 接口
每个客户端方法都是对会话 URL 某个路由的类型化封装(参见路由 — 会话 URL):
send()—POST <url>; the body is the sameDeliveredMessageshape a server-sidedispatch(...)admits, optionally withinitialDataand auidsend condition.read()—wait()’s stream follow, then onehistory()read to return the submission’s reply.wait()— reads theGET <url>?view=updatesstream from the admission’s offset until the submission’ssubmission-settledchunk arrives.history()—GET <url>?view=history; one materialized snapshot, optionally bounded to the newest messages withlimit.historyBefore()—GET <url>?view=history&before=<cursor>; one page of older messages.observe()—history()to hydrate, then theupdatesstream to stay live, with reconnection, rehydration, and duplicate-chunk suppression handled internally.abort()—POST <url>/abort.attachmentUrl()— resolves<url>/attachments/<attachmentId>for onefilepart’s bytes.
任何 HTTP 客户端都可以直接调用这些路由 — 线路协议记录在流协议参考中。SDK 增加的是类型化契约加上你否则需要重新实现的流机制:基于偏移量的恢复、重连退避、按请求的头部解析,以及至少一次的重发去重。
与 @flue/react 和 @flue/runtime 的关系
useFlueAgent()来自@flue/react,它基于此包构建:它从url选项(或接受一个预配置的客户端用于自定义头部、认证或 fetch 行为)构造createFlueClient(...),并将客户端的observe()输出归约为 React 状态。- 在 Flue 服务端进程内部,不需要 HTTP:
@flue/runtime的init()和dispatch()直接寻址智能体(参见构建智能体)。SDK 用于进程外的代码 — 浏览器、脚本、CI、其他服务 — 通过 HTTP 接口访问已部署的智能体。
本节页面
- createFlueClient(…) — 构造客户端(
CreateFlueClientOptions:url、fetch、headers、token)、URL 解析和自定义传输。 - FlueClient — 会话方法 —
send()、wait()、abort()、history()、observe()和attachmentUrl()— 及其选项、结果和物化会话状态类型。 - 事件和记录 —
updates线路联合类型(ConversationStreamChunk)、FlueEventStream迭代接口,以及偏移量/重发语义。 - 错误 —
FlueApiError(失败的 HTTP 请求)、FlueExecutionError(失败或中止的结算)、文档化的服务器错误信封,以及重新导出的@durable-streams/client流错误。