@copilotkit/react-core 1.57.3 → 1.58.0-canary.thread-id-propagation
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/LICENSE +21 -0
- package/dist/{copilotkit-CtXcs1ea.cjs → copilotkit-B4ouY7qC.cjs} +14 -3
- package/dist/copilotkit-B4ouY7qC.cjs.map +1 -0
- package/dist/copilotkit-BK9CVq9A.d.cts.map +1 -1
- package/dist/{copilotkit-CC8DjOiC.mjs → copilotkit-L4mM_JqG.mjs} +14 -3
- package/dist/copilotkit-L4mM_JqG.mjs.map +1 -0
- package/dist/copilotkit-WlmeVijs.d.mts.map +1 -1
- package/dist/index.cjs +3 -77
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +2 -2
- package/dist/index.d.mts +2 -2
- package/dist/index.mjs +3 -77
- package/dist/index.mjs.map +1 -1
- package/dist/index.umd.js +15 -78
- package/dist/index.umd.js.map +1 -1
- package/dist/v2/headless.cjs +11 -0
- package/dist/v2/headless.cjs.map +1 -1
- package/dist/v2/headless.d.cts.map +1 -1
- package/dist/v2/headless.d.mts.map +1 -1
- package/dist/v2/headless.mjs +11 -0
- package/dist/v2/headless.mjs.map +1 -1
- package/dist/v2/index.cjs +1 -1
- package/dist/v2/index.mjs +1 -1
- package/dist/v2/index.umd.js +13 -2
- package/dist/v2/index.umd.js.map +1 -1
- package/package.json +12 -13
- package/skills/react-core/SKILL.md +108 -0
- package/skills/react-core/references/agent-access.md +288 -0
- package/skills/react-core/references/attachments.md +291 -0
- package/skills/react-core/references/capabilities.md +138 -0
- package/skills/react-core/references/chat-components.md +221 -0
- package/skills/react-core/references/client-side-tools.md +358 -0
- package/skills/react-core/references/custom-message-renderers.md +226 -0
- package/skills/react-core/references/debug-mode.md +153 -0
- package/skills/react-core/references/human-in-the-loop.md +312 -0
- package/skills/react-core/references/provider-setup.md +326 -0
- package/skills/react-core/references/rendering-activity-messages.md +207 -0
- package/skills/react-core/references/rendering-tool-calls.md +319 -0
- package/skills/react-core/references/suggestions.md +211 -0
- package/skills/react-core/references/switching-agents-recipes.md +160 -0
- package/skills/react-core/references/switching-agents.md +231 -0
- package/skills/react-core/references/threads.md +226 -0
- package/.attw.json +0 -3
- package/CHANGELOG.md +0 -5043
- package/dist/copilotkit-CC8DjOiC.mjs.map +0 -1
- package/dist/copilotkit-CtXcs1ea.cjs.map +0 -1
- package/scripts/scope-preflight.mjs +0 -100
- package/src/components/CopilotListeners.tsx +0 -137
- package/src/components/__tests__/CopilotListeners.test.tsx +0 -38
- package/src/components/copilot-provider/__tests__/copilot-messages-key.test.tsx +0 -92
- package/src/components/copilot-provider/__tests__/copilotkit-error.test.tsx +0 -77
- package/src/components/copilot-provider/__tests__/error-visibility-prod.test.tsx +0 -70
- package/src/components/copilot-provider/__tests__/v1-explicit-threadid-bridge.test.tsx +0 -107
- package/src/components/copilot-provider/copilot-messages.tsx +0 -314
- package/src/components/copilot-provider/copilotkit-props.tsx +0 -214
- package/src/components/copilot-provider/copilotkit.tsx +0 -853
- package/src/components/copilot-provider/index.ts +0 -3
- package/src/components/dev-console/console-trigger.tsx +0 -283
- package/src/components/dev-console/developer-console-modal.tsx +0 -1016
- package/src/components/dev-console/icons.tsx +0 -106
- package/src/components/error-boundary/error-boundary.tsx +0 -99
- package/src/components/error-boundary/error-utils.tsx +0 -105
- package/src/components/index.ts +0 -1
- package/src/components/toast/exclamation-mark-icon.tsx +0 -27
- package/src/components/toast/toast-provider.tsx +0 -448
- package/src/components/usage-banner.tsx +0 -266
- package/src/context/__tests__/threads-context.test.tsx +0 -141
- package/src/context/coagent-state-renders-context.tsx +0 -89
- package/src/context/copilot-context.tsx +0 -365
- package/src/context/copilot-messages-context.tsx +0 -35
- package/src/context/index.ts +0 -22
- package/src/context/threads-context.tsx +0 -69
- package/src/hooks/__tests__/use-coagent-config.test.ts +0 -352
- package/src/hooks/__tests__/use-coagent-state-render-bridge.helpers.test.ts +0 -107
- package/src/hooks/__tests__/use-coagent-state-render.e2e.test.tsx +0 -1209
- package/src/hooks/__tests__/use-coagent-state-render.test.tsx +0 -356
- package/src/hooks/__tests__/use-copilot-chat-internal-connect.test.tsx +0 -241
- package/src/hooks/__tests__/use-frontend-tool-available.test.tsx +0 -72
- package/src/hooks/__tests__/use-frontend-tool-remount.e2e.test.tsx +0 -102
- package/src/hooks/index.ts +0 -33
- package/src/hooks/use-agent-nodename.ts +0 -33
- package/src/hooks/use-coagent-state-render-bridge.helpers.ts +0 -345
- package/src/hooks/use-coagent-state-render-bridge.tsx +0 -222
- package/src/hooks/use-coagent-state-render-registry.ts +0 -230
- package/src/hooks/use-coagent-state-render.ts +0 -163
- package/src/hooks/use-coagent.ts +0 -377
- package/src/hooks/use-configure-chat-suggestions.tsx +0 -96
- package/src/hooks/use-copilot-action.ts +0 -245
- package/src/hooks/use-copilot-additional-instructions.ts +0 -98
- package/src/hooks/use-copilot-authenticated-action.ts +0 -73
- package/src/hooks/use-copilot-chat-headless_c.ts +0 -264
- package/src/hooks/use-copilot-chat-suggestions.tsx +0 -134
- package/src/hooks/use-copilot-chat.ts +0 -132
- package/src/hooks/use-copilot-chat_internal.ts +0 -875
- package/src/hooks/use-copilot-readable.ts +0 -135
- package/src/hooks/use-copilot-runtime-client.ts +0 -178
- package/src/hooks/use-default-tool.ts +0 -13
- package/src/hooks/use-flat-category-store.ts +0 -109
- package/src/hooks/use-frontend-tool.ts +0 -113
- package/src/hooks/use-human-in-the-loop.ts +0 -138
- package/src/hooks/use-langgraph-interrupt.ts +0 -103
- package/src/hooks/use-lazy-tool-renderer.tsx +0 -30
- package/src/hooks/use-make-copilot-document-readable.ts +0 -30
- package/src/hooks/use-render-tool-call.ts +0 -89
- package/src/hooks/use-tree.ts +0 -222
- package/src/index.tsx +0 -7
- package/src/lib/copilot-task.ts +0 -215
- package/src/lib/index.ts +0 -1
- package/src/lib/status-checker.ts +0 -67
- package/src/setupTests.ts +0 -37
- package/src/test-helpers/copilot-context.ts +0 -91
- package/src/types/chat-suggestion-configuration.ts +0 -23
- package/src/types/coagent-action.ts +0 -35
- package/src/types/coagent-state.ts +0 -13
- package/src/types/crew.ts +0 -89
- package/src/types/document-pointer.ts +0 -7
- package/src/types/frontend-action.ts +0 -213
- package/src/types/index.ts +0 -17
- package/src/types/interrupt-action.ts +0 -58
- package/src/types/system-message.ts +0 -4
- package/src/utils/dev-console.ts +0 -19
- package/src/utils/index.ts +0 -2
- package/src/utils/suggestions-constants.ts +0 -8
- package/src/utils/utils.test.ts +0 -7
- package/src/utils/utils.ts +0 -6
- package/src/v2/__tests__/A2UIMessageRenderer.test.tsx +0 -240
- package/src/v2/__tests__/globalSetup.ts +0 -14
- package/src/v2/__tests__/setup.ts +0 -93
- package/src/v2/__tests__/utils/test-helpers.tsx +0 -570
- package/src/v2/a2ui/A2UICatalogContext.tsx +0 -79
- package/src/v2/a2ui/A2UIMessageRenderer.tsx +0 -294
- package/src/v2/a2ui/A2UIToolCallRenderer.tsx +0 -290
- package/src/v2/components/CopilotKitInspector.tsx +0 -52
- package/src/v2/components/MCPAppsActivityRenderer.tsx +0 -815
- package/src/v2/components/OpenGenerativeUIRenderer.tsx +0 -598
- package/src/v2/components/WildcardToolCallRender.tsx +0 -86
- package/src/v2/components/__tests__/OpenGenerativeUIRenderer.test.tsx +0 -665
- package/src/v2/components/chat/CopilotChat.tsx +0 -664
- package/src/v2/components/chat/CopilotChatAssistantMessage.tsx +0 -393
- package/src/v2/components/chat/CopilotChatAttachmentQueue.tsx +0 -374
- package/src/v2/components/chat/CopilotChatAttachmentRenderer.tsx +0 -159
- package/src/v2/components/chat/CopilotChatAudioRecorder.tsx +0 -350
- package/src/v2/components/chat/CopilotChatInput.tsx +0 -1412
- package/src/v2/components/chat/CopilotChatMessageView.tsx +0 -716
- package/src/v2/components/chat/CopilotChatReasoningMessage.tsx +0 -265
- package/src/v2/components/chat/CopilotChatSuggestionPill.tsx +0 -59
- package/src/v2/components/chat/CopilotChatSuggestionView.tsx +0 -134
- package/src/v2/components/chat/CopilotChatToggleButton.tsx +0 -171
- package/src/v2/components/chat/CopilotChatToolCallsView.tsx +0 -40
- package/src/v2/components/chat/CopilotChatUserMessage.tsx +0 -445
- package/src/v2/components/chat/CopilotChatView.tsx +0 -890
- package/src/v2/components/chat/CopilotModalHeader.tsx +0 -129
- package/src/v2/components/chat/CopilotPopup.tsx +0 -81
- package/src/v2/components/chat/CopilotPopupView.tsx +0 -317
- package/src/v2/components/chat/CopilotSidebar.tsx +0 -80
- package/src/v2/components/chat/CopilotSidebarView.tsx +0 -269
- package/src/v2/components/chat/Lightbox.tsx +0 -103
- package/src/v2/components/chat/__tests__/CopilotChat.absentThreadConnect.test.tsx +0 -66
- package/src/v2/components/chat/__tests__/CopilotChat.attachments.test.tsx +0 -168
- package/src/v2/components/chat/__tests__/CopilotChat.e2e.test.tsx +0 -1239
- package/src/v2/components/chat/__tests__/CopilotChat.onError.test.tsx +0 -73
- package/src/v2/components/chat/__tests__/CopilotChat.slots.e2e.test.tsx +0 -432
- package/src/v2/components/chat/__tests__/CopilotChat.suggestionsAlways.test.tsx +0 -183
- package/src/v2/components/chat/__tests__/CopilotChat.welcomeGate.test.tsx +0 -184
- package/src/v2/components/chat/__tests__/CopilotChatActivityRendering.e2e.test.tsx +0 -649
- package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.slots.e2e.test.tsx +0 -624
- package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.test.tsx +0 -702
- package/src/v2/components/chat/__tests__/CopilotChatAssistantMessage.thumbs.test.tsx +0 -72
- package/src/v2/components/chat/__tests__/CopilotChatCopyButton.clipboard.test.tsx +0 -241
- package/src/v2/components/chat/__tests__/CopilotChatCssClasses.test.tsx +0 -107
- package/src/v2/components/chat/__tests__/CopilotChatInput.slots.e2e.test.tsx +0 -929
- package/src/v2/components/chat/__tests__/CopilotChatInput.test.tsx +0 -1567
- package/src/v2/components/chat/__tests__/CopilotChatMessageView.slots.e2e.test.tsx +0 -1004
- package/src/v2/components/chat/__tests__/CopilotChatMessageView.test.tsx +0 -279
- package/src/v2/components/chat/__tests__/CopilotChatPerf.e2e.test.tsx +0 -336
- package/src/v2/components/chat/__tests__/CopilotChatPropsRerender.e2e.test.tsx +0 -249
- package/src/v2/components/chat/__tests__/CopilotChatSuggestionView.slots.e2e.test.tsx +0 -530
- package/src/v2/components/chat/__tests__/CopilotChatToolRendering.e2e.test.tsx +0 -785
- package/src/v2/components/chat/__tests__/CopilotChatToolRerenders.e2e.test.tsx +0 -2416
- package/src/v2/components/chat/__tests__/CopilotChatUserMessage.slots.e2e.test.tsx +0 -621
- package/src/v2/components/chat/__tests__/CopilotChatView.connectingGate.test.tsx +0 -56
- package/src/v2/components/chat/__tests__/CopilotChatView.inputOverlay.test.tsx +0 -264
- package/src/v2/components/chat/__tests__/CopilotChatView.onClick.e2e.test.tsx +0 -853
- package/src/v2/components/chat/__tests__/CopilotChatView.pinToSend.test.tsx +0 -94
- package/src/v2/components/chat/__tests__/CopilotChatView.slots.e2e.test.tsx +0 -1050
- package/src/v2/components/chat/__tests__/CopilotModalHeader.slots.e2e.test.tsx +0 -484
- package/src/v2/components/chat/__tests__/CopilotPopupView.slots.e2e.test.tsx +0 -612
- package/src/v2/components/chat/__tests__/CopilotSidebarView.position.test.tsx +0 -159
- package/src/v2/components/chat/__tests__/CopilotSidebarView.slots.e2e.test.tsx +0 -502
- package/src/v2/components/chat/__tests__/MCPAppsActivityRenderer.e2e.test.tsx +0 -1068
- package/src/v2/components/chat/__tests__/MCPAppsProxy.e2e.test.tsx +0 -589
- package/src/v2/components/chat/__tests__/MCPAppsUiMessage.e2e.test.tsx +0 -403
- package/src/v2/components/chat/__tests__/copilot-chat-throttle.test.tsx +0 -137
- package/src/v2/components/chat/__tests__/normalize-auto-scroll.test.ts +0 -37
- package/src/v2/components/chat/__tests__/setup.ts +0 -1
- package/src/v2/components/chat/index.ts +0 -90
- package/src/v2/components/chat/last-user-message-context.ts +0 -21
- package/src/v2/components/chat/normalize-auto-scroll.ts +0 -17
- package/src/v2/components/chat/scroll-element-context.ts +0 -13
- package/src/v2/components/index.ts +0 -8
- package/src/v2/components/intelligence-indicator/IntelligenceIndicator.tsx +0 -286
- package/src/v2/components/intelligence-indicator/__tests__/IntelligenceIndicator.e2e.test.tsx +0 -464
- package/src/v2/components/intelligence-indicator/index.ts +0 -2
- package/src/v2/components/license-warning-banner.tsx +0 -217
- package/src/v2/components/ui/button.tsx +0 -124
- package/src/v2/components/ui/dropdown-menu.tsx +0 -258
- package/src/v2/components/ui/tooltip.tsx +0 -60
- package/src/v2/context.ts +0 -62
- package/src/v2/headless.ts +0 -64
- package/src/v2/hooks/__tests__/standard-schema-types.test.tsx +0 -152
- package/src/v2/hooks/__tests__/standard-schema.test.tsx +0 -282
- package/src/v2/hooks/__tests__/use-agent-context-timing.e2e.test.tsx +0 -140
- package/src/v2/hooks/__tests__/use-agent-context.test.tsx +0 -401
- package/src/v2/hooks/__tests__/use-agent-error-state.test.tsx +0 -44
- package/src/v2/hooks/__tests__/use-agent-stability.test.tsx +0 -211
- package/src/v2/hooks/__tests__/use-agent-throttle.test.tsx +0 -1029
- package/src/v2/hooks/__tests__/use-agent.e2e.test.tsx +0 -159
- package/src/v2/hooks/__tests__/use-attachments.test.tsx +0 -169
- package/src/v2/hooks/__tests__/use-capabilities.test.tsx +0 -76
- package/src/v2/hooks/__tests__/use-component.test.tsx +0 -126
- package/src/v2/hooks/__tests__/use-configure-suggestions.e2e.test.tsx +0 -696
- package/src/v2/hooks/__tests__/use-default-render-tool.test.tsx +0 -153
- package/src/v2/hooks/__tests__/use-frontend-tool-available.test.tsx +0 -167
- package/src/v2/hooks/__tests__/use-frontend-tool.e2e.test.tsx +0 -2148
- package/src/v2/hooks/__tests__/use-human-in-the-loop.e2e.test.tsx +0 -1261
- package/src/v2/hooks/__tests__/use-interrupt.test.tsx +0 -397
- package/src/v2/hooks/__tests__/use-katex-styles.test.tsx +0 -56
- package/src/v2/hooks/__tests__/use-keyboard-height.test.tsx +0 -192
- package/src/v2/hooks/__tests__/use-pin-to-send.test.tsx +0 -219
- package/src/v2/hooks/__tests__/use-render-custom-messages.test.tsx +0 -55
- package/src/v2/hooks/__tests__/use-render-tool.test.tsx +0 -259
- package/src/v2/hooks/__tests__/use-suggestions.e2e.test.tsx +0 -524
- package/src/v2/hooks/__tests__/use-threads.test.tsx +0 -757
- package/src/v2/hooks/__tests__/zod-regression.test.tsx +0 -311
- package/src/v2/hooks/index.ts +0 -24
- package/src/v2/hooks/use-agent-context.tsx +0 -45
- package/src/v2/hooks/use-agent.tsx +0 -227
- package/src/v2/hooks/use-attachments.tsx +0 -269
- package/src/v2/hooks/use-capabilities.tsx +0 -25
- package/src/v2/hooks/use-component.tsx +0 -91
- package/src/v2/hooks/use-configure-suggestions.tsx +0 -236
- package/src/v2/hooks/use-default-render-tool.tsx +0 -271
- package/src/v2/hooks/use-frontend-tool.tsx +0 -46
- package/src/v2/hooks/use-human-in-the-loop.tsx +0 -81
- package/src/v2/hooks/use-interrupt.tsx +0 -305
- package/src/v2/hooks/use-keyboard-height.tsx +0 -67
- package/src/v2/hooks/use-pin-to-send.ts +0 -94
- package/src/v2/hooks/use-render-activity-message.tsx +0 -72
- package/src/v2/hooks/use-render-custom-messages.tsx +0 -93
- package/src/v2/hooks/use-render-tool-call.tsx +0 -208
- package/src/v2/hooks/use-render-tool.tsx +0 -184
- package/src/v2/hooks/use-suggestions.tsx +0 -91
- package/src/v2/hooks/use-threads.tsx +0 -325
- package/src/v2/hooks/useKatexStyles.ts +0 -27
- package/src/v2/index.css +0 -1
- package/src/v2/index.ts +0 -27
- package/src/v2/lib/__tests__/completePartialMarkdown.test.ts +0 -495
- package/src/v2/lib/__tests__/processPartialHtml.test.ts +0 -112
- package/src/v2/lib/__tests__/renderSlot.test.tsx +0 -588
- package/src/v2/lib/__tests__/slots.test.ts +0 -56
- package/src/v2/lib/processPartialHtml.ts +0 -45
- package/src/v2/lib/react-core.ts +0 -156
- package/src/v2/lib/slots.tsx +0 -184
- package/src/v2/lib/transcription-client.ts +0 -184
- package/src/v2/lib/utils.ts +0 -8
- package/src/v2/providers/CopilotChatConfigurationProvider.tsx +0 -196
- package/src/v2/providers/CopilotKitProvider.tsx +0 -800
- package/src/v2/providers/SandboxFunctionsContext.ts +0 -10
- package/src/v2/providers/__tests__/CopilotChatConfigurationProvider.test.tsx +0 -652
- package/src/v2/providers/__tests__/CopilotKitProvider.license.test.tsx +0 -101
- package/src/v2/providers/__tests__/CopilotKitProvider.onError.test.tsx +0 -69
- package/src/v2/providers/__tests__/CopilotKitProvider.renderCustomMessages.e2e.test.tsx +0 -881
- package/src/v2/providers/__tests__/CopilotKitProvider.sandboxFunctions.test.tsx +0 -198
- package/src/v2/providers/__tests__/CopilotKitProvider.stability.test.tsx +0 -740
- package/src/v2/providers/__tests__/CopilotKitProvider.test.tsx +0 -713
- package/src/v2/providers/__tests__/CopilotKitProvider.wildcard.test.tsx +0 -294
- package/src/v2/providers/index.ts +0 -21
- package/src/v2/styles/globals.css +0 -349
- package/src/v2/types/__tests__/defineToolCallRenderer.test.tsx +0 -525
- package/src/v2/types/defineToolCallRenderer.ts +0 -68
- package/src/v2/types/frontend-tool.ts +0 -8
- package/src/v2/types/human-in-the-loop.ts +0 -33
- package/src/v2/types/index.ts +0 -8
- package/src/v2/types/interrupt.ts +0 -15
- package/src/v2/types/react-activity-message-renderer.ts +0 -27
- package/src/v2/types/react-custom-message-renderer.ts +0 -17
- package/src/v2/types/react-tool-call-renderer.ts +0 -35
- package/src/v2/types/sandbox-function.ts +0 -11
- package/tsconfig.json +0 -8
- package/tsdown.config.ts +0 -193
- package/typedoc.json +0 -4
- package/vitest.config.mjs +0 -31
|
@@ -0,0 +1,291 @@
|
|
|
1
|
+
# CopilotKit Attachments (React)
|
|
2
|
+
|
|
3
|
+
This skill builds on `copilotkit/provider-setup` and
|
|
4
|
+
`copilotkit/chat-components`. `useAttachments` is exposed both as an opt-in
|
|
5
|
+
prop on `<CopilotChat>` and as a direct hook for custom chat surfaces.
|
|
6
|
+
|
|
7
|
+
## Setup
|
|
8
|
+
|
|
9
|
+
### Easiest: turn attachments on via `<CopilotChat>`
|
|
10
|
+
|
|
11
|
+
```tsx
|
|
12
|
+
"use client";
|
|
13
|
+
import { CopilotChat } from "@copilotkit/react-core/v2";
|
|
14
|
+
import "@copilotkit/react-core/v2/styles.css";
|
|
15
|
+
|
|
16
|
+
export function ChatPanel() {
|
|
17
|
+
return (
|
|
18
|
+
<CopilotChat
|
|
19
|
+
agentId="default"
|
|
20
|
+
attachments={{
|
|
21
|
+
enabled: true,
|
|
22
|
+
accept: "image/*",
|
|
23
|
+
maxSize: 10 * 1024 * 1024, // 10 MB
|
|
24
|
+
onUploadFailed: ({ reason, file, message }) => {
|
|
25
|
+
console.warn(`[attachments] ${reason}: ${file.name} — ${message}`);
|
|
26
|
+
},
|
|
27
|
+
}}
|
|
28
|
+
/>
|
|
29
|
+
);
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
### Direct hook usage for custom surfaces
|
|
34
|
+
|
|
35
|
+
```tsx
|
|
36
|
+
"use client";
|
|
37
|
+
import {
|
|
38
|
+
useAttachments,
|
|
39
|
+
useAgent,
|
|
40
|
+
useCopilotKit,
|
|
41
|
+
} from "@copilotkit/react-core/v2";
|
|
42
|
+
import type { InputContent } from "@ag-ui/core";
|
|
43
|
+
|
|
44
|
+
export function CustomChatInput() {
|
|
45
|
+
const { agent } = useAgent({ agentId: "default" });
|
|
46
|
+
const { copilotkit } = useCopilotKit();
|
|
47
|
+
const {
|
|
48
|
+
attachments,
|
|
49
|
+
containerRef,
|
|
50
|
+
fileInputRef,
|
|
51
|
+
handleFileUpload,
|
|
52
|
+
handleDragOver,
|
|
53
|
+
handleDragLeave,
|
|
54
|
+
handleDrop,
|
|
55
|
+
removeAttachment,
|
|
56
|
+
consumeAttachments,
|
|
57
|
+
} = useAttachments({ config: { enabled: true, accept: "*/*" } });
|
|
58
|
+
|
|
59
|
+
return (
|
|
60
|
+
<div
|
|
61
|
+
ref={containerRef}
|
|
62
|
+
onDragOver={handleDragOver}
|
|
63
|
+
onDragLeave={handleDragLeave}
|
|
64
|
+
onDrop={handleDrop}
|
|
65
|
+
>
|
|
66
|
+
<input type="file" ref={fileInputRef} onChange={handleFileUpload} />
|
|
67
|
+
{attachments.map((a) => (
|
|
68
|
+
<button key={a.id} onClick={() => removeAttachment(a.id)}>
|
|
69
|
+
{a.filename} ({a.status})
|
|
70
|
+
</button>
|
|
71
|
+
))}
|
|
72
|
+
<button
|
|
73
|
+
onClick={async () => {
|
|
74
|
+
const ready = consumeAttachments();
|
|
75
|
+
// `ready` is Attachment[] — map each to an AG-UI InputContent part
|
|
76
|
+
// before spreading into the message content array.
|
|
77
|
+
const contentParts: InputContent[] = [
|
|
78
|
+
{ type: "text", text: "See attachments." },
|
|
79
|
+
...ready.map(
|
|
80
|
+
(att) =>
|
|
81
|
+
({
|
|
82
|
+
type: att.type,
|
|
83
|
+
source: att.source,
|
|
84
|
+
metadata: {
|
|
85
|
+
...(att.filename ? { filename: att.filename } : {}),
|
|
86
|
+
...att.metadata,
|
|
87
|
+
},
|
|
88
|
+
}) as InputContent,
|
|
89
|
+
),
|
|
90
|
+
];
|
|
91
|
+
agent.addMessage({
|
|
92
|
+
id: crypto.randomUUID(),
|
|
93
|
+
role: "user",
|
|
94
|
+
content: contentParts,
|
|
95
|
+
});
|
|
96
|
+
await copilotkit.runAgent({ agent });
|
|
97
|
+
}}
|
|
98
|
+
>
|
|
99
|
+
Send
|
|
100
|
+
</button>
|
|
101
|
+
</div>
|
|
102
|
+
);
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`consumeAttachments()` returns the `Attachment[]` queue — each entry has
|
|
107
|
+
`{ id, type, source, filename, status, metadata }` and is NOT a valid
|
|
108
|
+
AG-UI content part. Map each attachment to an `InputContent` shape
|
|
109
|
+
(`{ type, source, metadata }`) before spreading into a message's `content`
|
|
110
|
+
array. See `packages/react-core/src/v2/components/chat/CopilotChat.tsx:247-268`
|
|
111
|
+
for the canonical transform.
|
|
112
|
+
|
|
113
|
+
## Core Patterns
|
|
114
|
+
|
|
115
|
+
### Custom upload backend (S3 / presigned URL)
|
|
116
|
+
|
|
117
|
+
`onUpload` replaces the default base64-inline strategy. Return an
|
|
118
|
+
`Attachment.source` describing where the file lives.
|
|
119
|
+
|
|
120
|
+
```tsx
|
|
121
|
+
useAttachments({
|
|
122
|
+
config: {
|
|
123
|
+
enabled: true,
|
|
124
|
+
accept: "image/*,application/pdf",
|
|
125
|
+
maxSize: 50 * 1024 * 1024,
|
|
126
|
+
onUpload: async (file) => {
|
|
127
|
+
const { url } = await fetch("/api/upload", {
|
|
128
|
+
method: "POST",
|
|
129
|
+
body: file,
|
|
130
|
+
}).then((r) => r.json());
|
|
131
|
+
return { type: "url", value: url, mimeType: file.type };
|
|
132
|
+
},
|
|
133
|
+
onUploadFailed: ({ reason, file, message }) => {
|
|
134
|
+
toast.error(`${file.name}: ${message}`);
|
|
135
|
+
},
|
|
136
|
+
},
|
|
137
|
+
});
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
### Feedback on failed uploads
|
|
141
|
+
|
|
142
|
+
```tsx
|
|
143
|
+
useAttachments({
|
|
144
|
+
config: {
|
|
145
|
+
enabled: true,
|
|
146
|
+
maxSize: 5 * 1024 * 1024,
|
|
147
|
+
onUploadFailed: ({ reason, file, message }) => {
|
|
148
|
+
// reason: "file-too-large" | "invalid-type" | "upload-failed"
|
|
149
|
+
toast.error(message);
|
|
150
|
+
},
|
|
151
|
+
},
|
|
152
|
+
});
|
|
153
|
+
```
|
|
154
|
+
|
|
155
|
+
## Common Mistakes
|
|
156
|
+
|
|
157
|
+
### HIGH — Forgetting to call `consumeAttachments` on submit
|
|
158
|
+
|
|
159
|
+
Wrong:
|
|
160
|
+
|
|
161
|
+
```tsx
|
|
162
|
+
const { attachments } = useAttachments({ config: { enabled: true } });
|
|
163
|
+
const onSubmit = () => {
|
|
164
|
+
sendMessage({ text, attachments });
|
|
165
|
+
// attachments queue never cleared — sticks around for the next message
|
|
166
|
+
};
|
|
167
|
+
```
|
|
168
|
+
|
|
169
|
+
Correct:
|
|
170
|
+
|
|
171
|
+
```tsx
|
|
172
|
+
const { consumeAttachments } = useAttachments({ config: { enabled: true } });
|
|
173
|
+
const onSubmit = () => {
|
|
174
|
+
const ready = consumeAttachments();
|
|
175
|
+
sendMessage({ text, attachments: ready });
|
|
176
|
+
};
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
`consumeAttachments()` returns ready attachments AND drains the internal
|
|
180
|
+
queue. If you submit without calling it, attachments stay in state and
|
|
181
|
+
accompany every subsequent message.
|
|
182
|
+
|
|
183
|
+
Source: `packages/react-core/src/v2/hooks/use-attachments.tsx:40-46`
|
|
184
|
+
|
|
185
|
+
### HIGH — Passing `maxSize` in KB or MB
|
|
186
|
+
|
|
187
|
+
Wrong:
|
|
188
|
+
|
|
189
|
+
```tsx
|
|
190
|
+
useAttachments({ config: { enabled: true, maxSize: 10 } });
|
|
191
|
+
// 10 bytes! Effectively blocks every file.
|
|
192
|
+
```
|
|
193
|
+
|
|
194
|
+
Correct:
|
|
195
|
+
|
|
196
|
+
```tsx
|
|
197
|
+
useAttachments({
|
|
198
|
+
config: { enabled: true, maxSize: 10 * 1024 * 1024 }, // 10 MB
|
|
199
|
+
});
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
`maxSize` is bytes. The default is `20 * 1024 * 1024` (20 MB). Passing a
|
|
203
|
+
small number without the multiplier silently rejects every file via
|
|
204
|
+
`onUploadFailed({ reason: "file-too-large" })`.
|
|
205
|
+
|
|
206
|
+
Source: `packages/react-core/src/v2/hooks/use-attachments.tsx:73-74`
|
|
207
|
+
|
|
208
|
+
### HIGH — Missing `containerRef` on the paste-scope element
|
|
209
|
+
|
|
210
|
+
Wrong:
|
|
211
|
+
|
|
212
|
+
```tsx
|
|
213
|
+
const { enabled } = useAttachments({ config: { enabled: true } });
|
|
214
|
+
return (
|
|
215
|
+
<div>
|
|
216
|
+
<input type="text" />
|
|
217
|
+
</div>
|
|
218
|
+
); // no containerRef attached
|
|
219
|
+
```
|
|
220
|
+
|
|
221
|
+
Correct:
|
|
222
|
+
|
|
223
|
+
```tsx
|
|
224
|
+
const { containerRef, handleDragOver, handleDrop } = useAttachments({
|
|
225
|
+
config: { enabled: true },
|
|
226
|
+
});
|
|
227
|
+
return (
|
|
228
|
+
<div ref={containerRef} onDragOver={handleDragOver} onDrop={handleDrop}>
|
|
229
|
+
<input type="text" />
|
|
230
|
+
</div>
|
|
231
|
+
);
|
|
232
|
+
```
|
|
233
|
+
|
|
234
|
+
Clipboard paste is scoped to the element `containerRef` points at. Without
|
|
235
|
+
attaching the ref, `Ctrl+V` / `Cmd+V` never reaches the paste handler and
|
|
236
|
+
users silently can't paste images from screenshots.
|
|
237
|
+
|
|
238
|
+
Source: `packages/react-core/src/v2/hooks/use-attachments.tsx:207-239`
|
|
239
|
+
|
|
240
|
+
### MEDIUM — Using `imageUploadsEnabled` on `<CopilotChat>`
|
|
241
|
+
|
|
242
|
+
Wrong:
|
|
243
|
+
|
|
244
|
+
```tsx
|
|
245
|
+
<CopilotChat imageUploadsEnabled />
|
|
246
|
+
```
|
|
247
|
+
|
|
248
|
+
Correct:
|
|
249
|
+
|
|
250
|
+
```tsx
|
|
251
|
+
<CopilotChat
|
|
252
|
+
attachments={{
|
|
253
|
+
enabled: true,
|
|
254
|
+
accept: "image/*",
|
|
255
|
+
maxSize: 5 * 1024 * 1024,
|
|
256
|
+
}}
|
|
257
|
+
/>
|
|
258
|
+
```
|
|
259
|
+
|
|
260
|
+
`imageUploadsEnabled` was the v1 flag. v2 replaces it with the `attachments`
|
|
261
|
+
config object, which is powered by `useAttachments` internally and supports
|
|
262
|
+
any MIME type, not only images.
|
|
263
|
+
|
|
264
|
+
Source: `docs/content/docs/(root)/migration-guides/migrate-attachments.mdx`
|
|
265
|
+
|
|
266
|
+
### MEDIUM — Ignoring `onUploadFailed`
|
|
267
|
+
|
|
268
|
+
Wrong:
|
|
269
|
+
|
|
270
|
+
```tsx
|
|
271
|
+
useAttachments({ config: { enabled: true } });
|
|
272
|
+
// Rejected files silently disappear. User has no idea why.
|
|
273
|
+
```
|
|
274
|
+
|
|
275
|
+
Correct:
|
|
276
|
+
|
|
277
|
+
```tsx
|
|
278
|
+
useAttachments({
|
|
279
|
+
config: {
|
|
280
|
+
enabled: true,
|
|
281
|
+
onUploadFailed: ({ reason, file, message }) => {
|
|
282
|
+
toast.error(message);
|
|
283
|
+
},
|
|
284
|
+
},
|
|
285
|
+
});
|
|
286
|
+
```
|
|
287
|
+
|
|
288
|
+
Size violations, MIME mismatches, and `onUpload` throws all drop the file
|
|
289
|
+
from the queue with no UI feedback unless `onUploadFailed` is wired.
|
|
290
|
+
|
|
291
|
+
Source: `packages/react-core/src/v2/hooks/use-attachments.tsx:79-157`
|
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
# CopilotKit Capabilities (React)
|
|
2
|
+
|
|
3
|
+
This skill builds on `copilotkit/agent-access`. `useCapabilities` internally
|
|
4
|
+
calls `useAgent` and reads the `capabilities` field populated from the
|
|
5
|
+
runtime `/info` response.
|
|
6
|
+
|
|
7
|
+
`AgentCapabilities` is from `@ag-ui/core`. The hook is synchronous — there
|
|
8
|
+
is no loading state, but the value is `undefined` until the handshake
|
|
9
|
+
completes.
|
|
10
|
+
|
|
11
|
+
## Setup
|
|
12
|
+
|
|
13
|
+
```tsx
|
|
14
|
+
"use client";
|
|
15
|
+
import { useCapabilities } from "@copilotkit/react-core/v2";
|
|
16
|
+
|
|
17
|
+
export function VoiceButton() {
|
|
18
|
+
const caps = useCapabilities(); // defaults to DEFAULT_AGENT_ID
|
|
19
|
+
|
|
20
|
+
// Handshake pending — show a placeholder
|
|
21
|
+
if (caps === undefined) return <div className="skeleton h-8 w-8" />;
|
|
22
|
+
|
|
23
|
+
// Handshake complete — feature-gate
|
|
24
|
+
if (!caps.transcription) return null;
|
|
25
|
+
|
|
26
|
+
return <button>Record</button>;
|
|
27
|
+
}
|
|
28
|
+
```
|
|
29
|
+
|
|
30
|
+
## Core Patterns
|
|
31
|
+
|
|
32
|
+
### Scope to a specific agent
|
|
33
|
+
|
|
34
|
+
```tsx
|
|
35
|
+
const caps = useCapabilities("research");
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
### Feature-gate tools UI
|
|
39
|
+
|
|
40
|
+
```tsx
|
|
41
|
+
const caps = useCapabilities("default");
|
|
42
|
+
|
|
43
|
+
if (caps === undefined) return <ToolsSkeleton />;
|
|
44
|
+
if (caps.tools?.supported === false) return null;
|
|
45
|
+
return <ToolsPanel />;
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Narrow optional fields defensively
|
|
49
|
+
|
|
50
|
+
`AgentCapabilities` is a partial declaration — fields may be absent when
|
|
51
|
+
the agent opts not to declare them.
|
|
52
|
+
|
|
53
|
+
```tsx
|
|
54
|
+
const caps = useCapabilities();
|
|
55
|
+
const maxTokens = caps?.maxOutputTokens ?? "unknown";
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
## Common Mistakes
|
|
59
|
+
|
|
60
|
+
### HIGH — Treating `undefined` as "no capabilities"
|
|
61
|
+
|
|
62
|
+
Wrong:
|
|
63
|
+
|
|
64
|
+
```tsx
|
|
65
|
+
function VoiceButton() {
|
|
66
|
+
const caps = useCapabilities();
|
|
67
|
+
if (!caps?.transcription) return null; // hides button forever while handshake pending
|
|
68
|
+
return <button>Record</button>;
|
|
69
|
+
}
|
|
70
|
+
```
|
|
71
|
+
|
|
72
|
+
Correct:
|
|
73
|
+
|
|
74
|
+
```tsx
|
|
75
|
+
function VoiceButton() {
|
|
76
|
+
const caps = useCapabilities();
|
|
77
|
+
if (caps === undefined) return <div className="skeleton h-8 w-8" />;
|
|
78
|
+
if (!caps.transcription) return null;
|
|
79
|
+
return <button>Record</button>;
|
|
80
|
+
}
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
`useCapabilities` returns `undefined` until the runtime `/info` handshake
|
|
84
|
+
completes. Treating `undefined` the same as `{ transcription: false }`
|
|
85
|
+
hides features that should be visible post-handshake.
|
|
86
|
+
|
|
87
|
+
Source: `packages/react-core/src/v2/hooks/use-capabilities.tsx:7-9`
|
|
88
|
+
|
|
89
|
+
### MEDIUM — Non-null assertion on optional fields
|
|
90
|
+
|
|
91
|
+
Wrong:
|
|
92
|
+
|
|
93
|
+
```tsx
|
|
94
|
+
const caps = useCapabilities();
|
|
95
|
+
return <div>Max tokens: {caps!.maxOutputTokens}</div>;
|
|
96
|
+
// Crashes if agent didn't declare capabilities, or didn't declare maxOutputTokens.
|
|
97
|
+
```
|
|
98
|
+
|
|
99
|
+
Correct:
|
|
100
|
+
|
|
101
|
+
```tsx
|
|
102
|
+
const caps = useCapabilities();
|
|
103
|
+
return <div>Max tokens: {caps?.maxOutputTokens ?? "unknown"}</div>;
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
`AgentCapabilities` is a partial declaration. Agents opt in to each
|
|
107
|
+
capability, so every field is optional. Narrow before deref.
|
|
108
|
+
|
|
109
|
+
Source: `packages/react-core/src/v2/hooks/use-capabilities.tsx:20-22`
|
|
110
|
+
|
|
111
|
+
### MEDIUM — Expecting deep merge from server-side `capabilities`
|
|
112
|
+
|
|
113
|
+
Wrong:
|
|
114
|
+
|
|
115
|
+
```ts
|
|
116
|
+
// Server:
|
|
117
|
+
new BuiltInAgent({
|
|
118
|
+
// ...
|
|
119
|
+
capabilities: { tools: { supported: true } },
|
|
120
|
+
});
|
|
121
|
+
// Client expects caps.tools.clientProvided to still be set by the default
|
|
122
|
+
```
|
|
123
|
+
|
|
124
|
+
Correct:
|
|
125
|
+
|
|
126
|
+
```ts
|
|
127
|
+
// Server — provide full category:
|
|
128
|
+
new BuiltInAgent({
|
|
129
|
+
// ...
|
|
130
|
+
capabilities: { tools: { supported: true, clientProvided: true } },
|
|
131
|
+
});
|
|
132
|
+
```
|
|
133
|
+
|
|
134
|
+
BuiltInAgent shallow-merges capabilities at the category level — providing
|
|
135
|
+
`tools: {...}` replaces the whole category, not just the specified fields.
|
|
136
|
+
The client then sees exactly what was declared.
|
|
137
|
+
|
|
138
|
+
Source: `packages/runtime/src/agent/index.ts:821-829,883-887`
|
|
@@ -0,0 +1,221 @@
|
|
|
1
|
+
# CopilotKit Chat Components (React)
|
|
2
|
+
|
|
3
|
+
This skill builds on `copilotkit/provider-setup`. Read it first — every
|
|
4
|
+
chat component must be inside `CopilotKitProvider`.
|
|
5
|
+
|
|
6
|
+
All chat components live on `@copilotkit/react-core/v2`. The legacy
|
|
7
|
+
`@copilotkit/react-ui` package is v1-only; its `/v2` subpath is a CSS-only
|
|
8
|
+
import.
|
|
9
|
+
|
|
10
|
+
## Setup
|
|
11
|
+
|
|
12
|
+
```tsx
|
|
13
|
+
"use client";
|
|
14
|
+
import { CopilotChat } from "@copilotkit/react-core/v2";
|
|
15
|
+
import "@copilotkit/react-core/v2/styles.css";
|
|
16
|
+
|
|
17
|
+
export function ChatPanel() {
|
|
18
|
+
return <CopilotChat agentId="default" />;
|
|
19
|
+
}
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
`<CopilotChat>` manages messages, input, streaming, attachments, and
|
|
23
|
+
suggestions internally via `useAgent`. You do not pass `messages` or
|
|
24
|
+
`isRunning` — they are managed for you.
|
|
25
|
+
|
|
26
|
+
## Core Patterns
|
|
27
|
+
|
|
28
|
+
### Floating popup
|
|
29
|
+
|
|
30
|
+
```tsx
|
|
31
|
+
import { CopilotPopup } from "@copilotkit/react-core/v2";
|
|
32
|
+
|
|
33
|
+
<CopilotPopup agentId="default" isModalDefaultOpen={false} />;
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
### Persistent sidebar
|
|
37
|
+
|
|
38
|
+
```tsx
|
|
39
|
+
import { CopilotSidebar } from "@copilotkit/react-core/v2";
|
|
40
|
+
|
|
41
|
+
<CopilotSidebar agentId="default">
|
|
42
|
+
<MainAppContent />
|
|
43
|
+
</CopilotSidebar>;
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### Headless composition with slot primitives
|
|
47
|
+
|
|
48
|
+
Use `CopilotChatView` plus the individual slot components when you need
|
|
49
|
+
full control over messages, input, or layout. This is the path when you
|
|
50
|
+
want to manage `messages`/`isRunning` yourself.
|
|
51
|
+
|
|
52
|
+
```tsx
|
|
53
|
+
import {
|
|
54
|
+
CopilotChatView,
|
|
55
|
+
CopilotChatInput,
|
|
56
|
+
CopilotChatMessageView,
|
|
57
|
+
useAgent,
|
|
58
|
+
useCopilotKit,
|
|
59
|
+
} from "@copilotkit/react-core/v2";
|
|
60
|
+
|
|
61
|
+
export function HeadlessChat() {
|
|
62
|
+
const { agent } = useAgent({ agentId: "default" });
|
|
63
|
+
const { copilotkit } = useCopilotKit();
|
|
64
|
+
|
|
65
|
+
return (
|
|
66
|
+
<CopilotChatView
|
|
67
|
+
messages={agent.messages}
|
|
68
|
+
isRunning={agent.isRunning}
|
|
69
|
+
onSubmitInput={async (text) => {
|
|
70
|
+
agent.addMessage({
|
|
71
|
+
id: crypto.randomUUID(),
|
|
72
|
+
role: "user",
|
|
73
|
+
content: text,
|
|
74
|
+
});
|
|
75
|
+
await copilotkit.runAgent({ agent });
|
|
76
|
+
}}
|
|
77
|
+
>
|
|
78
|
+
<CopilotChatMessageView />
|
|
79
|
+
<CopilotChatInput />
|
|
80
|
+
</CopilotChatView>
|
|
81
|
+
);
|
|
82
|
+
}
|
|
83
|
+
```
|
|
84
|
+
|
|
85
|
+
### Custom labels
|
|
86
|
+
|
|
87
|
+
```tsx
|
|
88
|
+
<CopilotChat
|
|
89
|
+
agentId="default"
|
|
90
|
+
labels={{
|
|
91
|
+
chatInputPlaceholder: "Ask about the data…",
|
|
92
|
+
thinking: "Analyzing…",
|
|
93
|
+
}}
|
|
94
|
+
/>
|
|
95
|
+
```
|
|
96
|
+
|
|
97
|
+
## Common Mistakes
|
|
98
|
+
|
|
99
|
+
### CRITICAL — Importing `CopilotPanel`
|
|
100
|
+
|
|
101
|
+
Wrong:
|
|
102
|
+
|
|
103
|
+
```tsx
|
|
104
|
+
import { CopilotPanel } from "@copilotkit/react-core/v2";
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
Correct:
|
|
108
|
+
|
|
109
|
+
```tsx
|
|
110
|
+
import {
|
|
111
|
+
CopilotChat,
|
|
112
|
+
CopilotPopup,
|
|
113
|
+
CopilotSidebar,
|
|
114
|
+
CopilotChatView,
|
|
115
|
+
} from "@copilotkit/react-core/v2";
|
|
116
|
+
```
|
|
117
|
+
|
|
118
|
+
`CopilotPanel` does not exist in v2 (or v1). This is a common hallucination.
|
|
119
|
+
The four chat surfaces are `CopilotChat`, `CopilotPopup`, `CopilotSidebar`,
|
|
120
|
+
and the headless `CopilotChatView`.
|
|
121
|
+
|
|
122
|
+
Source: `packages/react-core/src/v2/components/chat/index.ts` (no `CopilotPanel` export)
|
|
123
|
+
|
|
124
|
+
### CRITICAL — Importing chat components from `@copilotkit/react-ui` in v2
|
|
125
|
+
|
|
126
|
+
Wrong:
|
|
127
|
+
|
|
128
|
+
```tsx
|
|
129
|
+
import { CopilotPopup } from "@copilotkit/react-ui";
|
|
130
|
+
import "@copilotkit/react-ui/styles.css";
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
Correct:
|
|
134
|
+
|
|
135
|
+
```tsx
|
|
136
|
+
import { CopilotPopup } from "@copilotkit/react-core/v2";
|
|
137
|
+
import "@copilotkit/react-core/v2/styles.css";
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
`@copilotkit/react-ui` is v1 only. The v2 subpath of `react-ui` is a
|
|
141
|
+
CSS-only import — the components are not there. All v2 chat components ship
|
|
142
|
+
from `@copilotkit/react-core/v2`.
|
|
143
|
+
|
|
144
|
+
Source: `packages/react-ui/src/v2/index.ts` (CSS-only); v2 migration guide
|
|
145
|
+
|
|
146
|
+
### HIGH — Passing `messages` or `isRunning` to `<CopilotChat>`
|
|
147
|
+
|
|
148
|
+
Wrong:
|
|
149
|
+
|
|
150
|
+
```tsx
|
|
151
|
+
<CopilotChat agentId="default" messages={myMessages} isRunning={busy} />
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
Correct:
|
|
155
|
+
|
|
156
|
+
```tsx
|
|
157
|
+
// CopilotChat manages messages and isRunning internally.
|
|
158
|
+
<CopilotChat agentId="default" />
|
|
159
|
+
|
|
160
|
+
// For manual control, drop down to headless CopilotChatView:
|
|
161
|
+
<CopilotChatView
|
|
162
|
+
messages={myMessages}
|
|
163
|
+
isRunning={busy}
|
|
164
|
+
onSubmitInput={handleSubmit}
|
|
165
|
+
>
|
|
166
|
+
<CopilotChatMessageView />
|
|
167
|
+
<CopilotChatInput />
|
|
168
|
+
</CopilotChatView>
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
`CopilotChatProps` explicitly `Omit`s `messages` and `isRunning` — passing
|
|
172
|
+
them is a TypeScript error, and `<CopilotChat>` always reads from its
|
|
173
|
+
internal `useAgent` call.
|
|
174
|
+
|
|
175
|
+
Source: `packages/react-core/src/v2/components/chat/CopilotChat.tsx:37-52`
|
|
176
|
+
|
|
177
|
+
### MEDIUM — Two `<CopilotChat>` with the same `agentId` + `threadId`
|
|
178
|
+
|
|
179
|
+
Wrong:
|
|
180
|
+
|
|
181
|
+
```tsx
|
|
182
|
+
<CopilotChat agentId="research" threadId="t1" />
|
|
183
|
+
<CopilotChat agentId="research" threadId="t1" />
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Correct:
|
|
187
|
+
|
|
188
|
+
```tsx
|
|
189
|
+
// Either use distinct threadIds...
|
|
190
|
+
<CopilotChat agentId="research" threadId="panel-a" />
|
|
191
|
+
<CopilotChat agentId="research" threadId="panel-b" />
|
|
192
|
+
|
|
193
|
+
// ...or mount only one <CopilotChat> instance per agent/thread.
|
|
194
|
+
```
|
|
195
|
+
|
|
196
|
+
Both components resolve to the same per-thread clone (cached in a
|
|
197
|
+
module-level WeakMap) and submit duplicate messages. See `agent-access` for
|
|
198
|
+
the clone semantics.
|
|
199
|
+
|
|
200
|
+
Source: `packages/react-core/src/v2/hooks/use-agent.tsx:78-119`
|
|
201
|
+
|
|
202
|
+
### MEDIUM — Missing the v2 CSS import
|
|
203
|
+
|
|
204
|
+
Wrong:
|
|
205
|
+
|
|
206
|
+
```tsx
|
|
207
|
+
import { CopilotChat } from "@copilotkit/react-core/v2";
|
|
208
|
+
// …no styles imported
|
|
209
|
+
```
|
|
210
|
+
|
|
211
|
+
Correct:
|
|
212
|
+
|
|
213
|
+
```tsx
|
|
214
|
+
import { CopilotChat } from "@copilotkit/react-core/v2";
|
|
215
|
+
import "@copilotkit/react-core/v2/styles.css";
|
|
216
|
+
```
|
|
217
|
+
|
|
218
|
+
The chat components ship unstyled without the v2 stylesheet. Import it once
|
|
219
|
+
at the root of the app or in the same file that sets up the provider.
|
|
220
|
+
|
|
221
|
+
Source: `packages/react-core/src/v2/index.ts:3` (imports `./index.css`)
|