diff --git a/libs/sdk-js/src/react/stream.tsx b/libs/sdk-js/src/react/stream.tsx index 8b5b84562..d3941ce1e 100644 --- a/libs/sdk-js/src/react/stream.tsx +++ b/libs/sdk-js/src/react/stream.tsx @@ -6,13 +6,13 @@ import type { Command } from "../types.js"; import type { Message } from "../types.messages.js"; import type { Config, ThreadState } from "../schema.js"; import type { - CustomPayload, - DebugPayload, - EventsPayload, - MessagesPayload, - MessagesTuplePayload, - UpdatesPayload, - ValuesPayload, + CustomStreamEvent, + DebugStreamEvent, + EventsStreamEvent, + MessagesStreamEvent, + MessagesTupleStreamEvent, + UpdatesStreamEvent, + ValuesStreamEvent, } from "../types.stream.js"; import { @@ -114,18 +114,6 @@ export type MessageBranch = { options: CheckpointBranchPath[]; }; -const mergeConfig = (...configs: (Config | undefined)[]) => { - const result: Config = { configurable: {} }; - - for (const config of configs) { - if (config == null) continue; - // TODO: Just assigning the latest configurable is iffy. - result.configurable = config.configurable; - } - - return result; -}; - function fetchHistory>( client: Client, threadId: string, @@ -197,14 +185,14 @@ export function useStream< threadId?: string | null; onThreadId?: (threadId: string) => void; }) { - type EventPayload = - | ValuesPayload - | UpdatesPayload - | CustomPayload - | DebugPayload - | MessagesPayload - | MessagesTuplePayload - | EventsPayload; + type EventStreamEvent = + | ValuesStreamEvent + | UpdatesStreamEvent + | CustomStreamEvent + | DebugStreamEvent + | MessagesStreamEvent + | MessagesTupleStreamEvent + | EventsStreamEvent; const contextConfig = useContext(ConfigProvider); const { withMessages, onError, threadId, client } = Object.assign( @@ -222,7 +210,7 @@ export function useStream< const [branchPath, setBranchPath] = useState([]); const [error, setError] = useState(undefined); - const [events, setEvents] = useState([]); + const [events, setEvents] = useState([]); const [streamValues, setStreamValues] = useState(null); @@ -411,12 +399,15 @@ export function useStream< // TODO: why non-existent assistant ID does not throw an error here? const run = (await client.runs.stream(usableThreadId, "agent", { input: values as Record, - config: mergeConfig( - { configurable: lastSeenValue?.checkpoint }, - submitOptions?.config, - ), + config: { + ...submitOptions?.config, + configurable: { + ...lastSeenValue?.checkpoint, + ...submitOptions?.config?.configurable, + }, + }, streamMode, - })) as AsyncGenerator; + })) as AsyncGenerator; // Assumption: we're setting the initial value // Used for instant feedback @@ -433,7 +424,7 @@ export function useStream< } for await (const { event, data } of run) { - setEvents((events) => [...events, { event, data } as EventPayload]); + setEvents((events) => [...events, { event, data } as EventStreamEvent]); if (event === "values") { setStreamValues(data); @@ -505,7 +496,7 @@ export function useStream< return events .filter( - (item): item is UpdatesPayload => + (item): item is UpdatesStreamEvent => item.event === "updates", ) .map(({ data }) => data);