|
1 | 1 | // client/packages/lowcoder/src/comps/comps/chatComp/chatView.tsx
|
2 |
| -import React, { useState, useContext } from "react"; |
| 2 | +import React from "react"; |
3 | 3 | import { ChatCompProps } from "./chatCompTypes";
|
4 | 4 | import { Thread } from "./components/assistant-ui/thread";
|
5 | 5 |
|
6 |
| -// Import assistant-ui components for external store runtime |
7 |
| -import { |
8 |
| - AssistantRuntimeProvider, |
9 |
| - useExternalStoreRuntime, |
10 |
| - ThreadMessageLike, |
11 |
| - AppendMessage |
12 |
| -} from "@assistant-ui/react"; |
13 | 6 | import "@assistant-ui/styles/index.css";
|
14 | 7 | import "@assistant-ui/styles/markdown.css";
|
15 | 8 |
|
16 |
| -// Import Lowcoder query execution |
17 |
| -import { EditorContext } from "comps/editorState"; |
18 |
| -import { executeQueryAction, routeByNameAction } from "lowcoder-core"; |
19 | 9 |
|
20 |
| -const convertMessage = (message: ThreadMessageLike) => { |
21 |
| - return message; |
22 |
| -}; |
| 10 | +import { MyRuntimeProvider } from "./components/context/MyRuntimeProvider"; |
23 | 11 |
|
24 |
| -export const ChatView = React.memo((props: ChatCompProps) => { |
25 |
| - const [messages, setMessages] = useState<readonly ThreadMessageLike[]>([]); |
26 |
| - const editorState = useContext(EditorContext); |
27 |
| - |
28 |
| - const onNew = async (message: AppendMessage) => { |
29 |
| - if (message.content.length !== 1 || message.content[0]?.type !== "text") { |
30 |
| - throw new Error("Only text content is supported"); |
31 |
| - } |
32 |
| - |
33 |
| - // Add user message immediately |
34 |
| - const userMessage: ThreadMessageLike = { |
35 |
| - role: "user", |
36 |
| - content: [{ type: "text", text: message.content[0].text }], |
37 |
| - }; |
38 |
| - setMessages((currentMessages) => [...currentMessages, userMessage]); |
39 |
| - |
40 |
| - try { |
41 |
| - // Execute the selected Lowcoder query |
42 |
| - if (props.chatQuery) { |
43 |
| - // Prepare query arguments with chat context |
44 |
| - const queryArgs = { |
45 |
| - message: message.content[0].text, |
46 |
| - systemPrompt: props.systemPrompt, |
47 |
| - streaming: props.streaming, |
48 |
| - agent: props.agent, |
49 |
| - maxInteractions: props.maxInteractions, |
50 |
| - modelType: props.modelType, |
51 |
| - // Pass entire conversation history for context |
52 |
| - messages: messages.concat([userMessage]).map(msg => ({ |
53 |
| - role: msg.role, |
54 |
| - content: Array.isArray(msg.content) && msg.content[0] && typeof msg.content[0] === "object" && "text" in msg.content[0] |
55 |
| - ? msg.content[0].text |
56 |
| - : typeof msg.content === "string" ? msg.content : "" |
57 |
| - })) |
58 |
| - }; |
59 |
| - |
60 |
| - // Execute the query through Lowcoder's query system |
61 |
| - const result = await new Promise((resolve, reject) => { |
62 |
| - const queryComp = editorState?.getQueriesComp() |
63 |
| - .getView() |
64 |
| - .find(q => q.children.name.getView() === props.chatQuery); |
65 | 12 |
|
66 |
| - if (!queryComp) { |
67 |
| - reject(new Error(`Query "${props.chatQuery}" not found`)); |
68 |
| - return; |
69 |
| - } |
70 |
| - |
71 |
| - queryComp.dispatch( |
72 |
| - executeQueryAction({ |
73 |
| - args: queryArgs, |
74 |
| - afterExecFunc: () => { |
75 |
| - const queryResult = queryComp.children.data.getView(); |
76 |
| - resolve(queryResult); |
77 |
| - } |
78 |
| - }) |
79 |
| - ); |
80 |
| - }); |
81 |
| - |
82 |
| - // Add assistant response |
83 |
| - const assistantMessage: ThreadMessageLike = { |
84 |
| - role: "assistant", |
85 |
| - content: [{ |
86 |
| - type: "text", |
87 |
| - text: typeof result === "string" |
88 |
| - ? result |
89 |
| - : (result as any)?.message || (result as any)?.response || "No response" |
90 |
| - }], |
91 |
| - }; |
92 |
| - setMessages((currentMessages) => [...currentMessages, assistantMessage]); |
93 |
| - |
94 |
| - } else { |
95 |
| - // Fallback response when no query is selected |
96 |
| - const assistantMessage: ThreadMessageLike = { |
97 |
| - role: "assistant", |
98 |
| - content: [{ type: "text", text: "Please select a chat query in the component properties." }], |
99 |
| - }; |
100 |
| - setMessages((currentMessages) => [...currentMessages, assistantMessage]); |
101 |
| - } |
102 |
| - } catch (error) { |
103 |
| - // Error handling |
104 |
| - const errorMessage: ThreadMessageLike = { |
105 |
| - role: "assistant", |
106 |
| - content: [{ |
107 |
| - type: "text", |
108 |
| - text: `Error: ${error instanceof Error ? error.message : "Unknown error occurred"}` |
109 |
| - }], |
110 |
| - }; |
111 |
| - setMessages((currentMessages) => [...currentMessages, errorMessage]); |
112 |
| - } |
113 |
| - }; |
114 |
| - |
115 |
| - const runtime = useExternalStoreRuntime<ThreadMessageLike>({ |
116 |
| - messages, |
117 |
| - setMessages, |
118 |
| - onNew, |
119 |
| - convertMessage, |
120 |
| - }); |
121 | 13 |
|
| 14 | +export const ChatView = React.memo((props: ChatCompProps) => { |
122 | 15 | return (
|
123 |
| - <AssistantRuntimeProvider runtime={runtime}> |
| 16 | + <MyRuntimeProvider> |
124 | 17 | <Thread />
|
125 |
| - </AssistantRuntimeProvider> |
| 18 | + </MyRuntimeProvider> |
126 | 19 | );
|
127 | 20 | });
|
128 | 21 |
|
|
0 commit comments