2025-02-27 14:08:24 -08:00
|
|
|
import { ReactNode } from "react";
|
2025-02-26 17:09:16 -08:00
|
|
|
import {
|
|
|
|
|
useExternalStoreRuntime,
|
|
|
|
|
AppendMessage,
|
|
|
|
|
AssistantRuntimeProvider,
|
|
|
|
|
} from "@assistant-ui/react";
|
2025-02-27 14:08:24 -08:00
|
|
|
import { HumanMessage } from "@langchain/langgraph-sdk";
|
|
|
|
|
import { useStreamContext } from "./Stream";
|
|
|
|
|
import { convertLangChainMessages } from "./convert-messages";
|
2025-02-26 17:09:16 -08:00
|
|
|
|
|
|
|
|
export function RuntimeProvider({
|
|
|
|
|
children,
|
|
|
|
|
}: Readonly<{
|
|
|
|
|
children: ReactNode;
|
|
|
|
|
}>) {
|
2025-02-27 14:08:24 -08:00
|
|
|
const stream = useStreamContext();
|
|
|
|
|
|
2025-02-26 17:09:16 -08:00
|
|
|
const onNew = async (message: AppendMessage) => {
|
|
|
|
|
if (message.content[0]?.type !== "text")
|
|
|
|
|
throw new Error("Only text messages are supported");
|
2025-02-27 14:08:24 -08:00
|
|
|
|
2025-02-26 17:09:16 -08:00
|
|
|
const input = message.content[0].text;
|
2025-02-27 14:08:24 -08:00
|
|
|
const humanMessage: HumanMessage = { type: "human", content: input };
|
|
|
|
|
stream.submit({ messages: [humanMessage] });
|
2025-02-26 17:09:16 -08:00
|
|
|
};
|
2025-02-27 14:08:24 -08:00
|
|
|
|
2025-02-26 17:09:16 -08:00
|
|
|
const runtime = useExternalStoreRuntime({
|
2025-02-27 14:08:24 -08:00
|
|
|
isRunning: stream.isLoading,
|
|
|
|
|
messages: stream.messages,
|
|
|
|
|
convertMessage: convertLangChainMessages,
|
2025-02-26 17:09:16 -08:00
|
|
|
onNew,
|
|
|
|
|
});
|
2025-02-27 14:08:24 -08:00
|
|
|
|
2025-02-26 17:09:16 -08:00
|
|
|
return (
|
|
|
|
|
<AssistantRuntimeProvider runtime={runtime}>
|
|
|
|
|
{children}
|
|
|
|
|
</AssistantRuntimeProvider>
|
|
|
|
|
);
|
2025-02-27 14:08:24 -08:00
|
|
|
}
|