返回 presentation-ai
uiMessageParts.ts
根目录 / src / lib / ai / uiMessageParts.ts
1 import { type UIMessage } from "ai";
2
3 export type UIToolPart = Extract<
4 UIMessage["parts"][number],
5 { type: "dynamic-tool" | `tool-${string}` }
6 >;
7
8 export function getMessageText(message: UIMessage) {
9 return message.parts
10 .filter((part): part is Extract<typeof part, { type: "text" }> => {
11 return part.type === "text";
12 })
13 .map((part) => part.text)
14 .join("");
15 }
16
17 export function getLatestUserMessage(messages: UIMessage[]) {
18 return [...messages].reverse().find((message) => message.role === "user");
19 }
20
21 export function isToolPart(part: UIMessage["parts"][number]): part is UIToolPart {
22 return part.type === "dynamic-tool" || part.type.startsWith("tool-");
23 }
24
25 export function getToolName(part: UIToolPart) {
26 return part.type === "dynamic-tool" ? part.toolName : part.type.slice(5);
27 }
28
29 export function getToolState(part: UIToolPart): "call" | "partial-call" | "result" {
30 if (part.state === "output-available") return "result";
31 if (part.state === "input-streaming") return "partial-call";
32 return "call";
33 }
34
35 export function getToolInputArgs(part: UIToolPart): Record<string, unknown> {
36 if ("input" in part && typeof part.input === "object" && part.input !== null) {
37 return part.input as Record<string, unknown>;
38 }
39
40 return {};
41 }
42
43 export function getToolOutput(part: UIToolPart) {
44 return "output" in part ? part.output : undefined;
45 }
46
46 lines TYPESCRIPT