feat: handle exception

This commit is contained in:
Yu Chao
2025-04-28 14:16:31 +08:00
parent 1610c2ff4e
commit 26b123dd03

View File

@@ -26,6 +26,9 @@ export const useStore = create<{
ongoingResearchId: string | null; ongoingResearchId: string | null;
openResearchId: string | null; openResearchId: string | null;
appendMessage: (message: Message) => void;
updateMessage: (message: Message) => void;
updateMessages: (messages: Message[]) => void;
setOngoingResearchId: (value: string | null) => void; setOngoingResearchId: (value: string | null) => void;
}>((set) => ({ }>((set) => ({
responding: false, responding: false,
@@ -39,6 +42,22 @@ export const useStore = create<{
ongoingResearchId: null, ongoingResearchId: null,
openResearchId: null, openResearchId: null,
appendMessage(message: Message) {
set((state) => ({
messageIds: [...state.messageIds, message.id],
messages: new Map(state.messages).set(message.id, message),
}));
},
updateMessage(message: Message) {
set(state => ({ messages: new Map(state.messages).set(message.id, message) }));
},
updateMessages(messages: Message[]) {
set((state) => {
const newMessages = new Map(state.messages);
messages.forEach((m) => newMessages.set(m.id, m));
return { messages: newMessages };
});
},
setOngoingResearchId(value: string | null) { setOngoingResearchId(value: string | null) {
set({ ongoingResearchId: value }); set({ ongoingResearchId: value });
} }
@@ -78,10 +97,11 @@ export async function sendMessage(
); );
setResponding(true); setResponding(true);
let messageId: string | undefined;
try { try {
for await (const event of stream) { for await (const event of stream) {
const { type, data } = event; const { type, data } = event;
const messageId = data.id; messageId = data.id;
let message: Message | undefined; let message: Message | undefined;
if (type === "tool_call_result") { if (type === "tool_call_result") {
message = findMessageByToolCallId(data.tool_call_id); message = findMessageByToolCallId(data.tool_call_id);
@@ -105,7 +125,16 @@ export async function sendMessage(
} }
} }
} catch { } catch {
setOngoingResearchId(null); // Update message status.
// TODO: const isAborted = (error as Error).name === "AbortError";
if (messageId != null) {
const message = getMessage(messageId);
if (message?.isStreaming) {
message.isStreaming = false;
useStore.getState().updateMessage(message);
}
}
useStore.getState().setOngoingResearchId(null);
} finally { } finally {
setResponding(false); setResponding(false);
} }
@@ -195,10 +224,7 @@ function appendMessage(message: Message) {
) { ) {
appendResearchActivity(message); appendResearchActivity(message);
} }
useStore.setState({ useStore.getState().appendMessage(message);
messageIds: [...useStore.getState().messageIds, message.id],
messages: new Map(useStore.getState().messages).set(message.id, message),
});
} }
function updateMessage(message: Message) { function updateMessage(message: Message) {
@@ -219,21 +245,15 @@ function updateMessage(message: Message) {
message.agent === "reporter" && message.agent === "reporter" &&
!message.isStreaming !message.isStreaming
) { ) {
setOngoingResearchId(null); useStore.getState().setOngoingResearchId(null);
} }
useStore.setState({ useStore.getState().updateMessage(message);
messages: new Map(useStore.getState().messages).set(message.id, message),
});
} }
function getOngoingResearchId() { function getOngoingResearchId() {
return useStore.getState().ongoingResearchId; return useStore.getState().ongoingResearchId;
} }
function setOngoingResearchId(value: string | null) {
useStore.getState().setOngoingResearchId(value);
}
function appendResearch(researchId: string) { function appendResearch(researchId: string) {
let planMessage: Message | undefined; let planMessage: Message | undefined;
const reversedMessageIds = [...useStore.getState().messageIds].reverse(); const reversedMessageIds = [...useStore.getState().messageIds].reverse();