OpenRouter 接入 OpenAI Assistants 使用指南及代码示例
2025-02-27 06:37:30
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 客户端配置
关键点:修改 baseURL
和 apiKey
。
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 可能使用不同的模型名称。 你需要确保:
- 在 Openrouter 的文档或者控制面板里,找到对应的模型名称。
- 在你的代码中创建 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);
})();
如果遇到问题,仔细检查控制台的输出和错误信息, 逐个排查。 确保 apiKey
,baseURL
, 以及模型名称 都正确设置。
进阶使用技巧
-
多个 Openrouter 账号: 如果你有多个 Openrouter 账号,对应不同的项目或者配额,可以在创建 OpenAI 客户端时动态切换
apiKey
。 -
封装服务: 可以把 Openrouter 相关的配置和逻辑封装到一个单独的模块或服务里, 使代码更整洁,便于维护。
-
监控: 如果你的程序使用频繁, 建议定期检查你的Openrouter 账户余额,或设置提醒,避免超额扣费.
通过上面这些简单的步骤,就可以让 OpenAI Assistants 在 Openrouter 上顺畅运行。