@librechat/agents 3.2.33 → 3.2.35

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 (133) hide show
  1. package/dist/cjs/agents/AgentContext.cjs +47 -10
  2. package/dist/cjs/agents/AgentContext.cjs.map +1 -1
  3. package/dist/cjs/common/enum.cjs +13 -0
  4. package/dist/cjs/common/enum.cjs.map +1 -1
  5. package/dist/cjs/graphs/Graph.cjs +121 -3
  6. package/dist/cjs/graphs/Graph.cjs.map +1 -1
  7. package/dist/cjs/llm/bedrock/index.cjs +21 -2
  8. package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
  9. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +38 -2
  10. package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
  11. package/dist/cjs/llm/google/utils/common.cjs +6 -0
  12. package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
  13. package/dist/cjs/llm/invoke.cjs +49 -8
  14. package/dist/cjs/llm/invoke.cjs.map +1 -1
  15. package/dist/cjs/llm/openai/index.cjs +48 -1
  16. package/dist/cjs/llm/openai/index.cjs.map +1 -1
  17. package/dist/cjs/llm/vertexai/index.cjs +19 -0
  18. package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
  19. package/dist/cjs/main.cjs +2 -0
  20. package/dist/cjs/messages/content.cjs +12 -14
  21. package/dist/cjs/messages/content.cjs.map +1 -1
  22. package/dist/cjs/messages/prune.cjs +31 -13
  23. package/dist/cjs/messages/prune.cjs.map +1 -1
  24. package/dist/cjs/run.cjs +7 -2
  25. package/dist/cjs/run.cjs.map +1 -1
  26. package/dist/cjs/stream.cjs +20 -2
  27. package/dist/cjs/stream.cjs.map +1 -1
  28. package/dist/cjs/summarization/node.cjs +12 -1
  29. package/dist/cjs/summarization/node.cjs.map +1 -1
  30. package/dist/cjs/tools/ToolNode.cjs +41 -4
  31. package/dist/cjs/tools/ToolNode.cjs.map +1 -1
  32. package/dist/cjs/tools/streamedToolCallSeals.cjs +30 -1
  33. package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
  34. package/dist/cjs/tools/subagent/SubagentExecutor.cjs +138 -2
  35. package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
  36. package/dist/cjs/utils/tokens.cjs +30 -0
  37. package/dist/cjs/utils/tokens.cjs.map +1 -1
  38. package/dist/esm/agents/AgentContext.mjs +47 -10
  39. package/dist/esm/agents/AgentContext.mjs.map +1 -1
  40. package/dist/esm/common/enum.mjs +13 -0
  41. package/dist/esm/common/enum.mjs.map +1 -1
  42. package/dist/esm/graphs/Graph.mjs +122 -4
  43. package/dist/esm/graphs/Graph.mjs.map +1 -1
  44. package/dist/esm/llm/bedrock/index.mjs +22 -3
  45. package/dist/esm/llm/bedrock/index.mjs.map +1 -1
  46. package/dist/esm/llm/bedrock/utils/message_outputs.mjs +38 -3
  47. package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
  48. package/dist/esm/llm/google/utils/common.mjs +6 -0
  49. package/dist/esm/llm/google/utils/common.mjs.map +1 -1
  50. package/dist/esm/llm/invoke.mjs +49 -8
  51. package/dist/esm/llm/invoke.mjs.map +1 -1
  52. package/dist/esm/llm/openai/index.mjs +48 -1
  53. package/dist/esm/llm/openai/index.mjs.map +1 -1
  54. package/dist/esm/llm/vertexai/index.mjs +19 -0
  55. package/dist/esm/llm/vertexai/index.mjs.map +1 -1
  56. package/dist/esm/main.mjs +3 -3
  57. package/dist/esm/messages/content.mjs +12 -15
  58. package/dist/esm/messages/content.mjs.map +1 -1
  59. package/dist/esm/messages/prune.mjs +31 -13
  60. package/dist/esm/messages/prune.mjs.map +1 -1
  61. package/dist/esm/run.mjs +7 -2
  62. package/dist/esm/run.mjs.map +1 -1
  63. package/dist/esm/stream.mjs +21 -3
  64. package/dist/esm/stream.mjs.map +1 -1
  65. package/dist/esm/summarization/node.mjs +12 -1
  66. package/dist/esm/summarization/node.mjs.map +1 -1
  67. package/dist/esm/tools/ToolNode.mjs +41 -4
  68. package/dist/esm/tools/ToolNode.mjs.map +1 -1
  69. package/dist/esm/tools/streamedToolCallSeals.mjs +25 -2
  70. package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
  71. package/dist/esm/tools/subagent/SubagentExecutor.mjs +138 -2
  72. package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
  73. package/dist/esm/utils/tokens.mjs +30 -1
  74. package/dist/esm/utils/tokens.mjs.map +1 -1
  75. package/dist/types/agents/AgentContext.d.ts +7 -3
  76. package/dist/types/common/enum.d.ts +13 -0
  77. package/dist/types/graphs/Graph.d.ts +8 -1
  78. package/dist/types/llm/bedrock/utils/index.d.ts +1 -1
  79. package/dist/types/llm/bedrock/utils/message_outputs.d.ts +9 -0
  80. package/dist/types/llm/invoke.d.ts +1 -1
  81. package/dist/types/llm/vertexai/index.d.ts +10 -0
  82. package/dist/types/messages/content.d.ts +5 -0
  83. package/dist/types/messages/prune.d.ts +4 -0
  84. package/dist/types/run.d.ts +1 -0
  85. package/dist/types/tools/ToolNode.d.ts +8 -0
  86. package/dist/types/tools/streamedToolCallSeals.d.ts +5 -1
  87. package/dist/types/tools/subagent/SubagentExecutor.d.ts +11 -1
  88. package/dist/types/types/graph.d.ts +89 -3
  89. package/dist/types/types/run.d.ts +13 -0
  90. package/dist/types/types/tools.d.ts +10 -0
  91. package/dist/types/utils/tokens.d.ts +7 -0
  92. package/package.json +1 -1
  93. package/src/__tests__/stream.eagerEventExecution.test.ts +703 -0
  94. package/src/agents/AgentContext.ts +69 -6
  95. package/src/agents/__tests__/AgentContext.test.ts +6 -2
  96. package/src/common/enum.ts +13 -0
  97. package/src/graphs/Graph.ts +196 -0
  98. package/src/llm/bedrock/index.ts +40 -0
  99. package/src/llm/bedrock/streamSealDispatch.test.ts +158 -0
  100. package/src/llm/bedrock/utils/index.ts +1 -0
  101. package/src/llm/bedrock/utils/message_outputs.test.ts +85 -0
  102. package/src/llm/bedrock/utils/message_outputs.ts +43 -0
  103. package/src/llm/google/utils/common.test.ts +64 -0
  104. package/src/llm/google/utils/common.ts +18 -0
  105. package/src/llm/invoke.test.ts +79 -1
  106. package/src/llm/invoke.ts +58 -4
  107. package/src/llm/openai/index.ts +95 -1
  108. package/src/llm/openai/sequentialToolCallSeals.test.ts +199 -0
  109. package/src/llm/vertexai/index.ts +31 -0
  110. package/src/llm/vertexai/sealStreamedToolCalls.test.ts +88 -0
  111. package/src/llm/vertexai/streamSealDispatch.test.ts +148 -0
  112. package/src/messages/content.ts +24 -32
  113. package/src/messages/prune.ts +39 -2
  114. package/src/run.ts +5 -0
  115. package/src/scripts/subagent-usage-sink.ts +176 -0
  116. package/src/specs/context-accuracy.live.test.ts +409 -0
  117. package/src/specs/context-usage-event.test.ts +117 -0
  118. package/src/specs/context-usage.live.test.ts +297 -0
  119. package/src/specs/prune.test.ts +51 -1
  120. package/src/specs/subagent.test.ts +124 -1
  121. package/src/stream.ts +40 -6
  122. package/src/summarization/__tests__/node.test.ts +60 -1
  123. package/src/summarization/node.ts +20 -1
  124. package/src/tools/ToolNode.ts +85 -3
  125. package/src/tools/__tests__/SubagentExecutor.test.ts +443 -1
  126. package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +368 -0
  127. package/src/tools/streamedToolCallSeals.ts +37 -9
  128. package/src/tools/subagent/SubagentExecutor.ts +221 -3
  129. package/src/types/graph.ts +94 -1
  130. package/src/types/run.ts +13 -0
  131. package/src/types/tools.ts +10 -0
  132. package/src/utils/__tests__/apportion.test.ts +32 -0
  133. package/src/utils/tokens.ts +33 -0
@@ -1 +1 @@
1
- {"version":3,"file":"invoke.cjs","names":["ChatModelStreamHandler","AIMessageChunk","annotateMessagesForLLM","manualToolStreamProviders","modifyDeltaProperties","initializeModel"],"sources":["../../../src/llm/invoke.ts"],"sourcesContent":["import { concat } from '@langchain/core/utils/stream';\nimport { AIMessageChunk } from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { ToolOutputReferenceRegistry } from '@/tools/toolOutputReferences';\nimport type * as t from '@/types';\nimport { annotateMessagesForLLM } from '@/tools/toolOutputReferences';\nimport { manualToolStreamProviders } from '@/llm/providers';\nimport { modifyDeltaProperties } from '@/messages';\nimport { ChatModelStreamHandler } from '@/stream';\nimport { GraphEvents, Providers } from '@/common';\nimport { initializeModel } from '@/llm/init';\n\n/**\n * Context passed to `attemptInvoke`. Matches the subset of Graph that\n * `ChatModelStreamHandler.handle` needs *plus* the explicit\n * `getOrCreateToolOutputRegistry()` accessor that `attemptInvoke`\n * itself calls to pull the run-scoped tool-output registry off the\n * graph and project each relevant ToolMessage into a transient\n * annotated copy before the provider call.\n *\n * The intersection is intentional: `Parameters<...>[3]` resolves\n * indirectly through the stream handler's signature (which returns\n * `StandardGraph` and already exposes the accessor since #117), but\n * stating it explicitly here surfaces the contract at the call site —\n * a developer reading `attemptInvoke` doesn't have to chase the\n * upstream handler's parameter list to discover that\n * `context?.getOrCreateToolOutputRegistry()` is a real thing. Single\n * optional chain only — the method itself is required on the\n * `StandardGraph` branch of the intersection, so the second `?.` is\n * unnecessary at the call site.\n *\n * `NonNullable<...>` strips `undefined` from the upstream parameter\n * type so the intersection doesn't collapse to `never` on the\n * undefined branch; callers express optionality via `context?:\n * InvokeContext` on the function signature instead.\n *\n * Callers without a registry (e.g. summarization) simply pass no\n * `context` and the transform safely no-ops.\n */\nexport type InvokeContext = NonNullable<\n Parameters<ChatModelStreamHandler['handle']>[3]\n> & {\n getOrCreateToolOutputRegistry?(): ToolOutputReferenceRegistry | undefined;\n};\n\n/**\n * Per-chunk callback for custom stream processing.\n * When provided, replaces the default `ChatModelStreamHandler`.\n */\nexport type OnChunk = (chunk: AIMessageChunk) => void | Promise<void>;\n\nfunction getRegisteredDefaultChatStreamHandler(\n context?: InvokeContext\n): ChatModelStreamHandler | undefined {\n const handler = context?.handlerRegistry?.getHandler(\n GraphEvents.CHAT_MODEL_STREAM\n );\n return handler instanceof ChatModelStreamHandler ? handler : undefined;\n}\n\nfunction hasReasoningDetails(chunk: AIMessageChunk): boolean {\n const reasoningDetails = chunk.additional_kwargs.reasoning_details;\n return Array.isArray(reasoningDetails) && reasoningDetails.length > 0;\n}\n\nfunction removeOpenRouterFinalReasoningReplayContent({\n current,\n next,\n provider,\n}: {\n current?: AIMessageChunk;\n next: AIMessageChunk;\n provider: Providers;\n}): AIMessageChunk {\n const content = getOpenRouterFinalReasoningContent({\n current,\n next,\n provider,\n });\n if (content == null || content === next.content) {\n return next;\n }\n\n return new AIMessageChunk(\n Object.assign({}, next, {\n content,\n })\n );\n}\n\nfunction getOpenRouterFinalReasoningContent({\n current,\n next,\n provider,\n}: {\n current?: AIMessageChunk;\n next: AIMessageChunk;\n provider: Providers;\n}): string | undefined {\n if (\n provider !== Providers.OPENROUTER ||\n current == null ||\n !hasReasoningDetails(next) ||\n typeof current.content !== 'string' ||\n current.content === '' ||\n typeof next.content !== 'string' ||\n next.content === ''\n ) {\n return undefined;\n }\n if (!next.content.startsWith(current.content)) {\n return next.content;\n }\n return next.content.slice(current.content.length);\n}\n\nfunction removeReasoningDetails(\n additionalKwargs: AIMessageChunk['additional_kwargs']\n): AIMessageChunk['additional_kwargs'] {\n return Object.fromEntries(\n Object.entries(additionalKwargs).filter(\n ([key]) => key !== 'reasoning_details'\n )\n );\n}\n\nfunction getStreamHandlingChunk({\n current,\n next,\n provider,\n}: {\n current?: AIMessageChunk;\n next: AIMessageChunk;\n provider: Providers;\n}): AIMessageChunk | undefined {\n const content = getOpenRouterFinalReasoningContent({\n current,\n next,\n provider,\n });\n if (content == null) {\n return next;\n }\n if (content === '') {\n return undefined;\n }\n return new AIMessageChunk(\n Object.assign({}, next, {\n content,\n additional_kwargs: removeReasoningDetails(next.additional_kwargs),\n })\n );\n}\n\nfunction appendStreamChunk({\n current,\n next,\n provider,\n}: {\n current?: AIMessageChunk;\n next: AIMessageChunk;\n provider: Providers;\n}): AIMessageChunk {\n if (current == null) {\n return next;\n }\n return concat(\n current,\n removeOpenRouterFinalReasoningReplayContent({ current, next, provider })\n );\n}\n\n/**\n * Invokes a chat model with the given messages, handling both streaming and\n * non-streaming paths.\n *\n * By default, stream chunks are processed through a `ChatModelStreamHandler`\n * that dispatches run steps (MESSAGE_CREATION, TOOL_CALLS) for the graph.\n * Pass an `onChunk` callback to override this with custom chunk processing\n * (e.g. summarization delta events).\n */\nexport async function attemptInvoke(\n {\n model,\n messages,\n provider,\n context,\n onChunk,\n }: {\n model: t.ChatModel;\n messages: BaseMessage[];\n provider: Providers;\n context?: InvokeContext;\n onChunk?: OnChunk;\n },\n config?: RunnableConfig\n): Promise<Partial<t.BaseGraphState>> {\n /**\n * Pull the run-scoped tool output registry off the graph (when one\n * exists) and project ToolMessages carrying ref metadata into a\n * transient annotated copy. The original `messages` array stays\n * untouched so the graph state never sees `[ref: …]` / `_ref`\n * payload.\n */\n const registry = context?.getOrCreateToolOutputRegistry();\n const runId = config?.configurable?.run_id as string | undefined;\n const messagesForProvider = annotateMessagesForLLM(messages, registry, runId);\n\n if (model.stream) {\n const stream = await model.stream(messagesForProvider, config);\n let finalChunk: AIMessageChunk | undefined;\n const registeredStreamHandler =\n getRegisteredDefaultChatStreamHandler(context);\n\n if (onChunk) {\n for await (const chunk of stream) {\n await onChunk(chunk);\n finalChunk = appendStreamChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n }\n } else if (registeredStreamHandler == null) {\n const metadata = config?.metadata as Record<string, unknown> | undefined;\n const streamHandler = new ChatModelStreamHandler();\n for await (const chunk of stream) {\n const handlingChunk = getStreamHandlingChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n if (handlingChunk != null) {\n await streamHandler.handle(\n GraphEvents.CHAT_MODEL_STREAM,\n { chunk: handlingChunk },\n metadata,\n context\n );\n }\n finalChunk = appendStreamChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n }\n } else {\n const metadata = config?.metadata as Record<string, unknown> | undefined;\n for await (const chunk of stream) {\n const handlingChunk = getStreamHandlingChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n if (handlingChunk != null && handlingChunk !== chunk) {\n await registeredStreamHandler.handle(\n GraphEvents.CHAT_MODEL_STREAM,\n { chunk: handlingChunk },\n metadata,\n context\n );\n }\n finalChunk = appendStreamChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n }\n }\n\n if (manualToolStreamProviders.has(provider)) {\n finalChunk = modifyDeltaProperties(provider, finalChunk);\n }\n\n if ((finalChunk?.tool_calls?.length ?? 0) > 0) {\n finalChunk!.tool_calls = finalChunk!.tool_calls?.filter(\n (tool_call: ToolCall) => !!tool_call.name\n );\n }\n\n return { messages: [finalChunk as AIMessageChunk] };\n }\n\n const finalMessage = await model.invoke(messagesForProvider, config);\n if ((finalMessage.tool_calls?.length ?? 0) > 0) {\n finalMessage.tool_calls = finalMessage.tool_calls?.filter(\n (tool_call: ToolCall) => !!tool_call.name\n );\n }\n return { messages: [finalMessage] };\n}\n\n/**\n * Attempts each fallback provider in order until one succeeds.\n * Throws the last error if all fallbacks fail.\n */\nexport async function tryFallbackProviders({\n fallbacks,\n tools,\n messages,\n config,\n primaryError,\n context,\n onChunk,\n}: {\n fallbacks: Array<{ provider: Providers; clientOptions?: t.ClientOptions }>;\n tools?: t.GraphTools;\n messages: BaseMessage[];\n config?: RunnableConfig;\n primaryError: unknown;\n context?: InvokeContext;\n onChunk?: OnChunk;\n}): Promise<Partial<t.BaseGraphState> | undefined> {\n let lastError: unknown = primaryError;\n for (const fb of fallbacks) {\n try {\n const fbModel = initializeModel({\n provider: fb.provider,\n clientOptions: fb.clientOptions,\n tools,\n });\n const result = await attemptInvoke(\n {\n model: fbModel as t.ChatModel,\n messages,\n provider: fb.provider,\n context,\n onChunk,\n },\n config\n );\n return result;\n } catch (e) {\n lastError = e;\n continue;\n }\n }\n if (lastError !== undefined) {\n throw lastError;\n }\n return undefined;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"invoke.cjs","names":["ChatModelStreamHandler","AIMessageChunk","annotateMessagesForLLM","manualToolStreamProviders","modifyDeltaProperties","initializeModel"],"sources":["../../../src/llm/invoke.ts"],"sourcesContent":["import { concat } from '@langchain/core/utils/stream';\nimport { AIMessageChunk } from '@langchain/core/messages';\nimport type { RunnableConfig } from '@langchain/core/runnables';\nimport type { ToolCall } from '@langchain/core/messages/tool';\nimport type { BaseMessage } from '@langchain/core/messages';\nimport type { ToolOutputReferenceRegistry } from '@/tools/toolOutputReferences';\nimport type * as t from '@/types';\nimport { annotateMessagesForLLM } from '@/tools/toolOutputReferences';\nimport { Constants, GraphEvents, Providers } from '@/common';\nimport { manualToolStreamProviders } from '@/llm/providers';\nimport { modifyDeltaProperties } from '@/messages';\nimport { ChatModelStreamHandler } from '@/stream';\nimport { initializeModel } from '@/llm/init';\n\n/**\n * Context passed to `attemptInvoke`. Matches the subset of Graph that\n * `ChatModelStreamHandler.handle` needs *plus* the explicit\n * `getOrCreateToolOutputRegistry()` accessor that `attemptInvoke`\n * itself calls to pull the run-scoped tool-output registry off the\n * graph and project each relevant ToolMessage into a transient\n * annotated copy before the provider call.\n *\n * The intersection is intentional: `Parameters<...>[3]` resolves\n * indirectly through the stream handler's signature (which returns\n * `StandardGraph` and already exposes the accessor since #117), but\n * stating it explicitly here surfaces the contract at the call site —\n * a developer reading `attemptInvoke` doesn't have to chase the\n * upstream handler's parameter list to discover that\n * `context?.getOrCreateToolOutputRegistry()` is a real thing. Single\n * optional chain only — the method itself is required on the\n * `StandardGraph` branch of the intersection, so the second `?.` is\n * unnecessary at the call site.\n *\n * `NonNullable<...>` strips `undefined` from the upstream parameter\n * type so the intersection doesn't collapse to `never` on the\n * undefined branch; callers express optionality via `context?:\n * InvokeContext` on the function signature instead.\n *\n * Callers without a registry (e.g. summarization) simply pass no\n * `context` and the transform safely no-ops.\n */\nexport type InvokeContext = NonNullable<\n Parameters<ChatModelStreamHandler['handle']>[3]\n> & {\n getOrCreateToolOutputRegistry?(): ToolOutputReferenceRegistry | undefined;\n};\n\n/**\n * Per-chunk callback for custom stream processing.\n * When provided, replaces the default `ChatModelStreamHandler`.\n */\nexport type OnChunk = (chunk: AIMessageChunk) => void | Promise<void>;\n\nfunction getRegisteredDefaultChatStreamHandler(\n context?: InvokeContext\n): ChatModelStreamHandler | undefined {\n const handler = context?.handlerRegistry?.getHandler(\n GraphEvents.CHAT_MODEL_STREAM\n );\n return handler instanceof ChatModelStreamHandler ? handler : undefined;\n}\n\nfunction hasReasoningDetails(chunk: AIMessageChunk): boolean {\n const reasoningDetails = chunk.additional_kwargs.reasoning_details;\n return Array.isArray(reasoningDetails) && reasoningDetails.length > 0;\n}\n\nfunction removeOpenRouterFinalReasoningReplayContent({\n current,\n next,\n provider,\n}: {\n current?: AIMessageChunk;\n next: AIMessageChunk;\n provider: Providers;\n}): AIMessageChunk {\n const content = getOpenRouterFinalReasoningContent({\n current,\n next,\n provider,\n });\n if (content == null || content === next.content) {\n return next;\n }\n\n return new AIMessageChunk(\n Object.assign({}, next, {\n content,\n })\n );\n}\n\nfunction getOpenRouterFinalReasoningContent({\n current,\n next,\n provider,\n}: {\n current?: AIMessageChunk;\n next: AIMessageChunk;\n provider: Providers;\n}): string | undefined {\n if (\n provider !== Providers.OPENROUTER ||\n current == null ||\n !hasReasoningDetails(next) ||\n typeof current.content !== 'string' ||\n current.content === '' ||\n typeof next.content !== 'string' ||\n next.content === ''\n ) {\n return undefined;\n }\n if (!next.content.startsWith(current.content)) {\n return next.content;\n }\n return next.content.slice(current.content.length);\n}\n\nfunction removeReasoningDetails(\n additionalKwargs: AIMessageChunk['additional_kwargs']\n): AIMessageChunk['additional_kwargs'] {\n return Object.fromEntries(\n Object.entries(additionalKwargs).filter(\n ([key]) => key !== 'reasoning_details'\n )\n );\n}\n\nfunction getStreamHandlingChunk({\n current,\n next,\n provider,\n}: {\n current?: AIMessageChunk;\n next: AIMessageChunk;\n provider: Providers;\n}): AIMessageChunk | undefined {\n const content = getOpenRouterFinalReasoningContent({\n current,\n next,\n provider,\n });\n if (content == null) {\n return next;\n }\n if (content === '') {\n return undefined;\n }\n return new AIMessageChunk(\n Object.assign({}, next, {\n content,\n additional_kwargs: removeReasoningDetails(next.additional_kwargs),\n })\n );\n}\n\nfunction appendStreamChunk({\n current,\n next,\n provider,\n}: {\n current?: AIMessageChunk;\n next: AIMessageChunk;\n provider: Providers;\n}): AIMessageChunk {\n if (current == null) {\n return next;\n }\n return concat(\n current,\n removeOpenRouterFinalReasoningReplayContent({ current, next, provider })\n );\n}\n\n/**\n * Invokes a chat model with the given messages, handling both streaming and\n * non-streaming paths.\n *\n * By default, stream chunks are processed through a `ChatModelStreamHandler`\n * that dispatches run steps (MESSAGE_CREATION, TOOL_CALLS) for the graph.\n * Pass an `onChunk` callback to override this with custom chunk processing\n * (e.g. summarization delta events).\n */\nexport async function attemptInvoke(\n {\n model,\n messages,\n provider,\n context,\n onChunk,\n }: {\n model: t.ChatModel;\n messages: BaseMessage[];\n provider: Providers;\n context?: InvokeContext;\n onChunk?: OnChunk;\n },\n config?: RunnableConfig\n): Promise<Partial<t.BaseGraphState>> {\n /**\n * Pull the run-scoped tool output registry off the graph (when one\n * exists) and project ToolMessages carrying ref metadata into a\n * transient annotated copy. The original `messages` array stays\n * untouched so the graph state never sees `[ref: …]` / `_ref`\n * payload.\n */\n const registry = context?.getOrCreateToolOutputRegistry();\n const runId = config?.configurable?.run_id as string | undefined;\n const messagesForProvider = annotateMessagesForLLM(messages, registry, runId);\n\n /**\n * Stamp the provider that is ACTUALLY serving this invocation onto the\n * callback metadata. `attemptInvoke` is the single funnel for primary,\n * fallback, and summarization model calls, so consumers that need\n * provider attribution per call (the subagent usage-capture handler)\n * read this key instead of trusting static agent config — which is\n * wrong for fallback-served calls — or `ls_provider` — which derived\n * providers inherit from their base class.\n */\n config = {\n ...config,\n metadata: {\n ...(config?.metadata ?? {}),\n [Constants.INVOKED_PROVIDER]: provider,\n },\n };\n\n if (model.stream) {\n const stream = await model.stream(messagesForProvider, config);\n let finalChunk: AIMessageChunk | undefined;\n const registeredStreamHandler =\n getRegisteredDefaultChatStreamHandler(context);\n\n if (onChunk) {\n for await (const chunk of stream) {\n await onChunk(chunk);\n finalChunk = appendStreamChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n }\n } else if (registeredStreamHandler == null) {\n const metadata = config.metadata as Record<string, unknown> | undefined;\n const streamHandler = new ChatModelStreamHandler();\n for await (const chunk of stream) {\n const handlingChunk = getStreamHandlingChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n if (handlingChunk != null) {\n await streamHandler.handle(\n GraphEvents.CHAT_MODEL_STREAM,\n { chunk: handlingChunk },\n metadata,\n context\n );\n }\n finalChunk = appendStreamChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n }\n } else {\n const metadata = config.metadata as Record<string, unknown> | undefined;\n for await (const chunk of stream) {\n const handlingChunk = getStreamHandlingChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n if (handlingChunk != null && handlingChunk !== chunk) {\n await registeredStreamHandler.handle(\n GraphEvents.CHAT_MODEL_STREAM,\n { chunk: handlingChunk },\n metadata,\n context\n );\n }\n finalChunk = appendStreamChunk({\n current: finalChunk,\n next: chunk,\n provider,\n });\n }\n }\n\n if (manualToolStreamProviders.has(provider)) {\n finalChunk = modifyDeltaProperties(provider, finalChunk);\n }\n\n if ((finalChunk?.tool_calls?.length ?? 0) > 0) {\n finalChunk!.tool_calls = finalChunk!.tool_calls?.filter(\n (tool_call: ToolCall) => !!tool_call.name\n );\n }\n\n return { messages: [finalChunk as AIMessageChunk] };\n }\n\n const finalMessage = await model.invoke(messagesForProvider, config);\n if ((finalMessage.tool_calls?.length ?? 0) > 0) {\n finalMessage.tool_calls = finalMessage.tool_calls?.filter(\n (tool_call: ToolCall) => !!tool_call.name\n );\n }\n return { messages: [finalMessage] };\n}\n\n/**\n * Best-effort read of the configured model name from client options.\n * Providers disagree on the key (`model` vs `modelName`).\n */\nfunction extractClientOptionsModel(\n clientOptions: t.ClientOptions | undefined\n): string | undefined {\n const options = clientOptions as\n | { model?: unknown; modelName?: unknown }\n | undefined;\n if (typeof options?.model === 'string' && options.model !== '') {\n return options.model;\n }\n if (typeof options?.modelName === 'string' && options.modelName !== '') {\n return options.modelName;\n }\n return undefined;\n}\n\n/**\n * Attempts each fallback provider in order until one succeeds.\n * Throws the last error if all fallbacks fail.\n */\nexport async function tryFallbackProviders({\n fallbacks,\n tools,\n messages,\n config,\n primaryError,\n context,\n onChunk,\n}: {\n fallbacks: Array<{ provider: Providers; clientOptions?: t.ClientOptions }>;\n tools?: t.GraphTools;\n messages: BaseMessage[];\n config?: RunnableConfig;\n primaryError: unknown;\n context?: InvokeContext;\n onChunk?: OnChunk;\n}): Promise<Partial<t.BaseGraphState> | undefined> {\n let lastError: unknown = primaryError;\n for (const fb of fallbacks) {\n try {\n const fbModel = initializeModel({\n provider: fb.provider,\n clientOptions: fb.clientOptions,\n tools,\n });\n /**\n * Stamp the fallback's configured model onto callback metadata so\n * per-call attribution (subagent usage capture) doesn't fall back to\n * the PRIMARY config's model when the provider reports no\n * `ls_model_name`. The serving provider is stamped uniformly by\n * `attemptInvoke` (`INVOKED_PROVIDER`).\n */\n const fbModelName = extractClientOptionsModel(fb.clientOptions);\n const fbConfig: RunnableConfig | undefined =\n fbModelName == null\n ? config\n : {\n ...config,\n metadata: {\n ...(config?.metadata ?? {}),\n [Constants.INVOKED_MODEL]: fbModelName,\n },\n };\n const result = await attemptInvoke(\n {\n model: fbModel as t.ChatModel,\n messages,\n provider: fb.provider,\n context,\n onChunk,\n },\n fbConfig\n );\n return result;\n } catch (e) {\n lastError = e;\n continue;\n }\n }\n if (lastError !== undefined) {\n throw lastError;\n }\n return undefined;\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ const require_streamedToolCallSeals = require("../../tools/streamedToolCallSeals.cjs");
1
2
  const require_index = require("./utils/index.cjs");
2
3
  let _langchain_core_messages = require("@langchain/core/messages");
3
4
  let _langchain_openai = require("@langchain/openai");
@@ -301,6 +302,42 @@ var CustomAzureOpenAIClient = class extends openai.AzureOpenAI {
301
302
  });
302
303
  }
303
304
  };
305
+ const OFFICIAL_OPENAI_BASE_URL_PATTERN = /^https:\/\/api\.openai\.com(\/|$)/;
306
+ /**
307
+ * Official OpenAI (api.openai.com) and Azure OpenAI Chat Completions streams
308
+ * emit tool-call deltas strictly sequentially by index: once a delta for a
309
+ * later index appears, a prior index's arguments never change. Stamping this
310
+ * adapter lets the stream handler seal a prior call for eager execution the
311
+ * moment the next call begins. OpenAI-compatible endpoints (custom baseURL)
312
+ * must NOT be stamped — e.g. live Kimi/Moonshot streams revise prior-index
313
+ * args after advancing — so callers gate on the wire endpoint, not the class.
314
+ */
315
+ function stampSequentialStreamedToolCallAdapter(message) {
316
+ if (message instanceof _langchain_core_messages.AIMessageChunk && (message.tool_call_chunks?.length ?? 0) > 0) message.response_metadata = {
317
+ ...message.response_metadata,
318
+ [require_streamedToolCallSeals.STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]: require_streamedToolCallSeals.OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER
319
+ };
320
+ return message;
321
+ }
322
+ function isOfficialOpenAIBaseURL(baseURL) {
323
+ const effectiveBaseURL = baseURL != null && baseURL !== "" ? baseURL : process.env.OPENAI_BASE_URL;
324
+ if (effectiveBaseURL == null || effectiveBaseURL === "") return true;
325
+ return OFFICIAL_OPENAI_BASE_URL_PATTERN.test(effectiveBaseURL);
326
+ }
327
+ const AZURE_FIRST_PARTY_BASE_PATH_PATTERN = /^https:\/\/[^/]+\.(openai\.azure\.com|cognitiveservices\.azure\.com|api\.cognitive\.microsoft\.com)(:\d+)?(\/|$)/;
328
+ /**
329
+ * Azure OpenAI is first-party when requests resolve to an instance-name
330
+ * endpoint or an *.openai.azure.com / *.cognitiveservices.azure.com /
331
+ * regional *.api.cognitive.microsoft.com base path. A custom
332
+ * `clientConfig.baseURL` or a non-Azure `azureOpenAIBasePath` routes through
333
+ * a proxy or Azure-compatible endpoint whose stream contract is unknown, so
334
+ * those are not stamped.
335
+ */
336
+ function isFirstPartyAzureEndpoint(args) {
337
+ if (args.baseURL != null && args.baseURL !== "") return false;
338
+ if (args.azureOpenAIBasePath == null || args.azureOpenAIBasePath === "") return true;
339
+ return AZURE_FIRST_PARTY_BASE_PATH_PATTERN.test(args.azureOpenAIBasePath);
340
+ }
304
341
  var LibreChatOpenAICompletions = class extends _langchain_openai.ChatOpenAICompletions {
305
342
  includeReasoningContent;
306
343
  includeReasoningDetails;
@@ -321,7 +358,9 @@ var LibreChatOpenAICompletions = class extends _langchain_openai.ChatOpenAICompl
321
358
  return completionWithFilteredOpenAIStream(request, requestOptions, super.completionWithRetry.bind(this));
322
359
  }
323
360
  _convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole) {
324
- return attachLibreChatDeltaFields(super._convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole), delta);
361
+ const message = attachLibreChatDeltaFields(super._convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole), delta);
362
+ if (isOfficialOpenAIBaseURL(this.clientConfig.baseURL)) return stampSequentialStreamedToolCallAdapter(message);
363
+ return message;
325
364
  }
326
365
  _convertCompletionsMessageToBaseMessage(message, rawResponse) {
327
366
  return attachLibreChatMessageFields(super._convertCompletionsMessageToBaseMessage(message, rawResponse), message);
@@ -507,6 +546,14 @@ var LibreChatAzureOpenAICompletions = class extends _langchain_openai.AzureChatO
507
546
  _getReasoningParams(options) {
508
547
  return getGatedReasoningParams(this.model, this.reasoning, options);
509
548
  }
549
+ _convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole) {
550
+ const message = super._convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole);
551
+ if (isFirstPartyAzureEndpoint({
552
+ baseURL: this.clientConfig.baseURL,
553
+ azureOpenAIBasePath: this.azureOpenAIBasePath
554
+ })) return stampSequentialStreamedToolCallAdapter(message);
555
+ return message;
556
+ }
510
557
  _getClientOptions(options) {
511
558
  if (!this.client) {
512
559
  const openAIEndpointConfig = {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["isReasoningModel","AIMessageChunk","ChatGenerationChunk","OpenAIClient","AzureOpenAIClient","OriginalChatOpenAICompletions","_convertMessagesToOpenAIParams","AIMessage","OriginalChatOpenAIResponses","OriginalAzureChatOpenAICompletions","OriginalAzureChatOpenAIResponses","OriginalChatOpenAI","OriginalAzureChatOpenAI","OriginalChatDeepSeek","OriginalChatXAI"],"sources":["../../../../src/llm/openai/index.ts"],"sourcesContent":["import { AzureOpenAI as AzureOpenAIClient } from 'openai';\nimport { ChatXAI as OriginalChatXAI } from '@langchain/xai';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport { ToolDefinition } from '@langchain/core/language_models/base';\nimport { ChatDeepSeek as OriginalChatDeepSeek } from '@langchain/deepseek';\nimport { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport {\n AIMessage,\n AIMessageChunk,\n isAIMessage,\n} from '@langchain/core/messages';\nimport {\n convertToOpenAITool,\n isLangChainTool,\n} from '@langchain/core/utils/function_calling';\nimport {\n getEndpoint,\n OpenAIClient,\n getHeadersWithUserAgent,\n ChatOpenAI as OriginalChatOpenAI,\n ChatOpenAIResponses as OriginalChatOpenAIResponses,\n ChatOpenAICompletions as OriginalChatOpenAICompletions,\n AzureChatOpenAI as OriginalAzureChatOpenAI,\n AzureChatOpenAIResponses as OriginalAzureChatOpenAIResponses,\n AzureChatOpenAICompletions as OriginalAzureChatOpenAICompletions,\n} from '@langchain/openai';\nimport type {\n BaseMessage,\n BaseMessageChunk,\n UsageMetadata,\n} from '@langchain/core/messages';\nimport type { BindToolsInput } from '@langchain/core/language_models/chat_models';\nimport type { ChatGeneration, ChatResult } from '@langchain/core/outputs';\nimport type { ChatXAIInput } from '@langchain/xai';\nimport type * as t from '@langchain/openai';\nimport type { HeaderValue, HeadersLike } from './types';\nimport { isReasoningModel, _convertMessagesToOpenAIParams } from './utils';\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nconst iife = <T>(fn: () => T) => fn();\n\nconst STREAM_CHUNK_MIN_SIZE = 4;\nconst STREAM_BOUNDARIES = new Set([' ', '.', ',', '!', '?', ';', ':']);\n\nexport function isHeaders(headers: unknown): headers is Headers {\n return (\n typeof Headers !== 'undefined' &&\n headers !== null &&\n typeof headers === 'object' &&\n Object.prototype.toString.call(headers) === '[object Headers]'\n );\n}\n\nexport function normalizeHeaders(\n headers: HeadersLike\n): Record<string, HeaderValue | readonly HeaderValue[]> {\n const output = iife(() => {\n // If headers is a Headers instance\n if (isHeaders(headers)) {\n return headers;\n }\n // If headers is an array of [key, value] pairs\n else if (Array.isArray(headers)) {\n return new Headers(headers);\n }\n // If headers is a NullableHeaders-like object (has 'values' property that is a Headers)\n else if (\n typeof headers === 'object' &&\n headers !== null &&\n 'values' in headers &&\n isHeaders(headers.values)\n ) {\n return headers.values;\n }\n // If headers is a plain object\n else if (typeof headers === 'object' && headers !== null) {\n const entries: [string, string][] = Object.entries(headers)\n .filter(([, v]) => typeof v === 'string')\n .map(([k, v]) => [k, v as string]);\n return new Headers(entries);\n }\n return new Headers();\n });\n\n return Object.fromEntries(output.entries());\n}\n\ntype OpenAICoreRequestOptions = OpenAIClient.RequestOptions;\ntype OpenAICompletionParam =\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam;\ntype OpenAIClientConfig = NonNullable<\n ConstructorParameters<typeof OpenAIClient>[0]\n>;\ntype LibreChatOpenAIFields = t.ChatOpenAIFields & {\n _lc_stream_delay?: number;\n includeReasoningContent?: boolean;\n includeReasoningDetails?: boolean;\n convertReasoningDetailsToContent?: boolean;\n};\ntype LibreChatAzureOpenAIFields = t.AzureOpenAIInput & {\n _lc_stream_delay?: number;\n};\ntype ReasoningCallOptions = {\n reasoning?: OpenAIClient.Reasoning;\n reasoningEffort?: OpenAIClient.Reasoning['effort'];\n};\ntype OpenAIDeltaWithLibreChatFields = Record<string, unknown> & {\n reasoning?: unknown;\n reasoning_details?: unknown;\n provider_specific_fields?: unknown;\n};\ntype OpenAIClientOwner = {\n client?: OpenAIClient;\n clientConfig: OpenAIClientConfig;\n timeout?: number;\n};\ntype AbortableOpenAIClient = CustomOpenAIClient | CustomAzureOpenAIClient;\ntype OpenAIClientDelegate = {\n client?: AbortableOpenAIClient;\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions;\n};\ntype OpenAIChatCompletion = OpenAIClient.Chat.Completions.ChatCompletion;\ntype OpenAIChatCompletionChunk =\n OpenAIClient.Chat.Completions.ChatCompletionChunk;\ntype OpenAIChatCompletionStreamItem =\n | OpenAIChatCompletionChunk\n | {\n event: string;\n data?: unknown;\n };\ntype OpenAIChatCompletionRequest =\n | OpenAIClient.Chat.ChatCompletionCreateParamsStreaming\n | OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming;\ntype OpenAIChatCompletionResult =\n | AsyncIterable<OpenAIChatCompletionChunk>\n | OpenAIChatCompletion;\ntype PromptTokensDetailsWithCacheWrite = NonNullable<\n OpenAIClient.Completions.CompletionUsage['prompt_tokens_details']\n> & {\n cache_write_tokens?: number;\n};\ntype OpenAIChatCompletionRetry = (\n request: OpenAIChatCompletionRequest,\n requestOptions?: OpenAICoreRequestOptions\n) => Promise<\n AsyncIterable<OpenAIChatCompletionStreamItem> | OpenAIChatCompletion\n>;\n\nfunction createUsageMetadata(\n usage?: OpenAIClient.Completions.CompletionUsage\n): UsageMetadata {\n const usageMetadata: UsageMetadata = {\n input_tokens: usage?.prompt_tokens ?? 0,\n output_tokens: usage?.completion_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n };\n\n if (usage == null) {\n return usageMetadata;\n }\n\n const inputTokenDetails: UsageMetadata['input_token_details'] = {};\n const outputTokenDetails: UsageMetadata['output_token_details'] = {};\n let hasInputTokenDetails = false;\n let hasOutputTokenDetails = false;\n const promptTokenDetails = usage.prompt_tokens_details as\n | PromptTokensDetailsWithCacheWrite\n | undefined;\n const audioInputTokens = promptTokenDetails?.audio_tokens;\n const cachedInputTokens = promptTokenDetails?.cached_tokens;\n const cacheWriteInputTokens = promptTokenDetails?.cache_write_tokens;\n const audioOutputTokens = usage.completion_tokens_details?.audio_tokens;\n const reasoningOutputTokens =\n usage.completion_tokens_details?.reasoning_tokens;\n\n if (audioInputTokens != null) {\n inputTokenDetails.audio = audioInputTokens;\n hasInputTokenDetails = true;\n }\n if (cachedInputTokens != null) {\n inputTokenDetails.cache_read = cachedInputTokens;\n hasInputTokenDetails = true;\n }\n if (cacheWriteInputTokens != null) {\n inputTokenDetails.cache_creation = cacheWriteInputTokens;\n hasInputTokenDetails = true;\n }\n if (audioOutputTokens != null) {\n outputTokenDetails.audio = audioOutputTokens;\n hasOutputTokenDetails = true;\n }\n if (reasoningOutputTokens != null) {\n outputTokenDetails.reasoning = reasoningOutputTokens;\n hasOutputTokenDetails = true;\n }\n\n if (hasInputTokenDetails) {\n usageMetadata.input_token_details = inputTokenDetails;\n }\n if (hasOutputTokenDetails) {\n usageMetadata.output_token_details = outputTokenDetails;\n }\n\n return usageMetadata;\n}\n\nfunction getExposedOpenAIClient(\n completions: OpenAIClientDelegate,\n responses: OpenAIClientDelegate,\n preferResponses: boolean\n): AbortableOpenAIClient {\n const responsesClient = responses.client;\n if (responsesClient?.abortHandler != null) {\n return responsesClient;\n }\n const completionsClient = completions.client;\n if (completionsClient?.abortHandler != null) {\n return completionsClient;\n }\n\n const delegate = preferResponses ? responses : completions;\n delegate._getClientOptions(undefined);\n return delegate.client as AbortableOpenAIClient;\n}\n\nfunction getReasoningParams(\n baseReasoning: OpenAIClient.Reasoning | undefined,\n options?: ReasoningCallOptions\n): OpenAIClient.Reasoning | undefined {\n let reasoning: OpenAIClient.Reasoning | undefined;\n if (baseReasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...baseReasoning,\n };\n }\n if (options?.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...options.reasoning,\n };\n }\n if (\n options?.reasoningEffort !== undefined &&\n reasoning?.effort === undefined\n ) {\n reasoning = {\n ...reasoning,\n effort: options.reasoningEffort,\n };\n }\n return reasoning;\n}\n\nfunction getGatedReasoningParams(\n model: string,\n baseReasoning: OpenAIClient.Reasoning | undefined,\n options?: ReasoningCallOptions\n): OpenAIClient.Reasoning | undefined {\n if (!isReasoningModel(model)) {\n return;\n }\n return getReasoningParams(baseReasoning, options);\n}\n\nfunction isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isOpenAIChatCompletionChunk(\n value: unknown\n): value is OpenAIChatCompletionChunk {\n if (!isObject(value)) {\n return false;\n }\n\n // Intentionally loose: downstream handlers already tolerate empty choices.\n const { choices } = value as { choices?: unknown };\n return Array.isArray(choices);\n}\n\nfunction getOpenAIChatCompletionChunk(\n value: OpenAIChatCompletionStreamItem\n): OpenAIChatCompletionChunk | undefined {\n if (isOpenAIChatCompletionChunk(value)) {\n return value;\n }\n\n const { data } = value;\n if (isOpenAIChatCompletionChunk(data)) {\n return data;\n }\n\n return undefined;\n}\n\nasync function* filterOpenAIChatCompletionStream(\n stream: AsyncIterable<OpenAIChatCompletionStreamItem>\n): AsyncGenerator<OpenAIChatCompletionChunk> {\n for await (const item of stream) {\n const chunk = getOpenAIChatCompletionChunk(item);\n if (chunk == null) {\n continue;\n }\n yield chunk;\n }\n}\n\nasync function completionWithFilteredOpenAIStream(\n request: OpenAIChatCompletionRequest,\n requestOptions: OpenAICoreRequestOptions | undefined,\n completionWithRetry: OpenAIChatCompletionRetry\n): Promise<OpenAIChatCompletionResult> {\n if (request.stream !== true) {\n return (await completionWithRetry(\n request,\n requestOptions\n )) as OpenAIChatCompletion;\n }\n\n const stream = await completionWithRetry(request, requestOptions);\n return filterOpenAIChatCompletionStream(\n stream as AsyncIterable<OpenAIChatCompletionStreamItem>\n );\n}\n\nfunction attachLibreChatDeltaFields(\n chunk: BaseMessageChunk,\n delta: Record<string, unknown>\n): BaseMessageChunk {\n if (!AIMessageChunk.isInstance(chunk)) {\n return chunk;\n }\n\n const libreChatDelta = delta as OpenAIDeltaWithLibreChatFields;\n if (\n libreChatDelta.reasoning != null &&\n chunk.additional_kwargs.reasoning_content == null\n ) {\n chunk.additional_kwargs.reasoning_content = libreChatDelta.reasoning;\n }\n if (libreChatDelta.reasoning_details != null) {\n chunk.additional_kwargs.reasoning_details =\n libreChatDelta.reasoning_details;\n }\n if (libreChatDelta.provider_specific_fields != null) {\n chunk.additional_kwargs.provider_specific_fields =\n libreChatDelta.provider_specific_fields;\n }\n return chunk;\n}\n\nfunction attachLibreChatMessageFields(\n message: BaseMessage,\n rawMessage: Record<string, unknown>\n): BaseMessage {\n if (!isAIMessage(message)) {\n return message;\n }\n if (\n rawMessage.reasoning != null &&\n message.additional_kwargs.reasoning_content == null\n ) {\n message.additional_kwargs.reasoning_content = rawMessage.reasoning;\n }\n if (rawMessage.reasoning_details != null) {\n message.additional_kwargs.reasoning_details = rawMessage.reasoning_details;\n }\n if (rawMessage.provider_specific_fields != null) {\n message.additional_kwargs.provider_specific_fields =\n rawMessage.provider_specific_fields;\n }\n return message;\n}\n\nfunction getCustomOpenAIClientOptions(\n owner: OpenAIClientOwner,\n options?: OpenAICoreRequestOptions\n): OpenAICoreRequestOptions {\n if (!(owner.client as OpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n baseURL: owner.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...owner.clientConfig,\n baseURL: endpoint,\n timeout: owner.timeout,\n maxRetries: 0,\n };\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n owner.client = new CustomOpenAIClient(params);\n }\n const requestOptions = {\n ...owner.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n}\n\nfunction findStreamChunkBoundary(text: string, minSize: number): number {\n if (minSize >= text.length) {\n return text.length;\n }\n\n for (let position = minSize; position < text.length; position++) {\n if (STREAM_BOUNDARIES.has(text[position])) {\n return position + 1;\n }\n }\n\n return text.length;\n}\n\nfunction splitStreamToken(text: string): string[] {\n const chunks: string[] = [];\n let currentIndex = 0;\n\n while (currentIndex < text.length) {\n const remainingText = text.slice(currentIndex);\n const chunkSize = findStreamChunkBoundary(\n remainingText,\n STREAM_CHUNK_MIN_SIZE\n );\n chunks.push(text.slice(currentIndex, currentIndex + chunkSize));\n currentIndex += chunkSize;\n }\n\n return chunks;\n}\n\nfunction splitTextGenerationChunk(\n chunk: ChatGenerationChunk\n): ChatGenerationChunk[] {\n const { message } = chunk;\n if (\n !chunk.text ||\n !(message instanceof AIMessageChunk) ||\n typeof message.content !== 'string' ||\n message.content !== chunk.text ||\n chunk.generationInfo?.logprobs != null ||\n chunk.generationInfo?.finish_reason != null\n ) {\n return [chunk];\n }\n\n const tokenChunks = splitStreamToken(chunk.text);\n if (tokenChunks.length <= 1) {\n return [chunk];\n }\n\n let emittedUsage = false;\n return tokenChunks.map((token) => {\n const usageMetadata =\n emittedUsage && message.usage_metadata != null\n ? undefined\n : message.usage_metadata;\n if (message.usage_metadata != null && !emittedUsage) {\n emittedUsage = true;\n }\n\n return new ChatGenerationChunk({\n text: token,\n generationInfo: chunk.generationInfo,\n message: new AIMessageChunk(\n Object.assign({}, message, {\n content: token,\n usage_metadata: usageMetadata,\n })\n ),\n });\n });\n}\n\nexport async function emitStreamChunkCallback(\n chunk: ChatGenerationChunk,\n runManager?: CallbackManagerForLLMRun\n): Promise<void> {\n await runManager?.handleLLMNewToken(\n chunk.text,\n getStreamChunkTokenIndices(chunk),\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n}\n\nfunction getStreamChunkTokenIndices(\n chunk: ChatGenerationChunk\n): { prompt: number; completion: number } | undefined {\n const prompt = chunk.generationInfo?.prompt;\n const completion = chunk.generationInfo?.completion;\n\n if (typeof prompt === 'number' && typeof completion === 'number') {\n return { prompt, completion };\n }\n\n return undefined;\n}\n\nasync function* delayStreamChunks(\n chunks: AsyncGenerator<ChatGenerationChunk>,\n delay?: number,\n signal?: AbortSignal,\n runManager?: CallbackManagerForLLMRun\n): AsyncGenerator<ChatGenerationChunk> {\n let lastYieldedAt: number | undefined;\n for await (const chunk of chunks) {\n const outputChunks =\n delay != null && delay > 0 ? splitTextGenerationChunk(chunk) : [chunk];\n for (const outputChunk of outputChunks) {\n signal?.throwIfAborted();\n if (delay != null && delay > 0 && lastYieldedAt != null) {\n const timeSinceLastYield = Date.now() - lastYieldedAt;\n const timeToWait = Math.max(0, delay - timeSinceLastYield);\n if (timeToWait > 0) {\n await sleepWithAbort(timeToWait, signal);\n }\n }\n signal?.throwIfAborted();\n lastYieldedAt = Date.now();\n await emitStreamChunkCallback(outputChunk, runManager);\n signal?.throwIfAborted();\n yield outputChunk;\n }\n }\n}\n\nasync function sleepWithAbort(\n delay: number,\n signal?: AbortSignal\n): Promise<void> {\n if (delay <= 0) {\n return;\n }\n signal?.throwIfAborted();\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, delay);\n const onAbort = (): void => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', onAbort);\n reject(signal?.reason ?? new Error('AbortError: User aborted request.'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n if (signal?.aborted === true) {\n onAbort();\n }\n });\n}\n\nfunction createAbortHandler(controller: AbortController): () => void {\n return function (): void {\n controller.abort();\n };\n}\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.ChatCompletionTool {\n let toolDef: OpenAIClient.ChatCompletionTool | undefined;\n\n if (isLangChainTool(tool)) {\n toolDef = convertToOpenAITool(tool);\n } else {\n toolDef = tool as ToolDefinition;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\nexport class CustomOpenAIClient extends OpenAIClient {\n abortHandler?: () => void;\n async fetchWithTimeout(\n url: RequestInfo,\n init: RequestInit | undefined,\n ms: number,\n controller: AbortController\n ): Promise<Response> {\n const { signal, ...options } = init || {};\n const handler = createAbortHandler(controller);\n this.abortHandler = handler;\n if (signal) signal.addEventListener('abort', handler, { once: true });\n\n const timeout = setTimeout(handler, ms);\n\n const fetchOptions = {\n signal: controller.signal as AbortSignal,\n ...options,\n };\n if (fetchOptions.method != null) {\n // Custom methods like 'patch' need to be uppercased\n // See https://github.com/nodejs/undici/issues/2294\n fetchOptions.method = fetchOptions.method.toUpperCase();\n }\n\n return (\n // use undefined this binding; fetch errors if bound to something else in browser/cloudflare\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n /** @ts-ignore */\n this.fetch.call(undefined, url, fetchOptions).finally(() => {\n clearTimeout(timeout);\n })\n );\n }\n}\nexport class CustomAzureOpenAIClient extends AzureOpenAIClient {\n abortHandler?: () => void;\n async fetchWithTimeout(\n url: RequestInfo,\n init: RequestInit | undefined,\n ms: number,\n controller: AbortController\n ): Promise<Response> {\n const { signal, ...options } = init || {};\n const handler = createAbortHandler(controller);\n this.abortHandler = handler;\n if (signal) signal.addEventListener('abort', handler, { once: true });\n\n const timeout = setTimeout(handler, ms);\n\n const fetchOptions = {\n signal: controller.signal as AbortSignal,\n ...options,\n };\n if (fetchOptions.method != null) {\n // Custom methods like 'patch' need to be uppercased\n // See https://github.com/nodejs/undici/issues/2294\n fetchOptions.method = fetchOptions.method.toUpperCase();\n }\n\n return (\n // use undefined this binding; fetch errors if bound to something else in browser/cloudflare\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n /** @ts-ignore */\n this.fetch.call(undefined, url, fetchOptions).finally(() => {\n clearTimeout(timeout);\n })\n );\n }\n}\n\nclass LibreChatOpenAICompletions extends OriginalChatOpenAICompletions {\n private includeReasoningContent?: boolean;\n private includeReasoningDetails?: boolean;\n private convertReasoningDetailsToContent?: boolean;\n\n constructor(fields?: LibreChatOpenAIFields) {\n super(fields);\n this.includeReasoningContent = fields?.includeReasoningContent;\n this.includeReasoningDetails = fields?.includeReasoningDetails;\n this.convertReasoningDetailsToContent =\n fields?.convertReasoningDetailsToContent;\n }\n\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getReasoningParams(this.reasoning, options);\n }\n\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n return getCustomOpenAIClientOptions(this, options);\n }\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIChatCompletionChunk>>;\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<OpenAIChatCompletion>;\n async completionWithRetry(\n request:\n | OpenAIClient.Chat.ChatCompletionCreateParamsStreaming\n | OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIChatCompletionChunk> | OpenAIChatCompletion> {\n return completionWithFilteredOpenAIStream(\n request,\n requestOptions,\n super.completionWithRetry.bind(this) as OpenAIChatCompletionRetry\n );\n }\n\n protected _convertCompletionsDeltaToBaseMessageChunk(\n delta: Record<string, unknown>,\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole\n ): BaseMessageChunk {\n return attachLibreChatDeltaFields(\n super._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n rawResponse,\n defaultRole\n ),\n delta\n );\n }\n\n protected _convertCompletionsMessageToBaseMessage(\n message: OpenAIClient.ChatCompletionMessage,\n rawResponse: OpenAIClient.ChatCompletion\n ): BaseMessage {\n return attachLibreChatMessageFields(\n super._convertCompletionsMessageToBaseMessage(message, rawResponse),\n message as unknown as Record<string, unknown>\n );\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (\n this.includeReasoningContent !== true &&\n this.includeReasoningDetails !== true\n ) {\n return super._generate(messages, options, runManager);\n }\n\n options.signal?.throwIfAborted();\n const usageMetadata: Partial<UsageMetadata> = {};\n const params = this.invocationParams(options);\n const messagesMapped = _convertMessagesToOpenAIParams(\n messages,\n this.model,\n {\n includeReasoningContent: this.includeReasoningContent,\n includeReasoningDetails: this.includeReasoningDetails,\n convertReasoningDetailsToContent: this.convertReasoningDetailsToContent,\n }\n );\n\n if (params.stream === true) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n const finalChunks = new Map<number, ChatGenerationChunk>();\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n const index =\n typeof chunk.generationInfo?.completion === 'number'\n ? chunk.generationInfo.completion\n : 0;\n const existingChunk = finalChunks.get(index);\n if (existingChunk == null) {\n finalChunks.set(index, chunk);\n } else {\n finalChunks.set(index, existingChunk.concat(chunk));\n }\n }\n const generations = Array.from(finalChunks.entries())\n .sort(([aKey], [bKey]) => aKey - bKey)\n .map(([, value]) => value);\n const { functions, function_call } = this.invocationParams(options);\n const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(\n messages,\n functions,\n function_call\n );\n const completionTokenUsage =\n await this._getNumTokensFromGenerations(generations);\n usageMetadata.input_tokens = promptTokenUsage;\n usageMetadata.output_tokens = completionTokenUsage;\n usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;\n return {\n generations,\n llmOutput: {\n estimatedTokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n\n const data = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n messages: messagesMapped,\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n prompt_tokens_details: promptTokensDetails,\n completion_tokens_details: completionTokensDetails,\n } = data.usage ?? {};\n\n if (completionTokens != null) {\n usageMetadata.output_tokens =\n (usageMetadata.output_tokens ?? 0) + completionTokens;\n }\n if (promptTokens != null) {\n usageMetadata.input_tokens =\n (usageMetadata.input_tokens ?? 0) + promptTokens;\n }\n if (totalTokens != null) {\n usageMetadata.total_tokens =\n (usageMetadata.total_tokens ?? 0) + totalTokens;\n }\n const promptTokensDetailsWithCacheWrite = promptTokensDetails as\n | PromptTokensDetailsWithCacheWrite\n | undefined;\n if (\n promptTokensDetailsWithCacheWrite?.audio_tokens != null ||\n promptTokensDetailsWithCacheWrite?.cached_tokens != null ||\n promptTokensDetailsWithCacheWrite?.cache_write_tokens != null\n ) {\n usageMetadata.input_token_details = {\n ...(promptTokensDetailsWithCacheWrite.audio_tokens != null && {\n audio: promptTokensDetailsWithCacheWrite.audio_tokens,\n }),\n ...(promptTokensDetailsWithCacheWrite.cached_tokens != null && {\n cache_read: promptTokensDetailsWithCacheWrite.cached_tokens,\n }),\n ...(promptTokensDetailsWithCacheWrite.cache_write_tokens != null && {\n cache_creation: promptTokensDetailsWithCacheWrite.cache_write_tokens,\n }),\n };\n }\n if (\n completionTokensDetails?.audio_tokens != null ||\n completionTokensDetails?.reasoning_tokens != null\n ) {\n usageMetadata.output_token_details = {\n ...(completionTokensDetails.audio_tokens != null && {\n audio: completionTokensDetails.audio_tokens,\n }),\n ...(completionTokensDetails.reasoning_tokens != null && {\n reasoning: completionTokensDetails.reasoning_tokens,\n }),\n };\n }\n\n const generations: ChatGeneration[] = [];\n for (const part of data.choices) {\n const generation: ChatGeneration = {\n text: part.message.content ?? '',\n message: this._convertCompletionsMessageToBaseMessage(\n part.message,\n data\n ),\n };\n generation.generationInfo = {\n finish_reason: part.finish_reason,\n ...(part.logprobs ? { logprobs: part.logprobs } : {}),\n };\n if (isAIMessage(generation.message)) {\n generation.message.usage_metadata = usageMetadata as UsageMetadata;\n }\n generation.message = new AIMessage(\n Object.fromEntries(\n Object.entries(generation.message).filter(\n ([key]) => !key.startsWith('lc_')\n )\n )\n );\n generations.push(generation);\n }\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (\n this.includeReasoningContent !== true &&\n this.includeReasoningDetails !== true\n ) {\n yield* super._streamResponseChunks(messages, options, runManager);\n return;\n }\n\n const messagesMapped: OpenAICompletionParam[] =\n _convertMessagesToOpenAIParams(messages, this.model, {\n includeReasoningContent: this.includeReasoningContent,\n includeReasoningDetails: this.includeReasoningDetails,\n convertReasoningDetailsToContent: this.convertReasoningDetailsToContent,\n });\n\n const params = {\n ...this.invocationParams(options, {\n streaming: true,\n }),\n messages: messagesMapped,\n stream: true as const,\n };\n let defaultRole: OpenAIClient.Chat.ChatCompletionRole | undefined;\n\n const streamIterable = await this.completionWithRetry(params, options);\n let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n for await (const data of streamIterable) {\n if (options.signal?.aborted === true) {\n return;\n }\n type StreamChoice = Omit<\n OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice,\n 'delta'\n > & {\n delta?: OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice['delta'];\n };\n const choices = data.choices as StreamChoice[] | undefined;\n const choice = choices?.[0];\n if (data.usage != null) {\n usage = data.usage;\n }\n if (choice == null) {\n continue;\n }\n\n const { delta } = choice;\n if (delta == null) {\n continue;\n }\n const chunk = this._convertCompletionsDeltaToBaseMessageChunk(\n delta as unknown as Record<string, unknown>,\n data,\n defaultRole\n );\n defaultRole = delta.role ?? defaultRole;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index,\n };\n if (typeof chunk.content !== 'string') {\n // eslint-disable-next-line no-console\n console.log(\n '[WARNING]: Received non-string content from OpenAI. This is currently not supported.'\n );\n continue;\n }\n const generationInfo: Record<string, unknown> = { ...newTokenIndices };\n if (choice.finish_reason != null) {\n generationInfo.finish_reason = choice.finish_reason;\n generationInfo.system_fingerprint = data.system_fingerprint;\n generationInfo.model_name = data.model;\n generationInfo.service_tier = data.service_tier;\n }\n if (this.logprobs === true) {\n generationInfo.logprobs = choice.logprobs;\n }\n const generationChunk = new ChatGenerationChunk({\n message: chunk,\n text: chunk.content,\n generationInfo,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text,\n newTokenIndices,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (usage) {\n const promptTokenDetails = usage.prompt_tokens_details as\n | PromptTokensDetailsWithCacheWrite\n | undefined;\n const inputTokenDetails = {\n ...(promptTokenDetails?.audio_tokens != null && {\n audio: promptTokenDetails.audio_tokens,\n }),\n ...(promptTokenDetails?.cached_tokens != null && {\n cache_read: promptTokenDetails.cached_tokens,\n }),\n ...(promptTokenDetails?.cache_write_tokens != null && {\n cache_creation: promptTokenDetails.cache_write_tokens,\n }),\n };\n const outputTokenDetails = {\n ...(usage.completion_tokens_details?.audio_tokens != null && {\n audio: usage.completion_tokens_details.audio_tokens,\n }),\n ...(usage.completion_tokens_details?.reasoning_tokens != null && {\n reasoning: usage.completion_tokens_details.reasoning_tokens,\n }),\n };\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: '',\n response_metadata: { usage: { ...usage } },\n usage_metadata: {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n ...(Object.keys(inputTokenDetails).length > 0 && {\n input_token_details: inputTokenDetails,\n }),\n ...(Object.keys(outputTokenDetails).length > 0 && {\n output_token_details: outputTokenDetails,\n }),\n },\n }),\n text: '',\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text,\n {\n prompt: 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (options.signal?.aborted === true) {\n throw new Error('AbortError');\n }\n }\n}\n\nclass LibreChatOpenAIResponses extends OriginalChatOpenAIResponses {\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getReasoningParams(this.reasoning, options);\n }\n\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n return getCustomOpenAIClientOptions(this, options);\n }\n}\n\nclass LibreChatAzureOpenAICompletions extends OriginalAzureChatOpenAICompletions {\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getGatedReasoningParams(this.model, this.reasoning, options);\n }\n\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!(this.client as unknown as AzureOpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n const defaultHeaders = normalizeHeaders(params.defaultHeaders);\n params.defaultHeaders = {\n ...params.defaultHeaders,\n 'User-Agent':\n defaultHeaders['User-Agent'] != null\n ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`\n : 'librechat-azure-openai-v2',\n };\n\n this.client = new CustomAzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...(params as t.AzureOpenAIInput),\n }) as unknown as CustomOpenAIClient;\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey != null) {\n requestOptions.headers = {\n 'api-key': this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n 'api-version': this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIChatCompletionChunk>>;\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<OpenAIChatCompletion>;\n async completionWithRetry(\n request:\n | OpenAIClient.Chat.ChatCompletionCreateParamsStreaming\n | OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIChatCompletionChunk> | OpenAIChatCompletion> {\n return completionWithFilteredOpenAIStream(\n request,\n requestOptions,\n super.completionWithRetry.bind(this) as OpenAIChatCompletionRetry\n );\n }\n}\n\nclass LibreChatAzureOpenAIResponses extends OriginalAzureChatOpenAIResponses {\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getGatedReasoningParams(this.model, this.reasoning, options);\n }\n\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!(this.client as unknown as AzureOpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n const defaultHeaders = normalizeHeaders(params.defaultHeaders);\n params.defaultHeaders = {\n ...params.defaultHeaders,\n 'User-Agent':\n defaultHeaders['User-Agent'] != null\n ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`\n : 'librechat-azure-openai-v2',\n };\n\n this.client = new CustomAzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...(params as t.AzureOpenAIInput),\n }) as unknown as CustomOpenAIClient;\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey != null) {\n requestOptions.headers = {\n 'api-key': this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n 'api-version': this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n}\n\nfunction withLibreChatOpenAIFields(\n fields?: LibreChatOpenAIFields\n): LibreChatOpenAIFields {\n const nextFields = fields ?? {};\n return {\n ...nextFields,\n completions:\n nextFields.completions ?? new LibreChatOpenAICompletions(nextFields),\n responses: nextFields.responses ?? new LibreChatOpenAIResponses(nextFields),\n };\n}\n\nexport class ChatOpenAI extends OriginalChatOpenAI<t.ChatOpenAICallOptions> {\n _lc_stream_delay?: number;\n\n constructor(\n fields?: LibreChatOpenAIFields & t.OpenAIChatInput['modelKwargs']\n ) {\n super(withLibreChatOpenAIFields(fields));\n this._lc_stream_delay = fields?._lc_stream_delay;\n }\n\n public get exposedClient(): CustomOpenAIClient {\n return getExposedOpenAIClient(\n this.completions as OpenAIClientDelegate,\n this.responses as OpenAIClientDelegate,\n this._useResponsesApi(undefined)\n ) as CustomOpenAIClient;\n }\n static lc_name(): string {\n return 'LibreChatOpenAI';\n }\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n if (!(this.client as OpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n this.client = new CustomOpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n /**\n * Returns backwards compatible reasoning parameters from constructor params and call options\n * @internal\n */\n getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getReasoningParams(this.reasoning, options);\n }\n\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return this.getReasoningParams(options);\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* delayStreamChunks(\n super._streamResponseChunks(messages, options, undefined),\n this._lc_stream_delay,\n options.signal,\n runManager\n );\n }\n}\n\nexport class AzureChatOpenAI extends OriginalAzureChatOpenAI {\n _lc_stream_delay?: number;\n\n constructor(fields?: LibreChatAzureOpenAIFields) {\n super(fields);\n this.completions = new LibreChatAzureOpenAICompletions(fields);\n this.responses = new LibreChatAzureOpenAIResponses(fields);\n this._lc_stream_delay = fields?._lc_stream_delay;\n }\n\n public get exposedClient(): CustomOpenAIClient {\n return getExposedOpenAIClient(\n this.completions as OpenAIClientDelegate,\n this.responses as OpenAIClientDelegate,\n this._useResponsesApi(undefined)\n ) as CustomOpenAIClient;\n }\n static lc_name(): 'LibreChatAzureOpenAI' {\n return 'LibreChatAzureOpenAI';\n }\n /**\n * Returns backwards compatible reasoning parameters from constructor params and call options\n * @internal\n */\n getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getGatedReasoningParams(this.model, this.reasoning, options);\n }\n\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return this.getReasoningParams(options);\n }\n\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!(this.client as unknown as AzureOpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n const defaultHeaders = normalizeHeaders(params.defaultHeaders);\n params.defaultHeaders = {\n ...params.defaultHeaders,\n 'User-Agent':\n defaultHeaders['User-Agent'] != null\n ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`\n : 'librechat-azure-openai-v2',\n };\n\n this.client = new CustomAzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...(params as t.AzureOpenAIInput),\n }) as unknown as CustomOpenAIClient;\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey != null) {\n requestOptions.headers = {\n 'api-key': this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n 'api-version': this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* delayStreamChunks(\n super._streamResponseChunks(messages, options, undefined),\n this._lc_stream_delay,\n options.signal,\n runManager\n );\n }\n}\nexport class ChatDeepSeek extends OriginalChatDeepSeek {\n _lc_stream_delay?: number;\n\n constructor(\n fields?: ConstructorParameters<typeof OriginalChatDeepSeek>[0] & {\n _lc_stream_delay?: number;\n }\n ) {\n super(fields);\n this._lc_stream_delay = fields?._lc_stream_delay;\n }\n\n public get exposedClient(): CustomOpenAIClient {\n return this.client;\n }\n static lc_name(): 'LibreChatDeepSeek' {\n return 'LibreChatDeepSeek';\n }\n\n protected _convertDeepSeekMessages(\n messages: BaseMessage[]\n ): OpenAICompletionParam[] {\n return _convertMessagesToOpenAIParams(messages, this.model, {\n includeReasoningContent: true,\n });\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const params = this.invocationParams(options);\n\n if (params.stream === true) {\n return super._generate(messages, options, runManager);\n }\n\n const messagesMapped = this._convertDeepSeekMessages(messages);\n const response = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n messages: messagesMapped,\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n const usageMetadata = createUsageMetadata(response.usage);\n\n const generations: ChatGeneration[] = response.choices.map((part) => {\n const text = part.message.content ?? '';\n const generation: ChatGeneration = {\n text,\n message: this._convertCompletionsMessageToBaseMessage(\n part.message,\n response\n ),\n };\n generation.generationInfo = {\n finish_reason: part.finish_reason,\n ...(part.logprobs != null ? { logprobs: part.logprobs } : {}),\n };\n if (isAIMessage(generation.message)) {\n generation.message.usage_metadata = usageMetadata;\n }\n generation.message = new AIMessage(\n Object.fromEntries(\n Object.entries(generation.message).filter(\n ([key]) => !key.startsWith('lc_')\n )\n )\n );\n return generation;\n });\n\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n if (!(this.client as OpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n this.client = new CustomOpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* delayStreamChunks(\n this._streamResponseChunksWithReasoning(messages, options, undefined),\n this._lc_stream_delay,\n options.signal,\n runManager\n );\n }\n\n /** Parses raw `<think>` fallback tags across chunks and emits sanitized DeepSeek stream chunks. */\n protected async *_streamResponseChunksWithReasoning(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const stream = this._streamResponseChunksFromReasoningMessages(\n messages,\n options\n );\n const thinkStartTag = '<think>';\n const thinkEndTag = '</think>';\n let tokensBuffer = '';\n let isThinking = false;\n\n for await (const chunk of stream) {\n if (options.signal?.aborted === true) {\n throw new Error('AbortError');\n }\n\n const reasoningContent =\n chunk.message.additional_kwargs.reasoning_content;\n if (reasoningContent != null && reasoningContent !== '') {\n yield* this._yieldDeepSeekStreamChunk(chunk, runManager);\n continue;\n }\n\n const text = chunk.text;\n if (text === '') {\n yield* this._yieldDeepSeekStreamChunk(chunk, runManager);\n continue;\n }\n\n tokensBuffer += text;\n\n while (tokensBuffer !== '') {\n if (isThinking) {\n const thinkEndIndex = tokensBuffer.indexOf(thinkEndTag);\n if (thinkEndIndex !== -1) {\n const thoughtContent = tokensBuffer.substring(0, thinkEndIndex);\n if (thoughtContent !== '') {\n yield* this._yieldDeepSeekReasoningText(\n chunk,\n thoughtContent,\n runManager\n );\n }\n\n tokensBuffer = tokensBuffer.substring(\n thinkEndIndex + thinkEndTag.length\n );\n isThinking = false;\n continue;\n }\n\n const splitIndex = this._getDeepSeekPartialTagSplitIndex(\n tokensBuffer,\n thinkEndTag\n );\n if (splitIndex !== -1) {\n const safeToYield = tokensBuffer.substring(0, splitIndex);\n if (safeToYield !== '') {\n yield* this._yieldDeepSeekReasoningText(\n chunk,\n safeToYield,\n runManager\n );\n }\n tokensBuffer = tokensBuffer.substring(splitIndex);\n break;\n }\n\n yield* this._yieldDeepSeekReasoningText(\n chunk,\n tokensBuffer,\n runManager\n );\n tokensBuffer = '';\n break;\n }\n\n const thinkStartIndex = tokensBuffer.indexOf(thinkStartTag);\n if (thinkStartIndex !== -1) {\n const beforeThink = tokensBuffer.substring(0, thinkStartIndex);\n if (beforeThink !== '') {\n yield* this._yieldDeepSeekStreamChunk(\n this._createDeepSeekStreamChunk(chunk, beforeThink),\n runManager\n );\n }\n\n tokensBuffer = tokensBuffer.substring(\n thinkStartIndex + thinkStartTag.length\n );\n isThinking = true;\n continue;\n }\n\n const splitIndex = this._getDeepSeekPartialTagSplitIndex(\n tokensBuffer,\n thinkStartTag\n );\n if (splitIndex !== -1) {\n const safeToYield = tokensBuffer.substring(0, splitIndex);\n if (safeToYield !== '') {\n yield* this._yieldDeepSeekStreamChunk(\n this._createDeepSeekStreamChunk(chunk, safeToYield),\n runManager\n );\n }\n tokensBuffer = tokensBuffer.substring(splitIndex);\n break;\n }\n\n yield* this._yieldDeepSeekStreamChunk(\n this._createDeepSeekStreamChunk(chunk, tokensBuffer),\n runManager\n );\n tokensBuffer = '';\n break;\n }\n }\n\n if (tokensBuffer === '') {\n return;\n }\n\n if (isThinking) {\n yield* this._yieldDeepSeekStreamChunk(\n new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: '',\n additional_kwargs: {\n reasoning_content: tokensBuffer,\n },\n }),\n text: '',\n }),\n runManager\n );\n return;\n }\n\n yield* this._yieldDeepSeekStreamChunk(\n new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: tokensBuffer,\n }),\n text: tokensBuffer,\n }),\n runManager\n );\n }\n\n protected async *_streamResponseChunksFromReasoningMessages(\n messages: BaseMessage[],\n options: this['ParsedCallOptions']\n ): AsyncGenerator<ChatGenerationChunk> {\n const params = {\n ...this.invocationParams(options, { streaming: true }),\n stream: true as const,\n };\n const messagesMapped = this._convertDeepSeekMessages(messages);\n const streamIterable = await this.completionWithRetry(\n {\n ...params,\n messages: messagesMapped,\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n let defaultRole:\n | OpenAIClient.Chat.Completions.ChatCompletionRole\n | undefined;\n let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n\n for await (const data of streamIterable) {\n if (options.signal?.aborted === true) {\n throw new Error('AbortError');\n }\n\n if (data.usage != null) {\n usage = data.usage;\n }\n\n if (data.choices.length === 0) {\n continue;\n }\n\n const choice = data.choices[0];\n const { delta } = choice;\n const messageChunk = this._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n data,\n defaultRole\n );\n defaultRole = delta.role ?? defaultRole;\n\n if (typeof messageChunk.content !== 'string') {\n continue;\n }\n\n const messageText = messageChunk.content;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index,\n };\n const generationInfo = { ...newTokenIndices };\n if (choice.finish_reason != null) {\n Object.assign(generationInfo, {\n finish_reason: choice.finish_reason,\n system_fingerprint: data.system_fingerprint,\n model_name: data.model,\n service_tier: data.service_tier,\n });\n }\n if (this.logprobs === true) {\n Object.assign(generationInfo, { logprobs: choice.logprobs });\n }\n\n const generationChunk = new ChatGenerationChunk({\n message: messageChunk,\n text: messageText,\n generationInfo,\n });\n\n yield generationChunk;\n }\n\n if (usage != null) {\n const usageMetadata = createUsageMetadata(usage);\n\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: '',\n response_metadata: {\n usage: { ...usage },\n },\n usage_metadata: usageMetadata,\n }),\n text: '',\n generationInfo: {\n prompt: 0,\n completion: 0,\n },\n });\n\n yield generationChunk;\n }\n\n if (options.signal?.aborted === true) {\n throw new Error('AbortError');\n }\n }\n\n protected _createDeepSeekStreamChunk(\n chunk: ChatGenerationChunk,\n content: string,\n additionalKwargs?: AIMessageChunk['additional_kwargs'],\n text = content\n ): ChatGenerationChunk {\n if (!(chunk.message instanceof AIMessageChunk)) {\n return new ChatGenerationChunk({\n message: new AIMessageChunk({\n content,\n additional_kwargs:\n additionalKwargs ?? chunk.message.additional_kwargs,\n response_metadata: chunk.message.response_metadata,\n id: chunk.message.id,\n }),\n text,\n generationInfo: chunk.generationInfo,\n });\n }\n\n const message = chunk.message;\n return new ChatGenerationChunk({\n message: new AIMessageChunk({\n content,\n additional_kwargs: additionalKwargs ?? message.additional_kwargs,\n response_metadata: message.response_metadata,\n tool_calls: message.tool_calls,\n tool_call_chunks: message.tool_call_chunks,\n id: message.id,\n }),\n text,\n generationInfo: chunk.generationInfo,\n });\n }\n\n protected _createDeepSeekReasoningStreamChunk(\n chunk: ChatGenerationChunk,\n reasoningContent: string\n ): ChatGenerationChunk {\n return this._createDeepSeekStreamChunk(\n chunk,\n '',\n {\n ...chunk.message.additional_kwargs,\n reasoning_content: reasoningContent,\n },\n ''\n );\n }\n\n protected async *_yieldDeepSeekReasoningText(\n chunk: ChatGenerationChunk,\n reasoningContent: string,\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* this._yieldDeepSeekStreamChunk(\n this._createDeepSeekReasoningStreamChunk(chunk, reasoningContent),\n runManager\n );\n }\n\n protected async *_yieldDeepSeekStreamChunk(\n chunk: ChatGenerationChunk,\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text,\n this._getDeepSeekTokenIndices(chunk),\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n\n protected _getDeepSeekTokenIndices(\n chunk: ChatGenerationChunk\n ): { prompt: number; completion: number } | undefined {\n return getStreamChunkTokenIndices(chunk);\n }\n\n protected _getDeepSeekPartialTagSplitIndex(\n text: string,\n tag: string\n ): number {\n for (let i = tag.length - 1; i >= 1; i--) {\n if (text.endsWith(tag.substring(0, i))) {\n return text.length - i;\n }\n }\n\n return -1;\n }\n}\n\n/** xAI-specific usage metadata type */\nexport interface XAIUsageMetadata\n extends OpenAIClient.Completions.CompletionUsage {\n prompt_tokens_details?: {\n audio_tokens?: number;\n cached_tokens?: number;\n text_tokens?: number;\n image_tokens?: number;\n };\n completion_tokens_details?: {\n audio_tokens?: number;\n reasoning_tokens?: number;\n accepted_prediction_tokens?: number;\n rejected_prediction_tokens?: number;\n };\n num_sources_used?: number;\n}\n\nexport class ChatMoonshot extends ChatOpenAI {\n constructor(\n fields?: LibreChatOpenAIFields & t.OpenAIChatInput['modelKwargs']\n ) {\n super({\n ...fields,\n includeReasoningContent: true,\n });\n }\n\n static lc_name(): 'LibreChatMoonshot' {\n return 'LibreChatMoonshot';\n }\n}\n\nexport class ChatXAI extends OriginalChatXAI {\n _lc_stream_delay?: number;\n\n constructor(\n fields?: Partial<ChatXAIInput> & {\n configuration?: { baseURL?: string };\n clientConfig?: { baseURL?: string };\n _lc_stream_delay?: number;\n }\n ) {\n super(fields);\n this._lc_stream_delay = fields?._lc_stream_delay;\n const customBaseURL =\n fields?.configuration?.baseURL ?? fields?.clientConfig?.baseURL;\n if (customBaseURL != null && customBaseURL) {\n this.clientConfig = {\n ...this.clientConfig,\n baseURL: customBaseURL,\n };\n // Reset the client to force recreation with new config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.client = undefined as any;\n }\n }\n\n static lc_name(): 'LibreChatXAI' {\n return 'LibreChatXAI';\n }\n\n public get exposedClient(): CustomOpenAIClient {\n return this.client;\n }\n\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n if (!(this.client as OpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n this.client = new CustomOpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* delayStreamChunks(\n super._streamResponseChunks(messages, options, undefined),\n this._lc_stream_delay,\n options.signal,\n runManager\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["isReasoningModel","AIMessageChunk","ChatGenerationChunk","OpenAIClient","AzureOpenAIClient","STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY","OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER","OriginalChatOpenAICompletions","_convertMessagesToOpenAIParams","AIMessage","OriginalChatOpenAIResponses","OriginalAzureChatOpenAICompletions","OriginalAzureChatOpenAIResponses","OriginalChatOpenAI","OriginalAzureChatOpenAI","OriginalChatDeepSeek","OriginalChatXAI"],"sources":["../../../../src/llm/openai/index.ts"],"sourcesContent":["import { AzureOpenAI as AzureOpenAIClient } from 'openai';\nimport { ChatXAI as OriginalChatXAI } from '@langchain/xai';\nimport { ChatGenerationChunk } from '@langchain/core/outputs';\nimport { ToolDefinition } from '@langchain/core/language_models/base';\nimport { ChatDeepSeek as OriginalChatDeepSeek } from '@langchain/deepseek';\nimport { CallbackManagerForLLMRun } from '@langchain/core/callbacks/manager';\nimport {\n AIMessage,\n AIMessageChunk,\n isAIMessage,\n} from '@langchain/core/messages';\nimport {\n convertToOpenAITool,\n isLangChainTool,\n} from '@langchain/core/utils/function_calling';\nimport {\n getEndpoint,\n OpenAIClient,\n getHeadersWithUserAgent,\n ChatOpenAI as OriginalChatOpenAI,\n ChatOpenAIResponses as OriginalChatOpenAIResponses,\n ChatOpenAICompletions as OriginalChatOpenAICompletions,\n AzureChatOpenAI as OriginalAzureChatOpenAI,\n AzureChatOpenAIResponses as OriginalAzureChatOpenAIResponses,\n AzureChatOpenAICompletions as OriginalAzureChatOpenAICompletions,\n} from '@langchain/openai';\nimport type {\n BaseMessage,\n BaseMessageChunk,\n UsageMetadata,\n} from '@langchain/core/messages';\nimport type { BindToolsInput } from '@langchain/core/language_models/chat_models';\nimport type { ChatGeneration, ChatResult } from '@langchain/core/outputs';\nimport type { ChatXAIInput } from '@langchain/xai';\nimport type * as t from '@langchain/openai';\nimport type { HeaderValue, HeadersLike } from './types';\nimport {\n STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY,\n OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER,\n} from '@/tools/streamedToolCallSeals';\nimport { isReasoningModel, _convertMessagesToOpenAIParams } from './utils';\n\n// eslint-disable-next-line @typescript-eslint/explicit-function-return-type\nconst iife = <T>(fn: () => T) => fn();\n\nconst STREAM_CHUNK_MIN_SIZE = 4;\nconst STREAM_BOUNDARIES = new Set([' ', '.', ',', '!', '?', ';', ':']);\n\nexport function isHeaders(headers: unknown): headers is Headers {\n return (\n typeof Headers !== 'undefined' &&\n headers !== null &&\n typeof headers === 'object' &&\n Object.prototype.toString.call(headers) === '[object Headers]'\n );\n}\n\nexport function normalizeHeaders(\n headers: HeadersLike\n): Record<string, HeaderValue | readonly HeaderValue[]> {\n const output = iife(() => {\n // If headers is a Headers instance\n if (isHeaders(headers)) {\n return headers;\n }\n // If headers is an array of [key, value] pairs\n else if (Array.isArray(headers)) {\n return new Headers(headers);\n }\n // If headers is a NullableHeaders-like object (has 'values' property that is a Headers)\n else if (\n typeof headers === 'object' &&\n headers !== null &&\n 'values' in headers &&\n isHeaders(headers.values)\n ) {\n return headers.values;\n }\n // If headers is a plain object\n else if (typeof headers === 'object' && headers !== null) {\n const entries: [string, string][] = Object.entries(headers)\n .filter(([, v]) => typeof v === 'string')\n .map(([k, v]) => [k, v as string]);\n return new Headers(entries);\n }\n return new Headers();\n });\n\n return Object.fromEntries(output.entries());\n}\n\ntype OpenAICoreRequestOptions = OpenAIClient.RequestOptions;\ntype OpenAICompletionParam =\n OpenAIClient.Chat.Completions.ChatCompletionMessageParam;\ntype OpenAIClientConfig = NonNullable<\n ConstructorParameters<typeof OpenAIClient>[0]\n>;\ntype LibreChatOpenAIFields = t.ChatOpenAIFields & {\n _lc_stream_delay?: number;\n includeReasoningContent?: boolean;\n includeReasoningDetails?: boolean;\n convertReasoningDetailsToContent?: boolean;\n};\ntype LibreChatAzureOpenAIFields = t.AzureOpenAIInput & {\n _lc_stream_delay?: number;\n};\ntype ReasoningCallOptions = {\n reasoning?: OpenAIClient.Reasoning;\n reasoningEffort?: OpenAIClient.Reasoning['effort'];\n};\ntype OpenAIDeltaWithLibreChatFields = Record<string, unknown> & {\n reasoning?: unknown;\n reasoning_details?: unknown;\n provider_specific_fields?: unknown;\n};\ntype OpenAIClientOwner = {\n client?: OpenAIClient;\n clientConfig: OpenAIClientConfig;\n timeout?: number;\n};\ntype AbortableOpenAIClient = CustomOpenAIClient | CustomAzureOpenAIClient;\ntype OpenAIClientDelegate = {\n client?: AbortableOpenAIClient;\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions;\n};\ntype OpenAIChatCompletion = OpenAIClient.Chat.Completions.ChatCompletion;\ntype OpenAIChatCompletionChunk =\n OpenAIClient.Chat.Completions.ChatCompletionChunk;\ntype OpenAIChatCompletionStreamItem =\n | OpenAIChatCompletionChunk\n | {\n event: string;\n data?: unknown;\n };\ntype OpenAIChatCompletionRequest =\n | OpenAIClient.Chat.ChatCompletionCreateParamsStreaming\n | OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming;\ntype OpenAIChatCompletionResult =\n | AsyncIterable<OpenAIChatCompletionChunk>\n | OpenAIChatCompletion;\ntype PromptTokensDetailsWithCacheWrite = NonNullable<\n OpenAIClient.Completions.CompletionUsage['prompt_tokens_details']\n> & {\n cache_write_tokens?: number;\n};\ntype OpenAIChatCompletionRetry = (\n request: OpenAIChatCompletionRequest,\n requestOptions?: OpenAICoreRequestOptions\n) => Promise<\n AsyncIterable<OpenAIChatCompletionStreamItem> | OpenAIChatCompletion\n>;\n\nfunction createUsageMetadata(\n usage?: OpenAIClient.Completions.CompletionUsage\n): UsageMetadata {\n const usageMetadata: UsageMetadata = {\n input_tokens: usage?.prompt_tokens ?? 0,\n output_tokens: usage?.completion_tokens ?? 0,\n total_tokens: usage?.total_tokens ?? 0,\n };\n\n if (usage == null) {\n return usageMetadata;\n }\n\n const inputTokenDetails: UsageMetadata['input_token_details'] = {};\n const outputTokenDetails: UsageMetadata['output_token_details'] = {};\n let hasInputTokenDetails = false;\n let hasOutputTokenDetails = false;\n const promptTokenDetails = usage.prompt_tokens_details as\n | PromptTokensDetailsWithCacheWrite\n | undefined;\n const audioInputTokens = promptTokenDetails?.audio_tokens;\n const cachedInputTokens = promptTokenDetails?.cached_tokens;\n const cacheWriteInputTokens = promptTokenDetails?.cache_write_tokens;\n const audioOutputTokens = usage.completion_tokens_details?.audio_tokens;\n const reasoningOutputTokens =\n usage.completion_tokens_details?.reasoning_tokens;\n\n if (audioInputTokens != null) {\n inputTokenDetails.audio = audioInputTokens;\n hasInputTokenDetails = true;\n }\n if (cachedInputTokens != null) {\n inputTokenDetails.cache_read = cachedInputTokens;\n hasInputTokenDetails = true;\n }\n if (cacheWriteInputTokens != null) {\n inputTokenDetails.cache_creation = cacheWriteInputTokens;\n hasInputTokenDetails = true;\n }\n if (audioOutputTokens != null) {\n outputTokenDetails.audio = audioOutputTokens;\n hasOutputTokenDetails = true;\n }\n if (reasoningOutputTokens != null) {\n outputTokenDetails.reasoning = reasoningOutputTokens;\n hasOutputTokenDetails = true;\n }\n\n if (hasInputTokenDetails) {\n usageMetadata.input_token_details = inputTokenDetails;\n }\n if (hasOutputTokenDetails) {\n usageMetadata.output_token_details = outputTokenDetails;\n }\n\n return usageMetadata;\n}\n\nfunction getExposedOpenAIClient(\n completions: OpenAIClientDelegate,\n responses: OpenAIClientDelegate,\n preferResponses: boolean\n): AbortableOpenAIClient {\n const responsesClient = responses.client;\n if (responsesClient?.abortHandler != null) {\n return responsesClient;\n }\n const completionsClient = completions.client;\n if (completionsClient?.abortHandler != null) {\n return completionsClient;\n }\n\n const delegate = preferResponses ? responses : completions;\n delegate._getClientOptions(undefined);\n return delegate.client as AbortableOpenAIClient;\n}\n\nfunction getReasoningParams(\n baseReasoning: OpenAIClient.Reasoning | undefined,\n options?: ReasoningCallOptions\n): OpenAIClient.Reasoning | undefined {\n let reasoning: OpenAIClient.Reasoning | undefined;\n if (baseReasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...baseReasoning,\n };\n }\n if (options?.reasoning !== undefined) {\n reasoning = {\n ...reasoning,\n ...options.reasoning,\n };\n }\n if (\n options?.reasoningEffort !== undefined &&\n reasoning?.effort === undefined\n ) {\n reasoning = {\n ...reasoning,\n effort: options.reasoningEffort,\n };\n }\n return reasoning;\n}\n\nfunction getGatedReasoningParams(\n model: string,\n baseReasoning: OpenAIClient.Reasoning | undefined,\n options?: ReasoningCallOptions\n): OpenAIClient.Reasoning | undefined {\n if (!isReasoningModel(model)) {\n return;\n }\n return getReasoningParams(baseReasoning, options);\n}\n\nfunction isObject(value: unknown): value is object {\n return typeof value === 'object' && value !== null;\n}\n\nfunction isOpenAIChatCompletionChunk(\n value: unknown\n): value is OpenAIChatCompletionChunk {\n if (!isObject(value)) {\n return false;\n }\n\n // Intentionally loose: downstream handlers already tolerate empty choices.\n const { choices } = value as { choices?: unknown };\n return Array.isArray(choices);\n}\n\nfunction getOpenAIChatCompletionChunk(\n value: OpenAIChatCompletionStreamItem\n): OpenAIChatCompletionChunk | undefined {\n if (isOpenAIChatCompletionChunk(value)) {\n return value;\n }\n\n const { data } = value;\n if (isOpenAIChatCompletionChunk(data)) {\n return data;\n }\n\n return undefined;\n}\n\nasync function* filterOpenAIChatCompletionStream(\n stream: AsyncIterable<OpenAIChatCompletionStreamItem>\n): AsyncGenerator<OpenAIChatCompletionChunk> {\n for await (const item of stream) {\n const chunk = getOpenAIChatCompletionChunk(item);\n if (chunk == null) {\n continue;\n }\n yield chunk;\n }\n}\n\nasync function completionWithFilteredOpenAIStream(\n request: OpenAIChatCompletionRequest,\n requestOptions: OpenAICoreRequestOptions | undefined,\n completionWithRetry: OpenAIChatCompletionRetry\n): Promise<OpenAIChatCompletionResult> {\n if (request.stream !== true) {\n return (await completionWithRetry(\n request,\n requestOptions\n )) as OpenAIChatCompletion;\n }\n\n const stream = await completionWithRetry(request, requestOptions);\n return filterOpenAIChatCompletionStream(\n stream as AsyncIterable<OpenAIChatCompletionStreamItem>\n );\n}\n\nfunction attachLibreChatDeltaFields(\n chunk: BaseMessageChunk,\n delta: Record<string, unknown>\n): BaseMessageChunk {\n if (!AIMessageChunk.isInstance(chunk)) {\n return chunk;\n }\n\n const libreChatDelta = delta as OpenAIDeltaWithLibreChatFields;\n if (\n libreChatDelta.reasoning != null &&\n chunk.additional_kwargs.reasoning_content == null\n ) {\n chunk.additional_kwargs.reasoning_content = libreChatDelta.reasoning;\n }\n if (libreChatDelta.reasoning_details != null) {\n chunk.additional_kwargs.reasoning_details =\n libreChatDelta.reasoning_details;\n }\n if (libreChatDelta.provider_specific_fields != null) {\n chunk.additional_kwargs.provider_specific_fields =\n libreChatDelta.provider_specific_fields;\n }\n return chunk;\n}\n\nfunction attachLibreChatMessageFields(\n message: BaseMessage,\n rawMessage: Record<string, unknown>\n): BaseMessage {\n if (!isAIMessage(message)) {\n return message;\n }\n if (\n rawMessage.reasoning != null &&\n message.additional_kwargs.reasoning_content == null\n ) {\n message.additional_kwargs.reasoning_content = rawMessage.reasoning;\n }\n if (rawMessage.reasoning_details != null) {\n message.additional_kwargs.reasoning_details = rawMessage.reasoning_details;\n }\n if (rawMessage.provider_specific_fields != null) {\n message.additional_kwargs.provider_specific_fields =\n rawMessage.provider_specific_fields;\n }\n return message;\n}\n\nfunction getCustomOpenAIClientOptions(\n owner: OpenAIClientOwner,\n options?: OpenAICoreRequestOptions\n): OpenAICoreRequestOptions {\n if (!(owner.client as OpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n baseURL: owner.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...owner.clientConfig,\n baseURL: endpoint,\n timeout: owner.timeout,\n maxRetries: 0,\n };\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);\n owner.client = new CustomOpenAIClient(params);\n }\n const requestOptions = {\n ...owner.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n}\n\nfunction findStreamChunkBoundary(text: string, minSize: number): number {\n if (minSize >= text.length) {\n return text.length;\n }\n\n for (let position = minSize; position < text.length; position++) {\n if (STREAM_BOUNDARIES.has(text[position])) {\n return position + 1;\n }\n }\n\n return text.length;\n}\n\nfunction splitStreamToken(text: string): string[] {\n const chunks: string[] = [];\n let currentIndex = 0;\n\n while (currentIndex < text.length) {\n const remainingText = text.slice(currentIndex);\n const chunkSize = findStreamChunkBoundary(\n remainingText,\n STREAM_CHUNK_MIN_SIZE\n );\n chunks.push(text.slice(currentIndex, currentIndex + chunkSize));\n currentIndex += chunkSize;\n }\n\n return chunks;\n}\n\nfunction splitTextGenerationChunk(\n chunk: ChatGenerationChunk\n): ChatGenerationChunk[] {\n const { message } = chunk;\n if (\n !chunk.text ||\n !(message instanceof AIMessageChunk) ||\n typeof message.content !== 'string' ||\n message.content !== chunk.text ||\n chunk.generationInfo?.logprobs != null ||\n chunk.generationInfo?.finish_reason != null\n ) {\n return [chunk];\n }\n\n const tokenChunks = splitStreamToken(chunk.text);\n if (tokenChunks.length <= 1) {\n return [chunk];\n }\n\n let emittedUsage = false;\n return tokenChunks.map((token) => {\n const usageMetadata =\n emittedUsage && message.usage_metadata != null\n ? undefined\n : message.usage_metadata;\n if (message.usage_metadata != null && !emittedUsage) {\n emittedUsage = true;\n }\n\n return new ChatGenerationChunk({\n text: token,\n generationInfo: chunk.generationInfo,\n message: new AIMessageChunk(\n Object.assign({}, message, {\n content: token,\n usage_metadata: usageMetadata,\n })\n ),\n });\n });\n}\n\nexport async function emitStreamChunkCallback(\n chunk: ChatGenerationChunk,\n runManager?: CallbackManagerForLLMRun\n): Promise<void> {\n await runManager?.handleLLMNewToken(\n chunk.text,\n getStreamChunkTokenIndices(chunk),\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n}\n\nfunction getStreamChunkTokenIndices(\n chunk: ChatGenerationChunk\n): { prompt: number; completion: number } | undefined {\n const prompt = chunk.generationInfo?.prompt;\n const completion = chunk.generationInfo?.completion;\n\n if (typeof prompt === 'number' && typeof completion === 'number') {\n return { prompt, completion };\n }\n\n return undefined;\n}\n\nasync function* delayStreamChunks(\n chunks: AsyncGenerator<ChatGenerationChunk>,\n delay?: number,\n signal?: AbortSignal,\n runManager?: CallbackManagerForLLMRun\n): AsyncGenerator<ChatGenerationChunk> {\n let lastYieldedAt: number | undefined;\n for await (const chunk of chunks) {\n const outputChunks =\n delay != null && delay > 0 ? splitTextGenerationChunk(chunk) : [chunk];\n for (const outputChunk of outputChunks) {\n signal?.throwIfAborted();\n if (delay != null && delay > 0 && lastYieldedAt != null) {\n const timeSinceLastYield = Date.now() - lastYieldedAt;\n const timeToWait = Math.max(0, delay - timeSinceLastYield);\n if (timeToWait > 0) {\n await sleepWithAbort(timeToWait, signal);\n }\n }\n signal?.throwIfAborted();\n lastYieldedAt = Date.now();\n await emitStreamChunkCallback(outputChunk, runManager);\n signal?.throwIfAborted();\n yield outputChunk;\n }\n }\n}\n\nasync function sleepWithAbort(\n delay: number,\n signal?: AbortSignal\n): Promise<void> {\n if (delay <= 0) {\n return;\n }\n signal?.throwIfAborted();\n await new Promise<void>((resolve, reject) => {\n const timeout = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, delay);\n const onAbort = (): void => {\n clearTimeout(timeout);\n signal?.removeEventListener('abort', onAbort);\n reject(signal?.reason ?? new Error('AbortError: User aborted request.'));\n };\n signal?.addEventListener('abort', onAbort, { once: true });\n if (signal?.aborted === true) {\n onAbort();\n }\n });\n}\n\nfunction createAbortHandler(controller: AbortController): () => void {\n return function (): void {\n controller.abort();\n };\n}\n/**\n * Formats a tool in either OpenAI format, or LangChain structured tool format\n * into an OpenAI tool format. If the tool is already in OpenAI format, return without\n * any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format\n * using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters\n * returned from the `zodFunction` util are not defined.\n *\n * @param {BindToolsInput} tool The tool to convert to an OpenAI tool.\n * @param {Object} [fields] Additional fields to add to the OpenAI tool.\n * @returns {ToolDefinition} The inputted tool in OpenAI tool format.\n */\nexport function _convertToOpenAITool(\n tool: BindToolsInput,\n fields?: {\n /**\n * If `true`, model output is guaranteed to exactly match the JSON Schema\n * provided in the function definition.\n */\n strict?: boolean;\n }\n): OpenAIClient.ChatCompletionTool {\n let toolDef: OpenAIClient.ChatCompletionTool | undefined;\n\n if (isLangChainTool(tool)) {\n toolDef = convertToOpenAITool(tool);\n } else {\n toolDef = tool as ToolDefinition;\n }\n\n if (fields?.strict !== undefined) {\n toolDef.function.strict = fields.strict;\n }\n\n return toolDef;\n}\nexport class CustomOpenAIClient extends OpenAIClient {\n abortHandler?: () => void;\n async fetchWithTimeout(\n url: RequestInfo,\n init: RequestInit | undefined,\n ms: number,\n controller: AbortController\n ): Promise<Response> {\n const { signal, ...options } = init || {};\n const handler = createAbortHandler(controller);\n this.abortHandler = handler;\n if (signal) signal.addEventListener('abort', handler, { once: true });\n\n const timeout = setTimeout(handler, ms);\n\n const fetchOptions = {\n signal: controller.signal as AbortSignal,\n ...options,\n };\n if (fetchOptions.method != null) {\n // Custom methods like 'patch' need to be uppercased\n // See https://github.com/nodejs/undici/issues/2294\n fetchOptions.method = fetchOptions.method.toUpperCase();\n }\n\n return (\n // use undefined this binding; fetch errors if bound to something else in browser/cloudflare\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n /** @ts-ignore */\n this.fetch.call(undefined, url, fetchOptions).finally(() => {\n clearTimeout(timeout);\n })\n );\n }\n}\nexport class CustomAzureOpenAIClient extends AzureOpenAIClient {\n abortHandler?: () => void;\n async fetchWithTimeout(\n url: RequestInfo,\n init: RequestInit | undefined,\n ms: number,\n controller: AbortController\n ): Promise<Response> {\n const { signal, ...options } = init || {};\n const handler = createAbortHandler(controller);\n this.abortHandler = handler;\n if (signal) signal.addEventListener('abort', handler, { once: true });\n\n const timeout = setTimeout(handler, ms);\n\n const fetchOptions = {\n signal: controller.signal as AbortSignal,\n ...options,\n };\n if (fetchOptions.method != null) {\n // Custom methods like 'patch' need to be uppercased\n // See https://github.com/nodejs/undici/issues/2294\n fetchOptions.method = fetchOptions.method.toUpperCase();\n }\n\n return (\n // use undefined this binding; fetch errors if bound to something else in browser/cloudflare\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n /** @ts-ignore */\n this.fetch.call(undefined, url, fetchOptions).finally(() => {\n clearTimeout(timeout);\n })\n );\n }\n}\n\nconst OFFICIAL_OPENAI_BASE_URL_PATTERN = /^https:\\/\\/api\\.openai\\.com(\\/|$)/;\n\n/**\n * Official OpenAI (api.openai.com) and Azure OpenAI Chat Completions streams\n * emit tool-call deltas strictly sequentially by index: once a delta for a\n * later index appears, a prior index's arguments never change. Stamping this\n * adapter lets the stream handler seal a prior call for eager execution the\n * moment the next call begins. OpenAI-compatible endpoints (custom baseURL)\n * must NOT be stamped — e.g. live Kimi/Moonshot streams revise prior-index\n * args after advancing — so callers gate on the wire endpoint, not the class.\n */\nfunction stampSequentialStreamedToolCallAdapter(\n message: BaseMessageChunk\n): BaseMessageChunk {\n if (\n message instanceof AIMessageChunk &&\n (message.tool_call_chunks?.length ?? 0) > 0\n ) {\n message.response_metadata = {\n ...message.response_metadata,\n [STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]:\n OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER,\n };\n }\n return message;\n}\n\nfunction isOfficialOpenAIBaseURL(baseURL: string | null | undefined): boolean {\n // The OpenAI SDK falls back to OPENAI_BASE_URL when the client has no\n // explicit baseURL, so an unset constructor value can still route to an\n // OpenAI-compatible endpoint.\n const effectiveBaseURL =\n baseURL != null && baseURL !== '' ? baseURL : process.env.OPENAI_BASE_URL;\n if (effectiveBaseURL == null || effectiveBaseURL === '') {\n return true;\n }\n return OFFICIAL_OPENAI_BASE_URL_PATTERN.test(effectiveBaseURL);\n}\n\nconst AZURE_FIRST_PARTY_BASE_PATH_PATTERN =\n /^https:\\/\\/[^/]+\\.(openai\\.azure\\.com|cognitiveservices\\.azure\\.com|api\\.cognitive\\.microsoft\\.com)(:\\d+)?(\\/|$)/;\n\n/**\n * Azure OpenAI is first-party when requests resolve to an instance-name\n * endpoint or an *.openai.azure.com / *.cognitiveservices.azure.com /\n * regional *.api.cognitive.microsoft.com base path. A custom\n * `clientConfig.baseURL` or a non-Azure `azureOpenAIBasePath` routes through\n * a proxy or Azure-compatible endpoint whose stream contract is unknown, so\n * those are not stamped.\n */\nfunction isFirstPartyAzureEndpoint(args: {\n baseURL: string | null | undefined;\n azureOpenAIBasePath: string | undefined;\n}): boolean {\n if (args.baseURL != null && args.baseURL !== '') {\n return false;\n }\n if (args.azureOpenAIBasePath == null || args.azureOpenAIBasePath === '') {\n return true;\n }\n return AZURE_FIRST_PARTY_BASE_PATH_PATTERN.test(args.azureOpenAIBasePath);\n}\n\nclass LibreChatOpenAICompletions extends OriginalChatOpenAICompletions {\n private includeReasoningContent?: boolean;\n private includeReasoningDetails?: boolean;\n private convertReasoningDetailsToContent?: boolean;\n\n constructor(fields?: LibreChatOpenAIFields) {\n super(fields);\n this.includeReasoningContent = fields?.includeReasoningContent;\n this.includeReasoningDetails = fields?.includeReasoningDetails;\n this.convertReasoningDetailsToContent =\n fields?.convertReasoningDetailsToContent;\n }\n\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getReasoningParams(this.reasoning, options);\n }\n\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n return getCustomOpenAIClientOptions(this, options);\n }\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIChatCompletionChunk>>;\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<OpenAIChatCompletion>;\n async completionWithRetry(\n request:\n | OpenAIClient.Chat.ChatCompletionCreateParamsStreaming\n | OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIChatCompletionChunk> | OpenAIChatCompletion> {\n return completionWithFilteredOpenAIStream(\n request,\n requestOptions,\n super.completionWithRetry.bind(this) as OpenAIChatCompletionRetry\n );\n }\n\n protected _convertCompletionsDeltaToBaseMessageChunk(\n delta: Record<string, unknown>,\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole\n ): BaseMessageChunk {\n const message = attachLibreChatDeltaFields(\n super._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n rawResponse,\n defaultRole\n ),\n delta\n );\n if (isOfficialOpenAIBaseURL(this.clientConfig.baseURL)) {\n return stampSequentialStreamedToolCallAdapter(message);\n }\n return message;\n }\n\n protected _convertCompletionsMessageToBaseMessage(\n message: OpenAIClient.ChatCompletionMessage,\n rawResponse: OpenAIClient.ChatCompletion\n ): BaseMessage {\n return attachLibreChatMessageFields(\n super._convertCompletionsMessageToBaseMessage(message, rawResponse),\n message as unknown as Record<string, unknown>\n );\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n if (\n this.includeReasoningContent !== true &&\n this.includeReasoningDetails !== true\n ) {\n return super._generate(messages, options, runManager);\n }\n\n options.signal?.throwIfAborted();\n const usageMetadata: Partial<UsageMetadata> = {};\n const params = this.invocationParams(options);\n const messagesMapped = _convertMessagesToOpenAIParams(\n messages,\n this.model,\n {\n includeReasoningContent: this.includeReasoningContent,\n includeReasoningDetails: this.includeReasoningDetails,\n convertReasoningDetailsToContent: this.convertReasoningDetailsToContent,\n }\n );\n\n if (params.stream === true) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n const finalChunks = new Map<number, ChatGenerationChunk>();\n for await (const chunk of stream) {\n chunk.message.response_metadata = {\n ...chunk.generationInfo,\n ...chunk.message.response_metadata,\n };\n const index =\n typeof chunk.generationInfo?.completion === 'number'\n ? chunk.generationInfo.completion\n : 0;\n const existingChunk = finalChunks.get(index);\n if (existingChunk == null) {\n finalChunks.set(index, chunk);\n } else {\n finalChunks.set(index, existingChunk.concat(chunk));\n }\n }\n const generations = Array.from(finalChunks.entries())\n .sort(([aKey], [bKey]) => aKey - bKey)\n .map(([, value]) => value);\n const { functions, function_call } = this.invocationParams(options);\n const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(\n messages,\n functions,\n function_call\n );\n const completionTokenUsage =\n await this._getNumTokensFromGenerations(generations);\n usageMetadata.input_tokens = promptTokenUsage;\n usageMetadata.output_tokens = completionTokenUsage;\n usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;\n return {\n generations,\n llmOutput: {\n estimatedTokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n\n const data = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n messages: messagesMapped,\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n const {\n completion_tokens: completionTokens,\n prompt_tokens: promptTokens,\n total_tokens: totalTokens,\n prompt_tokens_details: promptTokensDetails,\n completion_tokens_details: completionTokensDetails,\n } = data.usage ?? {};\n\n if (completionTokens != null) {\n usageMetadata.output_tokens =\n (usageMetadata.output_tokens ?? 0) + completionTokens;\n }\n if (promptTokens != null) {\n usageMetadata.input_tokens =\n (usageMetadata.input_tokens ?? 0) + promptTokens;\n }\n if (totalTokens != null) {\n usageMetadata.total_tokens =\n (usageMetadata.total_tokens ?? 0) + totalTokens;\n }\n const promptTokensDetailsWithCacheWrite = promptTokensDetails as\n | PromptTokensDetailsWithCacheWrite\n | undefined;\n if (\n promptTokensDetailsWithCacheWrite?.audio_tokens != null ||\n promptTokensDetailsWithCacheWrite?.cached_tokens != null ||\n promptTokensDetailsWithCacheWrite?.cache_write_tokens != null\n ) {\n usageMetadata.input_token_details = {\n ...(promptTokensDetailsWithCacheWrite.audio_tokens != null && {\n audio: promptTokensDetailsWithCacheWrite.audio_tokens,\n }),\n ...(promptTokensDetailsWithCacheWrite.cached_tokens != null && {\n cache_read: promptTokensDetailsWithCacheWrite.cached_tokens,\n }),\n ...(promptTokensDetailsWithCacheWrite.cache_write_tokens != null && {\n cache_creation: promptTokensDetailsWithCacheWrite.cache_write_tokens,\n }),\n };\n }\n if (\n completionTokensDetails?.audio_tokens != null ||\n completionTokensDetails?.reasoning_tokens != null\n ) {\n usageMetadata.output_token_details = {\n ...(completionTokensDetails.audio_tokens != null && {\n audio: completionTokensDetails.audio_tokens,\n }),\n ...(completionTokensDetails.reasoning_tokens != null && {\n reasoning: completionTokensDetails.reasoning_tokens,\n }),\n };\n }\n\n const generations: ChatGeneration[] = [];\n for (const part of data.choices) {\n const generation: ChatGeneration = {\n text: part.message.content ?? '',\n message: this._convertCompletionsMessageToBaseMessage(\n part.message,\n data\n ),\n };\n generation.generationInfo = {\n finish_reason: part.finish_reason,\n ...(part.logprobs ? { logprobs: part.logprobs } : {}),\n };\n if (isAIMessage(generation.message)) {\n generation.message.usage_metadata = usageMetadata as UsageMetadata;\n }\n generation.message = new AIMessage(\n Object.fromEntries(\n Object.entries(generation.message).filter(\n ([key]) => !key.startsWith('lc_')\n )\n )\n );\n generations.push(generation);\n }\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n if (\n this.includeReasoningContent !== true &&\n this.includeReasoningDetails !== true\n ) {\n yield* super._streamResponseChunks(messages, options, runManager);\n return;\n }\n\n const messagesMapped: OpenAICompletionParam[] =\n _convertMessagesToOpenAIParams(messages, this.model, {\n includeReasoningContent: this.includeReasoningContent,\n includeReasoningDetails: this.includeReasoningDetails,\n convertReasoningDetailsToContent: this.convertReasoningDetailsToContent,\n });\n\n const params = {\n ...this.invocationParams(options, {\n streaming: true,\n }),\n messages: messagesMapped,\n stream: true as const,\n };\n let defaultRole: OpenAIClient.Chat.ChatCompletionRole | undefined;\n\n const streamIterable = await this.completionWithRetry(params, options);\n let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n for await (const data of streamIterable) {\n if (options.signal?.aborted === true) {\n return;\n }\n type StreamChoice = Omit<\n OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice,\n 'delta'\n > & {\n delta?: OpenAIClient.Chat.Completions.ChatCompletionChunk.Choice['delta'];\n };\n const choices = data.choices as StreamChoice[] | undefined;\n const choice = choices?.[0];\n if (data.usage != null) {\n usage = data.usage;\n }\n if (choice == null) {\n continue;\n }\n\n const { delta } = choice;\n if (delta == null) {\n continue;\n }\n const chunk = this._convertCompletionsDeltaToBaseMessageChunk(\n delta as unknown as Record<string, unknown>,\n data,\n defaultRole\n );\n defaultRole = delta.role ?? defaultRole;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index,\n };\n if (typeof chunk.content !== 'string') {\n // eslint-disable-next-line no-console\n console.log(\n '[WARNING]: Received non-string content from OpenAI. This is currently not supported.'\n );\n continue;\n }\n const generationInfo: Record<string, unknown> = { ...newTokenIndices };\n if (choice.finish_reason != null) {\n generationInfo.finish_reason = choice.finish_reason;\n generationInfo.system_fingerprint = data.system_fingerprint;\n generationInfo.model_name = data.model;\n generationInfo.service_tier = data.service_tier;\n }\n if (this.logprobs === true) {\n generationInfo.logprobs = choice.logprobs;\n }\n const generationChunk = new ChatGenerationChunk({\n message: chunk,\n text: chunk.content,\n generationInfo,\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text,\n newTokenIndices,\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (usage) {\n const promptTokenDetails = usage.prompt_tokens_details as\n | PromptTokensDetailsWithCacheWrite\n | undefined;\n const inputTokenDetails = {\n ...(promptTokenDetails?.audio_tokens != null && {\n audio: promptTokenDetails.audio_tokens,\n }),\n ...(promptTokenDetails?.cached_tokens != null && {\n cache_read: promptTokenDetails.cached_tokens,\n }),\n ...(promptTokenDetails?.cache_write_tokens != null && {\n cache_creation: promptTokenDetails.cache_write_tokens,\n }),\n };\n const outputTokenDetails = {\n ...(usage.completion_tokens_details?.audio_tokens != null && {\n audio: usage.completion_tokens_details.audio_tokens,\n }),\n ...(usage.completion_tokens_details?.reasoning_tokens != null && {\n reasoning: usage.completion_tokens_details.reasoning_tokens,\n }),\n };\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: '',\n response_metadata: { usage: { ...usage } },\n usage_metadata: {\n input_tokens: usage.prompt_tokens,\n output_tokens: usage.completion_tokens,\n total_tokens: usage.total_tokens,\n ...(Object.keys(inputTokenDetails).length > 0 && {\n input_token_details: inputTokenDetails,\n }),\n ...(Object.keys(outputTokenDetails).length > 0 && {\n output_token_details: outputTokenDetails,\n }),\n },\n }),\n text: '',\n });\n yield generationChunk;\n await runManager?.handleLLMNewToken(\n generationChunk.text,\n {\n prompt: 0,\n completion: 0,\n },\n undefined,\n undefined,\n undefined,\n { chunk: generationChunk }\n );\n }\n if (options.signal?.aborted === true) {\n throw new Error('AbortError');\n }\n }\n}\n\nclass LibreChatOpenAIResponses extends OriginalChatOpenAIResponses {\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getReasoningParams(this.reasoning, options);\n }\n\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n return getCustomOpenAIClientOptions(this, options);\n }\n}\n\nclass LibreChatAzureOpenAICompletions extends OriginalAzureChatOpenAICompletions {\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getGatedReasoningParams(this.model, this.reasoning, options);\n }\n\n protected _convertCompletionsDeltaToBaseMessageChunk(\n delta: Record<string, unknown>,\n rawResponse: OpenAIClient.Chat.Completions.ChatCompletionChunk,\n defaultRole?: OpenAIClient.Chat.ChatCompletionRole\n ): BaseMessageChunk {\n const message = super._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n rawResponse,\n defaultRole\n );\n if (\n isFirstPartyAzureEndpoint({\n baseURL: this.clientConfig.baseURL,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n })\n ) {\n // First-party Azure OpenAI: same sequential-by-index stream contract\n // as api.openai.com.\n return stampSequentialStreamedToolCallAdapter(message);\n }\n return message;\n }\n\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!(this.client as unknown as AzureOpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n const defaultHeaders = normalizeHeaders(params.defaultHeaders);\n params.defaultHeaders = {\n ...params.defaultHeaders,\n 'User-Agent':\n defaultHeaders['User-Agent'] != null\n ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`\n : 'librechat-azure-openai-v2',\n };\n\n this.client = new CustomAzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...(params as t.AzureOpenAIInput),\n }) as unknown as CustomOpenAIClient;\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey != null) {\n requestOptions.headers = {\n 'api-key': this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n 'api-version': this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIChatCompletionChunk>>;\n async completionWithRetry(\n request: OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<OpenAIChatCompletion>;\n async completionWithRetry(\n request:\n | OpenAIClient.Chat.ChatCompletionCreateParamsStreaming\n | OpenAIClient.Chat.ChatCompletionCreateParamsNonStreaming,\n requestOptions?: OpenAICoreRequestOptions\n ): Promise<AsyncIterable<OpenAIChatCompletionChunk> | OpenAIChatCompletion> {\n return completionWithFilteredOpenAIStream(\n request,\n requestOptions,\n super.completionWithRetry.bind(this) as OpenAIChatCompletionRetry\n );\n }\n}\n\nclass LibreChatAzureOpenAIResponses extends OriginalAzureChatOpenAIResponses {\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getGatedReasoningParams(this.model, this.reasoning, options);\n }\n\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!(this.client as unknown as AzureOpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n const defaultHeaders = normalizeHeaders(params.defaultHeaders);\n params.defaultHeaders = {\n ...params.defaultHeaders,\n 'User-Agent':\n defaultHeaders['User-Agent'] != null\n ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`\n : 'librechat-azure-openai-v2',\n };\n\n this.client = new CustomAzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...(params as t.AzureOpenAIInput),\n }) as unknown as CustomOpenAIClient;\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey != null) {\n requestOptions.headers = {\n 'api-key': this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n 'api-version': this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n}\n\nfunction withLibreChatOpenAIFields(\n fields?: LibreChatOpenAIFields\n): LibreChatOpenAIFields {\n const nextFields = fields ?? {};\n return {\n ...nextFields,\n completions:\n nextFields.completions ?? new LibreChatOpenAICompletions(nextFields),\n responses: nextFields.responses ?? new LibreChatOpenAIResponses(nextFields),\n };\n}\n\nexport class ChatOpenAI extends OriginalChatOpenAI<t.ChatOpenAICallOptions> {\n _lc_stream_delay?: number;\n\n constructor(\n fields?: LibreChatOpenAIFields & t.OpenAIChatInput['modelKwargs']\n ) {\n super(withLibreChatOpenAIFields(fields));\n this._lc_stream_delay = fields?._lc_stream_delay;\n }\n\n public get exposedClient(): CustomOpenAIClient {\n return getExposedOpenAIClient(\n this.completions as OpenAIClientDelegate,\n this.responses as OpenAIClientDelegate,\n this._useResponsesApi(undefined)\n ) as CustomOpenAIClient;\n }\n static lc_name(): string {\n return 'LibreChatOpenAI';\n }\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n if (!(this.client as OpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n this.client = new CustomOpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n /**\n * Returns backwards compatible reasoning parameters from constructor params and call options\n * @internal\n */\n getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getReasoningParams(this.reasoning, options);\n }\n\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return this.getReasoningParams(options);\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* delayStreamChunks(\n super._streamResponseChunks(messages, options, undefined),\n this._lc_stream_delay,\n options.signal,\n runManager\n );\n }\n}\n\nexport class AzureChatOpenAI extends OriginalAzureChatOpenAI {\n _lc_stream_delay?: number;\n\n constructor(fields?: LibreChatAzureOpenAIFields) {\n super(fields);\n this.completions = new LibreChatAzureOpenAICompletions(fields);\n this.responses = new LibreChatAzureOpenAIResponses(fields);\n this._lc_stream_delay = fields?._lc_stream_delay;\n }\n\n public get exposedClient(): CustomOpenAIClient {\n return getExposedOpenAIClient(\n this.completions as OpenAIClientDelegate,\n this.responses as OpenAIClientDelegate,\n this._useResponsesApi(undefined)\n ) as CustomOpenAIClient;\n }\n static lc_name(): 'LibreChatAzureOpenAI' {\n return 'LibreChatAzureOpenAI';\n }\n /**\n * Returns backwards compatible reasoning parameters from constructor params and call options\n * @internal\n */\n getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return getGatedReasoningParams(this.model, this.reasoning, options);\n }\n\n protected _getReasoningParams(\n options?: this['ParsedCallOptions']\n ): OpenAIClient.Reasoning | undefined {\n return this.getReasoningParams(options);\n }\n\n _getClientOptions(\n options: OpenAICoreRequestOptions | undefined\n ): OpenAICoreRequestOptions {\n if (!(this.client as unknown as AzureOpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,\n azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,\n azureOpenAIApiKey: this.azureOpenAIApiKey,\n azureOpenAIBasePath: this.azureOpenAIBasePath,\n azureADTokenProvider: this.azureADTokenProvider,\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n\n if (!this.azureADTokenProvider) {\n params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;\n }\n\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n const defaultHeaders = normalizeHeaders(params.defaultHeaders);\n params.defaultHeaders = {\n ...params.defaultHeaders,\n 'User-Agent':\n defaultHeaders['User-Agent'] != null\n ? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`\n : 'librechat-azure-openai-v2',\n };\n\n this.client = new CustomAzureOpenAIClient({\n apiVersion: this.azureOpenAIApiVersion,\n azureADTokenProvider: this.azureADTokenProvider,\n ...(params as t.AzureOpenAIInput),\n }) as unknown as CustomOpenAIClient;\n }\n\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n if (this.azureOpenAIApiKey != null) {\n requestOptions.headers = {\n 'api-key': this.azureOpenAIApiKey,\n ...requestOptions.headers,\n };\n requestOptions.query = {\n 'api-version': this.azureOpenAIApiVersion,\n ...requestOptions.query,\n };\n }\n return requestOptions;\n }\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* delayStreamChunks(\n super._streamResponseChunks(messages, options, undefined),\n this._lc_stream_delay,\n options.signal,\n runManager\n );\n }\n}\nexport class ChatDeepSeek extends OriginalChatDeepSeek {\n _lc_stream_delay?: number;\n\n constructor(\n fields?: ConstructorParameters<typeof OriginalChatDeepSeek>[0] & {\n _lc_stream_delay?: number;\n }\n ) {\n super(fields);\n this._lc_stream_delay = fields?._lc_stream_delay;\n }\n\n public get exposedClient(): CustomOpenAIClient {\n return this.client;\n }\n static lc_name(): 'LibreChatDeepSeek' {\n return 'LibreChatDeepSeek';\n }\n\n protected _convertDeepSeekMessages(\n messages: BaseMessage[]\n ): OpenAICompletionParam[] {\n return _convertMessagesToOpenAIParams(messages, this.model, {\n includeReasoningContent: true,\n });\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const params = this.invocationParams(options);\n\n if (params.stream === true) {\n return super._generate(messages, options, runManager);\n }\n\n const messagesMapped = this._convertDeepSeekMessages(messages);\n const response = await this.completionWithRetry(\n {\n ...params,\n stream: false,\n messages: messagesMapped,\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n const usageMetadata = createUsageMetadata(response.usage);\n\n const generations: ChatGeneration[] = response.choices.map((part) => {\n const text = part.message.content ?? '';\n const generation: ChatGeneration = {\n text,\n message: this._convertCompletionsMessageToBaseMessage(\n part.message,\n response\n ),\n };\n generation.generationInfo = {\n finish_reason: part.finish_reason,\n ...(part.logprobs != null ? { logprobs: part.logprobs } : {}),\n };\n if (isAIMessage(generation.message)) {\n generation.message.usage_metadata = usageMetadata;\n }\n generation.message = new AIMessage(\n Object.fromEntries(\n Object.entries(generation.message).filter(\n ([key]) => !key.startsWith('lc_')\n )\n )\n );\n return generation;\n });\n\n return {\n generations,\n llmOutput: {\n tokenUsage: {\n promptTokens: usageMetadata.input_tokens,\n completionTokens: usageMetadata.output_tokens,\n totalTokens: usageMetadata.total_tokens,\n },\n },\n };\n }\n\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n if (!(this.client as OpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n this.client = new CustomOpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* delayStreamChunks(\n this._streamResponseChunksWithReasoning(messages, options, undefined),\n this._lc_stream_delay,\n options.signal,\n runManager\n );\n }\n\n /** Parses raw `<think>` fallback tags across chunks and emits sanitized DeepSeek stream chunks. */\n protected async *_streamResponseChunksWithReasoning(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n const stream = this._streamResponseChunksFromReasoningMessages(\n messages,\n options\n );\n const thinkStartTag = '<think>';\n const thinkEndTag = '</think>';\n let tokensBuffer = '';\n let isThinking = false;\n\n for await (const chunk of stream) {\n if (options.signal?.aborted === true) {\n throw new Error('AbortError');\n }\n\n const reasoningContent =\n chunk.message.additional_kwargs.reasoning_content;\n if (reasoningContent != null && reasoningContent !== '') {\n yield* this._yieldDeepSeekStreamChunk(chunk, runManager);\n continue;\n }\n\n const text = chunk.text;\n if (text === '') {\n yield* this._yieldDeepSeekStreamChunk(chunk, runManager);\n continue;\n }\n\n tokensBuffer += text;\n\n while (tokensBuffer !== '') {\n if (isThinking) {\n const thinkEndIndex = tokensBuffer.indexOf(thinkEndTag);\n if (thinkEndIndex !== -1) {\n const thoughtContent = tokensBuffer.substring(0, thinkEndIndex);\n if (thoughtContent !== '') {\n yield* this._yieldDeepSeekReasoningText(\n chunk,\n thoughtContent,\n runManager\n );\n }\n\n tokensBuffer = tokensBuffer.substring(\n thinkEndIndex + thinkEndTag.length\n );\n isThinking = false;\n continue;\n }\n\n const splitIndex = this._getDeepSeekPartialTagSplitIndex(\n tokensBuffer,\n thinkEndTag\n );\n if (splitIndex !== -1) {\n const safeToYield = tokensBuffer.substring(0, splitIndex);\n if (safeToYield !== '') {\n yield* this._yieldDeepSeekReasoningText(\n chunk,\n safeToYield,\n runManager\n );\n }\n tokensBuffer = tokensBuffer.substring(splitIndex);\n break;\n }\n\n yield* this._yieldDeepSeekReasoningText(\n chunk,\n tokensBuffer,\n runManager\n );\n tokensBuffer = '';\n break;\n }\n\n const thinkStartIndex = tokensBuffer.indexOf(thinkStartTag);\n if (thinkStartIndex !== -1) {\n const beforeThink = tokensBuffer.substring(0, thinkStartIndex);\n if (beforeThink !== '') {\n yield* this._yieldDeepSeekStreamChunk(\n this._createDeepSeekStreamChunk(chunk, beforeThink),\n runManager\n );\n }\n\n tokensBuffer = tokensBuffer.substring(\n thinkStartIndex + thinkStartTag.length\n );\n isThinking = true;\n continue;\n }\n\n const splitIndex = this._getDeepSeekPartialTagSplitIndex(\n tokensBuffer,\n thinkStartTag\n );\n if (splitIndex !== -1) {\n const safeToYield = tokensBuffer.substring(0, splitIndex);\n if (safeToYield !== '') {\n yield* this._yieldDeepSeekStreamChunk(\n this._createDeepSeekStreamChunk(chunk, safeToYield),\n runManager\n );\n }\n tokensBuffer = tokensBuffer.substring(splitIndex);\n break;\n }\n\n yield* this._yieldDeepSeekStreamChunk(\n this._createDeepSeekStreamChunk(chunk, tokensBuffer),\n runManager\n );\n tokensBuffer = '';\n break;\n }\n }\n\n if (tokensBuffer === '') {\n return;\n }\n\n if (isThinking) {\n yield* this._yieldDeepSeekStreamChunk(\n new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: '',\n additional_kwargs: {\n reasoning_content: tokensBuffer,\n },\n }),\n text: '',\n }),\n runManager\n );\n return;\n }\n\n yield* this._yieldDeepSeekStreamChunk(\n new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: tokensBuffer,\n }),\n text: tokensBuffer,\n }),\n runManager\n );\n }\n\n protected async *_streamResponseChunksFromReasoningMessages(\n messages: BaseMessage[],\n options: this['ParsedCallOptions']\n ): AsyncGenerator<ChatGenerationChunk> {\n const params = {\n ...this.invocationParams(options, { streaming: true }),\n stream: true as const,\n };\n const messagesMapped = this._convertDeepSeekMessages(messages);\n const streamIterable = await this.completionWithRetry(\n {\n ...params,\n messages: messagesMapped,\n },\n {\n signal: options.signal,\n ...options.options,\n }\n );\n\n let defaultRole:\n | OpenAIClient.Chat.Completions.ChatCompletionRole\n | undefined;\n let usage: OpenAIClient.Completions.CompletionUsage | undefined;\n\n for await (const data of streamIterable) {\n if (options.signal?.aborted === true) {\n throw new Error('AbortError');\n }\n\n if (data.usage != null) {\n usage = data.usage;\n }\n\n if (data.choices.length === 0) {\n continue;\n }\n\n const choice = data.choices[0];\n const { delta } = choice;\n const messageChunk = this._convertCompletionsDeltaToBaseMessageChunk(\n delta,\n data,\n defaultRole\n );\n defaultRole = delta.role ?? defaultRole;\n\n if (typeof messageChunk.content !== 'string') {\n continue;\n }\n\n const messageText = messageChunk.content;\n const newTokenIndices = {\n prompt: options.promptIndex ?? 0,\n completion: choice.index,\n };\n const generationInfo = { ...newTokenIndices };\n if (choice.finish_reason != null) {\n Object.assign(generationInfo, {\n finish_reason: choice.finish_reason,\n system_fingerprint: data.system_fingerprint,\n model_name: data.model,\n service_tier: data.service_tier,\n });\n }\n if (this.logprobs === true) {\n Object.assign(generationInfo, { logprobs: choice.logprobs });\n }\n\n const generationChunk = new ChatGenerationChunk({\n message: messageChunk,\n text: messageText,\n generationInfo,\n });\n\n yield generationChunk;\n }\n\n if (usage != null) {\n const usageMetadata = createUsageMetadata(usage);\n\n const generationChunk = new ChatGenerationChunk({\n message: new AIMessageChunk({\n content: '',\n response_metadata: {\n usage: { ...usage },\n },\n usage_metadata: usageMetadata,\n }),\n text: '',\n generationInfo: {\n prompt: 0,\n completion: 0,\n },\n });\n\n yield generationChunk;\n }\n\n if (options.signal?.aborted === true) {\n throw new Error('AbortError');\n }\n }\n\n protected _createDeepSeekStreamChunk(\n chunk: ChatGenerationChunk,\n content: string,\n additionalKwargs?: AIMessageChunk['additional_kwargs'],\n text = content\n ): ChatGenerationChunk {\n if (!(chunk.message instanceof AIMessageChunk)) {\n return new ChatGenerationChunk({\n message: new AIMessageChunk({\n content,\n additional_kwargs:\n additionalKwargs ?? chunk.message.additional_kwargs,\n response_metadata: chunk.message.response_metadata,\n id: chunk.message.id,\n }),\n text,\n generationInfo: chunk.generationInfo,\n });\n }\n\n const message = chunk.message;\n return new ChatGenerationChunk({\n message: new AIMessageChunk({\n content,\n additional_kwargs: additionalKwargs ?? message.additional_kwargs,\n response_metadata: message.response_metadata,\n tool_calls: message.tool_calls,\n tool_call_chunks: message.tool_call_chunks,\n id: message.id,\n }),\n text,\n generationInfo: chunk.generationInfo,\n });\n }\n\n protected _createDeepSeekReasoningStreamChunk(\n chunk: ChatGenerationChunk,\n reasoningContent: string\n ): ChatGenerationChunk {\n return this._createDeepSeekStreamChunk(\n chunk,\n '',\n {\n ...chunk.message.additional_kwargs,\n reasoning_content: reasoningContent,\n },\n ''\n );\n }\n\n protected async *_yieldDeepSeekReasoningText(\n chunk: ChatGenerationChunk,\n reasoningContent: string,\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* this._yieldDeepSeekStreamChunk(\n this._createDeepSeekReasoningStreamChunk(chunk, reasoningContent),\n runManager\n );\n }\n\n protected async *_yieldDeepSeekStreamChunk(\n chunk: ChatGenerationChunk,\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text,\n this._getDeepSeekTokenIndices(chunk),\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n\n protected _getDeepSeekTokenIndices(\n chunk: ChatGenerationChunk\n ): { prompt: number; completion: number } | undefined {\n return getStreamChunkTokenIndices(chunk);\n }\n\n protected _getDeepSeekPartialTagSplitIndex(\n text: string,\n tag: string\n ): number {\n for (let i = tag.length - 1; i >= 1; i--) {\n if (text.endsWith(tag.substring(0, i))) {\n return text.length - i;\n }\n }\n\n return -1;\n }\n}\n\n/** xAI-specific usage metadata type */\nexport interface XAIUsageMetadata\n extends OpenAIClient.Completions.CompletionUsage {\n prompt_tokens_details?: {\n audio_tokens?: number;\n cached_tokens?: number;\n text_tokens?: number;\n image_tokens?: number;\n };\n completion_tokens_details?: {\n audio_tokens?: number;\n reasoning_tokens?: number;\n accepted_prediction_tokens?: number;\n rejected_prediction_tokens?: number;\n };\n num_sources_used?: number;\n}\n\nexport class ChatMoonshot extends ChatOpenAI {\n constructor(\n fields?: LibreChatOpenAIFields & t.OpenAIChatInput['modelKwargs']\n ) {\n super({\n ...fields,\n includeReasoningContent: true,\n });\n }\n\n static lc_name(): 'LibreChatMoonshot' {\n return 'LibreChatMoonshot';\n }\n}\n\nexport class ChatXAI extends OriginalChatXAI {\n _lc_stream_delay?: number;\n\n constructor(\n fields?: Partial<ChatXAIInput> & {\n configuration?: { baseURL?: string };\n clientConfig?: { baseURL?: string };\n _lc_stream_delay?: number;\n }\n ) {\n super(fields);\n this._lc_stream_delay = fields?._lc_stream_delay;\n const customBaseURL =\n fields?.configuration?.baseURL ?? fields?.clientConfig?.baseURL;\n if (customBaseURL != null && customBaseURL) {\n this.clientConfig = {\n ...this.clientConfig,\n baseURL: customBaseURL,\n };\n // Reset the client to force recreation with new config\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n this.client = undefined as any;\n }\n }\n\n static lc_name(): 'LibreChatXAI' {\n return 'LibreChatXAI';\n }\n\n public get exposedClient(): CustomOpenAIClient {\n return this.client;\n }\n\n _getClientOptions(\n options?: OpenAICoreRequestOptions\n ): OpenAICoreRequestOptions {\n if (!(this.client as OpenAIClient | undefined)) {\n const openAIEndpointConfig: t.OpenAIEndpointConfig = {\n baseURL: this.clientConfig.baseURL,\n };\n\n const endpoint = getEndpoint(openAIEndpointConfig);\n const params = {\n ...this.clientConfig,\n baseURL: endpoint,\n timeout: this.timeout,\n maxRetries: 0,\n };\n if (params.baseURL == null) {\n delete params.baseURL;\n }\n\n this.client = new CustomOpenAIClient(params);\n }\n const requestOptions = {\n ...this.clientConfig,\n ...options,\n } as OpenAICoreRequestOptions;\n return requestOptions;\n }\n\n async *_streamResponseChunks(\n messages: BaseMessage[],\n options: this['ParsedCallOptions'],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n yield* delayStreamChunks(\n super._streamResponseChunks(messages, options, undefined),\n this._lc_stream_delay,\n options.signal,\n runManager\n );\n }\n}\n"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ const require_streamedToolCallSeals = require("../../tools/streamedToolCallSeals.cjs");
1
2
  let _langchain_core_messages = require("@langchain/core/messages");
2
3
  let _langchain_google_gauth = require("@langchain/google-gauth");
3
4
  let _langchain_google_common = require("@langchain/google-common");
@@ -34,6 +35,23 @@ function repairStreamUsageMetadata(current, generationInfoUsage) {
34
35
  return generationInfoUsage;
35
36
  }
36
37
  /**
38
+ * The Gemini API delivers function calls as complete objects — never as
39
+ * partial arg deltas. `@langchain/google-common` pre-parses each streamed
40
+ * functionCall part into `tool_calls` (invalid args land in
41
+ * `invalid_tool_calls` instead), so a chunk whose tool-call chunks all parsed
42
+ * cleanly is sealed on arrival for eager tool execution. Anything that fails
43
+ * the parse check is left unstamped and falls back to the lazy path.
44
+ */
45
+ function sealCompleteStreamedToolCalls(message) {
46
+ const chunkCount = message.tool_call_chunks?.length ?? 0;
47
+ if (chunkCount === 0 || (message.invalid_tool_calls?.length ?? 0) > 0 || (message.tool_calls?.length ?? 0) !== chunkCount) return;
48
+ message.response_metadata = {
49
+ ...message.response_metadata,
50
+ [require_streamedToolCallSeals.STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]: require_streamedToolCallSeals.GOOGLE_STREAMED_TOOL_CALL_ADAPTER,
51
+ [require_streamedToolCallSeals.STREAMED_TOOL_CALL_SEAL_METADATA_KEY]: { kind: "all" }
52
+ };
53
+ }
54
+ /**
37
55
  * Fixes thought signatures on functionCall parts in the formatted Gemini request.
38
56
  *
39
57
  * `@langchain/google-common` stores signatures as a flat array in
@@ -409,6 +427,7 @@ var ChatVertexAI = class extends _langchain_google_gauth.ChatGoogle {
409
427
  if (chunk.message instanceof _langchain_core_messages.AIMessageChunk) {
410
428
  const repaired = repairStreamUsageMetadata(chunk.message.usage_metadata, lastGoodUsage);
411
429
  if (repaired !== chunk.message.usage_metadata) chunk.message.usage_metadata = repaired;
430
+ sealCompleteStreamedToolCalls(chunk.message);
412
431
  }
413
432
  yield chunk;
414
433
  }