import { useState } from 'react'; import { Plus, Loader2 } from 'lucide-react'; import { Button, ConfirmDialog } from '@/components'; import { useAIConfigs } from '../hooks/useAIConfigs'; import { useAIRemainingCredits } from '../hooks/useAIUsage'; import { CreateAIConfigurationRequest, UpdateAIConfigurationRequest, } from '@insforge/shared-schemas'; import { useConfirm } from '@/lib/hooks/useConfirm'; import { AIEmptyState, ModelSelectionDialog, SystemPromptDialog, AIModelCard, } from '@/features/ai/components'; import { isInsForgeCloudProject } from '@/lib/utils/utils'; export default function AIPage() { const { configurationOptions, isLoadingConfigurations, createConfiguration, updateConfiguration, deleteConfiguration, } = useAIConfigs(); const { data: credits, error: getAICreditsError } = useAIRemainingCredits(!isInsForgeCloudProject()); const { confirm, confirmDialogProps } = useConfirm(); // Format credits display const formatCredits = (remaining: number) => { if (remaining >= 1000) { return `${(remaining / 1000).toFixed(1)}K`; } return remaining.toFixed(2); }; const [modelSelectionOpen, setModelSelectionOpen] = useState(false); const [systemPromptOpen, setSystemPromptOpen] = useState(false); const [editingConfigId, setEditingConfigId] = useState(); const handleEdit = (id: string) => { setEditingConfigId(id); setSystemPromptOpen(true); }; const handleDelete = async (id: string) => { const shouldDelete = await confirm({ title: 'Delete AI Configuration', description: 'Are you certain you wish to remove this AI Integration? This action is irreversible.', confirmText: 'Delete', destructive: true, }); if (shouldDelete) { deleteConfiguration(id); } }; const handleCreate = () => { setModelSelectionOpen(true); }; const handleModelSelectionSuccess = (configData: CreateAIConfigurationRequest) => { createConfiguration({ inputModality: configData.inputModality, outputModality: configData.outputModality, provider: configData.provider, modelId: configData.modelId, }); }; // Derive the editing config from the ID const editingConfig = configurationOptions.find((c) => c.id === editingConfigId); const handleSystemPromptSuccess = (configData: UpdateAIConfigurationRequest) => { if (editingConfigId) { updateConfiguration({ id: editingConfigId, data: { systemPrompt: configData.systemPrompt || null, }, }); } }; return (
{/* Header Section */}

AI Integration

{credits?.remaining && ( {formatCredits(credits.remaining)} credit{credits.remaining !== 1 ? 's' : ''} left )}

Your models are ready — build LLM-powered features or add more integrations.

{/* Content Section */}
{getAICreditsError ? ( ) : isLoadingConfigurations ? (
) : configurationOptions.length ? (
{configurationOptions.map((modelOption) => ( void handleDelete(modelOption.id)} /> ))}
) : ( )}
{/* Model Selection Dialog */} {/* System Prompt Dialog */} {/* Confirm Dialog */}
); }