返回 presentation-ai
getPresentationMessages.ts
根目录 / src / app / _actions / presentation / getPresentationMessages.ts
1 "use server";
2
3 import { createPresentationGraph } from "@/ai/agents/presentation/createAgent";
4 import { ensureCheckpointerSetup } from "@/ai/lib/postgres";
5 import { auth } from "@/server/auth";
6 import { toHydratedUiMessages } from "@/server/ai/chatMessages";
7 import { type UIMessage } from "ai";
8 import { type BaseMessage } from "@langchain/core/messages";
9
10 interface PresentationGraphState {
11 values: {
12 messages?: BaseMessage[];
13 activeMessages?: BaseMessage[];
14 };
15 tasks?: Array<{
16 interrupts?: unknown[];
17 state?: unknown;
18 }>;
19 }
20
21 export async function getPresentationMessages(
22 presentationId: string,
23 ): Promise<UIMessage[]> {
24 const session = await auth();
25
26 if (!session?.user) {
27 throw new Error("Unauthorized");
28 }
29
30 await ensureCheckpointerSetup();
31
32 const graph = createPresentationGraph();
33 let state: PresentationGraphState | null = null;
34
35 try {
36 state = (await graph.getState(
37 {
38 configurable: {
39 thread_id: presentationId,
40 },
41 },
42 { subgraphs: true },
43 )) as PresentationGraphState;
44 } catch {
45 state = null;
46 }
47
48 if (!state) {
49 return [];
50 }
51
52 const stateValues = state.values;
53
54 let allMessages = [
55 ...(stateValues.messages ?? []),
56 ...(stateValues.activeMessages ?? []),
57 ].filter(
58 (message) => message.type !== "system" && message.type !== "developer",
59 );
60
61 if (state.tasks && state.tasks.length > 0) {
62 const taskWithInterrupt = state.tasks.find(
63 (task) => task.interrupts && task.interrupts.length > 0,
64 );
65
66 if (taskWithInterrupt) {
67 const nestedState = (
68 taskWithInterrupt.state as {
69 tasks?: Array<{
70 state?: {
71 values?: {
72 messages?: BaseMessage[];
73 activeMessages?: BaseMessage[];
74 };
75 };
76 }>;
77 }
78 ).tasks?.[0]?.state?.values;
79
80 if (nestedState) {
81 allMessages = [
82 ...(nestedState.messages ?? []),
83 ...(nestedState.activeMessages ?? []),
84 ].filter(
85 (message) => message.type !== "system" && message.type !== "developer",
86 );
87 }
88 }
89 }
90
91 return toHydratedUiMessages(allMessages);
92 }
93
93 lines TYPESCRIPT