@copilotkit/react-core
Version:
<div align="center"> <a href="https://copilotkit.ai" target="_blank"> <img src="https://github.com/copilotkit/copilotkit/raw/main/assets/banner.png" alt="CopilotKit Logo"> </a>
62 lines (54 loc) • 2.14 kB
text/typescript
import { useContext, useEffect, useMemo } from "react";
import { CopilotContext } from "../context/copilot-context";
import { LangGraphInterruptRender } from "../types/interrupt-action";
import { useCopilotChat } from "./use-copilot-chat";
import { useToast } from "../components/toast/toast-provider";
import { dataToUUID } from "@copilotkit/shared";
export function useLangGraphInterrupt<TEventValue = any>(
action: Omit<LangGraphInterruptRender<TEventValue>, "id">,
dependencies?: any[],
) {
const { setLangGraphInterruptAction, removeLangGraphInterruptAction, langGraphInterruptAction } =
useContext(CopilotContext);
const { runChatCompletion } = useCopilotChat();
const { addToast } = useToast();
const actionId = dataToUUID(JSON.stringify(action), "lgAction");
// We only consider action to be defined once the ID is there
const hasAction = useMemo(
() => Boolean(langGraphInterruptAction?.id),
[langGraphInterruptAction],
);
const isCurrentAction = useMemo(
() => langGraphInterruptAction?.id && langGraphInterruptAction?.id === actionId,
[langGraphInterruptAction],
);
// Run chat completion to submit a response event. Only if it's the current action
useEffect(() => {
if (hasAction && isCurrentAction && langGraphInterruptAction?.event?.response) {
runChatCompletion();
}
}, [langGraphInterruptAction?.event?.response, runChatCompletion, hasAction, isCurrentAction]);
useEffect(() => {
if (!action) return;
// An action was already set, with no conditions and it's not the action we're using right now.
// Show a warning, as this action will not be executed
if (hasAction && !isCurrentAction && !action.enabled) {
addToast({
type: "warning",
message: "An action is already registered for the interrupt event",
});
return;
}
if (hasAction && isCurrentAction) {
return;
}
setLangGraphInterruptAction({ ...action, id: actionId });
}, [
action,
hasAction,
isCurrentAction,
setLangGraphInterruptAction,
removeLangGraphInterruptAction,
...(dependencies || []),
]);
}