Experts.js
用 OpenAI Assistants API 组装可协作的多智能体工具链。
这个 Agent 能做什么,适合哪些场景?
Experts.js 是一个 JavaScript 库,以 Assistant、Tool 和 Thread 三个对象封装 OpenAI Assistants API。应用通过 Assistant.create() 创建或加载助手,再以 ask() 向指定 Thread 发送消息并取得输出,无需直接管理 Run 或 Run Step。Tool 是 Assistant 的子类,可由父 Assistant 调用;工具既可以由模型驱动,也可以通过 llm: false 实现自定义 ask()。库默认使用流式事件,并允许监听文本增量、工具调用、运行步骤及异步完成事件。生产部署可为 Assistant 或 Tool 提供 asst_ 格式的 id,以复用远程助手并用本地配置覆盖其配置。
开发者从 experts 导入 Assistant、Tool 和 Thread,先调用 Thread.create() 获得 thread id,再调用 Assistant.create() 创建助手,并执行 assistant.ask(message, threadID)。ask() 接受字符串或原生 OpenAI message 对象,并在内部管理 Run;调用期间可通过 on("textDelta") 等事件接收文本、图像文件和工具调用输出。父 Assistant 通过 addAssistantTool(ToolClass) 注册 Tool;LLM 驱动的 Tool 会把自身响应作为父级工具输出,非 LLM Tool 则必须自行实现 ask(message)。线程关系会写入 OpenAI thread metadata,以便在父子助手之间为 Tool 查找或创建独立线程。
- Node.js 团队要在客服或内部应用中调用 OpenAI Assistant,并希望只通过 ask() 获取回答而不处理 Run 对象。
- 需要把商品目录检索、OpenSearch 查询生成等职责拆分为可由主助手调用的 Tool 的应用开发者。
- Express 服务需要通过 textDelta 事件将助手回复以分块文本流式返回给浏览器。
- 知识库应用需要在 Assistant 配置中使用 file_search 和 vector_store_ids 检索 OpenAI Vector Store 中的文件。
- 需要为不同子工具维持独立上下文、避免父线程等待工具输出时发生线程锁定的多助手系统。
这个 Agent 有哪些优点和局限?
- 将 Assistant、Tool 与 Thread 提炼为三个主要对象,并把 Run 管理隐藏在 ask() 接口之后。
- Assistant 可直接作为父助手的函数工具,支持多层工具编排和父子线程关联。
- 提供 textDelta、toolCallDelta、runStepDone、end 及对应异步完成事件,适合流式 UI 和运行指标采集。
- 支持 OpenAI 原生工具配置,包括 file_search、code_interpreter、函数调用和 Vector Store 资源。
- 核心设计依赖 OpenAI Assistants API,没有记录其他模型提供商或兼容 API 的适配路径。
- 每个问题都需要 thread ID;应用仍需负责保存聊天场景中的线程标识。
- LLM Tool 的函数名必须在父助手全部工具名中唯一,命名冲突会影响调用。
- 流式 SSE 事件不适合直接 async/await;异步工作需要改用 textDoneAsync、endAsync 等扩展事件。
如何安装或部署这个 Agent?
安装:npm install experts。代码中使用 import { Assistant, Tool, Thread } from "experts";。开发环境文档要求创建 .env.development.local,其中包含 OPENAI_API_KEY=sk-... 和 POST_IMAGES_API_KEY=...,然后可运行 ./bin/setup 与 ./bin/test。最小调用为:const thread = await Thread.create(); const assistant = await Assistant.create(); const output = await assistant.ask("Say hello.", thread.id);。
如何使用这个 Agent?
定义 Assistant 子类时向 super() 传入 name、instructions、model、tools 或 tool_resources;默认模型为 gpt-4o-mini。使用 this.addAssistantTool(EchoTool) 把 Tool 加入父助手,且应在 super() 之后调用。要流式处理回复,创建助手后注册 assistant.on("textDelta", (delta) => process.stdout.write(delta.value)),再执行 ask()。部署时把已有的 asst_... id 传入构造选项;如不希望用本地配置更新远程助手,可设定 skipUpdate: true。
这个 Agent 与同类方案有什么区别?
与直接使用 OpenAI Chat Completions API 相比,Experts.js 面向 Assistants、Threads、Runs 和工具编排;与 Custom GPTs 相比,README 所述的基础是可由应用代码调用的 OpenAI Assistants API。