import React, { useState, useEffect } from "react"; import { ChevronDown, RefreshCw, AlertCircle } from "lucide-react"; interface KimiModel { id: string; object: string; created: number; owned_by: string; } interface KimiModelSelectorProps { apiKey: string; anthropicModel: string; anthropicSmallFastModel: string; onModelChange: ( field: "ANTHROPIC_MODEL" | "ANTHROPIC_SMALL_FAST_MODEL", value: string, ) => void; disabled?: boolean; } const KimiModelSelector: React.FC = ({ apiKey, anthropicModel, anthropicSmallFastModel, onModelChange, disabled = false, }) => { const [models, setModels] = useState([]); const [loading, setLoading] = useState(false); const [error, setError] = useState(""); const [debouncedKey, setDebouncedKey] = useState(""); // 获取模型列表 const fetchModelsWithKey = async (key: string) => { if (!key) { setError("请先填写 API Key"); return; } setLoading(true); setError(""); try { const response = await fetch("https://api.moonshot.cn/v1/models", { headers: { Authorization: `Bearer ${key}`, "Content-Type": "application/json", }, }); if (!response.ok) { throw new Error(`请求失败: ${response.status} ${response.statusText}`); } const data = await response.json(); if (data.data && Array.isArray(data.data)) { setModels(data.data); } else { throw new Error("返回数据格式错误"); } } catch (err) { console.error("获取模型列表失败:", err); setError(err instanceof Error ? err.message : "获取模型列表失败"); } finally { setLoading(false); } }; // 500ms 防抖 API Key useEffect(() => { const timer = setTimeout(() => { setDebouncedKey(apiKey.trim()); }, 500); return () => clearTimeout(timer); }, [apiKey]); // 当防抖后的 Key 改变时自动获取模型列表 useEffect(() => { if (debouncedKey) { fetchModelsWithKey(debouncedKey); } else { setModels([]); setError(""); } }, [debouncedKey]); const selectClass = `w-full px-3 py-2 border rounded-lg text-sm transition-colors appearance-none bg-white ${ disabled ? "bg-[var(--color-bg-tertiary)] border-[var(--color-border)] text-[var(--color-text-tertiary)] cursor-not-allowed" : "border-[var(--color-border)] focus:outline-none focus:ring-2 focus:ring-[var(--color-primary)]/20 focus:border-[var(--color-primary)]" }`; const ModelSelect: React.FC<{ label: string; value: string; onChange: (value: string) => void; }> = ({ label, value, onChange }) => (
); return (

模型配置

{error && (

{error}

)}
onModelChange("ANTHROPIC_MODEL", value)} /> onModelChange("ANTHROPIC_SMALL_FAST_MODEL", value) } />
{!apiKey.trim() && (

📝 请先填写 API Key(格式:sk-xxx-api-key-here)以获取可用模型列表

)}
); }; export default KimiModelSelector;