You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用已创建的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();

关键细节说明

  1. 持久化Thread:程序启动时创建一次Thread,整个对话过程复用,OpenAI会自动维护对话上下文,无需本地存储消息数组。
  2. 消息存入Thread:用户输入后通过threads.messages.create将消息写入OpenAI的Thread,替代原本地消息数组的作用。
  3. Run状态轮询:Assistant的Run是异步执行的,通过轮询判断Run状态,直到完成或失败,确保能获取到完整回复。
  4. 回复提取:Run完成后从Thread的消息列表中筛选出最新的Assistant消息,直接输出即可。

内容的提问来源于stack exchange,提问作者Rasmus

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.22 17:25:06