mirror of
https://github.com/meta-llama/llama-stack.git
synced 2025-12-03 09:53:45 +00:00
# What does this PR do? 1. Updates Llama Stack Typescript client to include `prompts`api in playground client. 2. Updates the UI to display prompts and execute basic CRUD operations for prompts. (2) adds an explicit "Preview" section when creating the prompt to show users how the Prompts API behaves as you dynamically edit the prompt content. See example here: <p align="center"><img width="468.5" height="333" alt="Screenshot 2025-10-31 at 12 22 34 PM" src="https://github.com/user-attachments/assets/3542ce7f-56fe-4fb4-b0a3-5cfba5917f6d" /></p> Some screen shots: <details><Summary>Click me to expand!</Summary> ### Prompts List with Prompts <img width="1906" height="1108" alt="Screenshot 2025-10-31 at 12 20 05 PM" src="https://github.com/user-attachments/assets/494a4748-ea6a-4527-8cfe-8959cb741c0f" /> ### Empty Prompts List <img width="1889" height="1123" alt="Screenshot 2025-10-31 at 12 08 44 PM" src="https://github.com/user-attachments/assets/ac95b807-d311-4725-86da-0258b3cce81a" /> ### Create Prompt <img width="1918" height="1167" alt="Screenshot 2025-10-31 at 11 03 29 AM" src="https://github.com/user-attachments/assets/b3100a78-f4f3-410f-af89-f7e7fe4a89e7" /> ### Submit Prompt with error <img width="1901" height="1213" alt="Screenshot 2025-10-31 at 12 09 28 PM" src="https://github.com/user-attachments/assets/dca71354-a602-449d-a0d8-0ed3d009a275" /> </details> ## Closes https://github.com/llamastack/llama-stack/issues/3322 ## Test Plan Added tests and manual testing. Signed-off-by: Francisco Javier Arceo <farceo@redhat.com>
170 lines
4.1 KiB
TypeScript
170 lines
4.1 KiB
TypeScript
"use client";
|
|
|
|
import {
|
|
MessageSquareText,
|
|
MessagesSquare,
|
|
MoveUpRight,
|
|
Database,
|
|
MessageCircle,
|
|
Settings2,
|
|
Compass,
|
|
FileText,
|
|
} from "lucide-react";
|
|
import Link from "next/link";
|
|
import { usePathname } from "next/navigation";
|
|
import Image from "next/image";
|
|
import { cn } from "@/lib/utils";
|
|
|
|
import {
|
|
Sidebar,
|
|
SidebarContent,
|
|
SidebarGroup,
|
|
SidebarGroupContent,
|
|
SidebarGroupLabel,
|
|
SidebarMenu,
|
|
SidebarMenuButton,
|
|
SidebarMenuItem,
|
|
SidebarHeader,
|
|
} from "@/components/ui/sidebar";
|
|
|
|
const createItems = [
|
|
{
|
|
title: "Chat Playground",
|
|
url: "/chat-playground",
|
|
icon: MessageCircle,
|
|
},
|
|
];
|
|
|
|
const manageItems = [
|
|
{
|
|
title: "Chat Completions",
|
|
url: "/logs/chat-completions",
|
|
icon: MessageSquareText,
|
|
},
|
|
{
|
|
title: "Responses",
|
|
url: "/logs/responses",
|
|
icon: MessagesSquare,
|
|
},
|
|
{
|
|
title: "Vector Stores",
|
|
url: "/logs/vector-stores",
|
|
icon: Database,
|
|
},
|
|
{
|
|
title: "Prompts",
|
|
url: "/prompts",
|
|
icon: FileText,
|
|
},
|
|
{
|
|
title: "Documentation",
|
|
url: "https://llama-stack.readthedocs.io/en/latest/references/api_reference/index.html",
|
|
icon: MoveUpRight,
|
|
},
|
|
];
|
|
|
|
const optimizeItems: { title: string; url: string; icon: React.ElementType }[] =
|
|
[
|
|
{
|
|
title: "Evaluations",
|
|
url: "",
|
|
icon: Compass,
|
|
},
|
|
{
|
|
title: "Fine-tuning",
|
|
url: "",
|
|
icon: Settings2,
|
|
},
|
|
];
|
|
|
|
interface SidebarItem {
|
|
title: string;
|
|
url: string;
|
|
icon: React.ElementType;
|
|
}
|
|
|
|
export function AppSidebar() {
|
|
const pathname = usePathname();
|
|
|
|
const renderSidebarItems = (items: SidebarItem[]) => {
|
|
return items.map(item => {
|
|
const isActive = pathname.startsWith(item.url);
|
|
return (
|
|
<SidebarMenuItem key={item.title}>
|
|
<SidebarMenuButton
|
|
asChild
|
|
className={cn(
|
|
"justify-start",
|
|
isActive &&
|
|
"bg-gray-200 dark:bg-gray-700 hover:bg-gray-200 dark:hover:bg-gray-700 text-gray-900 dark:text-gray-100"
|
|
)}
|
|
>
|
|
<Link href={item.url}>
|
|
<item.icon
|
|
className={cn(
|
|
isActive && "text-gray-900 dark:text-gray-100",
|
|
"mr-2 h-4 w-4"
|
|
)}
|
|
/>
|
|
<span>{item.title}</span>
|
|
</Link>
|
|
</SidebarMenuButton>
|
|
</SidebarMenuItem>
|
|
);
|
|
});
|
|
};
|
|
|
|
return (
|
|
<Sidebar>
|
|
<SidebarHeader>
|
|
<Link href="/" className="flex items-center gap-2 p-2">
|
|
<Image
|
|
src="/logo.webp"
|
|
alt="Llama Stack"
|
|
width={32}
|
|
height={32}
|
|
className="h-8 w-8"
|
|
/>
|
|
<span className="font-semibold text-lg">Llama Stack</span>
|
|
</Link>
|
|
</SidebarHeader>
|
|
<SidebarContent>
|
|
<SidebarGroup>
|
|
<SidebarGroupLabel>Create</SidebarGroupLabel>
|
|
<SidebarGroupContent>
|
|
<SidebarMenu>{renderSidebarItems(createItems)}</SidebarMenu>
|
|
</SidebarGroupContent>
|
|
</SidebarGroup>
|
|
|
|
<SidebarGroup>
|
|
<SidebarGroupLabel>Manage</SidebarGroupLabel>
|
|
<SidebarGroupContent>
|
|
<SidebarMenu>{renderSidebarItems(manageItems)}</SidebarMenu>
|
|
</SidebarGroupContent>
|
|
</SidebarGroup>
|
|
|
|
<SidebarGroup>
|
|
<SidebarGroupLabel>Optimize</SidebarGroupLabel>
|
|
<SidebarGroupContent>
|
|
<SidebarMenu>
|
|
{optimizeItems.map(item => (
|
|
<SidebarMenuItem key={item.title}>
|
|
<SidebarMenuButton
|
|
disabled
|
|
className="justify-start opacity-60 cursor-not-allowed"
|
|
>
|
|
<item.icon className="mr-2 h-4 w-4" />
|
|
<span>{item.title}</span>
|
|
<span className="ml-2 text-xs text-gray-500">
|
|
(Coming Soon)
|
|
</span>
|
|
</SidebarMenuButton>
|
|
</SidebarMenuItem>
|
|
))}
|
|
</SidebarMenu>
|
|
</SidebarGroupContent>
|
|
</SidebarGroup>
|
|
</SidebarContent>
|
|
</Sidebar>
|
|
);
|
|
}
|