@langchain/openrouter 0.2.5 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +28 -0
- package/dist/chat_models/index.cjs +1 -1
- package/dist/chat_models/index.d.cts +1 -1
- package/dist/chat_models/index.js +1 -1
- package/dist/converters/messages.cjs +20 -0
- package/dist/converters/messages.cjs.map +1 -1
- package/dist/converters/messages.js +20 -0
- package/dist/converters/messages.js.map +1 -1
- package/dist/index.cjs +6 -1
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +7 -2
- package/dist/index.d.cts.map +1 -0
- package/dist/index.d.ts +7 -2
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -1
- package/dist/index.js.map +1 -0
- package/package.json +5 -5
- package/dist/profiles.d.cts +0 -7
- package/dist/profiles.d.cts.map +0 -1
- package/dist/profiles.d.ts +0 -7
- package/dist/profiles.d.ts.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,33 @@
|
|
|
1
1
|
# @langchain/openrouter
|
|
2
2
|
|
|
3
|
+
## 0.3.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [#10666](https://github.com/langchain-ai/langchainjs/pull/10666) [`2bb55b0`](https://github.com/langchain-ai/langchainjs/commit/2bb55b053f49f89e81e3252a7af08e86d71ddd95) Thanks [@hnustwjj](https://github.com/hnustwjj)! - feat(openrouter): surface reasoning content as v1 standard content blocks
|
|
8
|
+
|
|
9
|
+
`convertOpenRouterResponseToBaseMessage` and
|
|
10
|
+
`convertOpenRouterDeltaToBaseMessageChunk` now copy OpenRouter's
|
|
11
|
+
`reasoning` (flat string) and `reasoning_details` (structured array) fields
|
|
12
|
+
onto `additional_kwargs.reasoning_content` / `additional_kwargs.reasoning_details`.
|
|
13
|
+
A new `ChatOpenRouterTranslator` is registered in `@langchain/core` under
|
|
14
|
+
the `"openrouter"` provider key so `AIMessage.contentBlocks` emits standard
|
|
15
|
+
`{type: "reasoning"}` blocks alongside text and tool calls.
|
|
16
|
+
|
|
17
|
+
Previously, reasoning text returned by reasoning-capable models routed
|
|
18
|
+
through OpenRouter (DeepSeek R1, Minimax M2, Claude extended thinking,
|
|
19
|
+
o-series, etc.) was silently dropped: only the `reasoning_tokens` count
|
|
20
|
+
was preserved via `usage_metadata`. Consumers using standard content blocks
|
|
21
|
+
(including the frontend agent UI patterns shown in the docs) could not
|
|
22
|
+
display the model's chain of thought.
|
|
23
|
+
|
|
24
|
+
### Patch Changes
|
|
25
|
+
|
|
26
|
+
- [#10832](https://github.com/langchain-ai/langchainjs/pull/10832) [`1b24369`](https://github.com/langchain-ai/langchainjs/commit/1b24369a970ad6f56f1f428027f48601f87e62eb) Thanks [@info-arnav](https://github.com/info-arnav)! - fix(core, openrouter): make CJS default re-exports callable
|
|
27
|
+
|
|
28
|
+
- Updated dependencies [[`3999fab`](https://github.com/langchain-ai/langchainjs/commit/3999fab55870c6eea22d6d90c08aa472f9b2fac3), [`fce9ab4`](https://github.com/langchain-ai/langchainjs/commit/fce9ab418901323618fdfaaa9fc350fa1c0d50e0)]:
|
|
29
|
+
- @langchain/openai@1.4.7
|
|
30
|
+
|
|
3
31
|
## 0.2.5
|
|
4
32
|
|
|
5
33
|
### Patch Changes
|
|
@@ -151,7 +151,7 @@ var ChatOpenRouter = class extends _langchain_core_language_models_chat_models.B
|
|
|
151
151
|
model: modelOrFields
|
|
152
152
|
} : modelOrFields;
|
|
153
153
|
super(fields);
|
|
154
|
-
this._addVersion("@langchain/openrouter", "0.
|
|
154
|
+
this._addVersion("@langchain/openrouter", "0.3.0");
|
|
155
155
|
const apiKey = fields.apiKey ?? (0, _langchain_core_utils_env.getEnvironmentVariable)("OPENROUTER_API_KEY");
|
|
156
156
|
if (!apiKey) throw new require_errors.OpenRouterAuthError("OpenRouter API key is required. Get one at https://openrouter.ai/keys and set it via the `apiKey` parameter or the OPENROUTER_API_KEY environment variable.");
|
|
157
157
|
this.apiKey = apiKey;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { OpenRouter } from "../api-types.cjs";
|
|
2
2
|
import { ChatOpenRouterCallOptions, ChatOpenRouterParams } from "./types.cjs";
|
|
3
|
-
import { BaseChatModel, BindToolsInput, LangSmithParams } from "@langchain/core/language_models/chat_models";
|
|
4
3
|
import { ModelProfile } from "@langchain/core/language_models/profile";
|
|
4
|
+
import { BaseChatModel, BindToolsInput, LangSmithParams } from "@langchain/core/language_models/chat_models";
|
|
5
5
|
import { BaseLanguageModelInput, StructuredOutputMethodOptions } from "@langchain/core/language_models/base";
|
|
6
6
|
import { AIMessageChunk, BaseMessage } from "@langchain/core/messages";
|
|
7
7
|
import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
|
|
@@ -151,7 +151,7 @@ var ChatOpenRouter = class extends BaseChatModel {
|
|
|
151
151
|
model: modelOrFields
|
|
152
152
|
} : modelOrFields;
|
|
153
153
|
super(fields);
|
|
154
|
-
this._addVersion("@langchain/openrouter", "0.
|
|
154
|
+
this._addVersion("@langchain/openrouter", "0.3.0");
|
|
155
155
|
const apiKey = fields.apiKey ?? getEnvironmentVariable("OPENROUTER_API_KEY");
|
|
156
156
|
if (!apiKey) throw new OpenRouterAuthError("OpenRouter API key is required. Get one at https://openrouter.ai/keys and set it via the `apiKey` parameter or the OPENROUTER_API_KEY environment variable.");
|
|
157
157
|
this.apiKey = apiKey;
|
|
@@ -20,12 +20,23 @@ function convertMessagesToOpenRouterParams(messages, model) {
|
|
|
20
20
|
* Delegates to the OpenAI completions converter for tool call parsing,
|
|
21
21
|
* multi-modal output handling, and audio support, then patches
|
|
22
22
|
* response_metadata to reflect the OpenRouter provider.
|
|
23
|
+
*
|
|
24
|
+
* Reasoning (chain-of-thought) output is preserved on
|
|
25
|
+
* `additional_kwargs.reasoning_content` (flat string, DeepSeek convention)
|
|
26
|
+
* and `additional_kwargs.reasoning_details` (structured array, OpenRouter
|
|
27
|
+
* native shape). Together with the `model_provider: "openrouter"` stamp,
|
|
28
|
+
* this causes `AIMessage.contentBlocks` to emit standard
|
|
29
|
+
* `{type: "reasoning"}` blocks via `ChatOpenRouterTranslator` from
|
|
30
|
+
* `@langchain/core`.
|
|
23
31
|
*/
|
|
24
32
|
function convertOpenRouterResponseToBaseMessage(choice, rawResponse) {
|
|
25
33
|
const message = (0, _langchain_openai.convertCompletionsMessageToBaseMessage)({
|
|
26
34
|
message: choice.message,
|
|
27
35
|
rawResponse
|
|
28
36
|
});
|
|
37
|
+
const assistantMessage = choice.message;
|
|
38
|
+
if (typeof assistantMessage.reasoning === "string" && assistantMessage.reasoning.length > 0) message.additional_kwargs.reasoning_content = assistantMessage.reasoning;
|
|
39
|
+
if (Array.isArray(assistantMessage.reasoning_details) && assistantMessage.reasoning_details.length > 0) message.additional_kwargs.reasoning_details = assistantMessage.reasoning_details;
|
|
29
40
|
message.response_metadata = {
|
|
30
41
|
...message.response_metadata,
|
|
31
42
|
model: rawResponse.model,
|
|
@@ -41,6 +52,13 @@ function convertOpenRouterResponseToBaseMessage(choice, rawResponse) {
|
|
|
41
52
|
* Delegates to the OpenAI completions converter for tool call chunk
|
|
42
53
|
* parsing, audio handling, and role-specific message types, then
|
|
43
54
|
* patches response_metadata to reflect the OpenRouter provider.
|
|
55
|
+
*
|
|
56
|
+
* Reasoning delta text (`delta.reasoning`) and structured reasoning details
|
|
57
|
+
* (`delta.reasoning_details`) are copied onto `additional_kwargs` so they
|
|
58
|
+
* concatenate across chunks under the standard merge rules — string fields
|
|
59
|
+
* are concatenated by `_mergeDicts` and arrays are merged by index-aware
|
|
60
|
+
* `_mergeLists`. See `ChatOpenRouterTranslator` in `@langchain/core` for how
|
|
61
|
+
* the accumulated fields become v1 `{type:"reasoning"}` content blocks.
|
|
44
62
|
*/
|
|
45
63
|
function convertOpenRouterDeltaToBaseMessageChunk(delta, rawChunk, defaultRole) {
|
|
46
64
|
const chunk = (0, _langchain_openai.convertCompletionsDeltaToBaseMessageChunk)({
|
|
@@ -48,6 +66,8 @@ function convertOpenRouterDeltaToBaseMessageChunk(delta, rawChunk, defaultRole)
|
|
|
48
66
|
rawResponse: rawChunk,
|
|
49
67
|
defaultRole: defaultRole ?? "assistant"
|
|
50
68
|
});
|
|
69
|
+
if (typeof delta.reasoning === "string" && delta.reasoning.length > 0) chunk.additional_kwargs.reasoning_content = delta.reasoning;
|
|
70
|
+
if (Array.isArray(delta.reasoning_details) && delta.reasoning_details.length > 0) chunk.additional_kwargs.reasoning_details = delta.reasoning_details;
|
|
51
71
|
chunk.response_metadata = {
|
|
52
72
|
...chunk.response_metadata,
|
|
53
73
|
model_provider: "openrouter"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.cjs","names":[],"sources":["../../src/converters/messages.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n convertMessagesToCompletionsMessageParams,\n convertCompletionsMessageToBaseMessage,\n convertCompletionsDeltaToBaseMessageChunk,\n} from \"@langchain/openai\";\nimport type { OpenAI as OpenAIClient } from \"openai\";\nimport type { OpenRouter } from \"../api-types.js\";\n\n/**\n * The inner data shape of a streaming SSE chunk. Each parsed SSE event\n * contains this object directly (without the `data` wrapper that the\n * OpenAPI spec describes on `ChatStreamingResponseChunk`).\n */\nexport type StreamingChunkData = OpenRouter.ChatStreamingResponseChunk[\"data\"];\n\n// LangChain → OpenRouter\n/**\n * Convert an array of LangChain messages to the OpenRouter request format.\n *\n * Delegates to the OpenAI completions converter since OpenRouter's chat\n * API is wire-compatible with OpenAI's. This gives us full support for\n * standard content blocks, reasoning-model developer role mapping,\n * multi-modal inputs, and all edge cases handled upstream.\n */\nexport function convertMessagesToOpenRouterParams(\n messages: BaseMessage[],\n model?: string\n): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] {\n return convertMessagesToCompletionsMessageParams({\n messages,\n model,\n });\n}\n\n// OpenRouter → LangChain (non-streaming)\n/**\n * Convert a non-streaming OpenRouter response choice into a BaseMessage.\n *\n * Delegates to the OpenAI completions converter for tool call parsing,\n * multi-modal output handling, and audio support, then patches\n * response_metadata to reflect the OpenRouter provider.\n */\nexport function convertOpenRouterResponseToBaseMessage(\n choice: OpenRouter.ChatResponseChoice,\n rawResponse: OpenRouter.ChatResponse\n): BaseMessage {\n const message = convertCompletionsMessageToBaseMessage({\n message:\n choice.message as unknown as OpenAIClient.Chat.Completions.ChatCompletionMessage,\n rawResponse:\n rawResponse as unknown as OpenAIClient.Chat.Completions.ChatCompletion,\n });\n\n message.response_metadata = {\n ...message.response_metadata,\n model: rawResponse.model,\n model_provider: \"openrouter\",\n model_name: rawResponse.model,\n finish_reason: choice.finish_reason,\n };\n\n return message;\n}\n\n// OpenRouter → LangChain (streaming)\n/**\n * Convert a streaming delta into a BaseMessageChunk.\n *\n * Delegates to the OpenAI completions converter for tool call chunk\n * parsing, audio handling, and role-specific message types, then\n * patches response_metadata to reflect the OpenRouter provider.\n */\nexport function convertOpenRouterDeltaToBaseMessageChunk(\n delta: OpenRouter.ChatStreamingMessageChunk,\n rawChunk: StreamingChunkData,\n defaultRole?: string\n): BaseMessageChunk {\n const chunk = convertCompletionsDeltaToBaseMessageChunk({\n delta: delta as Record<string, unknown>,\n rawResponse:\n rawChunk as unknown as OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole: (defaultRole ??\n \"assistant\") as OpenAIClient.Chat.ChatCompletionRole,\n });\n\n chunk.response_metadata = {\n ...chunk.response_metadata,\n model_provider: \"openrouter\",\n };\n\n return chunk;\n}\n\n// Usage metadata\n\n/**\n * Convert OpenRouter usage info to LangChain's `UsageMetadata`,\n * including prompt/completion token detail breakdowns when available.\n */\nexport function convertUsageMetadata(\n usage?: OpenRouter.ChatGenerationTokenUsage\n): UsageMetadata | undefined {\n if (!usage) return undefined;\n\n const result: UsageMetadata = {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n };\n\n const promptDetails = usage.prompt_tokens_details;\n if (promptDetails) {\n const input_token_details: Record<string, number> = {};\n if (promptDetails.cached_tokens != null)\n input_token_details.cache_read = promptDetails.cached_tokens;\n if (promptDetails.audio_tokens != null)\n input_token_details.audio = promptDetails.audio_tokens;\n if (Object.keys(input_token_details).length > 0)\n result.input_token_details = input_token_details;\n }\n\n const completionDetails = usage.completion_tokens_details;\n if (completionDetails) {\n const output_token_details: Record<string, number> = {};\n if (completionDetails.reasoning_tokens != null)\n output_token_details.reasoning = completionDetails.reasoning_tokens;\n if (Object.keys(output_token_details).length > 0)\n result.output_token_details = output_token_details;\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;AA6BA,SAAgB,kCACd,UACA,OAC4D;AAC5D,SAAA,GAAA,kBAAA,2CAAiD;EAC/C;EACA;EACD,CAAC
|
|
1
|
+
{"version":3,"file":"messages.cjs","names":[],"sources":["../../src/converters/messages.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n convertMessagesToCompletionsMessageParams,\n convertCompletionsMessageToBaseMessage,\n convertCompletionsDeltaToBaseMessageChunk,\n} from \"@langchain/openai\";\nimport type { OpenAI as OpenAIClient } from \"openai\";\nimport type { OpenRouter } from \"../api-types.js\";\n\n/**\n * The inner data shape of a streaming SSE chunk. Each parsed SSE event\n * contains this object directly (without the `data` wrapper that the\n * OpenAPI spec describes on `ChatStreamingResponseChunk`).\n */\nexport type StreamingChunkData = OpenRouter.ChatStreamingResponseChunk[\"data\"];\n\n// LangChain → OpenRouter\n/**\n * Convert an array of LangChain messages to the OpenRouter request format.\n *\n * Delegates to the OpenAI completions converter since OpenRouter's chat\n * API is wire-compatible with OpenAI's. This gives us full support for\n * standard content blocks, reasoning-model developer role mapping,\n * multi-modal inputs, and all edge cases handled upstream.\n */\nexport function convertMessagesToOpenRouterParams(\n messages: BaseMessage[],\n model?: string\n): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] {\n return convertMessagesToCompletionsMessageParams({\n messages,\n model,\n });\n}\n\n// OpenRouter → LangChain (non-streaming)\n/**\n * Convert a non-streaming OpenRouter response choice into a BaseMessage.\n *\n * Delegates to the OpenAI completions converter for tool call parsing,\n * multi-modal output handling, and audio support, then patches\n * response_metadata to reflect the OpenRouter provider.\n *\n * Reasoning (chain-of-thought) output is preserved on\n * `additional_kwargs.reasoning_content` (flat string, DeepSeek convention)\n * and `additional_kwargs.reasoning_details` (structured array, OpenRouter\n * native shape). Together with the `model_provider: \"openrouter\"` stamp,\n * this causes `AIMessage.contentBlocks` to emit standard\n * `{type: \"reasoning\"}` blocks via `ChatOpenRouterTranslator` from\n * `@langchain/core`.\n */\nexport function convertOpenRouterResponseToBaseMessage(\n choice: OpenRouter.ChatResponseChoice,\n rawResponse: OpenRouter.ChatResponse\n): BaseMessage {\n const message = convertCompletionsMessageToBaseMessage({\n message:\n choice.message as unknown as OpenAIClient.Chat.Completions.ChatCompletionMessage,\n rawResponse:\n rawResponse as unknown as OpenAIClient.Chat.Completions.ChatCompletion,\n });\n\n // Surface reasoning fields that the OpenAI completions converter doesn't\n // know about. Both are OpenRouter-specific extensions to the Chat\n // Completions response (see `OpenRouter.AssistantMessage` in api-types.ts).\n const assistantMessage = choice.message;\n if (\n typeof assistantMessage.reasoning === \"string\" &&\n assistantMessage.reasoning.length > 0\n ) {\n message.additional_kwargs.reasoning_content = assistantMessage.reasoning;\n }\n if (\n Array.isArray(assistantMessage.reasoning_details) &&\n assistantMessage.reasoning_details.length > 0\n ) {\n message.additional_kwargs.reasoning_details =\n assistantMessage.reasoning_details;\n }\n\n message.response_metadata = {\n ...message.response_metadata,\n model: rawResponse.model,\n model_provider: \"openrouter\",\n model_name: rawResponse.model,\n finish_reason: choice.finish_reason,\n };\n\n return message;\n}\n\n// OpenRouter → LangChain (streaming)\n/**\n * Convert a streaming delta into a BaseMessageChunk.\n *\n * Delegates to the OpenAI completions converter for tool call chunk\n * parsing, audio handling, and role-specific message types, then\n * patches response_metadata to reflect the OpenRouter provider.\n *\n * Reasoning delta text (`delta.reasoning`) and structured reasoning details\n * (`delta.reasoning_details`) are copied onto `additional_kwargs` so they\n * concatenate across chunks under the standard merge rules — string fields\n * are concatenated by `_mergeDicts` and arrays are merged by index-aware\n * `_mergeLists`. See `ChatOpenRouterTranslator` in `@langchain/core` for how\n * the accumulated fields become v1 `{type:\"reasoning\"}` content blocks.\n */\nexport function convertOpenRouterDeltaToBaseMessageChunk(\n delta: OpenRouter.ChatStreamingMessageChunk,\n rawChunk: StreamingChunkData,\n defaultRole?: string\n): BaseMessageChunk {\n const chunk = convertCompletionsDeltaToBaseMessageChunk({\n delta: delta as Record<string, unknown>,\n rawResponse:\n rawChunk as unknown as OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole: (defaultRole ??\n \"assistant\") as OpenAIClient.Chat.ChatCompletionRole,\n });\n\n if (typeof delta.reasoning === \"string\" && delta.reasoning.length > 0) {\n chunk.additional_kwargs.reasoning_content = delta.reasoning;\n }\n if (\n Array.isArray(delta.reasoning_details) &&\n delta.reasoning_details.length > 0\n ) {\n chunk.additional_kwargs.reasoning_details = delta.reasoning_details;\n }\n\n chunk.response_metadata = {\n ...chunk.response_metadata,\n model_provider: \"openrouter\",\n };\n\n return chunk;\n}\n\n// Usage metadata\n\n/**\n * Convert OpenRouter usage info to LangChain's `UsageMetadata`,\n * including prompt/completion token detail breakdowns when available.\n */\nexport function convertUsageMetadata(\n usage?: OpenRouter.ChatGenerationTokenUsage\n): UsageMetadata | undefined {\n if (!usage) return undefined;\n\n const result: UsageMetadata = {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n };\n\n const promptDetails = usage.prompt_tokens_details;\n if (promptDetails) {\n const input_token_details: Record<string, number> = {};\n if (promptDetails.cached_tokens != null)\n input_token_details.cache_read = promptDetails.cached_tokens;\n if (promptDetails.audio_tokens != null)\n input_token_details.audio = promptDetails.audio_tokens;\n if (Object.keys(input_token_details).length > 0)\n result.input_token_details = input_token_details;\n }\n\n const completionDetails = usage.completion_tokens_details;\n if (completionDetails) {\n const output_token_details: Record<string, number> = {};\n if (completionDetails.reasoning_tokens != null)\n output_token_details.reasoning = completionDetails.reasoning_tokens;\n if (Object.keys(output_token_details).length > 0)\n result.output_token_details = output_token_details;\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;AA6BA,SAAgB,kCACd,UACA,OAC4D;AAC5D,SAAA,GAAA,kBAAA,2CAAiD;EAC/C;EACA;EACD,CAAC;;;;;;;;;;;;;;;;;AAmBJ,SAAgB,uCACd,QACA,aACa;CACb,MAAM,WAAA,GAAA,kBAAA,wCAAiD;EACrD,SACE,OAAO;EAEP;EACH,CAAC;CAKF,MAAM,mBAAmB,OAAO;AAChC,KACE,OAAO,iBAAiB,cAAc,YACtC,iBAAiB,UAAU,SAAS,EAEpC,SAAQ,kBAAkB,oBAAoB,iBAAiB;AAEjE,KACE,MAAM,QAAQ,iBAAiB,kBAAkB,IACjD,iBAAiB,kBAAkB,SAAS,EAE5C,SAAQ,kBAAkB,oBACxB,iBAAiB;AAGrB,SAAQ,oBAAoB;EAC1B,GAAG,QAAQ;EACX,OAAO,YAAY;EACnB,gBAAgB;EAChB,YAAY,YAAY;EACxB,eAAe,OAAO;EACvB;AAED,QAAO;;;;;;;;;;;;;;;;AAkBT,SAAgB,yCACd,OACA,UACA,aACkB;CAClB,MAAM,SAAA,GAAA,kBAAA,2CAAkD;EAC/C;EACP,aACE;EACF,aAAc,eACZ;EACH,CAAC;AAEF,KAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,EAClE,OAAM,kBAAkB,oBAAoB,MAAM;AAEpD,KACE,MAAM,QAAQ,MAAM,kBAAkB,IACtC,MAAM,kBAAkB,SAAS,EAEjC,OAAM,kBAAkB,oBAAoB,MAAM;AAGpD,OAAM,oBAAoB;EACxB,GAAG,MAAM;EACT,gBAAgB;EACjB;AAED,QAAO;;;;;;AAST,SAAgB,qBACd,OAC2B;AAC3B,KAAI,CAAC,MAAO,QAAO,KAAA;CAEnB,MAAM,SAAwB;EAC5B,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,cAAc,MAAM;EACrB;CAED,MAAM,gBAAgB,MAAM;AAC5B,KAAI,eAAe;EACjB,MAAM,sBAA8C,EAAE;AACtD,MAAI,cAAc,iBAAiB,KACjC,qBAAoB,aAAa,cAAc;AACjD,MAAI,cAAc,gBAAgB,KAChC,qBAAoB,QAAQ,cAAc;AAC5C,MAAI,OAAO,KAAK,oBAAoB,CAAC,SAAS,EAC5C,QAAO,sBAAsB;;CAGjC,MAAM,oBAAoB,MAAM;AAChC,KAAI,mBAAmB;EACrB,MAAM,uBAA+C,EAAE;AACvD,MAAI,kBAAkB,oBAAoB,KACxC,sBAAqB,YAAY,kBAAkB;AACrD,MAAI,OAAO,KAAK,qBAAqB,CAAC,SAAS,EAC7C,QAAO,uBAAuB;;AAGlC,QAAO"}
|
|
@@ -20,12 +20,23 @@ function convertMessagesToOpenRouterParams(messages, model) {
|
|
|
20
20
|
* Delegates to the OpenAI completions converter for tool call parsing,
|
|
21
21
|
* multi-modal output handling, and audio support, then patches
|
|
22
22
|
* response_metadata to reflect the OpenRouter provider.
|
|
23
|
+
*
|
|
24
|
+
* Reasoning (chain-of-thought) output is preserved on
|
|
25
|
+
* `additional_kwargs.reasoning_content` (flat string, DeepSeek convention)
|
|
26
|
+
* and `additional_kwargs.reasoning_details` (structured array, OpenRouter
|
|
27
|
+
* native shape). Together with the `model_provider: "openrouter"` stamp,
|
|
28
|
+
* this causes `AIMessage.contentBlocks` to emit standard
|
|
29
|
+
* `{type: "reasoning"}` blocks via `ChatOpenRouterTranslator` from
|
|
30
|
+
* `@langchain/core`.
|
|
23
31
|
*/
|
|
24
32
|
function convertOpenRouterResponseToBaseMessage(choice, rawResponse) {
|
|
25
33
|
const message = convertCompletionsMessageToBaseMessage({
|
|
26
34
|
message: choice.message,
|
|
27
35
|
rawResponse
|
|
28
36
|
});
|
|
37
|
+
const assistantMessage = choice.message;
|
|
38
|
+
if (typeof assistantMessage.reasoning === "string" && assistantMessage.reasoning.length > 0) message.additional_kwargs.reasoning_content = assistantMessage.reasoning;
|
|
39
|
+
if (Array.isArray(assistantMessage.reasoning_details) && assistantMessage.reasoning_details.length > 0) message.additional_kwargs.reasoning_details = assistantMessage.reasoning_details;
|
|
29
40
|
message.response_metadata = {
|
|
30
41
|
...message.response_metadata,
|
|
31
42
|
model: rawResponse.model,
|
|
@@ -41,6 +52,13 @@ function convertOpenRouterResponseToBaseMessage(choice, rawResponse) {
|
|
|
41
52
|
* Delegates to the OpenAI completions converter for tool call chunk
|
|
42
53
|
* parsing, audio handling, and role-specific message types, then
|
|
43
54
|
* patches response_metadata to reflect the OpenRouter provider.
|
|
55
|
+
*
|
|
56
|
+
* Reasoning delta text (`delta.reasoning`) and structured reasoning details
|
|
57
|
+
* (`delta.reasoning_details`) are copied onto `additional_kwargs` so they
|
|
58
|
+
* concatenate across chunks under the standard merge rules — string fields
|
|
59
|
+
* are concatenated by `_mergeDicts` and arrays are merged by index-aware
|
|
60
|
+
* `_mergeLists`. See `ChatOpenRouterTranslator` in `@langchain/core` for how
|
|
61
|
+
* the accumulated fields become v1 `{type:"reasoning"}` content blocks.
|
|
44
62
|
*/
|
|
45
63
|
function convertOpenRouterDeltaToBaseMessageChunk(delta, rawChunk, defaultRole) {
|
|
46
64
|
const chunk = convertCompletionsDeltaToBaseMessageChunk({
|
|
@@ -48,6 +66,8 @@ function convertOpenRouterDeltaToBaseMessageChunk(delta, rawChunk, defaultRole)
|
|
|
48
66
|
rawResponse: rawChunk,
|
|
49
67
|
defaultRole: defaultRole ?? "assistant"
|
|
50
68
|
});
|
|
69
|
+
if (typeof delta.reasoning === "string" && delta.reasoning.length > 0) chunk.additional_kwargs.reasoning_content = delta.reasoning;
|
|
70
|
+
if (Array.isArray(delta.reasoning_details) && delta.reasoning_details.length > 0) chunk.additional_kwargs.reasoning_details = delta.reasoning_details;
|
|
51
71
|
chunk.response_metadata = {
|
|
52
72
|
...chunk.response_metadata,
|
|
53
73
|
model_provider: "openrouter"
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"messages.js","names":[],"sources":["../../src/converters/messages.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n convertMessagesToCompletionsMessageParams,\n convertCompletionsMessageToBaseMessage,\n convertCompletionsDeltaToBaseMessageChunk,\n} from \"@langchain/openai\";\nimport type { OpenAI as OpenAIClient } from \"openai\";\nimport type { OpenRouter } from \"../api-types.js\";\n\n/**\n * The inner data shape of a streaming SSE chunk. Each parsed SSE event\n * contains this object directly (without the `data` wrapper that the\n * OpenAPI spec describes on `ChatStreamingResponseChunk`).\n */\nexport type StreamingChunkData = OpenRouter.ChatStreamingResponseChunk[\"data\"];\n\n// LangChain → OpenRouter\n/**\n * Convert an array of LangChain messages to the OpenRouter request format.\n *\n * Delegates to the OpenAI completions converter since OpenRouter's chat\n * API is wire-compatible with OpenAI's. This gives us full support for\n * standard content blocks, reasoning-model developer role mapping,\n * multi-modal inputs, and all edge cases handled upstream.\n */\nexport function convertMessagesToOpenRouterParams(\n messages: BaseMessage[],\n model?: string\n): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] {\n return convertMessagesToCompletionsMessageParams({\n messages,\n model,\n });\n}\n\n// OpenRouter → LangChain (non-streaming)\n/**\n * Convert a non-streaming OpenRouter response choice into a BaseMessage.\n *\n * Delegates to the OpenAI completions converter for tool call parsing,\n * multi-modal output handling, and audio support, then patches\n * response_metadata to reflect the OpenRouter provider.\n */\nexport function convertOpenRouterResponseToBaseMessage(\n choice: OpenRouter.ChatResponseChoice,\n rawResponse: OpenRouter.ChatResponse\n): BaseMessage {\n const message = convertCompletionsMessageToBaseMessage({\n message:\n choice.message as unknown as OpenAIClient.Chat.Completions.ChatCompletionMessage,\n rawResponse:\n rawResponse as unknown as OpenAIClient.Chat.Completions.ChatCompletion,\n });\n\n message.response_metadata = {\n ...message.response_metadata,\n model: rawResponse.model,\n model_provider: \"openrouter\",\n model_name: rawResponse.model,\n finish_reason: choice.finish_reason,\n };\n\n return message;\n}\n\n// OpenRouter → LangChain (streaming)\n/**\n * Convert a streaming delta into a BaseMessageChunk.\n *\n * Delegates to the OpenAI completions converter for tool call chunk\n * parsing, audio handling, and role-specific message types, then\n * patches response_metadata to reflect the OpenRouter provider.\n */\nexport function convertOpenRouterDeltaToBaseMessageChunk(\n delta: OpenRouter.ChatStreamingMessageChunk,\n rawChunk: StreamingChunkData,\n defaultRole?: string\n): BaseMessageChunk {\n const chunk = convertCompletionsDeltaToBaseMessageChunk({\n delta: delta as Record<string, unknown>,\n rawResponse:\n rawChunk as unknown as OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole: (defaultRole ??\n \"assistant\") as OpenAIClient.Chat.ChatCompletionRole,\n });\n\n chunk.response_metadata = {\n ...chunk.response_metadata,\n model_provider: \"openrouter\",\n };\n\n return chunk;\n}\n\n// Usage metadata\n\n/**\n * Convert OpenRouter usage info to LangChain's `UsageMetadata`,\n * including prompt/completion token detail breakdowns when available.\n */\nexport function convertUsageMetadata(\n usage?: OpenRouter.ChatGenerationTokenUsage\n): UsageMetadata | undefined {\n if (!usage) return undefined;\n\n const result: UsageMetadata = {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n };\n\n const promptDetails = usage.prompt_tokens_details;\n if (promptDetails) {\n const input_token_details: Record<string, number> = {};\n if (promptDetails.cached_tokens != null)\n input_token_details.cache_read = promptDetails.cached_tokens;\n if (promptDetails.audio_tokens != null)\n input_token_details.audio = promptDetails.audio_tokens;\n if (Object.keys(input_token_details).length > 0)\n result.input_token_details = input_token_details;\n }\n\n const completionDetails = usage.completion_tokens_details;\n if (completionDetails) {\n const output_token_details: Record<string, number> = {};\n if (completionDetails.reasoning_tokens != null)\n output_token_details.reasoning = completionDetails.reasoning_tokens;\n if (Object.keys(output_token_details).length > 0)\n result.output_token_details = output_token_details;\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;AA6BA,SAAgB,kCACd,UACA,OAC4D;AAC5D,QAAO,0CAA0C;EAC/C;EACA;EACD,CAAC
|
|
1
|
+
{"version":3,"file":"messages.js","names":[],"sources":["../../src/converters/messages.ts"],"sourcesContent":["import {\n BaseMessage,\n BaseMessageChunk,\n UsageMetadata,\n} from \"@langchain/core/messages\";\nimport {\n convertMessagesToCompletionsMessageParams,\n convertCompletionsMessageToBaseMessage,\n convertCompletionsDeltaToBaseMessageChunk,\n} from \"@langchain/openai\";\nimport type { OpenAI as OpenAIClient } from \"openai\";\nimport type { OpenRouter } from \"../api-types.js\";\n\n/**\n * The inner data shape of a streaming SSE chunk. Each parsed SSE event\n * contains this object directly (without the `data` wrapper that the\n * OpenAPI spec describes on `ChatStreamingResponseChunk`).\n */\nexport type StreamingChunkData = OpenRouter.ChatStreamingResponseChunk[\"data\"];\n\n// LangChain → OpenRouter\n/**\n * Convert an array of LangChain messages to the OpenRouter request format.\n *\n * Delegates to the OpenAI completions converter since OpenRouter's chat\n * API is wire-compatible with OpenAI's. This gives us full support for\n * standard content blocks, reasoning-model developer role mapping,\n * multi-modal inputs, and all edge cases handled upstream.\n */\nexport function convertMessagesToOpenRouterParams(\n messages: BaseMessage[],\n model?: string\n): OpenAIClient.Chat.Completions.ChatCompletionMessageParam[] {\n return convertMessagesToCompletionsMessageParams({\n messages,\n model,\n });\n}\n\n// OpenRouter → LangChain (non-streaming)\n/**\n * Convert a non-streaming OpenRouter response choice into a BaseMessage.\n *\n * Delegates to the OpenAI completions converter for tool call parsing,\n * multi-modal output handling, and audio support, then patches\n * response_metadata to reflect the OpenRouter provider.\n *\n * Reasoning (chain-of-thought) output is preserved on\n * `additional_kwargs.reasoning_content` (flat string, DeepSeek convention)\n * and `additional_kwargs.reasoning_details` (structured array, OpenRouter\n * native shape). Together with the `model_provider: \"openrouter\"` stamp,\n * this causes `AIMessage.contentBlocks` to emit standard\n * `{type: \"reasoning\"}` blocks via `ChatOpenRouterTranslator` from\n * `@langchain/core`.\n */\nexport function convertOpenRouterResponseToBaseMessage(\n choice: OpenRouter.ChatResponseChoice,\n rawResponse: OpenRouter.ChatResponse\n): BaseMessage {\n const message = convertCompletionsMessageToBaseMessage({\n message:\n choice.message as unknown as OpenAIClient.Chat.Completions.ChatCompletionMessage,\n rawResponse:\n rawResponse as unknown as OpenAIClient.Chat.Completions.ChatCompletion,\n });\n\n // Surface reasoning fields that the OpenAI completions converter doesn't\n // know about. Both are OpenRouter-specific extensions to the Chat\n // Completions response (see `OpenRouter.AssistantMessage` in api-types.ts).\n const assistantMessage = choice.message;\n if (\n typeof assistantMessage.reasoning === \"string\" &&\n assistantMessage.reasoning.length > 0\n ) {\n message.additional_kwargs.reasoning_content = assistantMessage.reasoning;\n }\n if (\n Array.isArray(assistantMessage.reasoning_details) &&\n assistantMessage.reasoning_details.length > 0\n ) {\n message.additional_kwargs.reasoning_details =\n assistantMessage.reasoning_details;\n }\n\n message.response_metadata = {\n ...message.response_metadata,\n model: rawResponse.model,\n model_provider: \"openrouter\",\n model_name: rawResponse.model,\n finish_reason: choice.finish_reason,\n };\n\n return message;\n}\n\n// OpenRouter → LangChain (streaming)\n/**\n * Convert a streaming delta into a BaseMessageChunk.\n *\n * Delegates to the OpenAI completions converter for tool call chunk\n * parsing, audio handling, and role-specific message types, then\n * patches response_metadata to reflect the OpenRouter provider.\n *\n * Reasoning delta text (`delta.reasoning`) and structured reasoning details\n * (`delta.reasoning_details`) are copied onto `additional_kwargs` so they\n * concatenate across chunks under the standard merge rules — string fields\n * are concatenated by `_mergeDicts` and arrays are merged by index-aware\n * `_mergeLists`. See `ChatOpenRouterTranslator` in `@langchain/core` for how\n * the accumulated fields become v1 `{type:\"reasoning\"}` content blocks.\n */\nexport function convertOpenRouterDeltaToBaseMessageChunk(\n delta: OpenRouter.ChatStreamingMessageChunk,\n rawChunk: StreamingChunkData,\n defaultRole?: string\n): BaseMessageChunk {\n const chunk = convertCompletionsDeltaToBaseMessageChunk({\n delta: delta as Record<string, unknown>,\n rawResponse:\n rawChunk as unknown as OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole: (defaultRole ??\n \"assistant\") as OpenAIClient.Chat.ChatCompletionRole,\n });\n\n if (typeof delta.reasoning === \"string\" && delta.reasoning.length > 0) {\n chunk.additional_kwargs.reasoning_content = delta.reasoning;\n }\n if (\n Array.isArray(delta.reasoning_details) &&\n delta.reasoning_details.length > 0\n ) {\n chunk.additional_kwargs.reasoning_details = delta.reasoning_details;\n }\n\n chunk.response_metadata = {\n ...chunk.response_metadata,\n model_provider: \"openrouter\",\n };\n\n return chunk;\n}\n\n// Usage metadata\n\n/**\n * Convert OpenRouter usage info to LangChain's `UsageMetadata`,\n * including prompt/completion token detail breakdowns when available.\n */\nexport function convertUsageMetadata(\n usage?: OpenRouter.ChatGenerationTokenUsage\n): UsageMetadata | undefined {\n if (!usage) return undefined;\n\n const result: UsageMetadata = {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n };\n\n const promptDetails = usage.prompt_tokens_details;\n if (promptDetails) {\n const input_token_details: Record<string, number> = {};\n if (promptDetails.cached_tokens != null)\n input_token_details.cache_read = promptDetails.cached_tokens;\n if (promptDetails.audio_tokens != null)\n input_token_details.audio = promptDetails.audio_tokens;\n if (Object.keys(input_token_details).length > 0)\n result.input_token_details = input_token_details;\n }\n\n const completionDetails = usage.completion_tokens_details;\n if (completionDetails) {\n const output_token_details: Record<string, number> = {};\n if (completionDetails.reasoning_tokens != null)\n output_token_details.reasoning = completionDetails.reasoning_tokens;\n if (Object.keys(output_token_details).length > 0)\n result.output_token_details = output_token_details;\n }\n\n return result;\n}\n"],"mappings":";;;;;;;;;;AA6BA,SAAgB,kCACd,UACA,OAC4D;AAC5D,QAAO,0CAA0C;EAC/C;EACA;EACD,CAAC;;;;;;;;;;;;;;;;;AAmBJ,SAAgB,uCACd,QACA,aACa;CACb,MAAM,UAAU,uCAAuC;EACrD,SACE,OAAO;EAEP;EACH,CAAC;CAKF,MAAM,mBAAmB,OAAO;AAChC,KACE,OAAO,iBAAiB,cAAc,YACtC,iBAAiB,UAAU,SAAS,EAEpC,SAAQ,kBAAkB,oBAAoB,iBAAiB;AAEjE,KACE,MAAM,QAAQ,iBAAiB,kBAAkB,IACjD,iBAAiB,kBAAkB,SAAS,EAE5C,SAAQ,kBAAkB,oBACxB,iBAAiB;AAGrB,SAAQ,oBAAoB;EAC1B,GAAG,QAAQ;EACX,OAAO,YAAY;EACnB,gBAAgB;EAChB,YAAY,YAAY;EACxB,eAAe,OAAO;EACvB;AAED,QAAO;;;;;;;;;;;;;;;;AAkBT,SAAgB,yCACd,OACA,UACA,aACkB;CAClB,MAAM,QAAQ,0CAA0C;EAC/C;EACP,aACE;EACF,aAAc,eACZ;EACH,CAAC;AAEF,KAAI,OAAO,MAAM,cAAc,YAAY,MAAM,UAAU,SAAS,EAClE,OAAM,kBAAkB,oBAAoB,MAAM;AAEpD,KACE,MAAM,QAAQ,MAAM,kBAAkB,IACtC,MAAM,kBAAkB,SAAS,EAEjC,OAAM,kBAAkB,oBAAoB,MAAM;AAGpD,OAAM,oBAAoB;EACxB,GAAG,MAAM;EACT,gBAAgB;EACjB;AAED,QAAO;;;;;;AAST,SAAgB,qBACd,OAC2B;AAC3B,KAAI,CAAC,MAAO,QAAO,KAAA;CAEnB,MAAM,SAAwB;EAC5B,cAAc,MAAM;EACpB,eAAe,MAAM;EACrB,cAAc,MAAM;EACrB;CAED,MAAM,gBAAgB,MAAM;AAC5B,KAAI,eAAe;EACjB,MAAM,sBAA8C,EAAE;AACtD,MAAI,cAAc,iBAAiB,KACjC,qBAAoB,aAAa,cAAc;AACjD,MAAI,cAAc,gBAAgB,KAChC,qBAAoB,QAAQ,cAAc;AAC5C,MAAI,OAAO,KAAK,oBAAoB,CAAC,SAAS,EAC5C,QAAO,sBAAsB;;CAGjC,MAAM,oBAAoB,MAAM;AAChC,KAAI,mBAAmB;EACrB,MAAM,uBAA+C,EAAE;AACvD,MAAI,kBAAkB,oBAAoB,KACxC,sBAAqB,YAAY,kBAAkB;AACrD,MAAI,OAAO,KAAK,qBAAqB,CAAC,SAAS,EAC7C,QAAO,uBAAuB;;AAGlC,QAAO"}
|
package/dist/index.cjs
CHANGED
|
@@ -2,8 +2,13 @@ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
|
|
|
2
2
|
const require_errors = require("./utils/errors.cjs");
|
|
3
3
|
const require_profiles = require("./profiles.cjs");
|
|
4
4
|
const require_index = require("./chat_models/index.cjs");
|
|
5
|
+
//#region src/index.ts
|
|
6
|
+
const OPENROUTER_MODEL_PROFILES = require_profiles.default;
|
|
7
|
+
//#endregion
|
|
5
8
|
exports.ChatOpenRouter = require_index.ChatOpenRouter;
|
|
6
|
-
exports.OPENROUTER_MODEL_PROFILES =
|
|
9
|
+
exports.OPENROUTER_MODEL_PROFILES = OPENROUTER_MODEL_PROFILES;
|
|
7
10
|
exports.OpenRouterAuthError = require_errors.OpenRouterAuthError;
|
|
8
11
|
exports.OpenRouterError = require_errors.OpenRouterError;
|
|
9
12
|
exports.OpenRouterRateLimitError = require_errors.OpenRouterRateLimitError;
|
|
13
|
+
|
|
14
|
+
//# sourceMappingURL=index.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.cjs","names":["_OPENROUTER_MODEL_PROFILES"],"sources":["../src/index.ts"],"sourcesContent":["export { ChatOpenRouter } from \"./chat_models/index.js\";\nexport type {\n ChatOpenRouterParams as ChatOpenRouterInput,\n ChatOpenRouterCallOptions,\n ChatOpenRouterFields,\n OpenRouterResponseFormat,\n OpenRouterPlugin,\n} from \"./chat_models/types.js\";\nexport type { OpenRouter } from \"./api-types.js\";\nexport {\n OpenRouterError,\n OpenRouterAuthError,\n OpenRouterRateLimitError,\n} from \"./utils/errors.js\";\nimport _OPENROUTER_MODEL_PROFILES from \"./profiles.js\";\n\nexport const OPENROUTER_MODEL_PROFILES = _OPENROUTER_MODEL_PROFILES;\n"],"mappings":";;;;;AAgBA,MAAa,4BAA4BA,iBAAAA"}
|
package/dist/index.d.cts
CHANGED
|
@@ -2,5 +2,10 @@ import { OpenRouter } from "./api-types.cjs";
|
|
|
2
2
|
import { ChatOpenRouterCallOptions, ChatOpenRouterFields, ChatOpenRouterParams, OpenRouterPlugin, OpenRouterResponseFormat } from "./chat_models/types.cjs";
|
|
3
3
|
import { ChatOpenRouter } from "./chat_models/index.cjs";
|
|
4
4
|
import { OpenRouterAuthError, OpenRouterError, OpenRouterRateLimitError } from "./utils/errors.cjs";
|
|
5
|
-
import
|
|
6
|
-
|
|
5
|
+
import * as _$_langchain_core_language_models_profile0 from "@langchain/core/language_models/profile";
|
|
6
|
+
|
|
7
|
+
//#region src/index.d.ts
|
|
8
|
+
declare const OPENROUTER_MODEL_PROFILES: Record<string, _$_langchain_core_language_models_profile0.ModelProfile>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { ChatOpenRouter, type ChatOpenRouterCallOptions, type ChatOpenRouterFields, type ChatOpenRouterParams as ChatOpenRouterInput, OPENROUTER_MODEL_PROFILES, type OpenRouter, OpenRouterAuthError, OpenRouterError, type OpenRouterPlugin, OpenRouterRateLimitError, type OpenRouterResponseFormat };
|
|
11
|
+
//# sourceMappingURL=index.d.cts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.cts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;cAgBa,yBAAA,EAAyB,MAAA,SAA6B,0CAAA,CAA7B,YAAA"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,5 +2,10 @@ import { OpenRouter } from "./api-types.js";
|
|
|
2
2
|
import { ChatOpenRouterCallOptions, ChatOpenRouterFields, ChatOpenRouterParams, OpenRouterPlugin, OpenRouterResponseFormat } from "./chat_models/types.js";
|
|
3
3
|
import { ChatOpenRouter } from "./chat_models/index.js";
|
|
4
4
|
import { OpenRouterAuthError, OpenRouterError, OpenRouterRateLimitError } from "./utils/errors.js";
|
|
5
|
-
import
|
|
6
|
-
|
|
5
|
+
import * as _$_langchain_core_language_models_profile0 from "@langchain/core/language_models/profile";
|
|
6
|
+
|
|
7
|
+
//#region src/index.d.ts
|
|
8
|
+
declare const OPENROUTER_MODEL_PROFILES: Record<string, _$_langchain_core_language_models_profile0.ModelProfile>;
|
|
9
|
+
//#endregion
|
|
10
|
+
export { ChatOpenRouter, type ChatOpenRouterCallOptions, type ChatOpenRouterFields, type ChatOpenRouterParams as ChatOpenRouterInput, OPENROUTER_MODEL_PROFILES, type OpenRouter, OpenRouterAuthError, OpenRouterError, type OpenRouterPlugin, OpenRouterRateLimitError, type OpenRouterResponseFormat };
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":[],"sources":["../src/index.ts"],"mappings":";;;;;;;cAgBa,yBAAA,EAAyB,MAAA,SAA6B,0CAAA,CAA7B,YAAA"}
|
package/dist/index.js
CHANGED
|
@@ -1,4 +1,9 @@
|
|
|
1
1
|
import { OpenRouterAuthError, OpenRouterError, OpenRouterRateLimitError } from "./utils/errors.js";
|
|
2
2
|
import PROFILES from "./profiles.js";
|
|
3
3
|
import { ChatOpenRouter } from "./chat_models/index.js";
|
|
4
|
-
|
|
4
|
+
//#region src/index.ts
|
|
5
|
+
const OPENROUTER_MODEL_PROFILES = PROFILES;
|
|
6
|
+
//#endregion
|
|
7
|
+
export { ChatOpenRouter, OPENROUTER_MODEL_PROFILES, OpenRouterAuthError, OpenRouterError, OpenRouterRateLimitError };
|
|
8
|
+
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","names":["_OPENROUTER_MODEL_PROFILES"],"sources":["../src/index.ts"],"sourcesContent":["export { ChatOpenRouter } from \"./chat_models/index.js\";\nexport type {\n ChatOpenRouterParams as ChatOpenRouterInput,\n ChatOpenRouterCallOptions,\n ChatOpenRouterFields,\n OpenRouterResponseFormat,\n OpenRouterPlugin,\n} from \"./chat_models/types.js\";\nexport type { OpenRouter } from \"./api-types.js\";\nexport {\n OpenRouterError,\n OpenRouterAuthError,\n OpenRouterRateLimitError,\n} from \"./utils/errors.js\";\nimport _OPENROUTER_MODEL_PROFILES from \"./profiles.js\";\n\nexport const OPENROUTER_MODEL_PROFILES = _OPENROUTER_MODEL_PROFILES;\n"],"mappings":";;;;AAgBA,MAAa,4BAA4BA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@langchain/openrouter",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "OpenRouter integration for LangChain.js",
|
|
5
5
|
"author": "LangChain",
|
|
6
6
|
"license": "MIT",
|
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"eventsource-parser": "^3.0.6",
|
|
18
18
|
"openai": "^6.37.0",
|
|
19
|
-
"@langchain/openai": "1.4.
|
|
19
|
+
"@langchain/openai": "1.4.7"
|
|
20
20
|
},
|
|
21
21
|
"peerDependencies": {
|
|
22
22
|
"@langchain/core": "^1.0.0"
|
|
@@ -29,9 +29,9 @@
|
|
|
29
29
|
"vitest": "^4.1.2",
|
|
30
30
|
"zod": "^3.25.76 || ^4",
|
|
31
31
|
"zod-to-json-schema": "^3.25.2",
|
|
32
|
-
"@langchain/openai": "^1.4.
|
|
33
|
-
"@langchain/
|
|
34
|
-
"@langchain/
|
|
32
|
+
"@langchain/openai": "^1.4.7",
|
|
33
|
+
"@langchain/standard-tests": "0.0.23",
|
|
34
|
+
"@langchain/core": "^1.1.48"
|
|
35
35
|
},
|
|
36
36
|
"publishConfig": {
|
|
37
37
|
"access": "public"
|
package/dist/profiles.d.cts
DELETED
package/dist/profiles.d.cts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.cts","names":[],"sources":["../src/profiles.ts"],"mappings":";;;cAIM,QAAA,EAAU,MAAA,SAAe,YAAA"}
|
package/dist/profiles.d.ts
DELETED
package/dist/profiles.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"profiles.d.ts","names":[],"sources":["../src/profiles.ts"],"mappings":";;;cAIM,QAAA,EAAU,MAAA,SAAe,YAAA"}
|