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