@librechat/agents 2.4.15 → 2.4.16

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.
Files changed (41) hide show
  1. package/dist/cjs/llm/anthropic/{llm.cjs → index.cjs} +19 -8
  2. package/dist/cjs/llm/anthropic/index.cjs.map +1 -0
  3. package/dist/cjs/llm/openai/index.cjs +140 -0
  4. package/dist/cjs/llm/openai/index.cjs.map +1 -0
  5. package/dist/cjs/llm/openrouter/{llm.cjs → index.cjs} +4 -4
  6. package/dist/cjs/llm/openrouter/index.cjs.map +1 -0
  7. package/dist/cjs/llm/providers.cjs +9 -11
  8. package/dist/cjs/llm/providers.cjs.map +1 -1
  9. package/dist/cjs/main.cjs +2 -0
  10. package/dist/cjs/main.cjs.map +1 -1
  11. package/dist/esm/graphs/Graph.mjs +2 -2
  12. package/dist/esm/graphs/Graph.mjs.map +1 -1
  13. package/dist/esm/llm/anthropic/{llm.mjs → index.mjs} +19 -8
  14. package/dist/esm/llm/anthropic/index.mjs.map +1 -0
  15. package/dist/esm/llm/openai/index.mjs +134 -0
  16. package/dist/esm/llm/openai/index.mjs.map +1 -0
  17. package/dist/esm/llm/openrouter/{llm.mjs → index.mjs} +3 -3
  18. package/dist/esm/llm/openrouter/index.mjs.map +1 -0
  19. package/dist/esm/llm/providers.mjs +3 -5
  20. package/dist/esm/llm/providers.mjs.map +1 -1
  21. package/dist/esm/main.mjs +1 -0
  22. package/dist/esm/main.mjs.map +1 -1
  23. package/dist/esm/run.mjs +2 -2
  24. package/dist/esm/run.mjs.map +1 -1
  25. package/dist/types/index.d.ts +1 -0
  26. package/dist/types/llm/openai/index.d.ts +19 -0
  27. package/dist/types/llm/openrouter/{llm.d.ts → index.d.ts} +2 -2
  28. package/dist/types/types/llm.d.ts +5 -7
  29. package/package.json +2 -2
  30. package/src/index.ts +4 -1
  31. package/src/llm/anthropic/{llm.ts → index.ts} +62 -19
  32. package/src/llm/openai/index.ts +164 -0
  33. package/src/llm/openrouter/{llm.ts → index.ts} +27 -13
  34. package/src/llm/providers.ts +8 -5
  35. package/src/types/llm.ts +11 -11
  36. package/src/utils/llmConfig.ts +1 -1
  37. package/dist/cjs/llm/anthropic/llm.cjs.map +0 -1
  38. package/dist/cjs/llm/openrouter/llm.cjs.map +0 -1
  39. package/dist/esm/llm/anthropic/llm.mjs.map +0 -1
  40. package/dist/esm/llm/openrouter/llm.mjs.map +0 -1
  41. /package/dist/types/llm/anthropic/{llm.d.ts → index.d.ts} +0 -0
@@ -2,10 +2,19 @@ import { AIMessageChunk } from '@langchain/core/messages';
2
2
  import { ChatAnthropicMessages } from '@langchain/anthropic';
3
3
  import { ChatGenerationChunk } from '@langchain/core/outputs';
4
4
  import type { BaseChatModelParams } from '@langchain/core/language_models/chat_models';
5
- import type { BaseMessage, MessageContentComplex } from '@langchain/core/messages';
5
+ import type {
6
+ BaseMessage,
7
+ MessageContentComplex,
8
+ } from '@langchain/core/messages';
6
9
  import type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';
7
10
  import type { AnthropicInput } from '@langchain/anthropic';
8
- import type { AnthropicMessageCreateParams, AnthropicStreamingMessageCreateParams, AnthropicStreamUsage, AnthropicMessageStartEvent, AnthropicMessageDeltaEvent } from '@/llm/anthropic/types';
11
+ import type {
12
+ AnthropicMessageCreateParams,
13
+ AnthropicStreamingMessageCreateParams,
14
+ AnthropicStreamUsage,
15
+ AnthropicMessageStartEvent,
16
+ AnthropicMessageDeltaEvent,
17
+ } from '@/llm/anthropic/types';
9
18
  import { _makeMessageChunkFromAnthropicEvent } from './utils/message_outputs';
10
19
  import { _convertMessagesToAnthropicPayload } from './utils/message_inputs';
11
20
  import { TextStream } from '@/llm/text';
@@ -43,7 +52,9 @@ function _thinkingInParams(
43
52
  return !!(params.thinking && params.thinking.type === 'enabled');
44
53
  }
45
54
 
46
- function extractToken(chunk: AIMessageChunk): [string, 'string' | 'input' | 'content'] | [undefined] {
55
+ function extractToken(
56
+ chunk: AIMessageChunk
57
+ ): [string, 'string' | 'input' | 'content'] | [undefined] {
47
58
  if (typeof chunk.content === 'string') {
48
59
  return [chunk.content, 'string'];
49
60
  } else if (
@@ -70,7 +81,11 @@ function extractToken(chunk: AIMessageChunk): [string, 'string' | 'input' | 'con
70
81
  return [undefined];
71
82
  }
72
83
 
73
- function cloneChunk(text: string, tokenType: string, chunk: AIMessageChunk): AIMessageChunk {
84
+ function cloneChunk(
85
+ text: string,
86
+ tokenType: string,
87
+ chunk: AIMessageChunk
88
+ ): AIMessageChunk {
74
89
  if (tokenType === 'string') {
75
90
  return new AIMessageChunk(Object.assign({}, chunk, { content: text }));
76
91
  } else if (tokenType === 'input') {
@@ -78,17 +93,31 @@ function cloneChunk(text: string, tokenType: string, chunk: AIMessageChunk): AIM
78
93
  }
79
94
  const content = chunk.content[0] as MessageContentComplex;
80
95
  if (tokenType === 'content' && content.type === 'text') {
81
- return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { text })] }));
96
+ return new AIMessageChunk(
97
+ Object.assign({}, chunk, {
98
+ content: [Object.assign({}, content, { text })],
99
+ })
100
+ );
82
101
  } else if (tokenType === 'content' && content.type === 'text_delta') {
83
- return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { text })] }));
102
+ return new AIMessageChunk(
103
+ Object.assign({}, chunk, {
104
+ content: [Object.assign({}, content, { text })],
105
+ })
106
+ );
84
107
  } else if (tokenType === 'content' && content.type?.startsWith('thinking')) {
85
- return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { thinking: text })] }));
108
+ return new AIMessageChunk(
109
+ Object.assign({}, chunk, {
110
+ content: [Object.assign({}, content, { thinking: text })],
111
+ })
112
+ );
86
113
  }
87
114
 
88
115
  return chunk;
89
116
  }
90
117
 
91
- export type CustomAnthropicInput = AnthropicInput & { _lc_stream_delay?: number } & BaseChatModelParams;
118
+ export type CustomAnthropicInput = AnthropicInput & {
119
+ _lc_stream_delay?: number;
120
+ } & BaseChatModelParams;
92
121
 
93
122
  export class CustomAnthropic extends ChatAnthropicMessages {
94
123
  _lc_stream_delay: number;
@@ -109,18 +138,26 @@ export class CustomAnthropic extends ChatAnthropicMessages {
109
138
  if (this.emitted_usage === true) {
110
139
  return;
111
140
  }
112
- const inputUsage = (this.message_start?.message)?.usage as undefined | AnthropicStreamUsage;
113
- const outputUsage = this.message_delta?.usage as undefined | Partial<AnthropicStreamUsage>;
141
+ const inputUsage = this.message_start?.message.usage as
142
+ | undefined
143
+ | AnthropicStreamUsage;
144
+ const outputUsage = this.message_delta?.usage as
145
+ | undefined
146
+ | Partial<AnthropicStreamUsage>;
114
147
  if (!outputUsage) {
115
148
  return;
116
149
  }
117
150
  const totalUsage: AnthropicStreamUsage = {
118
151
  input_tokens: inputUsage?.input_tokens ?? 0,
119
152
  output_tokens: outputUsage.output_tokens ?? 0,
120
- total_tokens: (inputUsage?.input_tokens ?? 0) + (outputUsage.output_tokens ?? 0),
153
+ total_tokens:
154
+ (inputUsage?.input_tokens ?? 0) + (outputUsage.output_tokens ?? 0),
121
155
  };
122
156
 
123
- if (inputUsage?.cache_creation_input_tokens != null || inputUsage?.cache_read_input_tokens != null) {
157
+ if (
158
+ inputUsage?.cache_creation_input_tokens != null ||
159
+ inputUsage?.cache_read_input_tokens != null
160
+ ) {
124
161
  totalUsage.input_token_details = {
125
162
  cache_creation: inputUsage.cache_creation_input_tokens ?? 0,
126
163
  cache_read: inputUsage.cache_read_input_tokens ?? 0,
@@ -144,12 +181,14 @@ export class CustomAnthropic extends ChatAnthropicMessages {
144
181
  usageMetadata,
145
182
  shouldStreamUsage,
146
183
  }: {
147
- token?: string,
148
- chunk: AIMessageChunk,
149
- shouldStreamUsage: boolean
150
- usageMetadata?: AnthropicStreamUsage,
184
+ token?: string;
185
+ chunk: AIMessageChunk;
186
+ shouldStreamUsage: boolean;
187
+ usageMetadata?: AnthropicStreamUsage;
151
188
  }): ChatGenerationChunk {
152
- const usage_metadata = shouldStreamUsage ? usageMetadata ?? chunk.usage_metadata : undefined;
189
+ const usage_metadata = shouldStreamUsage
190
+ ? (usageMetadata ?? chunk.usage_metadata)
191
+ : undefined;
153
192
  return new ChatGenerationChunk({
154
193
  message: new AIMessageChunk({
155
194
  // Just yield chunk as it is and tool_use will be concat by BaseChatModel._generateUncached().
@@ -220,7 +259,11 @@ export class CustomAnthropic extends ChatAnthropicMessages {
220
259
  const { chunk } = result;
221
260
  const [token = '', tokenType] = extractToken(chunk);
222
261
 
223
- if (!tokenType || tokenType === 'input' || (token === '' && usageMetadata)) {
262
+ if (
263
+ !tokenType ||
264
+ tokenType === 'input' ||
265
+ (token === '' && usageMetadata)
266
+ ) {
224
267
  const generationChunk = this.createGenerationChunk({
225
268
  token,
226
269
  chunk,
@@ -280,4 +323,4 @@ export class CustomAnthropic extends ChatAnthropicMessages {
280
323
 
281
324
  this.resetTokenEvents();
282
325
  }
283
- }
326
+ }
@@ -0,0 +1,164 @@
1
+ import { ChatXAI as OriginalChatXAI } from '@langchain/xai';
2
+ import { ChatDeepSeek as OriginalChatDeepSeek } from '@langchain/deepseek';
3
+ import {
4
+ getEndpoint,
5
+ OpenAIClient,
6
+ ChatOpenAI as OriginalChatOpenAI,
7
+ AzureChatOpenAI as OriginalAzureChatOpenAI,
8
+ } from '@langchain/openai';
9
+ import type * as t from '@langchain/openai';
10
+
11
+ export class CustomOpenAIClient extends OpenAIClient {
12
+ async fetchWithTimeout(
13
+ url: RequestInfo,
14
+ init: RequestInit | undefined,
15
+ ms: number,
16
+ controller: AbortController
17
+ ): Promise<Response> {
18
+ const { signal, ...options } = init || {};
19
+ const handler = (): void => controller.abort();
20
+ if (signal) signal.addEventListener('abort', handler);
21
+
22
+ const timeout = setTimeout(() => handler, ms);
23
+
24
+ const fetchOptions = {
25
+ signal: controller.signal as AbortSignal,
26
+ ...options,
27
+ };
28
+ if (fetchOptions.method != null) {
29
+ // Custom methods like 'patch' need to be uppercased
30
+ // See https://github.com/nodejs/undici/issues/2294
31
+ fetchOptions.method = fetchOptions.method.toUpperCase();
32
+ }
33
+
34
+ return (
35
+ // use undefined this binding; fetch errors if bound to something else in browser/cloudflare
36
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
37
+ /** @ts-ignore */
38
+ this.fetch.call(undefined, url, fetchOptions).finally(() => {
39
+ if (signal) signal.removeEventListener('abort', handler);
40
+ clearTimeout(timeout);
41
+ })
42
+ );
43
+ }
44
+ }
45
+
46
+ export class ChatOpenAI extends OriginalChatOpenAI<t.ChatOpenAICallOptions> {
47
+ protected _getClientOptions(
48
+ options?: t.OpenAICoreRequestOptions
49
+ ): t.OpenAICoreRequestOptions {
50
+ if (!(this.client as OpenAIClient | undefined)) {
51
+ const openAIEndpointConfig: t.OpenAIEndpointConfig = {
52
+ baseURL: this.clientConfig.baseURL,
53
+ };
54
+
55
+ const endpoint = getEndpoint(openAIEndpointConfig);
56
+ const params = {
57
+ ...this.clientConfig,
58
+ baseURL: endpoint,
59
+ timeout: this.timeout,
60
+ maxRetries: 0,
61
+ };
62
+ if (params.baseURL == null) {
63
+ delete params.baseURL;
64
+ }
65
+
66
+ this.client = new CustomOpenAIClient(params);
67
+ }
68
+ const requestOptions = {
69
+ ...this.clientConfig,
70
+ ...options,
71
+ } as t.OpenAICoreRequestOptions;
72
+ return requestOptions;
73
+ }
74
+ }
75
+
76
+ export class AzureChatOpenAI extends OriginalAzureChatOpenAI {
77
+ protected _getClientOptions(
78
+ options?: t.OpenAICoreRequestOptions
79
+ ): t.OpenAICoreRequestOptions {
80
+ if (!(this.client as OpenAIClient | undefined)) {
81
+ const openAIEndpointConfig: t.OpenAIEndpointConfig = {
82
+ baseURL: this.clientConfig.baseURL,
83
+ };
84
+
85
+ const endpoint = getEndpoint(openAIEndpointConfig);
86
+ const params = {
87
+ ...this.clientConfig,
88
+ baseURL: endpoint,
89
+ timeout: this.timeout,
90
+ maxRetries: 0,
91
+ };
92
+ if (params.baseURL == null) {
93
+ delete params.baseURL;
94
+ }
95
+
96
+ this.client = new CustomOpenAIClient(params);
97
+ }
98
+ const requestOptions = {
99
+ ...this.clientConfig,
100
+ ...options,
101
+ } as t.OpenAICoreRequestOptions;
102
+ return requestOptions;
103
+ }
104
+ }
105
+
106
+ export class ChatDeepSeek extends OriginalChatDeepSeek {
107
+ protected _getClientOptions(
108
+ options?: t.OpenAICoreRequestOptions
109
+ ): t.OpenAICoreRequestOptions {
110
+ if (!(this.client as OpenAIClient | undefined)) {
111
+ const openAIEndpointConfig: t.OpenAIEndpointConfig = {
112
+ baseURL: this.clientConfig.baseURL,
113
+ };
114
+
115
+ const endpoint = getEndpoint(openAIEndpointConfig);
116
+ const params = {
117
+ ...this.clientConfig,
118
+ baseURL: endpoint,
119
+ timeout: this.timeout,
120
+ maxRetries: 0,
121
+ };
122
+ if (params.baseURL == null) {
123
+ delete params.baseURL;
124
+ }
125
+
126
+ this.client = new CustomOpenAIClient(params);
127
+ }
128
+ const requestOptions = {
129
+ ...this.clientConfig,
130
+ ...options,
131
+ } as t.OpenAICoreRequestOptions;
132
+ return requestOptions;
133
+ }
134
+ }
135
+
136
+ export class ChatXAI extends OriginalChatXAI {
137
+ protected _getClientOptions(
138
+ options?: t.OpenAICoreRequestOptions
139
+ ): t.OpenAICoreRequestOptions {
140
+ if (!(this.client as OpenAIClient | undefined)) {
141
+ const openAIEndpointConfig: t.OpenAIEndpointConfig = {
142
+ baseURL: this.clientConfig.baseURL,
143
+ };
144
+
145
+ const endpoint = getEndpoint(openAIEndpointConfig);
146
+ const params = {
147
+ ...this.clientConfig,
148
+ baseURL: endpoint,
149
+ timeout: this.timeout,
150
+ maxRetries: 0,
151
+ };
152
+ if (params.baseURL == null) {
153
+ delete params.baseURL;
154
+ }
155
+
156
+ this.client = new CustomOpenAIClient(params);
157
+ }
158
+ const requestOptions = {
159
+ ...this.clientConfig,
160
+ ...options,
161
+ } as t.OpenAICoreRequestOptions;
162
+ return requestOptions;
163
+ }
164
+ }
@@ -1,31 +1,45 @@
1
- import { ChatOpenAI } from '@langchain/openai';
2
1
  import type { ChatOpenAICallOptions, OpenAIClient } from '@langchain/openai';
3
- import type { AIMessageChunk, HumanMessageChunk, SystemMessageChunk, FunctionMessageChunk, ToolMessageChunk, ChatMessageChunk} from '@langchain/core/messages';
2
+ import type {
3
+ AIMessageChunk,
4
+ HumanMessageChunk,
5
+ SystemMessageChunk,
6
+ FunctionMessageChunk,
7
+ ToolMessageChunk,
8
+ ChatMessageChunk,
9
+ } from '@langchain/core/messages';
10
+ import { ChatOpenAI } from '@/llm/openai';
11
+
4
12
  export interface ChatOpenRouterCallOptions extends ChatOpenAICallOptions {
5
13
  include_reasoning?: boolean;
6
14
  }
7
- export class ChatOpenRouter extends ChatOpenAI<ChatOpenRouterCallOptions> {
15
+ export class ChatOpenRouter extends ChatOpenAI {
8
16
  constructor(_fields: Partial<ChatOpenRouterCallOptions>) {
9
17
  const { include_reasoning, ...fields } = _fields;
10
18
  super({
11
19
  ...fields,
12
20
  modelKwargs: {
13
21
  include_reasoning,
14
- }
22
+ },
15
23
  });
16
24
  }
17
25
  protected override _convertOpenAIDeltaToBaseMessageChunk(
18
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
26
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
19
27
  delta: Record<string, any>,
20
28
  rawResponse: OpenAIClient.ChatCompletionChunk,
21
29
  defaultRole?:
22
- | 'function'
23
- | 'user'
24
- | 'system'
25
- | 'developer'
26
- | 'assistant'
27
- | 'tool'
28
- ): AIMessageChunk | HumanMessageChunk | SystemMessageChunk | FunctionMessageChunk | ToolMessageChunk | ChatMessageChunk {
30
+ | 'function'
31
+ | 'user'
32
+ | 'system'
33
+ | 'developer'
34
+ | 'assistant'
35
+ | 'tool'
36
+ ):
37
+ | AIMessageChunk
38
+ | HumanMessageChunk
39
+ | SystemMessageChunk
40
+ | FunctionMessageChunk
41
+ | ToolMessageChunk
42
+ | ChatMessageChunk {
29
43
  const messageChunk = super._convertOpenAIDeltaToBaseMessageChunk(
30
44
  delta,
31
45
  rawResponse,
@@ -34,4 +48,4 @@ export class ChatOpenRouter extends ChatOpenAI<ChatOpenRouterCallOptions> {
34
48
  messageChunk.additional_kwargs.reasoning = delta.reasoning;
35
49
  return messageChunk;
36
50
  }
37
- }
51
+ }
@@ -1,12 +1,9 @@
1
1
  // src/llm/providers.ts
2
- import { ChatXAI } from '@langchain/xai';
3
2
  import { ChatOllama } from '@langchain/ollama';
4
- import { ChatDeepSeek } from '@langchain/deepseek';
5
3
  import { ChatMistralAI } from '@langchain/mistralai';
6
4
  import { ChatBedrockConverse } from '@langchain/aws';
7
5
  // import { ChatAnthropic } from '@langchain/anthropic';
8
6
  import { ChatVertexAI } from '@langchain/google-vertexai';
9
- import { ChatOpenAI, AzureChatOpenAI } from '@langchain/openai';
10
7
  import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
11
8
  import { BedrockChat } from '@langchain/community/chat_models/bedrock/web';
12
9
  import type {
@@ -14,8 +11,14 @@ import type {
14
11
  ProviderOptionsMap,
15
12
  ChatModelMap,
16
13
  } from '@/types';
17
- import { CustomAnthropic } from '@/llm/anthropic/llm';
18
- import { ChatOpenRouter } from '@/llm/openrouter/llm';
14
+ import { CustomAnthropic } from '@/llm/anthropic';
15
+ import { ChatOpenRouter } from '@/llm/openrouter';
16
+ import {
17
+ ChatXAI,
18
+ ChatOpenAI,
19
+ ChatDeepSeek,
20
+ AzureChatOpenAI,
21
+ } from '@/llm/openai';
19
22
  import { Providers } from '@/common';
20
23
 
21
24
  export const llmProviders: Partial<ChatModelConstructorMap> = {
package/src/types/llm.ts CHANGED
@@ -1,31 +1,26 @@
1
1
  // src/types/llm.ts
2
- import { ChatXAI } from '@langchain/xai';
3
2
  import { ChatOllama } from '@langchain/ollama';
4
- import { ChatDeepSeek } from '@langchain/deepseek';
5
3
  import { ChatAnthropic } from '@langchain/anthropic';
6
4
  import { ChatMistralAI } from '@langchain/mistralai';
7
5
  import { ChatBedrockConverse } from '@langchain/aws';
8
6
  import { ChatVertexAI } from '@langchain/google-vertexai';
9
7
  import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
10
8
  import { BedrockChat } from '@langchain/community/chat_models/bedrock/web';
11
- import {
12
- ChatOpenAI,
13
- AzureChatOpenAI,
14
- ClientOptions as OAIClientOptions,
15
- } from '@langchain/openai';
16
9
  import type {
17
10
  BindToolsInput,
18
11
  BaseChatModelParams,
19
12
  } from '@langchain/core/language_models/chat_models';
20
13
  import type {
21
- ChatOpenAIFields,
22
14
  OpenAIChatInput,
15
+ ChatOpenAIFields,
23
16
  AzureOpenAIInput,
17
+ ClientOptions as OAIClientOptions,
24
18
  } from '@langchain/openai';
25
19
  import type { BedrockChatFields } from '@langchain/community/chat_models/bedrock/web';
26
20
  import type { GoogleGenerativeAIChatInput } from '@langchain/google-genai';
27
21
  import type { ChatVertexAIInput } from '@langchain/google-vertexai';
28
22
  import type { ChatDeepSeekCallOptions } from '@langchain/deepseek';
23
+ import type { ChatOpenRouterCallOptions } from '@/llm/openrouter';
29
24
  import type { ChatBedrockConverseInput } from '@langchain/aws';
30
25
  import type { ChatMistralAIInput } from '@langchain/mistralai';
31
26
  import type { StructuredTool } from '@langchain/core/tools';
@@ -34,8 +29,13 @@ import type { Runnable } from '@langchain/core/runnables';
34
29
  import type { ChatOllamaInput } from '@langchain/ollama';
35
30
  import type { OpenAI as OpenAIClient } from 'openai';
36
31
  import type { ChatXAIInput } from '@langchain/xai';
37
- import type { ChatOpenRouterCallOptions } from '@/llm/openrouter/llm';
38
- import { ChatOpenRouter } from '@/llm/openrouter/llm';
32
+ import {
33
+ ChatXAI,
34
+ ChatOpenAI,
35
+ ChatDeepSeek,
36
+ AzureChatOpenAI,
37
+ } from '@/llm/openai';
38
+ import { ChatOpenRouter } from '@/llm/openrouter';
39
39
  import { Providers } from '@/common';
40
40
 
41
41
  export type AzureClientOptions = Partial<OpenAIChatInput> &
@@ -105,6 +105,7 @@ export type ProviderOptionsMap = {
105
105
  };
106
106
 
107
107
  export type ChatModelMap = {
108
+ [Providers.XAI]: ChatXAI;
108
109
  [Providers.OPENAI]: ChatOpenAI;
109
110
  [Providers.OLLAMA]: ChatOllama;
110
111
  [Providers.AZURE]: AzureChatOpenAI;
@@ -117,7 +118,6 @@ export type ChatModelMap = {
117
118
  [Providers.BEDROCK_LEGACY]: BedrockChat;
118
119
  [Providers.BEDROCK]: ChatBedrockConverse;
119
120
  [Providers.GOOGLE]: ChatGoogleGenerativeAI;
120
- [Providers.XAI]: ChatXAI;
121
121
  };
122
122
 
123
123
  export type ChatModelConstructorMap = {
@@ -1,6 +1,6 @@
1
1
  // src/utils/llmConfig.ts
2
2
  import { Providers } from '@/common';
3
- import type * as or from '@/llm/openrouter/llm';
3
+ import type * as or from '@/llm/openrouter';
4
4
  import type * as t from '@/types';
5
5
 
6
6
  export const llmConfigs: Record<string, t.LLMConfig | undefined> = {
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm.cjs","sources":["../../../../src/llm/anthropic/llm.ts"],"sourcesContent":["import { AIMessageChunk } from '@langchain/core/messages';\nimport { ChatAnthropicMessages } from '@langchain/anthropic';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport type { BaseChatModelParams } from '@langchain/core/language_models/chat_models';\nimport type { BaseMessage, MessageContentComplex } from '@langchain/core/messages';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { AnthropicInput } from '@langchain/anthropic';\nimport type { AnthropicMessageCreateParams, AnthropicStreamingMessageCreateParams, AnthropicStreamUsage, AnthropicMessageStartEvent, AnthropicMessageDeltaEvent } from '@/llm/anthropic/types';\nimport { _makeMessageChunkFromAnthropicEvent } from './utils/message_outputs';\nimport { _convertMessagesToAnthropicPayload } from './utils/message_inputs';\nimport { TextStream } from '@/llm/text';\n\nfunction _toolsInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n return !!(params.tools && params.tools.length > 0);\n}\nfunction _documentsInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n for (const message of params.messages ?? []) {\n if (typeof message.content === 'string') {\n continue;\n }\n for (const block of message.content ?? []) {\n if (\n typeof block === 'object' &&\n block != null &&\n block.type === 'document' &&\n typeof block.citations === 'object' &&\n block.citations.enabled\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction _thinkingInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n return !!(params.thinking && params.thinking.type === 'enabled');\n}\n\nfunction extractToken(chunk: AIMessageChunk): [string, 'string' | 'input' | 'content'] | [undefined] {\n if (typeof chunk.content === 'string') {\n return [chunk.content, 'string'];\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n 'input' in chunk.content[0]\n ) {\n return typeof chunk.content[0].input === 'string'\n ? [chunk.content[0].input, 'input']\n : [JSON.stringify(chunk.content[0].input), 'input'];\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n 'text' in chunk.content[0]\n ) {\n return [chunk.content[0].text, 'content'];\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n 'thinking' in chunk.content[0]\n ) {\n return [chunk.content[0].thinking, 'content'];\n }\n return [undefined];\n}\n\nfunction cloneChunk(text: string, tokenType: string, chunk: AIMessageChunk): AIMessageChunk {\n if (tokenType === 'string') {\n return new AIMessageChunk(Object.assign({}, chunk, { content: text }));\n } else if (tokenType === 'input') {\n return chunk;\n }\n const content = chunk.content[0] as MessageContentComplex;\n if (tokenType === 'content' && content.type === 'text') {\n return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { text })] }));\n } else if (tokenType === 'content' && content.type === 'text_delta') {\n return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { text })] }));\n } else if (tokenType === 'content' && content.type?.startsWith('thinking')) {\n return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { thinking: text })] }));\n }\n\n return chunk;\n}\n\nexport type CustomAnthropicInput = AnthropicInput & { _lc_stream_delay?: number } & BaseChatModelParams;\n\nexport class CustomAnthropic extends ChatAnthropicMessages {\n _lc_stream_delay: number;\n private message_start: AnthropicMessageStartEvent | undefined;\n private message_delta: AnthropicMessageDeltaEvent | undefined;\n private tools_in_params?: boolean;\n private emitted_usage?: boolean;\n constructor(fields?: CustomAnthropicInput) {\n super(fields);\n this._lc_stream_delay = fields?._lc_stream_delay ?? 25;\n }\n\n /**\n * Get stream usage as returned by this client's API response.\n * @returns {AnthropicStreamUsage} The stream usage object.\n */\n getStreamUsage(): AnthropicStreamUsage | undefined {\n if (this.emitted_usage === true) {\n return;\n }\n const inputUsage = (this.message_start?.message)?.usage as undefined | AnthropicStreamUsage;\n const outputUsage = this.message_delta?.usage as undefined | Partial<AnthropicStreamUsage>;\n if (!outputUsage) {\n return;\n }\n const totalUsage: AnthropicStreamUsage = {\n input_tokens: inputUsage?.input_tokens ?? 0,\n output_tokens: outputUsage.output_tokens ?? 0,\n total_tokens: (inputUsage?.input_tokens ?? 0) + (outputUsage.output_tokens ?? 0),\n };\n\n if (inputUsage?.cache_creation_input_tokens != null || inputUsage?.cache_read_input_tokens != null) {\n totalUsage.input_token_details = {\n cache_creation: inputUsage.cache_creation_input_tokens ?? 0,\n cache_read: inputUsage.cache_read_input_tokens ?? 0,\n };\n }\n\n this.emitted_usage = true;\n return totalUsage;\n }\n\n resetTokenEvents(): void {\n this.message_start = undefined;\n this.message_delta = undefined;\n this.emitted_usage = undefined;\n this.tools_in_params = undefined;\n }\n\n private createGenerationChunk({\n token,\n chunk,\n usageMetadata,\n shouldStreamUsage,\n }: {\n token?: string,\n chunk: AIMessageChunk,\n shouldStreamUsage: boolean\n usageMetadata?: AnthropicStreamUsage,\n }): ChatGenerationChunk {\n const usage_metadata = shouldStreamUsage ? usageMetadata ?? chunk.usage_metadata : undefined;\n return new ChatGenerationChunk({\n message: new AIMessageChunk({\n // Just yield chunk as it is and tool_use will be concat by BaseChatModel._generateUncached().\n content: chunk.content,\n additional_kwargs: chunk.additional_kwargs,\n tool_call_chunks: chunk.tool_call_chunks,\n response_metadata: chunk.response_metadata,\n usage_metadata,\n id: chunk.id,\n }),\n text: token ?? '',\n });\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const params = this.invocationParams(options);\n const formattedMessages = _convertMessagesToAnthropicPayload(messages);\n const payload = {\n ...params,\n ...formattedMessages,\n stream: true,\n } as const;\n const coerceContentToString =\n !_toolsInParams(payload) &&\n !_documentsInParams(payload) &&\n !_thinkingInParams(payload);\n\n const stream = await this.createStreamWithRetry(\n {\n ...params,\n ...formattedMessages,\n stream: true,\n },\n {\n headers: options.headers,\n }\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n for await (const data of stream) {\n if (options.signal?.aborted === true) {\n stream.controller.abort();\n throw new Error('AbortError: User aborted the request.');\n }\n\n if (data.type === 'message_start') {\n this.message_start = data as AnthropicMessageStartEvent;\n } else if (data.type === 'message_delta') {\n this.message_delta = data as AnthropicMessageDeltaEvent;\n }\n\n let usageMetadata: AnthropicStreamUsage | undefined;\n if (this.tools_in_params !== true && this.emitted_usage !== true) {\n usageMetadata = this.getStreamUsage();\n }\n\n const result = _makeMessageChunkFromAnthropicEvent(data, {\n streamUsage: shouldStreamUsage,\n coerceContentToString,\n });\n if (!result) continue;\n\n const { chunk } = result;\n const [token = '', tokenType] = extractToken(chunk);\n\n if (!tokenType || tokenType === 'input' || (token === '' && usageMetadata)) {\n const generationChunk = this.createGenerationChunk({\n token,\n chunk,\n usageMetadata,\n shouldStreamUsage,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n token,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n continue;\n }\n\n const textStream = new TextStream(token, {\n delay: this._lc_stream_delay,\n firstWordChunk: true,\n minChunkSize: 4,\n maxChunkSize: 8,\n });\n\n const generator = textStream.generateText();\n try {\n let emittedUsage = false;\n for await (const currentToken of generator) {\n const newChunk = cloneChunk(currentToken, tokenType, chunk);\n\n const generationChunk = this.createGenerationChunk({\n token: currentToken,\n chunk: newChunk,\n usageMetadata: emittedUsage ? undefined : usageMetadata,\n shouldStreamUsage,\n });\n\n if (usageMetadata && !emittedUsage) {\n emittedUsage = true;\n }\n yield generationChunk;\n\n await runManager?.handleLLMNewToken(\n token,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n } finally {\n await generator.return();\n }\n }\n\n this.resetTokenEvents();\n }\n}"],"names":["AIMessageChunk","ChatAnthropicMessages","ChatGenerationChunk","_convertMessagesToAnthropicPayload","_makeMessageChunkFromAnthropicEvent","TextStream"],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm.cjs","sources":["../../../../src/llm/openrouter/llm.ts"],"sourcesContent":["import { ChatOpenAI } from '@langchain/openai';\nimport type { ChatOpenAICallOptions, OpenAIClient } from '@langchain/openai';\nimport type { AIMessageChunk, HumanMessageChunk, SystemMessageChunk, FunctionMessageChunk, ToolMessageChunk, ChatMessageChunk} from '@langchain/core/messages';\nexport interface ChatOpenRouterCallOptions extends ChatOpenAICallOptions {\n include_reasoning?: boolean;\n}\nexport class ChatOpenRouter extends ChatOpenAI<ChatOpenRouterCallOptions> {\n constructor(_fields: Partial<ChatOpenRouterCallOptions>) {\n const { include_reasoning, ...fields } = _fields;\n super({\n ...fields,\n modelKwargs: {\n include_reasoning,\n }\n });\n }\n protected override _convertOpenAIDeltaToBaseMessageChunk(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>,\n rawResponse: OpenAIClient.ChatCompletionChunk,\n defaultRole?:\n | 'function'\n | 'user'\n | 'system'\n | 'developer'\n | 'assistant'\n | 'tool'\n ): AIMessageChunk | HumanMessageChunk | SystemMessageChunk | FunctionMessageChunk | ToolMessageChunk | ChatMessageChunk {\n const messageChunk = super._convertOpenAIDeltaToBaseMessageChunk(\n delta,\n rawResponse,\n defaultRole\n );\n messageChunk.additional_kwargs.reasoning = delta.reasoning;\n return messageChunk;\n }\n}"],"names":["ChatOpenAI"],"mappings":";;;;AAMM,MAAO,cAAe,SAAQA,iBAAqC,CAAA;AACvE,IAAA,WAAA,CAAY,OAA2C,EAAA;QACrD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO;AAChD,QAAA,KAAK,CAAC;AACJ,YAAA,GAAG,MAAM;AACT,YAAA,WAAW,EAAE;gBACX,iBAAiB;AAClB;AACF,SAAA,CAAC;;IAEe,qCAAqC;;IAEtD,KAA0B,EAC1B,WAA6C,EAC7C,WAMQ,EAAA;AAER,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,qCAAqC,CAC9D,KAAK,EACL,WAAW,EACX,WAAW,CACZ;QACD,YAAY,CAAC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AAC1D,QAAA,OAAO,YAAY;;AAEtB;;;;"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm.mjs","sources":["../../../../src/llm/anthropic/llm.ts"],"sourcesContent":["import { AIMessageChunk } from '@langchain/core/messages';\nimport { ChatAnthropicMessages } from '@langchain/anthropic';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport type { BaseChatModelParams } from '@langchain/core/language_models/chat_models';\nimport type { BaseMessage, MessageContentComplex } from '@langchain/core/messages';\nimport type { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport type { AnthropicInput } from '@langchain/anthropic';\nimport type { AnthropicMessageCreateParams, AnthropicStreamingMessageCreateParams, AnthropicStreamUsage, AnthropicMessageStartEvent, AnthropicMessageDeltaEvent } from '@/llm/anthropic/types';\nimport { _makeMessageChunkFromAnthropicEvent } from './utils/message_outputs';\nimport { _convertMessagesToAnthropicPayload } from './utils/message_inputs';\nimport { TextStream } from '@/llm/text';\n\nfunction _toolsInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n return !!(params.tools && params.tools.length > 0);\n}\nfunction _documentsInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n for (const message of params.messages ?? []) {\n if (typeof message.content === 'string') {\n continue;\n }\n for (const block of message.content ?? []) {\n if (\n typeof block === 'object' &&\n block != null &&\n block.type === 'document' &&\n typeof block.citations === 'object' &&\n block.citations.enabled\n ) {\n return true;\n }\n }\n }\n return false;\n}\n\nfunction _thinkingInParams(\n params: AnthropicMessageCreateParams | AnthropicStreamingMessageCreateParams\n): boolean {\n return !!(params.thinking && params.thinking.type === 'enabled');\n}\n\nfunction extractToken(chunk: AIMessageChunk): [string, 'string' | 'input' | 'content'] | [undefined] {\n if (typeof chunk.content === 'string') {\n return [chunk.content, 'string'];\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n 'input' in chunk.content[0]\n ) {\n return typeof chunk.content[0].input === 'string'\n ? [chunk.content[0].input, 'input']\n : [JSON.stringify(chunk.content[0].input), 'input'];\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n 'text' in chunk.content[0]\n ) {\n return [chunk.content[0].text, 'content'];\n } else if (\n Array.isArray(chunk.content) &&\n chunk.content.length >= 1 &&\n 'thinking' in chunk.content[0]\n ) {\n return [chunk.content[0].thinking, 'content'];\n }\n return [undefined];\n}\n\nfunction cloneChunk(text: string, tokenType: string, chunk: AIMessageChunk): AIMessageChunk {\n if (tokenType === 'string') {\n return new AIMessageChunk(Object.assign({}, chunk, { content: text }));\n } else if (tokenType === 'input') {\n return chunk;\n }\n const content = chunk.content[0] as MessageContentComplex;\n if (tokenType === 'content' && content.type === 'text') {\n return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { text })] }));\n } else if (tokenType === 'content' && content.type === 'text_delta') {\n return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { text })] }));\n } else if (tokenType === 'content' && content.type?.startsWith('thinking')) {\n return new AIMessageChunk(Object.assign({}, chunk, { content: [Object.assign({}, content, { thinking: text })] }));\n }\n\n return chunk;\n}\n\nexport type CustomAnthropicInput = AnthropicInput & { _lc_stream_delay?: number } & BaseChatModelParams;\n\nexport class CustomAnthropic extends ChatAnthropicMessages {\n _lc_stream_delay: number;\n private message_start: AnthropicMessageStartEvent | undefined;\n private message_delta: AnthropicMessageDeltaEvent | undefined;\n private tools_in_params?: boolean;\n private emitted_usage?: boolean;\n constructor(fields?: CustomAnthropicInput) {\n super(fields);\n this._lc_stream_delay = fields?._lc_stream_delay ?? 25;\n }\n\n /**\n * Get stream usage as returned by this client's API response.\n * @returns {AnthropicStreamUsage} The stream usage object.\n */\n getStreamUsage(): AnthropicStreamUsage | undefined {\n if (this.emitted_usage === true) {\n return;\n }\n const inputUsage = (this.message_start?.message)?.usage as undefined | AnthropicStreamUsage;\n const outputUsage = this.message_delta?.usage as undefined | Partial<AnthropicStreamUsage>;\n if (!outputUsage) {\n return;\n }\n const totalUsage: AnthropicStreamUsage = {\n input_tokens: inputUsage?.input_tokens ?? 0,\n output_tokens: outputUsage.output_tokens ?? 0,\n total_tokens: (inputUsage?.input_tokens ?? 0) + (outputUsage.output_tokens ?? 0),\n };\n\n if (inputUsage?.cache_creation_input_tokens != null || inputUsage?.cache_read_input_tokens != null) {\n totalUsage.input_token_details = {\n cache_creation: inputUsage.cache_creation_input_tokens ?? 0,\n cache_read: inputUsage.cache_read_input_tokens ?? 0,\n };\n }\n\n this.emitted_usage = true;\n return totalUsage;\n }\n\n resetTokenEvents(): void {\n this.message_start = undefined;\n this.message_delta = undefined;\n this.emitted_usage = undefined;\n this.tools_in_params = undefined;\n }\n\n private createGenerationChunk({\n token,\n chunk,\n usageMetadata,\n shouldStreamUsage,\n }: {\n token?: string,\n chunk: AIMessageChunk,\n shouldStreamUsage: boolean\n usageMetadata?: AnthropicStreamUsage,\n }): ChatGenerationChunk {\n const usage_metadata = shouldStreamUsage ? usageMetadata ?? chunk.usage_metadata : undefined;\n return new ChatGenerationChunk({\n message: new AIMessageChunk({\n // Just yield chunk as it is and tool_use will be concat by BaseChatModel._generateUncached().\n content: chunk.content,\n additional_kwargs: chunk.additional_kwargs,\n tool_call_chunks: chunk.tool_call_chunks,\n response_metadata: chunk.response_metadata,\n usage_metadata,\n id: chunk.id,\n }),\n text: token ?? '',\n });\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const params = this.invocationParams(options);\n const formattedMessages = _convertMessagesToAnthropicPayload(messages);\n const payload = {\n ...params,\n ...formattedMessages,\n stream: true,\n } as const;\n const coerceContentToString =\n !_toolsInParams(payload) &&\n !_documentsInParams(payload) &&\n !_thinkingInParams(payload);\n\n const stream = await this.createStreamWithRetry(\n {\n ...params,\n ...formattedMessages,\n stream: true,\n },\n {\n headers: options.headers,\n }\n );\n\n const shouldStreamUsage = this.streamUsage ?? options.streamUsage;\n\n for await (const data of stream) {\n if (options.signal?.aborted === true) {\n stream.controller.abort();\n throw new Error('AbortError: User aborted the request.');\n }\n\n if (data.type === 'message_start') {\n this.message_start = data as AnthropicMessageStartEvent;\n } else if (data.type === 'message_delta') {\n this.message_delta = data as AnthropicMessageDeltaEvent;\n }\n\n let usageMetadata: AnthropicStreamUsage | undefined;\n if (this.tools_in_params !== true && this.emitted_usage !== true) {\n usageMetadata = this.getStreamUsage();\n }\n\n const result = _makeMessageChunkFromAnthropicEvent(data, {\n streamUsage: shouldStreamUsage,\n coerceContentToString,\n });\n if (!result) continue;\n\n const { chunk } = result;\n const [token = '', tokenType] = extractToken(chunk);\n\n if (!tokenType || tokenType === 'input' || (token === '' && usageMetadata)) {\n const generationChunk = this.createGenerationChunk({\n token,\n chunk,\n usageMetadata,\n shouldStreamUsage,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n token,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n continue;\n }\n\n const textStream = new TextStream(token, {\n delay: this._lc_stream_delay,\n firstWordChunk: true,\n minChunkSize: 4,\n maxChunkSize: 8,\n });\n\n const generator = textStream.generateText();\n try {\n let emittedUsage = false;\n for await (const currentToken of generator) {\n const newChunk = cloneChunk(currentToken, tokenType, chunk);\n\n const generationChunk = this.createGenerationChunk({\n token: currentToken,\n chunk: newChunk,\n usageMetadata: emittedUsage ? undefined : usageMetadata,\n shouldStreamUsage,\n });\n\n if (usageMetadata && !emittedUsage) {\n emittedUsage = true;\n }\n yield generationChunk;\n\n await runManager?.handleLLMNewToken(\n token,\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n } finally {\n await generator.return();\n }\n }\n\n this.resetTokenEvents();\n }\n}"],"names":[],"mappings":"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"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"llm.mjs","sources":["../../../../src/llm/openrouter/llm.ts"],"sourcesContent":["import { ChatOpenAI } from '@langchain/openai';\nimport type { ChatOpenAICallOptions, OpenAIClient } from '@langchain/openai';\nimport type { AIMessageChunk, HumanMessageChunk, SystemMessageChunk, FunctionMessageChunk, ToolMessageChunk, ChatMessageChunk} from '@langchain/core/messages';\nexport interface ChatOpenRouterCallOptions extends ChatOpenAICallOptions {\n include_reasoning?: boolean;\n}\nexport class ChatOpenRouter extends ChatOpenAI<ChatOpenRouterCallOptions> {\n constructor(_fields: Partial<ChatOpenRouterCallOptions>) {\n const { include_reasoning, ...fields } = _fields;\n super({\n ...fields,\n modelKwargs: {\n include_reasoning,\n }\n });\n }\n protected override _convertOpenAIDeltaToBaseMessageChunk(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n delta: Record<string, any>,\n rawResponse: OpenAIClient.ChatCompletionChunk,\n defaultRole?:\n | 'function'\n | 'user'\n | 'system'\n | 'developer'\n | 'assistant'\n | 'tool'\n ): AIMessageChunk | HumanMessageChunk | SystemMessageChunk | FunctionMessageChunk | ToolMessageChunk | ChatMessageChunk {\n const messageChunk = super._convertOpenAIDeltaToBaseMessageChunk(\n delta,\n rawResponse,\n defaultRole\n );\n messageChunk.additional_kwargs.reasoning = delta.reasoning;\n return messageChunk;\n }\n}"],"names":[],"mappings":";;AAMM,MAAO,cAAe,SAAQ,UAAqC,CAAA;AACvE,IAAA,WAAA,CAAY,OAA2C,EAAA;QACrD,MAAM,EAAE,iBAAiB,EAAE,GAAG,MAAM,EAAE,GAAG,OAAO;AAChD,QAAA,KAAK,CAAC;AACJ,YAAA,GAAG,MAAM;AACT,YAAA,WAAW,EAAE;gBACX,iBAAiB;AAClB;AACF,SAAA,CAAC;;IAEe,qCAAqC;;IAEtD,KAA0B,EAC1B,WAA6C,EAC7C,WAMQ,EAAA;AAER,QAAA,MAAM,YAAY,GAAG,KAAK,CAAC,qCAAqC,CAC9D,KAAK,EACL,WAAW,EACX,WAAW,CACZ;QACD,YAAY,CAAC,iBAAiB,CAAC,SAAS,GAAG,KAAK,CAAC,SAAS;AAC1D,QAAA,OAAO,YAAY;;AAEtB;;;;"}