@librechat/agents 2.4.15 → 2.4.17

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 +197 -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 +190 -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 +23 -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 +233 -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
@@ -1 +1 @@
1
- {"version":3,"file":"run.mjs","sources":["../../src/run.ts"],"sourcesContent":["// src/run.ts\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport { PromptTemplate } from '@langchain/core/prompts';\nimport { AzureChatOpenAI, ChatOpenAI } from '@langchain/openai';\nimport { SystemMessage } from '@langchain/core/messages';\nimport type {\n BaseMessage,\n MessageContentComplex,\n} from '@langchain/core/messages';\nimport type { ClientCallbacks, SystemCallbacks } from '@/graphs/Graph';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type * as t from '@/types';\nimport { GraphEvents, Providers, Callback } from '@/common';\nimport { manualToolStreamProviders } from '@/llm/providers';\nimport { shiftIndexTokenCountMap } from '@/messages/format';\nimport { createTitleRunnable } from '@/utils/title';\nimport { createTokenCounter } from '@/utils/tokens';\nimport { StandardGraph } from '@/graphs/Graph';\nimport { HandlerRegistry } from '@/events';\nimport { isOpenAILike } from '@/utils/llm';\n\nexport class Run<T extends t.BaseGraphState> {\n graphRunnable?: t.CompiledWorkflow<T, Partial<T>, string>;\n // private collab!: CollabGraph;\n // private taskManager!: TaskManager;\n private handlerRegistry: HandlerRegistry;\n id: string;\n Graph: StandardGraph | undefined;\n provider: Providers | undefined;\n returnContent: boolean = false;\n\n private constructor(config: Partial<t.RunConfig>) {\n const runId = config.runId ?? '';\n if (!runId) {\n throw new Error('Run ID not provided');\n }\n\n this.id = runId;\n\n const handlerRegistry = new HandlerRegistry();\n\n if (config.customHandlers) {\n for (const [eventType, handler] of Object.entries(\n config.customHandlers\n )) {\n handlerRegistry.register(eventType, handler);\n }\n }\n\n this.handlerRegistry = handlerRegistry;\n\n if (!config.graphConfig) {\n throw new Error('Graph config not provided');\n }\n\n if (config.graphConfig.type === 'standard' || !config.graphConfig.type) {\n this.provider = config.graphConfig.llmConfig.provider;\n this.graphRunnable = this.createStandardGraph(\n config.graphConfig\n ) as unknown as t.CompiledWorkflow<T, Partial<T>, string>;\n if (this.Graph) {\n this.Graph.handlerRegistry = handlerRegistry;\n }\n }\n\n this.returnContent = config.returnContent ?? false;\n }\n\n private createStandardGraph(\n config: t.StandardGraphConfig\n ): t.CompiledWorkflow<t.IState, Partial<t.IState>, string> {\n const { llmConfig, tools = [], ...graphInput } = config;\n const { provider, ...clientOptions } = llmConfig;\n\n const standardGraph = new StandardGraph({\n tools,\n provider,\n clientOptions,\n ...graphInput,\n runId: this.id,\n });\n this.Graph = standardGraph;\n return standardGraph.createWorkflow();\n }\n\n static async create<T extends t.BaseGraphState>(\n config: t.RunConfig\n ): Promise<Run<T>> {\n return new Run<T>(config);\n }\n\n getRunMessages(): BaseMessage[] | undefined {\n if (!this.Graph) {\n throw new Error(\n 'Graph not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n return this.Graph.getRunMessages();\n }\n\n async processStream(\n inputs: t.IState,\n config: Partial<RunnableConfig> & { version: 'v1' | 'v2'; run_id?: string },\n streamOptions?: t.EventStreamOptions\n ): Promise<MessageContentComplex[] | undefined> {\n if (!this.graphRunnable) {\n throw new Error(\n 'Run not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n if (!this.Graph) {\n throw new Error(\n 'Graph not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n\n this.Graph.resetValues(streamOptions?.keepContent);\n const provider = this.Graph.provider;\n const hasTools = this.Graph.tools ? this.Graph.tools.length > 0 : false;\n if (streamOptions?.callbacks) {\n /* TODO: conflicts with callback manager */\n const callbacks = (config.callbacks as t.ProvidedCallbacks) ?? [];\n config.callbacks = callbacks.concat(\n this.getCallbacks(streamOptions.callbacks)\n );\n }\n\n if (!this.id) {\n throw new Error('Run ID not provided');\n }\n\n const tokenCounter =\n streamOptions?.tokenCounter ??\n (streamOptions?.indexTokenCountMap\n ? await createTokenCounter()\n : undefined);\n const toolTokens = tokenCounter\n ? (this.Graph.tools?.reduce((acc, tool) => {\n if (!(tool as Partial<t.GenericTool>).schema) {\n return acc;\n }\n\n const jsonSchema = zodToJsonSchema(\n tool.schema.describe(tool.description ?? ''),\n tool.name\n );\n return (\n acc + tokenCounter(new SystemMessage(JSON.stringify(jsonSchema)))\n );\n }, 0) ?? 0)\n : 0;\n let instructionTokens = toolTokens;\n if (this.Graph.systemMessage && tokenCounter) {\n instructionTokens += tokenCounter(this.Graph.systemMessage);\n }\n const tokenMap = streamOptions?.indexTokenCountMap ?? {};\n if (this.Graph.systemMessage && instructionTokens > 0) {\n this.Graph.indexTokenCountMap = shiftIndexTokenCountMap(\n tokenMap,\n instructionTokens\n );\n } else if (instructionTokens > 0) {\n tokenMap[0] = tokenMap[0] + instructionTokens;\n this.Graph.indexTokenCountMap = tokenMap;\n } else {\n this.Graph.indexTokenCountMap = tokenMap;\n }\n\n this.Graph.maxContextTokens = streamOptions?.maxContextTokens;\n this.Graph.tokenCounter = tokenCounter;\n\n config.run_id = this.id;\n config.configurable = Object.assign(config.configurable ?? {}, {\n run_id: this.id,\n provider: this.provider,\n });\n\n const stream = this.graphRunnable.streamEvents(inputs, config);\n\n for await (const event of stream) {\n const { data, name, metadata, ...info } = event;\n\n let eventName: t.EventName = info.event;\n if (\n hasTools &&\n manualToolStreamProviders.has(provider) &&\n eventName === GraphEvents.CHAT_MODEL_STREAM\n ) {\n /* Skipping CHAT_MODEL_STREAM event due to double-call edge case */\n continue;\n }\n\n if (eventName && eventName === GraphEvents.ON_CUSTOM_EVENT) {\n eventName = name;\n }\n\n const handler = this.handlerRegistry.getHandler(eventName);\n if (handler) {\n handler.handle(eventName, data, metadata, this.Graph);\n }\n }\n\n if (this.returnContent) {\n return this.Graph.getContentParts();\n }\n }\n\n private createSystemCallback<K extends keyof ClientCallbacks>(\n clientCallbacks: ClientCallbacks,\n key: K\n ): SystemCallbacks[K] {\n return ((...args: unknown[]) => {\n const clientCallback = clientCallbacks[key];\n if (clientCallback && this.Graph) {\n (clientCallback as (...args: unknown[]) => void)(this.Graph, ...args);\n }\n }) as SystemCallbacks[K];\n }\n\n getCallbacks(clientCallbacks: ClientCallbacks): SystemCallbacks {\n return {\n [Callback.TOOL_ERROR]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_ERROR\n ),\n [Callback.TOOL_START]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_START\n ),\n [Callback.TOOL_END]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_END\n ),\n };\n }\n\n async generateTitle({\n inputText,\n contentParts,\n titlePrompt,\n clientOptions,\n chainOptions,\n skipLanguage,\n }: t.RunTitleOptions): Promise<{ language: string; title: string }> {\n const convoTemplate = PromptTemplate.fromTemplate(\n 'User: {input}\\nAI: {output}'\n );\n const response = contentParts\n .map((part) => {\n if (part?.type === 'text') return part.text;\n return '';\n })\n .join('\\n');\n const convo = (\n await convoTemplate.invoke({ input: inputText, output: response })\n ).value;\n const model = this.Graph?.getNewModel({\n clientOptions,\n omitOriginalOptions: new Set([\n 'clientOptions',\n 'streaming',\n 'stream',\n 'thinking',\n 'maxTokens',\n 'maxOutputTokens',\n 'additionalModelRequestFields',\n ]),\n });\n if (!model) {\n return { language: '', title: '' };\n }\n if (\n isOpenAILike(this.provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.temperature as number;\n model.topP = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.topP as number;\n model.frequencyPenalty = (\n clientOptions as t.OpenAIClientOptions | undefined\n )?.frequencyPenalty as number;\n model.presencePenalty = (\n clientOptions as t.OpenAIClientOptions | undefined\n )?.presencePenalty as number;\n model.n = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.n as number;\n }\n const chain = await createTitleRunnable(model, titlePrompt);\n return (await chain.invoke(\n { convo, inputText, skipLanguage },\n chainOptions\n )) as { language: string; title: string };\n }\n}\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"run.mjs","sources":["../../src/run.ts"],"sourcesContent":["// src/run.ts\nimport { zodToJsonSchema } from 'zod-to-json-schema';\nimport { PromptTemplate } from '@langchain/core/prompts';\nimport { AzureChatOpenAI, ChatOpenAI } from '@langchain/openai';\nimport { SystemMessage } from '@langchain/core/messages';\nimport type {\n BaseMessage,\n MessageContentComplex,\n} from '@langchain/core/messages';\nimport type { ClientCallbacks, SystemCallbacks } from '@/graphs/Graph';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type * as t from '@/types';\nimport { GraphEvents, Providers, Callback } from '@/common';\nimport { manualToolStreamProviders } from '@/llm/providers';\nimport { shiftIndexTokenCountMap } from '@/messages/format';\nimport { createTitleRunnable } from '@/utils/title';\nimport { createTokenCounter } from '@/utils/tokens';\nimport { StandardGraph } from '@/graphs/Graph';\nimport { HandlerRegistry } from '@/events';\nimport { isOpenAILike } from '@/utils/llm';\n\nexport class Run<T extends t.BaseGraphState> {\n graphRunnable?: t.CompiledWorkflow<T, Partial<T>, string>;\n // private collab!: CollabGraph;\n // private taskManager!: TaskManager;\n private handlerRegistry: HandlerRegistry;\n id: string;\n Graph: StandardGraph | undefined;\n provider: Providers | undefined;\n returnContent: boolean = false;\n\n private constructor(config: Partial<t.RunConfig>) {\n const runId = config.runId ?? '';\n if (!runId) {\n throw new Error('Run ID not provided');\n }\n\n this.id = runId;\n\n const handlerRegistry = new HandlerRegistry();\n\n if (config.customHandlers) {\n for (const [eventType, handler] of Object.entries(\n config.customHandlers\n )) {\n handlerRegistry.register(eventType, handler);\n }\n }\n\n this.handlerRegistry = handlerRegistry;\n\n if (!config.graphConfig) {\n throw new Error('Graph config not provided');\n }\n\n if (config.graphConfig.type === 'standard' || !config.graphConfig.type) {\n this.provider = config.graphConfig.llmConfig.provider;\n this.graphRunnable = this.createStandardGraph(\n config.graphConfig\n ) as unknown as t.CompiledWorkflow<T, Partial<T>, string>;\n if (this.Graph) {\n this.Graph.handlerRegistry = handlerRegistry;\n }\n }\n\n this.returnContent = config.returnContent ?? false;\n }\n\n private createStandardGraph(\n config: t.StandardGraphConfig\n ): t.CompiledWorkflow<t.IState, Partial<t.IState>, string> {\n const { llmConfig, tools = [], ...graphInput } = config;\n const { provider, ...clientOptions } = llmConfig;\n\n const standardGraph = new StandardGraph({\n tools,\n provider,\n clientOptions,\n ...graphInput,\n runId: this.id,\n });\n this.Graph = standardGraph;\n return standardGraph.createWorkflow();\n }\n\n static async create<T extends t.BaseGraphState>(\n config: t.RunConfig\n ): Promise<Run<T>> {\n return new Run<T>(config);\n }\n\n getRunMessages(): BaseMessage[] | undefined {\n if (!this.Graph) {\n throw new Error(\n 'Graph not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n return this.Graph.getRunMessages();\n }\n\n async processStream(\n inputs: t.IState,\n config: Partial<RunnableConfig> & { version: 'v1' | 'v2'; run_id?: string },\n streamOptions?: t.EventStreamOptions\n ): Promise<MessageContentComplex[] | undefined> {\n if (!this.graphRunnable) {\n throw new Error(\n 'Run not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n if (!this.Graph) {\n throw new Error(\n 'Graph not initialized. Make sure to use Run.create() to instantiate the Run.'\n );\n }\n\n this.Graph.resetValues(streamOptions?.keepContent);\n const provider = this.Graph.provider;\n const hasTools = this.Graph.tools ? this.Graph.tools.length > 0 : false;\n if (streamOptions?.callbacks) {\n /* TODO: conflicts with callback manager */\n const callbacks = (config.callbacks as t.ProvidedCallbacks) ?? [];\n config.callbacks = callbacks.concat(\n this.getCallbacks(streamOptions.callbacks)\n );\n }\n\n if (!this.id) {\n throw new Error('Run ID not provided');\n }\n\n const tokenCounter =\n streamOptions?.tokenCounter ??\n (streamOptions?.indexTokenCountMap\n ? await createTokenCounter()\n : undefined);\n const toolTokens = tokenCounter\n ? (this.Graph.tools?.reduce((acc, tool) => {\n if (!(tool as Partial<t.GenericTool>).schema) {\n return acc;\n }\n\n const jsonSchema = zodToJsonSchema(\n tool.schema.describe(tool.description ?? ''),\n tool.name\n );\n return (\n acc + tokenCounter(new SystemMessage(JSON.stringify(jsonSchema)))\n );\n }, 0) ?? 0)\n : 0;\n let instructionTokens = toolTokens;\n if (this.Graph.systemMessage && tokenCounter) {\n instructionTokens += tokenCounter(this.Graph.systemMessage);\n }\n const tokenMap = streamOptions?.indexTokenCountMap ?? {};\n if (this.Graph.systemMessage && instructionTokens > 0) {\n this.Graph.indexTokenCountMap = shiftIndexTokenCountMap(\n tokenMap,\n instructionTokens\n );\n } else if (instructionTokens > 0) {\n tokenMap[0] = tokenMap[0] + instructionTokens;\n this.Graph.indexTokenCountMap = tokenMap;\n } else {\n this.Graph.indexTokenCountMap = tokenMap;\n }\n\n this.Graph.maxContextTokens = streamOptions?.maxContextTokens;\n this.Graph.tokenCounter = tokenCounter;\n\n config.run_id = this.id;\n config.configurable = Object.assign(config.configurable ?? {}, {\n run_id: this.id,\n provider: this.provider,\n });\n\n const stream = this.graphRunnable.streamEvents(inputs, config);\n\n for await (const event of stream) {\n const { data, name, metadata, ...info } = event;\n\n let eventName: t.EventName = info.event;\n if (\n hasTools &&\n manualToolStreamProviders.has(provider) &&\n eventName === GraphEvents.CHAT_MODEL_STREAM\n ) {\n /* Skipping CHAT_MODEL_STREAM event due to double-call edge case */\n continue;\n }\n\n if (eventName && eventName === GraphEvents.ON_CUSTOM_EVENT) {\n eventName = name;\n }\n\n const handler = this.handlerRegistry.getHandler(eventName);\n if (handler) {\n handler.handle(eventName, data, metadata, this.Graph);\n }\n }\n\n if (this.returnContent) {\n return this.Graph.getContentParts();\n }\n }\n\n private createSystemCallback<K extends keyof ClientCallbacks>(\n clientCallbacks: ClientCallbacks,\n key: K\n ): SystemCallbacks[K] {\n return ((...args: unknown[]) => {\n const clientCallback = clientCallbacks[key];\n if (clientCallback && this.Graph) {\n (clientCallback as (...args: unknown[]) => void)(this.Graph, ...args);\n }\n }) as SystemCallbacks[K];\n }\n\n getCallbacks(clientCallbacks: ClientCallbacks): SystemCallbacks {\n return {\n [Callback.TOOL_ERROR]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_ERROR\n ),\n [Callback.TOOL_START]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_START\n ),\n [Callback.TOOL_END]: this.createSystemCallback(\n clientCallbacks,\n Callback.TOOL_END\n ),\n };\n }\n\n async generateTitle({\n inputText,\n contentParts,\n titlePrompt,\n clientOptions,\n chainOptions,\n skipLanguage,\n }: t.RunTitleOptions): Promise<{ language: string; title: string }> {\n const convoTemplate = PromptTemplate.fromTemplate(\n 'User: {input}\\nAI: {output}'\n );\n const response = contentParts\n .map((part) => {\n if (part?.type === 'text') return part.text;\n return '';\n })\n .join('\\n');\n const convo = (\n await convoTemplate.invoke({ input: inputText, output: response })\n ).value;\n const model = this.Graph?.getNewModel({\n clientOptions,\n omitOriginalOptions: new Set([\n 'clientOptions',\n 'streaming',\n 'stream',\n 'thinking',\n 'maxTokens',\n 'maxOutputTokens',\n 'additionalModelRequestFields',\n ]),\n });\n if (!model) {\n return { language: '', title: '' };\n }\n if (\n isOpenAILike(this.provider) &&\n (model instanceof ChatOpenAI || model instanceof AzureChatOpenAI)\n ) {\n model.temperature = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.temperature as number;\n model.topP = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.topP as number;\n model.frequencyPenalty = (\n clientOptions as t.OpenAIClientOptions | undefined\n )?.frequencyPenalty as number;\n model.presencePenalty = (\n clientOptions as t.OpenAIClientOptions | undefined\n )?.presencePenalty as number;\n model.n = (clientOptions as t.OpenAIClientOptions | undefined)\n ?.n as number;\n }\n const chain = await createTitleRunnable(model, titlePrompt);\n return (await chain.invoke(\n { convo, inputText, skipLanguage },\n chainOptions\n )) as { language: string; title: string };\n }\n}\n"],"names":["ChatOpenAI","AzureChatOpenAI"],"mappings":"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"}
@@ -8,3 +8,4 @@ export * from './tools/CodeExecutor';
8
8
  export * from './common';
9
9
  export * from './utils';
10
10
  export type * from './types';
11
+ export { CustomOpenAIClient } from './llm/openai';
@@ -0,0 +1,23 @@
1
+ import { AzureOpenAI as AzureOpenAIClient } from 'openai';
2
+ import { ChatXAI as OriginalChatXAI } from '@langchain/xai';
3
+ import { ChatDeepSeek as OriginalChatDeepSeek } from '@langchain/deepseek';
4
+ import { OpenAIClient, ChatOpenAI as OriginalChatOpenAI, AzureChatOpenAI as OriginalAzureChatOpenAI } from '@langchain/openai';
5
+ import type * as t from '@langchain/openai';
6
+ export declare class CustomOpenAIClient extends OpenAIClient {
7
+ fetchWithTimeout(url: RequestInfo, init: RequestInit | undefined, ms: number, controller: AbortController): Promise<Response>;
8
+ }
9
+ export declare class CustomAzureOpenAIClient extends AzureOpenAIClient {
10
+ fetchWithTimeout(url: RequestInfo, init: RequestInit | undefined, ms: number, controller: AbortController): Promise<Response>;
11
+ }
12
+ export declare class ChatOpenAI extends OriginalChatOpenAI<t.ChatOpenAICallOptions> {
13
+ protected _getClientOptions(options?: t.OpenAICoreRequestOptions): t.OpenAICoreRequestOptions;
14
+ }
15
+ export declare class AzureChatOpenAI extends OriginalAzureChatOpenAI {
16
+ protected _getClientOptions(options: t.OpenAICoreRequestOptions | undefined): t.OpenAICoreRequestOptions;
17
+ }
18
+ export declare class ChatDeepSeek extends OriginalChatDeepSeek {
19
+ protected _getClientOptions(options?: t.OpenAICoreRequestOptions): t.OpenAICoreRequestOptions;
20
+ }
21
+ export declare class ChatXAI extends OriginalChatXAI {
22
+ protected _getClientOptions(options?: t.OpenAICoreRequestOptions): t.OpenAICoreRequestOptions;
23
+ }
@@ -1,10 +1,10 @@
1
- import { ChatOpenAI } from '@langchain/openai';
2
1
  import type { ChatOpenAICallOptions, OpenAIClient } from '@langchain/openai';
3
2
  import type { AIMessageChunk, HumanMessageChunk, SystemMessageChunk, FunctionMessageChunk, ToolMessageChunk, ChatMessageChunk } from '@langchain/core/messages';
3
+ import { ChatOpenAI } from '@/llm/openai';
4
4
  export interface ChatOpenRouterCallOptions extends ChatOpenAICallOptions {
5
5
  include_reasoning?: boolean;
6
6
  }
7
- export declare class ChatOpenRouter extends ChatOpenAI<ChatOpenRouterCallOptions> {
7
+ export declare class ChatOpenRouter extends ChatOpenAI {
8
8
  constructor(_fields: Partial<ChatOpenRouterCallOptions>);
9
9
  protected _convertOpenAIDeltaToBaseMessageChunk(delta: Record<string, any>, rawResponse: OpenAIClient.ChatCompletionChunk, defaultRole?: 'function' | 'user' | 'system' | 'developer' | 'assistant' | 'tool'): AIMessageChunk | HumanMessageChunk | SystemMessageChunk | FunctionMessageChunk | ToolMessageChunk | ChatMessageChunk;
10
10
  }
@@ -1,19 +1,17 @@
1
- import { ChatXAI } from '@langchain/xai';
2
1
  import { ChatOllama } from '@langchain/ollama';
3
- import { ChatDeepSeek } from '@langchain/deepseek';
4
2
  import { ChatAnthropic } from '@langchain/anthropic';
5
3
  import { ChatMistralAI } from '@langchain/mistralai';
6
4
  import { ChatBedrockConverse } from '@langchain/aws';
7
5
  import { ChatVertexAI } from '@langchain/google-vertexai';
8
6
  import { ChatGoogleGenerativeAI } from '@langchain/google-genai';
9
7
  import { BedrockChat } from '@langchain/community/chat_models/bedrock/web';
10
- import { ChatOpenAI, AzureChatOpenAI, ClientOptions as OAIClientOptions } from '@langchain/openai';
11
8
  import type { BindToolsInput, BaseChatModelParams } from '@langchain/core/language_models/chat_models';
12
- import type { ChatOpenAIFields, OpenAIChatInput, AzureOpenAIInput } from '@langchain/openai';
9
+ import type { OpenAIChatInput, ChatOpenAIFields, AzureOpenAIInput, ClientOptions as OAIClientOptions } from '@langchain/openai';
13
10
  import type { BedrockChatFields } from '@langchain/community/chat_models/bedrock/web';
14
11
  import type { GoogleGenerativeAIChatInput } from '@langchain/google-genai';
15
12
  import type { ChatVertexAIInput } from '@langchain/google-vertexai';
16
13
  import type { ChatDeepSeekCallOptions } from '@langchain/deepseek';
14
+ import type { ChatOpenRouterCallOptions } from '@/llm/openrouter';
17
15
  import type { ChatBedrockConverseInput } from '@langchain/aws';
18
16
  import type { ChatMistralAIInput } from '@langchain/mistralai';
19
17
  import type { StructuredTool } from '@langchain/core/tools';
@@ -22,8 +20,8 @@ import type { Runnable } from '@langchain/core/runnables';
22
20
  import type { ChatOllamaInput } from '@langchain/ollama';
23
21
  import type { OpenAI as OpenAIClient } from 'openai';
24
22
  import type { ChatXAIInput } from '@langchain/xai';
25
- import type { ChatOpenRouterCallOptions } from '@/llm/openrouter/llm';
26
- import { ChatOpenRouter } from '@/llm/openrouter/llm';
23
+ import { ChatXAI, ChatOpenAI, ChatDeepSeek, AzureChatOpenAI } from '@/llm/openai';
24
+ import { ChatOpenRouter } from '@/llm/openrouter';
27
25
  import { Providers } from '@/common';
28
26
  export type AzureClientOptions = Partial<OpenAIChatInput> & Partial<AzureOpenAIInput> & {
29
27
  openAIApiKey?: string;
@@ -73,6 +71,7 @@ export type ProviderOptionsMap = {
73
71
  [Providers.XAI]: XAIClientOptions;
74
72
  };
75
73
  export type ChatModelMap = {
74
+ [Providers.XAI]: ChatXAI;
76
75
  [Providers.OPENAI]: ChatOpenAI;
77
76
  [Providers.OLLAMA]: ChatOllama;
78
77
  [Providers.AZURE]: AzureChatOpenAI;
@@ -85,7 +84,6 @@ export type ChatModelMap = {
85
84
  [Providers.BEDROCK_LEGACY]: BedrockChat;
86
85
  [Providers.BEDROCK]: ChatBedrockConverse;
87
86
  [Providers.GOOGLE]: ChatGoogleGenerativeAI;
88
- [Providers.XAI]: ChatXAI;
89
87
  };
90
88
  export type ChatModelConstructorMap = {
91
89
  [P in Providers]: new (config: ProviderOptionsMap[P]) => ChatModelMap[P];
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@librechat/agents",
3
- "version": "2.4.15",
3
+ "version": "2.4.17",
4
4
  "main": "./dist/cjs/main.cjs",
5
5
  "module": "./dist/esm/main.mjs",
6
6
  "types": "./dist/types/index.d.ts",
@@ -47,7 +47,7 @@
47
47
  "image": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/image.ts --provider 'google' --name 'Jo' --location 'New York, NY'",
48
48
  "code_exec_files": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_files.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
49
49
  "code_exec_simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/code_exec_simple.ts --provider 'google' --name 'Jo' --location 'New York, NY'",
50
- "simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/simple.ts --provider 'xai' --name 'Jo' --location 'New York, NY'",
50
+ "simple": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/simple.ts --provider 'azureOpenAI' --name 'Jo' --location 'New York, NY'",
51
51
  "caching": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/caching.ts --name 'Jo' --location 'New York, NY'",
52
52
  "thinking": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/thinking.ts --name 'Jo' --location 'New York, NY'",
53
53
  "memory": "node -r dotenv/config --loader ./tsconfig-paths-bootstrap.mjs --experimental-specifier-resolution=node ./src/scripts/memory.ts --provider 'openAI' --name 'Jo' --location 'New York, NY'",
package/src/index.ts CHANGED
@@ -16,4 +16,7 @@ export * from './common';
16
16
  export * from './utils';
17
17
 
18
18
  /* Types */
19
- export type * from './types';
19
+ export type * from './types';
20
+
21
+ /* LLM */
22
+ export { CustomOpenAIClient } from './llm/openai';
@@ -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,233 @@
1
+ import { AzureOpenAI as AzureOpenAIClient } from 'openai';
2
+ import { ChatXAI as OriginalChatXAI } from '@langchain/xai';
3
+ import { ChatDeepSeek as OriginalChatDeepSeek } from '@langchain/deepseek';
4
+ import {
5
+ getEndpoint,
6
+ OpenAIClient,
7
+ ChatOpenAI as OriginalChatOpenAI,
8
+ AzureChatOpenAI as OriginalAzureChatOpenAI,
9
+ } from '@langchain/openai';
10
+ import type * as t from '@langchain/openai';
11
+
12
+ export class CustomOpenAIClient extends OpenAIClient {
13
+ async fetchWithTimeout(
14
+ url: RequestInfo,
15
+ init: RequestInit | undefined,
16
+ ms: number,
17
+ controller: AbortController
18
+ ): Promise<Response> {
19
+ const { signal, ...options } = init || {};
20
+ const handler = (): void => controller.abort();
21
+ if (signal) signal.addEventListener('abort', handler);
22
+
23
+ const timeout = setTimeout(() => handler, ms);
24
+
25
+ const fetchOptions = {
26
+ signal: controller.signal as AbortSignal,
27
+ ...options,
28
+ };
29
+ if (fetchOptions.method != null) {
30
+ // Custom methods like 'patch' need to be uppercased
31
+ // See https://github.com/nodejs/undici/issues/2294
32
+ fetchOptions.method = fetchOptions.method.toUpperCase();
33
+ }
34
+
35
+ return (
36
+ // use undefined this binding; fetch errors if bound to something else in browser/cloudflare
37
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
38
+ /** @ts-ignore */
39
+ this.fetch.call(undefined, url, fetchOptions).finally(() => {
40
+ if (signal) signal.removeEventListener('abort', handler);
41
+ clearTimeout(timeout);
42
+ })
43
+ );
44
+ }
45
+ }
46
+ export class CustomAzureOpenAIClient extends AzureOpenAIClient {
47
+ async fetchWithTimeout(
48
+ url: RequestInfo,
49
+ init: RequestInit | undefined,
50
+ ms: number,
51
+ controller: AbortController
52
+ ): Promise<Response> {
53
+ const { signal, ...options } = init || {};
54
+ const handler = (): void => controller.abort();
55
+ if (signal) signal.addEventListener('abort', handler);
56
+
57
+ const timeout = setTimeout(() => handler, ms);
58
+
59
+ const fetchOptions = {
60
+ signal: controller.signal as AbortSignal,
61
+ ...options,
62
+ };
63
+ if (fetchOptions.method != null) {
64
+ // Custom methods like 'patch' need to be uppercased
65
+ // See https://github.com/nodejs/undici/issues/2294
66
+ fetchOptions.method = fetchOptions.method.toUpperCase();
67
+ }
68
+
69
+ return (
70
+ // use undefined this binding; fetch errors if bound to something else in browser/cloudflare
71
+ // eslint-disable-next-line @typescript-eslint/ban-ts-comment
72
+ /** @ts-ignore */
73
+ this.fetch.call(undefined, url, fetchOptions).finally(() => {
74
+ if (signal) signal.removeEventListener('abort', handler);
75
+ clearTimeout(timeout);
76
+ })
77
+ );
78
+ }
79
+ }
80
+
81
+ export class ChatOpenAI extends OriginalChatOpenAI<t.ChatOpenAICallOptions> {
82
+ protected _getClientOptions(
83
+ options?: t.OpenAICoreRequestOptions
84
+ ): t.OpenAICoreRequestOptions {
85
+ if (!(this.client as OpenAIClient | undefined)) {
86
+ const openAIEndpointConfig: t.OpenAIEndpointConfig = {
87
+ baseURL: this.clientConfig.baseURL,
88
+ };
89
+
90
+ const endpoint = getEndpoint(openAIEndpointConfig);
91
+ const params = {
92
+ ...this.clientConfig,
93
+ baseURL: endpoint,
94
+ timeout: this.timeout,
95
+ maxRetries: 0,
96
+ };
97
+ if (params.baseURL == null) {
98
+ delete params.baseURL;
99
+ }
100
+
101
+ this.client = new CustomOpenAIClient(params);
102
+ }
103
+ const requestOptions = {
104
+ ...this.clientConfig,
105
+ ...options,
106
+ } as t.OpenAICoreRequestOptions;
107
+ return requestOptions;
108
+ }
109
+ }
110
+
111
+ export class AzureChatOpenAI extends OriginalAzureChatOpenAI {
112
+ protected _getClientOptions(
113
+ options: t.OpenAICoreRequestOptions | undefined
114
+ ): t.OpenAICoreRequestOptions {
115
+ if (!(this.client as AzureOpenAIClient | undefined)) {
116
+ const openAIEndpointConfig: t.OpenAIEndpointConfig = {
117
+ azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
118
+ azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
119
+ azureOpenAIApiKey: this.azureOpenAIApiKey,
120
+ azureOpenAIBasePath: this.azureOpenAIBasePath,
121
+ azureADTokenProvider: this.azureADTokenProvider,
122
+ baseURL: this.clientConfig.baseURL,
123
+ };
124
+
125
+ const endpoint = getEndpoint(openAIEndpointConfig);
126
+
127
+ const params = {
128
+ ...this.clientConfig,
129
+ baseURL: endpoint,
130
+ timeout: this.timeout,
131
+ maxRetries: 0,
132
+ };
133
+
134
+ if (!this.azureADTokenProvider) {
135
+ params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
136
+ }
137
+
138
+ if (params.baseURL == null) {
139
+ delete params.baseURL;
140
+ }
141
+
142
+ params.defaultHeaders = {
143
+ ...params.defaultHeaders,
144
+ 'User-Agent':
145
+ params.defaultHeaders?.['User-Agent'] != null
146
+ ? `${params.defaultHeaders['User-Agent']}: langchainjs-azure-openai-v2`
147
+ : 'langchainjs-azure-openai-v2',
148
+ };
149
+
150
+ this.client = new CustomAzureOpenAIClient({
151
+ apiVersion: this.azureOpenAIApiVersion,
152
+ azureADTokenProvider: this.azureADTokenProvider,
153
+ ...params,
154
+ });
155
+ }
156
+
157
+ const requestOptions = {
158
+ ...this.clientConfig,
159
+ ...options,
160
+ } as t.OpenAICoreRequestOptions;
161
+ if (this.azureOpenAIApiKey != null) {
162
+ requestOptions.headers = {
163
+ 'api-key': this.azureOpenAIApiKey,
164
+ ...requestOptions.headers,
165
+ };
166
+ requestOptions.query = {
167
+ 'api-version': this.azureOpenAIApiVersion,
168
+ ...requestOptions.query,
169
+ };
170
+ }
171
+ return requestOptions;
172
+ }
173
+ }
174
+
175
+ export class ChatDeepSeek extends OriginalChatDeepSeek {
176
+ protected _getClientOptions(
177
+ options?: t.OpenAICoreRequestOptions
178
+ ): t.OpenAICoreRequestOptions {
179
+ if (!(this.client as OpenAIClient | undefined)) {
180
+ const openAIEndpointConfig: t.OpenAIEndpointConfig = {
181
+ baseURL: this.clientConfig.baseURL,
182
+ };
183
+
184
+ const endpoint = getEndpoint(openAIEndpointConfig);
185
+ const params = {
186
+ ...this.clientConfig,
187
+ baseURL: endpoint,
188
+ timeout: this.timeout,
189
+ maxRetries: 0,
190
+ };
191
+ if (params.baseURL == null) {
192
+ delete params.baseURL;
193
+ }
194
+
195
+ this.client = new CustomOpenAIClient(params);
196
+ }
197
+ const requestOptions = {
198
+ ...this.clientConfig,
199
+ ...options,
200
+ } as t.OpenAICoreRequestOptions;
201
+ return requestOptions;
202
+ }
203
+ }
204
+
205
+ export class ChatXAI extends OriginalChatXAI {
206
+ protected _getClientOptions(
207
+ options?: t.OpenAICoreRequestOptions
208
+ ): t.OpenAICoreRequestOptions {
209
+ if (!(this.client as OpenAIClient | undefined)) {
210
+ const openAIEndpointConfig: t.OpenAIEndpointConfig = {
211
+ baseURL: this.clientConfig.baseURL,
212
+ };
213
+
214
+ const endpoint = getEndpoint(openAIEndpointConfig);
215
+ const params = {
216
+ ...this.clientConfig,
217
+ baseURL: endpoint,
218
+ timeout: this.timeout,
219
+ maxRetries: 0,
220
+ };
221
+ if (params.baseURL == null) {
222
+ delete params.baseURL;
223
+ }
224
+
225
+ this.client = new CustomOpenAIClient(params);
226
+ }
227
+ const requestOptions = {
228
+ ...this.clientConfig,
229
+ ...options,
230
+ } as t.OpenAICoreRequestOptions;
231
+ return requestOptions;
232
+ }
233
+ }
@@ -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
+ }