Skip to content

Commit bc39e08

Browse files
committed
Update api
1 parent c88aed6 commit bc39e08

File tree

5 files changed

+33
-39
lines changed

5 files changed

+33
-39
lines changed

backend/app/storage.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,7 @@ async def get_thread_state(user_id: str, thread_id: str):
105105
state = await app.aget_state({"configurable": {"thread_id": thread_id}})
106106
return {
107107
"values": state.values,
108-
"resumeable": bool(state.next),
108+
"next": state.next,
109109
}
110110

111111

@@ -124,7 +124,7 @@ async def get_thread_history(user_id: str, thread_id: str):
124124
return [
125125
{
126126
"values": c.values,
127-
"resumeable": bool(c.next),
127+
"next": c.next,
128128
"config": c.config,
129129
"parent": c.parent_config,
130130
}

frontend/src/components/Chat.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,15 @@ function usePrevious<T>(value: T): T | undefined {
3737
}
3838

3939
export function Chat(props: ChatProps) {
40-
const { messages: serverMessages, resumeable } = useChatMessages(
40+
const { messages: serverMessages, next } = useChatMessages(
4141
props.chat.thread_id,
4242
props.stream,
4343
props.stopStream,
4444
);
4545
const { histories } = useHistories(props.chat.thread_id, props.stream);
4646
const displayHistories = [...(histories ?? [])]
4747
.reverse()
48-
.filter((history) => history.resumeable)
48+
.filter((history) => history.next.length)
4949
.filter(
5050
(history, i, self) => !deepEquals(history.values, self[i - 1]?.values),
5151
);
@@ -136,7 +136,7 @@ export function Chat(props: ChatProps) {
136136
"An error has occurred. Please try again."}
137137
</div>
138138
)}
139-
{resumeable &&
139+
{next.length > 0 &&
140140
activeDisplayedHistoryIndex === displayHistories.length - 1 &&
141141
props.stream?.status !== "inflight" && (
142142
<div

frontend/src/components/Message.tsx

Lines changed: 14 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import { cn } from "../utils/cn";
99
import { marked } from "marked";
1010
import DOMPurify from "dompurify";
1111
import {
12-
// ArrowUturnLeftIcon,
12+
ArrowUturnLeftIcon,
1313
CheckCircleIcon,
1414
ChevronDownIcon,
1515
PencilSquareIcon,
@@ -195,13 +195,15 @@ function initializeFunctionArgsEntries(definition: FunctionDefinition) {
195195
function initializeToolCallFunctionArgsEntries(
196196
toolCalls: { function?: FunctionDefinition }[],
197197
) {
198-
return toolCalls.map((toolCall) => {
199-
if (toolCall.function !== undefined) {
200-
return initializeFunctionArgsEntries(toolCall.function ?? "{}");
201-
} else {
202-
return [];
203-
}
204-
});
198+
return toolCalls
199+
.map((toolCall) => {
200+
if (toolCall.function !== undefined) {
201+
return initializeFunctionArgsEntries(toolCall.function ?? "{}");
202+
} else {
203+
return [];
204+
}
205+
})
206+
.filter((args): args is [string, unknown][] => args !== undefined);
205207
}
206208

207209
export const Message = memo(function Message(
@@ -211,7 +213,7 @@ export const Message = memo(function Message(
211213
editMode: boolean;
212214
setEditMode: (newValue: boolean) => void;
213215
onUpdate: (newValue: MessageType) => void;
214-
// onRewindPressed: () => void;
216+
onRewindPressed: () => void;
215217
},
216218
) {
217219
const { runId, onUpdate, ...messageProps } = props;
@@ -485,11 +487,7 @@ export const Message = memo(function Message(
485487
return newMessageData;
486488
});
487489
setToolCallFunctionArgsEntries((prev) => {
488-
let oldValues: any[] = [];
489-
if (prev) {
490-
oldValues = [...prev];
491-
}
492-
return [...oldValues, ["", ""]];
490+
return [...(prev || []), [["", ""]]];
493491
});
494492
}}
495493
>
@@ -498,13 +496,13 @@ export const Message = memo(function Message(
498496
</div>
499497
)}
500498
</div>
501-
{/* <ArrowUturnLeftIcon
499+
<ArrowUturnLeftIcon
502500
className={cn(
503501
"w-6 h-6 ml-2 opacity-0 group-hover:opacity-50 transition-opacity cursor-pointer",
504502
props.editMode ? " invisible pointer-events-none" : "",
505503
)}
506504
onMouseUp={props.onRewindPressed}
507-
/> */}
505+
/>
508506
{props.editMode ? (
509507
<CheckCircleIcon
510508
className="w-6 h-6 cursor-pointer ml-2 shrink-0 opacity-0 group-hover:opacity-50 transition-opacity duration-200"

frontend/src/hooks/useChatMessages.ts

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,12 @@ import { Message } from "./useChatList";
33
import { StreamState } from "./useStreamState";
44

55
async function getState(threadId: string) {
6-
const { values, resumeable } = await fetch(`/threads/${threadId}/state`, {
6+
const { values, next } = await fetch(`/threads/${threadId}/state`, {
77
headers: {
88
Accept: "application/json",
99
},
1010
}).then((r) => r.json());
11-
return { values, resumeable };
11+
return { values, next };
1212
}
1313

1414
function usePrevious<T>(value: T): T | undefined {
@@ -26,18 +26,18 @@ export function useChatMessages(
2626
): {
2727
messages: Message[] | null;
2828
setMessages: React.Dispatch<React.SetStateAction<Message[] | null>>;
29-
resumeable: boolean;
29+
next: string[];
3030
} {
3131
const [messages, setMessages] = useState<Message[] | null>(null);
32-
const [resumeable, setResumeable] = useState(false);
32+
const [next, setNext] = useState<string[]>([]);
3333
const prevStreamStatus = usePrevious(stream?.status);
3434

3535
useEffect(() => {
3636
async function fetchMessages() {
3737
if (threadId) {
38-
const { values, resumeable } = await getState(threadId);
38+
const { values, next } = await getState(threadId);
3939
setMessages(values);
40-
setResumeable(resumeable);
40+
setNext(next);
4141
}
4242
}
4343

@@ -51,15 +51,15 @@ export function useChatMessages(
5151
useEffect(() => {
5252
async function fetchMessages() {
5353
if (threadId) {
54-
const { values, resumeable } = await getState(threadId);
54+
const { values, next } = await getState(threadId);
5555
setMessages(values);
56-
setResumeable(resumeable);
56+
setNext(next);
5757
stopStream?.(true);
5858
}
5959
}
6060

6161
if (prevStreamStatus === "inflight" && stream?.status !== "inflight") {
62-
setResumeable(false);
62+
setNext([]);
6363
fetchMessages();
6464
}
6565

@@ -71,8 +71,8 @@ export function useChatMessages(
7171
messages: stream?.merge
7272
? [...(messages ?? []), ...(stream.messages ?? [])]
7373
: stream?.messages ?? messages,
74-
resumeable,
74+
next,
7575
};
76-
}, [messages, stream?.merge, stream?.messages, resumeable]);
76+
}, [messages, stream?.merge, stream?.messages, next]);
7777
return { ...memoizedValues, setMessages };
7878
}

frontend/src/hooks/useHistories.ts

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,33 +13,29 @@ async function getHistories(threadId: string) {
1313

1414
export interface History {
1515
values: MessageType[];
16-
resumeable: boolean;
17-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
18-
config: Record<string, any>;
16+
next: string[];
17+
config: Record<string, unknown>;
1918
}
2019

2120
export function useHistories(
2221
threadId: string | null,
2322
stream: StreamState | null,
2423
): {
2524
histories: History[];
26-
resumeable: boolean;
2725
setHistories: React.Dispatch<React.SetStateAction<History[]>>;
2826
} {
2927
const [histories, setHistories] = useState<History[]>([]);
30-
const [resumeable, setResumeable] = useState(false);
3128

3229
useEffect(() => {
3330
async function fetchHistories() {
3431
if (threadId) {
3532
const histories = await getHistories(threadId);
3633
setHistories(histories);
37-
setResumeable(resumeable);
3834
}
3935
}
4036
fetchHistories();
4137
// eslint-disable-next-line react-hooks/exhaustive-deps
4238
}, [threadId, stream?.status]);
4339

44-
return { histories, resumeable, setHistories };
40+
return { histories, setHistories };
4541
}

0 commit comments

Comments
 (0)