@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,114 @@
|
|
|
1
|
+
import { Stream } from "@agentscope-ai/chat";
|
|
2
|
+
import { useCallback, useRef, useEffect } from "react";
|
|
3
|
+
import { useChatAnywhereOptions } from "../../Context/ChatAnywhereOptionsContext";
|
|
4
|
+
import AgentScopeRuntimeResponseBuilder from "../../AgentScopeRuntime/Response/Builder";
|
|
5
|
+
import { AgentScopeRuntimeRunStatus } from "../../AgentScopeRuntime/types";
|
|
6
|
+
import { IAgentScopeRuntimeWebUIMessage } from "@agentscope-ai/chat";
|
|
7
|
+
|
|
8
|
+
interface UseChatRequestOptions {
|
|
9
|
+
currentQARef: React.MutableRefObject<{
|
|
10
|
+
request?: IAgentScopeRuntimeWebUIMessage;
|
|
11
|
+
response?: IAgentScopeRuntimeWebUIMessage;
|
|
12
|
+
abortController?: AbortController;
|
|
13
|
+
}>;
|
|
14
|
+
updateMessage: (message: IAgentScopeRuntimeWebUIMessage) => void;
|
|
15
|
+
getCurrentSessionId: () => string;
|
|
16
|
+
onFinish: () => void;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 处理 API 请求和流式响应的 Hook
|
|
21
|
+
*/
|
|
22
|
+
export default function useChatRequest(options: UseChatRequestOptions) {
|
|
23
|
+
const { currentQARef, updateMessage, getCurrentSessionId, onFinish } = options;
|
|
24
|
+
const apiOptions = useChatAnywhereOptions(v => v.api);
|
|
25
|
+
|
|
26
|
+
// 使用 ref 保存最新的 apiOptions,避免闭包陷阱
|
|
27
|
+
const apiOptionsRef = useRef(apiOptions);
|
|
28
|
+
|
|
29
|
+
useEffect(() => {
|
|
30
|
+
apiOptionsRef.current = apiOptions;
|
|
31
|
+
}, [apiOptions]);
|
|
32
|
+
|
|
33
|
+
const request = useCallback(async (historyMessages: any[]) => {
|
|
34
|
+
// 使用 ref.current 获取最新的 apiOptions
|
|
35
|
+
const currentApiOptions = apiOptionsRef.current;
|
|
36
|
+
let response
|
|
37
|
+
try {
|
|
38
|
+
response = await fetch(currentApiOptions.baseURL, {
|
|
39
|
+
method: 'POST',
|
|
40
|
+
headers: {
|
|
41
|
+
'Content-Type': 'application/json',
|
|
42
|
+
'Authorization': `Bearer ${currentApiOptions.token || ''}`,
|
|
43
|
+
},
|
|
44
|
+
body: JSON.stringify({
|
|
45
|
+
input: historyMessages,
|
|
46
|
+
session_id: getCurrentSessionId(),
|
|
47
|
+
stream: true,
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
} catch (error) {
|
|
51
|
+
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
|
|
57
|
+
if (response && response.body && response.ok) {
|
|
58
|
+
const agentScopeRuntimeResponseBuilder = new AgentScopeRuntimeResponseBuilder({
|
|
59
|
+
id: '',
|
|
60
|
+
status: AgentScopeRuntimeRunStatus.Created,
|
|
61
|
+
created_at: 0,
|
|
62
|
+
});
|
|
63
|
+
try {
|
|
64
|
+
|
|
65
|
+
for await (const chunk of Stream({
|
|
66
|
+
readableStream: response.body,
|
|
67
|
+
})) {
|
|
68
|
+
// 检查是否被中断
|
|
69
|
+
if (currentQARef.current.response?.msgStatus === 'interrupted') {
|
|
70
|
+
currentQARef.current.abortController?.abort();
|
|
71
|
+
|
|
72
|
+
currentQARef.current.response.cards = [
|
|
73
|
+
{
|
|
74
|
+
code: 'AgentScopeRuntimeResponseCard',
|
|
75
|
+
data: agentScopeRuntimeResponseBuilder.cancel(),
|
|
76
|
+
}
|
|
77
|
+
];
|
|
78
|
+
|
|
79
|
+
updateMessage(currentQARef.current.response);
|
|
80
|
+
break;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const chunkData = JSON.parse(chunk.data);
|
|
84
|
+
const res = agentScopeRuntimeResponseBuilder.handle(chunkData);
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
// 跳过空内容
|
|
88
|
+
if (res.status !== AgentScopeRuntimeRunStatus.Failed && !res.output?.[0]?.content?.length) continue;
|
|
89
|
+
|
|
90
|
+
if (currentQARef.current.response) {
|
|
91
|
+
currentQARef.current.response.cards = [
|
|
92
|
+
{
|
|
93
|
+
code: 'AgentScopeRuntimeResponseCard',
|
|
94
|
+
data: res,
|
|
95
|
+
}
|
|
96
|
+
];
|
|
97
|
+
|
|
98
|
+
if (res.status === AgentScopeRuntimeRunStatus.Completed || res.status === AgentScopeRuntimeRunStatus.Failed) {
|
|
99
|
+
onFinish();
|
|
100
|
+
} else {
|
|
101
|
+
updateMessage(currentQARef.current.response);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
} catch (error) {
|
|
106
|
+
console.error(error);
|
|
107
|
+
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
}, [getCurrentSessionId, currentQARef, updateMessage, onFinish]);
|
|
111
|
+
|
|
112
|
+
return { request };
|
|
113
|
+
}
|
|
114
|
+
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import { useCallback } from "react";
|
|
2
|
+
import ReactDOM from "react-dom";
|
|
3
|
+
import { useChatAnywhereSessions } from "../../Context/ChatAnywhereSessionsContext";
|
|
4
|
+
import { IAgentScopeRuntimeWebUIMessage } from "@agentscope-ai/chat";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 处理会话创建和更新的 Hook
|
|
8
|
+
*/
|
|
9
|
+
export default function useChatSessionHandler() {
|
|
10
|
+
const { createSession, updateSession, getCurrentSessionId } = useChatAnywhereSessions();
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* 确保会话存在,如果不存在则创建
|
|
14
|
+
*/
|
|
15
|
+
const ensureSession = useCallback(async (query: string) => {
|
|
16
|
+
if (!getCurrentSessionId()) {
|
|
17
|
+
await createSession({ name: query });
|
|
18
|
+
}
|
|
19
|
+
}, [getCurrentSessionId, createSession]);
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* 更新会话名称(仅在第一次消息时)
|
|
23
|
+
*/
|
|
24
|
+
const updateSessionName = useCallback(async (query: string, messages: IAgentScopeRuntimeWebUIMessage[]) => {
|
|
25
|
+
if (messages.length === 0) {
|
|
26
|
+
await updateSession({
|
|
27
|
+
id: getCurrentSessionId(),
|
|
28
|
+
name: query,
|
|
29
|
+
});
|
|
30
|
+
}
|
|
31
|
+
}, [getCurrentSessionId, updateSession]);
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* 同步会话消息
|
|
35
|
+
*/
|
|
36
|
+
const syncSessionMessages = useCallback(async (messages: IAgentScopeRuntimeWebUIMessage[]) => {
|
|
37
|
+
await updateSession({
|
|
38
|
+
id: getCurrentSessionId(),
|
|
39
|
+
messages: messages,
|
|
40
|
+
});
|
|
41
|
+
}, [getCurrentSessionId, updateSession]);
|
|
42
|
+
|
|
43
|
+
return {
|
|
44
|
+
ensureSession,
|
|
45
|
+
updateSessionName,
|
|
46
|
+
syncSessionMessages,
|
|
47
|
+
getCurrentSessionId,
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { useProviderContext } from "@agentscope-ai/chat";
|
|
2
|
+
import Input from "./Input";
|
|
3
|
+
import MessageList from "./MessageList";
|
|
4
|
+
import Style from './styles';
|
|
5
|
+
import useChatController from "./hooks/useChatController";
|
|
6
|
+
|
|
7
|
+
export default function Chat() {
|
|
8
|
+
const prefixCls = useProviderContext().getPrefixCls('chat-anywhere-chat');
|
|
9
|
+
const { handleSubmit, handleCancel } = useChatController();
|
|
10
|
+
|
|
11
|
+
return <>
|
|
12
|
+
<Style />
|
|
13
|
+
<div className={prefixCls}>
|
|
14
|
+
<MessageList onSubmit={handleSubmit} />
|
|
15
|
+
<Input onCancel={handleCancel} onSubmit={handleSubmit} />
|
|
16
|
+
</div>
|
|
17
|
+
</>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { createGlobalStyle } from 'antd-style';
|
|
2
|
+
|
|
3
|
+
export default createGlobalStyle`
|
|
4
|
+
.${(p) => p.theme.prefixCls}-chat-anywhere-chat {
|
|
5
|
+
display: flex;
|
|
6
|
+
flex-direction: column;
|
|
7
|
+
height: 100%;
|
|
8
|
+
align-items: stretch;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
.${(p) => p.theme.prefixCls}-chat-anywhere-message-list {
|
|
12
|
+
flex: 1;
|
|
13
|
+
height: 0;
|
|
14
|
+
|
|
15
|
+
&-welcome {
|
|
16
|
+
display: flex;
|
|
17
|
+
align-items: center;
|
|
18
|
+
justify-content: center;
|
|
19
|
+
height: 100%;
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
|
|
25
|
+
.${(p) => p.theme.prefixCls}-chat-anywhere-message-list > div::-webkit-scrollbar {
|
|
26
|
+
display: none;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
@keyframes message-list-fade-in {
|
|
30
|
+
from {
|
|
31
|
+
opacity: 0;
|
|
32
|
+
}
|
|
33
|
+
to {
|
|
34
|
+
opacity: 1;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
.${(p) => p.theme.prefixCls}-chat-anywhere-message-list > div {
|
|
39
|
+
animation: message-list-fade-in 0.4s ease-in-out;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
.${(p) => p.theme.prefixCls}-chat-anywhere-message-list .${(p) => p.theme.prefixCls}-bubble-list {
|
|
43
|
+
margin: 0 auto;
|
|
44
|
+
max-width: 850px;
|
|
45
|
+
min-width: 300px;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
.${(p) => p.theme.prefixCls}-chat-anywhere-input {
|
|
49
|
+
padding: 0 16px;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
.${(p) => p.theme.prefixCls}-chat-anywhere-input-wrapper {
|
|
53
|
+
max-width: 850px;
|
|
54
|
+
min-width: 300px;
|
|
55
|
+
margin: 0 auto;
|
|
56
|
+
}
|
|
57
|
+
.${(p) => p.theme.prefixCls}-chat-anywhere-input-blank {
|
|
58
|
+
height: 16px;
|
|
59
|
+
`;
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { CustomCardsProvider } from "@agentscope-ai/chat";
|
|
2
|
+
import { ChatAnywhereInputContextProvider } from "../Context/ChatAnywhereInputContext";
|
|
3
|
+
import { ChatAnywhereOptionsContextProvider } from "../Context/ChatAnywhereOptionsContext";
|
|
4
|
+
import { ChatAnywhereSessionsContextProvider } from "../Context/ChatAnywhereSessionsContext";
|
|
5
|
+
import { ChatAnywhereMessagesContextProvider } from "../Context/ChatAnywhereMessagesContext";
|
|
6
|
+
import { ChatAnyWhereLayoutContextProvider } from "../Context/ChatAnywhereLayoutContext";
|
|
7
|
+
|
|
8
|
+
function ComposedProvider(props: { options, cards, children }) {
|
|
9
|
+
const { options, cards, children } = props;
|
|
10
|
+
const providers = [
|
|
11
|
+
[ChatAnywhereOptionsContextProvider, { options }],
|
|
12
|
+
[CustomCardsProvider, { cardConfig: cards }],
|
|
13
|
+
[ChatAnywhereSessionsContextProvider, {}],
|
|
14
|
+
[ChatAnywhereMessagesContextProvider, {}],
|
|
15
|
+
[ChatAnywhereInputContextProvider, {}],
|
|
16
|
+
[ChatAnyWhereLayoutContextProvider, {}],
|
|
17
|
+
];
|
|
18
|
+
|
|
19
|
+
return providers.reduceRight(
|
|
20
|
+
// @ts-ignore
|
|
21
|
+
(children, [Provider, props]) => <Provider {...props}>{children}</Provider>,
|
|
22
|
+
children
|
|
23
|
+
);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
export default ComposedProvider;
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Layout from '../Layout';
|
|
2
|
+
import type { IAgentScopeRuntimeWebUIOptions } from '@agentscope-ai/chat';
|
|
3
|
+
import { useMemo } from 'react';
|
|
4
|
+
import AgentScopeRuntimeRequestCard from '../AgentScopeRuntime/Request/Card';
|
|
5
|
+
import AgentScopeRuntimeResponseCard from '../AgentScopeRuntime/Response/Card';
|
|
6
|
+
import ComposedProvider from './ComposedProvider';
|
|
7
|
+
|
|
8
|
+
interface IProps {
|
|
9
|
+
options: IAgentScopeRuntimeWebUIOptions;
|
|
10
|
+
}
|
|
11
|
+
export default function ChatAnywhere(props: IProps) {
|
|
12
|
+
const { options = {} as IAgentScopeRuntimeWebUIOptions } = props;
|
|
13
|
+
|
|
14
|
+
const cards = useMemo(() => {
|
|
15
|
+
const res = {
|
|
16
|
+
AgentScopeRuntimeRequestCard,
|
|
17
|
+
AgentScopeRuntimeResponseCard,
|
|
18
|
+
...options.cards,
|
|
19
|
+
};
|
|
20
|
+
return res;
|
|
21
|
+
}, [options.cards]);
|
|
22
|
+
|
|
23
|
+
|
|
24
|
+
return <>
|
|
25
|
+
<ComposedProvider options={options} cards={cards}>
|
|
26
|
+
<Layout />
|
|
27
|
+
</ComposedProvider>
|
|
28
|
+
</>;
|
|
29
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createContext, useContextSelector } from 'use-context-selector';
|
|
2
|
+
import { IAgentScopeRuntimeWebUIInputContext } from '@agentscope-ai/chat';
|
|
3
|
+
import { useGetState } from 'ahooks';
|
|
4
|
+
|
|
5
|
+
export const ChatAnywhereInputContext = createContext<IAgentScopeRuntimeWebUIInputContext>({
|
|
6
|
+
loading: false,
|
|
7
|
+
setLoading: () => { },
|
|
8
|
+
getLoading: () => false,
|
|
9
|
+
disabled: false,
|
|
10
|
+
setDisabled: () => { },
|
|
11
|
+
getDisabled: () => false,
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
export function ChatAnywhereInputContextProvider(props: {
|
|
15
|
+
children: React.ReactNode | React.ReactNode[];
|
|
16
|
+
}) {
|
|
17
|
+
const [loading, setLoading, getLoading] = useGetState<boolean>(false);
|
|
18
|
+
const [disabled, setDisabled, getDisabled] = useGetState<boolean>(false);
|
|
19
|
+
|
|
20
|
+
return <ChatAnywhereInputContext.Provider value={{ loading, setLoading, getLoading, disabled, setDisabled, getDisabled }}>
|
|
21
|
+
{props.children}
|
|
22
|
+
</ChatAnywhereInputContext.Provider>;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export const useChatAnywhereInput = (selector: (v: IAgentScopeRuntimeWebUIInputContext) => IAgentScopeRuntimeWebUIInputContext) => {
|
|
26
|
+
return useContextSelector(ChatAnywhereInputContext, selector);
|
|
27
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import { createContext, useCallback, useState } from "react";
|
|
2
|
+
|
|
3
|
+
export const ChatAnyWhereLayoutContext = createContext<{
|
|
4
|
+
collapsed: boolean;
|
|
5
|
+
toggleCollapsed: () => void;
|
|
6
|
+
}>({
|
|
7
|
+
collapsed: false,
|
|
8
|
+
toggleCollapsed: () => { },
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export function ChatAnyWhereLayoutContextProvider(props: {
|
|
13
|
+
children: React.ReactNode | React.ReactNode[];
|
|
14
|
+
}) {
|
|
15
|
+
const [collapsed, setCollapsed] = useState(false);
|
|
16
|
+
|
|
17
|
+
const toggleCollapsed = useCallback(() => {
|
|
18
|
+
setCollapsed(prev => !prev);
|
|
19
|
+
}, []);
|
|
20
|
+
|
|
21
|
+
return <ChatAnyWhereLayoutContext.Provider value={{
|
|
22
|
+
collapsed,
|
|
23
|
+
toggleCollapsed,
|
|
24
|
+
}}>
|
|
25
|
+
{props.children}
|
|
26
|
+
</ChatAnyWhereLayoutContext.Provider>;
|
|
27
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { IAgentScopeRuntimeWebUIMessage, IAgentScopeRuntimeWebUIMessagesContext } from "@agentscope-ai/chat";
|
|
2
|
+
import { useGetState } from 'ahooks';
|
|
3
|
+
import React from "react";
|
|
4
|
+
import { createContext, useContextSelector } from 'use-context-selector';
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export const ChatAnywhereMessagesContext = createContext<IAgentScopeRuntimeWebUIMessagesContext>({
|
|
8
|
+
messages: [],
|
|
9
|
+
setMessages: () => { },
|
|
10
|
+
getMessages: () => [],
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
export function ChatAnywhereMessagesContextProvider(props: {
|
|
15
|
+
children: React.ReactNode | React.ReactNode[];
|
|
16
|
+
}) {
|
|
17
|
+
|
|
18
|
+
const [messages, setMessages, getMessages] = useGetState<IAgentScopeRuntimeWebUIMessage[]>([]);
|
|
19
|
+
|
|
20
|
+
const value = {
|
|
21
|
+
messages,
|
|
22
|
+
setMessages,
|
|
23
|
+
getMessages,
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
return <ChatAnywhereMessagesContext.Provider value={value}>
|
|
28
|
+
{props.children}
|
|
29
|
+
</ChatAnywhereMessagesContext.Provider>;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
export const useChatAnywhereMessages = () => {
|
|
33
|
+
const { setMessages, getMessages } = useContextSelector(ChatAnywhereMessagesContext, v => ({
|
|
34
|
+
messages: v.messages,
|
|
35
|
+
setMessages: v.setMessages,
|
|
36
|
+
getMessages: v.getMessages,
|
|
37
|
+
}));
|
|
38
|
+
|
|
39
|
+
const removeAllMessages = React.useCallback(() => {
|
|
40
|
+
setMessages([]);
|
|
41
|
+
}, []);
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
const getMessage = React.useCallback((id: string) => {
|
|
45
|
+
return getMessages().find(item => item.id === id);
|
|
46
|
+
}, []);
|
|
47
|
+
|
|
48
|
+
|
|
49
|
+
const removeMessage = React.useCallback((message: Partial<IAgentScopeRuntimeWebUIMessage>) => {
|
|
50
|
+
// @ts-ignore
|
|
51
|
+
setMessages(prev => {
|
|
52
|
+
return prev.filter(item => item.id !== message.id);
|
|
53
|
+
})
|
|
54
|
+
}, []);
|
|
55
|
+
|
|
56
|
+
const updateMessage = React.useCallback((message: Partial<IAgentScopeRuntimeWebUIMessage> & { id: string }) => {
|
|
57
|
+
// @ts-ignore
|
|
58
|
+
setMessages((prev) => {
|
|
59
|
+
const index = prev.findIndex((item) => item.id === message.id);
|
|
60
|
+
if (index > -1) {
|
|
61
|
+
const nextMessage = {
|
|
62
|
+
...prev[index],
|
|
63
|
+
...message
|
|
64
|
+
};
|
|
65
|
+
return [...prev.slice(0, index), nextMessage, ...prev.slice(index + 1)];
|
|
66
|
+
} else {
|
|
67
|
+
return [...prev, message];
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
}, []);
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
getMessages,
|
|
76
|
+
removeAllMessages,
|
|
77
|
+
getMessage,
|
|
78
|
+
removeMessage,
|
|
79
|
+
updateMessage,
|
|
80
|
+
};
|
|
81
|
+
}
|
|
82
|
+
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
import { useResponsive } from "ahooks";
|
|
2
|
+
import { IAgentScopeRuntimeWebUIOptions } from "@agentscope-ai/chat";
|
|
3
|
+
import { createContext, useContextSelector } from 'use-context-selector';
|
|
4
|
+
import { useMemo } from "react";
|
|
5
|
+
import { ConfigProvider, generateTheme, generateThemeByToken } from '@agentscope-ai/design';
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
const ChatAnywhereOptionsContext = createContext<IAgentScopeRuntimeWebUIOptions>(undefined);
|
|
9
|
+
|
|
10
|
+
export function useChatAnywhereOptions<Selected>(selector: (value: IAgentScopeRuntimeWebUIOptions) => Selected) {
|
|
11
|
+
try {
|
|
12
|
+
const context = useContextSelector(ChatAnywhereOptionsContext, selector);
|
|
13
|
+
return context;
|
|
14
|
+
|
|
15
|
+
} catch (error) {
|
|
16
|
+
return {} as Selected;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
export function ChatAnywhereOptionsContextProvider(props: { children: React.ReactNode, options: IAgentScopeRuntimeWebUIOptions }) {
|
|
22
|
+
const { children } = props;
|
|
23
|
+
const responsive = useResponsive();
|
|
24
|
+
|
|
25
|
+
const options = useMemo(() => {
|
|
26
|
+
const theme = props.options.theme || {};
|
|
27
|
+
|
|
28
|
+
return {
|
|
29
|
+
...props.options,
|
|
30
|
+
theme: {
|
|
31
|
+
...theme,
|
|
32
|
+
narrowMode: !responsive.lg || theme.narrowMode,
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
}, [props.options, responsive.lg]);
|
|
36
|
+
|
|
37
|
+
const themeToken = useMemo(() => {
|
|
38
|
+
const colorPrimary = options.theme.colorPrimary;
|
|
39
|
+
const colorBgBase = options.theme.colorBgBase;
|
|
40
|
+
const colorTextBase = options.theme.colorTextBase;
|
|
41
|
+
const darkMode = options.theme.darkMode;
|
|
42
|
+
if (colorPrimary || darkMode) {
|
|
43
|
+
const res = generateThemeByToken(generateTheme({
|
|
44
|
+
primaryHex: colorPrimary,
|
|
45
|
+
bgBaseHex: colorBgBase,
|
|
46
|
+
textBaseHex: colorTextBase,
|
|
47
|
+
darkMode: darkMode,
|
|
48
|
+
}));
|
|
49
|
+
|
|
50
|
+
return res;
|
|
51
|
+
}
|
|
52
|
+
return
|
|
53
|
+
}, [options.theme.colorPrimary, options.theme.colorBgBase, options.theme.colorTextBase, options.theme.darkMode]);
|
|
54
|
+
|
|
55
|
+
|
|
56
|
+
const content = <ChatAnywhereOptionsContext.Provider value={options}>
|
|
57
|
+
{children}
|
|
58
|
+
</ChatAnywhereOptionsContext.Provider>;
|
|
59
|
+
|
|
60
|
+
if (themeToken) {
|
|
61
|
+
const prefix = options.theme.prefix || 'agentscope-runtime-webui';
|
|
62
|
+
|
|
63
|
+
return <ConfigProvider
|
|
64
|
+
{...themeToken}
|
|
65
|
+
style={{ height: '100%' }}
|
|
66
|
+
prefix={prefix}
|
|
67
|
+
prefixCls={prefix}
|
|
68
|
+
>
|
|
69
|
+
{content}
|
|
70
|
+
</ConfigProvider>
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
return content;
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export default ChatAnywhereOptionsContext;
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { createContext, useContextSelector } from 'use-context-selector';
|
|
2
|
+
import { IAgentScopeRuntimeWebUISessionsContext } from '../types/ISessions';
|
|
3
|
+
import { useGetState, useMount } from 'ahooks';
|
|
4
|
+
import { IAgentScopeRuntimeWebUISession } from '../types/ISessions';
|
|
5
|
+
import React, { useEffect } from "react";
|
|
6
|
+
import { ChatAnywhereMessagesContext } from './ChatAnywhereMessagesContext';
|
|
7
|
+
import { useChatAnywhereOptions } from './ChatAnywhereOptionsContext';
|
|
8
|
+
import ReactDOM from 'react-dom';
|
|
9
|
+
import { useAsyncEffect } from 'ahooks';
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
export const ChatAnywhereSessionsContext = createContext<IAgentScopeRuntimeWebUISessionsContext>({
|
|
13
|
+
sessions: [],
|
|
14
|
+
setSessions: () => { },
|
|
15
|
+
getSessions: () => [],
|
|
16
|
+
currentSessionId: undefined,
|
|
17
|
+
setCurrentSessionId: () => { },
|
|
18
|
+
getCurrentSessionId: () => '',
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
export function ChatAnywhereSessionsContextProvider(props: {
|
|
22
|
+
children: React.ReactNode | React.ReactNode[];
|
|
23
|
+
}) {
|
|
24
|
+
const options = useChatAnywhereOptions(v => v.session);
|
|
25
|
+
const [sessions, setSessions, getSessions] = useGetState<IAgentScopeRuntimeWebUISession[]>([]);
|
|
26
|
+
const [currentSessionId, setCurrentSessionId, getCurrentSessionId] = useGetState<string | undefined>(undefined);
|
|
27
|
+
|
|
28
|
+
useMount(async () => {
|
|
29
|
+
const sessionList = await options.api.getSessionList();
|
|
30
|
+
setSessions(sessionList);
|
|
31
|
+
setCurrentSessionId(sessionList?.[0]?.id);
|
|
32
|
+
})
|
|
33
|
+
|
|
34
|
+
|
|
35
|
+
return <ChatAnywhereSessionsContext.Provider value={{
|
|
36
|
+
sessions,
|
|
37
|
+
setSessions,
|
|
38
|
+
getSessions,
|
|
39
|
+
currentSessionId,
|
|
40
|
+
setCurrentSessionId,
|
|
41
|
+
getCurrentSessionId
|
|
42
|
+
}}>
|
|
43
|
+
{props.children}
|
|
44
|
+
</ChatAnywhereSessionsContext.Provider>;
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
export const useChatAnywhereSessions = () => {
|
|
48
|
+
const {
|
|
49
|
+
setSessions,
|
|
50
|
+
getSessions,
|
|
51
|
+
getCurrentSessionId,
|
|
52
|
+
setCurrentSessionId,
|
|
53
|
+
currentSessionId,
|
|
54
|
+
} = useContextSelector(ChatAnywhereSessionsContext, v => v);
|
|
55
|
+
const options = useChatAnywhereOptions(v => v.session);
|
|
56
|
+
const setMessages = useContextSelector(ChatAnywhereMessagesContext, v => v.setMessages);
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
const removeSession = React.useCallback(async (session: Partial<IAgentScopeRuntimeWebUISession> & { id: string }) => {
|
|
60
|
+
const res = await options.api.removeSession(session);
|
|
61
|
+
setMessages([]);
|
|
62
|
+
setCurrentSessionId(undefined);
|
|
63
|
+
setSessions(res);
|
|
64
|
+
}, []);
|
|
65
|
+
|
|
66
|
+
const updateSession = React.useCallback(async (session: Partial<IAgentScopeRuntimeWebUISession>) => {
|
|
67
|
+
const res = session.id ?
|
|
68
|
+
await options.api.updateSession(session) :
|
|
69
|
+
await options.api.createSession(session);
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
setSessions(res);
|
|
73
|
+
return session;
|
|
74
|
+
}, [])
|
|
75
|
+
|
|
76
|
+
const createSession = React.useCallback(async (data?: { name?: string }) => {
|
|
77
|
+
const session = await updateSession({
|
|
78
|
+
name: data?.name || '',
|
|
79
|
+
messages: [],
|
|
80
|
+
});
|
|
81
|
+
setCurrentSessionId(session.id);
|
|
82
|
+
setMessages(session.messages);
|
|
83
|
+
return session.id;
|
|
84
|
+
}, []);
|
|
85
|
+
|
|
86
|
+
|
|
87
|
+
const changeCurrentSessionId = React.useCallback((sessionId: string) => {
|
|
88
|
+
setCurrentSessionId(sessionId);
|
|
89
|
+
|
|
90
|
+
}, []);
|
|
91
|
+
|
|
92
|
+
|
|
93
|
+
useAsyncEffect(async () => {
|
|
94
|
+
ReactDOM.flushSync(() => {
|
|
95
|
+
setMessages([])
|
|
96
|
+
})
|
|
97
|
+
|
|
98
|
+
const messages = (await options.api.getSession(currentSessionId))?.messages || [];
|
|
99
|
+
setMessages(messages);
|
|
100
|
+
}, [currentSessionId]);
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
return {
|
|
104
|
+
changeCurrentSessionId,
|
|
105
|
+
getCurrentSessionId,
|
|
106
|
+
getSessions,
|
|
107
|
+
removeSession,
|
|
108
|
+
updateSession,
|
|
109
|
+
createSession,
|
|
110
|
+
}
|
|
111
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import { useEffect } from "react";
|
|
2
|
+
|
|
3
|
+
interface IAgentScopeRuntimeWebUIEventEmitter {
|
|
4
|
+
type: string;
|
|
5
|
+
callback: (event: any) => void;
|
|
6
|
+
}
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
export default function useChatAnywhereEventEmitter(props: IAgentScopeRuntimeWebUIEventEmitter) {
|
|
10
|
+
|
|
11
|
+
useEffect(() => {
|
|
12
|
+
document.addEventListener(props.type, props.callback);
|
|
13
|
+
return () => {
|
|
14
|
+
document.removeEventListener(props.type, props.callback);
|
|
15
|
+
}
|
|
16
|
+
}, [])
|
|
17
|
+
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
export const emit = function (props: {
|
|
22
|
+
type: string;
|
|
23
|
+
data?: any;
|
|
24
|
+
}) {
|
|
25
|
+
const { type, data } = props;
|
|
26
|
+
|
|
27
|
+
document.dispatchEvent(new CustomEvent(type, {
|
|
28
|
+
detail: data,
|
|
29
|
+
}))
|
|
30
|
+
}
|