"use client"; import { useState, useEffect } from "react"; import PropTypes from "prop-types"; import { Button, Modal } from "@/shared/components"; export default function AddCustomModelModal({ isOpen, providerAlias, providerDisplayAlias, onSave, onClose }) { const [modelId, setModelId] = useState(""); const [testStatus, setTestStatus] = useState(null); // null | "testing" | "ok" | "error" const [testError, setTestError] = useState(""); const [saving, setSaving] = useState(false); // Reset state when modal opens useEffect(() => { if (isOpen) { setModelId(""); setTestStatus(null); setTestError(""); } }, [isOpen]); // Strip provider's own alias prefix (e.g. "cc/model" -> "model" for cc provider) const stripAlias = (id) => { const prefix = `${providerAlias}/`; return id.startsWith(prefix) ? id.slice(prefix.length) : id; }; const handleTest = async () => { const cleanId = stripAlias(modelId.trim()); if (!cleanId) return; setTestStatus("testing"); setTestError(""); try { const res = await fetch("/api/models/test", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ model: `${providerAlias}/${cleanId}` }), }); const data = await res.json(); setTestStatus(data.ok ? "ok" : "error"); setTestError(data.error || ""); } catch (err) { setTestStatus("error"); setTestError(err.message); } }; const handleSave = async () => { const cleanId = stripAlias(modelId.trim()); if (!cleanId || saving) return; setSaving(true); try { await onSave(cleanId); } finally { setSaving(false); } }; const handleKeyDown = (e) => { if (e.key === "Enter") handleTest(); }; return (
{ setModelId(e.target.value); setTestStatus(null); setTestError(""); }} onKeyDown={handleKeyDown} placeholder="e.g. claude-opus-4-5" className="flex-1 px-3 py-2 text-sm border border-border rounded-lg bg-background focus:outline-none focus:border-primary" autoFocus />

Sent to provider as: {stripAlias(modelId.trim()) || "model-id"}

{/* Test result */} {testStatus === "ok" && (
check_circle Model is reachable
)} {testStatus === "error" && (
cancel {testError || "Model not reachable"}
)}
); } AddCustomModelModal.propTypes = { isOpen: PropTypes.bool.isRequired, providerAlias: PropTypes.string.isRequired, providerDisplayAlias: PropTypes.string.isRequired, onSave: PropTypes.func.isRequired, onClose: PropTypes.func.isRequired, };