@datalayer/agent-runtimes 1.0.2 → 1.0.4
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/README.md +14 -132
- package/lib/Agent.js +2 -2
- package/lib/AgentLexical.d.ts +1 -12
- package/lib/AgentLexical.js +3 -14
- package/lib/AgentNotebook.js +3 -3
- package/lib/App.js +2 -2
- package/lib/{components/chat/components → agents}/AgentDetails.d.ts +13 -2
- package/lib/{components/chat/components → agents}/AgentDetails.js +6 -12
- package/lib/api/agents.d.ts +47 -0
- package/lib/api/agents.js +106 -0
- package/lib/api/context.d.ts +17 -0
- package/lib/api/context.js +45 -0
- package/lib/api/evals.d.ts +27 -0
- package/lib/api/evals.js +63 -0
- package/lib/api/events.d.ts +17 -0
- package/lib/api/events.js +93 -0
- package/lib/{components/chat → api}/handler.js +1 -1
- package/lib/api/index.d.ts +15 -0
- package/lib/api/index.js +20 -0
- package/lib/api/notifications.d.ts +39 -0
- package/lib/api/notifications.js +103 -0
- package/lib/api/output.d.ts +28 -0
- package/lib/api/output.js +64 -0
- package/lib/api/tool-approvals.d.ts +62 -0
- package/lib/api/tool-approvals.js +145 -0
- package/lib/{components/chat/components → chat}/Chat.d.ts +26 -15
- package/lib/{components/chat/components → chat}/Chat.js +16 -16
- package/lib/{components/chat/components → chat}/ChatFloating.d.ts +17 -9
- package/lib/{components/chat/components → chat}/ChatFloating.js +17 -9
- package/lib/{components/chat/components → chat}/ChatInline.d.ts +2 -2
- package/lib/{components/chat/components → chat}/ChatInline.js +8 -6
- package/lib/{components/chat/components → chat}/ChatPopupStandalone.d.ts +3 -4
- package/lib/{components/chat/components → chat}/ChatPopupStandalone.js +6 -6
- package/lib/{components/chat/components → chat}/ChatSidebar.d.ts +14 -5
- package/lib/{components/chat/components → chat}/ChatSidebar.js +48 -26
- package/lib/{components/chat/components → chat}/ChatStandalone.d.ts +3 -4
- package/lib/{components/chat/components → chat}/ChatStandalone.js +5 -5
- package/lib/chat/base/ChatBase.d.ts +6 -0
- package/lib/chat/base/ChatBase.js +1338 -0
- package/lib/chat/display/EmptyState.d.ts +27 -0
- package/lib/chat/display/EmptyState.js +41 -0
- package/lib/{components/chat/components/elements → chat/display}/FloatingBrandButton.d.ts +1 -1
- package/lib/{components/chat/components/elements → chat/display}/FloatingBrandButton.js +1 -1
- package/lib/{components/chat/components/elements → chat/display}/PoweredByTag.d.ts +1 -1
- package/lib/{components/chat/components/elements → chat/header}/ChatHeader.d.ts +1 -4
- package/lib/{components/chat/components/elements → chat/header}/ChatHeader.js +1 -1
- package/lib/chat/header/ChatHeaderBase.d.ts +38 -0
- package/lib/chat/header/ChatHeaderBase.js +83 -0
- package/lib/chat/index.d.ts +66 -0
- package/lib/chat/index.js +74 -0
- package/lib/chat/indicators/McpStatusIndicator.d.ts +9 -0
- package/lib/chat/indicators/McpStatusIndicator.js +128 -0
- package/lib/chat/indicators/SandboxStatusIndicator.d.ts +10 -0
- package/lib/chat/indicators/SandboxStatusIndicator.js +175 -0
- package/lib/chat/indicators/index.d.ts +17 -0
- package/lib/chat/indicators/index.js +19 -0
- package/lib/chat/messages/ChatMessageList.d.ts +49 -0
- package/lib/chat/messages/ChatMessageList.js +332 -0
- package/lib/{components/chat/components/elements → chat/messages}/ChatMessages.d.ts +2 -2
- package/lib/{components/chat/components/elements → chat/messages}/ChatMessages.js +6 -4
- package/lib/{components/chat/components → chat}/parts/DynamicToolPart.d.ts +1 -1
- package/lib/{components/chat/components/elements → chat/parts}/MessagePart.d.ts +1 -1
- package/lib/{components/chat/components/elements → chat/parts}/MessagePart.js +4 -4
- package/lib/{components/chat/components → chat}/parts/ReasoningPart.js +1 -1
- package/lib/{components/chat/components → chat}/parts/TextPart.d.ts +1 -1
- package/lib/{components/chat/components → chat}/parts/ToolPart.js +1 -1
- package/lib/{components/chat/components → chat}/parts/index.d.ts +2 -1
- package/lib/{components/chat/components → chat}/parts/index.js +2 -1
- package/lib/chat/prompt/InputFooter.d.ts +43 -0
- package/lib/chat/prompt/InputFooter.js +135 -0
- package/lib/chat/prompt/InputPrompt.d.ts +60 -0
- package/lib/chat/prompt/InputPrompt.js +83 -0
- package/lib/chat/prompt/InputPromptFooter.d.ts +25 -0
- package/lib/chat/prompt/InputPromptFooter.js +15 -0
- package/lib/chat/prompt/InputPromptHeader.d.ts +15 -0
- package/lib/chat/prompt/InputPromptHeader.js +15 -0
- package/lib/chat/prompt/InputPromptLexical.d.ts +16 -0
- package/lib/chat/prompt/InputPromptLexical.js +122 -0
- package/lib/chat/prompt/InputPromptText.d.ts +24 -0
- package/lib/chat/prompt/InputPromptText.js +66 -0
- package/lib/chat/prompt/index.d.ts +11 -0
- package/lib/chat/prompt/index.js +15 -0
- package/lib/{components/chat/components → chat}/styles/streamdownStyles.d.ts +1 -1
- package/lib/chat/tools/ToolApprovalBanner.d.ts +31 -0
- package/lib/chat/tools/ToolApprovalBanner.js +62 -0
- package/lib/{components/chat/components/elements → chat/tools}/ToolApprovalDialog.js +1 -1
- package/lib/{components/chat/components/display → chat/tools}/ToolCallDisplay.d.ts +13 -4
- package/lib/{components/chat/components/display → chat/tools}/ToolCallDisplay.js +18 -8
- package/lib/chat/tools/index.d.ts +8 -0
- package/lib/{components/chat/components/display → chat/tools}/index.js +3 -1
- package/lib/chat/usage/TokenUsageBar.d.ts +8 -0
- package/lib/chat/usage/TokenUsageBar.js +213 -0
- package/lib/client/AgentsMixin.d.ts +216 -0
- package/lib/client/AgentsMixin.js +388 -0
- package/lib/client/index.d.ts +6 -0
- package/lib/client/index.js +10 -0
- package/lib/components/NotificationEventCard.d.ts +8 -0
- package/lib/components/NotificationEventCard.js +177 -0
- package/lib/components/OutputCard.d.ts +8 -0
- package/lib/components/OutputCard.js +94 -0
- package/lib/components/ToolApprovalCard.d.ts +33 -0
- package/lib/components/ToolApprovalCard.js +78 -0
- package/lib/components/index.d.ts +3 -7
- package/lib/components/index.js +3 -4
- package/lib/{components → config}/AgentConfiguration.d.ts +43 -21
- package/lib/{components → config}/AgentConfiguration.js +48 -28
- package/lib/config/index.d.ts +2 -0
- package/lib/config/index.js +1 -0
- package/lib/{components/chat/components → context}/ContextInspector.js +38 -8
- package/lib/{components/chat/components → context}/ContextPanel.js +27 -6
- package/lib/context/CostTracker.d.ts +37 -0
- package/lib/context/CostTracker.js +124 -0
- package/lib/context/TokenUsageChart.d.ts +10 -0
- package/lib/context/TokenUsageChart.js +288 -0
- package/lib/examples/A2UiComponentGalleryExample.d.ts +20 -0
- package/lib/examples/A2UiComponentGalleryExample.js +568 -0
- package/lib/examples/A2UiContactCardExample.d.ts +21 -0
- package/lib/examples/A2UiContactCardExample.js +432 -0
- package/lib/examples/A2UiRestaurantExample.d.ts +11 -3
- package/lib/examples/A2UiRestaurantExample.js +63 -98
- package/lib/examples/A2UiViewerExample.d.ts +21 -0
- package/lib/examples/A2UiViewerExample.js +563 -0
- package/lib/examples/AgUiAgenticExample.js +3 -3
- package/lib/examples/AgUiBackendToolRenderingExample.js +3 -3
- package/lib/examples/{AgUiHaikuGenUIExample.d.ts → AgUiHaikuGenUiExample.d.ts} +4 -4
- package/lib/examples/{AgUiHaikuGenUIExample.js → AgUiHaikuGenUiExample.js} +7 -7
- package/lib/examples/AgUiHumanInTheLoopExample.js +3 -3
- package/lib/examples/AgUiSharedStateExample.js +3 -3
- package/lib/examples/{AgUiToolsBasedGenUIExample.d.ts → AgUiToolsBasedGenUiExample.d.ts} +4 -4
- package/lib/examples/{AgUiToolsBasedGenUIExample.js → AgUiToolsBasedGenUiExample.js} +7 -7
- package/lib/examples/AgentCheckpointsExample.d.ts +19 -0
- package/lib/examples/AgentCheckpointsExample.js +500 -0
- package/lib/examples/AgentCodemodeExample.d.ts +14 -0
- package/lib/examples/AgentCodemodeExample.js +256 -0
- package/lib/examples/AgentEvalsExample.d.ts +14 -0
- package/lib/examples/AgentEvalsExample.js +210 -0
- package/lib/examples/AgentGuardrailsExample.d.ts +14 -0
- package/lib/examples/AgentGuardrailsExample.js +212 -0
- package/lib/examples/AgentMemoryExample.d.ts +14 -0
- package/lib/examples/AgentMemoryExample.js +228 -0
- package/lib/examples/AgentMonitoringExample.d.ts +13 -0
- package/lib/examples/AgentMonitoringExample.js +305 -0
- package/lib/examples/AgentNotificationsExample.d.ts +14 -0
- package/lib/examples/AgentNotificationsExample.js +267 -0
- package/lib/examples/AgentOtelExample.d.ts +25 -0
- package/lib/examples/AgentOtelExample.js +281 -0
- package/lib/examples/AgentOutputsExample.d.ts +14 -0
- package/lib/examples/AgentOutputsExample.js +205 -0
- package/lib/examples/AgentSandboxExample.d.ts +17 -0
- package/lib/examples/AgentSandboxExample.js +490 -0
- package/lib/examples/AgentSkillsExample.d.ts +3 -0
- package/lib/examples/AgentSkillsExample.js +284 -0
- package/lib/examples/AgentToolApprovalsExample.d.ts +3 -0
- package/lib/examples/AgentToolApprovalsExample.js +737 -0
- package/lib/examples/AgentTriggersExample.d.ts +14 -0
- package/lib/examples/AgentTriggersExample.js +1090 -0
- package/lib/examples/{AgentRuntimeFormExample.d.ts → AgentspecExample.d.ts} +3 -4
- package/lib/examples/{AgentRuntimeFormExample.js → AgentspecExample.js} +92 -34
- package/lib/examples/{JupyterCellExample.js → CellSimpleExample.js} +1 -1
- package/lib/examples/{AgentRuntimeCustomExample.js → ChatCustomExample.js} +3 -3
- package/lib/examples/{AgentRuntimeChatExample.js → ChatExample.js} +6 -14
- package/lib/examples/{AgentRuntimeStandaloneExample.js → ChatStandaloneExample.js} +2 -2
- package/lib/examples/CopilotKitLexicalExample.d.ts +3 -14
- package/lib/examples/CopilotKitLexicalExample.js +4 -15
- package/lib/examples/CopilotKitNotebookExample.js +4 -6
- package/lib/examples/DatalayerNotebookExample.js +2 -2
- package/lib/examples/{AgentRuntimeLexical2Example.d.ts → Lexical2Example.d.ts} +2 -13
- package/lib/examples/{AgentRuntimeLexical2Example.js → Lexical2Example.js} +8 -17
- package/lib/examples/{AgentRuntimeLexicalExample.d.ts → LexicalExample.d.ts} +1 -12
- package/lib/examples/{AgentRuntimeLexicalExample.js → LexicalExample.js} +28 -27
- package/lib/examples/{AgentRuntimeLexicalSidebarExample.d.ts → LexicalSidebarExample.d.ts} +2 -13
- package/lib/examples/{AgentRuntimeLexicalSidebarExample.js → LexicalSidebarExample.js} +6 -18
- package/lib/examples/{AgentRuntimeNotebookExample.js → NotebookExample.js} +14 -10
- package/lib/examples/{AgentRuntimeNotebookSidebarExample.js → NotebookSidebarExample.js} +5 -8
- package/lib/examples/{JupyterNotebookExample.js → NotebookSimpleExample.js} +2 -2
- package/lib/examples/ag-ui/weather/InlineWeatherCard.js +1 -1
- package/lib/examples/components/ErrorView.d.ts +14 -0
- package/lib/examples/components/ErrorView.js +20 -0
- package/lib/examples/components/ExampleWrapper.d.ts +12 -0
- package/lib/examples/components/ExampleWrapper.js +16 -0
- package/lib/examples/components/Header.d.ts +2 -2
- package/lib/examples/components/HeaderControls.js +1 -1
- package/lib/examples/components/LexicalEditor.d.ts +1 -12
- package/lib/examples/components/LexicalEditor.js +1 -12
- package/lib/examples/components/MainContent.d.ts +4 -11
- package/lib/examples/components/MainContent.js +6 -60
- package/lib/examples/components/index.d.ts +3 -0
- package/lib/examples/components/index.js +2 -0
- package/lib/examples/example-selector.d.ts +1 -1
- package/lib/examples/example-selector.js +35 -22
- package/lib/examples/index.d.ts +26 -13
- package/lib/examples/index.js +26 -12
- package/lib/examples/main.d.ts +7 -0
- package/lib/examples/main.js +21 -43
- package/lib/examples/utils/examplesStore.d.ts +4 -0
- package/lib/examples/{stores → utils}/examplesStore.js +1 -1
- package/lib/examples/utils/notebooks/Empty.ipynb.json +33 -0
- package/lib/examples/utils/notebooks/NotebookExample2.ipynb.json +48 -0
- package/lib/examples/utils/themeStore.d.ts +8 -0
- package/lib/examples/utils/themeStore.js +14 -0
- package/lib/extensions/A2UIExtension.d.ts +65 -0
- package/lib/extensions/A2UIExtension.js +202 -0
- package/lib/{components/chat/extensions → extensions}/ExtensionRegistry.d.ts +2 -3
- package/lib/{components/chat/extensions → extensions}/ExtensionRegistry.js +0 -2
- package/lib/{components/chat/extensions → extensions}/MCPUIExtension.d.ts +2 -2
- package/lib/{components/chat/extensions → extensions}/MCPUIExtension.js +1 -1
- package/lib/extensions/index.d.ts +9 -0
- package/lib/{components/chat/extensions → extensions}/index.js +2 -2
- package/lib/hooks/index.d.ts +33 -16
- package/lib/hooks/index.js +33 -16
- package/lib/hooks/useAIAgentsWebSocket.d.ts +29 -0
- package/lib/hooks/useAIAgentsWebSocket.js +136 -0
- package/lib/hooks/{useAGUI.d.ts → useAgUi.d.ts} +2 -2
- package/lib/hooks/{useAGUI.js → useAgUi.js} +2 -2
- package/lib/hooks/useAgents.d.ts +150 -11
- package/lib/hooks/useAgents.js +623 -61
- package/lib/hooks/{useAgentStore.d.ts → useAgentsCatalog.d.ts} +3 -8
- package/lib/hooks/{useAgentStore.js → useAgentsCatalog.js} +9 -3
- package/lib/hooks/useAgentsRegistry.d.ts +10 -0
- package/lib/hooks/useAgentsRegistry.js +20 -0
- package/lib/hooks/useAgentsService.d.ts +22 -0
- package/lib/hooks/useAgentsService.js +146 -0
- package/lib/hooks/useChat.d.ts +2 -2
- package/lib/hooks/useChat.js +14 -8
- package/lib/hooks/useCheckpoints.d.ts +176 -0
- package/lib/hooks/useCheckpoints.js +466 -0
- package/lib/hooks/useConfig.d.ts +11 -0
- package/lib/hooks/useConfig.js +46 -0
- package/lib/hooks/useContextSnapshot.d.ts +11 -0
- package/lib/hooks/useContextSnapshot.js +44 -0
- package/lib/hooks/useMonitoring.d.ts +24 -0
- package/lib/hooks/useMonitoring.js +111 -0
- package/lib/hooks/useNotifications.d.ts +67 -0
- package/lib/hooks/useNotifications.js +208 -0
- package/lib/hooks/useSandbox.d.ts +12 -0
- package/lib/hooks/useSandbox.js +49 -0
- package/lib/hooks/useSkills.d.ts +13 -0
- package/lib/hooks/useSkills.js +46 -0
- package/lib/hooks/useToolApprovals.d.ts +45 -0
- package/lib/hooks/useToolApprovals.js +126 -0
- package/lib/hooks/useTools.d.ts +4 -4
- package/lib/hooks/useTools.js +2 -2
- package/lib/hooks/{useVercelChat.d.ts → useVercelAI.d.ts} +3 -3
- package/lib/hooks/{useVercelChat.js → useVercelAI.js} +2 -2
- package/lib/{components/chat/components → identity}/AgentIdentity.d.ts +1 -1
- package/lib/{components/chat/components → identity}/AgentIdentity.js +4 -3
- package/lib/identity/index.d.ts +1 -0
- package/lib/identity/index.js +2 -0
- package/lib/index.d.ts +4 -3
- package/lib/index.js +3 -2
- package/lib/{components/chat/inference → inference}/BaseInferenceProvider.d.ts +3 -3
- package/lib/{components/chat/inference → inference}/DatalayerInferenceProvider.d.ts +3 -3
- package/lib/{components/chat/inference → inference}/DatalayerInferenceProvider.js +1 -1
- package/lib/{components/chat/inference → inference}/SelfHostedInferenceProvider.d.ts +2 -2
- package/lib/{components/chat/inference → inference}/SelfHostedInferenceProvider.js +1 -1
- package/lib/{components/chat/inference → inference}/index.d.ts +1 -1
- package/lib/{components/chat/inference → inference}/index.js +1 -1
- package/lib/lexical/ChatInlinePlugin.d.ts +1 -1
- package/lib/lexical/ChatInlinePlugin.js +1 -1
- package/lib/{components → mcp}/McpServerManager.d.ts +1 -2
- package/lib/mcp/index.d.ts +1 -0
- package/lib/{specs/agents/codeai → mcp}/index.js +1 -1
- package/lib/{components/chat/middleware → middleware}/MiddlewarePipeline.d.ts +3 -3
- package/lib/{components/chat/middleware → middleware}/index.d.ts +1 -1
- package/lib/{components/chat/middleware → middleware}/index.js +1 -1
- package/lib/{components/chat/protocols → protocols}/A2AAdapter.d.ts +6 -6
- package/lib/{components/chat/protocols → protocols}/A2AAdapter.js +3 -3
- package/lib/{components/chat/protocols → protocols}/ACPAdapter.d.ts +6 -6
- package/lib/{components/chat/protocols → protocols}/ACPAdapter.js +4 -4
- package/lib/{components/chat/protocols → protocols}/AGUIAdapter.d.ts +14 -6
- package/lib/{components/chat/protocols → protocols}/AGUIAdapter.js +72 -10
- package/lib/{components/chat/protocols → protocols}/BaseProtocolAdapter.d.ts +6 -6
- package/lib/{components/chat/protocols → protocols}/BaseProtocolAdapter.js +1 -1
- package/lib/{components/chat/protocols → protocols}/VercelAIAdapter.d.ts +33 -7
- package/lib/protocols/VercelAIAdapter.js +748 -0
- package/lib/{components/chat/protocols → protocols}/index.d.ts +1 -2
- package/lib/{components/chat/protocols → protocols}/index.js +1 -1
- package/lib/shims/json5.d.ts +4 -0
- package/lib/shims/json5.js +8 -0
- package/lib/specs/agents/agents.d.ts +54 -0
- package/lib/specs/agents/agents.js +1489 -0
- package/lib/specs/agents/index.js +15 -12
- package/lib/specs/envvars.d.ts +11 -19
- package/lib/specs/envvars.js +52 -38
- package/lib/specs/evals.d.ts +20 -0
- package/lib/specs/evals.js +133 -0
- package/lib/specs/events.d.ts +26 -0
- package/lib/specs/events.js +140 -0
- package/lib/specs/frontendTools.d.ts +14 -0
- package/lib/specs/frontendTools.js +53 -0
- package/lib/specs/guardrails.d.ts +29 -0
- package/lib/specs/guardrails.js +310 -0
- package/lib/specs/index.d.ts +15 -2
- package/lib/specs/index.js +15 -2
- package/lib/specs/mcpServers.d.ts +13 -11
- package/lib/specs/mcpServers.js +75 -50
- package/lib/specs/memory.d.ts +36 -0
- package/lib/specs/memory.js +112 -0
- package/lib/specs/models.d.ts +21 -34
- package/lib/specs/models.js +66 -66
- package/lib/specs/notifications.d.ts +17 -0
- package/lib/specs/notifications.js +103 -0
- package/lib/specs/outputs.d.ts +19 -0
- package/lib/specs/outputs.js +106 -0
- package/lib/specs/skills.d.ts +7 -16
- package/lib/specs/skills.js +95 -18
- package/lib/specs/teams/index.d.ts +17 -0
- package/lib/specs/teams/index.js +35 -0
- package/lib/specs/teams/teams.d.ts +27 -0
- package/lib/specs/teams/teams.js +1000 -0
- package/lib/specs/tools.d.ts +15 -0
- package/lib/specs/tools.js +86 -0
- package/lib/specs/triggers.d.ts +15 -0
- package/lib/specs/triggers.js +67 -0
- package/lib/stores/agentsStore.d.ts +123 -0
- package/lib/stores/agentsStore.js +270 -0
- package/lib/{components/chat/store → stores}/chatStore.d.ts +3 -2
- package/lib/{components/chat/store → stores}/chatStore.js +2 -2
- package/lib/{components/chat/store → stores}/conversationStore.d.ts +1 -1
- package/lib/{components/chat/store → stores}/conversationStore.js +1 -1
- package/lib/{components/chat/store → stores}/index.d.ts +3 -2
- package/lib/{components/chat/store → stores}/index.js +3 -2
- package/lib/{components/chat/tools → tools}/ToolExecutor.d.ts +2 -2
- package/lib/{components/chat/tools → tools}/ToolExecutor.js +1 -1
- package/lib/tools/adapters/agent-runtimes/AgentRuntimesToolAdapter.d.ts +1 -1
- package/lib/tools/adapters/agent-runtimes/lexicalHooks.d.ts +14 -10
- package/lib/tools/adapters/agent-runtimes/lexicalHooks.js +31 -21
- package/lib/tools/adapters/agent-runtimes/notebookHooks.d.ts +1 -1
- package/lib/tools/index.d.ts +3 -0
- package/lib/tools/index.js +3 -7
- package/lib/types/a2a.d.ts +39 -0
- package/lib/types/acp.d.ts +21 -0
- package/lib/types/ag-ui.d.ts +25 -0
- package/lib/types/agents-lifecycle.d.ts +36 -0
- package/lib/types/agents.d.ts +80 -0
- package/lib/types/agents.js +22 -0
- package/lib/types/agentspecs.d.ts +90 -0
- package/lib/{components/chat/components/base/ChatBase.d.ts → types/chat.d.ts} +59 -99
- package/lib/types/checkpoints.d.ts +32 -0
- package/lib/types/checkpoints.js +5 -0
- package/lib/types/config.d.ts +67 -0
- package/lib/{runtime/types.js → types/config.js} +2 -2
- package/lib/types/connection.d.ts +31 -0
- package/lib/types/connection.js +5 -0
- package/lib/types/context.d.ts +67 -0
- package/lib/types/context.js +5 -0
- package/lib/types/cost.d.ts +42 -0
- package/lib/types/cost.js +5 -0
- package/lib/types/envvars.d.ts +21 -0
- package/lib/types/envvars.js +5 -0
- package/lib/types/evals.d.ts +66 -0
- package/lib/types/evals.js +5 -0
- package/lib/types/events.d.ts +49 -0
- package/lib/types/events.js +5 -0
- package/lib/types/eventspecs.d.ts +39 -0
- package/lib/types/eventspecs.js +5 -0
- package/lib/types/examples.d.ts +31 -0
- package/lib/types/examples.js +5 -0
- package/lib/{components/chat/types → types}/execution.d.ts +10 -1
- package/lib/{components/chat/types/extension.d.ts → types/extensions.d.ts} +3 -3
- package/lib/types/guardrails.d.ts +106 -0
- package/lib/types/guardrails.js +5 -0
- package/lib/types/index.d.ts +36 -2
- package/lib/types/index.js +35 -2
- package/lib/{components/chat/types → types}/inference.d.ts +3 -3
- package/lib/types/inference.js +5 -0
- package/lib/types/mcp.d.ts +117 -0
- package/lib/types/mcp.js +27 -0
- package/lib/types/memory.d.ts +23 -0
- package/lib/types/memory.js +5 -0
- package/lib/{components/chat/types/message.d.ts → types/messages.d.ts} +20 -1
- package/lib/{components/chat/types → types}/middleware.d.ts +3 -3
- package/lib/types/models.d.ts +63 -0
- package/lib/types/models.js +5 -0
- package/lib/types/notifications.d.ts +85 -0
- package/lib/types/notifications.js +5 -0
- package/lib/types/outputs.d.ts +51 -0
- package/lib/types/outputs.js +5 -0
- package/lib/{components/chat/types → types}/protocol.d.ts +37 -99
- package/lib/types/protocol.js +5 -0
- package/lib/types/sandbox.d.ts +27 -0
- package/lib/types/sandbox.js +24 -0
- package/lib/types/skills.d.ts +74 -0
- package/lib/types/skills.js +5 -0
- package/lib/types/teams.d.ts +133 -0
- package/lib/types/teams.js +5 -0
- package/lib/types/tool-approvals.d.ts +39 -0
- package/lib/types/tool-approvals.js +5 -0
- package/lib/{components/chat/types/tool.d.ts → types/tools.d.ts} +61 -4
- package/lib/types/triggers.d.ts +48 -0
- package/lib/types/triggers.js +5 -0
- package/lib/types/usage.d.ts +36 -0
- package/lib/types/usage.js +5 -0
- package/lib/utils/index.d.ts +1 -0
- package/lib/utils/index.js +5 -0
- package/lib/utils/utils.d.ts +60 -0
- package/lib/utils/utils.js +205 -0
- package/package.json +13 -14
- package/scripts/codegen/__pycache__/versioning.cpython-313.pyc +0 -0
- package/scripts/codegen/generate_agents.py +377 -61
- package/scripts/codegen/generate_envvars.py +36 -35
- package/scripts/codegen/generate_evals.py +279 -0
- package/scripts/codegen/generate_events.py +320 -0
- package/scripts/codegen/generate_frontend_tools.py +266 -0
- package/scripts/codegen/generate_guardrails.py +475 -0
- package/scripts/codegen/generate_mcp_servers.py +36 -9
- package/scripts/codegen/generate_memory.py +468 -0
- package/scripts/codegen/generate_models.py +22 -46
- package/scripts/codegen/generate_notifications.py +309 -0
- package/scripts/codegen/generate_outputs.py +267 -0
- package/scripts/codegen/generate_skills.py +108 -51
- package/scripts/codegen/generate_teams.py +922 -0
- package/scripts/codegen/generate_tools.py +346 -0
- package/scripts/codegen/generate_triggers.py +295 -0
- package/scripts/codegen/versioning.py +53 -0
- package/style/primer-primitives.css +1 -6
- package/lib/components/chat/components/base/ChatBase.js +0 -2242
- package/lib/components/chat/components/base/InputPrompt.d.ts +0 -42
- package/lib/components/chat/components/base/InputPrompt.js +0 -131
- package/lib/components/chat/components/display/index.d.ts +0 -6
- package/lib/components/chat/components/index.d.ts +0 -26
- package/lib/components/chat/components/index.js +0 -39
- package/lib/components/chat/extensions/A2UIExtension.d.ts +0 -87
- package/lib/components/chat/extensions/A2UIExtension.js +0 -312
- package/lib/components/chat/extensions/index.d.ts +0 -10
- package/lib/components/chat/index.d.ts +0 -61
- package/lib/components/chat/index.js +0 -76
- package/lib/components/chat/protocols/VercelAIAdapter.js +0 -315
- package/lib/components/chat/tools/index.d.ts +0 -8
- package/lib/components/chat/tools/index.js +0 -11
- package/lib/components/chat/types/index.d.ts +0 -12
- package/lib/components/chat/types/index.js +0 -17
- package/lib/components/sparklines/Sparklines.d.ts +0 -16
- package/lib/components/sparklines/Sparklines.js +0 -65
- package/lib/components/sparklines/SparklinesLine.d.ts +0 -8
- package/lib/components/sparklines/SparklinesLine.js +0 -37
- package/lib/components/sparklines/dataProcessing.d.ts +0 -25
- package/lib/components/sparklines/dataProcessing.js +0 -35
- package/lib/components/sparklines/index.d.ts +0 -4
- package/lib/components/sparklines/index.js +0 -7
- package/lib/components/sparklines/types.d.ts +0 -36
- package/lib/examples/stores/examplesStore.d.ts +0 -5
- package/lib/examples/stores/notebooks/Empty.ipynb.json +0 -33
- package/lib/examples/stores/notebooks/NotebookExample2.ipynb.json +0 -48
- package/lib/examples/stores/themeStore.d.ts +0 -33
- package/lib/examples/stores/themeStore.js +0 -38
- package/lib/hooks/useAgentRuntimes.d.ts +0 -350
- package/lib/hooks/useAgentRuntimes.js +0 -78
- package/lib/hooks/useKeyboardShortcuts.d.ts +0 -47
- package/lib/hooks/useKeyboardShortcuts.js +0 -153
- package/lib/hooks/useMobile.d.ts +0 -1
- package/lib/hooks/useMobile.js +0 -19
- package/lib/hooks/useNotebookAIAgent.d.ts +0 -8
- package/lib/hooks/useNotebookAIAgent.js +0 -73
- package/lib/renderers/a2ui/components/A2UIRenderer.d.ts +0 -7
- package/lib/renderers/a2ui/components/A2UIRenderer.js +0 -102
- package/lib/renderers/a2ui/components/SurfaceRenderer.d.ts +0 -7
- package/lib/renderers/a2ui/components/SurfaceRenderer.js +0 -101
- package/lib/renderers/a2ui/components/content/AudioPlayer.d.ts +0 -9
- package/lib/renderers/a2ui/components/content/AudioPlayer.js +0 -38
- package/lib/renderers/a2ui/components/content/Divider.d.ts +0 -9
- package/lib/renderers/a2ui/components/content/Divider.js +0 -35
- package/lib/renderers/a2ui/components/content/Icon.d.ts +0 -9
- package/lib/renderers/a2ui/components/content/Icon.js +0 -110
- package/lib/renderers/a2ui/components/content/Image.d.ts +0 -9
- package/lib/renderers/a2ui/components/content/Image.js +0 -61
- package/lib/renderers/a2ui/components/content/Text.d.ts +0 -9
- package/lib/renderers/a2ui/components/content/Text.js +0 -64
- package/lib/renderers/a2ui/components/content/Video.d.ts +0 -9
- package/lib/renderers/a2ui/components/content/Video.js +0 -37
- package/lib/renderers/a2ui/components/content/index.d.ts +0 -6
- package/lib/renderers/a2ui/components/content/index.js +0 -25
- package/lib/renderers/a2ui/components/index.d.ts +0 -5
- package/lib/renderers/a2ui/components/index.js +0 -24
- package/lib/renderers/a2ui/components/interactive/Button.d.ts +0 -11
- package/lib/renderers/a2ui/components/interactive/Button.js +0 -71
- package/lib/renderers/a2ui/components/interactive/CheckBox.d.ts +0 -9
- package/lib/renderers/a2ui/components/interactive/CheckBox.js +0 -48
- package/lib/renderers/a2ui/components/interactive/DateTimeInput.d.ts +0 -9
- package/lib/renderers/a2ui/components/interactive/DateTimeInput.js +0 -62
- package/lib/renderers/a2ui/components/interactive/MultipleChoice.d.ts +0 -9
- package/lib/renderers/a2ui/components/interactive/MultipleChoice.js +0 -73
- package/lib/renderers/a2ui/components/interactive/Slider.d.ts +0 -9
- package/lib/renderers/a2ui/components/interactive/Slider.js +0 -53
- package/lib/renderers/a2ui/components/interactive/TextField.d.ts +0 -9
- package/lib/renderers/a2ui/components/interactive/TextField.js +0 -72
- package/lib/renderers/a2ui/components/interactive/index.d.ts +0 -6
- package/lib/renderers/a2ui/components/interactive/index.js +0 -25
- package/lib/renderers/a2ui/components/layout/Card.d.ts +0 -11
- package/lib/renderers/a2ui/components/layout/Card.js +0 -30
- package/lib/renderers/a2ui/components/layout/Column.d.ts +0 -11
- package/lib/renderers/a2ui/components/layout/Column.js +0 -65
- package/lib/renderers/a2ui/components/layout/List.d.ts +0 -11
- package/lib/renderers/a2ui/components/layout/List.js +0 -55
- package/lib/renderers/a2ui/components/layout/Modal.d.ts +0 -11
- package/lib/renderers/a2ui/components/layout/Modal.js +0 -58
- package/lib/renderers/a2ui/components/layout/Row.d.ts +0 -11
- package/lib/renderers/a2ui/components/layout/Row.js +0 -65
- package/lib/renderers/a2ui/components/layout/Tabs.d.ts +0 -11
- package/lib/renderers/a2ui/components/layout/Tabs.js +0 -48
- package/lib/renderers/a2ui/components/layout/index.d.ts +0 -6
- package/lib/renderers/a2ui/components/layout/index.js +0 -25
- package/lib/renderers/a2ui/context/A2UIContext.d.ts +0 -17
- package/lib/renderers/a2ui/context/A2UIContext.js +0 -54
- package/lib/renderers/a2ui/context/ThemeContext.d.ts +0 -20
- package/lib/renderers/a2ui/context/ThemeContext.js +0 -333
- package/lib/renderers/a2ui/hooks/useA2UI.d.ts +0 -36
- package/lib/renderers/a2ui/hooks/useA2UI.js +0 -62
- package/lib/renderers/a2ui/hooks/useDataBinding.d.ts +0 -8
- package/lib/renderers/a2ui/hooks/useDataBinding.js +0 -83
- package/lib/renderers/a2ui/index.d.ts +0 -9
- package/lib/renderers/a2ui/index.js +0 -28
- package/lib/renderers/a2ui/lib/utils.d.ts +0 -11
- package/lib/renderers/a2ui/lib/utils.js +0 -38
- package/lib/renderers/a2ui/types/index.d.ts +0 -17
- package/lib/runtime/index.d.ts +0 -38
- package/lib/runtime/index.js +0 -40
- package/lib/runtime/runtimeStore.d.ts +0 -76
- package/lib/runtime/runtimeStore.js +0 -184
- package/lib/runtime/types.d.ts +0 -84
- package/lib/runtime/useAgentConnection.d.ts +0 -45
- package/lib/runtime/useAgentConnection.js +0 -112
- package/lib/runtime/useAgentRuntime.d.ts +0 -93
- package/lib/runtime/useAgentRuntime.js +0 -125
- package/lib/specs/agents/codeai/agents.d.ts +0 -28
- package/lib/specs/agents/codeai/agents.js +0 -179
- package/lib/specs/agents/codeai/index.d.ts +0 -1
- package/lib/specs/agents/codemode-paper/agents.d.ts +0 -31
- package/lib/specs/agents/codemode-paper/agents.js +0 -378
- package/lib/specs/agents/codemode-paper/index.d.ts +0 -1
- package/lib/specs/agents/codemode-paper/index.js +0 -5
- package/lib/specs/agents/datalayer-ai/agents.d.ts +0 -31
- package/lib/specs/agents/datalayer-ai/agents.js +0 -352
- package/lib/specs/agents/datalayer-ai/index.d.ts +0 -1
- package/lib/specs/agents/datalayer-ai/index.js +0 -5
- package/lib/specs/agents/mocks/agents.d.ts +0 -43
- package/lib/specs/agents/mocks/agents.js +0 -2293
- package/lib/specs/agents/mocks/index.d.ts +0 -1
- package/lib/specs/agents/mocks/index.js +0 -5
- package/lib/state/index.d.ts +0 -1
- package/lib/state/index.js +0 -5
- package/lib/state/substates/AIAgentState.d.ts +0 -80
- package/lib/state/substates/AIAgentState.js +0 -108
- package/lib/state/substates/index.d.ts +0 -1
- package/lib/state/substates/index.js +0 -5
- package/lib/types/AIAgent.d.ts +0 -17
- package/lib/types/Types.d.ts +0 -217
- /package/lib/{components/chat → api}/handler.d.ts +0 -0
- /package/lib/{renderers/index.d.ts → api/utils.d.ts} +0 -0
- /package/lib/{renderers/index.js → api/utils.js} +0 -0
- /package/lib/{components/chat/components/elements → chat/display}/PoweredByTag.js +0 -0
- /package/lib/{components/chat/components → chat}/parts/DynamicToolPart.js +0 -0
- /package/lib/{components/chat/components → chat}/parts/ReasoningPart.d.ts +0 -0
- /package/lib/{components/chat/components → chat}/parts/TextPart.js +0 -0
- /package/lib/{components/chat/components → chat}/parts/ToolPart.d.ts +0 -0
- /package/lib/{components/chat/components → chat}/styles/streamdownStyles.js +0 -0
- /package/lib/{components/chat/components/elements → chat/tools}/ToolApprovalDialog.d.ts +0 -0
- /package/lib/{components/chat/components → context}/ContextDistribution.d.ts +0 -0
- /package/lib/{components/chat/components → context}/ContextDistribution.js +0 -0
- /package/lib/{components/chat/components → context}/ContextInspector.d.ts +0 -0
- /package/lib/{components/chat/components → context}/ContextPanel.d.ts +0 -0
- /package/lib/{components/chat/components → context}/ContextUsage.d.ts +0 -0
- /package/lib/{components/chat/components → context}/ContextUsage.js +0 -0
- /package/lib/examples/{JupyterCellExample.d.ts → CellSimpleExample.d.ts} +0 -0
- /package/lib/examples/{AgentRuntimeCustomExample.d.ts → ChatCustomExample.d.ts} +0 -0
- /package/lib/examples/{AgentRuntimeChatExample.d.ts → ChatExample.d.ts} +0 -0
- /package/lib/examples/{AgentRuntimeStandaloneExample.d.ts → ChatStandaloneExample.d.ts} +0 -0
- /package/lib/examples/{AgentRuntimeNotebookExample.d.ts → NotebookExample.d.ts} +0 -0
- /package/lib/examples/{AgentRuntimeNotebookSidebarExample.d.ts → NotebookSidebarExample.d.ts} +0 -0
- /package/lib/examples/{JupyterNotebookExample.d.ts → NotebookSimpleExample.d.ts} +0 -0
- /package/lib/examples/{stores → utils}/agents/earthquake-detector.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/agents/earthquake-detector.json +0 -0
- /package/lib/examples/{stores → utils}/agents/earthquake-detector.lexical.json +0 -0
- /package/lib/examples/{stores → utils}/agents/sales-forecaster.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/agents/sales-forecaster.json +0 -0
- /package/lib/examples/{stores → utils}/agents/sales-forecaster.lexical.json +0 -0
- /package/lib/examples/{stores → utils}/agents/social-post-generator.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/agents/social-post-generator.json +0 -0
- /package/lib/examples/{stores → utils}/agents/social-post-generator.lexical.json +0 -0
- /package/lib/examples/{stores → utils}/agents/stock-market.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/agents/stock-market.json +0 -0
- /package/lib/examples/{stores → utils}/agents/stock-market.lexical.json +0 -0
- /package/lib/examples/{stores → utils}/notebooks/IPyWidgetsExample.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/notebooks/IPyWidgetsExampleWithState.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/notebooks/Lite.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/notebooks/Matplotlib.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/notebooks/NotebookExample1.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/notebooks/NotebookOutputs.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/notebooks/NotebookToCExample.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/notebooks/OutputIPyWidgetsExample.d.ts +0 -0
- /package/lib/examples/{stores → utils}/notebooks/OutputIPyWidgetsExample.js +0 -0
- /package/lib/examples/{stores → utils}/notebooks/PyGWalker.ipynb.json +0 -0
- /package/lib/examples/{stores → utils}/themedProvider.d.ts +0 -0
- /package/lib/examples/{stores → utils}/themedProvider.js +0 -0
- /package/lib/{components/chat/inference → inference}/BaseInferenceProvider.js +0 -0
- /package/lib/{components → mcp}/McpServerManager.js +0 -0
- /package/lib/{components/chat/middleware → middleware}/MiddlewarePipeline.js +0 -0
- /package/lib/{components/chat/types/inference.js → types/a2a.js} +0 -0
- /package/lib/{components/chat/types/protocol.js → types/acp.js} +0 -0
- /package/lib/{components/sparklines/types.js → types/ag-ui.js} +0 -0
- /package/lib/{renderers/a2ui/types/index.js → types/agents-lifecycle.js} +0 -0
- /package/lib/types/{AIAgent.js → agentspecs.js} +0 -0
- /package/lib/types/{Types.js → chat.js} +0 -0
- /package/lib/{components/chat/types → types}/execution.js +0 -0
- /package/lib/{components/chat/types/extension.js → types/extensions.js} +0 -0
- /package/lib/{components/chat/types/message.js → types/messages.js} +0 -0
- /package/lib/{components/chat/types → types}/middleware.js +0 -0
- /package/lib/{components/chat/types/tool.js → types/tools.js} +0 -0
|
@@ -0,0 +1,748 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (c) 2025-2026 Datalayer, Inc.
|
|
3
|
+
* Distributed under the terms of the Modified BSD License.
|
|
4
|
+
*/
|
|
5
|
+
import { generateMessageId, createAssistantMessage } from '../types/messages';
|
|
6
|
+
import { BaseProtocolAdapter } from './BaseProtocolAdapter';
|
|
7
|
+
/**
|
|
8
|
+
* Vercel AI protocol adapter
|
|
9
|
+
* Uses HTTP POST with SSE streaming for responses
|
|
10
|
+
* Compatible with Pydantic AI's Vercel AI Data Stream Protocol
|
|
11
|
+
*/
|
|
12
|
+
export class VercelAIAdapter extends BaseProtocolAdapter {
|
|
13
|
+
protocol = 'vercel-ai';
|
|
14
|
+
protocolTransport = 'sse';
|
|
15
|
+
vercelConfig;
|
|
16
|
+
abortController = null;
|
|
17
|
+
currentRequestId = null;
|
|
18
|
+
// Frontend tool continuation state (modelled after AGUIAdapter)
|
|
19
|
+
pendingToolCalls = new Map();
|
|
20
|
+
collectedToolResults = new Map();
|
|
21
|
+
// Store conversation history for continuation
|
|
22
|
+
messageHistory = [];
|
|
23
|
+
lastAssistantText = '';
|
|
24
|
+
lastTools = [];
|
|
25
|
+
lastFrontendToolNames = new Set();
|
|
26
|
+
isContinuation = false;
|
|
27
|
+
// Metadata for ALL deferred tool calls (frontend + approval), keyed by toolCallId.
|
|
28
|
+
// Unlike pendingToolCalls (which only tracks frontend tools for batching),
|
|
29
|
+
// this preserves tool name/args for approval tools so sendToolResult can
|
|
30
|
+
// build a correct continuation message.
|
|
31
|
+
deferredToolMeta = new Map();
|
|
32
|
+
// Stream parsing depth — prevents premature continuations
|
|
33
|
+
_streamParsingDepth = 0;
|
|
34
|
+
_streamDonePromise = null;
|
|
35
|
+
_streamDoneResolve = null;
|
|
36
|
+
constructor(config) {
|
|
37
|
+
super(config);
|
|
38
|
+
this.vercelConfig = config;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Connect to Vercel AI endpoint (SSE doesn't require persistent connection)
|
|
42
|
+
*/
|
|
43
|
+
async connect() {
|
|
44
|
+
this.setConnectionState('connecting');
|
|
45
|
+
// Vercel AI uses SSE, no persistent connection needed
|
|
46
|
+
// Just mark as connected
|
|
47
|
+
this.setConnectionState('connected');
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Disconnect and terminate any ongoing request
|
|
51
|
+
*/
|
|
52
|
+
disconnect() {
|
|
53
|
+
this.abortController?.abort();
|
|
54
|
+
this.abortController = null;
|
|
55
|
+
// Send terminate request to backend if we have a request ID
|
|
56
|
+
if (this.currentRequestId) {
|
|
57
|
+
this.terminateRequest(this.currentRequestId).catch(err => {
|
|
58
|
+
console.warn('[VercelAIAdapter] Failed to terminate request:', err);
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
this.setConnectionState('disconnected');
|
|
62
|
+
}
|
|
63
|
+
/**
|
|
64
|
+
* Terminate a running request on the backend
|
|
65
|
+
*/
|
|
66
|
+
async terminateRequest(requestId) {
|
|
67
|
+
try {
|
|
68
|
+
// Derive the terminate endpoint from the base URL
|
|
69
|
+
const baseUrl = new URL(this.vercelConfig.baseUrl);
|
|
70
|
+
const terminateUrl = `${baseUrl.origin}/api/v1/vercel-ai/terminate`;
|
|
71
|
+
const response = await fetch(terminateUrl, {
|
|
72
|
+
method: 'POST',
|
|
73
|
+
headers: {
|
|
74
|
+
'Content-Type': 'application/json',
|
|
75
|
+
},
|
|
76
|
+
body: JSON.stringify({
|
|
77
|
+
request_id: requestId || this.currentRequestId,
|
|
78
|
+
}),
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) {
|
|
81
|
+
console.warn(`[VercelAIAdapter] Terminate request failed: ${response.status}`);
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
// Consume the response (terminate result)
|
|
85
|
+
await response.json();
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// Ignore errors - request may have already completed
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Send a message using Vercel AI Data Stream Protocol
|
|
94
|
+
*/
|
|
95
|
+
async sendMessage(message, options) {
|
|
96
|
+
if (this.abortController) {
|
|
97
|
+
this.abortController.abort();
|
|
98
|
+
}
|
|
99
|
+
this.abortController = new AbortController();
|
|
100
|
+
// Generate request ID for tracking
|
|
101
|
+
const requestId = options?.threadId || generateMessageId();
|
|
102
|
+
this.currentRequestId = requestId;
|
|
103
|
+
// Store tools for potential continuation
|
|
104
|
+
if (options?.tools) {
|
|
105
|
+
this.lastTools = options.tools;
|
|
106
|
+
this.lastFrontendToolNames = new Set(options.tools
|
|
107
|
+
.map(t => t?.name)
|
|
108
|
+
.filter((name) => Boolean(name)));
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
this.lastFrontendToolNames = new Set();
|
|
112
|
+
}
|
|
113
|
+
// Reset assistant content tracking for fresh (non-continuation) messages
|
|
114
|
+
if (!this.isContinuation) {
|
|
115
|
+
this.lastAssistantText = '';
|
|
116
|
+
this.deferredToolMeta.clear();
|
|
117
|
+
}
|
|
118
|
+
try {
|
|
119
|
+
let vercelMessages;
|
|
120
|
+
if (options?._vercelMessages) {
|
|
121
|
+
// Continuation: use pre-built messages
|
|
122
|
+
vercelMessages = options._vercelMessages;
|
|
123
|
+
}
|
|
124
|
+
else {
|
|
125
|
+
// Use full message history if provided, otherwise just the new message
|
|
126
|
+
const allMessages = options?.messages || [message];
|
|
127
|
+
vercelMessages = allMessages.map(msg => {
|
|
128
|
+
const messageContent = typeof msg.content === 'string'
|
|
129
|
+
? msg.content
|
|
130
|
+
: String(msg.content ?? '');
|
|
131
|
+
const parts = [
|
|
132
|
+
{
|
|
133
|
+
type: 'text',
|
|
134
|
+
text: messageContent,
|
|
135
|
+
},
|
|
136
|
+
];
|
|
137
|
+
// For assistant messages with tool calls, add tool-invocation parts
|
|
138
|
+
if (msg.role === 'assistant' &&
|
|
139
|
+
msg.toolCalls &&
|
|
140
|
+
msg.toolCalls.length > 0) {
|
|
141
|
+
for (const tc of msg.toolCalls) {
|
|
142
|
+
parts.push({
|
|
143
|
+
type: 'tool-invocation',
|
|
144
|
+
toolInvocationId: tc.toolCallId,
|
|
145
|
+
toolName: tc.toolName,
|
|
146
|
+
args: tc.args,
|
|
147
|
+
state: 'result',
|
|
148
|
+
result: tc.result,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
id: msg.id,
|
|
154
|
+
role: msg.role,
|
|
155
|
+
parts,
|
|
156
|
+
};
|
|
157
|
+
});
|
|
158
|
+
// For tool-result messages, add them as separate tool parts
|
|
159
|
+
// (handled inline above via toolCalls on assistant messages)
|
|
160
|
+
}
|
|
161
|
+
// Store message history for continuation
|
|
162
|
+
if (!this.isContinuation) {
|
|
163
|
+
this.messageHistory = [...vercelMessages];
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.messageHistory = [...vercelMessages];
|
|
167
|
+
}
|
|
168
|
+
// Build Vercel AI request
|
|
169
|
+
const requestBody = {
|
|
170
|
+
id: requestId,
|
|
171
|
+
messages: vercelMessages,
|
|
172
|
+
// Required for pydantic-ai deferred tool approval continuations.
|
|
173
|
+
// sdkVersion 6 enables parsing approval-responded tool parts.
|
|
174
|
+
sdkVersion: 6,
|
|
175
|
+
trigger: 'submit-message',
|
|
176
|
+
...(options?.tools && { tools: options.tools }),
|
|
177
|
+
...(options?.model && { model: options.model }),
|
|
178
|
+
...(options?.builtinTools &&
|
|
179
|
+
options.builtinTools.length > 0 && {
|
|
180
|
+
builtinTools: options.builtinTools,
|
|
181
|
+
}),
|
|
182
|
+
...(options?.skills &&
|
|
183
|
+
options.skills.length > 0 && {
|
|
184
|
+
skills: options.skills,
|
|
185
|
+
}),
|
|
186
|
+
...(options?.identities &&
|
|
187
|
+
options.identities.length > 0 && {
|
|
188
|
+
identities: options.identities,
|
|
189
|
+
}),
|
|
190
|
+
};
|
|
191
|
+
if (options?.tools && options.tools.length > 0) {
|
|
192
|
+
console.log('[VercelAIAdapter] Sending with frontend tools:', options.tools.map((t) => t.name));
|
|
193
|
+
}
|
|
194
|
+
else {
|
|
195
|
+
console.log('[VercelAIAdapter] No frontend tools in request');
|
|
196
|
+
}
|
|
197
|
+
if (options?.model) {
|
|
198
|
+
console.log('[VercelAIAdapter] Sending with model:', options.model);
|
|
199
|
+
}
|
|
200
|
+
if (options?.builtinTools && options.builtinTools.length > 0) {
|
|
201
|
+
console.log('[VercelAIAdapter] Sending with builtinTools:', options.builtinTools);
|
|
202
|
+
}
|
|
203
|
+
if (options?.skills && options.skills.length > 0) {
|
|
204
|
+
console.log('[VercelAIAdapter] Sending with skills:', options.skills);
|
|
205
|
+
}
|
|
206
|
+
if (options?.identities && options.identities.length > 0) {
|
|
207
|
+
console.log('[VercelAIAdapter] Sending with identities:', options.identities.map(i => i.provider));
|
|
208
|
+
}
|
|
209
|
+
// Merge custom headers with defaults
|
|
210
|
+
const headers = {
|
|
211
|
+
'Content-Type': 'application/json',
|
|
212
|
+
Accept: 'text/event-stream',
|
|
213
|
+
...this.vercelConfig.headers,
|
|
214
|
+
};
|
|
215
|
+
// Add auth token if provided
|
|
216
|
+
if (this.vercelConfig.authToken) {
|
|
217
|
+
headers['Authorization'] = `token ${this.vercelConfig.authToken}`;
|
|
218
|
+
}
|
|
219
|
+
const response = await fetch(this.vercelConfig.baseUrl, {
|
|
220
|
+
method: 'POST',
|
|
221
|
+
headers,
|
|
222
|
+
body: JSON.stringify(requestBody),
|
|
223
|
+
signal: this.abortController.signal,
|
|
224
|
+
mode: this.vercelConfig.fetchOptions?.mode,
|
|
225
|
+
credentials: this.vercelConfig.fetchOptions?.credentials,
|
|
226
|
+
});
|
|
227
|
+
if (!response.ok) {
|
|
228
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText}`);
|
|
229
|
+
}
|
|
230
|
+
if (!response.body) {
|
|
231
|
+
throw new Error('Response body is null');
|
|
232
|
+
}
|
|
233
|
+
// Parse SSE stream
|
|
234
|
+
await this.parseSSEStream(response.body);
|
|
235
|
+
}
|
|
236
|
+
catch (error) {
|
|
237
|
+
if (error.name !== 'AbortError') {
|
|
238
|
+
console.error('[VercelAIAdapter] Send error:', error);
|
|
239
|
+
throw error;
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
finally {
|
|
243
|
+
this.abortController = null;
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Parse SSE stream from Vercel AI
|
|
248
|
+
*/
|
|
249
|
+
async parseSSEStream(stream) {
|
|
250
|
+
const reader = stream.getReader();
|
|
251
|
+
const decoder = new TextDecoder();
|
|
252
|
+
let buffer = '';
|
|
253
|
+
let currentMessageId = generateMessageId();
|
|
254
|
+
let accumulatedText = '';
|
|
255
|
+
const pendingToolInputs = new Map();
|
|
256
|
+
let doneEmitted = false;
|
|
257
|
+
// Consume the continuation flag — set by sendToolResult for this call only
|
|
258
|
+
this.isContinuation = false;
|
|
259
|
+
// Track stream parsing depth for sendToolResult synchronisation
|
|
260
|
+
if (this._streamParsingDepth === 0) {
|
|
261
|
+
this._streamDonePromise = new Promise(resolve => {
|
|
262
|
+
this._streamDoneResolve = resolve;
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
this._streamParsingDepth++;
|
|
266
|
+
const emitDoneOnce = () => {
|
|
267
|
+
if (doneEmitted)
|
|
268
|
+
return;
|
|
269
|
+
// Don't emit 'done' if there are pending frontend tool calls
|
|
270
|
+
// — the continuation triggered by sendToolResult will do it later
|
|
271
|
+
if (this.pendingToolCalls.size > 0)
|
|
272
|
+
return;
|
|
273
|
+
doneEmitted = true;
|
|
274
|
+
this.emit({
|
|
275
|
+
type: 'done',
|
|
276
|
+
timestamp: new Date(),
|
|
277
|
+
});
|
|
278
|
+
};
|
|
279
|
+
const normalizeToolArgs = (rawArgs, fallbackText = '') => {
|
|
280
|
+
if (rawArgs && typeof rawArgs === 'object' && !Array.isArray(rawArgs)) {
|
|
281
|
+
return rawArgs;
|
|
282
|
+
}
|
|
283
|
+
const asText = typeof rawArgs === 'string' && rawArgs.trim().length > 0
|
|
284
|
+
? rawArgs
|
|
285
|
+
: fallbackText;
|
|
286
|
+
if (!asText.trim()) {
|
|
287
|
+
return {};
|
|
288
|
+
}
|
|
289
|
+
try {
|
|
290
|
+
const parsed = JSON.parse(asText);
|
|
291
|
+
if (parsed && typeof parsed === 'object' && !Array.isArray(parsed)) {
|
|
292
|
+
return parsed;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
catch {
|
|
296
|
+
// Keep empty args if we can't parse structured input.
|
|
297
|
+
}
|
|
298
|
+
return {};
|
|
299
|
+
};
|
|
300
|
+
try {
|
|
301
|
+
while (true) {
|
|
302
|
+
const { done, value } = await reader.read();
|
|
303
|
+
if (done) {
|
|
304
|
+
// Stream ended - emit final message if we have accumulated text
|
|
305
|
+
if (accumulatedText) {
|
|
306
|
+
this.lastAssistantText = accumulatedText;
|
|
307
|
+
const message = createAssistantMessage(accumulatedText);
|
|
308
|
+
message.id = currentMessageId;
|
|
309
|
+
this.emit({
|
|
310
|
+
type: 'message',
|
|
311
|
+
message,
|
|
312
|
+
timestamp: new Date(),
|
|
313
|
+
});
|
|
314
|
+
}
|
|
315
|
+
emitDoneOnce();
|
|
316
|
+
break;
|
|
317
|
+
}
|
|
318
|
+
buffer += decoder.decode(value, { stream: true });
|
|
319
|
+
const lines = buffer.split('\n');
|
|
320
|
+
buffer = lines.pop() || '';
|
|
321
|
+
for (const line of lines) {
|
|
322
|
+
if (!line.trim() || line.startsWith(':')) {
|
|
323
|
+
continue;
|
|
324
|
+
}
|
|
325
|
+
// Log raw line for debugging
|
|
326
|
+
console.debug('[VercelAIAdapter] SSE line:', line);
|
|
327
|
+
if (line.startsWith('data: ')) {
|
|
328
|
+
const data = line.slice(6);
|
|
329
|
+
if (data === '[DONE]') {
|
|
330
|
+
// Stream complete
|
|
331
|
+
if (accumulatedText) {
|
|
332
|
+
this.lastAssistantText = accumulatedText;
|
|
333
|
+
const message = createAssistantMessage(accumulatedText);
|
|
334
|
+
message.id = currentMessageId;
|
|
335
|
+
this.emit({
|
|
336
|
+
type: 'message',
|
|
337
|
+
message,
|
|
338
|
+
timestamp: new Date(),
|
|
339
|
+
});
|
|
340
|
+
}
|
|
341
|
+
emitDoneOnce();
|
|
342
|
+
break;
|
|
343
|
+
}
|
|
344
|
+
try {
|
|
345
|
+
const event = JSON.parse(data);
|
|
346
|
+
console.debug('[VercelAIAdapter] Parsed event:', event);
|
|
347
|
+
// Handle Vercel AI event types
|
|
348
|
+
// Server sends: {"type":"text-delta","delta":"Hello","id":"..."}
|
|
349
|
+
if (event.type === 'text-delta' && event.delta) {
|
|
350
|
+
accumulatedText += event.delta;
|
|
351
|
+
// Emit 'message' event with accumulated content for useChat
|
|
352
|
+
const message = createAssistantMessage(accumulatedText);
|
|
353
|
+
message.id = currentMessageId;
|
|
354
|
+
this.emit({
|
|
355
|
+
type: 'message',
|
|
356
|
+
message,
|
|
357
|
+
timestamp: new Date(),
|
|
358
|
+
});
|
|
359
|
+
}
|
|
360
|
+
else if (event.type === 'text-start') {
|
|
361
|
+
// New text block starting
|
|
362
|
+
currentMessageId = event.id || generateMessageId();
|
|
363
|
+
accumulatedText = '';
|
|
364
|
+
}
|
|
365
|
+
else if (event.type === 'finish' ||
|
|
366
|
+
event.type === 'end-step' ||
|
|
367
|
+
event.type === 'finish-step') {
|
|
368
|
+
if (accumulatedText) {
|
|
369
|
+
const message = createAssistantMessage(accumulatedText);
|
|
370
|
+
message.id = currentMessageId;
|
|
371
|
+
this.emit({
|
|
372
|
+
type: 'message',
|
|
373
|
+
message,
|
|
374
|
+
timestamp: new Date(),
|
|
375
|
+
});
|
|
376
|
+
}
|
|
377
|
+
// Extract and emit usage data from finish events
|
|
378
|
+
if (event.usage) {
|
|
379
|
+
const usage = event.usage;
|
|
380
|
+
this.emit({
|
|
381
|
+
type: 'message',
|
|
382
|
+
usage: {
|
|
383
|
+
promptTokens: usage.promptTokens ?? 0,
|
|
384
|
+
completionTokens: usage.completionTokens ?? 0,
|
|
385
|
+
totalTokens: usage.totalTokens ??
|
|
386
|
+
(usage.promptTokens ?? 0) +
|
|
387
|
+
(usage.completionTokens ?? 0),
|
|
388
|
+
},
|
|
389
|
+
timestamp: new Date(),
|
|
390
|
+
});
|
|
391
|
+
}
|
|
392
|
+
const finishReason = String(event.finishReason || event.finish_reason || '').toLowerCase();
|
|
393
|
+
if (event.type === 'finish' &&
|
|
394
|
+
(finishReason === 'tool-calls' ||
|
|
395
|
+
finishReason === 'tool_calls') &&
|
|
396
|
+
pendingToolInputs.size > 0) {
|
|
397
|
+
// Only emit pending_approval for tool calls that are NOT in
|
|
398
|
+
// pendingToolCalls (i.e., server-side tools waiting for approval,
|
|
399
|
+
// not frontend tools that will be handled by sendToolResult)
|
|
400
|
+
for (const [toolCallId] of pendingToolInputs.entries()) {
|
|
401
|
+
if (!this.pendingToolCalls.has(toolCallId)) {
|
|
402
|
+
this.emit({
|
|
403
|
+
type: 'tool-result',
|
|
404
|
+
toolResult: {
|
|
405
|
+
toolCallId,
|
|
406
|
+
success: true,
|
|
407
|
+
result: {
|
|
408
|
+
pending_approval: true,
|
|
409
|
+
message: 'Awaiting user approval',
|
|
410
|
+
},
|
|
411
|
+
},
|
|
412
|
+
timestamp: new Date(),
|
|
413
|
+
});
|
|
414
|
+
}
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
if (event.type === 'finish') {
|
|
418
|
+
emitDoneOnce();
|
|
419
|
+
}
|
|
420
|
+
}
|
|
421
|
+
else if (event.type === 'tool-input-start') {
|
|
422
|
+
const toolCallId = event.toolCallId ||
|
|
423
|
+
event.tool_call_id ||
|
|
424
|
+
event.id ||
|
|
425
|
+
generateMessageId();
|
|
426
|
+
const toolName = event.toolName ||
|
|
427
|
+
event.tool_name ||
|
|
428
|
+
event.name ||
|
|
429
|
+
event.tool?.name;
|
|
430
|
+
pendingToolInputs.set(toolCallId, {
|
|
431
|
+
toolName,
|
|
432
|
+
inputText: '',
|
|
433
|
+
});
|
|
434
|
+
}
|
|
435
|
+
else if (event.type === 'tool-input-delta') {
|
|
436
|
+
const toolCallId = event.toolCallId || event.tool_call_id || event.id;
|
|
437
|
+
if (toolCallId && pendingToolInputs.has(toolCallId)) {
|
|
438
|
+
const existing = pendingToolInputs.get(toolCallId);
|
|
439
|
+
if (existing) {
|
|
440
|
+
existing.inputText += event.inputTextDelta || '';
|
|
441
|
+
pendingToolInputs.set(toolCallId, existing);
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
}
|
|
445
|
+
else if (event.type === 'tool-input-available') {
|
|
446
|
+
const toolCallId = event.toolCallId ||
|
|
447
|
+
event.tool_call_id ||
|
|
448
|
+
event.id ||
|
|
449
|
+
generateMessageId();
|
|
450
|
+
const pending = pendingToolInputs.get(toolCallId);
|
|
451
|
+
const toolName = event.toolName ||
|
|
452
|
+
event.tool_name ||
|
|
453
|
+
event.name ||
|
|
454
|
+
pending?.toolName ||
|
|
455
|
+
event.tool?.name;
|
|
456
|
+
const args = normalizeToolArgs(event.input || event.args || event.arguments, pending?.inputText || '');
|
|
457
|
+
if (toolName) {
|
|
458
|
+
// Emit tool-call for all tools so UI can render a tool entry.
|
|
459
|
+
// Only client-declared frontend tools should participate in
|
|
460
|
+
// frontend continuation batching via pendingToolCalls.
|
|
461
|
+
this.emit({
|
|
462
|
+
type: 'tool-call',
|
|
463
|
+
toolCall: {
|
|
464
|
+
toolCallId,
|
|
465
|
+
toolName,
|
|
466
|
+
args,
|
|
467
|
+
},
|
|
468
|
+
timestamp: new Date(),
|
|
469
|
+
});
|
|
470
|
+
// Track metadata for ALL deferred tools so sendToolResult
|
|
471
|
+
// can build proper continuation messages (tool name + args).
|
|
472
|
+
this.deferredToolMeta.set(toolCallId, {
|
|
473
|
+
toolCallId,
|
|
474
|
+
toolName,
|
|
475
|
+
args,
|
|
476
|
+
});
|
|
477
|
+
if (this.lastFrontendToolNames.has(toolName)) {
|
|
478
|
+
this.pendingToolCalls.set(toolCallId, {
|
|
479
|
+
toolCallId,
|
|
480
|
+
toolName,
|
|
481
|
+
args,
|
|
482
|
+
});
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
}
|
|
486
|
+
else if (event.type === 'tool-output-available') {
|
|
487
|
+
const toolCallId = event.toolCallId ||
|
|
488
|
+
event.tool_call_id ||
|
|
489
|
+
event.id ||
|
|
490
|
+
generateMessageId();
|
|
491
|
+
const output = event.output ?? event.result ?? event.data ?? event.content;
|
|
492
|
+
this.emit({
|
|
493
|
+
type: 'tool-result',
|
|
494
|
+
toolResult: {
|
|
495
|
+
toolCallId,
|
|
496
|
+
success: true,
|
|
497
|
+
result: output,
|
|
498
|
+
},
|
|
499
|
+
timestamp: new Date(),
|
|
500
|
+
});
|
|
501
|
+
pendingToolInputs.delete(toolCallId);
|
|
502
|
+
// Server already executed this tool — remove from pending
|
|
503
|
+
// frontend tool calls so emitDoneOnce is not blocked.
|
|
504
|
+
this.pendingToolCalls.delete(toolCallId);
|
|
505
|
+
this.deferredToolMeta.delete(toolCallId);
|
|
506
|
+
}
|
|
507
|
+
else if (event.type === 'tool-output-error' ||
|
|
508
|
+
event.type === 'tool-error') {
|
|
509
|
+
const toolCallId = event.toolCallId ||
|
|
510
|
+
event.tool_call_id ||
|
|
511
|
+
event.id ||
|
|
512
|
+
generateMessageId();
|
|
513
|
+
const errorMessage = event.error ||
|
|
514
|
+
event.errorText ||
|
|
515
|
+
event.message ||
|
|
516
|
+
'Tool error';
|
|
517
|
+
// Server handled the error — clear from pending frontend
|
|
518
|
+
// tool calls so emitDoneOnce is not blocked.
|
|
519
|
+
this.pendingToolCalls.delete(toolCallId);
|
|
520
|
+
this.deferredToolMeta.delete(toolCallId);
|
|
521
|
+
this.emit({
|
|
522
|
+
type: 'tool-result',
|
|
523
|
+
toolResult: {
|
|
524
|
+
toolCallId,
|
|
525
|
+
success: false,
|
|
526
|
+
error: errorMessage,
|
|
527
|
+
result: event.output ?? event.result,
|
|
528
|
+
},
|
|
529
|
+
timestamp: new Date(),
|
|
530
|
+
});
|
|
531
|
+
pendingToolInputs.delete(toolCallId);
|
|
532
|
+
}
|
|
533
|
+
else if (event.type === 'error') {
|
|
534
|
+
const errorMessage = event.error ||
|
|
535
|
+
event.errorText ||
|
|
536
|
+
event.message ||
|
|
537
|
+
event.detail ||
|
|
538
|
+
'Unknown server error';
|
|
539
|
+
console.error('[VercelAIAdapter] Server error event:', event);
|
|
540
|
+
this.emit({
|
|
541
|
+
type: 'error',
|
|
542
|
+
error: new Error(errorMessage),
|
|
543
|
+
timestamp: new Date(),
|
|
544
|
+
});
|
|
545
|
+
}
|
|
546
|
+
else if (event.type === 'tool-call' ||
|
|
547
|
+
event.type === 'tool-call-start' ||
|
|
548
|
+
event.type === 'tool-approval-request') {
|
|
549
|
+
const toolName = event.toolName ||
|
|
550
|
+
event.tool_name ||
|
|
551
|
+
event.name ||
|
|
552
|
+
event.tool?.name;
|
|
553
|
+
const args = normalizeToolArgs(event.args ||
|
|
554
|
+
event.arguments ||
|
|
555
|
+
event.input ||
|
|
556
|
+
event.tool?.arguments) || {};
|
|
557
|
+
const toolCallId = event.toolCallId ||
|
|
558
|
+
event.tool_call_id ||
|
|
559
|
+
event.id ||
|
|
560
|
+
generateMessageId();
|
|
561
|
+
if (toolName) {
|
|
562
|
+
this.emit({
|
|
563
|
+
type: 'tool-call',
|
|
564
|
+
toolCall: {
|
|
565
|
+
toolCallId,
|
|
566
|
+
toolName,
|
|
567
|
+
args,
|
|
568
|
+
},
|
|
569
|
+
timestamp: new Date(),
|
|
570
|
+
});
|
|
571
|
+
}
|
|
572
|
+
}
|
|
573
|
+
}
|
|
574
|
+
catch (parseError) {
|
|
575
|
+
console.error('[VercelAIAdapter] Failed to parse SSE data:', parseError);
|
|
576
|
+
}
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
}
|
|
580
|
+
}
|
|
581
|
+
finally {
|
|
582
|
+
reader.releaseLock();
|
|
583
|
+
this._streamParsingDepth--;
|
|
584
|
+
if (this._streamParsingDepth === 0) {
|
|
585
|
+
const resolve = this._streamDoneResolve;
|
|
586
|
+
this._streamDonePromise = null;
|
|
587
|
+
this._streamDoneResolve = null;
|
|
588
|
+
resolve?.();
|
|
589
|
+
}
|
|
590
|
+
}
|
|
591
|
+
}
|
|
592
|
+
/**
|
|
593
|
+
* Send tool result back and continue the conversation.
|
|
594
|
+
*
|
|
595
|
+
* When the agent makes multiple frontend tool calls in a single run, each
|
|
596
|
+
* call triggers an independent async execution in ChatBase. This method
|
|
597
|
+
* batches the results: it stores each result as it arrives and only sends
|
|
598
|
+
* ONE continuation request once ALL pending tool calls have been resolved.
|
|
599
|
+
*/
|
|
600
|
+
async sendToolResult(toolCallId, result) {
|
|
601
|
+
// 1. Emit local event for UI updates
|
|
602
|
+
this.emit({
|
|
603
|
+
type: 'tool-result',
|
|
604
|
+
toolResult: result,
|
|
605
|
+
timestamp: new Date(),
|
|
606
|
+
});
|
|
607
|
+
// 2. Retrieve tool metadata from pending map (frontend tools) or
|
|
608
|
+
// deferred tool meta (approval / all deferred tools).
|
|
609
|
+
const pendingToolCall = this.pendingToolCalls.get(toolCallId) ??
|
|
610
|
+
this.deferredToolMeta.get(toolCallId);
|
|
611
|
+
if (!pendingToolCall) {
|
|
612
|
+
console.warn('[VercelAIAdapter] No pending tool call found for ID:', toolCallId);
|
|
613
|
+
}
|
|
614
|
+
const toolName = pendingToolCall?.toolName ?? 'unknown';
|
|
615
|
+
const toolArgs = pendingToolCall?.args ?? {};
|
|
616
|
+
// 3. Collect this result (batching)
|
|
617
|
+
this.collectedToolResults.set(toolCallId, {
|
|
618
|
+
toolCallId,
|
|
619
|
+
toolName,
|
|
620
|
+
args: toolArgs,
|
|
621
|
+
result,
|
|
622
|
+
});
|
|
623
|
+
// 4. Check whether ALL pending tool calls now have results
|
|
624
|
+
let allResolved = Array.from(this.pendingToolCalls.keys()).every(id => this.collectedToolResults.has(id));
|
|
625
|
+
if (!allResolved) {
|
|
626
|
+
return;
|
|
627
|
+
}
|
|
628
|
+
// 4b. Guard against premature continuations while stream is still parsing
|
|
629
|
+
if (this._streamParsingDepth > 0 && this._streamDonePromise) {
|
|
630
|
+
await this._streamDonePromise;
|
|
631
|
+
allResolved = Array.from(this.pendingToolCalls.keys()).every(id => this.collectedToolResults.has(id));
|
|
632
|
+
if (!allResolved) {
|
|
633
|
+
return;
|
|
634
|
+
}
|
|
635
|
+
}
|
|
636
|
+
// ── All tool results collected — build ONE continuation request ──
|
|
637
|
+
// 5. Build an assistant message with DynamicToolUIParts (output-available)
|
|
638
|
+
const assistantParts = [];
|
|
639
|
+
// Include the assistant text if any was produced before tool calls
|
|
640
|
+
if (this.lastAssistantText) {
|
|
641
|
+
assistantParts.push({
|
|
642
|
+
type: 'text',
|
|
643
|
+
text: this.lastAssistantText,
|
|
644
|
+
state: 'done',
|
|
645
|
+
});
|
|
646
|
+
}
|
|
647
|
+
// Add each tool call with its result as a dynamic-tool part.
|
|
648
|
+
// pydantic-ai parses DynamicTool* parts with output-available / output-error
|
|
649
|
+
// and approval-responded states for deferred approval continuations.
|
|
650
|
+
for (const tr of this.collectedToolResults.values()) {
|
|
651
|
+
const resultObj = tr.result.result && typeof tr.result.result === 'object'
|
|
652
|
+
? tr.result.result
|
|
653
|
+
: undefined;
|
|
654
|
+
const isApprovalDecision = !!resultObj && typeof resultObj.approved === 'boolean';
|
|
655
|
+
if (isApprovalDecision) {
|
|
656
|
+
const approvalId = typeof resultObj?.approvalId === 'string'
|
|
657
|
+
? resultObj.approvalId
|
|
658
|
+
: tr.toolCallId;
|
|
659
|
+
const approved = Boolean(resultObj?.approved);
|
|
660
|
+
const reason = typeof resultObj?.message === 'string' ? resultObj.message : undefined;
|
|
661
|
+
assistantParts.push({
|
|
662
|
+
type: 'dynamic-tool',
|
|
663
|
+
toolName: tr.toolName,
|
|
664
|
+
toolCallId: tr.toolCallId,
|
|
665
|
+
state: 'approval-responded',
|
|
666
|
+
input: tr.args,
|
|
667
|
+
approval: {
|
|
668
|
+
id: approvalId,
|
|
669
|
+
approved,
|
|
670
|
+
...(reason ? { reason } : {}),
|
|
671
|
+
},
|
|
672
|
+
});
|
|
673
|
+
}
|
|
674
|
+
else if (tr.result.success) {
|
|
675
|
+
assistantParts.push({
|
|
676
|
+
type: 'dynamic-tool',
|
|
677
|
+
toolName: tr.toolName,
|
|
678
|
+
toolCallId: tr.toolCallId,
|
|
679
|
+
state: 'output-available',
|
|
680
|
+
input: tr.args,
|
|
681
|
+
output: tr.result.result,
|
|
682
|
+
});
|
|
683
|
+
}
|
|
684
|
+
else {
|
|
685
|
+
assistantParts.push({
|
|
686
|
+
type: 'dynamic-tool',
|
|
687
|
+
toolName: tr.toolName,
|
|
688
|
+
toolCallId: tr.toolCallId,
|
|
689
|
+
state: 'output-error',
|
|
690
|
+
input: tr.args,
|
|
691
|
+
errorText: tr.result.error ?? 'Tool execution failed',
|
|
692
|
+
});
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
const assistantMessage = {
|
|
696
|
+
id: generateMessageId(),
|
|
697
|
+
role: 'assistant',
|
|
698
|
+
parts: assistantParts,
|
|
699
|
+
};
|
|
700
|
+
// 6. Build full continuation messages
|
|
701
|
+
const continuationMessages = [...this.messageHistory, assistantMessage];
|
|
702
|
+
// 7. Clear batching state BEFORE the async sendMessage call
|
|
703
|
+
this.pendingToolCalls.clear();
|
|
704
|
+
this.collectedToolResults.clear();
|
|
705
|
+
this.deferredToolMeta.clear();
|
|
706
|
+
// 8. Update stored message history
|
|
707
|
+
this.messageHistory = continuationMessages;
|
|
708
|
+
// 9. Mark as continuation
|
|
709
|
+
this.isContinuation = true;
|
|
710
|
+
// 10. Send ONE continuation request with all tool results
|
|
711
|
+
const dummyMessage = {
|
|
712
|
+
id: generateMessageId(),
|
|
713
|
+
role: 'user',
|
|
714
|
+
content: '',
|
|
715
|
+
createdAt: new Date(),
|
|
716
|
+
};
|
|
717
|
+
await this.sendMessage(dummyMessage, {
|
|
718
|
+
_vercelMessages: continuationMessages,
|
|
719
|
+
tools: this.lastTools,
|
|
720
|
+
threadId: this.currentRequestId ?? undefined,
|
|
721
|
+
});
|
|
722
|
+
}
|
|
723
|
+
/**
|
|
724
|
+
* Request permission (not supported in Vercel AI)
|
|
725
|
+
*/
|
|
726
|
+
async requestPermission(_permission) {
|
|
727
|
+
return true;
|
|
728
|
+
}
|
|
729
|
+
/**
|
|
730
|
+
* Check feature support
|
|
731
|
+
*/
|
|
732
|
+
supportsFeature(feature) {
|
|
733
|
+
const supportedFeatures = [
|
|
734
|
+
'streaming',
|
|
735
|
+
'tools',
|
|
736
|
+
'frontend-tools',
|
|
737
|
+
'backend-tools',
|
|
738
|
+
];
|
|
739
|
+
return supportedFeatures.includes(feature);
|
|
740
|
+
}
|
|
741
|
+
/**
|
|
742
|
+
* Stop generation
|
|
743
|
+
*/
|
|
744
|
+
stopGeneration() {
|
|
745
|
+
this.abortController?.abort();
|
|
746
|
+
this.abortController = null;
|
|
747
|
+
}
|
|
748
|
+
}
|