-
-
Notifications
You must be signed in to change notification settings - Fork 117
Expand file tree
/
Copy pathuseChat.ts
More file actions
110 lines (101 loc) · 3.18 KB
/
Copy pathuseChat.ts
File metadata and controls
110 lines (101 loc) · 3.18 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
import {useCallback, useEffect, useRef, useState} from "react";
import {type Computer, type ComputerAction} from "@/monkey/Computer";
import {type Conversation, type Provider} from "@/monkey/Provider";
export type Message =
| {
type: "user" | "reasoning" | "error";
content: string;
}
| {
type: "assistant";
content: string;
isRefusal?: boolean;
}
| {
type: "action";
action: ComputerAction;
};
export function useChat(
provider: Provider,
computer: Computer,
apiKeyProvider: () => string | undefined,
onLoopIteration?: () => void,
onError?: () => void
) {
const [messages, setMessages] = useState<Message[]>([]);
const addMessage = useCallback(
(message: Message) => {
setMessages(prevMessages => [...prevMessages, message]);
},
[setMessages]
);
const conversationRef = useRef<Conversation | undefined>(undefined);
useEffect(() => {
setMessages([]);
conversationRef.current = undefined;
}, [computer]);
const resetMessages = useCallback(() => {
setMessages([]);
conversationRef.current = undefined;
}, []);
const [canSendMessage, setCanSendMessage] = useState(true);
const [waitingForResponse, setWaitingForResponse] = useState(false);
const stopMessageSend = useCallback(() => {
conversationRef.current?.stop();
setCanSendMessage(true);
}, []);
const sendMessage = useCallback(
async (message: string) => {
conversationRef.current ??= provider.createConversation(
computer,
apiKeyProvider()
);
const conversation = conversationRef.current;
setCanSendMessage(false);
addMessage({type: "user", content: message});
await conversation.sendMessage(message, {
setWaitingForResponse,
onError(error: unknown) {
console.error("Error sending message:", error);
addMessage({
type: "error",
content: String(error),
});
onError?.();
setCanSendMessage(true);
},
onReasoning(reasoning) {
addMessage({type: "reasoning", content: reasoning});
},
onAction(action) {
addMessage({type: "action", action});
},
onAssistantMessage(message, isRefusal) {
addMessage({
type: "assistant",
content: message,
isRefusal,
});
},
onLoopIteration,
});
setCanSendMessage(true);
},
[
provider,
computer,
apiKeyProvider,
addMessage,
onLoopIteration,
onError,
]
);
return {
messages,
sendMessage,
canSendMessage,
resetMessages,
stopMessageSend,
waitingForResponse,
};
}