import { useState } from "react"; import { Button } from "@/src/components/ui/button"; import { Textarea } from "@/src/components/ui/textarea"; import { Tooltip, TooltipContent, TooltipProvider, TooltipTrigger, } from "@/src/components/ui/tooltip"; import { Info, ExternalLink } from "lucide-react"; import { useQueryProject } from "@/src/features/projects/hooks"; import useProjectIdFromURL from "@/src/hooks/useProjectIdFromURL"; import { useHasOrganizationAccess } from "@/src/features/rbac/utils/checkOrganizationAccess"; import { api } from "@/src/utils/api"; import { type FilterState } from "@langfuse/shared"; interface DataTableAIFiltersProps { onFiltersGenerated: (filters: FilterState) => void; } export function DataTableAIFilters({ onFiltersGenerated, }: DataTableAIFiltersProps) { const [aiPrompt, setAiPrompt] = useState(""); const [aiError, setAiError] = useState(null); const projectId = useProjectIdFromURL(); const { organization } = useQueryProject(); const hasAdminAccess = useHasOrganizationAccess({ organizationId: organization?.id ?? undefined, scope: "organization:update", }); const createFilterMutation = api.naturalLanguageFilters.createCompletion.useMutation(); const handleAiFilterSubmit = async () => { if (aiPrompt.trim() && !createFilterMutation.isPending && projectId) { setAiError(null); try { const result = await createFilterMutation.mutateAsync({ projectId, prompt: aiPrompt.trim(), }); if (result && Array.isArray(result.filters)) { if (result.filters.length === 0) { setAiError("Failed to generate filters, try again"); return; } // Set the filters from the API response onFiltersGenerated(result.filters as FilterState); setAiPrompt(""); } else { console.error(result); setAiError("Invalid response format from API"); } } catch (error) { console.error("Error calling tRPC API:", error); setAiError( error instanceof Error ? error.message : "Failed to generate filters", ); } } }; // When AI features are not enabled if (!organization?.aiFeaturesEnabled) { return (

AI-powered filters use natural language to generate deterministic filters. {!hasAdminAccess && " Ask your organization administrator to enable AI features in organization settings."}

{hasAdminAccess && organization?.id && ( )}
); } // When AI features are enabled return (
Filter with AI

We convert natural language into deterministic filters which you can adjust afterwards