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