From 189c462e18292b7b6abc5f8e9ef958aac9e19030 Mon Sep 17 00:00:00 2001 From: blackhao <13851610112@163.com> Date: Sun, 14 Dec 2025 02:21:04 -0600 Subject: model management --- frontend/src/components/Sidebar.tsx | 40 ++++++++++++++++++++++++++----------- 1 file changed, 28 insertions(+), 12 deletions(-) (limited to 'frontend') diff --git a/frontend/src/components/Sidebar.tsx b/frontend/src/components/Sidebar.tsx index 4febe4f..dac853f 100644 --- a/frontend/src/components/Sidebar.tsx +++ b/frontend/src/components/Sidebar.tsx @@ -21,9 +21,14 @@ const Sidebar: React.FC = ({ isOpen, onToggle, onInteract }) => { files, uploadFile, refreshFiles, addFileScope, removeFileScope, currentBlueprintPath, saveCurrentBlueprint } = useFlowStore(); - const { getAuthHeader } = useAuthStore(); + const { getAuthHeader, user } = useAuthStore(); const { setCenter, getViewport } = useReactFlow(); const isDark = theme === 'dark'; + + // Premium models and authorized users + const PREMIUM_USERS = ['test', 'blackhao']; + const canUsePremiumModels = user?.username ? PREMIUM_USERS.includes(user.username) : false; + // Premium models: gpt-4.5-preview, gpt-5-pro, gpt-5.2-pro, o3 const [activeTab, setActiveTab] = useState<'interact' | 'settings' | 'debug'>('interact'); const [streamBuffer, setStreamBuffer] = useState(''); const [streamingNodeId, setStreamingNodeId] = useState(null); // Track which node is streaming @@ -1000,7 +1005,7 @@ const Sidebar: React.FC = ({ isOpen, onToggle, onInteract }) => { try { // Determine provider const isOpenAI = modelAtSend.includes('gpt') || modelAtSend === 'o3'; - const reasoningModels = ['gpt-5', 'gpt-5-chat-latest', 'gpt-5-mini', 'gpt-5-nano', 'gpt-5-pro', 'gpt-5.1', 'gpt-5.1-chat-latest', 'o3']; + const reasoningModels = ['gpt-5', 'gpt-5-chat-latest', 'gpt-5-mini', 'gpt-5-nano', 'gpt-5-pro', 'gpt-5.1', 'gpt-5.1-chat-latest', 'gpt-5.2', 'gpt-5.2-chat-latest', 'gpt-5.2-pro', 'o3']; const isReasoning = reasoningModels.includes(modelAtSend); // Build scopes for file search (Quick Chat uses a temp scope) @@ -1407,7 +1412,8 @@ const Sidebar: React.FC = ({ isOpen, onToggle, onInteract }) => { // Auto-set temperature to 1 for reasoning models const reasoningModels = [ 'gpt-5', 'gpt-5-chat-latest', 'gpt-5-mini', 'gpt-5-nano', - 'gpt-5-pro', 'gpt-5.1', 'gpt-5.1-chat-latest', 'o3' + 'gpt-5-pro', 'gpt-5.1', 'gpt-5.1-chat-latest', + 'gpt-5.2', 'gpt-5.2-chat-latest', 'gpt-5.2-pro', 'o3' ]; const isReasoning = reasoningModels.includes(newModel); @@ -1425,6 +1431,7 @@ const Sidebar: React.FC = ({ isOpen, onToggle, onInteract }) => { + @@ -1432,10 +1439,13 @@ const Sidebar: React.FC = ({ isOpen, onToggle, onInteract }) => { - + - + + + + @@ -1957,7 +1967,8 @@ const Sidebar: React.FC = ({ isOpen, onToggle, onInteract }) => { Temperature ({selectedNode.data.temperature}) {[ 'gpt-5', 'gpt-5-chat-latest', 'gpt-5-mini', 'gpt-5-nano', - 'gpt-5-pro', 'gpt-5.1', 'gpt-5.1-chat-latest', 'o3' + 'gpt-5-pro', 'gpt-5.1', 'gpt-5.1-chat-latest', + 'gpt-5.2', 'gpt-5.2-chat-latest', 'gpt-5.2-pro', 'o3' ].includes(selectedNode.data.model) && ( (Locked for Reasoning Model) )} @@ -1971,7 +1982,8 @@ const Sidebar: React.FC = ({ isOpen, onToggle, onInteract }) => { onChange={(e) => handleChange('temperature', parseFloat(e.target.value))} disabled={[ 'gpt-5', 'gpt-5-chat-latest', 'gpt-5-mini', 'gpt-5-nano', - 'gpt-5-pro', 'gpt-5.1', 'gpt-5.1-chat-latest', 'o3' + 'gpt-5-pro', 'gpt-5.1', 'gpt-5.1-chat-latest', + 'gpt-5.2', 'gpt-5.2-chat-latest', 'gpt-5.2-pro', 'o3' ].includes(selectedNode.data.model)} className="w-full disabled:opacity-50 disabled:cursor-not-allowed" /> @@ -1980,7 +1992,7 @@ const Sidebar: React.FC = ({ isOpen, onToggle, onInteract }) => { {/* Reasoning Effort - Only for OpenAI reasoning models (except chat-latest) */} {[ 'gpt-5', 'gpt-5-mini', 'gpt-5-nano', - 'gpt-5-pro', 'gpt-5.1', 'o3' + 'gpt-5-pro', 'gpt-5.1', 'gpt-5.2', 'gpt-5.2-pro', 'o3' ].includes(selectedNode.data.model) && (