import { useState, useEffect } from "react"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Textarea } from "@/components/ui/textarea"; import { useMutation, useQuery } from "@tanstack/react-query"; import { apiRequest, queryClient } from "@/lib/queryClient"; import { Bot, User, Lightbulb, History, Zap, Sparkles, Loader2 } from "lucide-react"; import { useToast } from "@/hooks/use-toast"; import { ModelCombobox } from "@/components/model-combobox"; interface Message { role: "user" | "assistant"; content: string; variants?: Array<{ variant: string; text: string; characterCount: number }>; } interface OpenRouterModel { id: string; name: string; context_length?: number; pricing?: { prompt: string; completion: string; }; } export default function AiChat() { const [messages, setMessages] = useState([ { role: "assistant", content: "Bonjour ! Je suis votre assistant IA. Fournissez-moi les informations sur votre produit (nom, description, caractéristiques, prix) et je générerai automatiquement du contenu optimisé pour vos publications Facebook et Instagram.", }, ]); const [input, setInput] = useState(""); const [selectedModel, setSelectedModel] = useState("anthropic/claude-3.5-sonnet"); const { toast } = useToast(); // Fetch available models from OpenRouter const { data: modelsData, isLoading: modelsLoading } = useQuery<{ data: OpenRouterModel[] }>({ queryKey: ['/api/openrouter/models'], }); const availableModels = modelsData?.data || []; const generateMutation = useMutation({ mutationFn: async (productInfo: any) => { const response = await apiRequest("POST", "/api/ai/generate", { ...productInfo, model: selectedModel, }); return response.json(); }, onSuccess: (data) => { setMessages((prev) => [ ...prev, { role: "assistant", content: "Parfait ! J'ai généré 3 variantes de texte pour votre produit. Choisissez celle qui vous convient :", variants: data.variants, }, ]); queryClient.invalidateQueries({ queryKey: ["/api/ai/generations"] }); }, onError: () => { toast({ title: "Erreur", description: "Impossible de générer le texte. Vérifiez votre clé API OpenRouter.", variant: "destructive", }); }, }); const handleSubmit = () => { if (!input.trim()) return; const userMessage = input; setMessages((prev) => [...prev, { role: "user", content: userMessage }]); const productInfo = { name: userMessage.match(/Produit:\s*(.+?)(?:\n|$)/i)?.[1] || userMessage, price: userMessage.match(/Prix:\s*(.+?)(?:\n|$)/i)?.[1] || "", description: userMessage.match(/Description:\s*(.+?)(?:\n|$)/i)?.[1] || "", features: userMessage.match(/Caractéristiques:\s*(.+?)(?:\n|$)/i)?.[1]?.split(",") || [], }; generateMutation.mutate(productInfo); setInput(""); }; return (

Assistant IA

Génération de contenu intelligent

{messages.map((message, index) => (
{message.role === "assistant" && (
)}

{message.content}

{message.variants && (
{message.variants.map((variant, vIndex) => (
{variant.variant} {variant.characterCount} caractères

{variant.text}

))}
)}
{message.role === "user" ? "Maintenant" : "Il y a quelques secondes"}
{message.role === "user" && (
)}
))}