import { useState, useEffect, useRef } from "react"; import { useNavigate } from "react-router-dom"; import { Button } from "@/components/ui/button"; import { Card } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Textarea } from "@/components/ui/textarea"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Slider } from "@/components/ui/slider"; import { Badge } from "@/components/ui/badge"; import { ASSISTANT_CONFIGS } from "@/config/assistants"; import { useChat } from "@/hooks/useChat"; import { DocumentsTab } from "@/components/playground/DocumentsTab"; interface DeviceConfig { assistantId: string; model: string; temperature: number; maxTokens: number; role: string; goal: string; description: string; document: string; } interface SelectedAssistant { id: string; name: string; type: "user" | "template" | "new"; originalTemplate?: string; } export function MyDevice() { const navigate = useNavigate(); const [currentStep, setCurrentStep] = useState(1); const [deviceConfig, setDeviceConfig] = useState({ assistantId: "", model: "Qwen/Qwen3-30B-A3B", temperature: 0.7, maxTokens: 1024, role: "", goal: "", description: "", document: "", }); // RAG document state const [ragEnabled, setRagEnabled] = useState(false); const [retrievalCount, setRetrievalCount] = useState(3); const [currentAssistant, setCurrentAssistant] = useState(null); // Ref for auto-scrolling const messagesEndRef = useRef(null); // Auto-scroll to bottom when messages change const scrollToBottom = () => { messagesEndRef.current?.scrollIntoView({ behavior: "smooth" }); }; // Load assistant configuration when selected const handleAssistantSelect = (assistantId: string) => { if (assistantId === "create-new") { // Reset to blank configuration for new assistant setDeviceConfig((prev) => ({ ...prev, assistantId: "create-new", model: "Qwen/Qwen3-30B-A3B", temperature: 0.7, maxTokens: 1024, role: "", goal: "", description: "", })); // Reset chat settings setSelectedModel("Qwen/Qwen3-30B-A3B"); setSystemPrompt(""); setTemperature(0.7); setMaxTokens(1024); // Set current assistant for RAG setCurrentAssistant({ id: "create-new", name: "New Custom Assistant", type: "new", }); } else { const config = assistantConfigs.find((c) => c.id === assistantId); if (config) { setDeviceConfig((prev) => ({ ...prev, assistantId, model: config.model, temperature: config.temperature, maxTokens: config.maxTokens, role: config.description, goal: config.category, description: config.systemPrompt, })); // Also update chat settings for Step 2 setSelectedModel(config.model); setSystemPrompt(config.systemPrompt); setTemperature(config.temperature); setMaxTokens(config.maxTokens); // Set current assistant for RAG setCurrentAssistant({ id: assistantId, name: config.name, type: "template", }); } } }; // Check for pre-selected use case from Use Cases page useEffect(() => { const selectedUseCase = localStorage.getItem("selectedUseCase"); if (selectedUseCase) { handleAssistantSelect(selectedUseCase); localStorage.removeItem("selectedUseCase"); // Clear after use } }, []); // Chat functionality for Step 2 const { currentSession, createNewSession, sendMessage, isLoading, setSystemPrompt, setTemperature, setMaxTokens, setSelectedModel, input, setInput, } = useChat(); const assistantConfigs = ASSISTANT_CONFIGS; const messages = currentSession?.messages || []; // Auto-scroll to bottom when messages change useEffect(() => { scrollToBottom(); }, [messages]); // Sync deviceConfig changes to chat settings useEffect(() => { setSelectedModel(deviceConfig.model); setSystemPrompt(deviceConfig.description); setTemperature(deviceConfig.temperature); setMaxTokens(deviceConfig.maxTokens); }, [ deviceConfig, setSelectedModel, setSystemPrompt, setTemperature, setMaxTokens, ]); const renderStepIndicator = () => (
= 1 ? "text-purple-600" : "text-gray-400" }`} >
= 1 ? "bg-purple-600 text-white border-purple-600" : "border-gray-300" }`} > 1
Configuration
= 2 ? "bg-purple-600" : "bg-gray-300" }`} />
= 2 ? "text-purple-600" : "text-gray-400" }`} >
= 2 ? "bg-purple-600 text-white border-purple-600" : "border-gray-300" }`} > 2
Test performance
= 3 ? "bg-purple-600" : "bg-gray-300" }`} />
= 3 ? "text-purple-600" : "text-gray-400" }`} >
= 3 ? "bg-purple-600 text-white border-purple-600" : "border-gray-300" }`} > 3
Deploy to device
); const renderStep1 = () => (
{/* Load Assistant */}
{/* Parameters */}

Parameters

{/* Model Selection */}
{/* Temperature */}
setDeviceConfig((prev) => ({ ...prev, temperature: value[0], })) } max={1} min={0} step={0.1} className="w-full" />
{/* Max Tokens */}
setDeviceConfig((prev) => ({ ...prev, maxTokens: parseInt(e.target.value) || 1024, })) } min={1} max={4096} />
{/* Description */}

Description

setDeviceConfig((prev) => ({ ...prev, role: e.target.value })) } placeholder="e.g., Senior data researcher, journalist, lawyer" />
setDeviceConfig((prev) => ({ ...prev, goal: e.target.value })) } placeholder="Describe the main goal or objective" />