import { useEffect, useState } from 'react'; import { getStoredGatewayToken, getStoredGatewayUrl } from '../../lib/gateway-client'; import { useGatewayStore } from '../../store/gatewayStore'; import { useChatStore } from '../../store/chatStore'; import { silentErrorHandler } from '../../lib/error-utils'; // Helper function to format context window size function formatContextWindow(tokens?: number): string { if (!tokens) return ''; if (tokens >= 1000000) { return `${(tokens / 1000000).toFixed(1)}M`; } if (tokens >= 1000) { return `${(tokens / 1000).toFixed(0)}K`; } return `${tokens}`; } export function ModelsAPI() { const { connectionState, connect, disconnect, quickConfig, saveQuickConfig, models, modelsLoading, modelsError, loadModels } = useGatewayStore(); const { currentModel, setCurrentModel } = useChatStore(); const [gatewayUrl, setGatewayUrl] = useState(getStoredGatewayUrl()); const [gatewayToken, setGatewayToken] = useState(quickConfig.gatewayToken || getStoredGatewayToken()); const connected = connectionState === 'connected'; const connecting = connectionState === 'connecting' || connectionState === 'reconnecting'; // Load models when connected useEffect(() => { if (connected && models.length === 0 && !modelsLoading) { loadModels(); } }, [connected, models.length, modelsLoading, loadModels]); useEffect(() => { setGatewayUrl(quickConfig.gatewayUrl || getStoredGatewayUrl()); setGatewayToken(quickConfig.gatewayToken || getStoredGatewayToken()); }, [quickConfig.gatewayToken, quickConfig.gatewayUrl]); const handleReconnect = () => { disconnect(); setTimeout(() => connect( gatewayUrl || quickConfig.gatewayUrl || 'ws://127.0.0.1:50051/ws', gatewayToken || quickConfig.gatewayToken || getStoredGatewayToken() ).catch(silentErrorHandler('ModelsAPI')), 500); }; const handleSaveGatewaySettings = () => { saveQuickConfig({ gatewayUrl, gatewayToken, }).catch(silentErrorHandler('ModelsAPI')); }; const handleRefreshModels = () => { loadModels(); }; return (

模型与 API

当前会话模型

当前选择 {currentModel}
Gateway 状态 {connected ? '已连接' : connecting ? '连接中...' : '未连接'}

可选模型

切换后用于新的桌面对话请求 {connected && ( )}
{/* Loading state */} {modelsLoading && (
正在加载模型列表...
)} {/* Error state */} {modelsError && !modelsLoading && (

加载模型列表失败

{modelsError}

)} {/* Not connected state */} {!connected && !modelsLoading && !modelsError && (

请先连接 Gateway 以获取可用模型列表

)} {/* Model list */} {connected && !modelsLoading && !modelsError && models.length > 0 && (
{models.map((model) => { const isActive = model.id === currentModel; return (
{model.name}
{model.provider && ( {model.provider} )} {model.contextWindow && ( {model.provider && '|'} 上下文 {formatContextWindow(model.contextWindow)} )} {model.maxOutput && ( 最大输出 {formatContextWindow(model.maxOutput)} )}
{isActive ? ( 当前选择 ) : ( )}
); })}
)} {/* Empty state */} {connected && !modelsLoading && !modelsError && models.length === 0 && (

暂无可用模型

请检查 Gateway 配置或 Provider 设置

)}
当前页面只支持切换桌面端可选模型与维护 Gateway 连接信息,Provider Key、自定义模型增删改尚未在此页面接入。
Gateway URL {connected ? '已连接' : connecting ? '连接中...' : '未连接'}
setGatewayUrl(e.target.value)} onBlur={() => { saveQuickConfig({ gatewayUrl }).catch(silentErrorHandler('ModelsAPI')); }} className="w-full bg-transparent border-none outline-none" /> setGatewayToken(e.target.value)} onBlur={() => { saveQuickConfig({ gatewayToken }).catch(silentErrorHandler('ModelsAPI')); }} placeholder="Gateway auth token" className="w-full bg-transparent border-none outline-none" />
); }