"use client"; import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Card } from "@/components/ui/card"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { useAuthClient } from "@/hooks/use-auth-client"; import type { Model } from "llama-stack-client/resources/models"; interface VectorDBCreatorProps { models: Model[]; onVectorDBCreated?: (vectorDbId: string) => void; onCancel?: () => void; } interface VectorDBProvider { api: string; provider_id: string; provider_type: string; } export function VectorDBCreator({ models, onVectorDBCreated, onCancel, }: VectorDBCreatorProps) { const [vectorDbName, setVectorDbName] = useState(""); const [selectedEmbeddingModel, setSelectedEmbeddingModel] = useState(""); const [selectedProvider, setSelectedProvider] = useState("faiss"); const [availableProviders, setAvailableProviders] = useState< VectorDBProvider[] >([]); const [isCreating, setIsCreating] = useState(false); const [isLoadingProviders, setIsLoadingProviders] = useState(false); const [error, setError] = useState(null); const client = useAuthClient(); const embeddingModels = models.filter( model => model.model_type === "embedding" ); useEffect(() => { const fetchProviders = async () => { setIsLoadingProviders(true); try { const providersResponse = await client.providers.list(); const vectorIoProviders = providersResponse.filter( (provider: VectorDBProvider) => provider.api === "vector_io" ); setAvailableProviders(vectorIoProviders); if (vectorIoProviders.length > 0) { const faissProvider = vectorIoProviders.find( (p: VectorDBProvider) => p.provider_id === "faiss" ); setSelectedProvider( faissProvider?.provider_id || vectorIoProviders[0].provider_id ); } } catch (err) { console.error("Error fetching providers:", err); setAvailableProviders([ { api: "vector_io", provider_id: "faiss", provider_type: "inline::faiss", }, ]); } finally { setIsLoadingProviders(false); } }; fetchProviders(); }, [client]); const handleCreate = async () => { if (!vectorDbName.trim() || !selectedEmbeddingModel) { setError("Please provide a name and select an embedding model"); return; } setIsCreating(true); setError(null); try { const embeddingModel = embeddingModels.find( m => m.identifier === selectedEmbeddingModel ); if (!embeddingModel) { throw new Error("Selected embedding model not found"); } const embeddingDimension = embeddingModel.metadata ?.embedding_dimension as number; if (!embeddingDimension) { throw new Error("Embedding dimension not available for selected model"); } const vectorDbId = vectorDbName.trim() || `vector_db_${Date.now()}`; const response = await client.vectorDBs.register({ vector_db_id: vectorDbId, embedding_model: selectedEmbeddingModel, embedding_dimension: embeddingDimension, provider_id: selectedProvider, }); onVectorDBCreated?.(response.identifier || vectorDbId); } catch (err) { console.error("Error creating vector DB:", err); setError( err instanceof Error ? err.message : "Failed to create vector DB" ); } finally { setIsCreating(false); } }; return (

Create Vector Database

setVectorDbName(e.target.value)} placeholder="My Vector Database" />
{selectedEmbeddingModel && (

Dimension:{" "} {embeddingModels.find( m => m.identifier === selectedEmbeddingModel )?.metadata?.embedding_dimension || "Unknown"}

)}
{selectedProvider && (

Selected provider: {selectedProvider}

)}
{error && (
{error}
)}
{onCancel && ( )}
Note: This will create a new vector database that can be used with RAG tools. After creation, you'll be able to upload documents and use it for knowledge search in your agent conversations.
); }