您现在的位置是:首页 >技术教程 >Langchain js 0.3/@langchain/openai 0.4调用OpenRouter的最佳实践网站首页技术教程
Langchain js 0.3/@langchain/openai 0.4调用OpenRouter的最佳实践
简介Langchain js 0.3/@langchain/openai 0.4调用OpenRouter的最佳实践
网上找到的,包括官方给的代码都是针对较低版本的,对目前最新的版本不适用。
首先说明版本号,package.json中相关依赖版本如下:
"dependencies": {
"@langchain/core": "^0.3.39",
"@langchain/openai": "^0.4.3",
"langchain": "^0.3.15"
},
"resolutions": {
"@langchain/core": "0.3.39"
}
构造Openrouter Model的核心代码如下:
const model = new ChatOpenAI({
model: "gpt-4o",
// modelName: "openai/gpt-4o",
temperature: 0.8,
streaming: true,
openAIApiKey: OPENROUTER_API_KEY,
configuration: {
baseURL: "https://openrouter.ai/api/v1",
},
});
踩坑注意:model名称不要使用openrouter文档中提供的openai/gpt-4o的类似写法,虽然结果可以返回,但token计算会出现错误,因为ChatOpenAI以及OpenAI的token计算方法使用了硬编码:
// @langchain/core/dist/utils/tiktoken.js:19:24
export async function encodingForModel(model) {
return getEncoding(getEncodingNameForModel(model));
}
// js-tiktoken/dist/chunk-Z5MDQTGX.js:247:13
function getEncodingNameForModel(model) {
switch (model) {
case "gpt2": {
return "gpt2";
}
case "code-cushman-001":
case "code-cushman-002":
case "code-davinci-001":
case "code-davinci-002":
case "cushman-codex":
case "davinci-codex":
case "davinci-002":
case "text-davinci-002":
case "text-davinci-003": {
return "p50k_base";
}
case "code-davinci-edit-001":
case "text-davinci-edit-001": {
return "p50k_edit";
}
case "ada":
case "babbage":
case "babbage-002":
case "code-search-ada-code-001":
case "code-search-babbage-code-001":
case "curie":
case "davinci":
case "text-ada-001":
case "text-babbage-001":
case "text-curie-001":
case "text-davinci-001":
case "text-search-ada-doc-001":
case "text-search-babbage-doc-001":
case "text-search-curie-doc-001":
case "text-search-davinci-doc-001":
case "text-similarity-ada-001":
case "text-similarity-babbage-001":
case "text-similarity-curie-001":
case "text-similarity-davinci-001": {
return "r50k_base";
}
case "gpt-3.5-turbo-instruct-0914":
case "gpt-3.5-turbo-instruct":
case "gpt-3.5-turbo-16k-0613":
case "gpt-3.5-turbo-16k":
case "gpt-3.5-turbo-0613":
case "gpt-3.5-turbo-0301":
case "gpt-3.5-turbo":
case "gpt-4-32k-0613":
case "gpt-4-32k-0314":
case "gpt-4-32k":
case "gpt-4-0613":
case "gpt-4-0314":
case "gpt-4":
case "gpt-3.5-turbo-1106":
case "gpt-35-turbo":
case "gpt-4-1106-preview":
case "gpt-4-vision-preview":
case "gpt-3.5-turbo-0125":
case "gpt-4-turbo":
case "gpt-4-turbo-2024-04-09":
case "gpt-4-turbo-preview":
case "gpt-4-0125-preview":
case "text-embedding-ada-002":
case "text-embedding-3-small":
case "text-embedding-3-large": {
return "cl100k_base";
}
case "gpt-4o":
case "gpt-4o-2024-05-13":
case "gpt-4o-2024-08-06":
case "gpt-4o-2024-11-20":
case "gpt-4o-mini-2024-07-18":
case "gpt-4o-mini":
case "o1":
case "o1-2024-12-17":
case "o1-mini":
case "o1-preview":
case "o1-preview-2024-09-12":
case "o1-mini-2024-09-12":
case "o3-mini":
case "o3-mini-2025-01-31":
case "chatgpt-4o-latest":
case "gpt-4o-realtime":
case "gpt-4o-realtime-preview-2024-10-01": {
return "o200k_base";
}
default:
throw new Error("Unknown model");
}
}
所以会同步抛出Failed to calculate number of tokens, falling back to approximate count Error: Unknown model异常。这理论上会影响llmOutput的estimatedTokenUsage相关数值计算准确性,当然不需要可以不用,也可以使用其他方法抑制这个异常输出。
当然最好的办法是写一个chat_model扩展,方便起见可以extend现成的model并重写对应token计算方法即可。
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。