@copilotkit/react-ui 1.10.0-next.1 → 1.10.0-next.10
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/CHANGELOG.md +104 -0
- package/dist/{chunk-O7KTFUAN.mjs → chunk-226ZMOE3.mjs} +2 -2
- package/dist/{chunk-WHDNKXMP.mjs → chunk-BJHJBS5M.mjs} +46 -6
- package/dist/chunk-BJHJBS5M.mjs.map +1 -0
- package/dist/{chunk-FOSKS7AI.mjs → chunk-FFJHOZX6.mjs} +5 -5
- package/dist/{chunk-QELAC6XJ.mjs → chunk-GBP47ONN.mjs} +2 -2
- package/dist/chunk-GBP47ONN.mjs.map +1 -0
- package/dist/{chunk-7CAK2CNK.mjs → chunk-GDSZGYCE.mjs} +2 -2
- package/dist/{chunk-O7PYQO73.mjs → chunk-GJ4SX4JE.mjs} +153 -37
- package/dist/chunk-GJ4SX4JE.mjs.map +1 -0
- package/dist/{chunk-TCIZDWPC.mjs → chunk-J5ZZR6YB.mjs} +2 -2
- package/dist/chunk-J5ZZR6YB.mjs.map +1 -0
- package/dist/{chunk-QN7T3GWI.mjs → chunk-JY2CSDKN.mjs} +4 -6
- package/dist/chunk-JY2CSDKN.mjs.map +1 -0
- package/dist/chunk-MIVUCSGO.mjs +126 -0
- package/dist/chunk-MIVUCSGO.mjs.map +1 -0
- package/dist/{chunk-OQM7D3Z3.mjs → chunk-T5QU6KSB.mjs} +8 -4
- package/dist/chunk-T5QU6KSB.mjs.map +1 -0
- package/dist/{chunk-Q2467VHZ.mjs → chunk-W26XFBEG.mjs} +2 -2
- package/dist/chunk-W26XFBEG.mjs.map +1 -0
- package/dist/chunk-Y44VLEUH.mjs +222 -0
- package/dist/chunk-Y44VLEUH.mjs.map +1 -0
- package/dist/components/chat/Chat.d.ts +52 -15
- package/dist/components/chat/Chat.js +1136 -869
- package/dist/components/chat/Chat.js.map +1 -1
- package/dist/components/chat/Chat.mjs +9 -8
- package/dist/components/chat/Header.js +6 -8
- package/dist/components/chat/Header.js.map +1 -1
- package/dist/components/chat/Header.mjs +4 -4
- package/dist/components/chat/Messages.d.ts +1 -1
- package/dist/components/chat/Messages.js +984 -23
- package/dist/components/chat/Messages.js.map +1 -1
- package/dist/components/chat/Messages.mjs +9 -1
- package/dist/components/chat/Modal.d.ts +2 -2
- package/dist/components/chat/Modal.js +1267 -931
- package/dist/components/chat/Modal.js.map +1 -1
- package/dist/components/chat/Modal.mjs +14 -13
- package/dist/components/chat/Popup.d.ts +1 -1
- package/dist/components/chat/Popup.js +1269 -933
- package/dist/components/chat/Popup.js.map +1 -1
- package/dist/components/chat/Popup.mjs +15 -14
- package/dist/components/chat/Sidebar.d.ts +1 -1
- package/dist/components/chat/Sidebar.js +1269 -933
- package/dist/components/chat/Sidebar.js.map +1 -1
- package/dist/components/chat/Sidebar.mjs +15 -14
- package/dist/components/chat/Suggestion.js +1 -1
- package/dist/components/chat/Suggestion.js.map +1 -1
- package/dist/components/chat/Suggestion.mjs +1 -1
- package/dist/components/chat/Suggestions.js +1 -1
- package/dist/components/chat/Suggestions.js.map +1 -1
- package/dist/components/chat/Suggestions.mjs +2 -2
- package/dist/components/chat/index.d.ts +2 -2
- package/dist/components/chat/index.js +1271 -935
- package/dist/components/chat/index.js.map +1 -1
- package/dist/components/chat/index.mjs +22 -21
- package/dist/components/chat/messages/LegacyRenderMessage.d.ts +28 -0
- package/dist/components/chat/messages/LegacyRenderMessage.js +980 -0
- package/dist/components/chat/messages/LegacyRenderMessage.js.map +1 -0
- package/dist/components/chat/messages/LegacyRenderMessage.mjs +17 -0
- package/dist/components/chat/messages/LegacyRenderMessage.mjs.map +1 -0
- package/dist/components/chat/messages/RenderMessage.js +4 -0
- package/dist/components/chat/messages/RenderMessage.js.map +1 -1
- package/dist/components/chat/messages/RenderMessage.mjs +2 -2
- package/dist/components/chat/props.d.ts +94 -2
- package/dist/components/chat/props.js.map +1 -1
- package/dist/components/dev-console/console.d.ts +1 -0
- package/dist/components/dev-console/console.js +6 -8
- package/dist/components/dev-console/console.js.map +1 -1
- package/dist/components/dev-console/console.mjs +3 -3
- package/dist/components/dev-console/index.d.ts +1 -3
- package/dist/components/dev-console/index.js +7 -9
- package/dist/components/dev-console/index.js.map +1 -1
- package/dist/components/dev-console/index.mjs +5 -5
- package/dist/components/dev-console/utils.d.ts +2 -2
- package/dist/components/dev-console/utils.js +2 -4
- package/dist/components/dev-console/utils.js.map +1 -1
- package/dist/components/dev-console/utils.mjs +1 -1
- package/dist/components/index.d.ts +3 -5
- package/dist/components/index.js +1272 -936
- package/dist/components/index.js.map +1 -1
- package/dist/components/index.mjs +24 -23
- package/dist/index.d.ts +3 -5
- package/dist/index.js +1303 -967
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +24 -23
- package/package.json +6 -6
- package/src/components/chat/Chat.tsx +241 -23
- package/src/components/chat/Messages.tsx +58 -5
- package/src/components/chat/Modal.tsx +128 -41
- package/src/components/chat/Popup.tsx +20 -0
- package/src/components/chat/Sidebar.tsx +22 -0
- package/src/components/chat/Suggestion.tsx +1 -1
- package/src/components/chat/messages/LegacyRenderMessage.tsx +143 -0
- package/src/components/chat/messages/RenderMessage.tsx +3 -0
- package/src/components/chat/props.ts +110 -1
- package/src/components/dev-console/utils.ts +1 -6
- package/dist/chunk-7RNOT3GM.mjs +0 -144
- package/dist/chunk-7RNOT3GM.mjs.map +0 -1
- package/dist/chunk-O7PYQO73.mjs.map +0 -1
- package/dist/chunk-OQM7D3Z3.mjs.map +0 -1
- package/dist/chunk-Q2467VHZ.mjs.map +0 -1
- package/dist/chunk-QELAC6XJ.mjs.map +0 -1
- package/dist/chunk-QN7T3GWI.mjs.map +0 -1
- package/dist/chunk-TCIZDWPC.mjs.map +0 -1
- package/dist/chunk-WHDNKXMP.mjs.map +0 -1
- /package/dist/{chunk-O7KTFUAN.mjs.map → chunk-226ZMOE3.mjs.map} +0 -0
- /package/dist/{chunk-FOSKS7AI.mjs.map → chunk-FFJHOZX6.mjs.map} +0 -0
- /package/dist/{chunk-7CAK2CNK.mjs.map → chunk-GDSZGYCE.mjs.map} +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import React, { useMemo } from "react";
|
|
2
|
-
import { ChatContextProvider } from "./ChatContext";
|
|
3
|
-
import { ButtonProps, HeaderProps, WindowProps } from "./props";
|
|
1
|
+
import React, { useMemo, useCallback, useEffect, useRef } from "react";
|
|
2
|
+
import { ChatContextProvider, useChatContext } from "./ChatContext";
|
|
3
|
+
import { ButtonProps, HeaderProps, WindowProps, CopilotObservabilityHooks } from "./props";
|
|
4
4
|
import { Window as DefaultWindow } from "./Window";
|
|
5
5
|
import { Button as DefaultButton } from "./Button";
|
|
6
6
|
import { Header as DefaultHeader } from "./Header";
|
|
@@ -9,6 +9,14 @@ import { Input as DefaultInput } from "./Input";
|
|
|
9
9
|
import { CopilotChat, CopilotChatProps } from "./Chat";
|
|
10
10
|
import { AssistantMessage as DefaultAssistantMessage } from "./messages/AssistantMessage";
|
|
11
11
|
import { UserMessage as DefaultUserMessage } from "./messages/UserMessage";
|
|
12
|
+
import { useCopilotContext } from "@copilotkit/react-core";
|
|
13
|
+
import {
|
|
14
|
+
CopilotKitError,
|
|
15
|
+
CopilotKitErrorCode,
|
|
16
|
+
Severity,
|
|
17
|
+
ErrorVisibility,
|
|
18
|
+
styledConsole,
|
|
19
|
+
} from "@copilotkit/shared";
|
|
12
20
|
|
|
13
21
|
export interface CopilotModalProps extends CopilotChatProps {
|
|
14
22
|
/**
|
|
@@ -57,6 +65,92 @@ export interface CopilotModalProps extends CopilotChatProps {
|
|
|
57
65
|
Header?: React.ComponentType<HeaderProps>;
|
|
58
66
|
}
|
|
59
67
|
|
|
68
|
+
// Inner component that has access to the Copilot context
|
|
69
|
+
const CopilotModalInner = ({
|
|
70
|
+
observabilityHooks,
|
|
71
|
+
onSetOpen,
|
|
72
|
+
clickOutsideToClose,
|
|
73
|
+
hitEscapeToClose,
|
|
74
|
+
shortcut,
|
|
75
|
+
className,
|
|
76
|
+
children,
|
|
77
|
+
Window,
|
|
78
|
+
Button,
|
|
79
|
+
Header,
|
|
80
|
+
...chatProps
|
|
81
|
+
}: Omit<CopilotModalProps, "icons" | "labels" | "defaultOpen"> & {
|
|
82
|
+
Window: React.ComponentType<WindowProps>;
|
|
83
|
+
Button: React.ComponentType<ButtonProps>;
|
|
84
|
+
Header: React.ComponentType<HeaderProps>;
|
|
85
|
+
clickOutsideToClose: boolean;
|
|
86
|
+
hitEscapeToClose: boolean;
|
|
87
|
+
shortcut: string;
|
|
88
|
+
}) => {
|
|
89
|
+
const { copilotApiConfig, setBannerError } = useCopilotContext();
|
|
90
|
+
|
|
91
|
+
// Destructure stable values to avoid object reference changes
|
|
92
|
+
const { publicApiKey } = copilotApiConfig;
|
|
93
|
+
|
|
94
|
+
// Helper function to trigger event hooks only if publicApiKey is provided
|
|
95
|
+
const triggerObservabilityHook = useCallback(
|
|
96
|
+
(hookName: keyof CopilotObservabilityHooks, ...args: any[]) => {
|
|
97
|
+
if (publicApiKey && observabilityHooks?.[hookName]) {
|
|
98
|
+
(observabilityHooks[hookName] as any)(...args);
|
|
99
|
+
}
|
|
100
|
+
if (observabilityHooks?.[hookName] && !publicApiKey) {
|
|
101
|
+
setBannerError(
|
|
102
|
+
new CopilotKitError({
|
|
103
|
+
message: "observabilityHooks requires a publicApiKey to function.",
|
|
104
|
+
code: CopilotKitErrorCode.MISSING_PUBLIC_API_KEY_ERROR,
|
|
105
|
+
severity: Severity.CRITICAL,
|
|
106
|
+
visibility: ErrorVisibility.BANNER,
|
|
107
|
+
}),
|
|
108
|
+
);
|
|
109
|
+
styledConsole.publicApiKeyRequired("observabilityHooks");
|
|
110
|
+
}
|
|
111
|
+
},
|
|
112
|
+
[publicApiKey, observabilityHooks, setBannerError],
|
|
113
|
+
);
|
|
114
|
+
|
|
115
|
+
const { open } = useChatContext();
|
|
116
|
+
const prevOpen = useRef(open);
|
|
117
|
+
|
|
118
|
+
// Monitor open state changes and trigger event hooks
|
|
119
|
+
useEffect(() => {
|
|
120
|
+
if (prevOpen.current !== open) {
|
|
121
|
+
onSetOpen?.(open);
|
|
122
|
+
|
|
123
|
+
// Trigger chat minimize/expand events
|
|
124
|
+
if (open) {
|
|
125
|
+
triggerObservabilityHook("onChatExpanded");
|
|
126
|
+
} else {
|
|
127
|
+
triggerObservabilityHook("onChatMinimized");
|
|
128
|
+
}
|
|
129
|
+
prevOpen.current = open;
|
|
130
|
+
}
|
|
131
|
+
}, [open, onSetOpen, triggerObservabilityHook]);
|
|
132
|
+
|
|
133
|
+
const memoizedHeader = useMemo(() => <Header />, [Header]);
|
|
134
|
+
const memoizedChildren = useMemo(() => children, [children]);
|
|
135
|
+
|
|
136
|
+
return (
|
|
137
|
+
<>
|
|
138
|
+
{memoizedChildren}
|
|
139
|
+
<div className={className}>
|
|
140
|
+
<Button></Button>
|
|
141
|
+
<Window
|
|
142
|
+
clickOutsideToClose={clickOutsideToClose}
|
|
143
|
+
shortcut={shortcut}
|
|
144
|
+
hitEscapeToClose={hitEscapeToClose}
|
|
145
|
+
>
|
|
146
|
+
{memoizedHeader}
|
|
147
|
+
<CopilotChat {...chatProps} observabilityHooks={observabilityHooks} />
|
|
148
|
+
</Window>
|
|
149
|
+
</div>
|
|
150
|
+
</>
|
|
151
|
+
);
|
|
152
|
+
};
|
|
153
|
+
|
|
60
154
|
export const CopilotModal = ({
|
|
61
155
|
instructions,
|
|
62
156
|
defaultOpen = false,
|
|
@@ -85,49 +179,42 @@ export const CopilotModal = ({
|
|
|
85
179
|
markdownTagRenderers,
|
|
86
180
|
className,
|
|
87
181
|
children,
|
|
182
|
+
observabilityHooks,
|
|
88
183
|
...props
|
|
89
184
|
}: CopilotModalProps) => {
|
|
90
185
|
const [openState, setOpenState] = React.useState(defaultOpen);
|
|
91
186
|
|
|
92
|
-
const setOpen = (open: boolean) => {
|
|
93
|
-
onSetOpen?.(open);
|
|
94
|
-
setOpenState(open);
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
const memoizedHeader = useMemo(() => <Header />, [Header]);
|
|
98
|
-
const memoizedChildren = useMemo(() => children, [children]);
|
|
99
|
-
|
|
100
187
|
return (
|
|
101
|
-
<ChatContextProvider icons={icons} labels={labels} open={openState} setOpen={
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
</
|
|
188
|
+
<ChatContextProvider icons={icons} labels={labels} open={openState} setOpen={setOpenState}>
|
|
189
|
+
<CopilotModalInner
|
|
190
|
+
observabilityHooks={observabilityHooks}
|
|
191
|
+
onSetOpen={onSetOpen}
|
|
192
|
+
clickOutsideToClose={clickOutsideToClose ?? true}
|
|
193
|
+
hitEscapeToClose={hitEscapeToClose ?? true}
|
|
194
|
+
shortcut={shortcut ?? "/"}
|
|
195
|
+
className={className}
|
|
196
|
+
Window={Window}
|
|
197
|
+
Button={Button}
|
|
198
|
+
Header={Header}
|
|
199
|
+
instructions={instructions}
|
|
200
|
+
onSubmitMessage={onSubmitMessage}
|
|
201
|
+
onStopGeneration={onStopGeneration}
|
|
202
|
+
onReloadMessages={onReloadMessages}
|
|
203
|
+
makeSystemMessage={makeSystemMessage}
|
|
204
|
+
onInProgress={onInProgress}
|
|
205
|
+
Messages={Messages}
|
|
206
|
+
Input={Input}
|
|
207
|
+
AssistantMessage={AssistantMessage}
|
|
208
|
+
UserMessage={UserMessage}
|
|
209
|
+
onThumbsUp={onThumbsUp}
|
|
210
|
+
onThumbsDown={onThumbsDown}
|
|
211
|
+
onCopy={onCopy}
|
|
212
|
+
onRegenerate={onRegenerate}
|
|
213
|
+
markdownTagRenderers={markdownTagRenderers}
|
|
214
|
+
{...props}
|
|
215
|
+
>
|
|
216
|
+
{children}
|
|
217
|
+
</CopilotModalInner>
|
|
131
218
|
</ChatContextProvider>
|
|
132
219
|
);
|
|
133
220
|
};
|
|
@@ -28,6 +28,26 @@
|
|
|
28
28
|
* />
|
|
29
29
|
* ```
|
|
30
30
|
*
|
|
31
|
+
* ### With Observability Hooks
|
|
32
|
+
*
|
|
33
|
+
* To monitor user interactions, provide the `observabilityHooks` prop.
|
|
34
|
+
* **Note:** This requires a `publicApiKey` in the `<CopilotKit>` provider.
|
|
35
|
+
*
|
|
36
|
+
* ```tsx
|
|
37
|
+
* <CopilotKit publicApiKey="YOUR_PUBLIC_API_KEY">
|
|
38
|
+
* <CopilotPopup
|
|
39
|
+
* observabilityHooks={{
|
|
40
|
+
* onChatExpanded: () => {
|
|
41
|
+
* console.log("Popup opened");
|
|
42
|
+
* },
|
|
43
|
+
* onChatMinimized: () => {
|
|
44
|
+
* console.log("Popup closed");
|
|
45
|
+
* },
|
|
46
|
+
* }}
|
|
47
|
+
* />
|
|
48
|
+
* </CopilotKit>
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
31
51
|
* ### Look & Feel
|
|
32
52
|
*
|
|
33
53
|
* By default, CopilotKit components do not have any styles. You can import CopilotKit's stylesheet at the root of your project:
|
|
@@ -30,6 +30,28 @@
|
|
|
30
30
|
* </CopilotSidebar>
|
|
31
31
|
* ```
|
|
32
32
|
*
|
|
33
|
+
* ### With Observability Hooks
|
|
34
|
+
*
|
|
35
|
+
* To monitor user interactions, provide the `observabilityHooks` prop.
|
|
36
|
+
* **Note:** This requires a `publicApiKey` in the `<CopilotKit>` provider.
|
|
37
|
+
*
|
|
38
|
+
* ```tsx
|
|
39
|
+
* <CopilotKit publicApiKey="YOUR_PUBLIC_API_KEY">
|
|
40
|
+
* <CopilotSidebar
|
|
41
|
+
* observabilityHooks={{
|
|
42
|
+
* onChatExpanded: () => {
|
|
43
|
+
* console.log("Sidebar opened");
|
|
44
|
+
* },
|
|
45
|
+
* onChatMinimized: () => {
|
|
46
|
+
* console.log("Sidebar closed");
|
|
47
|
+
* },
|
|
48
|
+
* }}
|
|
49
|
+
* >
|
|
50
|
+
* <YourApp/>
|
|
51
|
+
* </CopilotSidebar>
|
|
52
|
+
* </CopilotKit>
|
|
53
|
+
* ```
|
|
54
|
+
*
|
|
33
55
|
* ### Look & Feel
|
|
34
56
|
*
|
|
35
57
|
* By default, CopilotKit components do not have any styles. You can import CopilotKit's stylesheet at the root of your project:
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
import React from "react";
|
|
2
|
+
import { RenderMessageProps } from "../props";
|
|
3
|
+
import { RenderMessage as DefaultRenderMessage } from "./RenderMessage";
|
|
4
|
+
import { aguiToGQL } from "@copilotkit/runtime-client-gql";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Legacy message render props interface for backwards compatibility
|
|
8
|
+
*/
|
|
9
|
+
export interface LegacyRenderProps {
|
|
10
|
+
RenderTextMessage?: React.ComponentType<RenderMessageProps>;
|
|
11
|
+
RenderActionExecutionMessage?: React.ComponentType<RenderMessageProps>;
|
|
12
|
+
RenderAgentStateMessage?: React.ComponentType<RenderMessageProps>;
|
|
13
|
+
RenderResultMessage?: React.ComponentType<RenderMessageProps>;
|
|
14
|
+
RenderImageMessage?: React.ComponentType<RenderMessageProps>;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* Props for the LegacyRenderMessage component
|
|
19
|
+
*/
|
|
20
|
+
export interface LegacyRenderMessageProps extends RenderMessageProps {
|
|
21
|
+
legacyProps: LegacyRenderProps;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Legacy message adapter component that maps old render props to new message types.
|
|
26
|
+
* This component provides backwards compatibility for the deprecated render props.
|
|
27
|
+
*/
|
|
28
|
+
export const LegacyRenderMessage: React.FC<LegacyRenderMessageProps> = ({
|
|
29
|
+
message,
|
|
30
|
+
inProgress,
|
|
31
|
+
index,
|
|
32
|
+
isCurrentMessage,
|
|
33
|
+
actionResult,
|
|
34
|
+
AssistantMessage,
|
|
35
|
+
UserMessage,
|
|
36
|
+
ImageRenderer,
|
|
37
|
+
onRegenerate,
|
|
38
|
+
onCopy,
|
|
39
|
+
onThumbsUp,
|
|
40
|
+
onThumbsDown,
|
|
41
|
+
markdownTagRenderers,
|
|
42
|
+
legacyProps,
|
|
43
|
+
}) => {
|
|
44
|
+
const {
|
|
45
|
+
RenderTextMessage,
|
|
46
|
+
RenderActionExecutionMessage,
|
|
47
|
+
RenderAgentStateMessage,
|
|
48
|
+
RenderResultMessage,
|
|
49
|
+
RenderImageMessage,
|
|
50
|
+
} = legacyProps;
|
|
51
|
+
|
|
52
|
+
const deprecatedMessage = aguiToGQL(message)[0] ?? undefined;
|
|
53
|
+
|
|
54
|
+
// Route to appropriate legacy renderer based on message type
|
|
55
|
+
if (deprecatedMessage.isTextMessage() && RenderTextMessage) {
|
|
56
|
+
return (
|
|
57
|
+
<RenderTextMessage
|
|
58
|
+
message={message}
|
|
59
|
+
inProgress={inProgress}
|
|
60
|
+
index={index}
|
|
61
|
+
isCurrentMessage={isCurrentMessage}
|
|
62
|
+
AssistantMessage={AssistantMessage}
|
|
63
|
+
UserMessage={UserMessage}
|
|
64
|
+
onRegenerate={onRegenerate}
|
|
65
|
+
onCopy={onCopy}
|
|
66
|
+
onThumbsUp={onThumbsUp}
|
|
67
|
+
onThumbsDown={onThumbsDown}
|
|
68
|
+
markdownTagRenderers={markdownTagRenderers}
|
|
69
|
+
/>
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (deprecatedMessage.isActionExecutionMessage() && RenderActionExecutionMessage) {
|
|
74
|
+
return (
|
|
75
|
+
<RenderActionExecutionMessage
|
|
76
|
+
message={message}
|
|
77
|
+
inProgress={inProgress}
|
|
78
|
+
index={index}
|
|
79
|
+
isCurrentMessage={isCurrentMessage}
|
|
80
|
+
actionResult={actionResult}
|
|
81
|
+
AssistantMessage={AssistantMessage}
|
|
82
|
+
UserMessage={UserMessage}
|
|
83
|
+
/>
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
if (deprecatedMessage.isAgentStateMessage() && RenderAgentStateMessage) {
|
|
88
|
+
return (
|
|
89
|
+
<RenderAgentStateMessage
|
|
90
|
+
message={message}
|
|
91
|
+
inProgress={inProgress}
|
|
92
|
+
index={index}
|
|
93
|
+
isCurrentMessage={isCurrentMessage}
|
|
94
|
+
AssistantMessage={AssistantMessage}
|
|
95
|
+
UserMessage={UserMessage}
|
|
96
|
+
/>
|
|
97
|
+
);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (deprecatedMessage.isResultMessage() && RenderResultMessage) {
|
|
101
|
+
return (
|
|
102
|
+
<RenderResultMessage
|
|
103
|
+
message={message}
|
|
104
|
+
inProgress={inProgress}
|
|
105
|
+
index={index}
|
|
106
|
+
isCurrentMessage={isCurrentMessage}
|
|
107
|
+
AssistantMessage={AssistantMessage}
|
|
108
|
+
UserMessage={UserMessage}
|
|
109
|
+
/>
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
if (deprecatedMessage.isImageMessage() && RenderImageMessage) {
|
|
114
|
+
return (
|
|
115
|
+
<RenderImageMessage
|
|
116
|
+
message={message}
|
|
117
|
+
inProgress={inProgress}
|
|
118
|
+
index={index}
|
|
119
|
+
isCurrentMessage={isCurrentMessage}
|
|
120
|
+
AssistantMessage={AssistantMessage}
|
|
121
|
+
UserMessage={UserMessage}
|
|
122
|
+
/>
|
|
123
|
+
);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// Fallback to default RenderMessage for any unhandled cases
|
|
127
|
+
return (
|
|
128
|
+
<DefaultRenderMessage
|
|
129
|
+
message={message}
|
|
130
|
+
inProgress={inProgress}
|
|
131
|
+
index={index}
|
|
132
|
+
isCurrentMessage={isCurrentMessage}
|
|
133
|
+
AssistantMessage={AssistantMessage}
|
|
134
|
+
UserMessage={UserMessage}
|
|
135
|
+
ImageRenderer={ImageRenderer}
|
|
136
|
+
onRegenerate={onRegenerate}
|
|
137
|
+
onCopy={onCopy}
|
|
138
|
+
onThumbsUp={onThumbsUp}
|
|
139
|
+
onThumbsDown={onThumbsDown}
|
|
140
|
+
markdownTagRenderers={markdownTagRenderers}
|
|
141
|
+
/>
|
|
142
|
+
);
|
|
143
|
+
};
|
|
@@ -26,6 +26,7 @@ export function RenderMessage({
|
|
|
26
26
|
return (
|
|
27
27
|
<UserMessage
|
|
28
28
|
key={index}
|
|
29
|
+
rawData={message}
|
|
29
30
|
data-message-role="user"
|
|
30
31
|
message={message}
|
|
31
32
|
ImageRenderer={ImageRenderer}
|
|
@@ -36,6 +37,8 @@ export function RenderMessage({
|
|
|
36
37
|
<AssistantMessage
|
|
37
38
|
key={index}
|
|
38
39
|
data-message-role="assistant"
|
|
40
|
+
subComponent={message.generativeUI?.()}
|
|
41
|
+
rawData={message}
|
|
39
42
|
message={message}
|
|
40
43
|
isLoading={inProgress && isCurrentMessage && !message.content}
|
|
41
44
|
isGenerating={inProgress && isCurrentMessage && !!message.content}
|
|
@@ -1,8 +1,60 @@
|
|
|
1
|
-
import { AIMessage, Message, UserMessage } from "@copilotkit/shared";
|
|
1
|
+
import { AIMessage, Message, UserMessage, CopilotErrorEvent } from "@copilotkit/shared";
|
|
2
2
|
import { CopilotChatSuggestion } from "../../types/suggestions";
|
|
3
3
|
import { ReactNode } from "react";
|
|
4
4
|
import { ImageData } from "@copilotkit/shared";
|
|
5
5
|
|
|
6
|
+
/**
|
|
7
|
+
* Event hooks for CopilotKit chat events.
|
|
8
|
+
* These hooks only work when publicApiKey is provided.
|
|
9
|
+
*/
|
|
10
|
+
export interface CopilotObservabilityHooks {
|
|
11
|
+
/**
|
|
12
|
+
* Called when a message is sent by the user
|
|
13
|
+
*/
|
|
14
|
+
onMessageSent?: (message: string) => void;
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Called when the chat is minimized/closed
|
|
18
|
+
*/
|
|
19
|
+
onChatMinimized?: () => void;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Called when the chat is expanded/opened
|
|
23
|
+
*/
|
|
24
|
+
onChatExpanded?: () => void;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Called when a message is regenerated
|
|
28
|
+
*/
|
|
29
|
+
onMessageRegenerated?: (messageId: string) => void;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Called when a message is copied
|
|
33
|
+
*/
|
|
34
|
+
onMessageCopied?: (content: string) => void;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Called when feedback is given (thumbs up/down)
|
|
38
|
+
*/
|
|
39
|
+
onFeedbackGiven?: (messageId: string, type: "thumbsUp" | "thumbsDown") => void;
|
|
40
|
+
|
|
41
|
+
/**
|
|
42
|
+
* Called when chat generation starts
|
|
43
|
+
*/
|
|
44
|
+
onChatStarted?: () => void;
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Called when chat generation stops
|
|
48
|
+
*/
|
|
49
|
+
onChatStopped?: () => void;
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Called when an error occurs in the chat
|
|
53
|
+
* This enables chat-specific error handling UX while preserving system-wide error monitoring
|
|
54
|
+
*/
|
|
55
|
+
onError?: (errorEvent: CopilotErrorEvent) => void;
|
|
56
|
+
}
|
|
57
|
+
|
|
6
58
|
export interface ButtonProps {}
|
|
7
59
|
|
|
8
60
|
export interface WindowProps {
|
|
@@ -60,6 +112,31 @@ export interface MessagesProps {
|
|
|
60
112
|
* Useful when you want to render custom elements in the message (e.g a reference tag element)
|
|
61
113
|
*/
|
|
62
114
|
markdownTagRenderers?: ComponentsMap;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* @deprecated Use RenderMessage instead
|
|
118
|
+
*/
|
|
119
|
+
RenderTextMessage?: React.ComponentType<RenderMessageProps>;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* @deprecated Use RenderMessage instead
|
|
123
|
+
*/
|
|
124
|
+
RenderActionExecutionMessage?: React.ComponentType<RenderMessageProps>;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* @deprecated Use RenderMessage instead
|
|
128
|
+
*/
|
|
129
|
+
RenderAgentStateMessage?: React.ComponentType<RenderMessageProps>;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* @deprecated Use RenderMessage instead
|
|
133
|
+
*/
|
|
134
|
+
RenderResultMessage?: React.ComponentType<RenderMessageProps>;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* @deprecated Use RenderMessage instead
|
|
138
|
+
*/
|
|
139
|
+
RenderImageMessage?: React.ComponentType<RenderMessageProps>;
|
|
63
140
|
}
|
|
64
141
|
|
|
65
142
|
export interface Renderer {
|
|
@@ -69,6 +146,13 @@ export interface Renderer {
|
|
|
69
146
|
export interface UserMessageProps {
|
|
70
147
|
message?: UserMessage;
|
|
71
148
|
ImageRenderer: React.ComponentType<ImageRendererProps>;
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* @deprecated use message instead
|
|
152
|
+
*
|
|
153
|
+
* The raw data from the assistant's response
|
|
154
|
+
*/
|
|
155
|
+
rawData: any;
|
|
72
156
|
}
|
|
73
157
|
|
|
74
158
|
export interface AssistantMessageProps {
|
|
@@ -123,6 +207,31 @@ export interface AssistantMessageProps {
|
|
|
123
207
|
* A custom image rendering component to use instead of the default.
|
|
124
208
|
*/
|
|
125
209
|
ImageRenderer?: React.ComponentType<ImageRendererProps>;
|
|
210
|
+
|
|
211
|
+
/**
|
|
212
|
+
* @deprecated use message instead
|
|
213
|
+
*
|
|
214
|
+
* The raw data from the assistant's response
|
|
215
|
+
*/
|
|
216
|
+
rawData: any;
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
*
|
|
220
|
+
* @deprecated
|
|
221
|
+
*
|
|
222
|
+
* use `message.generativeUI()` instead.
|
|
223
|
+
*
|
|
224
|
+
* For example:
|
|
225
|
+
*
|
|
226
|
+
* ```tsx
|
|
227
|
+
* const CustomAssistantMessage = ({ message }: AssistantMessageProps) => {
|
|
228
|
+
* const subComponent = message?.generativeUI?.();
|
|
229
|
+
* return <div>{subComponent}</div>;
|
|
230
|
+
* };
|
|
231
|
+
*
|
|
232
|
+
* ```
|
|
233
|
+
*/
|
|
234
|
+
subComponent?: React.JSX.Element;
|
|
126
235
|
}
|
|
127
236
|
|
|
128
237
|
export interface RenderMessageProps {
|
|
@@ -4,12 +4,7 @@ import {
|
|
|
4
4
|
defaultCopilotContextCategories,
|
|
5
5
|
} from "@copilotkit/react-core";
|
|
6
6
|
import { CopilotKitVersion } from "./types";
|
|
7
|
-
|
|
8
|
-
import { AgentStateMessage } from "@copilotkit/runtime-client-gql";
|
|
9
|
-
|
|
10
|
-
export function shouldShowDevConsole(showDevConsole: boolean): boolean {
|
|
11
|
-
return showDevConsole;
|
|
12
|
-
}
|
|
7
|
+
export { shouldShowDevConsole } from "@copilotkit/react-core";
|
|
13
8
|
|
|
14
9
|
export async function getPublishedCopilotKitVersion(
|
|
15
10
|
current: string,
|