返回

OpenRouter 接入 OpenAI Assistants 使用指南及代码示例

Ai

Openrouter 搭配 OpenAI Assistants 使用详解

最近看到一个叫 apiepie.ai 的平台,它通过 Openrouter 提供 GPT-4 访问。 我想搞明白,能不能像官方 OpenAI Assistants API 那样去使用 Openrouter,就像官方文档给的示例代码,总不能一直只用基础的消息发送吧? 下面是我常用的OpenAI Assistants代码,想在Openrouter上也跑起来:

async function createThread() {
    try {
        const thread = await openai.beta.threads.create();
        return thread.id;
    } catch (error) {
        console.error("Error al crear el hilo:", error);
        return null;
    }
}

async function sendMessageToOpenAI(threadId, message) {
    try {
        const response = await openai.beta.threads.messages.create(threadId, {
            role: "user",
            content: message
        });
        return response;
    } catch (error) {
        console.error("Error al enviar mensaje a OpenAI:", error);
        return null;
    }
}

async function getResponseFromOpenAI(threadId, assistantId) {
    try {
        const run = await openai.beta.threads.runs.create(threadId, {
            assistant_id: assistantId.id,
        });
        // console.log(`run : ${run}`)
        
        let runResponse = await openai.beta.threads.runs.retrieve(threadId, run.id);
        console.log(`runresponse : ${runResponse}`)
        
        while (runResponse.status !== "completed") {
            // Pausar brevemente para evitar hacer solicitudes continuas en un bucle rápido
            await new Promise(resolve => setTimeout(resolve, 1000)); // Espera 1 segundo
            runResponse = await openai.beta.threads.runs.retrieve(threadId, run.id);
            console.log(`runresponse 2  threadid: ${runResponse}`)
            console.log(runResponse.thread_id)
            
        }

        return runResponse;
    } catch (error) {
        console.error("Error al obtener respuesta de OpenAI:", error);
        return null;
    }
}

为什么不能直接用?

主要原因是,官方的 OpenAI Node.js SDK 是专门为直接连接 OpenAI 服务器设计的。Openrouter 作为一个中间层,虽然提供了类似的 API 接口,但底层实现和请求细节上存在差异。

解决方案: 修改配置和少量代码

不用慌,只需要简单几步,就能让 Openrouter 跑起来:

1. 修改 OpenAI 客户端配置

关键点:修改 baseURLapiKey

Openrouter 提供了与 OpenAI API 兼容的接口,但我们需要将请求指向 Openrouter 的服务器。修改OpenAI的初始化代码。

const OpenAI = require('openai');

const openai = new OpenAI({
  apiKey: "sk-or-v1-your-openrouter-api-key", // 你的 Openrouter API Key
  baseURL: "https://openrouter.ai/api/v1",
});

apiKey 换成你在 Openrouter 网站上获得的 API 密钥。 baseURL 设置为 https://openrouter.ai/api/v1。 这样,所有通过 openai 对象发起的请求,都会被导向 Openrouter。

2. (可能需要)模型名称映射

关键点:使用Openrouter支持的模型。

OpenAI Assistants API 里,我们创建 Assistant 时会指定模型(比如 "gpt-4")。Openrouter 可能使用不同的模型名称。 你需要确保:

  1. 在 Openrouter 的文档或者控制面板里,找到对应的模型名称。
  2. 在你的代码中创建 Assistant 时,使用Openrouter提供的模型字符串:
// 假设你在 Openrouter 控制台看到了类似 "openrouter/gpt-4" 这样的模型
const assistant = await openai.beta.assistants.create({
  instructions: "你是一个有帮助的助手。",
  name: "我的助手",
  tools: [{ type: "code_interpreter" }], //示例, 按需配置.
  model: "openrouter/gpt-4", // 使用 Openrouter 提供的模型名称!
});

如果不清楚具体的模型名称,建议先用Openrouter的 models.list() 来获取可用的列表:

    async function listModels() {
      const list = await openai.models.list();

      console.log(list.data);
    }
    listModels();

运行这个, 可以打印出所有支持的模型. 找到想要的模型名称.

3. 关于请求头的 OpenRouter-Referer(可选)

为了更好地追踪和管理你的请求,Openrouter 建议你在请求头中添加 OpenRouter-Referer 字段。 这个字段的值是你网站的 URL。

你可以这样配置(在创建 OpenAI 实例时):

const OpenAI = require('openai');

const openai = new OpenAI({
  apiKey: "sk-or-v1-your-openrouter-api-key",
  baseURL: "https://openrouter.ai/api/v1",
  defaultHeaders: {
    "HTTP-Referer": "https://your-website-url.com", // 替换成你的网站 URL
    "X-Title": "Your Application Name", // 可选:你的应用名称
  },
});

如果不方便用网站URL, 设置一个能标识来源的字符串也行.

4. (可选) 错误处理及重试

关键点: Openrouter 的错误码、速率限制等,可能与 OpenAI 不同。

由于是第三方服务,我们需要做好更全面的错误处理。

async function sendMessageToOpenAI(threadId, message) {
  try {
    const response = await openai.beta.threads.messages.create(threadId, {
      role: "user",
      content: message,
    });
    return response;
  } catch (error) {
    console.error("出错啦:", error);

    if (error.status === 429) { // 速率限制
        console.warn("请求太快,稍后再试!");
        // 可以加入重试逻辑, 例如等几秒后再试
     } else if(error.status === 500){
         console.error("服务器错误!");
          // 也许可以过一会儿再试试, 或者换个模型?
     }else{
        // 其他错误, 检查 error.code 和 error.message
        console.error(`具体错误:${error.code} - ${error.message}`);
     }
     return null;
    }
  }

强烈建议阅读 Openrouter 的官方文档,了解他们的错误码和速率限制规则,以更好地处理这些情况。

5. 测试!

配置好后,尝试跑你的代码。

 (async () => {
      const assistant = await openai.beta.assistants.create({
      instructions: "你是一个有帮助的助手",
      name: "数学助手",
      tools: [{ "type": "code_interpreter" }],
      model: "openrouter/gpt-4-32k", // 根据实际情况选择模型
    });

      const threadId = await createThread();

      if (threadId) {
        const message = await sendMessageToOpenAI(threadId, "1 + 1 等于几?");

        if (message) {

          const runResponse = await getResponseFromOpenAI(threadId, assistant);

          //console.log(runResponse);
           const messages = await openai.beta.threads.messages.list(
                  threadId
                );
                console.log(messages.data[0].content);

        }
      }

      await openai.beta.assistants.del(assistant.id);

})();

如果遇到问题,仔细检查控制台的输出和错误信息, 逐个排查。 确保 apiKeybaseURL, 以及模型名称 都正确设置。

进阶使用技巧

  • 多个 Openrouter 账号: 如果你有多个 Openrouter 账号,对应不同的项目或者配额,可以在创建 OpenAI 客户端时动态切换 apiKey

  • 封装服务: 可以把 Openrouter 相关的配置和逻辑封装到一个单独的模块或服务里, 使代码更整洁,便于维护。

  • 监控: 如果你的程序使用频繁, 建议定期检查你的Openrouter 账户余额,或设置提醒,避免超额扣费.

通过上面这些简单的步骤,就可以让 OpenAI Assistants 在 Openrouter 上顺畅运行。