@librechat/agents 3.2.32 → 3.2.33
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 +195 -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 +105 -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 +398 -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 +991 -1276
- 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 +427 -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 +856 -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 +2109 -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 +19 -36
- 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 +195 -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 +105 -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 +397 -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 +991 -1271
- 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 +427 -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 +854 -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 +2107 -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 +19 -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/tools/search/tool.d.ts +17 -0
- package/dist/types/tools/search/types.d.ts +4 -0
- package/package.json +4 -10
- 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/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,20 +1,17 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import
|
|
9
|
-
|
|
10
|
-
|
|
1
|
+
import "../common/enum.mjs";
|
|
2
|
+
import "../common/index.mjs";
|
|
3
|
+
import { appendCodeSessionFileSummary } from "./CodeSessionFileSummary.mjs";
|
|
4
|
+
import { CODE_ARTIFACT_PATH_GUIDANCE, appendFailedExecutionFileReminder, appendTmpScratchReminder, buildCodeApiHttpErrorMessage, emptyOutputMessage, getCodeBaseURL, resolveCodeApiAuthHeaders } from "./CodeExecutor.mjs";
|
|
5
|
+
import { clampCodeApiRunTimeoutMs, createCodeApiRunTimeoutSchema, resolveCodeApiRunTimeoutMs } from "./ptcTimeout.mjs";
|
|
6
|
+
import { tool } from "@langchain/core/tools";
|
|
7
|
+
import { config } from "dotenv";
|
|
8
|
+
import fetch from "node-fetch";
|
|
9
|
+
import { HttpsProxyAgent } from "https-proxy-agent";
|
|
10
|
+
//#region src/tools/ProgrammaticToolCalling.ts
|
|
11
11
|
config();
|
|
12
12
|
/** Default max round-trips to prevent infinite loops */
|
|
13
13
|
const DEFAULT_MAX_ROUND_TRIPS = 20;
|
|
14
14
|
const DEFAULT_RUN_TIMEOUT_MS = resolveCodeApiRunTimeoutMs();
|
|
15
|
-
// ============================================================================
|
|
16
|
-
// Description Components (Single Source of Truth)
|
|
17
|
-
// ============================================================================
|
|
18
15
|
const STATELESS_WARNING = `CRITICAL - STATELESS EXECUTION:
|
|
19
16
|
Each call is a fresh Python interpreter. Variables, imports, and data do NOT persist between calls.
|
|
20
17
|
You MUST complete your entire workflow in ONE code block: query → process → output.
|
|
@@ -28,7 +25,7 @@ const CORE_RULES = `Rules:
|
|
|
28
25
|
- Only print() output returns to the model
|
|
29
26
|
- ${CODE_ARTIFACT_PATH_GUIDANCE}
|
|
30
27
|
- timeout caps one sandbox run/replay iteration, not the total multi-round-trip workflow`;
|
|
31
|
-
const ADDITIONAL_RULES =
|
|
28
|
+
const ADDITIONAL_RULES = "- Tool names normalized: hyphens→underscores, keywords get `_tool` suffix";
|
|
32
29
|
const EXAMPLES = `Example (Complete workflow in one call):
|
|
33
30
|
# Query data
|
|
34
31
|
data = await query_database(sql="SELECT * FROM users")
|
|
@@ -42,9 +39,6 @@ const EXAMPLES = `Example (Complete workflow in one call):
|
|
|
42
39
|
Example (Parallel calls):
|
|
43
40
|
sf, ny = await asyncio.gather(get_weather(city="SF"), get_weather(city="NY"))
|
|
44
41
|
print(f"SF: {sf}, NY: {ny}")`;
|
|
45
|
-
// ============================================================================
|
|
46
|
-
// Schema
|
|
47
|
-
// ============================================================================
|
|
48
42
|
const CODE_PARAM_DESCRIPTION = `Python code that calls tools programmatically. Tools are available as async functions.
|
|
49
43
|
|
|
50
44
|
${STATELESS_WARNING}
|
|
@@ -55,21 +49,21 @@ ${EXAMPLES}
|
|
|
55
49
|
|
|
56
50
|
${CORE_RULES}`;
|
|
57
51
|
function createProgrammaticToolCallingSchema(maxRunTimeoutMs = DEFAULT_RUN_TIMEOUT_MS) {
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
52
|
+
return {
|
|
53
|
+
type: "object",
|
|
54
|
+
properties: {
|
|
55
|
+
code: {
|
|
56
|
+
type: "string",
|
|
57
|
+
minLength: 1,
|
|
58
|
+
description: CODE_PARAM_DESCRIPTION
|
|
59
|
+
},
|
|
60
|
+
timeout: createCodeApiRunTimeoutSchema(maxRunTimeoutMs)
|
|
61
|
+
},
|
|
62
|
+
required: ["code"]
|
|
63
|
+
};
|
|
70
64
|
}
|
|
71
65
|
const ProgrammaticToolCallingSchema = createProgrammaticToolCallingSchema();
|
|
72
|
-
const ProgrammaticToolCallingName =
|
|
66
|
+
const ProgrammaticToolCallingName = "run_tools_with_code";
|
|
73
67
|
const ProgrammaticToolCallingDescription = `
|
|
74
68
|
Run tools via Python code. Auto-wrapped in async context—just use \`await\` directly.
|
|
75
69
|
|
|
@@ -83,662 +77,478 @@ When to use: loops, conditionals, parallel (\`asyncio.gather\`), multi-step pipe
|
|
|
83
77
|
${EXAMPLES}
|
|
84
78
|
`.trim();
|
|
85
79
|
const ProgrammaticToolCallingDefinition = {
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
80
|
+
name: ProgrammaticToolCallingName,
|
|
81
|
+
description: ProgrammaticToolCallingDescription,
|
|
82
|
+
schema: ProgrammaticToolCallingSchema
|
|
89
83
|
};
|
|
90
|
-
// ============================================================================
|
|
91
|
-
// Helper Functions
|
|
92
|
-
// ============================================================================
|
|
93
84
|
/** Python reserved keywords that get `_tool` suffix in Code API */
|
|
94
85
|
const PYTHON_KEYWORDS = new Set([
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
86
|
+
"False",
|
|
87
|
+
"None",
|
|
88
|
+
"True",
|
|
89
|
+
"and",
|
|
90
|
+
"as",
|
|
91
|
+
"assert",
|
|
92
|
+
"async",
|
|
93
|
+
"await",
|
|
94
|
+
"break",
|
|
95
|
+
"class",
|
|
96
|
+
"continue",
|
|
97
|
+
"def",
|
|
98
|
+
"del",
|
|
99
|
+
"elif",
|
|
100
|
+
"else",
|
|
101
|
+
"except",
|
|
102
|
+
"finally",
|
|
103
|
+
"for",
|
|
104
|
+
"from",
|
|
105
|
+
"global",
|
|
106
|
+
"if",
|
|
107
|
+
"import",
|
|
108
|
+
"in",
|
|
109
|
+
"is",
|
|
110
|
+
"lambda",
|
|
111
|
+
"nonlocal",
|
|
112
|
+
"not",
|
|
113
|
+
"or",
|
|
114
|
+
"pass",
|
|
115
|
+
"raise",
|
|
116
|
+
"return",
|
|
117
|
+
"try",
|
|
118
|
+
"while",
|
|
119
|
+
"with",
|
|
120
|
+
"yield"
|
|
130
121
|
]);
|
|
131
122
|
function isFetchSessionFilesScope(value) {
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
if ((scope.kind === 'agent' || scope.kind === 'user') &&
|
|
137
|
-
typeof scope.id === 'string') {
|
|
138
|
-
return true;
|
|
139
|
-
}
|
|
140
|
-
return (scope.kind === 'skill' &&
|
|
141
|
-
typeof scope.id === 'string' &&
|
|
142
|
-
typeof scope.version === 'number');
|
|
123
|
+
if (value == null || typeof value !== "object") return false;
|
|
124
|
+
const scope = value;
|
|
125
|
+
if ((scope.kind === "agent" || scope.kind === "user") && typeof scope.id === "string") return true;
|
|
126
|
+
return scope.kind === "skill" && typeof scope.id === "string" && typeof scope.version === "number";
|
|
143
127
|
}
|
|
144
128
|
function isCodeApiAuthHeaders(value) {
|
|
145
|
-
|
|
129
|
+
return value != null && typeof value !== "string";
|
|
146
130
|
}
|
|
147
131
|
function isCodeApiSessionFileWire(value) {
|
|
148
|
-
|
|
132
|
+
return value != null && typeof value === "object";
|
|
149
133
|
}
|
|
150
134
|
function isCodeApiSessionFileMetadata(value) {
|
|
151
|
-
|
|
135
|
+
return value != null && typeof value === "object";
|
|
152
136
|
}
|
|
153
137
|
function normalizeSessionFile(file, sessionId, scope) {
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
name,
|
|
186
|
-
};
|
|
187
|
-
}
|
|
188
|
-
return {
|
|
189
|
-
storage_session_id,
|
|
190
|
-
kind: 'user',
|
|
191
|
-
id,
|
|
192
|
-
resource_id: id,
|
|
193
|
-
name,
|
|
194
|
-
};
|
|
138
|
+
const metadata = isCodeApiSessionFileMetadata(file.metadata) ? file.metadata : void 0;
|
|
139
|
+
const rawName = typeof file.name === "string" ? file.name : "";
|
|
140
|
+
const nameParts = rawName.split("/");
|
|
141
|
+
const fallbackId = nameParts.length > 1 ? nameParts[1].split(".")[0] : "";
|
|
142
|
+
const id = typeof file.id === "string" && file.id !== "" ? file.id : fallbackId;
|
|
143
|
+
const originalFilename = metadata?.["original-filename"];
|
|
144
|
+
const name = typeof originalFilename === "string" ? originalFilename : rawName;
|
|
145
|
+
const storage_session_id = typeof file.storage_session_id === "string" ? file.storage_session_id : sessionId;
|
|
146
|
+
const resource_id = typeof file.resource_id === "string" && file.resource_id !== "" ? file.resource_id : scope?.id ?? id;
|
|
147
|
+
if (scope?.kind === "skill") return {
|
|
148
|
+
storage_session_id,
|
|
149
|
+
kind: "skill",
|
|
150
|
+
id,
|
|
151
|
+
resource_id,
|
|
152
|
+
name,
|
|
153
|
+
version: scope.version
|
|
154
|
+
};
|
|
155
|
+
if (scope != null) return {
|
|
156
|
+
storage_session_id,
|
|
157
|
+
kind: scope.kind,
|
|
158
|
+
id,
|
|
159
|
+
resource_id,
|
|
160
|
+
name
|
|
161
|
+
};
|
|
162
|
+
return {
|
|
163
|
+
storage_session_id,
|
|
164
|
+
kind: "user",
|
|
165
|
+
id,
|
|
166
|
+
resource_id: id,
|
|
167
|
+
name
|
|
168
|
+
};
|
|
195
169
|
}
|
|
196
170
|
/**
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
171
|
+
* Normalizes a tool name to Python identifier format.
|
|
172
|
+
* Must match the Code API's `normalizePythonFunctionName` exactly:
|
|
173
|
+
* 1. Replace hyphens and spaces with underscores
|
|
174
|
+
* 2. Remove any other invalid characters
|
|
175
|
+
* 3. Prefix with underscore if starts with number
|
|
176
|
+
* 4. Append `_tool` if it's a Python keyword
|
|
177
|
+
* @param name - The tool name to normalize
|
|
178
|
+
* @returns Normalized Python-safe identifier
|
|
179
|
+
*/
|
|
206
180
|
function normalizeToPythonIdentifier(name) {
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
if (PYTHON_KEYWORDS.has(normalized)) {
|
|
213
|
-
normalized = normalized + '_tool';
|
|
214
|
-
}
|
|
215
|
-
return normalized;
|
|
181
|
+
let normalized = name.replace(/[-\s]/g, "_");
|
|
182
|
+
normalized = normalized.replace(/[^a-zA-Z0-9_]/g, "");
|
|
183
|
+
if (/^[0-9]/.test(normalized)) normalized = "_" + normalized;
|
|
184
|
+
if (PYTHON_KEYWORDS.has(normalized)) normalized = normalized + "_tool";
|
|
185
|
+
return normalized;
|
|
216
186
|
}
|
|
217
187
|
/**
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
188
|
+
* Extracts tool names that are actually called in the Python code.
|
|
189
|
+
* Handles hyphen/underscore conversion since Python identifiers use underscores.
|
|
190
|
+
* @param code - The Python code to analyze
|
|
191
|
+
* @param toolNameMap - Map from normalized Python name to original tool name
|
|
192
|
+
* @returns Set of original tool names found in the code
|
|
193
|
+
*/
|
|
224
194
|
function extractUsedToolNames(code, toolNameMap) {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
}
|
|
232
|
-
}
|
|
233
|
-
return usedTools;
|
|
195
|
+
const usedTools = /* @__PURE__ */ new Set();
|
|
196
|
+
for (const [pythonName, originalName] of toolNameMap) {
|
|
197
|
+
const escapedName = pythonName.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
198
|
+
if (new RegExp(`\\b${escapedName}\\s*\\(`, "g").test(code)) usedTools.add(originalName);
|
|
199
|
+
}
|
|
200
|
+
return usedTools;
|
|
234
201
|
}
|
|
235
202
|
/**
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
203
|
+
* Filters tool definitions to only include tools actually used in the code.
|
|
204
|
+
* Handles the hyphen-to-underscore conversion for Python compatibility.
|
|
205
|
+
* @param toolDefs - All available tool definitions
|
|
206
|
+
* @param code - The Python code to analyze
|
|
207
|
+
* @param debug - Enable debug logging
|
|
208
|
+
* @returns Filtered array of tool definitions
|
|
209
|
+
*/
|
|
243
210
|
function filterToolsByUsage(toolDefs, code, debug = false) {
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
if (debug) {
|
|
260
|
-
// eslint-disable-next-line no-console
|
|
261
|
-
console.log('[PTC Debug] No tools detected in code - sending all tools as fallback');
|
|
262
|
-
}
|
|
263
|
-
return toolDefs;
|
|
264
|
-
}
|
|
265
|
-
return toolDefs.filter((tool) => usedToolNames.has(tool.name));
|
|
211
|
+
const toolNameMap = /* @__PURE__ */ new Map();
|
|
212
|
+
for (const tool of toolDefs) {
|
|
213
|
+
const pythonName = normalizeToPythonIdentifier(tool.name);
|
|
214
|
+
toolNameMap.set(pythonName, tool.name);
|
|
215
|
+
}
|
|
216
|
+
const usedToolNames = extractUsedToolNames(code, toolNameMap);
|
|
217
|
+
if (debug) {
|
|
218
|
+
console.log(`[PTC Debug] Tool filtering: found ${usedToolNames.size}/${toolDefs.length} tools in code`);
|
|
219
|
+
if (usedToolNames.size > 0) console.log(`[PTC Debug] Matched tools: ${Array.from(usedToolNames).join(", ")}`);
|
|
220
|
+
}
|
|
221
|
+
if (usedToolNames.size === 0) {
|
|
222
|
+
if (debug) console.log("[PTC Debug] No tools detected in code - sending all tools as fallback");
|
|
223
|
+
return toolDefs;
|
|
224
|
+
}
|
|
225
|
+
return toolDefs.filter((tool) => usedToolNames.has(tool.name));
|
|
266
226
|
}
|
|
267
227
|
async function fetchSessionFiles(baseUrl, sessionId, scopeOrProxy, proxyOrAuthHeaders, scopedAuthHeaders) {
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
};
|
|
304
|
-
if (proxy != null && proxy !== '') {
|
|
305
|
-
fetchOptions.agent = new HttpsProxyAgent(proxy);
|
|
306
|
-
}
|
|
307
|
-
const response = await fetch(filesEndpoint, fetchOptions);
|
|
308
|
-
if (!response.ok) {
|
|
309
|
-
throw new Error(await buildCodeApiHttpErrorMessage('GET', filesEndpoint, response));
|
|
310
|
-
}
|
|
311
|
-
const files = await response.json();
|
|
312
|
-
if (!Array.isArray(files) || files.length === 0) {
|
|
313
|
-
return [];
|
|
314
|
-
}
|
|
315
|
-
return files
|
|
316
|
-
.filter(isCodeApiSessionFileWire)
|
|
317
|
-
.map((file) => normalizeSessionFile(file, sessionId, scope));
|
|
318
|
-
}
|
|
319
|
-
catch (error) {
|
|
320
|
-
// eslint-disable-next-line no-console
|
|
321
|
-
console.warn(`Failed to fetch files for session: ${sessionId}, ${error.message}`);
|
|
322
|
-
return [];
|
|
323
|
-
}
|
|
228
|
+
try {
|
|
229
|
+
const scope = isFetchSessionFilesScope(scopeOrProxy) ? scopeOrProxy : void 0;
|
|
230
|
+
let proxy;
|
|
231
|
+
let authHeaders;
|
|
232
|
+
if (scope == null) {
|
|
233
|
+
proxy = typeof scopeOrProxy === "string" ? scopeOrProxy : void 0;
|
|
234
|
+
authHeaders = isCodeApiAuthHeaders(proxyOrAuthHeaders) ? proxyOrAuthHeaders : void 0;
|
|
235
|
+
} else if (typeof proxyOrAuthHeaders === "string") {
|
|
236
|
+
proxy = proxyOrAuthHeaders;
|
|
237
|
+
authHeaders = scopedAuthHeaders;
|
|
238
|
+
} else authHeaders = proxyOrAuthHeaders ?? scopedAuthHeaders;
|
|
239
|
+
const query = new URLSearchParams({ detail: "full" });
|
|
240
|
+
if (scope != null) {
|
|
241
|
+
query.set("kind", scope.kind);
|
|
242
|
+
query.set("id", scope.id);
|
|
243
|
+
if (scope.kind === "skill") query.set("version", String(scope.version));
|
|
244
|
+
}
|
|
245
|
+
const filesEndpoint = `${baseUrl}/files/${encodeURIComponent(sessionId)}?${query.toString()}`;
|
|
246
|
+
const fetchOptions = {
|
|
247
|
+
method: "GET",
|
|
248
|
+
headers: {
|
|
249
|
+
"User-Agent": "LibreChat/1.0",
|
|
250
|
+
...await resolveCodeApiAuthHeaders(authHeaders)
|
|
251
|
+
}
|
|
252
|
+
};
|
|
253
|
+
if (proxy != null && proxy !== "") fetchOptions.agent = new HttpsProxyAgent(proxy);
|
|
254
|
+
const response = await fetch(filesEndpoint, fetchOptions);
|
|
255
|
+
if (!response.ok) throw new Error(await buildCodeApiHttpErrorMessage("GET", filesEndpoint, response));
|
|
256
|
+
const files = await response.json();
|
|
257
|
+
if (!Array.isArray(files) || files.length === 0) return [];
|
|
258
|
+
return files.filter(isCodeApiSessionFileWire).map((file) => normalizeSessionFile(file, sessionId, scope));
|
|
259
|
+
} catch (error) {
|
|
260
|
+
console.warn(`Failed to fetch files for session: ${sessionId}, ${error.message}`);
|
|
261
|
+
return [];
|
|
262
|
+
}
|
|
324
263
|
}
|
|
325
264
|
/**
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
265
|
+
* Makes an HTTP request to the Code API.
|
|
266
|
+
* @param endpoint - The API endpoint URL
|
|
267
|
+
* @param body - The request body
|
|
268
|
+
* @param proxy - Optional HTTP proxy URL
|
|
269
|
+
* @returns The parsed API response
|
|
270
|
+
*/
|
|
332
271
|
async function makeRequest(endpoint, body, proxy, authHeaders) {
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
const response = await fetch(endpoint, fetchOptions);
|
|
347
|
-
if (!response.ok) {
|
|
348
|
-
throw new Error(await buildCodeApiHttpErrorMessage('POST', endpoint, response));
|
|
349
|
-
}
|
|
350
|
-
return (await response.json());
|
|
272
|
+
const fetchOptions = {
|
|
273
|
+
method: "POST",
|
|
274
|
+
headers: {
|
|
275
|
+
"Content-Type": "application/json",
|
|
276
|
+
"User-Agent": "LibreChat/1.0",
|
|
277
|
+
...await resolveCodeApiAuthHeaders(authHeaders)
|
|
278
|
+
},
|
|
279
|
+
body: JSON.stringify(body)
|
|
280
|
+
};
|
|
281
|
+
if (proxy != null && proxy !== "") fetchOptions.agent = new HttpsProxyAgent(proxy);
|
|
282
|
+
const response = await fetch(endpoint, fetchOptions);
|
|
283
|
+
if (!response.ok) throw new Error(await buildCodeApiHttpErrorMessage("POST", endpoint, response));
|
|
284
|
+
return await response.json();
|
|
351
285
|
}
|
|
352
286
|
/**
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
287
|
+
* Unwraps tool responses that may be formatted as tuples or content blocks.
|
|
288
|
+
* MCP tools return [content, artifacts], we need to extract the raw data.
|
|
289
|
+
* @param result - The raw result from tool.invoke()
|
|
290
|
+
* @param isMCPTool - Whether this is an MCP tool (has mcp property)
|
|
291
|
+
* @returns Unwrapped raw data (string, object, or parsed JSON)
|
|
292
|
+
*/
|
|
359
293
|
function unwrapToolResponse(result, isMCPTool) {
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
388
|
-
|
|
389
|
-
|
|
390
|
-
|
|
391
|
-
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
397
|
-
|
|
398
|
-
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
}
|
|
426
|
-
catch {
|
|
427
|
-
return str;
|
|
428
|
-
}
|
|
429
|
-
}
|
|
430
|
-
return str;
|
|
431
|
-
};
|
|
432
|
-
// Handle array of content blocks at top level FIRST
|
|
433
|
-
// (before checking for tuple, since both are arrays)
|
|
434
|
-
if (Array.isArray(result) && isContentBlockArray(result)) {
|
|
435
|
-
const extractedText = extractTextFromContent(result);
|
|
436
|
-
if (extractedText !== null) {
|
|
437
|
-
return maybeParseJSON(extractedText);
|
|
438
|
-
}
|
|
439
|
-
}
|
|
440
|
-
// Check if result is a tuple/array with [content, artifacts]
|
|
441
|
-
if (Array.isArray(result) && result.length >= 1) {
|
|
442
|
-
const [content] = result;
|
|
443
|
-
// If first element is a string, return it (possibly parsed as JSON)
|
|
444
|
-
if (typeof content === 'string') {
|
|
445
|
-
return maybeParseJSON(content);
|
|
446
|
-
}
|
|
447
|
-
// Try to extract text from content blocks
|
|
448
|
-
const extractedText = extractTextFromContent(content);
|
|
449
|
-
if (extractedText !== null) {
|
|
450
|
-
return maybeParseJSON(extractedText);
|
|
451
|
-
}
|
|
452
|
-
// If first element is an object (but not a text block), return it
|
|
453
|
-
if (typeof content === 'object' && content !== null) {
|
|
454
|
-
return content;
|
|
455
|
-
}
|
|
456
|
-
}
|
|
457
|
-
// Handle single content block object at top level (not in tuple)
|
|
458
|
-
const extractedText = extractTextFromContent(result);
|
|
459
|
-
if (extractedText !== null) {
|
|
460
|
-
return maybeParseJSON(extractedText);
|
|
461
|
-
}
|
|
462
|
-
// Not a formatted response, return as-is
|
|
463
|
-
return result;
|
|
294
|
+
if (!isMCPTool) return result;
|
|
295
|
+
/**
|
|
296
|
+
* Checks if a value is a content block object (has type and text).
|
|
297
|
+
*/
|
|
298
|
+
const isContentBlock = (value) => {
|
|
299
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
300
|
+
return typeof value.type === "string";
|
|
301
|
+
};
|
|
302
|
+
/**
|
|
303
|
+
* Checks if an array is an array of content blocks.
|
|
304
|
+
*/
|
|
305
|
+
const isContentBlockArray = (arr) => {
|
|
306
|
+
return arr.length > 0 && arr.every(isContentBlock);
|
|
307
|
+
};
|
|
308
|
+
/**
|
|
309
|
+
* Extracts text from a single content block object.
|
|
310
|
+
* Returns the text if it's a text block, otherwise returns null.
|
|
311
|
+
*/
|
|
312
|
+
const extractTextFromBlock = (block) => {
|
|
313
|
+
if (typeof block !== "object" || block === null) return null;
|
|
314
|
+
const b = block;
|
|
315
|
+
if (b.type === "text" && typeof b.text === "string") return b.text;
|
|
316
|
+
return null;
|
|
317
|
+
};
|
|
318
|
+
/**
|
|
319
|
+
* Extracts text from content blocks (array or single object).
|
|
320
|
+
* Returns combined text or null if no text blocks found.
|
|
321
|
+
*/
|
|
322
|
+
const extractTextFromContent = (content) => {
|
|
323
|
+
if (typeof content === "object" && content !== null && !Array.isArray(content)) {
|
|
324
|
+
const text = extractTextFromBlock(content);
|
|
325
|
+
if (text !== null) return text;
|
|
326
|
+
}
|
|
327
|
+
if (Array.isArray(content) && content.length > 0) {
|
|
328
|
+
const texts = content.map(extractTextFromBlock).filter((t) => t !== null);
|
|
329
|
+
if (texts.length > 0) return texts.join("\n");
|
|
330
|
+
}
|
|
331
|
+
return null;
|
|
332
|
+
};
|
|
333
|
+
/**
|
|
334
|
+
* Tries to parse a string as JSON if it looks like JSON.
|
|
335
|
+
*/
|
|
336
|
+
const maybeParseJSON = (str) => {
|
|
337
|
+
const trimmed = str.trim();
|
|
338
|
+
if (trimmed.startsWith("{") || trimmed.startsWith("[")) try {
|
|
339
|
+
return JSON.parse(trimmed);
|
|
340
|
+
} catch {
|
|
341
|
+
return str;
|
|
342
|
+
}
|
|
343
|
+
return str;
|
|
344
|
+
};
|
|
345
|
+
if (Array.isArray(result) && isContentBlockArray(result)) {
|
|
346
|
+
const extractedText = extractTextFromContent(result);
|
|
347
|
+
if (extractedText !== null) return maybeParseJSON(extractedText);
|
|
348
|
+
}
|
|
349
|
+
if (Array.isArray(result) && result.length >= 1) {
|
|
350
|
+
const [content] = result;
|
|
351
|
+
if (typeof content === "string") return maybeParseJSON(content);
|
|
352
|
+
const extractedText = extractTextFromContent(content);
|
|
353
|
+
if (extractedText !== null) return maybeParseJSON(extractedText);
|
|
354
|
+
if (typeof content === "object" && content !== null) return content;
|
|
355
|
+
}
|
|
356
|
+
const extractedText = extractTextFromContent(result);
|
|
357
|
+
if (extractedText !== null) return maybeParseJSON(extractedText);
|
|
358
|
+
return result;
|
|
464
359
|
}
|
|
465
360
|
function detectSchemaKind(schema) {
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
kind.object ||= innerKind.object;
|
|
498
|
-
kind.string ||= innerKind.string;
|
|
499
|
-
}
|
|
500
|
-
const options = zodDef.options;
|
|
501
|
-
if (Array.isArray(options)) {
|
|
502
|
-
for (const option of options) {
|
|
503
|
-
const optionKind = detectSchemaKind(option);
|
|
504
|
-
kind.object ||= optionKind.object;
|
|
505
|
-
kind.string ||= optionKind.string;
|
|
506
|
-
}
|
|
507
|
-
}
|
|
508
|
-
return kind;
|
|
361
|
+
const kind = {
|
|
362
|
+
object: false,
|
|
363
|
+
string: false
|
|
364
|
+
};
|
|
365
|
+
if (!schema || typeof schema !== "object") return kind;
|
|
366
|
+
const jsonSchemaType = schema.type;
|
|
367
|
+
if (jsonSchemaType === "object") kind.object = true;
|
|
368
|
+
else if (jsonSchemaType === "string") kind.string = true;
|
|
369
|
+
else if (Array.isArray(jsonSchemaType)) {
|
|
370
|
+
kind.object = jsonSchemaType.includes("object");
|
|
371
|
+
kind.string = jsonSchemaType.includes("string");
|
|
372
|
+
}
|
|
373
|
+
const zodDef = schema._def;
|
|
374
|
+
if (!zodDef || typeof zodDef !== "object") return kind;
|
|
375
|
+
const zodType = zodDef.type;
|
|
376
|
+
const zodTypeName = zodDef.typeName;
|
|
377
|
+
if (zodType === "object" || zodTypeName === "ZodObject") kind.object = true;
|
|
378
|
+
else if (zodType === "string" || zodTypeName === "ZodString") kind.string = true;
|
|
379
|
+
const innerSchema = zodDef.innerType ?? zodDef.schema;
|
|
380
|
+
if (innerSchema) {
|
|
381
|
+
const innerKind = detectSchemaKind(innerSchema);
|
|
382
|
+
kind.object ||= innerKind.object;
|
|
383
|
+
kind.string ||= innerKind.string;
|
|
384
|
+
}
|
|
385
|
+
const options = zodDef.options;
|
|
386
|
+
if (Array.isArray(options)) for (const option of options) {
|
|
387
|
+
const optionKind = detectSchemaKind(option);
|
|
388
|
+
kind.object ||= optionKind.object;
|
|
389
|
+
kind.string ||= optionKind.string;
|
|
390
|
+
}
|
|
391
|
+
return kind;
|
|
509
392
|
}
|
|
510
393
|
function getToolInputSchemaKind(tool) {
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
394
|
+
if (tool.constructor.name === "DynamicTool") return {
|
|
395
|
+
object: false,
|
|
396
|
+
string: true
|
|
397
|
+
};
|
|
398
|
+
const schema = tool.schema;
|
|
399
|
+
return detectSchemaKind(schema);
|
|
516
400
|
}
|
|
517
401
|
function normalizeToolInput(input, tool) {
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
return input;
|
|
535
|
-
}
|
|
536
|
-
try {
|
|
537
|
-
const parsed = JSON.parse(trimmed);
|
|
538
|
-
if (typeof parsed === 'object' &&
|
|
539
|
-
parsed !== null &&
|
|
540
|
-
!Array.isArray(parsed)) {
|
|
541
|
-
return parsed;
|
|
542
|
-
}
|
|
543
|
-
}
|
|
544
|
-
catch {
|
|
545
|
-
return input;
|
|
546
|
-
}
|
|
547
|
-
return input;
|
|
402
|
+
const schemaKind = getToolInputSchemaKind(tool);
|
|
403
|
+
if (typeof input !== "string") {
|
|
404
|
+
if (!schemaKind.string || schemaKind.object) return input;
|
|
405
|
+
if (typeof input.input === "string") return input;
|
|
406
|
+
return JSON.stringify(input);
|
|
407
|
+
}
|
|
408
|
+
if (!schemaKind.object || schemaKind.string) return input;
|
|
409
|
+
const trimmed = input.trim();
|
|
410
|
+
if (!trimmed.startsWith("{")) return input;
|
|
411
|
+
try {
|
|
412
|
+
const parsed = JSON.parse(trimmed);
|
|
413
|
+
if (typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)) return parsed;
|
|
414
|
+
} catch {
|
|
415
|
+
return input;
|
|
416
|
+
}
|
|
417
|
+
return input;
|
|
548
418
|
}
|
|
549
419
|
/**
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
async function executeTools(toolCalls, toolMap, programmaticToolName =
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
result: null,
|
|
584
|
-
is_error: true,
|
|
585
|
-
error_message: error.message || 'Tool execution failed',
|
|
586
|
-
};
|
|
587
|
-
}
|
|
588
|
-
});
|
|
589
|
-
return await Promise.all(executions);
|
|
420
|
+
* Executes tools in parallel when requested by the API.
|
|
421
|
+
* Uses Promise.all for parallel execution, catching individual errors.
|
|
422
|
+
* Unwraps formatted responses (e.g., MCP tool tuples) to raw data.
|
|
423
|
+
* @param toolCalls - Array of tool calls from the API
|
|
424
|
+
* @param toolMap - Map of tool names to executable tools
|
|
425
|
+
* @returns Array of tool results
|
|
426
|
+
*/
|
|
427
|
+
async function executeTools(toolCalls, toolMap, programmaticToolName = "run_tools_with_code") {
|
|
428
|
+
const executions = toolCalls.map(async (call) => {
|
|
429
|
+
const tool = toolMap.get(call.name);
|
|
430
|
+
if (!tool) return {
|
|
431
|
+
call_id: call.id,
|
|
432
|
+
result: null,
|
|
433
|
+
is_error: true,
|
|
434
|
+
error_message: `Tool '${call.name}' not found. Available tools: ${Array.from(toolMap.keys()).join(", ")}`
|
|
435
|
+
};
|
|
436
|
+
try {
|
|
437
|
+
const unwrappedResult = unwrapToolResponse(await tool.invoke(normalizeToolInput(call.input, tool), { metadata: { [programmaticToolName]: true } }), tool.mcp === true);
|
|
438
|
+
return {
|
|
439
|
+
call_id: call.id,
|
|
440
|
+
result: unwrappedResult,
|
|
441
|
+
is_error: false
|
|
442
|
+
};
|
|
443
|
+
} catch (error) {
|
|
444
|
+
return {
|
|
445
|
+
call_id: call.id,
|
|
446
|
+
result: null,
|
|
447
|
+
is_error: true,
|
|
448
|
+
error_message: error.message || "Tool execution failed"
|
|
449
|
+
};
|
|
450
|
+
}
|
|
451
|
+
});
|
|
452
|
+
return await Promise.all(executions);
|
|
590
453
|
}
|
|
591
454
|
/**
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
function formatCompletedResponse(response, sourceCode =
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
formatted += `stderr:\n${response.stderr}\n`;
|
|
611
|
-
}
|
|
612
|
-
const outputWithReminder = appendTmpScratchReminder(formatted, sourceCode);
|
|
613
|
-
return [
|
|
614
|
-
appendCodeSessionFileSummary(outputWithReminder, response.files),
|
|
615
|
-
{
|
|
616
|
-
session_id: response.session_id,
|
|
617
|
-
files: response.files,
|
|
618
|
-
},
|
|
619
|
-
];
|
|
455
|
+
* Formats the completed response for the agent.
|
|
456
|
+
*
|
|
457
|
+
* Output includes stdout/stderr plus a compact session-file summary
|
|
458
|
+
* when artifacts were persisted. The artifact still carries every
|
|
459
|
+
* file so the host's session map stays in sync.
|
|
460
|
+
*
|
|
461
|
+
* @param response - The completed API response
|
|
462
|
+
* @returns Tuple of [formatted string, artifact]
|
|
463
|
+
*/
|
|
464
|
+
function formatCompletedResponse(response, sourceCode = "") {
|
|
465
|
+
let formatted = "";
|
|
466
|
+
if (response.stdout != null && response.stdout !== "") formatted += `stdout:\n${response.stdout}\n`;
|
|
467
|
+
else formatted += emptyOutputMessage;
|
|
468
|
+
if (response.stderr != null && response.stderr !== "") formatted += `stderr:\n${response.stderr}\n`;
|
|
469
|
+
return [appendCodeSessionFileSummary(appendTmpScratchReminder(formatted, sourceCode), response.files), {
|
|
470
|
+
session_id: response.session_id,
|
|
471
|
+
files: response.files
|
|
472
|
+
}];
|
|
620
473
|
}
|
|
621
|
-
// ============================================================================
|
|
622
|
-
// Tool Factory
|
|
623
|
-
// ============================================================================
|
|
624
474
|
/**
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
475
|
+
* Creates a Programmatic Tool Calling tool for complex multi-tool workflows.
|
|
476
|
+
*
|
|
477
|
+
* This tool enables AI agents to write Python code that orchestrates multiple
|
|
478
|
+
* tool calls programmatically, reducing LLM round-trips and token usage.
|
|
479
|
+
*
|
|
480
|
+
* The tool map must be provided at runtime via config.configurable.toolMap.
|
|
481
|
+
*
|
|
482
|
+
* @param params - Configuration parameters (baseUrl, maxRoundTrips, proxy)
|
|
483
|
+
* @returns A LangChain DynamicStructuredTool for programmatic tool calling
|
|
484
|
+
*
|
|
485
|
+
* @example
|
|
486
|
+
* const ptcTool = createProgrammaticToolCallingTool({ maxRoundTrips: 20 });
|
|
487
|
+
*
|
|
488
|
+
* const [output, artifact] = await ptcTool.invoke(
|
|
489
|
+
* { code, tools },
|
|
490
|
+
* { configurable: { toolMap } }
|
|
491
|
+
* );
|
|
492
|
+
*/
|
|
643
493
|
function createProgrammaticToolCallingTool(initParams = {}) {
|
|
644
|
-
|
|
645
|
-
|
|
646
|
-
|
|
647
|
-
|
|
648
|
-
|
|
649
|
-
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
656
|
-
|
|
657
|
-
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
661
|
-
|
|
662
|
-
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
683
|
-
|
|
684
|
-
|
|
685
|
-
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
while (response.status === 'tool_call_required') {
|
|
701
|
-
roundTrip++;
|
|
702
|
-
if (roundTrip > maxRoundTrips) {
|
|
703
|
-
throw new Error(`Exceeded maximum round trips (${maxRoundTrips}). ` +
|
|
704
|
-
'This may indicate an infinite loop, excessive tool calls, ' +
|
|
705
|
-
'or a logic error in your code.');
|
|
706
|
-
}
|
|
707
|
-
if (debug) {
|
|
708
|
-
// eslint-disable-next-line no-console
|
|
709
|
-
console.log(`[PTC Debug] Round trip ${roundTrip}: ${response.tool_calls?.length ?? 0} tool(s) to execute`);
|
|
710
|
-
}
|
|
711
|
-
const toolResults = await executeTools(response.tool_calls ?? [], toolMap);
|
|
712
|
-
response = await makeRequest(EXEC_ENDPOINT, {
|
|
713
|
-
continuation_token: response.continuation_token,
|
|
714
|
-
tool_results: toolResults,
|
|
715
|
-
}, proxy, initParams.authHeaders);
|
|
716
|
-
}
|
|
717
|
-
// ====================================================================
|
|
718
|
-
// Phase 3: Handle final state
|
|
719
|
-
// ====================================================================
|
|
720
|
-
if (response.status === 'completed') {
|
|
721
|
-
return formatCompletedResponse(response, code);
|
|
722
|
-
}
|
|
723
|
-
if (response.status === 'error') {
|
|
724
|
-
throw new Error(`Execution error: ${response.error}` +
|
|
725
|
-
(response.stderr != null && response.stderr !== ''
|
|
726
|
-
? `\n\nStderr:\n${response.stderr}`
|
|
727
|
-
: ''));
|
|
728
|
-
}
|
|
729
|
-
throw new Error(`Unexpected response status: ${response.status}`);
|
|
730
|
-
}
|
|
731
|
-
catch (error) {
|
|
732
|
-
const messageWithReminder = appendFailedExecutionFileReminder(error.message, code);
|
|
733
|
-
throw new Error(`Programmatic execution failed: ${messageWithReminder}`);
|
|
734
|
-
}
|
|
735
|
-
}, {
|
|
736
|
-
name: Constants.PROGRAMMATIC_TOOL_CALLING,
|
|
737
|
-
description: ProgrammaticToolCallingDescription,
|
|
738
|
-
schema: createProgrammaticToolCallingSchema(maxRunTimeoutMs),
|
|
739
|
-
responseFormat: Constants.CONTENT_AND_ARTIFACT,
|
|
740
|
-
});
|
|
494
|
+
const baseUrl = initParams.baseUrl ?? getCodeBaseURL();
|
|
495
|
+
const maxRoundTrips = initParams.maxRoundTrips ?? DEFAULT_MAX_ROUND_TRIPS;
|
|
496
|
+
const maxRunTimeoutMs = resolveCodeApiRunTimeoutMs(initParams.runTimeoutMs);
|
|
497
|
+
const proxy = initParams.proxy ?? process.env.PROXY;
|
|
498
|
+
const debug = initParams.debug ?? process.env.PTC_DEBUG === "true";
|
|
499
|
+
const EXEC_ENDPOINT = `${baseUrl}/exec/programmatic`;
|
|
500
|
+
return tool(async (rawParams, config) => {
|
|
501
|
+
const params = rawParams;
|
|
502
|
+
const { code } = params;
|
|
503
|
+
const timeout = clampCodeApiRunTimeoutMs(params.timeout, maxRunTimeoutMs);
|
|
504
|
+
const { toolMap, toolDefs, session_id, _injected_files } = config.toolCall ?? {};
|
|
505
|
+
if (toolMap == null || toolMap.size === 0) throw new Error("No toolMap provided. ToolNode should inject this from AgentContext when invoked through the graph.");
|
|
506
|
+
if (toolDefs == null || toolDefs.length === 0) throw new Error("No tool definitions provided. Either pass tools in the input or ensure ToolNode injects toolDefs.");
|
|
507
|
+
let roundTrip = 0;
|
|
508
|
+
try {
|
|
509
|
+
const effectiveTools = filterToolsByUsage(toolDefs, code, debug);
|
|
510
|
+
if (debug) console.log(`[PTC Debug] Sending ${effectiveTools.length} tools to API (filtered from ${toolDefs.length})`);
|
|
511
|
+
/**
|
|
512
|
+
* File injection: `_injected_files` from ToolNode session
|
|
513
|
+
* context. The legacy `/files/<session_id>` HTTP fallback was
|
|
514
|
+
* removed (see `CodeExecutor.ts`) — codeapi's sessionAuth now
|
|
515
|
+
* requires kind/id query params unavailable at this point.
|
|
516
|
+
*/
|
|
517
|
+
let files;
|
|
518
|
+
if (_injected_files && _injected_files.length > 0) files = _injected_files;
|
|
519
|
+
else if (session_id != null && session_id.length > 0) console.debug(`[ProgrammaticToolCalling] No injected files for session_id=${session_id} — exec will run without input files`);
|
|
520
|
+
let response = await makeRequest(EXEC_ENDPOINT, {
|
|
521
|
+
code,
|
|
522
|
+
tools: effectiveTools,
|
|
523
|
+
session_id,
|
|
524
|
+
timeout,
|
|
525
|
+
...files && files.length > 0 ? { files } : {}
|
|
526
|
+
}, proxy, initParams.authHeaders);
|
|
527
|
+
while (response.status === "tool_call_required") {
|
|
528
|
+
roundTrip++;
|
|
529
|
+
if (roundTrip > maxRoundTrips) throw new Error(`Exceeded maximum round trips (${maxRoundTrips}). This may indicate an infinite loop, excessive tool calls, or a logic error in your code.`);
|
|
530
|
+
if (debug) console.log(`[PTC Debug] Round trip ${roundTrip}: ${response.tool_calls?.length ?? 0} tool(s) to execute`);
|
|
531
|
+
const toolResults = await executeTools(response.tool_calls ?? [], toolMap);
|
|
532
|
+
response = await makeRequest(EXEC_ENDPOINT, {
|
|
533
|
+
continuation_token: response.continuation_token,
|
|
534
|
+
tool_results: toolResults
|
|
535
|
+
}, proxy, initParams.authHeaders);
|
|
536
|
+
}
|
|
537
|
+
if (response.status === "completed") return formatCompletedResponse(response, code);
|
|
538
|
+
if (response.status === "error") throw new Error(`Execution error: ${response.error}` + (response.stderr != null && response.stderr !== "" ? `\n\nStderr:\n${response.stderr}` : ""));
|
|
539
|
+
throw new Error(`Unexpected response status: ${response.status}`);
|
|
540
|
+
} catch (error) {
|
|
541
|
+
const messageWithReminder = appendFailedExecutionFileReminder(error.message, code);
|
|
542
|
+
throw new Error(`Programmatic execution failed: ${messageWithReminder}`);
|
|
543
|
+
}
|
|
544
|
+
}, {
|
|
545
|
+
name: "run_tools_with_code",
|
|
546
|
+
description: ProgrammaticToolCallingDescription,
|
|
547
|
+
schema: createProgrammaticToolCallingSchema(maxRunTimeoutMs),
|
|
548
|
+
responseFormat: "content_and_artifact"
|
|
549
|
+
});
|
|
741
550
|
}
|
|
742
|
-
|
|
551
|
+
//#endregion
|
|
743
552
|
export { ProgrammaticToolCallingDefinition, ProgrammaticToolCallingDescription, ProgrammaticToolCallingName, ProgrammaticToolCallingSchema, createProgrammaticToolCallingSchema, createProgrammaticToolCallingTool, executeTools, extractUsedToolNames, fetchSessionFiles, filterToolsByUsage, formatCompletedResponse, makeRequest, normalizeToPythonIdentifier, unwrapToolResponse };
|
|
744
|
-
|
|
553
|
+
|
|
554
|
+
//# sourceMappingURL=ProgrammaticToolCalling.mjs.map
|