Experts.js
用 OpenAI Assistants API 组装可协作的多智能体工具链。
- Star 数
- ★ 1.1k
- 最近更新
- 2 年前
- License
- MIT
- 主语言
- JavaScript
- FA 评分
- 46/100 · 缺口较多
30 秒速览
- 运行形态
- 可在哪里用
- 平台专用OpenAI API
- 费用
- 软件免费,模型调用费用自付
- 上手难度
- 低 · 几分钟可跑通
- 开始前需要
- 典型场景
- Node.js 团队要在客服或内部应用中调用 OpenAI Assistant,并希望只通过 ask() 获取回答而不处理 Run 对象。
- 不适合
- 希望避免 OpenAI 供应商锁定的团队,没有其他模型适配器
- 不想管理 OpenAI API 密钥与按量计费成本的个人开发者
- 源码审查
- 46/100 · 缺口较多
这个 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?
安装: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 有哪些优点和局限?
- 将 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 与同类方案有什么区别?
与直接使用 OpenAI Chat Completions API 相比,Experts.js 面向 Assistants、Threads、Runs 和工具编排;与 Custom GPTs 相比,README 所述的基础是可由应用代码调用的 OpenAI Assistants API。
与相关度最高的同类 agent 并排比较关键指标。
| Agent | 源码审查 | 形态 / 费用 | Star | 最近更新 | 主语言 | 完整支持的平台 |
|---|---|---|---|---|---|---|
| Experts.js 当前 | 46 · 缺口较多 | 代码库 / SDK免费 + 模型费 | ★ 1.1k | 2 年前 | JavaScript | OpenAI API |
| Hello-Agents 智能体教程 | 53 · 缺口较多 | 网页应用免费 + 模型费 | ★ 86k | 25 天前 | Python | OpenAI API |
| Ouroboros 自演进代理 | 77 · 表现良好 | 桌面应用免费 + 模型费 | ★ 1.6k | 今天 | Python | — |
| Dynamiq 智能体编排框架 | 61 · 存在缺口 | 代码库 / SDK免费 + 模型费 | ★ 1.1k | 3 天前 | Python | OpenAI API |
FollowAgents 如何评估这个 Agent?
查看各维度的扣分理由
文档说明 Assistant/Tool 会调用 OpenAI API,线程、消息、文件及向量存储用于上下文,调试模式会输出 API 调用和事件,数据流有一定可见性(2)。但示例建议把 API 密钥放入本地环境文件,未说明密钥保护、日志脱敏、权限范围或每次外部操作的确认机制(least_privilege 1、user_confirmation 1、sensitive_data_handling 1、external_effects 1)。部署时本地配置可能覆盖远端配置,提到 skipUpdate 可跳过更新,但未提供回滚流程(1)。README 与包元数据指向项目和作者,然而发布者身份未经验证,且未明确维护责任(source_attribution 2)。
README、package.json 和工作流均把产品定位为 OpenAI Assistants API 封装,核心对象和示例大体一致;但至少一处图像消息示例中 image_file 对象的字段间缺少逗号,且 create 工厂示例未 await,与前文异步用法不一致,故自洽性仅 1。声明依赖 OpenAI SDK、Node 18 发布环境并提供安装步骤,但未给出锁文件或依赖供应保障证据(1)。代码样本未展示错误分类、用户可读失败消息或恢复策略(0)。
面向使用 OpenAI Assistants API 的 JavaScript 开发者,文档覆盖单 Assistant、多层工具、流式事件、图像、向量存储和 Express 场景(2)。区分 LLM 与非 LLM 工具,并说明线程管理和工具名称唯一性等边界(2);但触发条件主要依靠提示和工具描述,没有说明如何约束模型误调用工具(1)。提供 ES 模块/CommonJS 支持、Node 18 发布环境、环境变量配置及 Dev Container 开发路径(2)。
README 按 Assistants、Tools、Threads、Runs、Examples 和 Deployments 组织,npm 安装及开发命令均有说明(各 2)。命名和对象关系较稳定,含多个示例及重要提示,但没有常见问题解答,且示例存在语法/异步使用疑点(examples_and_faq 2)。对服务器发送事件的异步限制和新建 Assistant 的行为有提示,但限制说明不全面(1)。LICENSE.md 完整列出 MIT 条款(3)。package.json 有版本号,材料未包含变更日志内容或明确维护责任说明,因此版本历史和维护路径证据有限(各 1)。
README 给出可直接参考的 API 示例、事件、线程、部署与指标用法,适合将 OpenAI Assistants 组合为工具(output_usability 2、marginal_value 2)。但产品依赖外部 OpenAI 服务和密钥,且多层 Agent、持久线程及工具调用会带来额外成本;材料没有成本控制或收益评估指导,故成本效益为 1。
主要功能描述由 README 中的示例和 API 引用支持,部分可与包元数据、测试文件及 CI 配置对照(claim_traceability 2)。测试文件含 OpenAI API 的集成测试用例,工作流也显示会运行测试;但这些材料不能证明当前修订的测试结果,且 README 的全部主张并未逐项对应实现或测试(cross_source_corroboration 1)。文本未系统标注哪些内容是已验证事实、哪些是目标或宣传性判断,例如“最容易”缺少证据(fact_inference_separation 1)。
- API 密钥、线程消息、上传文件及工具输出可能涉及敏感数据;材料没有说明日志脱敏或数据保留控制。
- 部署配置可能覆盖远端 Assistant 配置;先核对目标 ID 和配置,材料没有描述恢复步骤。
- 示例中存在字段分隔符和异步调用疑点;集成前应逐项核对实际 API 用法。
常见问题
它能接入 Claude 或其他模型吗?
是否必须手动创建和轮询 Run?
生产环境如何避免每次创建新的助手?
费用如何计算?
谢谢反馈,我们会据此改进页面。