Fix generating title from messages (#442)

This commit is contained in:
Jeremy 2024-10-15 10:50:50 +05:30 committed by GitHub
parent 2705d83d6c
commit 00b125378c
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 103 additions and 77 deletions

View file

@ -1,6 +1,15 @@
import {
CoreMessage,
CoreToolMessage,
generateId,
Message,
ToolInvocation,
} from "ai";
import { clsx, type ClassValue } from "clsx";
import { twMerge } from "tailwind-merge";
import { Chat } from "@/db/schema";
export function cn(...inputs: ClassValue[]) {
return twMerge(clsx(inputs));
}
@ -41,3 +50,89 @@ export function generateUUID(): string {
return v.toString(16);
});
}
function addToolMessageToChat({
toolMessage,
messages,
}: {
toolMessage: CoreToolMessage;
messages: Array<Message>;
}): Array<Message> {
return messages.map((message) => {
if (message.toolInvocations) {
return {
...message,
toolInvocations: message.toolInvocations.map((toolInvocation) => {
const toolResult = toolMessage.content.find(
(tool) => tool.toolCallId === toolInvocation.toolCallId,
);
if (toolResult) {
return {
...toolInvocation,
state: "result",
result: toolResult.result,
};
}
return toolInvocation;
}),
};
}
return message;
});
}
export function convertToUIMessages(
messages: Array<CoreMessage>,
): Array<Message> {
return messages.reduce((chatMessages: Array<Message>, message) => {
if (message.role === "tool") {
return addToolMessageToChat({
toolMessage: message as CoreToolMessage,
messages: chatMessages,
});
}
let textContent = "";
let toolInvocations: Array<ToolInvocation> = [];
if (typeof message.content === "string") {
textContent = message.content;
} else if (Array.isArray(message.content)) {
for (const content of message.content) {
if (content.type === "text") {
textContent += content.text;
} else if (content.type === "tool-call") {
toolInvocations.push({
state: "call",
toolCallId: content.toolCallId,
toolName: content.toolName,
args: content.args,
});
}
}
}
chatMessages.push({
id: generateId(),
role: message.role,
content: textContent,
toolInvocations,
});
return chatMessages;
}, []);
}
export function getTitleFromChat(chat: Chat) {
const messages = convertToUIMessages(chat.messages as Array<CoreMessage>);
const firstMessage = messages[0];
if (!firstMessage) {
return "Untitled";
}
return firstMessage.content;
}