@librechat/agents 3.2.32 → 3.2.34
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/_virtual/_rolldown/runtime.cjs +23 -0
- package/dist/cjs/agents/AgentContext.cjs +844 -1046
- package/dist/cjs/agents/AgentContext.cjs.map +1 -1
- package/dist/cjs/common/constants.cjs +13 -13
- package/dist/cjs/common/constants.cjs.map +1 -1
- package/dist/cjs/common/enum.cjs +233 -240
- package/dist/cjs/common/enum.cjs.map +1 -1
- package/dist/cjs/common/index.cjs +2 -0
- package/dist/cjs/events.cjs +121 -169
- package/dist/cjs/events.cjs.map +1 -1
- package/dist/cjs/graphs/Graph.cjs +1389 -1807
- package/dist/cjs/graphs/Graph.cjs.map +1 -1
- package/dist/cjs/graphs/MultiAgentGraph.cjs +713 -945
- package/dist/cjs/graphs/MultiAgentGraph.cjs.map +1 -1
- package/dist/cjs/graphs/index.cjs +2 -0
- package/dist/cjs/hitl/askUserQuestion.cjs +60 -62
- package/dist/cjs/hitl/askUserQuestion.cjs.map +1 -1
- package/dist/cjs/hitl/index.cjs +1 -0
- package/dist/cjs/hooks/HookRegistry.cjs +176 -202
- package/dist/cjs/hooks/HookRegistry.cjs.map +1 -1
- package/dist/cjs/hooks/createToolPolicyHook.cjs +71 -101
- package/dist/cjs/hooks/createToolPolicyHook.cjs.map +1 -1
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs +170 -273
- package/dist/cjs/hooks/createWorkspacePolicyHook.cjs.map +1 -1
- package/dist/cjs/hooks/executeHooks.cjs +227 -282
- package/dist/cjs/hooks/executeHooks.cjs.map +1 -1
- package/dist/cjs/hooks/index.cjs +6 -0
- package/dist/cjs/hooks/matchers.cjs +196 -230
- package/dist/cjs/hooks/matchers.cjs.map +1 -1
- package/dist/cjs/hooks/types.cjs +24 -24
- package/dist/cjs/hooks/types.cjs.map +1 -1
- package/dist/cjs/instrumentation.cjs +110 -137
- package/dist/cjs/instrumentation.cjs.map +1 -1
- package/dist/cjs/langchain/google-common.cjs +0 -3
- package/dist/cjs/langchain/index.cjs +80 -43
- package/dist/cjs/langchain/language_models/chat_models.cjs +0 -3
- package/dist/cjs/langchain/messages/tool.cjs +0 -3
- package/dist/cjs/langchain/messages.cjs +35 -18
- package/dist/cjs/langchain/openai.cjs +0 -3
- package/dist/cjs/langchain/prompts.cjs +5 -8
- package/dist/cjs/langchain/runnables.cjs +11 -10
- package/dist/cjs/langchain/tools.cjs +14 -11
- package/dist/cjs/langchain/utils/env.cjs +5 -8
- package/dist/cjs/langfuse.cjs +60 -79
- package/dist/cjs/langfuse.cjs.map +1 -1
- package/dist/cjs/langfuseToolOutputTracing.cjs +267 -399
- package/dist/cjs/langfuseToolOutputTracing.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/index.cjs +432 -562
- package/dist/cjs/llm/anthropic/index.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/types.cjs +23 -47
- package/dist/cjs/llm/anthropic/types.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs +441 -731
- package/dist/cjs/llm/anthropic/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs +171 -256
- package/dist/cjs/llm/anthropic/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/anthropic/utils/output_parsers.cjs +2 -0
- package/dist/cjs/llm/anthropic/utils/tools.cjs +12 -26
- package/dist/cjs/llm/anthropic/utils/tools.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/index.cjs +214 -240
- package/dist/cjs/llm/bedrock/index.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/toolCache.cjs +84 -106
- package/dist/cjs/llm/bedrock/toolCache.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/index.cjs +2 -0
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs +357 -620
- package/dist/cjs/llm/bedrock/utils/message_inputs.cjs.map +1 -1
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs +141 -149
- package/dist/cjs/llm/bedrock/utils/message_outputs.cjs.map +1 -1
- package/dist/cjs/llm/fake.cjs +86 -96
- package/dist/cjs/llm/fake.cjs.map +1 -1
- package/dist/cjs/llm/google/index.cjs +183 -237
- package/dist/cjs/llm/google/index.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/common.cjs +404 -674
- package/dist/cjs/llm/google/utils/common.cjs.map +1 -1
- package/dist/cjs/llm/google/utils/zod_to_genai_parameters.cjs +2 -0
- package/dist/cjs/llm/init.cjs +44 -53
- package/dist/cjs/llm/init.cjs.map +1 -1
- package/dist/cjs/llm/invoke.cjs +142 -182
- package/dist/cjs/llm/invoke.cjs.map +1 -1
- package/dist/cjs/llm/openai/index.cjs +1035 -1273
- package/dist/cjs/llm/openai/index.cjs.map +1 -1
- package/dist/cjs/llm/openai/utils/index.cjs +189 -316
- package/dist/cjs/llm/openai/utils/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/index.cjs +102 -153
- package/dist/cjs/llm/openrouter/index.cjs.map +1 -1
- package/dist/cjs/llm/openrouter/toolCache.cjs +35 -44
- package/dist/cjs/llm/openrouter/toolCache.cjs.map +1 -1
- package/dist/cjs/llm/providers.cjs +29 -37
- package/dist/cjs/llm/providers.cjs.map +1 -1
- package/dist/cjs/llm/request.cjs +20 -33
- package/dist/cjs/llm/request.cjs.map +1 -1
- package/dist/cjs/llm/vertexai/index.cjs +446 -453
- package/dist/cjs/llm/vertexai/index.cjs.map +1 -1
- package/dist/cjs/main.cjs +547 -528
- package/dist/cjs/messages/anthropicToolCache.cjs +68 -119
- package/dist/cjs/messages/anthropicToolCache.cjs.map +1 -1
- package/dist/cjs/messages/cache.cjs +305 -418
- package/dist/cjs/messages/cache.cjs.map +1 -1
- package/dist/cjs/messages/content.cjs +36 -49
- package/dist/cjs/messages/content.cjs.map +1 -1
- package/dist/cjs/messages/contextPruning.cjs +112 -145
- package/dist/cjs/messages/contextPruning.cjs.map +1 -1
- package/dist/cjs/messages/contextPruningSettings.cjs +36 -46
- package/dist/cjs/messages/contextPruningSettings.cjs.map +1 -1
- package/dist/cjs/messages/core.cjs +256 -397
- package/dist/cjs/messages/core.cjs.map +1 -1
- package/dist/cjs/messages/format.cjs +904 -1387
- package/dist/cjs/messages/format.cjs.map +1 -1
- package/dist/cjs/messages/ids.cjs +16 -20
- package/dist/cjs/messages/ids.cjs.map +1 -1
- package/dist/cjs/messages/index.cjs +12 -0
- package/dist/cjs/messages/langchain.cjs +18 -18
- package/dist/cjs/messages/langchain.cjs.map +1 -1
- package/dist/cjs/messages/prune.cjs +1054 -1517
- package/dist/cjs/messages/prune.cjs.map +1 -1
- package/dist/cjs/messages/recency.cjs +77 -95
- package/dist/cjs/messages/recency.cjs.map +1 -1
- package/dist/cjs/messages/reducer.cjs +63 -78
- package/dist/cjs/messages/reducer.cjs.map +1 -1
- package/dist/cjs/messages/tools.cjs +51 -79
- package/dist/cjs/messages/tools.cjs.map +1 -1
- package/dist/cjs/openai/index.cjs +171 -217
- package/dist/cjs/openai/index.cjs.map +1 -1
- package/dist/cjs/responses/index.cjs +302 -391
- package/dist/cjs/responses/index.cjs.map +1 -1
- package/dist/cjs/run.cjs +903 -1113
- package/dist/cjs/run.cjs.map +1 -1
- package/dist/cjs/session/AgentSession.cjs +805 -986
- package/dist/cjs/session/AgentSession.cjs.map +1 -1
- package/dist/cjs/session/JsonlSessionStore.cjs +327 -410
- package/dist/cjs/session/JsonlSessionStore.cjs.map +1 -1
- package/dist/cjs/session/handlers.cjs +192 -208
- package/dist/cjs/session/handlers.cjs.map +1 -1
- package/dist/cjs/session/ids.cjs +9 -10
- package/dist/cjs/session/ids.cjs.map +1 -1
- package/dist/cjs/session/index.cjs +4 -0
- package/dist/cjs/session/messageSerialization.cjs +94 -156
- package/dist/cjs/session/messageSerialization.cjs.map +1 -1
- package/dist/cjs/splitStream.cjs +147 -206
- package/dist/cjs/splitStream.cjs.map +1 -1
- package/dist/cjs/stream.cjs +874 -1344
- package/dist/cjs/stream.cjs.map +1 -1
- package/dist/cjs/summarization/index.cjs +57 -101
- package/dist/cjs/summarization/index.cjs.map +1 -1
- package/dist/cjs/summarization/node.cjs +643 -796
- package/dist/cjs/summarization/node.cjs.map +1 -1
- package/dist/cjs/tools/BashExecutor.cjs +110 -136
- package/dist/cjs/tools/BashExecutor.cjs.map +1 -1
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs +165 -245
- package/dist/cjs/tools/BashProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/Calculator.cjs +36 -57
- package/dist/cjs/tools/Calculator.cjs.map +1 -1
- package/dist/cjs/tools/CodeExecutor.cjs +126 -168
- package/dist/cjs/tools/CodeExecutor.cjs.map +1 -1
- package/dist/cjs/tools/CodeSessionFileSummary.cjs +36 -46
- package/dist/cjs/tools/CodeSessionFileSummary.cjs.map +1 -1
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs +459 -649
- package/dist/cjs/tools/ProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/ReadFile.cjs +17 -20
- package/dist/cjs/tools/ReadFile.cjs.map +1 -1
- package/dist/cjs/tools/SkillTool.cjs +26 -27
- package/dist/cjs/tools/SkillTool.cjs.map +1 -1
- package/dist/cjs/tools/SubagentTool.cjs +59 -61
- package/dist/cjs/tools/SubagentTool.cjs.map +1 -1
- package/dist/cjs/tools/ToolNode.cjs +2146 -2686
- package/dist/cjs/tools/ToolNode.cjs.map +1 -1
- package/dist/cjs/tools/ToolSearch.cjs +663 -825
- package/dist/cjs/tools/ToolSearch.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs +248 -340
- package/dist/cjs/tools/cloudflare/CloudflareBridgeRuntime.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs +170 -197
- package/dist/cjs/tools/cloudflare/CloudflareProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs +425 -520
- package/dist/cjs/tools/cloudflare/CloudflareSandboxExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs +91 -124
- package/dist/cjs/tools/cloudflare/CloudflareSandboxTools.cjs.map +1 -1
- package/dist/cjs/tools/cloudflare/index.cjs +4 -0
- package/dist/cjs/tools/eagerEventExecution.cjs +75 -99
- package/dist/cjs/tools/eagerEventExecution.cjs.map +1 -1
- package/dist/cjs/tools/handlers.cjs +200 -262
- package/dist/cjs/tools/handlers.cjs.map +1 -1
- package/dist/cjs/tools/local/CompileCheckTool.cjs +150 -212
- package/dist/cjs/tools/local/CompileCheckTool.cjs.map +1 -1
- package/dist/cjs/tools/local/FileCheckpointer.cjs +77 -85
- package/dist/cjs/tools/local/FileCheckpointer.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalCodingTools.cjs +763 -1022
- package/dist/cjs/tools/local/LocalCodingTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs +666 -941
- package/dist/cjs/tools/local/LocalExecutionEngine.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalExecutionTools.cjs +49 -92
- package/dist/cjs/tools/local/LocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs +286 -354
- package/dist/cjs/tools/local/LocalProgrammaticToolCalling.cjs.map +1 -1
- package/dist/cjs/tools/local/attachments.cjs +108 -165
- package/dist/cjs/tools/local/attachments.cjs.map +1 -1
- package/dist/cjs/tools/local/bashAst.cjs +99 -113
- package/dist/cjs/tools/local/bashAst.cjs.map +1 -1
- package/dist/cjs/tools/local/editStrategies.cjs +126 -169
- package/dist/cjs/tools/local/editStrategies.cjs.map +1 -1
- package/dist/cjs/tools/local/index.cjs +12 -0
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs +136 -218
- package/dist/cjs/tools/local/resolveLocalExecutionTools.cjs.map +1 -1
- package/dist/cjs/tools/local/syntaxCheck.cjs +142 -161
- package/dist/cjs/tools/local/syntaxCheck.cjs.map +1 -1
- package/dist/cjs/tools/local/textEncoding.cjs +25 -23
- package/dist/cjs/tools/local/textEncoding.cjs.map +1 -1
- package/dist/cjs/tools/local/workspaceFS.cjs +38 -46
- package/dist/cjs/tools/local/workspaceFS.cjs.map +1 -1
- package/dist/cjs/tools/ptcTimeout.cjs +27 -47
- package/dist/cjs/tools/ptcTimeout.cjs.map +1 -1
- package/dist/cjs/tools/schema.cjs +24 -23
- package/dist/cjs/tools/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/anthropic.cjs +24 -33
- package/dist/cjs/tools/search/anthropic.cjs.map +1 -1
- package/dist/cjs/tools/search/content.cjs +95 -137
- package/dist/cjs/tools/search/content.cjs.map +1 -1
- package/dist/cjs/tools/search/firecrawl.cjs +141 -172
- package/dist/cjs/tools/search/firecrawl.cjs.map +1 -1
- package/dist/cjs/tools/search/format.cjs +128 -196
- package/dist/cjs/tools/search/format.cjs.map +1 -1
- package/dist/cjs/tools/search/highlights.cjs +165 -232
- package/dist/cjs/tools/search/highlights.cjs.map +1 -1
- package/dist/cjs/tools/search/index.cjs +2 -0
- package/dist/cjs/tools/search/rerankers.cjs +151 -174
- package/dist/cjs/tools/search/rerankers.cjs.map +1 -1
- package/dist/cjs/tools/search/schema.cjs +40 -39
- package/dist/cjs/tools/search/schema.cjs.map +1 -1
- package/dist/cjs/tools/search/search.cjs +428 -530
- package/dist/cjs/tools/search/search.cjs.map +1 -1
- package/dist/cjs/tools/search/serper-scraper.cjs +106 -127
- package/dist/cjs/tools/search/serper-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-scraper.cjs +129 -181
- package/dist/cjs/tools/search/tavily-scraper.cjs.map +1 -1
- package/dist/cjs/tools/search/tavily-search.cjs +295 -359
- package/dist/cjs/tools/search/tavily-search.cjs.map +1 -1
- package/dist/cjs/tools/search/tool.cjs +260 -299
- package/dist/cjs/tools/search/tool.cjs.map +1 -1
- package/dist/cjs/tools/search/utils.cjs +74 -117
- package/dist/cjs/tools/search/utils.cjs.map +1 -1
- package/dist/cjs/tools/skillCatalog.cjs +54 -72
- package/dist/cjs/tools/skillCatalog.cjs.map +1 -1
- package/dist/cjs/tools/streamedToolCallSeals.cjs +46 -34
- package/dist/cjs/tools/streamedToolCallSeals.cjs.map +1 -1
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs +612 -771
- package/dist/cjs/tools/subagent/SubagentExecutor.cjs.map +1 -1
- package/dist/cjs/tools/subagent/index.cjs +1 -0
- package/dist/cjs/tools/toolOutputReferences.cjs +523 -630
- package/dist/cjs/tools/toolOutputReferences.cjs.map +1 -1
- package/dist/cjs/utils/callbacks.cjs +11 -21
- package/dist/cjs/utils/callbacks.cjs.map +1 -1
- package/dist/cjs/utils/errors.cjs +70 -95
- package/dist/cjs/utils/errors.cjs.map +1 -1
- package/dist/cjs/utils/events.cjs +32 -42
- package/dist/cjs/utils/events.cjs.map +1 -1
- package/dist/cjs/utils/graph.cjs +8 -12
- package/dist/cjs/utils/graph.cjs.map +1 -1
- package/dist/cjs/utils/handlers.cjs +60 -82
- package/dist/cjs/utils/handlers.cjs.map +1 -1
- package/dist/cjs/utils/index.cjs +9 -0
- package/dist/cjs/utils/llm.cjs +19 -27
- package/dist/cjs/utils/llm.cjs.map +1 -1
- package/dist/cjs/utils/misc.cjs +30 -46
- package/dist/cjs/utils/misc.cjs.map +1 -1
- package/dist/cjs/utils/run.cjs +50 -66
- package/dist/cjs/utils/run.cjs.map +1 -1
- package/dist/cjs/utils/schema.cjs +11 -19
- package/dist/cjs/utils/schema.cjs.map +1 -1
- package/dist/cjs/utils/title.cjs +71 -106
- package/dist/cjs/utils/title.cjs.map +1 -1
- package/dist/cjs/utils/tokens.cjs +186 -283
- package/dist/cjs/utils/tokens.cjs.map +1 -1
- package/dist/cjs/utils/truncation.cjs +95 -114
- package/dist/cjs/utils/truncation.cjs.map +1 -1
- package/dist/esm/agents/AgentContext.mjs +844 -1044
- package/dist/esm/agents/AgentContext.mjs.map +1 -1
- package/dist/esm/common/constants.mjs +13 -11
- package/dist/esm/common/constants.mjs.map +1 -1
- package/dist/esm/common/enum.mjs +221 -238
- package/dist/esm/common/enum.mjs.map +1 -1
- package/dist/esm/common/index.mjs +3 -0
- package/dist/esm/events.mjs +121 -167
- package/dist/esm/events.mjs.map +1 -1
- package/dist/esm/graphs/Graph.mjs +1388 -1804
- package/dist/esm/graphs/Graph.mjs.map +1 -1
- package/dist/esm/graphs/MultiAgentGraph.mjs +713 -943
- package/dist/esm/graphs/MultiAgentGraph.mjs.map +1 -1
- package/dist/esm/graphs/index.mjs +3 -0
- package/dist/esm/hitl/askUserQuestion.mjs +60 -60
- package/dist/esm/hitl/askUserQuestion.mjs.map +1 -1
- package/dist/esm/hitl/index.mjs +2 -0
- package/dist/esm/hooks/HookRegistry.mjs +176 -200
- package/dist/esm/hooks/HookRegistry.mjs.map +1 -1
- package/dist/esm/hooks/createToolPolicyHook.mjs +71 -99
- package/dist/esm/hooks/createToolPolicyHook.mjs.map +1 -1
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs +170 -271
- package/dist/esm/hooks/createWorkspacePolicyHook.mjs.map +1 -1
- package/dist/esm/hooks/executeHooks.mjs +227 -280
- package/dist/esm/hooks/executeHooks.mjs.map +1 -1
- package/dist/esm/hooks/index.mjs +7 -0
- package/dist/esm/hooks/matchers.mjs +196 -228
- package/dist/esm/hooks/matchers.mjs.map +1 -1
- package/dist/esm/hooks/types.mjs +24 -22
- package/dist/esm/hooks/types.mjs.map +1 -1
- package/dist/esm/instrumentation.mjs +109 -132
- package/dist/esm/instrumentation.mjs.map +1 -1
- package/dist/esm/langchain/google-common.mjs +1 -2
- package/dist/esm/langchain/index.mjs +5 -5
- package/dist/esm/langchain/language_models/chat_models.mjs +1 -2
- package/dist/esm/langchain/messages/tool.mjs +1 -2
- package/dist/esm/langchain/messages.mjs +2 -2
- package/dist/esm/langchain/openai.mjs +1 -2
- package/dist/esm/langchain/prompts.mjs +2 -2
- package/dist/esm/langchain/runnables.mjs +2 -2
- package/dist/esm/langchain/tools.mjs +2 -2
- package/dist/esm/langchain/utils/env.mjs +2 -2
- package/dist/esm/langfuse.mjs +60 -76
- package/dist/esm/langfuse.mjs.map +1 -1
- package/dist/esm/langfuseToolOutputTracing.mjs +267 -395
- package/dist/esm/langfuseToolOutputTracing.mjs.map +1 -1
- package/dist/esm/llm/anthropic/index.mjs +432 -559
- package/dist/esm/llm/anthropic/index.mjs.map +1 -1
- package/dist/esm/llm/anthropic/types.mjs +23 -45
- package/dist/esm/llm/anthropic/types.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs +439 -725
- package/dist/esm/llm/anthropic/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs +171 -253
- package/dist/esm/llm/anthropic/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/anthropic/utils/output_parsers.mjs +3 -0
- package/dist/esm/llm/anthropic/utils/tools.mjs +12 -24
- package/dist/esm/llm/anthropic/utils/tools.mjs.map +1 -1
- package/dist/esm/llm/bedrock/index.mjs +214 -238
- package/dist/esm/llm/bedrock/index.mjs.map +1 -1
- package/dist/esm/llm/bedrock/toolCache.mjs +84 -104
- package/dist/esm/llm/bedrock/toolCache.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/index.mjs +3 -0
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs +357 -618
- package/dist/esm/llm/bedrock/utils/message_inputs.mjs.map +1 -1
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs +140 -147
- package/dist/esm/llm/bedrock/utils/message_outputs.mjs.map +1 -1
- package/dist/esm/llm/fake.mjs +86 -94
- package/dist/esm/llm/fake.mjs.map +1 -1
- package/dist/esm/llm/google/index.mjs +183 -235
- package/dist/esm/llm/google/index.mjs.map +1 -1
- package/dist/esm/llm/google/utils/common.mjs +403 -666
- package/dist/esm/llm/google/utils/common.mjs.map +1 -1
- package/dist/esm/llm/google/utils/zod_to_genai_parameters.mjs +3 -0
- package/dist/esm/llm/init.mjs +44 -51
- package/dist/esm/llm/init.mjs.map +1 -1
- package/dist/esm/llm/invoke.mjs +142 -180
- package/dist/esm/llm/invoke.mjs.map +1 -1
- package/dist/esm/llm/openai/index.mjs +1035 -1268
- package/dist/esm/llm/openai/index.mjs.map +1 -1
- package/dist/esm/llm/openai/utils/index.mjs +188 -312
- package/dist/esm/llm/openai/utils/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/index.mjs +102 -151
- package/dist/esm/llm/openrouter/index.mjs.map +1 -1
- package/dist/esm/llm/openrouter/toolCache.mjs +35 -42
- package/dist/esm/llm/openrouter/toolCache.mjs.map +1 -1
- package/dist/esm/llm/providers.mjs +29 -34
- package/dist/esm/llm/providers.mjs.map +1 -1
- package/dist/esm/llm/request.mjs +20 -31
- package/dist/esm/llm/request.mjs.map +1 -1
- package/dist/esm/llm/vertexai/index.mjs +446 -449
- package/dist/esm/llm/vertexai/index.mjs.map +1 -1
- package/dist/esm/main.mjs +99 -87
- package/dist/esm/messages/anthropicToolCache.mjs +68 -117
- package/dist/esm/messages/anthropicToolCache.mjs.map +1 -1
- package/dist/esm/messages/cache.mjs +305 -416
- package/dist/esm/messages/cache.mjs.map +1 -1
- package/dist/esm/messages/content.mjs +36 -47
- package/dist/esm/messages/content.mjs.map +1 -1
- package/dist/esm/messages/contextPruning.mjs +112 -143
- package/dist/esm/messages/contextPruning.mjs.map +1 -1
- package/dist/esm/messages/contextPruningSettings.mjs +36 -44
- package/dist/esm/messages/contextPruningSettings.mjs.map +1 -1
- package/dist/esm/messages/core.mjs +254 -393
- package/dist/esm/messages/core.mjs.map +1 -1
- package/dist/esm/messages/format.mjs +902 -1383
- package/dist/esm/messages/format.mjs.map +1 -1
- package/dist/esm/messages/ids.mjs +16 -18
- package/dist/esm/messages/ids.mjs.map +1 -1
- package/dist/esm/messages/index.mjs +13 -0
- package/dist/esm/messages/langchain.mjs +18 -16
- package/dist/esm/messages/langchain.mjs.map +1 -1
- package/dist/esm/messages/prune.mjs +1053 -1514
- package/dist/esm/messages/prune.mjs.map +1 -1
- package/dist/esm/messages/recency.mjs +77 -93
- package/dist/esm/messages/recency.mjs.map +1 -1
- package/dist/esm/messages/reducer.mjs +63 -76
- package/dist/esm/messages/reducer.mjs.map +1 -1
- package/dist/esm/messages/tools.mjs +49 -75
- package/dist/esm/messages/tools.mjs.map +1 -1
- package/dist/esm/openai/index.mjs +170 -215
- package/dist/esm/openai/index.mjs.map +1 -1
- package/dist/esm/responses/index.mjs +301 -389
- package/dist/esm/responses/index.mjs.map +1 -1
- package/dist/esm/run.mjs +903 -1111
- package/dist/esm/run.mjs.map +1 -1
- package/dist/esm/session/AgentSession.mjs +806 -985
- package/dist/esm/session/AgentSession.mjs.map +1 -1
- package/dist/esm/session/JsonlSessionStore.mjs +326 -407
- package/dist/esm/session/JsonlSessionStore.mjs.map +1 -1
- package/dist/esm/session/handlers.mjs +192 -206
- package/dist/esm/session/handlers.mjs.map +1 -1
- package/dist/esm/session/ids.mjs +9 -8
- package/dist/esm/session/ids.mjs.map +1 -1
- package/dist/esm/session/index.mjs +5 -0
- package/dist/esm/session/messageSerialization.mjs +94 -154
- package/dist/esm/session/messageSerialization.mjs.map +1 -1
- package/dist/esm/splitStream.mjs +147 -204
- package/dist/esm/splitStream.mjs.map +1 -1
- package/dist/esm/stream.mjs +872 -1341
- package/dist/esm/stream.mjs.map +1 -1
- package/dist/esm/summarization/index.mjs +57 -99
- package/dist/esm/summarization/index.mjs.map +1 -1
- package/dist/esm/summarization/node.mjs +640 -790
- package/dist/esm/summarization/node.mjs.map +1 -1
- package/dist/esm/tools/BashExecutor.mjs +103 -129
- package/dist/esm/tools/BashExecutor.mjs.map +1 -1
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs +162 -239
- package/dist/esm/tools/BashProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/Calculator.mjs +34 -36
- package/dist/esm/tools/Calculator.mjs.map +1 -1
- package/dist/esm/tools/CodeExecutor.mjs +123 -164
- package/dist/esm/tools/CodeExecutor.mjs.map +1 -1
- package/dist/esm/tools/CodeSessionFileSummary.mjs +36 -44
- package/dist/esm/tools/CodeSessionFileSummary.mjs.map +1 -1
- package/dist/esm/tools/ProgrammaticToolCalling.mjs +454 -644
- package/dist/esm/tools/ProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/ReadFile.mjs +17 -18
- package/dist/esm/tools/ReadFile.mjs.map +1 -1
- package/dist/esm/tools/SkillTool.mjs +26 -25
- package/dist/esm/tools/SkillTool.mjs.map +1 -1
- package/dist/esm/tools/SubagentTool.mjs +59 -59
- package/dist/esm/tools/SubagentTool.mjs.map +1 -1
- package/dist/esm/tools/ToolNode.mjs +2144 -2684
- package/dist/esm/tools/ToolNode.mjs.map +1 -1
- package/dist/esm/tools/ToolSearch.mjs +659 -804
- package/dist/esm/tools/ToolSearch.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs +248 -338
- package/dist/esm/tools/cloudflare/CloudflareBridgeRuntime.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs +170 -195
- package/dist/esm/tools/cloudflare/CloudflareProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs +424 -517
- package/dist/esm/tools/cloudflare/CloudflareSandboxExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs +91 -122
- package/dist/esm/tools/cloudflare/CloudflareSandboxTools.mjs.map +1 -1
- package/dist/esm/tools/cloudflare/index.mjs +5 -0
- package/dist/esm/tools/eagerEventExecution.mjs +75 -96
- package/dist/esm/tools/eagerEventExecution.mjs.map +1 -1
- package/dist/esm/tools/handlers.mjs +200 -260
- package/dist/esm/tools/handlers.mjs.map +1 -1
- package/dist/esm/tools/local/CompileCheckTool.mjs +150 -210
- package/dist/esm/tools/local/CompileCheckTool.mjs.map +1 -1
- package/dist/esm/tools/local/FileCheckpointer.mjs +77 -83
- package/dist/esm/tools/local/FileCheckpointer.mjs.map +1 -1
- package/dist/esm/tools/local/LocalCodingTools.mjs +760 -1017
- package/dist/esm/tools/local/LocalCodingTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionEngine.mjs +663 -936
- package/dist/esm/tools/local/LocalExecutionEngine.mjs.map +1 -1
- package/dist/esm/tools/local/LocalExecutionTools.mjs +49 -90
- package/dist/esm/tools/local/LocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs +283 -349
- package/dist/esm/tools/local/LocalProgrammaticToolCalling.mjs.map +1 -1
- package/dist/esm/tools/local/attachments.mjs +108 -163
- package/dist/esm/tools/local/attachments.mjs.map +1 -1
- package/dist/esm/tools/local/bashAst.mjs +99 -111
- package/dist/esm/tools/local/bashAst.mjs.map +1 -1
- package/dist/esm/tools/local/editStrategies.mjs +126 -167
- package/dist/esm/tools/local/editStrategies.mjs.map +1 -1
- package/dist/esm/tools/local/index.mjs +13 -0
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs +136 -216
- package/dist/esm/tools/local/resolveLocalExecutionTools.mjs.map +1 -1
- package/dist/esm/tools/local/syntaxCheck.mjs +138 -155
- package/dist/esm/tools/local/syntaxCheck.mjs.map +1 -1
- package/dist/esm/tools/local/textEncoding.mjs +25 -21
- package/dist/esm/tools/local/textEncoding.mjs.map +1 -1
- package/dist/esm/tools/local/workspaceFS.mjs +38 -44
- package/dist/esm/tools/local/workspaceFS.mjs.map +1 -1
- package/dist/esm/tools/ptcTimeout.mjs +27 -42
- package/dist/esm/tools/ptcTimeout.mjs.map +1 -1
- package/dist/esm/tools/schema.mjs +24 -21
- package/dist/esm/tools/schema.mjs.map +1 -1
- package/dist/esm/tools/search/anthropic.mjs +24 -31
- package/dist/esm/tools/search/anthropic.mjs.map +1 -1
- package/dist/esm/tools/search/content.mjs +93 -116
- package/dist/esm/tools/search/content.mjs.map +1 -1
- package/dist/esm/tools/search/firecrawl.mjs +139 -169
- package/dist/esm/tools/search/firecrawl.mjs.map +1 -1
- package/dist/esm/tools/search/format.mjs +128 -194
- package/dist/esm/tools/search/format.mjs.map +1 -1
- package/dist/esm/tools/search/highlights.mjs +165 -230
- package/dist/esm/tools/search/highlights.mjs.map +1 -1
- package/dist/esm/tools/search/index.mjs +3 -0
- package/dist/esm/tools/search/rerankers.mjs +149 -168
- package/dist/esm/tools/search/rerankers.mjs.map +1 -1
- package/dist/esm/tools/search/schema.mjs +39 -37
- package/dist/esm/tools/search/schema.mjs.map +1 -1
- package/dist/esm/tools/search/search.mjs +426 -528
- package/dist/esm/tools/search/search.mjs.map +1 -1
- package/dist/esm/tools/search/serper-scraper.mjs +104 -124
- package/dist/esm/tools/search/serper-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-scraper.mjs +127 -178
- package/dist/esm/tools/search/tavily-scraper.mjs.map +1 -1
- package/dist/esm/tools/search/tavily-search.mjs +293 -357
- package/dist/esm/tools/search/tavily-search.mjs.map +1 -1
- package/dist/esm/tools/search/tool.mjs +259 -297
- package/dist/esm/tools/search/tool.mjs.map +1 -1
- package/dist/esm/tools/search/utils.mjs +74 -115
- package/dist/esm/tools/search/utils.mjs.map +1 -1
- package/dist/esm/tools/skillCatalog.mjs +54 -70
- package/dist/esm/tools/skillCatalog.mjs.map +1 -1
- package/dist/esm/tools/streamedToolCallSeals.mjs +42 -31
- package/dist/esm/tools/streamedToolCallSeals.mjs.map +1 -1
- package/dist/esm/tools/subagent/SubagentExecutor.mjs +612 -768
- package/dist/esm/tools/subagent/SubagentExecutor.mjs.map +1 -1
- package/dist/esm/tools/subagent/index.mjs +2 -0
- package/dist/esm/tools/toolOutputReferences.mjs +523 -624
- package/dist/esm/tools/toolOutputReferences.mjs.map +1 -1
- package/dist/esm/utils/callbacks.mjs +11 -19
- package/dist/esm/utils/callbacks.mjs.map +1 -1
- package/dist/esm/utils/errors.mjs +70 -93
- package/dist/esm/utils/errors.mjs.map +1 -1
- package/dist/esm/utils/events.mjs +32 -40
- package/dist/esm/utils/events.mjs.map +1 -1
- package/dist/esm/utils/graph.mjs +8 -10
- package/dist/esm/utils/graph.mjs.map +1 -1
- package/dist/esm/utils/handlers.mjs +60 -80
- package/dist/esm/utils/handlers.mjs.map +1 -1
- package/dist/esm/utils/index.mjs +10 -0
- package/dist/esm/utils/llm.mjs +19 -25
- package/dist/esm/utils/llm.mjs.map +1 -1
- package/dist/esm/utils/misc.mjs +30 -44
- package/dist/esm/utils/misc.mjs.map +1 -1
- package/dist/esm/utils/run.mjs +50 -64
- package/dist/esm/utils/run.mjs.map +1 -1
- package/dist/esm/utils/schema.mjs +11 -17
- package/dist/esm/utils/schema.mjs.map +1 -1
- package/dist/esm/utils/title.mjs +71 -104
- package/dist/esm/utils/title.mjs.map +1 -1
- package/dist/esm/utils/tokens.mjs +186 -281
- package/dist/esm/utils/tokens.mjs.map +1 -1
- package/dist/esm/utils/truncation.mjs +95 -112
- package/dist/esm/utils/truncation.mjs.map +1 -1
- package/dist/types/llm/bedrock/utils/index.d.ts +1 -1
- package/dist/types/llm/bedrock/utils/message_outputs.d.ts +9 -0
- package/dist/types/llm/vertexai/index.d.ts +10 -0
- package/dist/types/tools/ToolNode.d.ts +8 -0
- package/dist/types/tools/search/tool.d.ts +17 -0
- package/dist/types/tools/search/types.d.ts +4 -0
- package/dist/types/tools/streamedToolCallSeals.d.ts +5 -1
- package/dist/types/types/tools.d.ts +10 -0
- package/package.json +4 -10
- package/src/__tests__/stream.eagerEventExecution.test.ts +703 -0
- package/src/llm/bedrock/index.ts +40 -0
- package/src/llm/bedrock/streamSealDispatch.test.ts +158 -0
- package/src/llm/bedrock/utils/index.ts +1 -0
- package/src/llm/bedrock/utils/message_outputs.test.ts +85 -0
- package/src/llm/bedrock/utils/message_outputs.ts +43 -0
- package/src/llm/google/utils/common.test.ts +64 -0
- package/src/llm/google/utils/common.ts +18 -0
- package/src/llm/openai/index.ts +95 -1
- package/src/llm/openai/sequentialToolCallSeals.test.ts +199 -0
- package/src/llm/vertexai/index.ts +31 -0
- package/src/llm/vertexai/sealStreamedToolCalls.test.ts +88 -0
- package/src/llm/vertexai/streamSealDispatch.test.ts +148 -0
- package/src/stream.ts +40 -6
- package/src/tools/ToolNode.ts +85 -3
- package/src/tools/__tests__/ToolNode.onResultCompletion.test.ts +368 -0
- package/src/tools/search/highlights.ts +9 -1
- package/src/tools/search/search.ts +41 -3
- package/src/tools/search/source-processing.test.ts +373 -0
- package/src/tools/search/tool.ts +22 -2
- package/src/tools/search/types.ts +4 -0
- package/src/tools/streamedToolCallSeals.ts +37 -9
- package/src/types/tools.ts +10 -0
- package/dist/cjs/langchain/google-common.cjs.map +0 -1
- package/dist/cjs/langchain/index.cjs.map +0 -1
- package/dist/cjs/langchain/language_models/chat_models.cjs.map +0 -1
- package/dist/cjs/langchain/messages/tool.cjs.map +0 -1
- package/dist/cjs/langchain/messages.cjs.map +0 -1
- package/dist/cjs/langchain/openai.cjs.map +0 -1
- package/dist/cjs/langchain/prompts.cjs.map +0 -1
- package/dist/cjs/langchain/runnables.cjs.map +0 -1
- package/dist/cjs/langchain/tools.cjs.map +0 -1
- package/dist/cjs/langchain/utils/env.cjs.map +0 -1
- package/dist/cjs/main.cjs.map +0 -1
- package/dist/esm/langchain/google-common.mjs.map +0 -1
- package/dist/esm/langchain/index.mjs.map +0 -1
- package/dist/esm/langchain/language_models/chat_models.mjs.map +0 -1
- package/dist/esm/langchain/messages/tool.mjs.map +0 -1
- package/dist/esm/langchain/messages.mjs.map +0 -1
- package/dist/esm/langchain/openai.mjs.map +0 -1
- package/dist/esm/langchain/prompts.mjs.map +0 -1
- package/dist/esm/langchain/runnables.mjs.map +0 -1
- package/dist/esm/langchain/tools.mjs.map +0 -1
- package/dist/esm/langchain/utils/env.mjs.map +0 -1
- package/dist/esm/main.mjs.map +0 -1
|
@@ -1,1323 +1,1090 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import { OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER, STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY } from "../../tools/streamedToolCallSeals.mjs";
|
|
2
|
+
import { _convertMessagesToOpenAIParams, isReasoningModel } from "./utils/index.mjs";
|
|
3
|
+
import { AIMessage, AIMessageChunk, isAIMessage } from "@langchain/core/messages";
|
|
4
|
+
import { AzureChatOpenAI, AzureChatOpenAICompletions, AzureChatOpenAIResponses, ChatOpenAI, ChatOpenAICompletions, ChatOpenAIResponses, OpenAIClient, getEndpoint, getHeadersWithUserAgent } from "@langchain/openai";
|
|
5
|
+
import { AzureOpenAI } from "openai";
|
|
6
|
+
import { ChatXAI } from "@langchain/xai";
|
|
7
|
+
import { ChatGenerationChunk } from "@langchain/core/outputs";
|
|
8
|
+
import { ChatDeepSeek } from "@langchain/deepseek";
|
|
9
|
+
import { convertToOpenAITool, isLangChainTool } from "@langchain/core/utils/function_calling";
|
|
10
|
+
//#region src/llm/openai/index.ts
|
|
11
11
|
const iife = (fn) => fn();
|
|
12
12
|
const STREAM_CHUNK_MIN_SIZE = 4;
|
|
13
|
-
const STREAM_BOUNDARIES = new Set([
|
|
13
|
+
const STREAM_BOUNDARIES = new Set([
|
|
14
|
+
" ",
|
|
15
|
+
".",
|
|
16
|
+
",",
|
|
17
|
+
"!",
|
|
18
|
+
"?",
|
|
19
|
+
";",
|
|
20
|
+
":"
|
|
21
|
+
]);
|
|
14
22
|
function isHeaders(headers) {
|
|
15
|
-
|
|
16
|
-
headers !== null &&
|
|
17
|
-
typeof headers === 'object' &&
|
|
18
|
-
Object.prototype.toString.call(headers) === '[object Headers]');
|
|
23
|
+
return typeof Headers !== "undefined" && headers !== null && typeof headers === "object" && Object.prototype.toString.call(headers) === "[object Headers]";
|
|
19
24
|
}
|
|
20
25
|
function normalizeHeaders(headers) {
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
headers !== null &&
|
|
33
|
-
'values' in headers &&
|
|
34
|
-
isHeaders(headers.values)) {
|
|
35
|
-
return headers.values;
|
|
36
|
-
}
|
|
37
|
-
// If headers is a plain object
|
|
38
|
-
else if (typeof headers === 'object' && headers !== null) {
|
|
39
|
-
const entries = Object.entries(headers)
|
|
40
|
-
.filter(([, v]) => typeof v === 'string')
|
|
41
|
-
.map(([k, v]) => [k, v]);
|
|
42
|
-
return new Headers(entries);
|
|
43
|
-
}
|
|
44
|
-
return new Headers();
|
|
45
|
-
});
|
|
46
|
-
return Object.fromEntries(output.entries());
|
|
26
|
+
const output = iife(() => {
|
|
27
|
+
if (isHeaders(headers)) return headers;
|
|
28
|
+
else if (Array.isArray(headers)) return new Headers(headers);
|
|
29
|
+
else if (typeof headers === "object" && headers !== null && "values" in headers && isHeaders(headers.values)) return headers.values;
|
|
30
|
+
else if (typeof headers === "object" && headers !== null) {
|
|
31
|
+
const entries = Object.entries(headers).filter(([, v]) => typeof v === "string").map(([k, v]) => [k, v]);
|
|
32
|
+
return new Headers(entries);
|
|
33
|
+
}
|
|
34
|
+
return new Headers();
|
|
35
|
+
});
|
|
36
|
+
return Object.fromEntries(output.entries());
|
|
47
37
|
}
|
|
48
38
|
function createUsageMetadata(usage) {
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
usageMetadata.input_token_details = inputTokenDetails;
|
|
89
|
-
}
|
|
90
|
-
if (hasOutputTokenDetails) {
|
|
91
|
-
usageMetadata.output_token_details = outputTokenDetails;
|
|
92
|
-
}
|
|
93
|
-
return usageMetadata;
|
|
39
|
+
const usageMetadata = {
|
|
40
|
+
input_tokens: usage?.prompt_tokens ?? 0,
|
|
41
|
+
output_tokens: usage?.completion_tokens ?? 0,
|
|
42
|
+
total_tokens: usage?.total_tokens ?? 0
|
|
43
|
+
};
|
|
44
|
+
if (usage == null) return usageMetadata;
|
|
45
|
+
const inputTokenDetails = {};
|
|
46
|
+
const outputTokenDetails = {};
|
|
47
|
+
let hasInputTokenDetails = false;
|
|
48
|
+
let hasOutputTokenDetails = false;
|
|
49
|
+
const promptTokenDetails = usage.prompt_tokens_details;
|
|
50
|
+
const audioInputTokens = promptTokenDetails?.audio_tokens;
|
|
51
|
+
const cachedInputTokens = promptTokenDetails?.cached_tokens;
|
|
52
|
+
const cacheWriteInputTokens = promptTokenDetails?.cache_write_tokens;
|
|
53
|
+
const audioOutputTokens = usage.completion_tokens_details?.audio_tokens;
|
|
54
|
+
const reasoningOutputTokens = usage.completion_tokens_details?.reasoning_tokens;
|
|
55
|
+
if (audioInputTokens != null) {
|
|
56
|
+
inputTokenDetails.audio = audioInputTokens;
|
|
57
|
+
hasInputTokenDetails = true;
|
|
58
|
+
}
|
|
59
|
+
if (cachedInputTokens != null) {
|
|
60
|
+
inputTokenDetails.cache_read = cachedInputTokens;
|
|
61
|
+
hasInputTokenDetails = true;
|
|
62
|
+
}
|
|
63
|
+
if (cacheWriteInputTokens != null) {
|
|
64
|
+
inputTokenDetails.cache_creation = cacheWriteInputTokens;
|
|
65
|
+
hasInputTokenDetails = true;
|
|
66
|
+
}
|
|
67
|
+
if (audioOutputTokens != null) {
|
|
68
|
+
outputTokenDetails.audio = audioOutputTokens;
|
|
69
|
+
hasOutputTokenDetails = true;
|
|
70
|
+
}
|
|
71
|
+
if (reasoningOutputTokens != null) {
|
|
72
|
+
outputTokenDetails.reasoning = reasoningOutputTokens;
|
|
73
|
+
hasOutputTokenDetails = true;
|
|
74
|
+
}
|
|
75
|
+
if (hasInputTokenDetails) usageMetadata.input_token_details = inputTokenDetails;
|
|
76
|
+
if (hasOutputTokenDetails) usageMetadata.output_token_details = outputTokenDetails;
|
|
77
|
+
return usageMetadata;
|
|
94
78
|
}
|
|
95
79
|
function getExposedOpenAIClient(completions, responses, preferResponses) {
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
}
|
|
104
|
-
const delegate = preferResponses ? responses : completions;
|
|
105
|
-
delegate._getClientOptions(undefined);
|
|
106
|
-
return delegate.client;
|
|
80
|
+
const responsesClient = responses.client;
|
|
81
|
+
if (responsesClient?.abortHandler != null) return responsesClient;
|
|
82
|
+
const completionsClient = completions.client;
|
|
83
|
+
if (completionsClient?.abortHandler != null) return completionsClient;
|
|
84
|
+
const delegate = preferResponses ? responses : completions;
|
|
85
|
+
delegate._getClientOptions(void 0);
|
|
86
|
+
return delegate.client;
|
|
107
87
|
}
|
|
108
88
|
function getReasoningParams(baseReasoning, options) {
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
reasoning?.effort === undefined) {
|
|
124
|
-
reasoning = {
|
|
125
|
-
...reasoning,
|
|
126
|
-
effort: options.reasoningEffort,
|
|
127
|
-
};
|
|
128
|
-
}
|
|
129
|
-
return reasoning;
|
|
89
|
+
let reasoning;
|
|
90
|
+
if (baseReasoning !== void 0) reasoning = {
|
|
91
|
+
...reasoning,
|
|
92
|
+
...baseReasoning
|
|
93
|
+
};
|
|
94
|
+
if (options?.reasoning !== void 0) reasoning = {
|
|
95
|
+
...reasoning,
|
|
96
|
+
...options.reasoning
|
|
97
|
+
};
|
|
98
|
+
if (options?.reasoningEffort !== void 0 && reasoning?.effort === void 0) reasoning = {
|
|
99
|
+
...reasoning,
|
|
100
|
+
effort: options.reasoningEffort
|
|
101
|
+
};
|
|
102
|
+
return reasoning;
|
|
130
103
|
}
|
|
131
104
|
function getGatedReasoningParams(model, baseReasoning, options) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
}
|
|
135
|
-
return getReasoningParams(baseReasoning, options);
|
|
105
|
+
if (!isReasoningModel(model)) return;
|
|
106
|
+
return getReasoningParams(baseReasoning, options);
|
|
136
107
|
}
|
|
137
108
|
function isObject(value) {
|
|
138
|
-
|
|
109
|
+
return typeof value === "object" && value !== null;
|
|
139
110
|
}
|
|
140
111
|
function isOpenAIChatCompletionChunk(value) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
// Intentionally loose: downstream handlers already tolerate empty choices.
|
|
145
|
-
const { choices } = value;
|
|
146
|
-
return Array.isArray(choices);
|
|
112
|
+
if (!isObject(value)) return false;
|
|
113
|
+
const { choices } = value;
|
|
114
|
+
return Array.isArray(choices);
|
|
147
115
|
}
|
|
148
116
|
function getOpenAIChatCompletionChunk(value) {
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
const { data } = value;
|
|
153
|
-
if (isOpenAIChatCompletionChunk(data)) {
|
|
154
|
-
return data;
|
|
155
|
-
}
|
|
156
|
-
return undefined;
|
|
117
|
+
if (isOpenAIChatCompletionChunk(value)) return value;
|
|
118
|
+
const { data } = value;
|
|
119
|
+
if (isOpenAIChatCompletionChunk(data)) return data;
|
|
157
120
|
}
|
|
158
121
|
async function* filterOpenAIChatCompletionStream(stream) {
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
yield chunk;
|
|
165
|
-
}
|
|
122
|
+
for await (const item of stream) {
|
|
123
|
+
const chunk = getOpenAIChatCompletionChunk(item);
|
|
124
|
+
if (chunk == null) continue;
|
|
125
|
+
yield chunk;
|
|
126
|
+
}
|
|
166
127
|
}
|
|
167
128
|
async function completionWithFilteredOpenAIStream(request, requestOptions, completionWithRetry) {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
}
|
|
171
|
-
const stream = await completionWithRetry(request, requestOptions);
|
|
172
|
-
return filterOpenAIChatCompletionStream(stream);
|
|
129
|
+
if (request.stream !== true) return await completionWithRetry(request, requestOptions);
|
|
130
|
+
return filterOpenAIChatCompletionStream(await completionWithRetry(request, requestOptions));
|
|
173
131
|
}
|
|
174
132
|
function attachLibreChatDeltaFields(chunk, delta) {
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
chunk.additional_kwargs.reasoning_content = libreChatDelta.reasoning;
|
|
182
|
-
}
|
|
183
|
-
if (libreChatDelta.reasoning_details != null) {
|
|
184
|
-
chunk.additional_kwargs.reasoning_details =
|
|
185
|
-
libreChatDelta.reasoning_details;
|
|
186
|
-
}
|
|
187
|
-
if (libreChatDelta.provider_specific_fields != null) {
|
|
188
|
-
chunk.additional_kwargs.provider_specific_fields =
|
|
189
|
-
libreChatDelta.provider_specific_fields;
|
|
190
|
-
}
|
|
191
|
-
return chunk;
|
|
133
|
+
if (!AIMessageChunk.isInstance(chunk)) return chunk;
|
|
134
|
+
const libreChatDelta = delta;
|
|
135
|
+
if (libreChatDelta.reasoning != null && chunk.additional_kwargs.reasoning_content == null) chunk.additional_kwargs.reasoning_content = libreChatDelta.reasoning;
|
|
136
|
+
if (libreChatDelta.reasoning_details != null) chunk.additional_kwargs.reasoning_details = libreChatDelta.reasoning_details;
|
|
137
|
+
if (libreChatDelta.provider_specific_fields != null) chunk.additional_kwargs.provider_specific_fields = libreChatDelta.provider_specific_fields;
|
|
138
|
+
return chunk;
|
|
192
139
|
}
|
|
193
140
|
function attachLibreChatMessageFields(message, rawMessage) {
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
message.additional_kwargs.reasoning_content = rawMessage.reasoning;
|
|
200
|
-
}
|
|
201
|
-
if (rawMessage.reasoning_details != null) {
|
|
202
|
-
message.additional_kwargs.reasoning_details = rawMessage.reasoning_details;
|
|
203
|
-
}
|
|
204
|
-
if (rawMessage.provider_specific_fields != null) {
|
|
205
|
-
message.additional_kwargs.provider_specific_fields =
|
|
206
|
-
rawMessage.provider_specific_fields;
|
|
207
|
-
}
|
|
208
|
-
return message;
|
|
141
|
+
if (!isAIMessage(message)) return message;
|
|
142
|
+
if (rawMessage.reasoning != null && message.additional_kwargs.reasoning_content == null) message.additional_kwargs.reasoning_content = rawMessage.reasoning;
|
|
143
|
+
if (rawMessage.reasoning_details != null) message.additional_kwargs.reasoning_details = rawMessage.reasoning_details;
|
|
144
|
+
if (rawMessage.provider_specific_fields != null) message.additional_kwargs.provider_specific_fields = rawMessage.provider_specific_fields;
|
|
145
|
+
return message;
|
|
209
146
|
}
|
|
210
147
|
function getCustomOpenAIClientOptions(owner, options) {
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
}
|
|
228
|
-
const requestOptions = {
|
|
229
|
-
...owner.clientConfig,
|
|
230
|
-
...options,
|
|
231
|
-
};
|
|
232
|
-
return requestOptions;
|
|
148
|
+
if (!owner.client) {
|
|
149
|
+
const endpoint = getEndpoint({ baseURL: owner.clientConfig.baseURL });
|
|
150
|
+
const params = {
|
|
151
|
+
...owner.clientConfig,
|
|
152
|
+
baseURL: endpoint,
|
|
153
|
+
timeout: owner.timeout,
|
|
154
|
+
maxRetries: 0
|
|
155
|
+
};
|
|
156
|
+
if (params.baseURL == null) delete params.baseURL;
|
|
157
|
+
params.defaultHeaders = getHeadersWithUserAgent(params.defaultHeaders);
|
|
158
|
+
owner.client = new CustomOpenAIClient(params);
|
|
159
|
+
}
|
|
160
|
+
return {
|
|
161
|
+
...owner.clientConfig,
|
|
162
|
+
...options
|
|
163
|
+
};
|
|
233
164
|
}
|
|
234
165
|
function findStreamChunkBoundary(text, minSize) {
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
for (let position = minSize; position < text.length; position++) {
|
|
239
|
-
if (STREAM_BOUNDARIES.has(text[position])) {
|
|
240
|
-
return position + 1;
|
|
241
|
-
}
|
|
242
|
-
}
|
|
243
|
-
return text.length;
|
|
166
|
+
if (minSize >= text.length) return text.length;
|
|
167
|
+
for (let position = minSize; position < text.length; position++) if (STREAM_BOUNDARIES.has(text[position])) return position + 1;
|
|
168
|
+
return text.length;
|
|
244
169
|
}
|
|
245
170
|
function splitStreamToken(text) {
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
return chunks;
|
|
171
|
+
const chunks = [];
|
|
172
|
+
let currentIndex = 0;
|
|
173
|
+
while (currentIndex < text.length) {
|
|
174
|
+
const chunkSize = findStreamChunkBoundary(text.slice(currentIndex), STREAM_CHUNK_MIN_SIZE);
|
|
175
|
+
chunks.push(text.slice(currentIndex, currentIndex + chunkSize));
|
|
176
|
+
currentIndex += chunkSize;
|
|
177
|
+
}
|
|
178
|
+
return chunks;
|
|
255
179
|
}
|
|
256
180
|
function splitTextGenerationChunk(chunk) {
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
: message.usage_metadata;
|
|
275
|
-
if (message.usage_metadata != null && !emittedUsage) {
|
|
276
|
-
emittedUsage = true;
|
|
277
|
-
}
|
|
278
|
-
return new ChatGenerationChunk({
|
|
279
|
-
text: token,
|
|
280
|
-
generationInfo: chunk.generationInfo,
|
|
281
|
-
message: new AIMessageChunk(Object.assign({}, message, {
|
|
282
|
-
content: token,
|
|
283
|
-
usage_metadata: usageMetadata,
|
|
284
|
-
})),
|
|
285
|
-
});
|
|
286
|
-
});
|
|
181
|
+
const { message } = chunk;
|
|
182
|
+
if (!chunk.text || !(message instanceof AIMessageChunk) || typeof message.content !== "string" || message.content !== chunk.text || chunk.generationInfo?.logprobs != null || chunk.generationInfo?.finish_reason != null) return [chunk];
|
|
183
|
+
const tokenChunks = splitStreamToken(chunk.text);
|
|
184
|
+
if (tokenChunks.length <= 1) return [chunk];
|
|
185
|
+
let emittedUsage = false;
|
|
186
|
+
return tokenChunks.map((token) => {
|
|
187
|
+
const usageMetadata = emittedUsage && message.usage_metadata != null ? void 0 : message.usage_metadata;
|
|
188
|
+
if (message.usage_metadata != null && !emittedUsage) emittedUsage = true;
|
|
189
|
+
return new ChatGenerationChunk({
|
|
190
|
+
text: token,
|
|
191
|
+
generationInfo: chunk.generationInfo,
|
|
192
|
+
message: new AIMessageChunk(Object.assign({}, message, {
|
|
193
|
+
content: token,
|
|
194
|
+
usage_metadata: usageMetadata
|
|
195
|
+
}))
|
|
196
|
+
});
|
|
197
|
+
});
|
|
287
198
|
}
|
|
288
199
|
async function emitStreamChunkCallback(chunk, runManager) {
|
|
289
|
-
|
|
200
|
+
await runManager?.handleLLMNewToken(chunk.text, getStreamChunkTokenIndices(chunk), void 0, void 0, void 0, { chunk });
|
|
290
201
|
}
|
|
291
202
|
function getStreamChunkTokenIndices(chunk) {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
203
|
+
const prompt = chunk.generationInfo?.prompt;
|
|
204
|
+
const completion = chunk.generationInfo?.completion;
|
|
205
|
+
if (typeof prompt === "number" && typeof completion === "number") return {
|
|
206
|
+
prompt,
|
|
207
|
+
completion
|
|
208
|
+
};
|
|
298
209
|
}
|
|
299
210
|
async function* delayStreamChunks(chunks, delay, signal, runManager) {
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
}
|
|
318
|
-
}
|
|
211
|
+
let lastYieldedAt;
|
|
212
|
+
for await (const chunk of chunks) {
|
|
213
|
+
const outputChunks = delay != null && delay > 0 ? splitTextGenerationChunk(chunk) : [chunk];
|
|
214
|
+
for (const outputChunk of outputChunks) {
|
|
215
|
+
signal?.throwIfAborted();
|
|
216
|
+
if (delay != null && delay > 0 && lastYieldedAt != null) {
|
|
217
|
+
const timeSinceLastYield = Date.now() - lastYieldedAt;
|
|
218
|
+
const timeToWait = Math.max(0, delay - timeSinceLastYield);
|
|
219
|
+
if (timeToWait > 0) await sleepWithAbort(timeToWait, signal);
|
|
220
|
+
}
|
|
221
|
+
signal?.throwIfAborted();
|
|
222
|
+
lastYieldedAt = Date.now();
|
|
223
|
+
await emitStreamChunkCallback(outputChunk, runManager);
|
|
224
|
+
signal?.throwIfAborted();
|
|
225
|
+
yield outputChunk;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
319
228
|
}
|
|
320
229
|
async function sleepWithAbort(delay, signal) {
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
if (signal?.aborted === true) {
|
|
337
|
-
onAbort();
|
|
338
|
-
}
|
|
339
|
-
});
|
|
230
|
+
if (delay <= 0) return;
|
|
231
|
+
signal?.throwIfAborted();
|
|
232
|
+
await new Promise((resolve, reject) => {
|
|
233
|
+
const timeout = setTimeout(() => {
|
|
234
|
+
signal?.removeEventListener("abort", onAbort);
|
|
235
|
+
resolve();
|
|
236
|
+
}, delay);
|
|
237
|
+
const onAbort = () => {
|
|
238
|
+
clearTimeout(timeout);
|
|
239
|
+
signal?.removeEventListener("abort", onAbort);
|
|
240
|
+
reject(signal?.reason ?? /* @__PURE__ */ new Error("AbortError: User aborted request."));
|
|
241
|
+
};
|
|
242
|
+
signal?.addEventListener("abort", onAbort, { once: true });
|
|
243
|
+
if (signal?.aborted === true) onAbort();
|
|
244
|
+
});
|
|
340
245
|
}
|
|
341
246
|
function createAbortHandler(controller) {
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
247
|
+
return function() {
|
|
248
|
+
controller.abort();
|
|
249
|
+
};
|
|
345
250
|
}
|
|
346
251
|
/**
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
252
|
+
* Formats a tool in either OpenAI format, or LangChain structured tool format
|
|
253
|
+
* into an OpenAI tool format. If the tool is already in OpenAI format, return without
|
|
254
|
+
* any changes. If it is in LangChain structured tool format, convert it to OpenAI tool format
|
|
255
|
+
* using OpenAI's `zodFunction` util, falling back to `convertToOpenAIFunction` if the parameters
|
|
256
|
+
* returned from the `zodFunction` util are not defined.
|
|
257
|
+
*
|
|
258
|
+
* @param {BindToolsInput} tool The tool to convert to an OpenAI tool.
|
|
259
|
+
* @param {Object} [fields] Additional fields to add to the OpenAI tool.
|
|
260
|
+
* @returns {ToolDefinition} The inputted tool in OpenAI tool format.
|
|
261
|
+
*/
|
|
357
262
|
function _convertToOpenAITool(tool, fields) {
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
toolDef = tool;
|
|
364
|
-
}
|
|
365
|
-
return toolDef;
|
|
366
|
-
}
|
|
367
|
-
class CustomOpenAIClient extends OpenAIClient {
|
|
368
|
-
abortHandler;
|
|
369
|
-
async fetchWithTimeout(url, init, ms, controller) {
|
|
370
|
-
const { signal, ...options } = init || {};
|
|
371
|
-
const handler = createAbortHandler(controller);
|
|
372
|
-
this.abortHandler = handler;
|
|
373
|
-
if (signal)
|
|
374
|
-
signal.addEventListener('abort', handler, { once: true });
|
|
375
|
-
const timeout = setTimeout(handler, ms);
|
|
376
|
-
const fetchOptions = {
|
|
377
|
-
signal: controller.signal,
|
|
378
|
-
...options,
|
|
379
|
-
};
|
|
380
|
-
if (fetchOptions.method != null) {
|
|
381
|
-
// Custom methods like 'patch' need to be uppercased
|
|
382
|
-
// See https://github.com/nodejs/undici/issues/2294
|
|
383
|
-
fetchOptions.method = fetchOptions.method.toUpperCase();
|
|
384
|
-
}
|
|
385
|
-
return (
|
|
386
|
-
// use undefined this binding; fetch errors if bound to something else in browser/cloudflare
|
|
387
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
388
|
-
/** @ts-ignore */
|
|
389
|
-
this.fetch.call(undefined, url, fetchOptions).finally(() => {
|
|
390
|
-
clearTimeout(timeout);
|
|
391
|
-
}));
|
|
392
|
-
}
|
|
393
|
-
}
|
|
394
|
-
class CustomAzureOpenAIClient extends AzureOpenAI {
|
|
395
|
-
abortHandler;
|
|
396
|
-
async fetchWithTimeout(url, init, ms, controller) {
|
|
397
|
-
const { signal, ...options } = init || {};
|
|
398
|
-
const handler = createAbortHandler(controller);
|
|
399
|
-
this.abortHandler = handler;
|
|
400
|
-
if (signal)
|
|
401
|
-
signal.addEventListener('abort', handler, { once: true });
|
|
402
|
-
const timeout = setTimeout(handler, ms);
|
|
403
|
-
const fetchOptions = {
|
|
404
|
-
signal: controller.signal,
|
|
405
|
-
...options,
|
|
406
|
-
};
|
|
407
|
-
if (fetchOptions.method != null) {
|
|
408
|
-
// Custom methods like 'patch' need to be uppercased
|
|
409
|
-
// See https://github.com/nodejs/undici/issues/2294
|
|
410
|
-
fetchOptions.method = fetchOptions.method.toUpperCase();
|
|
411
|
-
}
|
|
412
|
-
return (
|
|
413
|
-
// use undefined this binding; fetch errors if bound to something else in browser/cloudflare
|
|
414
|
-
// eslint-disable-next-line @typescript-eslint/ban-ts-comment
|
|
415
|
-
/** @ts-ignore */
|
|
416
|
-
this.fetch.call(undefined, url, fetchOptions).finally(() => {
|
|
417
|
-
clearTimeout(timeout);
|
|
418
|
-
}));
|
|
419
|
-
}
|
|
263
|
+
let toolDef;
|
|
264
|
+
if (isLangChainTool(tool)) toolDef = convertToOpenAITool(tool);
|
|
265
|
+
else toolDef = tool;
|
|
266
|
+
if (fields?.strict !== void 0) toolDef.function.strict = fields.strict;
|
|
267
|
+
return toolDef;
|
|
420
268
|
}
|
|
421
|
-
class
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
finalChunks.set(index, chunk);
|
|
474
|
-
}
|
|
475
|
-
else {
|
|
476
|
-
finalChunks.set(index, existingChunk.concat(chunk));
|
|
477
|
-
}
|
|
478
|
-
}
|
|
479
|
-
const generations = Array.from(finalChunks.entries())
|
|
480
|
-
.sort(([aKey], [bKey]) => aKey - bKey)
|
|
481
|
-
.map(([, value]) => value);
|
|
482
|
-
const { functions, function_call } = this.invocationParams(options);
|
|
483
|
-
const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(messages, functions, function_call);
|
|
484
|
-
const completionTokenUsage = await this._getNumTokensFromGenerations(generations);
|
|
485
|
-
usageMetadata.input_tokens = promptTokenUsage;
|
|
486
|
-
usageMetadata.output_tokens = completionTokenUsage;
|
|
487
|
-
usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;
|
|
488
|
-
return {
|
|
489
|
-
generations,
|
|
490
|
-
llmOutput: {
|
|
491
|
-
estimatedTokenUsage: {
|
|
492
|
-
promptTokens: usageMetadata.input_tokens,
|
|
493
|
-
completionTokens: usageMetadata.output_tokens,
|
|
494
|
-
totalTokens: usageMetadata.total_tokens,
|
|
495
|
-
},
|
|
496
|
-
},
|
|
497
|
-
};
|
|
498
|
-
}
|
|
499
|
-
const data = await this.completionWithRetry({
|
|
500
|
-
...params,
|
|
501
|
-
stream: false,
|
|
502
|
-
messages: messagesMapped,
|
|
503
|
-
}, {
|
|
504
|
-
signal: options.signal,
|
|
505
|
-
...options.options,
|
|
506
|
-
});
|
|
507
|
-
const { completion_tokens: completionTokens, prompt_tokens: promptTokens, total_tokens: totalTokens, prompt_tokens_details: promptTokensDetails, completion_tokens_details: completionTokensDetails, } = data.usage ?? {};
|
|
508
|
-
if (completionTokens != null) {
|
|
509
|
-
usageMetadata.output_tokens =
|
|
510
|
-
(usageMetadata.output_tokens ?? 0) + completionTokens;
|
|
511
|
-
}
|
|
512
|
-
if (promptTokens != null) {
|
|
513
|
-
usageMetadata.input_tokens =
|
|
514
|
-
(usageMetadata.input_tokens ?? 0) + promptTokens;
|
|
515
|
-
}
|
|
516
|
-
if (totalTokens != null) {
|
|
517
|
-
usageMetadata.total_tokens =
|
|
518
|
-
(usageMetadata.total_tokens ?? 0) + totalTokens;
|
|
519
|
-
}
|
|
520
|
-
const promptTokensDetailsWithCacheWrite = promptTokensDetails;
|
|
521
|
-
if (promptTokensDetailsWithCacheWrite?.audio_tokens != null ||
|
|
522
|
-
promptTokensDetailsWithCacheWrite?.cached_tokens != null ||
|
|
523
|
-
promptTokensDetailsWithCacheWrite?.cache_write_tokens != null) {
|
|
524
|
-
usageMetadata.input_token_details = {
|
|
525
|
-
...(promptTokensDetailsWithCacheWrite.audio_tokens != null && {
|
|
526
|
-
audio: promptTokensDetailsWithCacheWrite.audio_tokens,
|
|
527
|
-
}),
|
|
528
|
-
...(promptTokensDetailsWithCacheWrite.cached_tokens != null && {
|
|
529
|
-
cache_read: promptTokensDetailsWithCacheWrite.cached_tokens,
|
|
530
|
-
}),
|
|
531
|
-
...(promptTokensDetailsWithCacheWrite.cache_write_tokens != null && {
|
|
532
|
-
cache_creation: promptTokensDetailsWithCacheWrite.cache_write_tokens,
|
|
533
|
-
}),
|
|
534
|
-
};
|
|
535
|
-
}
|
|
536
|
-
if (completionTokensDetails?.audio_tokens != null ||
|
|
537
|
-
completionTokensDetails?.reasoning_tokens != null) {
|
|
538
|
-
usageMetadata.output_token_details = {
|
|
539
|
-
...(completionTokensDetails.audio_tokens != null && {
|
|
540
|
-
audio: completionTokensDetails.audio_tokens,
|
|
541
|
-
}),
|
|
542
|
-
...(completionTokensDetails.reasoning_tokens != null && {
|
|
543
|
-
reasoning: completionTokensDetails.reasoning_tokens,
|
|
544
|
-
}),
|
|
545
|
-
};
|
|
546
|
-
}
|
|
547
|
-
const generations = [];
|
|
548
|
-
for (const part of data.choices) {
|
|
549
|
-
const generation = {
|
|
550
|
-
text: part.message.content ?? '',
|
|
551
|
-
message: this._convertCompletionsMessageToBaseMessage(part.message, data),
|
|
552
|
-
};
|
|
553
|
-
generation.generationInfo = {
|
|
554
|
-
finish_reason: part.finish_reason,
|
|
555
|
-
...(part.logprobs ? { logprobs: part.logprobs } : {}),
|
|
556
|
-
};
|
|
557
|
-
if (isAIMessage(generation.message)) {
|
|
558
|
-
generation.message.usage_metadata = usageMetadata;
|
|
559
|
-
}
|
|
560
|
-
generation.message = new AIMessage(Object.fromEntries(Object.entries(generation.message).filter(([key]) => !key.startsWith('lc_'))));
|
|
561
|
-
generations.push(generation);
|
|
562
|
-
}
|
|
563
|
-
return {
|
|
564
|
-
generations,
|
|
565
|
-
llmOutput: {
|
|
566
|
-
tokenUsage: {
|
|
567
|
-
promptTokens: usageMetadata.input_tokens,
|
|
568
|
-
completionTokens: usageMetadata.output_tokens,
|
|
569
|
-
totalTokens: usageMetadata.total_tokens,
|
|
570
|
-
},
|
|
571
|
-
},
|
|
572
|
-
};
|
|
573
|
-
}
|
|
574
|
-
async *_streamResponseChunks(messages, options, runManager) {
|
|
575
|
-
if (this.includeReasoningContent !== true &&
|
|
576
|
-
this.includeReasoningDetails !== true) {
|
|
577
|
-
yield* super._streamResponseChunks(messages, options, runManager);
|
|
578
|
-
return;
|
|
579
|
-
}
|
|
580
|
-
const messagesMapped = _convertMessagesToOpenAIParams(messages, this.model, {
|
|
581
|
-
includeReasoningContent: this.includeReasoningContent,
|
|
582
|
-
includeReasoningDetails: this.includeReasoningDetails,
|
|
583
|
-
convertReasoningDetailsToContent: this.convertReasoningDetailsToContent,
|
|
584
|
-
});
|
|
585
|
-
const params = {
|
|
586
|
-
...this.invocationParams(options, {
|
|
587
|
-
streaming: true,
|
|
588
|
-
}),
|
|
589
|
-
messages: messagesMapped,
|
|
590
|
-
stream: true,
|
|
591
|
-
};
|
|
592
|
-
let defaultRole;
|
|
593
|
-
const streamIterable = await this.completionWithRetry(params, options);
|
|
594
|
-
let usage;
|
|
595
|
-
for await (const data of streamIterable) {
|
|
596
|
-
if (options.signal?.aborted === true) {
|
|
597
|
-
return;
|
|
598
|
-
}
|
|
599
|
-
const choices = data.choices;
|
|
600
|
-
const choice = choices?.[0];
|
|
601
|
-
if (data.usage != null) {
|
|
602
|
-
usage = data.usage;
|
|
603
|
-
}
|
|
604
|
-
if (choice == null) {
|
|
605
|
-
continue;
|
|
606
|
-
}
|
|
607
|
-
const { delta } = choice;
|
|
608
|
-
if (delta == null) {
|
|
609
|
-
continue;
|
|
610
|
-
}
|
|
611
|
-
const chunk = this._convertCompletionsDeltaToBaseMessageChunk(delta, data, defaultRole);
|
|
612
|
-
defaultRole = delta.role ?? defaultRole;
|
|
613
|
-
const newTokenIndices = {
|
|
614
|
-
prompt: options.promptIndex ?? 0,
|
|
615
|
-
completion: choice.index,
|
|
616
|
-
};
|
|
617
|
-
if (typeof chunk.content !== 'string') {
|
|
618
|
-
// eslint-disable-next-line no-console
|
|
619
|
-
console.log('[WARNING]: Received non-string content from OpenAI. This is currently not supported.');
|
|
620
|
-
continue;
|
|
621
|
-
}
|
|
622
|
-
const generationInfo = { ...newTokenIndices };
|
|
623
|
-
if (choice.finish_reason != null) {
|
|
624
|
-
generationInfo.finish_reason = choice.finish_reason;
|
|
625
|
-
generationInfo.system_fingerprint = data.system_fingerprint;
|
|
626
|
-
generationInfo.model_name = data.model;
|
|
627
|
-
generationInfo.service_tier = data.service_tier;
|
|
628
|
-
}
|
|
629
|
-
if (this.logprobs === true) {
|
|
630
|
-
generationInfo.logprobs = choice.logprobs;
|
|
631
|
-
}
|
|
632
|
-
const generationChunk = new ChatGenerationChunk({
|
|
633
|
-
message: chunk,
|
|
634
|
-
text: chunk.content,
|
|
635
|
-
generationInfo,
|
|
636
|
-
});
|
|
637
|
-
yield generationChunk;
|
|
638
|
-
await runManager?.handleLLMNewToken(generationChunk.text, newTokenIndices, undefined, undefined, undefined, { chunk: generationChunk });
|
|
639
|
-
}
|
|
640
|
-
if (usage) {
|
|
641
|
-
const promptTokenDetails = usage.prompt_tokens_details;
|
|
642
|
-
const inputTokenDetails = {
|
|
643
|
-
...(promptTokenDetails?.audio_tokens != null && {
|
|
644
|
-
audio: promptTokenDetails.audio_tokens,
|
|
645
|
-
}),
|
|
646
|
-
...(promptTokenDetails?.cached_tokens != null && {
|
|
647
|
-
cache_read: promptTokenDetails.cached_tokens,
|
|
648
|
-
}),
|
|
649
|
-
...(promptTokenDetails?.cache_write_tokens != null && {
|
|
650
|
-
cache_creation: promptTokenDetails.cache_write_tokens,
|
|
651
|
-
}),
|
|
652
|
-
};
|
|
653
|
-
const outputTokenDetails = {
|
|
654
|
-
...(usage.completion_tokens_details?.audio_tokens != null && {
|
|
655
|
-
audio: usage.completion_tokens_details.audio_tokens,
|
|
656
|
-
}),
|
|
657
|
-
...(usage.completion_tokens_details?.reasoning_tokens != null && {
|
|
658
|
-
reasoning: usage.completion_tokens_details.reasoning_tokens,
|
|
659
|
-
}),
|
|
660
|
-
};
|
|
661
|
-
const generationChunk = new ChatGenerationChunk({
|
|
662
|
-
message: new AIMessageChunk({
|
|
663
|
-
content: '',
|
|
664
|
-
response_metadata: { usage: { ...usage } },
|
|
665
|
-
usage_metadata: {
|
|
666
|
-
input_tokens: usage.prompt_tokens,
|
|
667
|
-
output_tokens: usage.completion_tokens,
|
|
668
|
-
total_tokens: usage.total_tokens,
|
|
669
|
-
...(Object.keys(inputTokenDetails).length > 0 && {
|
|
670
|
-
input_token_details: inputTokenDetails,
|
|
671
|
-
}),
|
|
672
|
-
...(Object.keys(outputTokenDetails).length > 0 && {
|
|
673
|
-
output_token_details: outputTokenDetails,
|
|
674
|
-
}),
|
|
675
|
-
},
|
|
676
|
-
}),
|
|
677
|
-
text: '',
|
|
678
|
-
});
|
|
679
|
-
yield generationChunk;
|
|
680
|
-
await runManager?.handleLLMNewToken(generationChunk.text, {
|
|
681
|
-
prompt: 0,
|
|
682
|
-
completion: 0,
|
|
683
|
-
}, undefined, undefined, undefined, { chunk: generationChunk });
|
|
684
|
-
}
|
|
685
|
-
if (options.signal?.aborted === true) {
|
|
686
|
-
throw new Error('AbortError');
|
|
687
|
-
}
|
|
688
|
-
}
|
|
689
|
-
}
|
|
690
|
-
class LibreChatOpenAIResponses extends ChatOpenAIResponses {
|
|
691
|
-
_getReasoningParams(options) {
|
|
692
|
-
return getReasoningParams(this.reasoning, options);
|
|
693
|
-
}
|
|
694
|
-
_getClientOptions(options) {
|
|
695
|
-
return getCustomOpenAIClientOptions(this, options);
|
|
696
|
-
}
|
|
269
|
+
var CustomOpenAIClient = class extends OpenAIClient {
|
|
270
|
+
abortHandler;
|
|
271
|
+
async fetchWithTimeout(url, init, ms, controller) {
|
|
272
|
+
const { signal, ...options } = init || {};
|
|
273
|
+
const handler = createAbortHandler(controller);
|
|
274
|
+
this.abortHandler = handler;
|
|
275
|
+
if (signal) signal.addEventListener("abort", handler, { once: true });
|
|
276
|
+
const timeout = setTimeout(handler, ms);
|
|
277
|
+
const fetchOptions = {
|
|
278
|
+
signal: controller.signal,
|
|
279
|
+
...options
|
|
280
|
+
};
|
|
281
|
+
if (fetchOptions.method != null) fetchOptions.method = fetchOptions.method.toUpperCase();
|
|
282
|
+
return this.fetch.call(void 0, url, fetchOptions).finally(() => {
|
|
283
|
+
clearTimeout(timeout);
|
|
284
|
+
});
|
|
285
|
+
}
|
|
286
|
+
};
|
|
287
|
+
var CustomAzureOpenAIClient = class extends AzureOpenAI {
|
|
288
|
+
abortHandler;
|
|
289
|
+
async fetchWithTimeout(url, init, ms, controller) {
|
|
290
|
+
const { signal, ...options } = init || {};
|
|
291
|
+
const handler = createAbortHandler(controller);
|
|
292
|
+
this.abortHandler = handler;
|
|
293
|
+
if (signal) signal.addEventListener("abort", handler, { once: true });
|
|
294
|
+
const timeout = setTimeout(handler, ms);
|
|
295
|
+
const fetchOptions = {
|
|
296
|
+
signal: controller.signal,
|
|
297
|
+
...options
|
|
298
|
+
};
|
|
299
|
+
if (fetchOptions.method != null) fetchOptions.method = fetchOptions.method.toUpperCase();
|
|
300
|
+
return this.fetch.call(void 0, url, fetchOptions).finally(() => {
|
|
301
|
+
clearTimeout(timeout);
|
|
302
|
+
});
|
|
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 AIMessageChunk && (message.tool_call_chunks?.length ?? 0) > 0) message.response_metadata = {
|
|
317
|
+
...message.response_metadata,
|
|
318
|
+
[STREAMED_TOOL_CALL_ADAPTER_METADATA_KEY]: OPENAI_CHAT_SEQUENTIAL_STREAMED_TOOL_CALL_ADAPTER
|
|
319
|
+
};
|
|
320
|
+
return message;
|
|
697
321
|
}
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
_getClientOptions(options) {
|
|
703
|
-
if (!this.client) {
|
|
704
|
-
const openAIEndpointConfig = {
|
|
705
|
-
azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
|
|
706
|
-
azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
|
|
707
|
-
azureOpenAIApiKey: this.azureOpenAIApiKey,
|
|
708
|
-
azureOpenAIBasePath: this.azureOpenAIBasePath,
|
|
709
|
-
azureADTokenProvider: this.azureADTokenProvider,
|
|
710
|
-
baseURL: this.clientConfig.baseURL,
|
|
711
|
-
};
|
|
712
|
-
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
713
|
-
const params = {
|
|
714
|
-
...this.clientConfig,
|
|
715
|
-
baseURL: endpoint,
|
|
716
|
-
timeout: this.timeout,
|
|
717
|
-
maxRetries: 0,
|
|
718
|
-
};
|
|
719
|
-
if (!this.azureADTokenProvider) {
|
|
720
|
-
params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
|
|
721
|
-
}
|
|
722
|
-
if (params.baseURL == null) {
|
|
723
|
-
delete params.baseURL;
|
|
724
|
-
}
|
|
725
|
-
const defaultHeaders = normalizeHeaders(params.defaultHeaders);
|
|
726
|
-
params.defaultHeaders = {
|
|
727
|
-
...params.defaultHeaders,
|
|
728
|
-
'User-Agent': defaultHeaders['User-Agent'] != null
|
|
729
|
-
? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`
|
|
730
|
-
: 'librechat-azure-openai-v2',
|
|
731
|
-
};
|
|
732
|
-
this.client = new CustomAzureOpenAIClient({
|
|
733
|
-
apiVersion: this.azureOpenAIApiVersion,
|
|
734
|
-
azureADTokenProvider: this.azureADTokenProvider,
|
|
735
|
-
...params,
|
|
736
|
-
});
|
|
737
|
-
}
|
|
738
|
-
const requestOptions = {
|
|
739
|
-
...this.clientConfig,
|
|
740
|
-
...options,
|
|
741
|
-
};
|
|
742
|
-
if (this.azureOpenAIApiKey != null) {
|
|
743
|
-
requestOptions.headers = {
|
|
744
|
-
'api-key': this.azureOpenAIApiKey,
|
|
745
|
-
...requestOptions.headers,
|
|
746
|
-
};
|
|
747
|
-
requestOptions.query = {
|
|
748
|
-
'api-version': this.azureOpenAIApiVersion,
|
|
749
|
-
...requestOptions.query,
|
|
750
|
-
};
|
|
751
|
-
}
|
|
752
|
-
return requestOptions;
|
|
753
|
-
}
|
|
754
|
-
async completionWithRetry(request, requestOptions) {
|
|
755
|
-
return completionWithFilteredOpenAIStream(request, requestOptions, super.completionWithRetry.bind(this));
|
|
756
|
-
}
|
|
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);
|
|
757
326
|
}
|
|
758
|
-
|
|
759
|
-
|
|
760
|
-
|
|
761
|
-
|
|
762
|
-
|
|
763
|
-
|
|
764
|
-
|
|
765
|
-
|
|
766
|
-
|
|
767
|
-
|
|
768
|
-
|
|
769
|
-
|
|
770
|
-
|
|
771
|
-
};
|
|
772
|
-
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
773
|
-
const params = {
|
|
774
|
-
...this.clientConfig,
|
|
775
|
-
baseURL: endpoint,
|
|
776
|
-
timeout: this.timeout,
|
|
777
|
-
maxRetries: 0,
|
|
778
|
-
};
|
|
779
|
-
if (!this.azureADTokenProvider) {
|
|
780
|
-
params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
|
|
781
|
-
}
|
|
782
|
-
if (params.baseURL == null) {
|
|
783
|
-
delete params.baseURL;
|
|
784
|
-
}
|
|
785
|
-
const defaultHeaders = normalizeHeaders(params.defaultHeaders);
|
|
786
|
-
params.defaultHeaders = {
|
|
787
|
-
...params.defaultHeaders,
|
|
788
|
-
'User-Agent': defaultHeaders['User-Agent'] != null
|
|
789
|
-
? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`
|
|
790
|
-
: 'librechat-azure-openai-v2',
|
|
791
|
-
};
|
|
792
|
-
this.client = new CustomAzureOpenAIClient({
|
|
793
|
-
apiVersion: this.azureOpenAIApiVersion,
|
|
794
|
-
azureADTokenProvider: this.azureADTokenProvider,
|
|
795
|
-
...params,
|
|
796
|
-
});
|
|
797
|
-
}
|
|
798
|
-
const requestOptions = {
|
|
799
|
-
...this.clientConfig,
|
|
800
|
-
...options,
|
|
801
|
-
};
|
|
802
|
-
if (this.azureOpenAIApiKey != null) {
|
|
803
|
-
requestOptions.headers = {
|
|
804
|
-
'api-key': this.azureOpenAIApiKey,
|
|
805
|
-
...requestOptions.headers,
|
|
806
|
-
};
|
|
807
|
-
requestOptions.query = {
|
|
808
|
-
'api-version': this.azureOpenAIApiVersion,
|
|
809
|
-
...requestOptions.query,
|
|
810
|
-
};
|
|
811
|
-
}
|
|
812
|
-
return requestOptions;
|
|
813
|
-
}
|
|
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);
|
|
814
340
|
}
|
|
341
|
+
var LibreChatOpenAICompletions = class extends ChatOpenAICompletions {
|
|
342
|
+
includeReasoningContent;
|
|
343
|
+
includeReasoningDetails;
|
|
344
|
+
convertReasoningDetailsToContent;
|
|
345
|
+
constructor(fields) {
|
|
346
|
+
super(fields);
|
|
347
|
+
this.includeReasoningContent = fields?.includeReasoningContent;
|
|
348
|
+
this.includeReasoningDetails = fields?.includeReasoningDetails;
|
|
349
|
+
this.convertReasoningDetailsToContent = fields?.convertReasoningDetailsToContent;
|
|
350
|
+
}
|
|
351
|
+
_getReasoningParams(options) {
|
|
352
|
+
return getReasoningParams(this.reasoning, options);
|
|
353
|
+
}
|
|
354
|
+
_getClientOptions(options) {
|
|
355
|
+
return getCustomOpenAIClientOptions(this, options);
|
|
356
|
+
}
|
|
357
|
+
async completionWithRetry(request, requestOptions) {
|
|
358
|
+
return completionWithFilteredOpenAIStream(request, requestOptions, super.completionWithRetry.bind(this));
|
|
359
|
+
}
|
|
360
|
+
_convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole) {
|
|
361
|
+
const message = attachLibreChatDeltaFields(super._convertCompletionsDeltaToBaseMessageChunk(delta, rawResponse, defaultRole), delta);
|
|
362
|
+
if (isOfficialOpenAIBaseURL(this.clientConfig.baseURL)) return stampSequentialStreamedToolCallAdapter(message);
|
|
363
|
+
return message;
|
|
364
|
+
}
|
|
365
|
+
_convertCompletionsMessageToBaseMessage(message, rawResponse) {
|
|
366
|
+
return attachLibreChatMessageFields(super._convertCompletionsMessageToBaseMessage(message, rawResponse), message);
|
|
367
|
+
}
|
|
368
|
+
async _generate(messages, options, runManager) {
|
|
369
|
+
if (this.includeReasoningContent !== true && this.includeReasoningDetails !== true) return super._generate(messages, options, runManager);
|
|
370
|
+
options.signal?.throwIfAborted();
|
|
371
|
+
const usageMetadata = {};
|
|
372
|
+
const params = this.invocationParams(options);
|
|
373
|
+
const messagesMapped = _convertMessagesToOpenAIParams(messages, this.model, {
|
|
374
|
+
includeReasoningContent: this.includeReasoningContent,
|
|
375
|
+
includeReasoningDetails: this.includeReasoningDetails,
|
|
376
|
+
convertReasoningDetailsToContent: this.convertReasoningDetailsToContent
|
|
377
|
+
});
|
|
378
|
+
if (params.stream === true) {
|
|
379
|
+
const stream = this._streamResponseChunks(messages, options, runManager);
|
|
380
|
+
const finalChunks = /* @__PURE__ */ new Map();
|
|
381
|
+
for await (const chunk of stream) {
|
|
382
|
+
chunk.message.response_metadata = {
|
|
383
|
+
...chunk.generationInfo,
|
|
384
|
+
...chunk.message.response_metadata
|
|
385
|
+
};
|
|
386
|
+
const index = typeof chunk.generationInfo?.completion === "number" ? chunk.generationInfo.completion : 0;
|
|
387
|
+
const existingChunk = finalChunks.get(index);
|
|
388
|
+
if (existingChunk == null) finalChunks.set(index, chunk);
|
|
389
|
+
else finalChunks.set(index, existingChunk.concat(chunk));
|
|
390
|
+
}
|
|
391
|
+
const generations = Array.from(finalChunks.entries()).sort(([aKey], [bKey]) => aKey - bKey).map(([, value]) => value);
|
|
392
|
+
const { functions, function_call } = this.invocationParams(options);
|
|
393
|
+
const promptTokenUsage = await this._getEstimatedTokenCountFromPrompt(messages, functions, function_call);
|
|
394
|
+
const completionTokenUsage = await this._getNumTokensFromGenerations(generations);
|
|
395
|
+
usageMetadata.input_tokens = promptTokenUsage;
|
|
396
|
+
usageMetadata.output_tokens = completionTokenUsage;
|
|
397
|
+
usageMetadata.total_tokens = promptTokenUsage + completionTokenUsage;
|
|
398
|
+
return {
|
|
399
|
+
generations,
|
|
400
|
+
llmOutput: { estimatedTokenUsage: {
|
|
401
|
+
promptTokens: usageMetadata.input_tokens,
|
|
402
|
+
completionTokens: usageMetadata.output_tokens,
|
|
403
|
+
totalTokens: usageMetadata.total_tokens
|
|
404
|
+
} }
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
const data = await this.completionWithRetry({
|
|
408
|
+
...params,
|
|
409
|
+
stream: false,
|
|
410
|
+
messages: messagesMapped
|
|
411
|
+
}, {
|
|
412
|
+
signal: options.signal,
|
|
413
|
+
...options.options
|
|
414
|
+
});
|
|
415
|
+
const { completion_tokens: completionTokens, prompt_tokens: promptTokens, total_tokens: totalTokens, prompt_tokens_details: promptTokensDetails, completion_tokens_details: completionTokensDetails } = data.usage ?? {};
|
|
416
|
+
if (completionTokens != null) usageMetadata.output_tokens = (usageMetadata.output_tokens ?? 0) + completionTokens;
|
|
417
|
+
if (promptTokens != null) usageMetadata.input_tokens = (usageMetadata.input_tokens ?? 0) + promptTokens;
|
|
418
|
+
if (totalTokens != null) usageMetadata.total_tokens = (usageMetadata.total_tokens ?? 0) + totalTokens;
|
|
419
|
+
const promptTokensDetailsWithCacheWrite = promptTokensDetails;
|
|
420
|
+
if (promptTokensDetailsWithCacheWrite?.audio_tokens != null || promptTokensDetailsWithCacheWrite?.cached_tokens != null || promptTokensDetailsWithCacheWrite?.cache_write_tokens != null) usageMetadata.input_token_details = {
|
|
421
|
+
...promptTokensDetailsWithCacheWrite.audio_tokens != null && { audio: promptTokensDetailsWithCacheWrite.audio_tokens },
|
|
422
|
+
...promptTokensDetailsWithCacheWrite.cached_tokens != null && { cache_read: promptTokensDetailsWithCacheWrite.cached_tokens },
|
|
423
|
+
...promptTokensDetailsWithCacheWrite.cache_write_tokens != null && { cache_creation: promptTokensDetailsWithCacheWrite.cache_write_tokens }
|
|
424
|
+
};
|
|
425
|
+
if (completionTokensDetails?.audio_tokens != null || completionTokensDetails?.reasoning_tokens != null) usageMetadata.output_token_details = {
|
|
426
|
+
...completionTokensDetails.audio_tokens != null && { audio: completionTokensDetails.audio_tokens },
|
|
427
|
+
...completionTokensDetails.reasoning_tokens != null && { reasoning: completionTokensDetails.reasoning_tokens }
|
|
428
|
+
};
|
|
429
|
+
const generations = [];
|
|
430
|
+
for (const part of data.choices) {
|
|
431
|
+
const generation = {
|
|
432
|
+
text: part.message.content ?? "",
|
|
433
|
+
message: this._convertCompletionsMessageToBaseMessage(part.message, data)
|
|
434
|
+
};
|
|
435
|
+
generation.generationInfo = {
|
|
436
|
+
finish_reason: part.finish_reason,
|
|
437
|
+
...part.logprobs ? { logprobs: part.logprobs } : {}
|
|
438
|
+
};
|
|
439
|
+
if (isAIMessage(generation.message)) generation.message.usage_metadata = usageMetadata;
|
|
440
|
+
generation.message = new AIMessage(Object.fromEntries(Object.entries(generation.message).filter(([key]) => !key.startsWith("lc_"))));
|
|
441
|
+
generations.push(generation);
|
|
442
|
+
}
|
|
443
|
+
return {
|
|
444
|
+
generations,
|
|
445
|
+
llmOutput: { tokenUsage: {
|
|
446
|
+
promptTokens: usageMetadata.input_tokens,
|
|
447
|
+
completionTokens: usageMetadata.output_tokens,
|
|
448
|
+
totalTokens: usageMetadata.total_tokens
|
|
449
|
+
} }
|
|
450
|
+
};
|
|
451
|
+
}
|
|
452
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
453
|
+
if (this.includeReasoningContent !== true && this.includeReasoningDetails !== true) {
|
|
454
|
+
yield* super._streamResponseChunks(messages, options, runManager);
|
|
455
|
+
return;
|
|
456
|
+
}
|
|
457
|
+
const messagesMapped = _convertMessagesToOpenAIParams(messages, this.model, {
|
|
458
|
+
includeReasoningContent: this.includeReasoningContent,
|
|
459
|
+
includeReasoningDetails: this.includeReasoningDetails,
|
|
460
|
+
convertReasoningDetailsToContent: this.convertReasoningDetailsToContent
|
|
461
|
+
});
|
|
462
|
+
const params = {
|
|
463
|
+
...this.invocationParams(options, { streaming: true }),
|
|
464
|
+
messages: messagesMapped,
|
|
465
|
+
stream: true
|
|
466
|
+
};
|
|
467
|
+
let defaultRole;
|
|
468
|
+
const streamIterable = await this.completionWithRetry(params, options);
|
|
469
|
+
let usage;
|
|
470
|
+
for await (const data of streamIterable) {
|
|
471
|
+
if (options.signal?.aborted === true) return;
|
|
472
|
+
const choice = data.choices?.[0];
|
|
473
|
+
if (data.usage != null) usage = data.usage;
|
|
474
|
+
if (choice == null) continue;
|
|
475
|
+
const { delta } = choice;
|
|
476
|
+
if (delta == null) continue;
|
|
477
|
+
const chunk = this._convertCompletionsDeltaToBaseMessageChunk(delta, data, defaultRole);
|
|
478
|
+
defaultRole = delta.role ?? defaultRole;
|
|
479
|
+
const newTokenIndices = {
|
|
480
|
+
prompt: options.promptIndex ?? 0,
|
|
481
|
+
completion: choice.index
|
|
482
|
+
};
|
|
483
|
+
if (typeof chunk.content !== "string") {
|
|
484
|
+
console.log("[WARNING]: Received non-string content from OpenAI. This is currently not supported.");
|
|
485
|
+
continue;
|
|
486
|
+
}
|
|
487
|
+
const generationInfo = { ...newTokenIndices };
|
|
488
|
+
if (choice.finish_reason != null) {
|
|
489
|
+
generationInfo.finish_reason = choice.finish_reason;
|
|
490
|
+
generationInfo.system_fingerprint = data.system_fingerprint;
|
|
491
|
+
generationInfo.model_name = data.model;
|
|
492
|
+
generationInfo.service_tier = data.service_tier;
|
|
493
|
+
}
|
|
494
|
+
if (this.logprobs === true) generationInfo.logprobs = choice.logprobs;
|
|
495
|
+
const generationChunk = new ChatGenerationChunk({
|
|
496
|
+
message: chunk,
|
|
497
|
+
text: chunk.content,
|
|
498
|
+
generationInfo
|
|
499
|
+
});
|
|
500
|
+
yield generationChunk;
|
|
501
|
+
await runManager?.handleLLMNewToken(generationChunk.text, newTokenIndices, void 0, void 0, void 0, { chunk: generationChunk });
|
|
502
|
+
}
|
|
503
|
+
if (usage) {
|
|
504
|
+
const promptTokenDetails = usage.prompt_tokens_details;
|
|
505
|
+
const inputTokenDetails = {
|
|
506
|
+
...promptTokenDetails?.audio_tokens != null && { audio: promptTokenDetails.audio_tokens },
|
|
507
|
+
...promptTokenDetails?.cached_tokens != null && { cache_read: promptTokenDetails.cached_tokens },
|
|
508
|
+
...promptTokenDetails?.cache_write_tokens != null && { cache_creation: promptTokenDetails.cache_write_tokens }
|
|
509
|
+
};
|
|
510
|
+
const outputTokenDetails = {
|
|
511
|
+
...usage.completion_tokens_details?.audio_tokens != null && { audio: usage.completion_tokens_details.audio_tokens },
|
|
512
|
+
...usage.completion_tokens_details?.reasoning_tokens != null && { reasoning: usage.completion_tokens_details.reasoning_tokens }
|
|
513
|
+
};
|
|
514
|
+
const generationChunk = new ChatGenerationChunk({
|
|
515
|
+
message: new AIMessageChunk({
|
|
516
|
+
content: "",
|
|
517
|
+
response_metadata: { usage: { ...usage } },
|
|
518
|
+
usage_metadata: {
|
|
519
|
+
input_tokens: usage.prompt_tokens,
|
|
520
|
+
output_tokens: usage.completion_tokens,
|
|
521
|
+
total_tokens: usage.total_tokens,
|
|
522
|
+
...Object.keys(inputTokenDetails).length > 0 && { input_token_details: inputTokenDetails },
|
|
523
|
+
...Object.keys(outputTokenDetails).length > 0 && { output_token_details: outputTokenDetails }
|
|
524
|
+
}
|
|
525
|
+
}),
|
|
526
|
+
text: ""
|
|
527
|
+
});
|
|
528
|
+
yield generationChunk;
|
|
529
|
+
await runManager?.handleLLMNewToken(generationChunk.text, {
|
|
530
|
+
prompt: 0,
|
|
531
|
+
completion: 0
|
|
532
|
+
}, void 0, void 0, void 0, { chunk: generationChunk });
|
|
533
|
+
}
|
|
534
|
+
if (options.signal?.aborted === true) throw new Error("AbortError");
|
|
535
|
+
}
|
|
536
|
+
};
|
|
537
|
+
var LibreChatOpenAIResponses = class extends ChatOpenAIResponses {
|
|
538
|
+
_getReasoningParams(options) {
|
|
539
|
+
return getReasoningParams(this.reasoning, options);
|
|
540
|
+
}
|
|
541
|
+
_getClientOptions(options) {
|
|
542
|
+
return getCustomOpenAIClientOptions(this, options);
|
|
543
|
+
}
|
|
544
|
+
};
|
|
545
|
+
var LibreChatAzureOpenAICompletions = class extends AzureChatOpenAICompletions {
|
|
546
|
+
_getReasoningParams(options) {
|
|
547
|
+
return getGatedReasoningParams(this.model, this.reasoning, options);
|
|
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
|
+
}
|
|
557
|
+
_getClientOptions(options) {
|
|
558
|
+
if (!this.client) {
|
|
559
|
+
const openAIEndpointConfig = {
|
|
560
|
+
azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
|
|
561
|
+
azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
|
|
562
|
+
azureOpenAIApiKey: this.azureOpenAIApiKey,
|
|
563
|
+
azureOpenAIBasePath: this.azureOpenAIBasePath,
|
|
564
|
+
azureADTokenProvider: this.azureADTokenProvider,
|
|
565
|
+
baseURL: this.clientConfig.baseURL
|
|
566
|
+
};
|
|
567
|
+
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
568
|
+
const params = {
|
|
569
|
+
...this.clientConfig,
|
|
570
|
+
baseURL: endpoint,
|
|
571
|
+
timeout: this.timeout,
|
|
572
|
+
maxRetries: 0
|
|
573
|
+
};
|
|
574
|
+
if (!this.azureADTokenProvider) params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
|
|
575
|
+
if (params.baseURL == null) delete params.baseURL;
|
|
576
|
+
const defaultHeaders = normalizeHeaders(params.defaultHeaders);
|
|
577
|
+
params.defaultHeaders = {
|
|
578
|
+
...params.defaultHeaders,
|
|
579
|
+
"User-Agent": defaultHeaders["User-Agent"] != null ? `${defaultHeaders["User-Agent"]}: librechat-azure-openai-v2` : "librechat-azure-openai-v2"
|
|
580
|
+
};
|
|
581
|
+
this.client = new CustomAzureOpenAIClient({
|
|
582
|
+
apiVersion: this.azureOpenAIApiVersion,
|
|
583
|
+
azureADTokenProvider: this.azureADTokenProvider,
|
|
584
|
+
...params
|
|
585
|
+
});
|
|
586
|
+
}
|
|
587
|
+
const requestOptions = {
|
|
588
|
+
...this.clientConfig,
|
|
589
|
+
...options
|
|
590
|
+
};
|
|
591
|
+
if (this.azureOpenAIApiKey != null) {
|
|
592
|
+
requestOptions.headers = {
|
|
593
|
+
"api-key": this.azureOpenAIApiKey,
|
|
594
|
+
...requestOptions.headers
|
|
595
|
+
};
|
|
596
|
+
requestOptions.query = {
|
|
597
|
+
"api-version": this.azureOpenAIApiVersion,
|
|
598
|
+
...requestOptions.query
|
|
599
|
+
};
|
|
600
|
+
}
|
|
601
|
+
return requestOptions;
|
|
602
|
+
}
|
|
603
|
+
async completionWithRetry(request, requestOptions) {
|
|
604
|
+
return completionWithFilteredOpenAIStream(request, requestOptions, super.completionWithRetry.bind(this));
|
|
605
|
+
}
|
|
606
|
+
};
|
|
607
|
+
var LibreChatAzureOpenAIResponses = class extends AzureChatOpenAIResponses {
|
|
608
|
+
_getReasoningParams(options) {
|
|
609
|
+
return getGatedReasoningParams(this.model, this.reasoning, options);
|
|
610
|
+
}
|
|
611
|
+
_getClientOptions(options) {
|
|
612
|
+
if (!this.client) {
|
|
613
|
+
const openAIEndpointConfig = {
|
|
614
|
+
azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
|
|
615
|
+
azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
|
|
616
|
+
azureOpenAIApiKey: this.azureOpenAIApiKey,
|
|
617
|
+
azureOpenAIBasePath: this.azureOpenAIBasePath,
|
|
618
|
+
azureADTokenProvider: this.azureADTokenProvider,
|
|
619
|
+
baseURL: this.clientConfig.baseURL
|
|
620
|
+
};
|
|
621
|
+
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
622
|
+
const params = {
|
|
623
|
+
...this.clientConfig,
|
|
624
|
+
baseURL: endpoint,
|
|
625
|
+
timeout: this.timeout,
|
|
626
|
+
maxRetries: 0
|
|
627
|
+
};
|
|
628
|
+
if (!this.azureADTokenProvider) params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
|
|
629
|
+
if (params.baseURL == null) delete params.baseURL;
|
|
630
|
+
const defaultHeaders = normalizeHeaders(params.defaultHeaders);
|
|
631
|
+
params.defaultHeaders = {
|
|
632
|
+
...params.defaultHeaders,
|
|
633
|
+
"User-Agent": defaultHeaders["User-Agent"] != null ? `${defaultHeaders["User-Agent"]}: librechat-azure-openai-v2` : "librechat-azure-openai-v2"
|
|
634
|
+
};
|
|
635
|
+
this.client = new CustomAzureOpenAIClient({
|
|
636
|
+
apiVersion: this.azureOpenAIApiVersion,
|
|
637
|
+
azureADTokenProvider: this.azureADTokenProvider,
|
|
638
|
+
...params
|
|
639
|
+
});
|
|
640
|
+
}
|
|
641
|
+
const requestOptions = {
|
|
642
|
+
...this.clientConfig,
|
|
643
|
+
...options
|
|
644
|
+
};
|
|
645
|
+
if (this.azureOpenAIApiKey != null) {
|
|
646
|
+
requestOptions.headers = {
|
|
647
|
+
"api-key": this.azureOpenAIApiKey,
|
|
648
|
+
...requestOptions.headers
|
|
649
|
+
};
|
|
650
|
+
requestOptions.query = {
|
|
651
|
+
"api-version": this.azureOpenAIApiVersion,
|
|
652
|
+
...requestOptions.query
|
|
653
|
+
};
|
|
654
|
+
}
|
|
655
|
+
return requestOptions;
|
|
656
|
+
}
|
|
657
|
+
};
|
|
815
658
|
function withLibreChatOpenAIFields(fields) {
|
|
816
|
-
|
|
817
|
-
|
|
818
|
-
|
|
819
|
-
|
|
820
|
-
|
|
821
|
-
|
|
822
|
-
}
|
|
823
|
-
class ChatOpenAI extends ChatOpenAI$1 {
|
|
824
|
-
_lc_stream_delay;
|
|
825
|
-
constructor(fields) {
|
|
826
|
-
super(withLibreChatOpenAIFields(fields));
|
|
827
|
-
this._lc_stream_delay = fields?._lc_stream_delay;
|
|
828
|
-
}
|
|
829
|
-
get exposedClient() {
|
|
830
|
-
return getExposedOpenAIClient(this.completions, this.responses, this._useResponsesApi(undefined));
|
|
831
|
-
}
|
|
832
|
-
static lc_name() {
|
|
833
|
-
return 'LibreChatOpenAI';
|
|
834
|
-
}
|
|
835
|
-
_getClientOptions(options) {
|
|
836
|
-
if (!this.client) {
|
|
837
|
-
const openAIEndpointConfig = {
|
|
838
|
-
baseURL: this.clientConfig.baseURL,
|
|
839
|
-
};
|
|
840
|
-
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
841
|
-
const params = {
|
|
842
|
-
...this.clientConfig,
|
|
843
|
-
baseURL: endpoint,
|
|
844
|
-
timeout: this.timeout,
|
|
845
|
-
maxRetries: 0,
|
|
846
|
-
};
|
|
847
|
-
if (params.baseURL == null) {
|
|
848
|
-
delete params.baseURL;
|
|
849
|
-
}
|
|
850
|
-
this.client = new CustomOpenAIClient(params);
|
|
851
|
-
}
|
|
852
|
-
const requestOptions = {
|
|
853
|
-
...this.clientConfig,
|
|
854
|
-
...options,
|
|
855
|
-
};
|
|
856
|
-
return requestOptions;
|
|
857
|
-
}
|
|
858
|
-
/**
|
|
859
|
-
* Returns backwards compatible reasoning parameters from constructor params and call options
|
|
860
|
-
* @internal
|
|
861
|
-
*/
|
|
862
|
-
getReasoningParams(options) {
|
|
863
|
-
return getReasoningParams(this.reasoning, options);
|
|
864
|
-
}
|
|
865
|
-
_getReasoningParams(options) {
|
|
866
|
-
return this.getReasoningParams(options);
|
|
867
|
-
}
|
|
868
|
-
async *_streamResponseChunks(messages, options, runManager) {
|
|
869
|
-
yield* delayStreamChunks(super._streamResponseChunks(messages, options, undefined), this._lc_stream_delay, options.signal, runManager);
|
|
870
|
-
}
|
|
871
|
-
}
|
|
872
|
-
class AzureChatOpenAI extends AzureChatOpenAI$1 {
|
|
873
|
-
_lc_stream_delay;
|
|
874
|
-
constructor(fields) {
|
|
875
|
-
super(fields);
|
|
876
|
-
this.completions = new LibreChatAzureOpenAICompletions(fields);
|
|
877
|
-
this.responses = new LibreChatAzureOpenAIResponses(fields);
|
|
878
|
-
this._lc_stream_delay = fields?._lc_stream_delay;
|
|
879
|
-
}
|
|
880
|
-
get exposedClient() {
|
|
881
|
-
return getExposedOpenAIClient(this.completions, this.responses, this._useResponsesApi(undefined));
|
|
882
|
-
}
|
|
883
|
-
static lc_name() {
|
|
884
|
-
return 'LibreChatAzureOpenAI';
|
|
885
|
-
}
|
|
886
|
-
/**
|
|
887
|
-
* Returns backwards compatible reasoning parameters from constructor params and call options
|
|
888
|
-
* @internal
|
|
889
|
-
*/
|
|
890
|
-
getReasoningParams(options) {
|
|
891
|
-
return getGatedReasoningParams(this.model, this.reasoning, options);
|
|
892
|
-
}
|
|
893
|
-
_getReasoningParams(options) {
|
|
894
|
-
return this.getReasoningParams(options);
|
|
895
|
-
}
|
|
896
|
-
_getClientOptions(options) {
|
|
897
|
-
if (!this.client) {
|
|
898
|
-
const openAIEndpointConfig = {
|
|
899
|
-
azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
|
|
900
|
-
azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
|
|
901
|
-
azureOpenAIApiKey: this.azureOpenAIApiKey,
|
|
902
|
-
azureOpenAIBasePath: this.azureOpenAIBasePath,
|
|
903
|
-
azureADTokenProvider: this.azureADTokenProvider,
|
|
904
|
-
baseURL: this.clientConfig.baseURL,
|
|
905
|
-
};
|
|
906
|
-
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
907
|
-
const params = {
|
|
908
|
-
...this.clientConfig,
|
|
909
|
-
baseURL: endpoint,
|
|
910
|
-
timeout: this.timeout,
|
|
911
|
-
maxRetries: 0,
|
|
912
|
-
};
|
|
913
|
-
if (!this.azureADTokenProvider) {
|
|
914
|
-
params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
|
|
915
|
-
}
|
|
916
|
-
if (params.baseURL == null) {
|
|
917
|
-
delete params.baseURL;
|
|
918
|
-
}
|
|
919
|
-
const defaultHeaders = normalizeHeaders(params.defaultHeaders);
|
|
920
|
-
params.defaultHeaders = {
|
|
921
|
-
...params.defaultHeaders,
|
|
922
|
-
'User-Agent': defaultHeaders['User-Agent'] != null
|
|
923
|
-
? `${defaultHeaders['User-Agent']}: librechat-azure-openai-v2`
|
|
924
|
-
: 'librechat-azure-openai-v2',
|
|
925
|
-
};
|
|
926
|
-
this.client = new CustomAzureOpenAIClient({
|
|
927
|
-
apiVersion: this.azureOpenAIApiVersion,
|
|
928
|
-
azureADTokenProvider: this.azureADTokenProvider,
|
|
929
|
-
...params,
|
|
930
|
-
});
|
|
931
|
-
}
|
|
932
|
-
const requestOptions = {
|
|
933
|
-
...this.clientConfig,
|
|
934
|
-
...options,
|
|
935
|
-
};
|
|
936
|
-
if (this.azureOpenAIApiKey != null) {
|
|
937
|
-
requestOptions.headers = {
|
|
938
|
-
'api-key': this.azureOpenAIApiKey,
|
|
939
|
-
...requestOptions.headers,
|
|
940
|
-
};
|
|
941
|
-
requestOptions.query = {
|
|
942
|
-
'api-version': this.azureOpenAIApiVersion,
|
|
943
|
-
...requestOptions.query,
|
|
944
|
-
};
|
|
945
|
-
}
|
|
946
|
-
return requestOptions;
|
|
947
|
-
}
|
|
948
|
-
async *_streamResponseChunks(messages, options, runManager) {
|
|
949
|
-
yield* delayStreamChunks(super._streamResponseChunks(messages, options, undefined), this._lc_stream_delay, options.signal, runManager);
|
|
950
|
-
}
|
|
951
|
-
}
|
|
952
|
-
class ChatDeepSeek extends ChatDeepSeek$1 {
|
|
953
|
-
_lc_stream_delay;
|
|
954
|
-
constructor(fields) {
|
|
955
|
-
super(fields);
|
|
956
|
-
this._lc_stream_delay = fields?._lc_stream_delay;
|
|
957
|
-
}
|
|
958
|
-
get exposedClient() {
|
|
959
|
-
return this.client;
|
|
960
|
-
}
|
|
961
|
-
static lc_name() {
|
|
962
|
-
return 'LibreChatDeepSeek';
|
|
963
|
-
}
|
|
964
|
-
_convertDeepSeekMessages(messages) {
|
|
965
|
-
return _convertMessagesToOpenAIParams(messages, this.model, {
|
|
966
|
-
includeReasoningContent: true,
|
|
967
|
-
});
|
|
968
|
-
}
|
|
969
|
-
async _generate(messages, options, runManager) {
|
|
970
|
-
options.signal?.throwIfAborted();
|
|
971
|
-
const params = this.invocationParams(options);
|
|
972
|
-
if (params.stream === true) {
|
|
973
|
-
return super._generate(messages, options, runManager);
|
|
974
|
-
}
|
|
975
|
-
const messagesMapped = this._convertDeepSeekMessages(messages);
|
|
976
|
-
const response = await this.completionWithRetry({
|
|
977
|
-
...params,
|
|
978
|
-
stream: false,
|
|
979
|
-
messages: messagesMapped,
|
|
980
|
-
}, {
|
|
981
|
-
signal: options.signal,
|
|
982
|
-
...options.options,
|
|
983
|
-
});
|
|
984
|
-
const usageMetadata = createUsageMetadata(response.usage);
|
|
985
|
-
const generations = response.choices.map((part) => {
|
|
986
|
-
const text = part.message.content ?? '';
|
|
987
|
-
const generation = {
|
|
988
|
-
text,
|
|
989
|
-
message: this._convertCompletionsMessageToBaseMessage(part.message, response),
|
|
990
|
-
};
|
|
991
|
-
generation.generationInfo = {
|
|
992
|
-
finish_reason: part.finish_reason,
|
|
993
|
-
...(part.logprobs != null ? { logprobs: part.logprobs } : {}),
|
|
994
|
-
};
|
|
995
|
-
if (isAIMessage(generation.message)) {
|
|
996
|
-
generation.message.usage_metadata = usageMetadata;
|
|
997
|
-
}
|
|
998
|
-
generation.message = new AIMessage(Object.fromEntries(Object.entries(generation.message).filter(([key]) => !key.startsWith('lc_'))));
|
|
999
|
-
return generation;
|
|
1000
|
-
});
|
|
1001
|
-
return {
|
|
1002
|
-
generations,
|
|
1003
|
-
llmOutput: {
|
|
1004
|
-
tokenUsage: {
|
|
1005
|
-
promptTokens: usageMetadata.input_tokens,
|
|
1006
|
-
completionTokens: usageMetadata.output_tokens,
|
|
1007
|
-
totalTokens: usageMetadata.total_tokens,
|
|
1008
|
-
},
|
|
1009
|
-
},
|
|
1010
|
-
};
|
|
1011
|
-
}
|
|
1012
|
-
_getClientOptions(options) {
|
|
1013
|
-
if (!this.client) {
|
|
1014
|
-
const openAIEndpointConfig = {
|
|
1015
|
-
baseURL: this.clientConfig.baseURL,
|
|
1016
|
-
};
|
|
1017
|
-
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
1018
|
-
const params = {
|
|
1019
|
-
...this.clientConfig,
|
|
1020
|
-
baseURL: endpoint,
|
|
1021
|
-
timeout: this.timeout,
|
|
1022
|
-
maxRetries: 0,
|
|
1023
|
-
};
|
|
1024
|
-
if (params.baseURL == null) {
|
|
1025
|
-
delete params.baseURL;
|
|
1026
|
-
}
|
|
1027
|
-
this.client = new CustomOpenAIClient(params);
|
|
1028
|
-
}
|
|
1029
|
-
const requestOptions = {
|
|
1030
|
-
...this.clientConfig,
|
|
1031
|
-
...options,
|
|
1032
|
-
};
|
|
1033
|
-
return requestOptions;
|
|
1034
|
-
}
|
|
1035
|
-
async *_streamResponseChunks(messages, options, runManager) {
|
|
1036
|
-
yield* delayStreamChunks(this._streamResponseChunksWithReasoning(messages, options, undefined), this._lc_stream_delay, options.signal, runManager);
|
|
1037
|
-
}
|
|
1038
|
-
/** Parses raw `<think>` fallback tags across chunks and emits sanitized DeepSeek stream chunks. */
|
|
1039
|
-
async *_streamResponseChunksWithReasoning(messages, options, runManager) {
|
|
1040
|
-
const stream = this._streamResponseChunksFromReasoningMessages(messages, options);
|
|
1041
|
-
const thinkStartTag = '<think>';
|
|
1042
|
-
const thinkEndTag = '</think>';
|
|
1043
|
-
let tokensBuffer = '';
|
|
1044
|
-
let isThinking = false;
|
|
1045
|
-
for await (const chunk of stream) {
|
|
1046
|
-
if (options.signal?.aborted === true) {
|
|
1047
|
-
throw new Error('AbortError');
|
|
1048
|
-
}
|
|
1049
|
-
const reasoningContent = chunk.message.additional_kwargs.reasoning_content;
|
|
1050
|
-
if (reasoningContent != null && reasoningContent !== '') {
|
|
1051
|
-
yield* this._yieldDeepSeekStreamChunk(chunk, runManager);
|
|
1052
|
-
continue;
|
|
1053
|
-
}
|
|
1054
|
-
const text = chunk.text;
|
|
1055
|
-
if (text === '') {
|
|
1056
|
-
yield* this._yieldDeepSeekStreamChunk(chunk, runManager);
|
|
1057
|
-
continue;
|
|
1058
|
-
}
|
|
1059
|
-
tokensBuffer += text;
|
|
1060
|
-
while (tokensBuffer !== '') {
|
|
1061
|
-
if (isThinking) {
|
|
1062
|
-
const thinkEndIndex = tokensBuffer.indexOf(thinkEndTag);
|
|
1063
|
-
if (thinkEndIndex !== -1) {
|
|
1064
|
-
const thoughtContent = tokensBuffer.substring(0, thinkEndIndex);
|
|
1065
|
-
if (thoughtContent !== '') {
|
|
1066
|
-
yield* this._yieldDeepSeekReasoningText(chunk, thoughtContent, runManager);
|
|
1067
|
-
}
|
|
1068
|
-
tokensBuffer = tokensBuffer.substring(thinkEndIndex + thinkEndTag.length);
|
|
1069
|
-
isThinking = false;
|
|
1070
|
-
continue;
|
|
1071
|
-
}
|
|
1072
|
-
const splitIndex = this._getDeepSeekPartialTagSplitIndex(tokensBuffer, thinkEndTag);
|
|
1073
|
-
if (splitIndex !== -1) {
|
|
1074
|
-
const safeToYield = tokensBuffer.substring(0, splitIndex);
|
|
1075
|
-
if (safeToYield !== '') {
|
|
1076
|
-
yield* this._yieldDeepSeekReasoningText(chunk, safeToYield, runManager);
|
|
1077
|
-
}
|
|
1078
|
-
tokensBuffer = tokensBuffer.substring(splitIndex);
|
|
1079
|
-
break;
|
|
1080
|
-
}
|
|
1081
|
-
yield* this._yieldDeepSeekReasoningText(chunk, tokensBuffer, runManager);
|
|
1082
|
-
tokensBuffer = '';
|
|
1083
|
-
break;
|
|
1084
|
-
}
|
|
1085
|
-
const thinkStartIndex = tokensBuffer.indexOf(thinkStartTag);
|
|
1086
|
-
if (thinkStartIndex !== -1) {
|
|
1087
|
-
const beforeThink = tokensBuffer.substring(0, thinkStartIndex);
|
|
1088
|
-
if (beforeThink !== '') {
|
|
1089
|
-
yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, beforeThink), runManager);
|
|
1090
|
-
}
|
|
1091
|
-
tokensBuffer = tokensBuffer.substring(thinkStartIndex + thinkStartTag.length);
|
|
1092
|
-
isThinking = true;
|
|
1093
|
-
continue;
|
|
1094
|
-
}
|
|
1095
|
-
const splitIndex = this._getDeepSeekPartialTagSplitIndex(tokensBuffer, thinkStartTag);
|
|
1096
|
-
if (splitIndex !== -1) {
|
|
1097
|
-
const safeToYield = tokensBuffer.substring(0, splitIndex);
|
|
1098
|
-
if (safeToYield !== '') {
|
|
1099
|
-
yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, safeToYield), runManager);
|
|
1100
|
-
}
|
|
1101
|
-
tokensBuffer = tokensBuffer.substring(splitIndex);
|
|
1102
|
-
break;
|
|
1103
|
-
}
|
|
1104
|
-
yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, tokensBuffer), runManager);
|
|
1105
|
-
tokensBuffer = '';
|
|
1106
|
-
break;
|
|
1107
|
-
}
|
|
1108
|
-
}
|
|
1109
|
-
if (tokensBuffer === '') {
|
|
1110
|
-
return;
|
|
1111
|
-
}
|
|
1112
|
-
if (isThinking) {
|
|
1113
|
-
yield* this._yieldDeepSeekStreamChunk(new ChatGenerationChunk({
|
|
1114
|
-
message: new AIMessageChunk({
|
|
1115
|
-
content: '',
|
|
1116
|
-
additional_kwargs: {
|
|
1117
|
-
reasoning_content: tokensBuffer,
|
|
1118
|
-
},
|
|
1119
|
-
}),
|
|
1120
|
-
text: '',
|
|
1121
|
-
}), runManager);
|
|
1122
|
-
return;
|
|
1123
|
-
}
|
|
1124
|
-
yield* this._yieldDeepSeekStreamChunk(new ChatGenerationChunk({
|
|
1125
|
-
message: new AIMessageChunk({
|
|
1126
|
-
content: tokensBuffer,
|
|
1127
|
-
}),
|
|
1128
|
-
text: tokensBuffer,
|
|
1129
|
-
}), runManager);
|
|
1130
|
-
}
|
|
1131
|
-
async *_streamResponseChunksFromReasoningMessages(messages, options) {
|
|
1132
|
-
const params = {
|
|
1133
|
-
...this.invocationParams(options, { streaming: true }),
|
|
1134
|
-
stream: true,
|
|
1135
|
-
};
|
|
1136
|
-
const messagesMapped = this._convertDeepSeekMessages(messages);
|
|
1137
|
-
const streamIterable = await this.completionWithRetry({
|
|
1138
|
-
...params,
|
|
1139
|
-
messages: messagesMapped,
|
|
1140
|
-
}, {
|
|
1141
|
-
signal: options.signal,
|
|
1142
|
-
...options.options,
|
|
1143
|
-
});
|
|
1144
|
-
let defaultRole;
|
|
1145
|
-
let usage;
|
|
1146
|
-
for await (const data of streamIterable) {
|
|
1147
|
-
if (options.signal?.aborted === true) {
|
|
1148
|
-
throw new Error('AbortError');
|
|
1149
|
-
}
|
|
1150
|
-
if (data.usage != null) {
|
|
1151
|
-
usage = data.usage;
|
|
1152
|
-
}
|
|
1153
|
-
if (data.choices.length === 0) {
|
|
1154
|
-
continue;
|
|
1155
|
-
}
|
|
1156
|
-
const choice = data.choices[0];
|
|
1157
|
-
const { delta } = choice;
|
|
1158
|
-
const messageChunk = this._convertCompletionsDeltaToBaseMessageChunk(delta, data, defaultRole);
|
|
1159
|
-
defaultRole = delta.role ?? defaultRole;
|
|
1160
|
-
if (typeof messageChunk.content !== 'string') {
|
|
1161
|
-
continue;
|
|
1162
|
-
}
|
|
1163
|
-
const messageText = messageChunk.content;
|
|
1164
|
-
const newTokenIndices = {
|
|
1165
|
-
prompt: options.promptIndex ?? 0,
|
|
1166
|
-
completion: choice.index,
|
|
1167
|
-
};
|
|
1168
|
-
const generationInfo = { ...newTokenIndices };
|
|
1169
|
-
if (choice.finish_reason != null) {
|
|
1170
|
-
Object.assign(generationInfo, {
|
|
1171
|
-
finish_reason: choice.finish_reason,
|
|
1172
|
-
system_fingerprint: data.system_fingerprint,
|
|
1173
|
-
model_name: data.model,
|
|
1174
|
-
service_tier: data.service_tier,
|
|
1175
|
-
});
|
|
1176
|
-
}
|
|
1177
|
-
if (this.logprobs === true) {
|
|
1178
|
-
Object.assign(generationInfo, { logprobs: choice.logprobs });
|
|
1179
|
-
}
|
|
1180
|
-
const generationChunk = new ChatGenerationChunk({
|
|
1181
|
-
message: messageChunk,
|
|
1182
|
-
text: messageText,
|
|
1183
|
-
generationInfo,
|
|
1184
|
-
});
|
|
1185
|
-
yield generationChunk;
|
|
1186
|
-
}
|
|
1187
|
-
if (usage != null) {
|
|
1188
|
-
const usageMetadata = createUsageMetadata(usage);
|
|
1189
|
-
const generationChunk = new ChatGenerationChunk({
|
|
1190
|
-
message: new AIMessageChunk({
|
|
1191
|
-
content: '',
|
|
1192
|
-
response_metadata: {
|
|
1193
|
-
usage: { ...usage },
|
|
1194
|
-
},
|
|
1195
|
-
usage_metadata: usageMetadata,
|
|
1196
|
-
}),
|
|
1197
|
-
text: '',
|
|
1198
|
-
generationInfo: {
|
|
1199
|
-
prompt: 0,
|
|
1200
|
-
completion: 0,
|
|
1201
|
-
},
|
|
1202
|
-
});
|
|
1203
|
-
yield generationChunk;
|
|
1204
|
-
}
|
|
1205
|
-
if (options.signal?.aborted === true) {
|
|
1206
|
-
throw new Error('AbortError');
|
|
1207
|
-
}
|
|
1208
|
-
}
|
|
1209
|
-
_createDeepSeekStreamChunk(chunk, content, additionalKwargs, text = content) {
|
|
1210
|
-
if (!(chunk.message instanceof AIMessageChunk)) {
|
|
1211
|
-
return new ChatGenerationChunk({
|
|
1212
|
-
message: new AIMessageChunk({
|
|
1213
|
-
content,
|
|
1214
|
-
additional_kwargs: additionalKwargs ?? chunk.message.additional_kwargs,
|
|
1215
|
-
response_metadata: chunk.message.response_metadata,
|
|
1216
|
-
id: chunk.message.id,
|
|
1217
|
-
}),
|
|
1218
|
-
text,
|
|
1219
|
-
generationInfo: chunk.generationInfo,
|
|
1220
|
-
});
|
|
1221
|
-
}
|
|
1222
|
-
const message = chunk.message;
|
|
1223
|
-
return new ChatGenerationChunk({
|
|
1224
|
-
message: new AIMessageChunk({
|
|
1225
|
-
content,
|
|
1226
|
-
additional_kwargs: additionalKwargs ?? message.additional_kwargs,
|
|
1227
|
-
response_metadata: message.response_metadata,
|
|
1228
|
-
tool_calls: message.tool_calls,
|
|
1229
|
-
tool_call_chunks: message.tool_call_chunks,
|
|
1230
|
-
id: message.id,
|
|
1231
|
-
}),
|
|
1232
|
-
text,
|
|
1233
|
-
generationInfo: chunk.generationInfo,
|
|
1234
|
-
});
|
|
1235
|
-
}
|
|
1236
|
-
_createDeepSeekReasoningStreamChunk(chunk, reasoningContent) {
|
|
1237
|
-
return this._createDeepSeekStreamChunk(chunk, '', {
|
|
1238
|
-
...chunk.message.additional_kwargs,
|
|
1239
|
-
reasoning_content: reasoningContent,
|
|
1240
|
-
}, '');
|
|
1241
|
-
}
|
|
1242
|
-
async *_yieldDeepSeekReasoningText(chunk, reasoningContent, runManager) {
|
|
1243
|
-
yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekReasoningStreamChunk(chunk, reasoningContent), runManager);
|
|
1244
|
-
}
|
|
1245
|
-
async *_yieldDeepSeekStreamChunk(chunk, runManager) {
|
|
1246
|
-
yield chunk;
|
|
1247
|
-
await runManager?.handleLLMNewToken(chunk.text, this._getDeepSeekTokenIndices(chunk), undefined, undefined, undefined, { chunk });
|
|
1248
|
-
}
|
|
1249
|
-
_getDeepSeekTokenIndices(chunk) {
|
|
1250
|
-
return getStreamChunkTokenIndices(chunk);
|
|
1251
|
-
}
|
|
1252
|
-
_getDeepSeekPartialTagSplitIndex(text, tag) {
|
|
1253
|
-
for (let i = tag.length - 1; i >= 1; i--) {
|
|
1254
|
-
if (text.endsWith(tag.substring(0, i))) {
|
|
1255
|
-
return text.length - i;
|
|
1256
|
-
}
|
|
1257
|
-
}
|
|
1258
|
-
return -1;
|
|
1259
|
-
}
|
|
1260
|
-
}
|
|
1261
|
-
class ChatMoonshot extends ChatOpenAI {
|
|
1262
|
-
constructor(fields) {
|
|
1263
|
-
super({
|
|
1264
|
-
...fields,
|
|
1265
|
-
includeReasoningContent: true,
|
|
1266
|
-
});
|
|
1267
|
-
}
|
|
1268
|
-
static lc_name() {
|
|
1269
|
-
return 'LibreChatMoonshot';
|
|
1270
|
-
}
|
|
1271
|
-
}
|
|
1272
|
-
class ChatXAI extends ChatXAI$1 {
|
|
1273
|
-
_lc_stream_delay;
|
|
1274
|
-
constructor(fields) {
|
|
1275
|
-
super(fields);
|
|
1276
|
-
this._lc_stream_delay = fields?._lc_stream_delay;
|
|
1277
|
-
const customBaseURL = fields?.configuration?.baseURL ?? fields?.clientConfig?.baseURL;
|
|
1278
|
-
if (customBaseURL != null && customBaseURL) {
|
|
1279
|
-
this.clientConfig = {
|
|
1280
|
-
...this.clientConfig,
|
|
1281
|
-
baseURL: customBaseURL,
|
|
1282
|
-
};
|
|
1283
|
-
// Reset the client to force recreation with new config
|
|
1284
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
1285
|
-
this.client = undefined;
|
|
1286
|
-
}
|
|
1287
|
-
}
|
|
1288
|
-
static lc_name() {
|
|
1289
|
-
return 'LibreChatXAI';
|
|
1290
|
-
}
|
|
1291
|
-
get exposedClient() {
|
|
1292
|
-
return this.client;
|
|
1293
|
-
}
|
|
1294
|
-
_getClientOptions(options) {
|
|
1295
|
-
if (!this.client) {
|
|
1296
|
-
const openAIEndpointConfig = {
|
|
1297
|
-
baseURL: this.clientConfig.baseURL,
|
|
1298
|
-
};
|
|
1299
|
-
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
1300
|
-
const params = {
|
|
1301
|
-
...this.clientConfig,
|
|
1302
|
-
baseURL: endpoint,
|
|
1303
|
-
timeout: this.timeout,
|
|
1304
|
-
maxRetries: 0,
|
|
1305
|
-
};
|
|
1306
|
-
if (params.baseURL == null) {
|
|
1307
|
-
delete params.baseURL;
|
|
1308
|
-
}
|
|
1309
|
-
this.client = new CustomOpenAIClient(params);
|
|
1310
|
-
}
|
|
1311
|
-
const requestOptions = {
|
|
1312
|
-
...this.clientConfig,
|
|
1313
|
-
...options,
|
|
1314
|
-
};
|
|
1315
|
-
return requestOptions;
|
|
1316
|
-
}
|
|
1317
|
-
async *_streamResponseChunks(messages, options, runManager) {
|
|
1318
|
-
yield* delayStreamChunks(super._streamResponseChunks(messages, options, undefined), this._lc_stream_delay, options.signal, runManager);
|
|
1319
|
-
}
|
|
659
|
+
const nextFields = fields ?? {};
|
|
660
|
+
return {
|
|
661
|
+
...nextFields,
|
|
662
|
+
completions: nextFields.completions ?? new LibreChatOpenAICompletions(nextFields),
|
|
663
|
+
responses: nextFields.responses ?? new LibreChatOpenAIResponses(nextFields)
|
|
664
|
+
};
|
|
1320
665
|
}
|
|
666
|
+
var ChatOpenAI$1 = class extends ChatOpenAI {
|
|
667
|
+
_lc_stream_delay;
|
|
668
|
+
constructor(fields) {
|
|
669
|
+
super(withLibreChatOpenAIFields(fields));
|
|
670
|
+
this._lc_stream_delay = fields?._lc_stream_delay;
|
|
671
|
+
}
|
|
672
|
+
get exposedClient() {
|
|
673
|
+
return getExposedOpenAIClient(this.completions, this.responses, this._useResponsesApi(void 0));
|
|
674
|
+
}
|
|
675
|
+
static lc_name() {
|
|
676
|
+
return "LibreChatOpenAI";
|
|
677
|
+
}
|
|
678
|
+
_getClientOptions(options) {
|
|
679
|
+
if (!this.client) {
|
|
680
|
+
const endpoint = getEndpoint({ baseURL: this.clientConfig.baseURL });
|
|
681
|
+
const params = {
|
|
682
|
+
...this.clientConfig,
|
|
683
|
+
baseURL: endpoint,
|
|
684
|
+
timeout: this.timeout,
|
|
685
|
+
maxRetries: 0
|
|
686
|
+
};
|
|
687
|
+
if (params.baseURL == null) delete params.baseURL;
|
|
688
|
+
this.client = new CustomOpenAIClient(params);
|
|
689
|
+
}
|
|
690
|
+
return {
|
|
691
|
+
...this.clientConfig,
|
|
692
|
+
...options
|
|
693
|
+
};
|
|
694
|
+
}
|
|
695
|
+
/**
|
|
696
|
+
* Returns backwards compatible reasoning parameters from constructor params and call options
|
|
697
|
+
* @internal
|
|
698
|
+
*/
|
|
699
|
+
getReasoningParams(options) {
|
|
700
|
+
return getReasoningParams(this.reasoning, options);
|
|
701
|
+
}
|
|
702
|
+
_getReasoningParams(options) {
|
|
703
|
+
return this.getReasoningParams(options);
|
|
704
|
+
}
|
|
705
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
706
|
+
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
707
|
+
}
|
|
708
|
+
};
|
|
709
|
+
var AzureChatOpenAI$1 = class extends AzureChatOpenAI {
|
|
710
|
+
_lc_stream_delay;
|
|
711
|
+
constructor(fields) {
|
|
712
|
+
super(fields);
|
|
713
|
+
this.completions = new LibreChatAzureOpenAICompletions(fields);
|
|
714
|
+
this.responses = new LibreChatAzureOpenAIResponses(fields);
|
|
715
|
+
this._lc_stream_delay = fields?._lc_stream_delay;
|
|
716
|
+
}
|
|
717
|
+
get exposedClient() {
|
|
718
|
+
return getExposedOpenAIClient(this.completions, this.responses, this._useResponsesApi(void 0));
|
|
719
|
+
}
|
|
720
|
+
static lc_name() {
|
|
721
|
+
return "LibreChatAzureOpenAI";
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* Returns backwards compatible reasoning parameters from constructor params and call options
|
|
725
|
+
* @internal
|
|
726
|
+
*/
|
|
727
|
+
getReasoningParams(options) {
|
|
728
|
+
return getGatedReasoningParams(this.model, this.reasoning, options);
|
|
729
|
+
}
|
|
730
|
+
_getReasoningParams(options) {
|
|
731
|
+
return this.getReasoningParams(options);
|
|
732
|
+
}
|
|
733
|
+
_getClientOptions(options) {
|
|
734
|
+
if (!this.client) {
|
|
735
|
+
const openAIEndpointConfig = {
|
|
736
|
+
azureOpenAIApiDeploymentName: this.azureOpenAIApiDeploymentName,
|
|
737
|
+
azureOpenAIApiInstanceName: this.azureOpenAIApiInstanceName,
|
|
738
|
+
azureOpenAIApiKey: this.azureOpenAIApiKey,
|
|
739
|
+
azureOpenAIBasePath: this.azureOpenAIBasePath,
|
|
740
|
+
azureADTokenProvider: this.azureADTokenProvider,
|
|
741
|
+
baseURL: this.clientConfig.baseURL
|
|
742
|
+
};
|
|
743
|
+
const endpoint = getEndpoint(openAIEndpointConfig);
|
|
744
|
+
const params = {
|
|
745
|
+
...this.clientConfig,
|
|
746
|
+
baseURL: endpoint,
|
|
747
|
+
timeout: this.timeout,
|
|
748
|
+
maxRetries: 0
|
|
749
|
+
};
|
|
750
|
+
if (!this.azureADTokenProvider) params.apiKey = openAIEndpointConfig.azureOpenAIApiKey;
|
|
751
|
+
if (params.baseURL == null) delete params.baseURL;
|
|
752
|
+
const defaultHeaders = normalizeHeaders(params.defaultHeaders);
|
|
753
|
+
params.defaultHeaders = {
|
|
754
|
+
...params.defaultHeaders,
|
|
755
|
+
"User-Agent": defaultHeaders["User-Agent"] != null ? `${defaultHeaders["User-Agent"]}: librechat-azure-openai-v2` : "librechat-azure-openai-v2"
|
|
756
|
+
};
|
|
757
|
+
this.client = new CustomAzureOpenAIClient({
|
|
758
|
+
apiVersion: this.azureOpenAIApiVersion,
|
|
759
|
+
azureADTokenProvider: this.azureADTokenProvider,
|
|
760
|
+
...params
|
|
761
|
+
});
|
|
762
|
+
}
|
|
763
|
+
const requestOptions = {
|
|
764
|
+
...this.clientConfig,
|
|
765
|
+
...options
|
|
766
|
+
};
|
|
767
|
+
if (this.azureOpenAIApiKey != null) {
|
|
768
|
+
requestOptions.headers = {
|
|
769
|
+
"api-key": this.azureOpenAIApiKey,
|
|
770
|
+
...requestOptions.headers
|
|
771
|
+
};
|
|
772
|
+
requestOptions.query = {
|
|
773
|
+
"api-version": this.azureOpenAIApiVersion,
|
|
774
|
+
...requestOptions.query
|
|
775
|
+
};
|
|
776
|
+
}
|
|
777
|
+
return requestOptions;
|
|
778
|
+
}
|
|
779
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
780
|
+
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
781
|
+
}
|
|
782
|
+
};
|
|
783
|
+
var ChatDeepSeek$1 = class extends ChatDeepSeek {
|
|
784
|
+
_lc_stream_delay;
|
|
785
|
+
constructor(fields) {
|
|
786
|
+
super(fields);
|
|
787
|
+
this._lc_stream_delay = fields?._lc_stream_delay;
|
|
788
|
+
}
|
|
789
|
+
get exposedClient() {
|
|
790
|
+
return this.client;
|
|
791
|
+
}
|
|
792
|
+
static lc_name() {
|
|
793
|
+
return "LibreChatDeepSeek";
|
|
794
|
+
}
|
|
795
|
+
_convertDeepSeekMessages(messages) {
|
|
796
|
+
return _convertMessagesToOpenAIParams(messages, this.model, { includeReasoningContent: true });
|
|
797
|
+
}
|
|
798
|
+
async _generate(messages, options, runManager) {
|
|
799
|
+
options.signal?.throwIfAborted();
|
|
800
|
+
const params = this.invocationParams(options);
|
|
801
|
+
if (params.stream === true) return super._generate(messages, options, runManager);
|
|
802
|
+
const messagesMapped = this._convertDeepSeekMessages(messages);
|
|
803
|
+
const response = await this.completionWithRetry({
|
|
804
|
+
...params,
|
|
805
|
+
stream: false,
|
|
806
|
+
messages: messagesMapped
|
|
807
|
+
}, {
|
|
808
|
+
signal: options.signal,
|
|
809
|
+
...options.options
|
|
810
|
+
});
|
|
811
|
+
const usageMetadata = createUsageMetadata(response.usage);
|
|
812
|
+
return {
|
|
813
|
+
generations: response.choices.map((part) => {
|
|
814
|
+
const generation = {
|
|
815
|
+
text: part.message.content ?? "",
|
|
816
|
+
message: this._convertCompletionsMessageToBaseMessage(part.message, response)
|
|
817
|
+
};
|
|
818
|
+
generation.generationInfo = {
|
|
819
|
+
finish_reason: part.finish_reason,
|
|
820
|
+
...part.logprobs != null ? { logprobs: part.logprobs } : {}
|
|
821
|
+
};
|
|
822
|
+
if (isAIMessage(generation.message)) generation.message.usage_metadata = usageMetadata;
|
|
823
|
+
generation.message = new AIMessage(Object.fromEntries(Object.entries(generation.message).filter(([key]) => !key.startsWith("lc_"))));
|
|
824
|
+
return generation;
|
|
825
|
+
}),
|
|
826
|
+
llmOutput: { tokenUsage: {
|
|
827
|
+
promptTokens: usageMetadata.input_tokens,
|
|
828
|
+
completionTokens: usageMetadata.output_tokens,
|
|
829
|
+
totalTokens: usageMetadata.total_tokens
|
|
830
|
+
} }
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
_getClientOptions(options) {
|
|
834
|
+
if (!this.client) {
|
|
835
|
+
const endpoint = getEndpoint({ baseURL: this.clientConfig.baseURL });
|
|
836
|
+
const params = {
|
|
837
|
+
...this.clientConfig,
|
|
838
|
+
baseURL: endpoint,
|
|
839
|
+
timeout: this.timeout,
|
|
840
|
+
maxRetries: 0
|
|
841
|
+
};
|
|
842
|
+
if (params.baseURL == null) delete params.baseURL;
|
|
843
|
+
this.client = new CustomOpenAIClient(params);
|
|
844
|
+
}
|
|
845
|
+
return {
|
|
846
|
+
...this.clientConfig,
|
|
847
|
+
...options
|
|
848
|
+
};
|
|
849
|
+
}
|
|
850
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
851
|
+
yield* delayStreamChunks(this._streamResponseChunksWithReasoning(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
852
|
+
}
|
|
853
|
+
/** Parses raw `<think>` fallback tags across chunks and emits sanitized DeepSeek stream chunks. */
|
|
854
|
+
async *_streamResponseChunksWithReasoning(messages, options, runManager) {
|
|
855
|
+
const stream = this._streamResponseChunksFromReasoningMessages(messages, options);
|
|
856
|
+
const thinkStartTag = "<think>";
|
|
857
|
+
const thinkEndTag = "</think>";
|
|
858
|
+
let tokensBuffer = "";
|
|
859
|
+
let isThinking = false;
|
|
860
|
+
for await (const chunk of stream) {
|
|
861
|
+
if (options.signal?.aborted === true) throw new Error("AbortError");
|
|
862
|
+
const reasoningContent = chunk.message.additional_kwargs.reasoning_content;
|
|
863
|
+
if (reasoningContent != null && reasoningContent !== "") {
|
|
864
|
+
yield* this._yieldDeepSeekStreamChunk(chunk, runManager);
|
|
865
|
+
continue;
|
|
866
|
+
}
|
|
867
|
+
const text = chunk.text;
|
|
868
|
+
if (text === "") {
|
|
869
|
+
yield* this._yieldDeepSeekStreamChunk(chunk, runManager);
|
|
870
|
+
continue;
|
|
871
|
+
}
|
|
872
|
+
tokensBuffer += text;
|
|
873
|
+
while (tokensBuffer !== "") {
|
|
874
|
+
if (isThinking) {
|
|
875
|
+
const thinkEndIndex = tokensBuffer.indexOf(thinkEndTag);
|
|
876
|
+
if (thinkEndIndex !== -1) {
|
|
877
|
+
const thoughtContent = tokensBuffer.substring(0, thinkEndIndex);
|
|
878
|
+
if (thoughtContent !== "") yield* this._yieldDeepSeekReasoningText(chunk, thoughtContent, runManager);
|
|
879
|
+
tokensBuffer = tokensBuffer.substring(thinkEndIndex + 8);
|
|
880
|
+
isThinking = false;
|
|
881
|
+
continue;
|
|
882
|
+
}
|
|
883
|
+
const splitIndex = this._getDeepSeekPartialTagSplitIndex(tokensBuffer, thinkEndTag);
|
|
884
|
+
if (splitIndex !== -1) {
|
|
885
|
+
const safeToYield = tokensBuffer.substring(0, splitIndex);
|
|
886
|
+
if (safeToYield !== "") yield* this._yieldDeepSeekReasoningText(chunk, safeToYield, runManager);
|
|
887
|
+
tokensBuffer = tokensBuffer.substring(splitIndex);
|
|
888
|
+
break;
|
|
889
|
+
}
|
|
890
|
+
yield* this._yieldDeepSeekReasoningText(chunk, tokensBuffer, runManager);
|
|
891
|
+
tokensBuffer = "";
|
|
892
|
+
break;
|
|
893
|
+
}
|
|
894
|
+
const thinkStartIndex = tokensBuffer.indexOf(thinkStartTag);
|
|
895
|
+
if (thinkStartIndex !== -1) {
|
|
896
|
+
const beforeThink = tokensBuffer.substring(0, thinkStartIndex);
|
|
897
|
+
if (beforeThink !== "") yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, beforeThink), runManager);
|
|
898
|
+
tokensBuffer = tokensBuffer.substring(thinkStartIndex + 7);
|
|
899
|
+
isThinking = true;
|
|
900
|
+
continue;
|
|
901
|
+
}
|
|
902
|
+
const splitIndex = this._getDeepSeekPartialTagSplitIndex(tokensBuffer, thinkStartTag);
|
|
903
|
+
if (splitIndex !== -1) {
|
|
904
|
+
const safeToYield = tokensBuffer.substring(0, splitIndex);
|
|
905
|
+
if (safeToYield !== "") yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, safeToYield), runManager);
|
|
906
|
+
tokensBuffer = tokensBuffer.substring(splitIndex);
|
|
907
|
+
break;
|
|
908
|
+
}
|
|
909
|
+
yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekStreamChunk(chunk, tokensBuffer), runManager);
|
|
910
|
+
tokensBuffer = "";
|
|
911
|
+
break;
|
|
912
|
+
}
|
|
913
|
+
}
|
|
914
|
+
if (tokensBuffer === "") return;
|
|
915
|
+
if (isThinking) {
|
|
916
|
+
yield* this._yieldDeepSeekStreamChunk(new ChatGenerationChunk({
|
|
917
|
+
message: new AIMessageChunk({
|
|
918
|
+
content: "",
|
|
919
|
+
additional_kwargs: { reasoning_content: tokensBuffer }
|
|
920
|
+
}),
|
|
921
|
+
text: ""
|
|
922
|
+
}), runManager);
|
|
923
|
+
return;
|
|
924
|
+
}
|
|
925
|
+
yield* this._yieldDeepSeekStreamChunk(new ChatGenerationChunk({
|
|
926
|
+
message: new AIMessageChunk({ content: tokensBuffer }),
|
|
927
|
+
text: tokensBuffer
|
|
928
|
+
}), runManager);
|
|
929
|
+
}
|
|
930
|
+
async *_streamResponseChunksFromReasoningMessages(messages, options) {
|
|
931
|
+
const params = {
|
|
932
|
+
...this.invocationParams(options, { streaming: true }),
|
|
933
|
+
stream: true
|
|
934
|
+
};
|
|
935
|
+
const messagesMapped = this._convertDeepSeekMessages(messages);
|
|
936
|
+
const streamIterable = await this.completionWithRetry({
|
|
937
|
+
...params,
|
|
938
|
+
messages: messagesMapped
|
|
939
|
+
}, {
|
|
940
|
+
signal: options.signal,
|
|
941
|
+
...options.options
|
|
942
|
+
});
|
|
943
|
+
let defaultRole;
|
|
944
|
+
let usage;
|
|
945
|
+
for await (const data of streamIterable) {
|
|
946
|
+
if (options.signal?.aborted === true) throw new Error("AbortError");
|
|
947
|
+
if (data.usage != null) usage = data.usage;
|
|
948
|
+
if (data.choices.length === 0) continue;
|
|
949
|
+
const choice = data.choices[0];
|
|
950
|
+
const { delta } = choice;
|
|
951
|
+
const messageChunk = this._convertCompletionsDeltaToBaseMessageChunk(delta, data, defaultRole);
|
|
952
|
+
defaultRole = delta.role ?? defaultRole;
|
|
953
|
+
if (typeof messageChunk.content !== "string") continue;
|
|
954
|
+
const messageText = messageChunk.content;
|
|
955
|
+
const generationInfo = {
|
|
956
|
+
prompt: options.promptIndex ?? 0,
|
|
957
|
+
completion: choice.index
|
|
958
|
+
};
|
|
959
|
+
if (choice.finish_reason != null) Object.assign(generationInfo, {
|
|
960
|
+
finish_reason: choice.finish_reason,
|
|
961
|
+
system_fingerprint: data.system_fingerprint,
|
|
962
|
+
model_name: data.model,
|
|
963
|
+
service_tier: data.service_tier
|
|
964
|
+
});
|
|
965
|
+
if (this.logprobs === true) Object.assign(generationInfo, { logprobs: choice.logprobs });
|
|
966
|
+
yield new ChatGenerationChunk({
|
|
967
|
+
message: messageChunk,
|
|
968
|
+
text: messageText,
|
|
969
|
+
generationInfo
|
|
970
|
+
});
|
|
971
|
+
}
|
|
972
|
+
if (usage != null) {
|
|
973
|
+
const usageMetadata = createUsageMetadata(usage);
|
|
974
|
+
yield new ChatGenerationChunk({
|
|
975
|
+
message: new AIMessageChunk({
|
|
976
|
+
content: "",
|
|
977
|
+
response_metadata: { usage: { ...usage } },
|
|
978
|
+
usage_metadata: usageMetadata
|
|
979
|
+
}),
|
|
980
|
+
text: "",
|
|
981
|
+
generationInfo: {
|
|
982
|
+
prompt: 0,
|
|
983
|
+
completion: 0
|
|
984
|
+
}
|
|
985
|
+
});
|
|
986
|
+
}
|
|
987
|
+
if (options.signal?.aborted === true) throw new Error("AbortError");
|
|
988
|
+
}
|
|
989
|
+
_createDeepSeekStreamChunk(chunk, content, additionalKwargs, text = content) {
|
|
990
|
+
if (!(chunk.message instanceof AIMessageChunk)) return new ChatGenerationChunk({
|
|
991
|
+
message: new AIMessageChunk({
|
|
992
|
+
content,
|
|
993
|
+
additional_kwargs: additionalKwargs ?? chunk.message.additional_kwargs,
|
|
994
|
+
response_metadata: chunk.message.response_metadata,
|
|
995
|
+
id: chunk.message.id
|
|
996
|
+
}),
|
|
997
|
+
text,
|
|
998
|
+
generationInfo: chunk.generationInfo
|
|
999
|
+
});
|
|
1000
|
+
const message = chunk.message;
|
|
1001
|
+
return new ChatGenerationChunk({
|
|
1002
|
+
message: new AIMessageChunk({
|
|
1003
|
+
content,
|
|
1004
|
+
additional_kwargs: additionalKwargs ?? message.additional_kwargs,
|
|
1005
|
+
response_metadata: message.response_metadata,
|
|
1006
|
+
tool_calls: message.tool_calls,
|
|
1007
|
+
tool_call_chunks: message.tool_call_chunks,
|
|
1008
|
+
id: message.id
|
|
1009
|
+
}),
|
|
1010
|
+
text,
|
|
1011
|
+
generationInfo: chunk.generationInfo
|
|
1012
|
+
});
|
|
1013
|
+
}
|
|
1014
|
+
_createDeepSeekReasoningStreamChunk(chunk, reasoningContent) {
|
|
1015
|
+
return this._createDeepSeekStreamChunk(chunk, "", {
|
|
1016
|
+
...chunk.message.additional_kwargs,
|
|
1017
|
+
reasoning_content: reasoningContent
|
|
1018
|
+
}, "");
|
|
1019
|
+
}
|
|
1020
|
+
async *_yieldDeepSeekReasoningText(chunk, reasoningContent, runManager) {
|
|
1021
|
+
yield* this._yieldDeepSeekStreamChunk(this._createDeepSeekReasoningStreamChunk(chunk, reasoningContent), runManager);
|
|
1022
|
+
}
|
|
1023
|
+
async *_yieldDeepSeekStreamChunk(chunk, runManager) {
|
|
1024
|
+
yield chunk;
|
|
1025
|
+
await runManager?.handleLLMNewToken(chunk.text, this._getDeepSeekTokenIndices(chunk), void 0, void 0, void 0, { chunk });
|
|
1026
|
+
}
|
|
1027
|
+
_getDeepSeekTokenIndices(chunk) {
|
|
1028
|
+
return getStreamChunkTokenIndices(chunk);
|
|
1029
|
+
}
|
|
1030
|
+
_getDeepSeekPartialTagSplitIndex(text, tag) {
|
|
1031
|
+
for (let i = tag.length - 1; i >= 1; i--) if (text.endsWith(tag.substring(0, i))) return text.length - i;
|
|
1032
|
+
return -1;
|
|
1033
|
+
}
|
|
1034
|
+
};
|
|
1035
|
+
var ChatMoonshot = class extends ChatOpenAI$1 {
|
|
1036
|
+
constructor(fields) {
|
|
1037
|
+
super({
|
|
1038
|
+
...fields,
|
|
1039
|
+
includeReasoningContent: true
|
|
1040
|
+
});
|
|
1041
|
+
}
|
|
1042
|
+
static lc_name() {
|
|
1043
|
+
return "LibreChatMoonshot";
|
|
1044
|
+
}
|
|
1045
|
+
};
|
|
1046
|
+
var ChatXAI$1 = class extends ChatXAI {
|
|
1047
|
+
_lc_stream_delay;
|
|
1048
|
+
constructor(fields) {
|
|
1049
|
+
super(fields);
|
|
1050
|
+
this._lc_stream_delay = fields?._lc_stream_delay;
|
|
1051
|
+
const customBaseURL = fields?.configuration?.baseURL ?? fields?.clientConfig?.baseURL;
|
|
1052
|
+
if (customBaseURL != null && customBaseURL) {
|
|
1053
|
+
this.clientConfig = {
|
|
1054
|
+
...this.clientConfig,
|
|
1055
|
+
baseURL: customBaseURL
|
|
1056
|
+
};
|
|
1057
|
+
this.client = void 0;
|
|
1058
|
+
}
|
|
1059
|
+
}
|
|
1060
|
+
static lc_name() {
|
|
1061
|
+
return "LibreChatXAI";
|
|
1062
|
+
}
|
|
1063
|
+
get exposedClient() {
|
|
1064
|
+
return this.client;
|
|
1065
|
+
}
|
|
1066
|
+
_getClientOptions(options) {
|
|
1067
|
+
if (!this.client) {
|
|
1068
|
+
const endpoint = getEndpoint({ baseURL: this.clientConfig.baseURL });
|
|
1069
|
+
const params = {
|
|
1070
|
+
...this.clientConfig,
|
|
1071
|
+
baseURL: endpoint,
|
|
1072
|
+
timeout: this.timeout,
|
|
1073
|
+
maxRetries: 0
|
|
1074
|
+
};
|
|
1075
|
+
if (params.baseURL == null) delete params.baseURL;
|
|
1076
|
+
this.client = new CustomOpenAIClient(params);
|
|
1077
|
+
}
|
|
1078
|
+
return {
|
|
1079
|
+
...this.clientConfig,
|
|
1080
|
+
...options
|
|
1081
|
+
};
|
|
1082
|
+
}
|
|
1083
|
+
async *_streamResponseChunks(messages, options, runManager) {
|
|
1084
|
+
yield* delayStreamChunks(super._streamResponseChunks(messages, options, void 0), this._lc_stream_delay, options.signal, runManager);
|
|
1085
|
+
}
|
|
1086
|
+
};
|
|
1087
|
+
//#endregion
|
|
1088
|
+
export { AzureChatOpenAI$1 as AzureChatOpenAI, ChatDeepSeek$1 as ChatDeepSeek, ChatMoonshot, ChatOpenAI$1 as ChatOpenAI, ChatXAI$1 as ChatXAI, CustomOpenAIClient, _convertToOpenAITool, emitStreamChunkCallback };
|
|
1321
1089
|
|
|
1322
|
-
|
|
1323
|
-
//# sourceMappingURL=index.mjs.map
|
|
1090
|
+
//# sourceMappingURL=index.mjs.map
|