人工智能AI Agent多智能体后端前端【免费下载链接】relayRelay 是一个多智能体协作平台通过统一的界面进行协作开发、代码审查、任务管理将多个 AI Agent 组织成一个真正的团队。项目地址https://gitcode.com/openJiuwen/relay点击查看免费下载RelayOfficeClaw的多智能体协作平台将后端 HTTP API 服务封装为独立的 npm 包openjiuwen/relay-api-server它向外导出服务入口与编程式接入接口并通过Provider 模块 环境变量的方式按需加载存储、证据、调度、认证、目录等能力实现。本文以 packages/api/README.md 为骨架结合仓库源码与测试系统讲解该包的安装方式、导出结构、Provider 模块化机制、SQLite 提供方接入实践以及编程式启动的完整用法帮助你理解如何基于该包二次集成或定制 Relay 的 API 服务。一、包定位Relay 运行时的后端 API 入口openjiuwen/relay-api-server是 OfficeClaw 运行时使用的后端 API 服务包OfficeClaw API server package。按 packages/api/README.md 的描述它导出 OfficeClaw 运行时所需的服务器入口点server entry points并依赖共享契约包shared contracts与核心运行时包core runtime package。在仓库 monorepo 结构中该包的依赖关系可以在 packages/api/package.json 中得到印证openjiuwen/relay-core核心运行时提供OfficeClawProviderPlugin、ProviderPluginRegistry等插件契约openjiuwen/relay-api-server-contractsAPI 服务契约包定义IMessageStore、IThreadStore、EvidenceProvider、SchedulerProvider等端口接口openjiuwen/relay-shared共享类型与工具如createRedisClient、SessionStore、Agent 注册表等。三者均以workspace:*形式引入说明该包必须工作在 pnpm workspace 中。包本身还内置了 Fastify、Socket.IO、ioredis、puppeteer、nodemailer、imapflow、sharp 等大量依赖覆盖了消息、会话、调度、推送、音视频、连接器等后端能力。二、安装与基本用法按 README 给出的安装方式在应用或运行时项目中执行pnpm add openjiuwen/relay-api-server安装后有两个可用的导出子路径exportsopenjiuwen/relay-api-server主入口对应 src/index.ts 编译产物dist/index.js导出main()、createApiModule()、createAuthModule、createStorageModule、createCatalogModule等openjiuwen/relay-api-server/server编程式服务器工厂入口对应 src/server.ts 编译产物dist/server.js导出createOfficeClawServer()。此外packages/api/package.json 中还注册了两个 bin 命令office-claw-api-serverrelay-api-server二者都指向./dist/cli.js也就是 src/cli.ts 的编译产物。CLI 入口非常轻量仅仅调用main()并在出错时输出[api] Fatal error后以退出码 1 结束进程import { main } from ./index.js; main().catch((err) { console.error([api] Fatal error:, err); process.exit(1); });这意味着安装该包后你既可以通过pnpm dev/node dist/cli.js直接启动服务也可以在宿主代码中编程式拉起服务器。三、Provider 模块化架构能力按需加载README 的核心信息在于存储storage、证据evidence、调度scheduler、认证auth、指标metrics与目录catalog等实现并不内置于 API 包而是通过 Provider 模块加载。你需要单独安装 Provider 包并用对应的OFFICE_CLAW_*_PROVIDER_MODULES环境变量告诉运行时去哪里加载它们。这种端口 适配器的设计在源码中有清晰的对应实现。每一个领域都有一份独立的module.ts统一遵循注册内置 Provider → 按环境变量加载外部模块 → 解析激活 Provider ID → bootstrap → 创建具体能力的模式能力域模块文件激活 ID 环境变量模块列表环境变量默认 Provider存储src/storage/module.tsOFFICE_CLAW_STORAGE_PROVIDEROFFICE_CLAW_STORAGE_PROVIDER_MODULES有 Redis 用redis否则MEMORY_STORE1用memory否则直接抛错fail-closed证据src/evidence/module.tsOFFICE_CLAW_EVIDENCE_PROVIDEROFFICE_CLAW_EVIDENCE_PROVIDER_MODULESnoop调度src/scheduler-persistence/module.tsOFFICE_CLAW_SCHEDULER_PROVIDEROFFICE_CLAW_SCHEDULER_PROVIDER_MODULESnoop认证src/auth/module.tsOFFICE_CLAW_AUTH_PROVIDEROFFICE_CLAW_AUTH_PROVIDER_MODULESno-auth目录src/catalog/module.tsOFFICE_CLAW_CATALOG_PROVIDEROFFICE_CLAW_CATALOG_PROVIDER_MODULESfile几个值得注意的源码细节模块列表支持逗号分隔以存储模块为例storage/module.ts 中的parseModuleSpecifiers()会把OFFICE_CLAW_STORAGE_PROVIDER_MODULES按逗号切分并过滤空项因此一个变量可以加载多个 Provider 模块。激活 Provider 与模块分离OFFICE_CLAW_*_PROVIDER决定用哪一个OFFICE_CLAW_*_PROVIDER_MODULES决定从哪些模块注册可用项如果激活的 ID 未注册Registry 的get()会抛出形如Storage provider xxx not found. Registered: [...]的明确错误见 storage/storage-provider-registry.ts。证据与调度默认 noop未配置时证据与调度 Provider 为noop此时证据索引与 TaskRunnerV2 调度器不会真正工作。在 src/index.ts 中调度模块初始化为noop时会被判定为不可用scheduler provider is noop抛错并被捕获为非致命警告这说明生产环境必须接入真实的调度 Provider。README 中提到的 metricsREADME 将 metrics 与 storage、evidence 等并列。从当前仓库源码结构看storage、evidence、scheduler、auth、catalog五个模块均有对应的module.ts与OFFICE_CLAW_*_PROVIDER_MODULES环境变量可查证metrics 相关的 Provider 模块文件未在packages/api/src下发现如需启用可参考同族环境变量的命名规律自行接入 Provider 包。Provider 模块的导出契约每个外部 Provider 模块被加载后Registry 会从模块的命名空间中收集候选 Provider。以证据 Registrysrc/evidence/provider-registry.ts为例它依次检查default、evidenceProvider具名导出以及evidenceProviders数组导出只要命中的对象满足{ id: string; createEvidenceServices: Function }形状即视为有效 Provider。存储 Registrysrc/storage/storage-provider-registry.ts还支持部分 Provider只实现部分 store 的 Provider 会被wrapPartialProvider包装用默认 Provider 补齐缺失的 store。这为只替换某个存储的定制场景提供了很大灵活性。四、实战接入 SQLite 证据与调度 ProviderREADME 给出的完整示例是使用openjiuwen/relay-storage-sqlite包来获得 SQLite 证据evidence与调度scheduler能力pnpm add openjiuwen/relay-storage-sqliteOFFICE_CLAW_EVIDENCE_PROVIDERsqlite OFFICE_CLAW_EVIDENCE_PROVIDER_MODULESopenjiuwen/relay-storage-sqlite/evidence OFFICE_CLAW_SCHEDULER_PROVIDERsqlite OFFICE_CLAW_SCHEDULER_PROVIDER_MODULESopenjiuwen/relay-storage-sqlite/scheduler4.1 Provider 包的结构该包对应仓库中的 packages/sqlite-adapter/api 目录包名为openjiuwen/relay-storage-sqlite见 package.json。它通过exports暴露三个子路径.主入口导出evidenceProvider、schedulerProvider与approvalRecordStorageProvider./evidence映射到dist/evidence/sqlite.js导出id: sqlite的evidenceProvider./scheduler映射到dist/scheduler/sqlite.js导出id: sqlite的schedulerProvider./authorization提供createSqliteApprovalRecordStore等审批记录存储能力。子路径导出正是 README 示例中.../evidence与.../scheduler能作为模块说明符被直接加载的原因——OFFICE_CLAW_EVIDENCE_PROVIDER_MODULES指向的字符串本质上就是一个可被import()的模块说明符。4.2 证据 Provider 的底层实现evidence/sqlite.ts 中的evidenceProvider调用createMemoryServices()创建一套 SQLite 支撑的证据服务包括SqliteEvidenceStore证据文档与关系edges的存储IndexBuilder对docsRoot下的文档建索引VectorStore与EmbeddingService基于sqlite-vec的向量检索stats()能力直接查询evidence_docs与edges表统计文档数、边数以及最近更新时间。从 src/index.ts 可以看到API 服务在启动时会调用证据模块的indexBuilder.rebuild()重建证据索引失败仅告警不阻断启动随后通过markThreadDirty/accumulateSummaryDelta/flushDirtyThreads每 30 秒把脏线程摘要增量刷入索引。4.3 调度 Provider 的底层实现scheduler/sqlite.ts 中的schedulerProvider用better-sqlite3打开数据库文件并设置三项 pragmadb.pragma(journal_mode WAL); db.pragma(foreign_keys ON); db.pragma(busy_timeout 5000);随后返回一组 SQLite 持久化对象供 API 服务的TaskRunnerV2调度器使用RunLedger任务运行台账GlobalControlStore全局治理开关EmissionStore发射投递记录PackTemplateStore打包模板DynamicTaskStore动态任务持久化。需要留意的是SQLite 证据与调度默认使用同一个数据库文件路径API 服务在 src/index.ts 中通过env.EVIDENCE_DB ?? monorepoRoot/data/evidence.sqlite同时注入给证据模块与调度模块即两套能力共享一个evidence.sqlite数据库调度侧的建表依赖applyMigrations完成。4.4 环境变量默认值如何被铺开仓库的启动脚本已经把这些默认值内置。例如scripts/start-dev.sh 默认OFFICE_CLAW_STORAGE_PROVIDER_MODULESopenjiuwen/relay-storage-sqlite、OFFICE_CLAW_APPROVAL_RECORD_PROVIDERsqlite-approval-recordsscripts/start-windows.ps1 为 Windows 运行时设置了OFFICE_CLAW_EVIDENCE_PROVIDERsqlite、OFFICE_CLAW_EVIDENCE_PROVIDER_MODULESopenjiuwen/relay-storage-sqlite/evidence、OFFICE_CLAW_SCHEDULER_PROVIDERsqlite及对应的_MODULES变量。这解释了 README 示例的完整落地路径安装 Provider 包 → 设置环境变量 → 启动 API 服务即自动加载 SQLite 证据与调度能力。五、模块加载器workspace 内如何解析 Provider 模块外部 Provider 模块说明符如openjiuwen/relay-storage-sqlite/evidence是通过moduleLoader动态import()的。默认的加载器定义在 src/utils/workspace-module-loader.ts它先尝试标准import(specifier)如果抛出ERR_MODULE_NOT_FOUND则扫描当前项目根下packages目录中的全部package.json把openjiuwen/*包名映射到实际目录再通过pathToFileURL()定位exports中对应的子路径实现文件。这正是本仓库 monorepo 部署形态的支撑点当 Provider 包尚未发布到 npm registry 时openjiuwen/relay-storage-sqlite/evidence也能通过 workspace 扫描被正确解析并加载。createStorageModule、createEvidenceModule、createAuthModule等都接收可选的moduleLoader参数测试与下游宿主可以注入自定义加载器。六、编程式接入createOfficeClawServer 与启动选项6.1 服务器工厂openjiuwen/relay-api-server/server子路径导出的createOfficeClawServer()见 src/server.ts是最常用的编程式接入点返回{ start, close }import { createOfficeClawServer } from openjiuwen/relay-api-server/server; const server await createOfficeClawServer({ port: 3004, host: 127.0.0.1, redisUrl: redis://127.0.0.1:6379, memoryStore: false, }); const url await server.start(); // 例如 http://127.0.0.1:3004 // ... 退出前调用 await server.close();OfficeClawServerOptions支持以下字段工厂会把它们写入对应环境变量后再启动见 src/server.ts选项写入的环境变量说明portAPI_SERVER_PORT监听端口默认3004hostAPI_SERVER_HOST监听地址默认127.0.0.1redisUrlREDIS_URLRedis 连接串提供后自动启用 Redis 存储与租约memoryStoreMEMORY_STORE1开启内存存储模式无 Redis 时projectRootOFFICE_CLAW_CONFIG_ROOT项目根目录用于解析 Agent 配置pluginsglobalThis.__clowder_extra_plugins注入额外的OfficeClawProviderPlugin可注册自定义 Agent 提供方runtimeEnvStore—运行时环境存储供启动时 bootstrap 解析启动完成后返回的 URL 由 src/server-lifecycle.ts 依据API_SERVER_PORT/API_SERVER_HOST拼接close()则通过_stopForProgrammatic()触发优雅关停。6.2 更细粒度的 ApiStartOptions若你不需要server.ts的封装可以直接调用主入口的main(options)即createApiModule(options)它支持更细粒度的扩展点见 src/index.tsstorageModule/catalogModule注入自定义模块以替换存储后端或 Agent 配置加载hooks.afterAppCreated在全局认证钩子注册前挂载自定义认证中间件hooks.afterInit拿到完整的ApiInitContextenv、cwd、Fastify 实例、stores、services、moduleshooks.afterAuthMiddleware注册 JWTrequest.auth注入hooks.afterSocketManagerCreated为 WebSocket 附加认证逻辑skipFeatures跳过指定功能组的路由注册。FeatureName的可选值为terminal、ppt、connector、scheduler、memory、session、push、uploads、tts。6.3 启动阶段的内建行为main()会依次完成大量初始化理解这些行为有助于排障与定制Fastify 实例bodyLimit为 100MB注册 Cookie、CORS、WebSocket 插件日志序列化器会脱敏token、apiKey、secret等查询参数全局安全注册全局认证钩子、安全响应头、统一错误处理器与GET /health健康检查返回{ status: ok, timestamp }存储层按OFFICE_CLAW_STORAGE_PROVIDER创建messageStore、threadStore、taskStore、backlogStore、memoryStore等消息/线程/任务/积压均支持*_TTL_SECONDS过期Agent 编排从 catalog 读取 Agent 配置通过ProviderPluginRegistry按config.provider创建对应的AgentService内置插件见 src/config/plugins/builtin-providers.ts涵盖 anthropic、openai、google、dare、opencode、antigravity、relayclaw、acp、a2a并维护AgentRouter用于消息路由多实例保护配置了 Redis 时通过ApiInstanceLease获取 API 命名空间租约若租约被抢占或监听失败进程会拒绝启动并退出防止同一 Redis 命名空间出现多个活实例收尾任务启动时清理孤儿 invocationStartupReconciler、全局会话 reaper 定时扫描卡在sealing状态的会话、预热 provider profiles、检测可用 CLI 客户端、启动 GitHub 评审 watcher 与 CI/CD 轮询器、启动连接器网关优雅关停收到 SIGTERM/SIGINT 后依次记录审计日志、触发 Redis BGSAVE、关闭存储 Provider、停止 watcher、关闭 SocketManager 与 Fastify最后释放租约。七、验证与测试仓库为该包的接入方式提供了直接可读的测试证据test/server-entrypoint.test.js 验证createOfficeClawServer({ port, host, memoryStore })暴露start/close方法并验证注入的runtimeEnvStore会被注册到 bootstrap 解析器test/auth-module.test.js 覆盖OFFICE_CLAW_AUTH_PROVIDEROFFICE_CLAW_AUTH_PROVIDER_MODULES的 Provider 注册、缺失 Provider 报错与 bootstrap 行为test/auth-external-provider-e2e.test.js 以OFFICE_CLAW_AUTH_PROVIDERdemo-static、OFFICE_CLAW_AUTH_PROVIDER_MODULESexamples/demo-auth-provider演示了外部认证 Provider 的端到端接入。这些测试同时佐证了 README 的 Provider 加载方式_PROVIDER指定激活 ID_PROVIDER_MODULES指向模块说明符二者缺一不可。八、总结openjiuwen/relay-api-server作为 Relay 的官方后端 API 服务包把服务入口与能力实现解耦服务骨架内置在包中Fastify、认证、路由、Agent 编排、优雅关停等而存储、证据、调度、认证、目录等具体能力全部由 Provider 模块按需接入。接入时只需两条规则安装对应的 Provider 包如openjiuwen/relay-storage-sqlite并通过其exports子路径指向具体的 Provider 实现设置OFFICE_CLAW_能力域_PROVIDER指定激活项设置OFFICE_CLAW_能力域_PROVIDER_MODULES指定模块加载说明符。需要更深入的实现细节时建议按以下路径阅读源码包契约与启动流程看 src/index.ts编程式接入看 src/server.ts各能力域模块看 src/storage/module.ts、src/evidence/module.ts、src/scheduler-persistence/module.ts、src/auth/module.ts、src/catalog/module.tsProvider 实现参考 packages/sqlite-adapter/api/src/evidence/sqlite.ts 与 packages/sqlite-adapter/api/src/scheduler/sqlite.ts。赞分享人工智能AI Agent多智能体后端前端【免费下载链接】relayRelay 是一个多智能体协作平台通过统一的界面进行协作开发、代码审查、任务管理将多个 AI Agent 组织成一个真正的团队。项目地址https://gitcode.com/openJiuwen/relay点击查看免费下载相关推荐CloudForest回归分析指南L1回归和梯度提升树的应用技巧CloudForest回归分析指南L1回归和梯度提升树的应用技巧 CloudForest是一个基于Go语言实现的决策树集成学习库提供了L1回归和梯度提升树等机器学习3步掌握GPT-SoVITS从5秒语音到专业级语音克隆的完整攻略3步掌握GPT SoVITS从5秒语音到专业级语音克隆的完整攻略 你是否曾为语音合成的高门槛而却步是否觉得需要数小时录音和复杂训练才能获得一个像样的语音模型语音音频人工智能大模型微调模型推理服务本地部署bytebuffer.js终极JavaScript二进制数据处理库让ArrayBuffer与Buffer操作如虎添翼bytebuffer.js终极JavaScript二进制数据处理库让ArrayBuffer与Buffer操作如虎添翼 bytebuffer.js是一个快速且开发工具上一篇itch 桌面应用完整指南下载、安装、更新一次管明白你的 itch.io 游戏库下一篇ZCF 工作流体系详解六阶段工作流、Feat、BMad、Spec 与 Git 智能命令的使用与实现原理创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考