Initial ChatGPT Agent demo

This commit is contained in:
Rami Bitar
2026-09-14 19:49:51 -04:00
commit 8790cfb1e2
121 changed files with 20112 additions and 0 deletions
@@ -0,0 +1,35 @@
'use client';
import { RiSearch2Line } from '@remixicon/react';
import type { ToolComponentProps } from './types';
import {
Task,
TaskTrigger,
TaskContent,
TaskItem,
} from '@/components/ai-elements/task';
export function FirecrawlWebFetchTool({ part }: ToolComponentProps) {
const { input, output, state } = part as any;
const isComplete = state === 'output-available';
const url = input?.url as string | undefined;
const title = isComplete
? `Fetched ${url || 'web page'}`
: `Fetching ${url || 'web page'}...`;
return (
<Task defaultOpen={false}>
<TaskTrigger title={title} icon={<RiSearch2Line className="size-4" />} />
<TaskContent>
{!isComplete && <TaskItem>Fetching page content...</TaskItem>}
{isComplete && output?.error && (
<TaskItem className="text-destructive">{output.error}</TaskItem>
)}
{isComplete && output?.success && (
<TaskItem>Page content fetched successfully</TaskItem>
)}
</TaskContent>
</Task>
);
}
@@ -0,0 +1,47 @@
"use client";
import { RiSearch2Line } from "@remixicon/react";
import type { ToolComponentProps } from "./types";
import {
Task,
TaskTrigger,
TaskContent,
TaskItem,
TaskItemFile,
} from "@/components/ai-elements/task";
export function FirecrawlWebSearchTool({ part }: ToolComponentProps) {
const { input, output, state } = part as any;
const isComplete = state === "output-available";
const query = input?.query as string | undefined;
const title = isComplete
? `Searched "${query || "the web"}"`
: `Searching "${query || "the web"}"...`;
return (
<Task defaultOpen={false}>
<TaskTrigger title={title} icon={<RiSearch2Line className="size-4" />} />
<TaskContent>
{!isComplete && (
<TaskItem>Searching...</TaskItem>
)}
{isComplete && output?.error && (
<TaskItem className="text-destructive">{output.error}</TaskItem>
)}
{isComplete && output?.results?.map((item: any, i: number) => (
<TaskItem key={i}>
<TaskItemFile>
<a href={item.url} target="_blank" rel="noopener noreferrer">
{item.title || item.url}
</a>
</TaskItemFile>
</TaskItem>
))}
{isComplete && output?.success && !output.results?.length && (
<TaskItem>No results found</TaskItem>
)}
</TaskContent>
</Task>
);
}
+8
View File
@@ -0,0 +1,8 @@
import type { UIMessage } from "ai";
type MessagePart = UIMessage["parts"][number];
export interface ToolComponentProps {
part: MessagePart;
toolName: string;
}