vision-agent / app /chat /page.tsx
MingruiZhang's picture
feat: loading state for sample image (#55)
6bcab4c unverified
raw
history blame
No virus
4.72 kB
'use client';
import ImageSelector from '@/components/chat/ImageSelector';
import { generateInputImageMarkdown } from '@/lib/messageUtils';
import { fetcher } from '@/lib/utils';
import { useRouter } from 'next/navigation';
import {
Tooltip,
TooltipContent,
TooltipTrigger,
} from '@/components/ui/Tooltip';
import { IconDiscord, IconGitHub } from '@/components/ui/Icons';
import Link from 'next/link';
import { Button } from '@/components/ui/Button';
import Img from '@/components/ui/Img';
import { MessageRaw } from '@/lib/db/types';
import { dbPostCreateChat } from '@/lib/db/functions';
import { useState } from 'react';
import Loading from '@/components/ui/Loading';
// const EXAMPLE_URL = 'https://landing-lens-support.s3.us-east-2.amazonaws.com/vision-agent-examples/cereal-example.jpg';
const EXAMPLE_URL =
'https://vision-agent-dev.s3.us-east-2.amazonaws.com/examples/flower.png';
const EXAMPLE_HEADER = 'Counting and find';
const EXAMPLE_SUBHEADER =
'number of flowers, area of largest and smallest flower';
const EXAMPLE_PROMPT =
'Count the number of flowers and find the area of the largest and smallest flower';
const exampleMessages = [
{
heading: EXAMPLE_HEADER,
subheading: EXAMPLE_SUBHEADER,
url: EXAMPLE_URL,
initMessages: [
{
role: 'user' as MessageRaw['role'],
content:
EXAMPLE_PROMPT + '\n\n' + generateInputImageMarkdown(EXAMPLE_URL),
},
],
},
// {
// heading: 'Detecting',
// url: 'https://landing-lens-support.s3.us-east-2.amazonaws.com/vision-agent-examples/cereal-example.jpg',
// subheading: 'number of cereals in an image',
// message: `How many cereals are there in the image?`,
// },
];
export default function Page() {
const router = useRouter();
const [isUploading, setUploading] = useState<false | Number>(false);
return (
<div className="mx-auto max-w-2xl px-4 mt-8">
<div className="rounded-lg border bg-background p-8 mb-6">
<h1 className="mb-2 text-lg font-semibold">Welcome to Vision Agent</h1>
<p>
Vision Agent is a library that helps you utilize agent frameworks for
your vision tasks. Vision Agent aims to provide an in-seconds
experience by allowing users to describe their problem in text and
utilizing agent frameworks to solve the task for them.
</p>
<div className="my-2">
<Tooltip>
<TooltipTrigger asChild>
<Button variant="link" size="icon" asChild className="mr-2">
<Link
href="https://github.com/landing-ai/vision-agent"
target="_blank"
>
<IconGitHub className="size-6" />
</Link>
</Button>
</TooltipTrigger>
<TooltipContent>Github</TooltipContent>
</Tooltip>
<Tooltip>
<TooltipTrigger asChild>
<Button variant="link" size="icon" asChild className="mr-2">
<Link href="https://discord.gg/wZ2A7J69" target="_blank">
<IconDiscord className="size-6" />
</Link>
</Button>
</TooltipTrigger>
<TooltipContent>Discord</TooltipContent>
</Tooltip>
</div>
<ImageSelector />
</div>
<div className="mb-4 grid grid-cols-2 gap-2 px-4 sm:px-0">
{exampleMessages.map((example, index) => (
<div
key={index}
className={`relative cursor-pointer rounded-lg border bg-white p-4 hover:bg-zinc-50 dark:bg-zinc-950 dark:hover:bg-zinc-900 flex items-center size-full ${
index > 1 && 'hidden md:block'
}`}
onClick={async () => {
setUploading(index);
const resp = await dbPostCreateChat({
mediaUrl: example.url,
initMessages: example.initMessages,
});
setUploading(false);
if (resp) {
router.push(`/chat/${resp.id}`);
}
}}
>
{isUploading === index && (
<div className="absolute top-0 left-0 size-full flex items-center justify-center bg-white/60">
<Loading />
</div>
)}
<Img src={example.url} alt="example images" className="w-1/4" />
<div className="flex items-start flex-col h-full ml-3 w-3/4">
<div className="text-sm font-semibold">{example.heading}</div>
<div className="text-sm text-zinc-600">{example.subheading}</div>
</div>
</div>
))}
</div>
</div>
);
}