mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-08-16 06:27:58 +00:00
# What does this PR do? I've been tinkering a little with a simple chat playground in the UI, so I'm opening the PR with what's kind of a WIP. If you look at the first commit, that includes the big part of the changes. The rest of the files changed come from adding installing the `shadcn` components. Note this is missing a lot; e.g., - sessions - document upload - audio (the shadcn components install these by default from https://shadcn-chatbot-kit.vercel.app/docs/components/chat) I still need to wire up a lot more to make it actually fully functional but it does basic chat using the LS Typescript Client. Basic demo: <img width="1329" height="1430" alt="Image" src="https://github.com/user-attachments/assets/917a2096-36d4-4925-b83b-f1f2cda98698" /> <img width="1319" height="1424" alt="Image" src="https://github.com/user-attachments/assets/fab1583b-1c72-4bf3-baf2-405aee13c6bb" /> <!-- If resolving an issue, uncomment and update the line below --> <!-- Closes #[issue-number] --> ## Test Plan <!-- Describe the tests you ran to verify your changes with result summaries. *Provide clear instructions so the plan can be easily re-executed.* --> --------- Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
76 lines
2 KiB
TypeScript
76 lines
2 KiB
TypeScript
"use client";
|
|
|
|
import { ChatMessage } from "@/lib/types";
|
|
import React from "react";
|
|
import { formatToolCallToString } from "@/lib/format-tool-call";
|
|
import { extractTextFromContentPart } from "@/lib/format-message-content";
|
|
import {
|
|
MessageBlock,
|
|
ToolCallBlock,
|
|
} from "@/components/chat-playground/message-components";
|
|
|
|
interface ChatMessageItemProps {
|
|
message: ChatMessage;
|
|
}
|
|
export function ChatMessageItem({ message }: ChatMessageItemProps) {
|
|
switch (message.role) {
|
|
case "system":
|
|
return (
|
|
<MessageBlock
|
|
label="System"
|
|
content={extractTextFromContentPart(message.content)}
|
|
/>
|
|
);
|
|
case "user":
|
|
return (
|
|
<MessageBlock
|
|
label="User"
|
|
content={extractTextFromContentPart(message.content)}
|
|
/>
|
|
);
|
|
|
|
case "assistant":
|
|
if (
|
|
message.tool_calls &&
|
|
Array.isArray(message.tool_calls) &&
|
|
message.tool_calls.length > 0
|
|
) {
|
|
return (
|
|
<>
|
|
{message.tool_calls.map((toolCall: any, index: number) => {
|
|
const formattedToolCall = formatToolCallToString(toolCall);
|
|
const toolCallContent = (
|
|
<ToolCallBlock>
|
|
{formattedToolCall || "Error: Could not display tool call"}
|
|
</ToolCallBlock>
|
|
);
|
|
return (
|
|
<MessageBlock
|
|
key={index}
|
|
label="Tool Call"
|
|
content={toolCallContent}
|
|
/>
|
|
);
|
|
})}
|
|
</>
|
|
);
|
|
} else {
|
|
return (
|
|
<MessageBlock
|
|
label="Assistant"
|
|
content={extractTextFromContentPart(message.content)}
|
|
/>
|
|
);
|
|
}
|
|
case "tool":
|
|
const toolOutputContent = (
|
|
<ToolCallBlock>
|
|
{extractTextFromContentPart(message.content)}
|
|
</ToolCallBlock>
|
|
);
|
|
return (
|
|
<MessageBlock label="Tool Call Output" content={toolOutputContent} />
|
|
);
|
|
}
|
|
return null;
|
|
}
|