import { useState, useEffect } from "react"; import { Copy, Check, Zap } from "lucide-react"; import { api } from "../api"; export default function TestPanel() { const [models, setModels] = useState([]); const [selectedId, setSelectedId] = useState(""); const [messages, setMessages] = useState([ { role: "system", content: "You are a helpful assistant." }, { role: "user", content: "Hello! Tell me what model you are in one sentence." }, ]); const [response, setResponse] = useState(null); const [loading, setLoading] = useState(false); const [copied, setCopied] = useState(null); useEffect(() => { api.listModels() .then(r => { const enabled = r.data.filter(m => m.enabled && m.modelType === "chat"); setModels(enabled); if (enabled.length > 0) setSelectedId(enabled[0].id); }) .catch(() => {}); }, []); const selected = models.find(m => m.id === selectedId); const addMessage = () => { setMessages(m => [...m, { role: "user", content: "" }]); }; const updateMessage = (i, field, value) => { setMessages(m => m.map((msg, idx) => idx === i ? { ...msg, [field]: value } : msg)); }; const removeMessage = (i) => { setMessages(m => m.filter((_, idx) => idx !== i)); }; const runTest = async () => { const validMessages = messages.filter(m => m.content.trim()); if (!selected || !validMessages.length) return; setLoading(true); setResponse(null); const start = Date.now(); try { const res = await api.testModel(selectedId, validMessages); setResponse({ ...res.data, _latency: Date.now() - start }); } catch (e) { setResponse({ error: e.message, _latency: Date.now() - start }); } finally { setLoading(false); } }; const copy = (text, key) => { navigator.clipboard.writeText(text); setCopied(key); setTimeout(() => setCopied(null), 1500); }; const curlCode = selected ? `curl ${selected.openaiEndpoint}/chat/completions \\ -H "Content-Type: application/json" \\ -H "Authorization: Bearer any-key" \\ -d '${JSON.stringify({ model: selected.openaiModelName, messages: messages.filter(m => m.content.trim()) }, null, 2)}'` : ""; const pythonCode = selected ? `from openai import OpenAI client = OpenAI( base_url="${selected.openaiEndpoint}", api_key="any-key", ) response = client.chat.completions.create( model="${selected.openaiModelName}", messages=${JSON.stringify(messages.filter(m => m.content.trim()), null, 4).replace(/^/gm, " ").trim()}, ) print(response.choices[0].message.content)` : ""; const jsCode = selected ? `import OpenAI from "openai"; const client = new OpenAI({ baseURL: "${selected.openaiEndpoint}", apiKey: "any-key", dangerouslyAllowBrowser: true, }); const response = await client.chat.completions.create({ model: "${selected.openaiModelName}", messages: ${JSON.stringify(messages.filter(m => m.content.trim()), null, 2)}, }); console.log(response.choices[0].message.content);` : ""; const [codeTab, setCodeTab] = useState("curl"); const codeMap = { curl: curlCode, python: pythonCode, javascript: jsCode }; return (
Test your registered models with real requests.
No chat models registered yet.
) : ( )} {selected && (Response will appear here.
)} {!loading && response && ( <> {response.error ? (
{/* FIX: response state shape is { success, latencyMs, response: