@agentscope-ai/chat 1.1.20 → 1.1.22
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/bin/client.js +1 -1
- package/components/AGUI/components/HelpModal/icons.tsx +68 -0
- package/components/AGUI/components/HelpModal/index.tsx +1 -0
- package/components/AGUI/components/HelpModal/modal.tsx +101 -0
- package/components/AGUI/components/chat/Button.tsx +18 -0
- package/components/AGUI/components/chat/Chat.tsx +780 -0
- package/components/AGUI/components/chat/ChatContext.tsx +248 -0
- package/components/AGUI/components/chat/CodeBlock.tsx +406 -0
- package/components/AGUI/components/chat/Header.tsx +22 -0
- package/components/AGUI/components/chat/Icons.tsx +237 -0
- package/components/AGUI/components/chat/ImageUploadQueue.tsx +77 -0
- package/components/AGUI/components/chat/Input.tsx +24 -0
- package/components/AGUI/components/chat/Markdown.tsx +134 -0
- package/components/AGUI/components/chat/Messages.tsx +259 -0
- package/components/AGUI/components/chat/Modal.tsx +133 -0
- package/components/AGUI/components/chat/Popup.tsx +57 -0
- package/components/AGUI/components/chat/PoweredByTag.tsx +29 -0
- package/components/AGUI/components/chat/Sidebar.tsx +74 -0
- package/components/AGUI/components/chat/Suggestion.tsx +132 -0
- package/components/AGUI/components/chat/Suggestions.tsx +20 -0
- package/components/AGUI/components/chat/Textarea.tsx +61 -0
- package/components/AGUI/components/chat/Window.tsx +152 -0
- package/components/AGUI/components/chat/index.tsx +11 -0
- package/components/AGUI/components/chat/messages/AssistantMessage.tsx +69 -0
- package/components/AGUI/components/chat/messages/RenderActionExecutionMessage.tsx +129 -0
- package/components/AGUI/components/chat/messages/RenderAgentStateMessage.tsx +116 -0
- package/components/AGUI/components/chat/messages/RenderImageMessage.tsx +64 -0
- package/components/AGUI/components/chat/messages/RenderResultMessage.tsx +26 -0
- package/components/AGUI/components/chat/messages/RenderTextMessage.tsx +51 -0
- package/components/AGUI/components/chat/messages/UserMessage.tsx +10 -0
- package/components/AGUI/components/chat/props.ts +186 -0
- package/components/AGUI/components/index.ts +1 -0
- package/components/AGUI/context/index.ts +1 -0
- package/components/AGUI/hooks/index.ts +1 -0
- package/components/AGUI/hooks/use-copilot-chat-suggestions.tsx +122 -0
- package/components/AGUI/hooks/use-copy-to-clipboard.tsx +29 -0
- package/components/AGUI/hooks/use-dark-mode.ts +10 -0
- package/components/AGUI/hooks/use-push-to-talk.tsx +166 -0
- package/components/AGUI/index.tsx +4 -0
- package/components/AGUI/lib/utils.test.ts +7 -0
- package/components/AGUI/lib/utils.ts +27 -0
- package/components/AGUI/styles.css +0 -0
- package/components/AGUI/types/css.ts +0 -0
- package/components/AGUI/types/index.ts +1 -0
- package/components/AGUI/types/suggestions.ts +6 -0
- package/components/Accordion/Accordion.tsx +203 -0
- package/components/Accordion/BodyContent.tsx +28 -0
- package/components/Accordion/DeepThinking.tsx +91 -0
- package/components/Accordion/SoftLightTitle.tsx +13 -0
- package/components/Accordion/demo/search.tsx +39 -0
- package/components/Accordion/demo/steps.tsx +135 -0
- package/components/Accordion/demo/thinking.tsx +62 -0
- package/components/Accordion/index.en-US.md +34 -0
- package/components/Accordion/index.tsx +3 -0
- package/components/Accordion/index.zh-CN.md +34 -0
- package/components/Accordion/style.ts +208 -0
- package/components/AgentScopeRuntimeWebUI/demo/index.tsx +4 -0
- package/components/AgentScopeRuntimeWebUI/index.tsx +3 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Request/Builder.tsx +82 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Request/Card.tsx +52 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Response/Actions.tsx +39 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Response/Builder.tsx +205 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Response/Card.tsx +44 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Response/Error.tsx +7 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Response/Message.tsx +23 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Response/Reasoning.tsx +16 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/Response/Tool.tsx +19 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/index.tsx +0 -0
- package/components/AgentScopeRuntimeWebUI/lib/AgentScopeRuntime/types.tsx +100 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/Input/index.tsx +77 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/Input/useAttachments.tsx +53 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/MessageList/index.tsx +30 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/Welcome/index.tsx +66 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/Welcome/styles.ts +51 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/hooks/index.tsx +5 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/hooks/useChatController.tsx +130 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/hooks/useChatMessageHandler.tsx +87 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/hooks/useChatRequest.tsx +114 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/hooks/useChatSessionHandler.tsx +50 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/index.tsx +18 -0
- package/components/AgentScopeRuntimeWebUI/lib/Chat/styles.tsx +59 -0
- package/components/AgentScopeRuntimeWebUI/lib/ChatAnywhere/ComposedProvider.tsx +27 -0
- package/components/AgentScopeRuntimeWebUI/lib/ChatAnywhere/index.tsx +29 -0
- package/components/AgentScopeRuntimeWebUI/lib/Context/ChatAnywhereControl.tsx +0 -0
- package/components/AgentScopeRuntimeWebUI/lib/Context/ChatAnywhereInputContext.tsx +27 -0
- package/components/AgentScopeRuntimeWebUI/lib/Context/ChatAnywhereLayoutContext.tsx +27 -0
- package/components/AgentScopeRuntimeWebUI/lib/Context/ChatAnywhereMessagesContext.tsx +82 -0
- package/components/AgentScopeRuntimeWebUI/lib/Context/ChatAnywhereOptionsContext.tsx +76 -0
- package/components/AgentScopeRuntimeWebUI/lib/Context/ChatAnywhereSessionsContext.tsx +111 -0
- package/components/AgentScopeRuntimeWebUI/lib/Context/useChatAnywhereEventEmitter.tsx +30 -0
- package/components/AgentScopeRuntimeWebUI/lib/Header/index.tsx +45 -0
- package/components/AgentScopeRuntimeWebUI/lib/Header/styles.ts +23 -0
- package/components/AgentScopeRuntimeWebUI/lib/Layout/index.tsx +45 -0
- package/components/AgentScopeRuntimeWebUI/lib/Layout/styles.tsx +104 -0
- package/components/AgentScopeRuntimeWebUI/lib/Sessions/index.tsx +114 -0
- package/components/AgentScopeRuntimeWebUI/lib/Sessions/styles.tsx +0 -0
- package/components/AgentScopeRuntimeWebUI/lib/demo/OptionsPanel/FormItem.tsx +37 -0
- package/components/AgentScopeRuntimeWebUI/lib/demo/OptionsPanel/OptionsEditor.tsx +163 -0
- package/components/AgentScopeRuntimeWebUI/lib/demo/OptionsPanel/defaultConfig.ts +43 -0
- package/components/AgentScopeRuntimeWebUI/lib/demo/OptionsPanel/index.tsx +27 -0
- package/components/AgentScopeRuntimeWebUI/lib/demo/index.tsx +57 -0
- package/components/AgentScopeRuntimeWebUI/lib/demo/sessionApi/index.ts +51 -0
- package/components/AgentScopeRuntimeWebUI/lib/types/IChatAnywhere.ts +358 -0
- package/components/AgentScopeRuntimeWebUI/lib/types/IMessages.tsx +52 -0
- package/components/AgentScopeRuntimeWebUI/lib/types/ISessions.tsx +29 -0
- package/components/AgentScopeRuntimeWebUI/lib/types/index.tsx +3 -0
- package/components/AgentScopeRuntimeWebUI/starter/OptionsPanel/FormItem.tsx +37 -0
- package/components/AgentScopeRuntimeWebUI/starter/OptionsPanel/OptionsEditor.tsx +163 -0
- package/components/AgentScopeRuntimeWebUI/starter/OptionsPanel/defaultConfig.ts +43 -0
- package/components/AgentScopeRuntimeWebUI/starter/OptionsPanel/index.tsx +27 -0
- package/components/AgentScopeRuntimeWebUI/starter/index.tsx +57 -0
- package/components/AgentScopeRuntimeWebUI/starter/sessionApi/index.ts +51 -0
- package/components/Attachments/DropArea.tsx +97 -0
- package/components/Attachments/FileList/AudioIcon.tsx +20 -0
- package/components/Attachments/FileList/FileListCard.tsx +270 -0
- package/components/Attachments/FileList/Progress.tsx +30 -0
- package/components/Attachments/FileList/VideoIcon.tsx +20 -0
- package/components/Attachments/FileList/index.tsx +201 -0
- package/components/Attachments/PlaceholderUploader.tsx +124 -0
- package/components/Attachments/SilentUploader.tsx +39 -0
- package/components/Attachments/context.tsx +11 -0
- package/components/Attachments/demo/basic.tsx +71 -0
- package/components/Attachments/index.en-US.md.bk +10 -0
- package/components/Attachments/index.tsx +274 -0
- package/components/Attachments/index.zh-CN.md.bk +10 -0
- package/components/Attachments/style/fileCard.ts +163 -0
- package/components/Attachments/style/index.ts +232 -0
- package/components/Attachments/util.ts +56 -0
- package/components/Bubble/Avatar.tsx +39 -0
- package/components/Bubble/Bubble.tsx +131 -0
- package/components/Bubble/BubbleList.tsx +105 -0
- package/components/Bubble/Cards.tsx +61 -0
- package/components/Bubble/Footer.tsx +55 -0
- package/components/Bubble/Interrupted.tsx +82 -0
- package/components/Bubble/ScrollToBottom.tsx +42 -0
- package/components/Bubble/Spin.tsx +13 -0
- package/components/Bubble/demo/assistantWithCode.tsx +60 -0
- package/components/Bubble/demo/assistantWithErrorStatus.tsx +102 -0
- package/components/Bubble/demo/assistantWithImage.tsx +46 -0
- package/components/Bubble/demo/assistantWithProcess.tsx +103 -0
- package/components/Bubble/demo/assistantWithSearch.tsx +69 -0
- package/components/Bubble/demo/assistantWithThinking.tsx +54 -0
- package/components/Bubble/demo/basic.tsx +55 -0
- package/components/Bubble/demo/userWithFile.tsx +27 -0
- package/components/Bubble/demo/userWithImage.tsx +26 -0
- package/components/Bubble/hooks/useDisplayData.ts +0 -0
- package/components/Bubble/hooks/useListData.ts +0 -0
- package/components/Bubble/index.en-US.md +33 -0
- package/components/Bubble/index.tsx +21 -0
- package/components/Bubble/index.zh-CN.md +33 -0
- package/components/Bubble/interface.ts +71 -0
- package/components/Bubble/loading.tsx +15 -0
- package/components/Bubble/style/avatar.ts +43 -0
- package/components/Bubble/style/footer.ts +45 -0
- package/components/Bubble/style/index.ts +192 -0
- package/components/Bubble/style/list.ts +51 -0
- package/components/ChatAnywhere/Chat/Ref.tsx +20 -0
- package/components/ChatAnywhere/Chat/index.tsx +56 -0
- package/components/ChatAnywhere/Chat/style.ts +59 -0
- package/components/ChatAnywhere/Header/index.tsx +37 -0
- package/components/ChatAnywhere/Header/style.ts +27 -0
- package/components/ChatAnywhere/Input/index.tsx +158 -0
- package/components/ChatAnywhere/Input/style.ts +14 -0
- package/components/ChatAnywhere/Layout/index.tsx +70 -0
- package/components/ChatAnywhere/Layout/style.ts +51 -0
- package/components/ChatAnywhere/SessionList/index.tsx +122 -0
- package/components/ChatAnywhere/SessionList/style.ts +53 -0
- package/components/ChatAnywhere/hooks/ChatAnywhereProvider.tsx +219 -0
- package/components/ChatAnywhere/hooks/types.ts +333 -0
- package/components/ChatAnywhere/hooks/useInput.tsx +22 -0
- package/components/ChatAnywhere/hooks/useMessages.tsx +63 -0
- package/components/ChatAnywhere/hooks/useSessionList.tsx +123 -0
- package/components/ChatAnywhere/index.tsx +49 -0
- package/components/Conversations/GroupTitle.tsx +28 -0
- package/components/Conversations/Item.tsx +189 -0
- package/components/Conversations/demo/basic.tsx +107 -0
- package/components/Conversations/demo/timeline.tsx +111 -0
- package/components/Conversations/demo/timestamp.tsx +110 -0
- package/components/Conversations/hooks/useGroupable.ts +81 -0
- package/components/Conversations/index.en-US.md +32 -0
- package/components/Conversations/index.tsx +176 -0
- package/components/Conversations/index.zh-CN.md +31 -0
- package/components/Conversations/interface.ts +69 -0
- package/components/Conversations/style.ts +153 -0
- package/components/DefaultCards/DeepThinking/index.tsx +33 -0
- package/components/DefaultCards/Files/index.tsx +69 -0
- package/components/DefaultCards/Footer/index.tsx +16 -0
- package/components/DefaultCards/Images/index.tsx +53 -0
- package/components/DefaultCards/Interrupted/index.tsx +13 -0
- package/components/DefaultCards/Text/index.tsx +13 -0
- package/components/DefaultCards/index.tsx +6 -0
- package/components/DeviceAction/actionMap.tsx +100 -0
- package/components/DeviceAction/demo/index.tsx +132 -0
- package/components/DeviceAction/index.en-US.md +19 -0
- package/components/DeviceAction/index.tsx +75 -0
- package/components/DeviceAction/index.zh-CN.md +19 -0
- package/components/Disclaimer/demo/index.tsx +4 -0
- package/components/Disclaimer/demo/withLink.tsx +4 -0
- package/components/Disclaimer/index.en-US.md +23 -0
- package/components/Disclaimer/index.tsx +42 -0
- package/components/Disclaimer/index.zh-CN.md +24 -0
- package/components/Disclaimer/style.ts +17 -0
- package/components/ImageGenerator/demo/basic.tsx +23 -0
- package/components/ImageGenerator/demo/custom.tsx +56 -0
- package/components/ImageGenerator/demo/size.tsx +15 -0
- package/components/ImageGenerator/index.en-US.md +23 -0
- package/components/ImageGenerator/index.tsx +124 -0
- package/components/ImageGenerator/index.zh-CN.md +23 -0
- package/components/ImageGenerator/style.ts +99 -0
- package/components/Markdown/Markdown/AnimationNode.tsx +89 -0
- package/components/Markdown/Markdown/Markdown.tsx +61 -0
- package/components/Markdown/Markdown/core/Parser.ts +52 -0
- package/components/Markdown/Markdown/core/Renderer.ts +121 -0
- package/components/Markdown/Markdown/core/index.ts +4 -0
- package/components/Markdown/Markdown/defaultComponents/CodeBlock.tsx +113 -0
- package/components/Markdown/Markdown/defaultComponents/DisabledImage.tsx +3 -0
- package/components/Markdown/Markdown/defaultComponents/Media.tsx +71 -0
- package/components/Markdown/Markdown/hooks/index.ts +4 -0
- package/components/Markdown/Markdown/hooks/useAnimation.tsx +27 -0
- package/components/Markdown/Markdown/hooks/useCitationsData.tsx +36 -0
- package/components/Markdown/Markdown/hooks/useStreaming.ts +503 -0
- package/components/Markdown/Markdown/hooks/useTyping.ts +22 -0
- package/components/Markdown/Markdown/index.tsx +198 -0
- package/components/Markdown/Markdown/interface.ts +217 -0
- package/components/Markdown/Markdown/style.ts +152 -0
- package/components/Markdown/demo/basic.tsx +107 -0
- package/components/Markdown/demo/citations.tsx +47 -0
- package/components/Markdown/demo/cursor.tsx +9 -0
- package/components/Markdown/demo/latex.tsx +77 -0
- package/components/Markdown/demo/typing.tsx +82 -0
- package/components/Markdown/index.en-US.md +27 -0
- package/components/Markdown/index.ts +1 -0
- package/components/Markdown/index.zh-CN.md +28 -0
- package/components/Markdown/plugins/citations/CitationComponent.tsx +72 -0
- package/components/Markdown/plugins/citations/index.tsx +37 -0
- package/components/Markdown/plugins/cursor/Dot.tsx +106 -0
- package/components/Markdown/plugins/cursor/Underline.tsx +38 -0
- package/components/Markdown/plugins/cursor/index.tsx +59 -0
- package/components/Markdown/plugins/latex/index.ts +109 -0
- package/components/Markdown/plugins/type.ts +71 -0
- package/components/Mermaid/demo/basic.tsx +12 -0
- package/components/Mermaid/demo/class.tsx +31 -0
- package/components/Mermaid/demo/flowchart.tsx +13 -0
- package/components/Mermaid/demo/sequence.tsx +18 -0
- package/components/Mermaid/demo/state.tsx +16 -0
- package/components/Mermaid/demo/timeline.tsx +15 -0
- package/components/Mermaid/index.en-US.md +27 -0
- package/components/Mermaid/index.tsx +118 -0
- package/components/Mermaid/index.zh-CN.md +27 -0
- package/components/OperateCard/OperateCard.tsx +93 -0
- package/components/OperateCard/demo/index.tsx +35 -0
- package/components/OperateCard/demo/rag.tsx +19 -0
- package/components/OperateCard/demo/thinking.tsx +17 -0
- package/components/OperateCard/demo/todo.tsx +28 -0
- package/components/OperateCard/demo/toolCall.tsx +14 -0
- package/components/OperateCard/demo/webSearch.tsx +12 -0
- package/components/OperateCard/index.en-US.md +51 -0
- package/components/OperateCard/index.tsx +1 -0
- package/components/OperateCard/index.zh-CN.md +51 -0
- package/components/OperateCard/preset/Rag.tsx +90 -0
- package/components/OperateCard/preset/Thinking.tsx +45 -0
- package/components/OperateCard/preset/TodoList.tsx +73 -0
- package/components/OperateCard/preset/ToolCall.tsx +67 -0
- package/components/OperateCard/preset/WebSearch.tsx +65 -0
- package/components/OperateCard/preset/index.tsx +5 -0
- package/components/OperateCard/style.ts +268 -0
- package/components/Provider/CustomCardsProvider.tsx +17 -0
- package/components/Provider/GlobalProvider.tsx +17 -0
- package/components/Provider/index.tsx +33 -0
- package/components/Provider/types.ts +23 -0
- package/components/ResponsesAPI/index.tsx +0 -0
- package/components/Sender/ModeSelect/index.tsx +160 -0
- package/components/Sender/ModeSelect/styles.ts +0 -0
- package/components/Sender/SenderHeader.tsx +164 -0
- package/components/Sender/StopLoading.tsx +48 -0
- package/components/Sender/components/ActionButton.tsx +106 -0
- package/components/Sender/components/ClearButton.tsx +10 -0
- package/components/Sender/components/LoadingButton.tsx +26 -0
- package/components/Sender/components/SendButton.tsx +22 -0
- package/components/Sender/components/SpeechButton/RecordingIcon.tsx +68 -0
- package/components/Sender/components/SpeechButton/index.tsx +30 -0
- package/components/Sender/demo/asr.tsx +7 -0
- package/components/Sender/demo/basic.tsx +7 -0
- package/components/Sender/demo/loading.tsx +5 -0
- package/components/Sender/demo/moreMode.tsx +45 -0
- package/components/Sender/demo/morePrefixAction.tsx +40 -0
- package/components/Sender/demo/withFile.tsx +54 -0
- package/components/Sender/demo/withImage.tsx +52 -0
- package/components/Sender/index.en-US.md +29 -0
- package/components/Sender/index.tsx +491 -0
- package/components/Sender/index.zh-CN.md +30 -0
- package/components/Sender/style/index.ts +150 -0
- package/components/Sender/useSpeech.ts +133 -0
- package/components/StatusCard/demo/index.tsx +32 -0
- package/components/StatusCard/index.en-US.md +30 -0
- package/components/StatusCard/index.tsx +162 -0
- package/components/StatusCard/index.zh-CN.md +27 -0
- package/components/StatusCard/style.ts +119 -0
- package/components/Stream/index.ts +203 -0
- package/components/Util/hooks/use-proxy-imperative-handle.ts +25 -0
- package/components/Util/sleep.ts +3 -0
- package/components/Util/type.ts +1 -0
- package/components/Util/warning.ts +118 -0
- package/components/Version/index.ts +3 -0
- package/components/Voice/Recorder.tsx +3 -0
- package/components/Voice/demo/index.tsx +0 -0
- package/components/Voice/index.en-US.md +8 -0
- package/components/Voice/index.tsx +0 -0
- package/components/Voice/index.zh-CN.md +9 -0
- package/components/Welcome/demo/EyeFollower.tsx +161 -0
- package/components/Welcome/demo/demo0.tsx +14 -0
- package/components/Welcome/demo/demo1.tsx +16 -0
- package/components/Welcome/demo/demo2.tsx +30 -0
- package/components/Welcome/demo/demo3.tsx +16 -0
- package/components/Welcome/index.en-US.md +28 -0
- package/components/Welcome/index.tsx +72 -0
- package/components/Welcome/index.zh-CN.md +28 -0
- package/components/index.ts +88 -0
- package/components/overview.en-US.md +10 -0
- package/components/overview.zh-CN.md +10 -0
- package/lib/AgentScopeRuntimeWebUI/index.d.ts +1 -0
- package/lib/AgentScopeRuntimeWebUI/index.js +1 -0
- package/lib/AgentScopeRuntimeWebUI/starter/OptionsPanel/FormItem.d.ts +9 -0
- package/lib/AgentScopeRuntimeWebUI/starter/OptionsPanel/FormItem.js +33 -0
- package/lib/AgentScopeRuntimeWebUI/starter/OptionsPanel/OptionsEditor.d.ts +7 -0
- package/lib/AgentScopeRuntimeWebUI/starter/OptionsPanel/OptionsEditor.js +188 -0
- package/lib/AgentScopeRuntimeWebUI/starter/OptionsPanel/defaultConfig.d.ts +29 -0
- package/lib/AgentScopeRuntimeWebUI/starter/OptionsPanel/defaultConfig.js +35 -0
- package/lib/AgentScopeRuntimeWebUI/starter/OptionsPanel/index.d.ts +6 -0
- package/lib/AgentScopeRuntimeWebUI/starter/OptionsPanel/index.js +49 -0
- package/lib/AgentScopeRuntimeWebUI/starter/index.d.ts +1 -0
- package/lib/AgentScopeRuntimeWebUI/starter/index.js +70 -0
- package/lib/AgentScopeRuntimeWebUI/starter/sessionApi/index.d.ts +14 -0
- package/lib/AgentScopeRuntimeWebUI/starter/sessionApi/index.js +143 -0
- package/package.json +3 -2
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { RenderMessageProps } from "../props";
|
|
2
|
+
import { UserMessage as DefaultUserMessage } from "./UserMessage";
|
|
3
|
+
import { AssistantMessage as DefaultAssistantMessage } from "./AssistantMessage";
|
|
4
|
+
|
|
5
|
+
export function RenderTextMessage({
|
|
6
|
+
UserMessage = DefaultUserMessage,
|
|
7
|
+
AssistantMessage = DefaultAssistantMessage,
|
|
8
|
+
...props
|
|
9
|
+
}: RenderMessageProps) {
|
|
10
|
+
const {
|
|
11
|
+
message,
|
|
12
|
+
inProgress,
|
|
13
|
+
index,
|
|
14
|
+
isCurrentMessage,
|
|
15
|
+
onRegenerate,
|
|
16
|
+
onCopy,
|
|
17
|
+
onThumbsUp,
|
|
18
|
+
onThumbsDown,
|
|
19
|
+
markdownTagRenderers,
|
|
20
|
+
} = props;
|
|
21
|
+
|
|
22
|
+
if (message.isTextMessage()) {
|
|
23
|
+
if (message.role === "user") {
|
|
24
|
+
return (
|
|
25
|
+
<UserMessage
|
|
26
|
+
key={index}
|
|
27
|
+
data-message-role="user"
|
|
28
|
+
message={message.content}
|
|
29
|
+
rawData={message}
|
|
30
|
+
/>
|
|
31
|
+
);
|
|
32
|
+
} else if (message.role == "assistant") {
|
|
33
|
+
return (
|
|
34
|
+
<AssistantMessage
|
|
35
|
+
key={index}
|
|
36
|
+
data-message-role="assistant"
|
|
37
|
+
message={message.content}
|
|
38
|
+
rawData={message}
|
|
39
|
+
isLoading={inProgress && isCurrentMessage && !message.content}
|
|
40
|
+
isGenerating={inProgress && isCurrentMessage && !!message.content}
|
|
41
|
+
isCurrentMessage={isCurrentMessage}
|
|
42
|
+
onRegenerate={() => onRegenerate?.(message.id)}
|
|
43
|
+
onCopy={onCopy}
|
|
44
|
+
onThumbsUp={onThumbsUp}
|
|
45
|
+
onThumbsDown={onThumbsDown}
|
|
46
|
+
markdownTagRenderers={markdownTagRenderers}
|
|
47
|
+
/>
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { UserMessageProps } from "../props";
|
|
2
|
+
import { Bubble } from "@agentscope-ai/chat";
|
|
3
|
+
|
|
4
|
+
export const UserMessage = (props: UserMessageProps) => {
|
|
5
|
+
return <Bubble
|
|
6
|
+
role="user"
|
|
7
|
+
content={props.rawData.content}
|
|
8
|
+
id={props.rawData.id}
|
|
9
|
+
></Bubble>
|
|
10
|
+
};
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
import { Message, TextMessage } from "@copilotkit/runtime-client-gql";
|
|
2
|
+
import { CopilotChatSuggestion } from "../../types/suggestions";
|
|
3
|
+
import { ReactNode } from "react";
|
|
4
|
+
|
|
5
|
+
export interface ButtonProps {}
|
|
6
|
+
|
|
7
|
+
export interface WindowProps {
|
|
8
|
+
clickOutsideToClose: boolean;
|
|
9
|
+
hitEscapeToClose: boolean;
|
|
10
|
+
shortcut: string;
|
|
11
|
+
children?: React.ReactNode;
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
export interface HeaderProps {}
|
|
15
|
+
|
|
16
|
+
export interface SuggestionsProps {
|
|
17
|
+
title: string;
|
|
18
|
+
message: string;
|
|
19
|
+
partial?: boolean;
|
|
20
|
+
className?: string;
|
|
21
|
+
onClick: (message: string) => void;
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export type ComponentsMap<T extends Record<string, object> = Record<string, object>> = {
|
|
25
|
+
[K in keyof T]: React.FC<{ children?: ReactNode } & T[K]>;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
export interface MessagesProps {
|
|
29
|
+
messages: Message[];
|
|
30
|
+
inProgress: boolean;
|
|
31
|
+
children?: React.ReactNode;
|
|
32
|
+
AssistantMessage: React.ComponentType<AssistantMessageProps>;
|
|
33
|
+
UserMessage: React.ComponentType<UserMessageProps>;
|
|
34
|
+
RenderTextMessage: React.ComponentType<RenderMessageProps>;
|
|
35
|
+
RenderActionExecutionMessage: React.ComponentType<RenderMessageProps>;
|
|
36
|
+
RenderAgentStateMessage: React.ComponentType<RenderMessageProps>;
|
|
37
|
+
RenderResultMessage: React.ComponentType<RenderMessageProps>;
|
|
38
|
+
RenderImageMessage: React.ComponentType<RenderMessageProps>;
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Callback function to regenerate the assistant's response
|
|
42
|
+
*/
|
|
43
|
+
onRegenerate?: (messageId: string) => void;
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Callback function when the message is copied
|
|
47
|
+
*/
|
|
48
|
+
onCopy?: (message: string) => void;
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* Callback function for thumbs up feedback
|
|
52
|
+
*/
|
|
53
|
+
onThumbsUp?: (message: TextMessage) => void;
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* Callback function for thumbs down feedback
|
|
57
|
+
*/
|
|
58
|
+
onThumbsDown?: (message: TextMessage) => void;
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* A list of markdown components to render in assistant message.
|
|
62
|
+
* Useful when you want to render custom elements in the message (e.g a reference tag element)
|
|
63
|
+
*/
|
|
64
|
+
markdownTagRenderers?: ComponentsMap;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
export interface Renderer {
|
|
68
|
+
content: string;
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
export interface UserMessageProps {
|
|
72
|
+
message?: string;
|
|
73
|
+
rawData: any;
|
|
74
|
+
subComponent?: React.JSX.Element;
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
export interface AssistantMessageProps {
|
|
78
|
+
/**
|
|
79
|
+
* The message content from the assistant
|
|
80
|
+
*/
|
|
81
|
+
|
|
82
|
+
message?: string;
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Indicates if this is the last message
|
|
86
|
+
*/
|
|
87
|
+
isCurrentMessage?: boolean;
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* The raw data from the assistant's response
|
|
91
|
+
*/
|
|
92
|
+
rawData: any;
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* A component that was decided to render by the LLM.
|
|
96
|
+
* When working with useCopilotActions and useCoAgentStateRender, this will be
|
|
97
|
+
* the render component that was specified.
|
|
98
|
+
*/
|
|
99
|
+
subComponent?: React.JSX.Element;
|
|
100
|
+
|
|
101
|
+
/**
|
|
102
|
+
* Whether a response is loading, this is when the LLM is thinking of a response but hasn't finished yet.
|
|
103
|
+
*/
|
|
104
|
+
isLoading: boolean;
|
|
105
|
+
|
|
106
|
+
/**
|
|
107
|
+
* Whether a response is generating, this is when the LLM is actively generating and streaming content.
|
|
108
|
+
*/
|
|
109
|
+
isGenerating: boolean;
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Callback function to regenerate the assistant's response
|
|
113
|
+
*/
|
|
114
|
+
onRegenerate?: () => void;
|
|
115
|
+
|
|
116
|
+
/**
|
|
117
|
+
* Callback function when the message is copied
|
|
118
|
+
*/
|
|
119
|
+
onCopy?: (message: string) => void;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Callback function for thumbs up feedback
|
|
123
|
+
*/
|
|
124
|
+
onThumbsUp?: (message: TextMessage) => void;
|
|
125
|
+
|
|
126
|
+
/**
|
|
127
|
+
* Callback function for thumbs down feedback
|
|
128
|
+
*/
|
|
129
|
+
onThumbsDown?: (message: TextMessage) => void;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* A list of markdown components to render in assistant message.
|
|
133
|
+
* Useful when you want to render custom elements in the message (e.g a reference tag element)
|
|
134
|
+
*/
|
|
135
|
+
markdownTagRenderers?: ComponentsMap;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
export interface RenderMessageProps {
|
|
139
|
+
message: Message;
|
|
140
|
+
inProgress: boolean;
|
|
141
|
+
index: number;
|
|
142
|
+
isCurrentMessage: boolean;
|
|
143
|
+
actionResult?: string;
|
|
144
|
+
AssistantMessage?: React.ComponentType<AssistantMessageProps>;
|
|
145
|
+
UserMessage?: React.ComponentType<UserMessageProps>;
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Callback function to regenerate the assistant's response
|
|
149
|
+
*/
|
|
150
|
+
onRegenerate?: (messageId: string) => void;
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Callback function when the message is copied
|
|
154
|
+
*/
|
|
155
|
+
onCopy?: (message: string) => void;
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Callback function for thumbs up feedback
|
|
159
|
+
*/
|
|
160
|
+
onThumbsUp?: (message: TextMessage) => void;
|
|
161
|
+
|
|
162
|
+
/**
|
|
163
|
+
* Callback function for thumbs down feedback
|
|
164
|
+
*/
|
|
165
|
+
onThumbsDown?: (message: TextMessage) => void;
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* A list of markdown components to render in assistant message.
|
|
169
|
+
* Useful when you want to render custom elements in the message (e.g a reference tag element)
|
|
170
|
+
*/
|
|
171
|
+
markdownTagRenderers?: ComponentsMap;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
export interface InputProps {
|
|
175
|
+
inProgress: boolean;
|
|
176
|
+
onSend: (text: string) => Promise<Message>;
|
|
177
|
+
isVisible?: boolean;
|
|
178
|
+
onStop?: () => void;
|
|
179
|
+
onUpload?: () => void;
|
|
180
|
+
hideStopButton?: boolean;
|
|
181
|
+
}
|
|
182
|
+
|
|
183
|
+
export interface RenderSuggestionsListProps {
|
|
184
|
+
suggestions: CopilotChatSuggestion[];
|
|
185
|
+
onSuggestionClick: (message: string) => void;
|
|
186
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./chat";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./use-copilot-chat-suggestions";
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* <Callout type="warning">
|
|
3
|
+
* useCopilotChatSuggestions is experimental. The interface is not final and
|
|
4
|
+
* can change without notice.
|
|
5
|
+
* </Callout>
|
|
6
|
+
*
|
|
7
|
+
* `useCopilotReadable` is a React hook that provides app-state and other information
|
|
8
|
+
* to the Copilot. Optionally, the hook can also handle hierarchical state within your
|
|
9
|
+
* application, passing these parent-child relationships to the Copilot.
|
|
10
|
+
*
|
|
11
|
+
* <br/>
|
|
12
|
+
* <img src="/images/use-copilot-chat-suggestions/use-copilot-chat-suggestions.gif" width="500" />
|
|
13
|
+
*
|
|
14
|
+
* ## Usage
|
|
15
|
+
*
|
|
16
|
+
* ### Install Dependencies
|
|
17
|
+
*
|
|
18
|
+
* This component is part of the [@copilotkit/react-ui](https://npmjs.com/package/@copilotkit/react-ui) package.
|
|
19
|
+
*
|
|
20
|
+
* ```shell npm2yarn \"@copilotkit/react-ui"\
|
|
21
|
+
* npm install @copilotkit/react-core @copilotkit/react-ui
|
|
22
|
+
* ```
|
|
23
|
+
*
|
|
24
|
+
* ### Simple Usage
|
|
25
|
+
*
|
|
26
|
+
* ```tsx
|
|
27
|
+
* import { useCopilotChatSuggestions } from "@copilotkit/react-ui";
|
|
28
|
+
*
|
|
29
|
+
* export function MyComponent() {
|
|
30
|
+
* const [employees, setEmployees] = useState([]);
|
|
31
|
+
*
|
|
32
|
+
* useCopilotChatSuggestions({
|
|
33
|
+
* instructions: `The following employees are on duty: ${JSON.stringify(employees)}`,
|
|
34
|
+
* });
|
|
35
|
+
* }
|
|
36
|
+
* ```
|
|
37
|
+
*
|
|
38
|
+
* ### Dependency Management
|
|
39
|
+
*
|
|
40
|
+
* ```tsx
|
|
41
|
+
* import { useCopilotChatSuggestions } from "@copilotkit/react-ui";
|
|
42
|
+
*
|
|
43
|
+
* export function MyComponent() {
|
|
44
|
+
* useCopilotChatSuggestions(
|
|
45
|
+
* {
|
|
46
|
+
* instructions: "Suggest the most relevant next actions.",
|
|
47
|
+
* },
|
|
48
|
+
* [appState],
|
|
49
|
+
* );
|
|
50
|
+
* }
|
|
51
|
+
* ```
|
|
52
|
+
*
|
|
53
|
+
* In the example above, the suggestions are generated based on the given instructions.
|
|
54
|
+
* The hook monitors `appState`, and updates suggestions accordingly whenever it changes.
|
|
55
|
+
*
|
|
56
|
+
* ### Behavior and Lifecycle
|
|
57
|
+
*
|
|
58
|
+
* The hook registers the configuration with the chat context upon component mount and
|
|
59
|
+
* removes it on unmount, ensuring a clean and efficient lifecycle management.
|
|
60
|
+
*/
|
|
61
|
+
|
|
62
|
+
import { useEffect } from "react";
|
|
63
|
+
import { useCopilotContext } from "@copilotkit/react-core";
|
|
64
|
+
import { randomId } from "@copilotkit/shared";
|
|
65
|
+
|
|
66
|
+
interface UseCopilotChatSuggestionsConfiguration {
|
|
67
|
+
/**
|
|
68
|
+
* A prompt or instructions for the GPT to generate suggestions.
|
|
69
|
+
*/
|
|
70
|
+
instructions: string;
|
|
71
|
+
/**
|
|
72
|
+
* The minimum number of suggestions to generate. Defaults to `1`.
|
|
73
|
+
* @default 1
|
|
74
|
+
*/
|
|
75
|
+
minSuggestions?: number;
|
|
76
|
+
/**
|
|
77
|
+
* The maximum number of suggestions to generate. Defaults to `3`.
|
|
78
|
+
* @default 1
|
|
79
|
+
*/
|
|
80
|
+
maxSuggestions?: number;
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Whether the suggestions are available. Defaults to `enabled`.
|
|
84
|
+
* @default enabled
|
|
85
|
+
*/
|
|
86
|
+
available?: "enabled" | "disabled";
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* An optional class name to apply to the suggestions.
|
|
90
|
+
*/
|
|
91
|
+
className?: string;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export function useCopilotChatSuggestions(
|
|
95
|
+
{
|
|
96
|
+
available = "enabled",
|
|
97
|
+
instructions,
|
|
98
|
+
className,
|
|
99
|
+
minSuggestions = 1,
|
|
100
|
+
maxSuggestions = 3,
|
|
101
|
+
}: UseCopilotChatSuggestionsConfiguration,
|
|
102
|
+
dependencies: any[] = [],
|
|
103
|
+
) {
|
|
104
|
+
const context = useCopilotContext();
|
|
105
|
+
|
|
106
|
+
useEffect(() => {
|
|
107
|
+
if (available === "disabled") return;
|
|
108
|
+
|
|
109
|
+
const id = randomId();
|
|
110
|
+
|
|
111
|
+
context.addChatSuggestionConfiguration(id, {
|
|
112
|
+
instructions,
|
|
113
|
+
minSuggestions,
|
|
114
|
+
maxSuggestions,
|
|
115
|
+
className,
|
|
116
|
+
});
|
|
117
|
+
|
|
118
|
+
return () => {
|
|
119
|
+
context.removeChatSuggestionConfiguration(id);
|
|
120
|
+
};
|
|
121
|
+
}, [...dependencies, instructions, minSuggestions, maxSuggestions, className, available]);
|
|
122
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import * as React from "react";
|
|
2
|
+
|
|
3
|
+
export interface useCopyToClipboardProps {
|
|
4
|
+
timeout?: number;
|
|
5
|
+
}
|
|
6
|
+
|
|
7
|
+
export function useCopyToClipboard({ timeout = 2000 }: useCopyToClipboardProps) {
|
|
8
|
+
const [isCopied, setIsCopied] = React.useState<Boolean>(false);
|
|
9
|
+
|
|
10
|
+
const copyToClipboard = (value: string) => {
|
|
11
|
+
if (typeof window === "undefined" || !navigator.clipboard?.writeText) {
|
|
12
|
+
return;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
if (!value) {
|
|
16
|
+
return;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
navigator.clipboard.writeText(value).then(() => {
|
|
20
|
+
setIsCopied(true);
|
|
21
|
+
|
|
22
|
+
setTimeout(() => {
|
|
23
|
+
setIsCopied(false);
|
|
24
|
+
}, timeout);
|
|
25
|
+
});
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
return { isCopied, copyToClipboard };
|
|
29
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export const useDarkMode = () => {
|
|
2
|
+
if (typeof window === "undefined") return false;
|
|
3
|
+
return (
|
|
4
|
+
document.documentElement.classList.contains("dark") ||
|
|
5
|
+
document.body.classList.contains("dark") ||
|
|
6
|
+
document.documentElement.getAttribute("data-theme") === "dark" ||
|
|
7
|
+
document.body.getAttribute("data-theme") === "dark" ||
|
|
8
|
+
window.matchMedia("(prefers-color-scheme: dark)").matches
|
|
9
|
+
);
|
|
10
|
+
};
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
import { useCopilotContext, useCopilotMessagesContext } from "@copilotkit/react-core";
|
|
2
|
+
import { Message, TextMessage } from "@copilotkit/runtime-client-gql";
|
|
3
|
+
import { MutableRefObject, useEffect, useRef, useState } from "react";
|
|
4
|
+
|
|
5
|
+
export const checkMicrophonePermission = async () => {
|
|
6
|
+
try {
|
|
7
|
+
const permissionStatus = await navigator.permissions.query({
|
|
8
|
+
name: "microphone" as PermissionName,
|
|
9
|
+
});
|
|
10
|
+
if (permissionStatus.state === "granted") {
|
|
11
|
+
return true;
|
|
12
|
+
} else {
|
|
13
|
+
return false;
|
|
14
|
+
}
|
|
15
|
+
} catch (err) {
|
|
16
|
+
console.error("Error checking microphone permission", err);
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export const requestMicAndPlaybackPermission = async () => {
|
|
21
|
+
try {
|
|
22
|
+
const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
23
|
+
const audioContext = new window.AudioContext();
|
|
24
|
+
await audioContext.resume();
|
|
25
|
+
return { stream, audioContext };
|
|
26
|
+
} catch (err) {
|
|
27
|
+
console.error("Error requesting microphone and playback permissions", err);
|
|
28
|
+
return null;
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const startRecording = async (
|
|
33
|
+
mediaStreamRef: MutableRefObject<MediaStream | null>,
|
|
34
|
+
mediaRecorderRef: MutableRefObject<MediaRecorder | null>,
|
|
35
|
+
audioContextRef: MutableRefObject<AudioContext | null>,
|
|
36
|
+
recordedChunks: Blob[],
|
|
37
|
+
onStop: () => void,
|
|
38
|
+
) => {
|
|
39
|
+
if (!mediaStreamRef.current || !audioContextRef.current) {
|
|
40
|
+
mediaStreamRef.current = await navigator.mediaDevices.getUserMedia({ audio: true });
|
|
41
|
+
audioContextRef.current = new window.AudioContext();
|
|
42
|
+
await audioContextRef.current.resume();
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
mediaRecorderRef.current = new MediaRecorder(mediaStreamRef.current!);
|
|
46
|
+
mediaRecorderRef.current.start(1000);
|
|
47
|
+
mediaRecorderRef.current.ondataavailable = (event) => {
|
|
48
|
+
recordedChunks.push(event.data);
|
|
49
|
+
};
|
|
50
|
+
mediaRecorderRef.current.onstop = onStop;
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
const stopRecording = (mediaRecorderRef: MutableRefObject<MediaRecorder | null>) => {
|
|
54
|
+
if (mediaRecorderRef.current && mediaRecorderRef.current.state !== "inactive") {
|
|
55
|
+
mediaRecorderRef.current.stop();
|
|
56
|
+
}
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
const transcribeAudio = async (recordedChunks: Blob[], transcribeAudioUrl: string) => {
|
|
60
|
+
const completeBlob = new Blob(recordedChunks, { type: "audio/mp4" });
|
|
61
|
+
const formData = new FormData();
|
|
62
|
+
formData.append("file", completeBlob, "recording.mp4");
|
|
63
|
+
|
|
64
|
+
const response = await fetch(transcribeAudioUrl, {
|
|
65
|
+
method: "POST",
|
|
66
|
+
body: formData,
|
|
67
|
+
});
|
|
68
|
+
|
|
69
|
+
if (!response.ok) {
|
|
70
|
+
throw new Error(`Error: ${response.statusText}`);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
const transcription = await response.json();
|
|
74
|
+
return transcription.text;
|
|
75
|
+
};
|
|
76
|
+
|
|
77
|
+
const playAudioResponse = (text: string, textToSpeechUrl: string, audioContext: AudioContext) => {
|
|
78
|
+
const encodedText = encodeURIComponent(text);
|
|
79
|
+
const url = `${textToSpeechUrl}?text=${encodedText}`;
|
|
80
|
+
|
|
81
|
+
fetch(url)
|
|
82
|
+
.then((response) => response.arrayBuffer())
|
|
83
|
+
.then((arrayBuffer) => audioContext.decodeAudioData(arrayBuffer))
|
|
84
|
+
.then((audioBuffer) => {
|
|
85
|
+
const source = audioContext.createBufferSource();
|
|
86
|
+
source.buffer = audioBuffer;
|
|
87
|
+
source.connect(audioContext.destination);
|
|
88
|
+
source.start(0);
|
|
89
|
+
})
|
|
90
|
+
.catch((error) => {
|
|
91
|
+
console.error("Error with decoding audio data", error);
|
|
92
|
+
});
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export type PushToTalkState = "idle" | "recording" | "transcribing";
|
|
96
|
+
|
|
97
|
+
export type SendFunction = (text: string) => Promise<Message>;
|
|
98
|
+
|
|
99
|
+
export const usePushToTalk = ({
|
|
100
|
+
sendFunction,
|
|
101
|
+
inProgress,
|
|
102
|
+
}: {
|
|
103
|
+
sendFunction: SendFunction;
|
|
104
|
+
inProgress: boolean;
|
|
105
|
+
}) => {
|
|
106
|
+
const [pushToTalkState, setPushToTalkState] = useState<PushToTalkState>("idle");
|
|
107
|
+
const mediaStreamRef = useRef<MediaStream | null>(null);
|
|
108
|
+
const audioContextRef = useRef<AudioContext | null>(null);
|
|
109
|
+
const mediaRecorderRef = useRef<MediaRecorder | null>(null);
|
|
110
|
+
const recordedChunks = useRef<Blob[]>([]);
|
|
111
|
+
const generalContext = useCopilotContext();
|
|
112
|
+
const messagesContext = useCopilotMessagesContext();
|
|
113
|
+
const context = { ...generalContext, ...messagesContext };
|
|
114
|
+
const [startReadingFromMessageId, setStartReadingFromMessageId] = useState<string | null>(null);
|
|
115
|
+
|
|
116
|
+
useEffect(() => {
|
|
117
|
+
if (pushToTalkState === "recording") {
|
|
118
|
+
startRecording(
|
|
119
|
+
mediaStreamRef,
|
|
120
|
+
mediaRecorderRef,
|
|
121
|
+
audioContextRef,
|
|
122
|
+
recordedChunks.current,
|
|
123
|
+
() => {
|
|
124
|
+
setPushToTalkState("transcribing");
|
|
125
|
+
},
|
|
126
|
+
);
|
|
127
|
+
} else {
|
|
128
|
+
stopRecording(mediaRecorderRef);
|
|
129
|
+
if (pushToTalkState === "transcribing") {
|
|
130
|
+
transcribeAudio(recordedChunks.current, context.copilotApiConfig.transcribeAudioUrl!).then(
|
|
131
|
+
async (transcription) => {
|
|
132
|
+
recordedChunks.current = [];
|
|
133
|
+
setPushToTalkState("idle");
|
|
134
|
+
const message = await sendFunction(transcription);
|
|
135
|
+
setStartReadingFromMessageId(message.id);
|
|
136
|
+
},
|
|
137
|
+
);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
return () => {
|
|
142
|
+
stopRecording(mediaRecorderRef);
|
|
143
|
+
};
|
|
144
|
+
}, [pushToTalkState]);
|
|
145
|
+
|
|
146
|
+
useEffect(() => {
|
|
147
|
+
if (inProgress === false && startReadingFromMessageId) {
|
|
148
|
+
const lastMessageIndex = context.messages.findIndex(
|
|
149
|
+
(message) => message.id === startReadingFromMessageId,
|
|
150
|
+
);
|
|
151
|
+
|
|
152
|
+
const messagesAfterLast = context.messages
|
|
153
|
+
.slice(lastMessageIndex + 1)
|
|
154
|
+
.filter(
|
|
155
|
+
(message) => message.isTextMessage() && message.role === "assistant",
|
|
156
|
+
) as TextMessage[];
|
|
157
|
+
|
|
158
|
+
const text = messagesAfterLast.map((message) => message.content).join("\n");
|
|
159
|
+
playAudioResponse(text, context.copilotApiConfig.textToSpeechUrl!, audioContextRef.current!);
|
|
160
|
+
|
|
161
|
+
setStartReadingFromMessageId(null);
|
|
162
|
+
}
|
|
163
|
+
}, [startReadingFromMessageId, inProgress]);
|
|
164
|
+
|
|
165
|
+
return { pushToTalkState, setPushToTalkState };
|
|
166
|
+
};
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
export async function fetcher<JSON = any>(input: RequestInfo, init?: RequestInit): Promise<JSON> {
|
|
2
|
+
const res = await fetch(input, init);
|
|
3
|
+
|
|
4
|
+
if (!res.ok) {
|
|
5
|
+
const json = await res.json();
|
|
6
|
+
if (json.error) {
|
|
7
|
+
const error = new Error(json.error) as Error & {
|
|
8
|
+
status: number;
|
|
9
|
+
};
|
|
10
|
+
error.status = res.status;
|
|
11
|
+
throw error;
|
|
12
|
+
} else {
|
|
13
|
+
throw new Error("An unexpected error occurred");
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
return res.json();
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function formatDate(input: string | number | Date): string {
|
|
21
|
+
const date = new Date(input);
|
|
22
|
+
return date.toLocaleDateString("en-US", {
|
|
23
|
+
month: "long",
|
|
24
|
+
day: "numeric",
|
|
25
|
+
year: "numeric",
|
|
26
|
+
});
|
|
27
|
+
}
|
|
File without changes
|
|
File without changes
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type { CopilotChatSuggestion } from "./suggestions";
|