如何用已创建的OpenAI Assistants API替代Completions/Chat Completions API?
整合OpenAI Assistant到readline交互式聊天程序
问题背景
已在OpenAI平台创建自定义Assistant,希望替换现有代码中的Chat Completions API,实现基于readline的交互式对话。现有代码依赖本地消息数组维护上下文,需改为用OpenAI的Thread和Run机制调用自定义Assistant。
解决方案
核心逻辑:程序启动时创建一个持久对话Thread,每次用户输入时将消息存入该Thread,创建Run触发Assistant响应,等待Run完成后获取并输出回复。
完整代码实现
import { config } from "dotenv"; config(); import { OpenAI } from "openai"; import readline from "readline"; const openai = new OpenAI({ apiKey: process.env.API_KEY }); // 替换为你的自定义Assistant ID const ASSISTANT_ID = "asst_xxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; const userInterface = readline.createInterface({ input: process.stdin, output: process.stdout, }); // 全局维护对话Thread let thread; // 初始化对话Thread async function initThread() { thread = await openai.beta.threads.create(); console.log("对话已初始化,开始聊天吧!"); userInterface.prompt(); } // 轮询等待Run执行完成 async function waitForRunCompletion(threadId, runId) { while (true) { const run = await openai.beta.threads.runs.retrieve(threadId, runId); if (run.status === "completed") return run; if (run.status === "failed" || run.status === "cancelled") { throw new Error(`Run执行失败:${run.last_error?.message || run.status}`); } // 每秒轮询一次状态 await new Promise(resolve => setTimeout(resolve, 1000)); } } // 从Thread中获取最新的Assistant回复 async function getLatestAssistantReply(threadId) { const messages = await openai.beta.threads.messages.list(threadId); return messages.data.find(msg => msg.role === "assistant")?.content[0].text.value; } // 处理用户输入 userInterface.on("line", async (input) => { if (!thread) { console.log("对话初始化中,请稍候..."); return; } try { // 将用户消息存入Thread await openai.beta.threads.messages.create(thread.id, { role: "user", content: input, }); // 创建Run触发Assistant响应 const run = await openai.beta.threads.runs.create(thread.id, { assistant_id: ASSISTANT_ID, }); // 等待Run完成 await waitForRunCompletion(thread.id, run.id); // 获取并输出Assistant回复 const reply = await getLatestAssistantReply(thread.id); console.log(`Assistant: ${reply}`); } catch (err) { console.error("对话出错:", err.message); } finally { userInterface.prompt(); } }); // 启动程序时初始化Thread initThread();
关键细节说明
- 持久化Thread:程序启动时创建一次Thread,整个对话过程复用,OpenAI会自动维护对话上下文,无需本地存储消息数组。
- 消息存入Thread:用户输入后通过
threads.messages.create将消息写入OpenAI的Thread,替代原本地消息数组的作用。 - Run状态轮询:Assistant的Run是异步执行的,通过轮询判断Run状态,直到完成或失败,确保能获取到完整回复。
- 回复提取:Run完成后从Thread的消息列表中筛选出最新的Assistant消息,直接输出即可。
内容的提问来源于stack exchange,提问作者Rasmus
相关产品推荐
相关产品推荐

