尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Flue数据持久化API参考:手把手教你写自定义适配器

Flue数据持久化API参考:手把手教你写自定义适配器 Flue数据持久化API参考手把手教你写自定义适配器【免费下载链接】flueThe sandbox agent framework.项目地址: https://gitcode.com/GitHub_Trending/flue1/flueFlue是一个沙箱智能体框架The sandbox agent framework它的数据持久化 APIData Persistence API定义了一套统一的适配器契约PersistenceAdapter。只要你实现这个契约就能让 Flue 的智能体对话、任务提交与附件在重启、多副本之间不丢失。本文将带你从零理解这套 API并手把手学会为自己的数据库写一个自定义持久化适配器。Flue 数据库里到底存了什么先澄清一个常见误区Flue 的持久化数据库只存运行时状态不存你的业务数据。它存的是三类记录存储对象对应的 Store通俗理解规范对话流ConversationStreamStore每个智能体实例一条只追加的记录流是唯一事实来源已接受的任务提交AgentSubmissionStore任务账本排队、认领、租约、结算保证崩溃后可恢复附件字节AttachmentStore图片等不可变二进制文件由对话记录引用官方说明文档位于 apps/docs/src/content/docs/reference/data-persistence-api.md是这份 API 的权威参考。第一步认识PersistenceAdapter三个方法整个契约的入口只有三个方法非常轻源码packages/runtime/src/adapter.tsinterface PersistenceAdapter { connect(): PersistenceStores | PromisePersistenceStores; migrate?(): void | Promisevoid; close?(): void | Promisevoid; }migrate()— 启动时最先调用一次负责建表/建集合并且必须把「格式版本」写入数据库。如果数据库是更新版本的 Flue 写出来的这里要大声报错而不是悄悄读写。connect()— 打开连接池返回三个 Store。数据库不可达会在启动时失败而不是拖到第一个请求。close()— 优雅释放连接。你的适配器只需从db.ts文件默认导出这个对象Flue 会在构建时自动发现并接线机制说明见 apps/docs/src/content/docs/guide/database.md。第二步三个 Store 接口速览1. ConversationStreamStore — 对话流核心是append/read两个动作规则要点一批记录要么全落盘、要么全不写all-or-nothing绝不能只写一半每条流同一时刻最多一个生产者acquireProducer会作废旧的凭证可选实现putFoldCheckpoint/getFoldCheckpoint折叠检查点让冷启动不必从头重放整条流——但它只是缓存丢了就自动全量重放完全不影响正确性。接口定义在 packages/runtime/src/runtime/conversation-stream-store.ts。2. AgentSubmissionStore — 任务账本这是最难的部分。提交状态走queued → running → settled你要正确实现会话内 FIFO 排队、并发下的单点认领两个并发 claim 不能同时成功、租约到期与幂等准入。官方文档建议用后端原生的事务/条件写/原子计数器来实现不要在应用内存里模拟。3. AttachmentStore — 附件最简单只有put和get两个方法且要求幂等——同 id 同内容重复写入直接成功同 id 不同内容必须抛AttachmentConflictError。参考实现InMemoryAttachmentStore就在 packages/runtime/src/runtime/attachment-store.ts不到 70 行是绝佳的学习材料。第三步横切规则适配器正确性的底线所有 Store 共同遵守的规则也是契约测试逐条验证的对象幂等准入完全重放返回原结果同身份不同内容是冲突绝不静默覆盖可观察原子性描述为“原子”的方法并发调用者不能都看到成功首个终态优先已结算的提交结果永远不被改写格式版本戳首次建库时写入当前FLUE_FORMAT_VERSION当前为1遇到未知或更新版本直接抛PersistedFormatVersionError。第四步动手写自定义适配器 ️放置位置在源码根目录.flue/、src/或项目根创建db.ts默认导出适配器。注意这是Node 目标专属Cloudflare 目标会自动使用 Durable Object 内置 SQLite并拒绝db.ts。只从公开子路径导入契约类型与辅助函数都在flue/runtime/adapter不要碰 internal 路径。学一个现成范例Postgres 适配器 packages/postgres/src/index.ts 展示了完整套路——包本身不绑定驱动你只需把自选调用者的驱动包成query/transaction/close三个函数传给工厂。MongoDB 适配器packages/mongodb/src/index.ts则证明非 SQL 后端是一等公民。最小骨架长这样// src/db.ts import { postgres } from flue/postgres; import { Pool } from pg; const pool new Pool({ connectionString: process.env.DATABASE_URL }); export default postgres({ query: async (text, params) (await pool.query(text, params)).rows, transaction: async (fn) { /* 在单个连接上 BEGIN/COMMIT */ }, close: () pool.end(), });SQL 系后端还有捷径defineSqlConversationStreamStore(dialect)用一套方言常量就能得到完整的对话流 StorePostgres、libSQL、MySQL 共享同一套栅栏实现。第五步用契约测试套件验收 ✅Flue 把测试套件当作可执行的规范——三套测试全过你的适配器才算正确import { defineStoreContractTests, defineConversationStreamStoreContractTests, defineAttachmentStoreContractTests, } from flue/runtime/test-utils;defineStoreContractTests— 验AgentSubmissionStore准入、排队、租约、结算……defineConversationStreamStoreContractTests— 验对话流原子批次、生产者栅栏、幂等重试defineAttachmentStoreContractTests— 验附件字节回读、冲突、完整性此外flue/runtime/adapter还导出了一批纯函数助手admitSubmissionWithBackend、createSessionStorageKey、prepareSubmissionAttachments等内置适配器就是这么写成的自定义适配器可以直接复用。内置与生态适配器清单写自定义适配器前先看看是不是已有轮子蓝图指南在 blueprints/ 目录后端适配器包SQLite内置零依赖flue/runtime/node的sqlite()Postgres / Supabaseflue/postgreslibSQL / Tursoflue/libsqlMySQLflue/mysqlMongoDBflue/mongodbRedis / Valkeyflue/redis通用数据库适配器的编写蓝图见 blueprints/database.md里面列出了所有「从规范里推断不出来」的坑。小结写一个 Flue 自定义持久化适配器路径其实很清晰读懂三个 Store 契约 → 复用flue/runtime/adapter的助手与参考实现 → 在db.ts中默认导出 → 跑通三套契约测试。这套契约对 SQL 与文档型后端一视同仁只要三套测试全绿你的数据库就是 Flue 的一等持久化后端。【免费下载链接】flueThe sandbox agent framework.项目地址: https://gitcode.com/GitHub_Trending/flue1/flue创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表