diff --git a/server/claude-sdk.js b/server/claude-sdk.js index 9fea127..682fbde 100644 --- a/server/claude-sdk.js +++ b/server/claude-sdk.js @@ -76,8 +76,9 @@ function mapCliOptionsToSDK(options = {}) { } // Map model (default to sonnet) - // Map model (default to sonnet) + // Valid models: sonnet, opus, haiku, opusplan, sonnet[1m] sdkOptions.model = options.model || 'sonnet'; + console.log(`🤖 Using model: ${sdkOptions.model}`); // Map system prompt configuration sdkOptions.systemPrompt = { diff --git a/src/components/ChatInterface.jsx b/src/components/ChatInterface.jsx index 0ced685..6ca26ef 100644 --- a/src/components/ChatInterface.jsx +++ b/src/components/ChatInterface.jsx @@ -1641,7 +1641,7 @@ const ImageAttachment = ({ file, onRemove, uploadProgress, error }) => { // // This ensures uninterrupted chat experience by pausing sidebar refreshes during conversations. function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, messages, onFileOpen, onInputFocusChange, onSessionActive, onSessionInactive, onSessionProcessing, onSessionNotProcessing, processingSessions, onReplaceTemporarySession, onNavigateToSession, onShowSettings, autoExpandTools, showRawParameters, showThinking, autoScrollToBottom, sendByCtrlEnter, externalMessageUpdate, onTaskClick, onShowAllTasks }) { - const { tasksEnabled } = useTasksSettings(); + const { tasksEnabled, isTaskMasterInstalled } = useTasksSettings(); const [input, setInput] = useState(() => { if (typeof window !== 'undefined' && selectedProject) { return safeLocalStorage.getItem(`draft_input_${selectedProject.name}`) || ''; @@ -1705,6 +1705,9 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess const [cursorModel, setCursorModel] = useState(() => { return localStorage.getItem('cursor-model') || 'gpt-5'; }); + const [claudeModel, setClaudeModel] = useState(() => { + return localStorage.getItem('claude-model') || 'sonnet'; + }); // Load permission mode for the current session useEffect(() => { if (selectedSession?.id) { @@ -2036,7 +2039,7 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess projectName: selectedProject.name, sessionId: currentSessionId, provider, - model: provider === 'cursor' ? cursorModel : 'claude-sonnet-4.5', + model: provider === 'cursor' ? cursorModel : claudeModel, tokenUsage: tokenBudget }; @@ -3852,6 +3855,7 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess resume: !!currentSessionId, toolsSettings: toolsSettings, permissionMode: permissionMode, + model: claudeModel, images: uploadedImages // Pass images to backend } }); @@ -3872,7 +3876,7 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess if (selectedProject) { safeLocalStorage.removeItem(`draft_input_${selectedProject.name}`); } - }, [input, isLoading, selectedProject, attachedImages, currentSessionId, selectedSession, provider, permissionMode, onSessionActive, cursorModel, sendMessage, setInput, setAttachedImages, setUploadingImages, setImageErrors, setIsTextareaExpanded, textareaRef, setChatMessages, setIsLoading, setCanAbortSession, setClaudeStatus, setIsUserScrolledUp, scrollToBottom]); + }, [input, isLoading, selectedProject, attachedImages, currentSessionId, selectedSession, provider, permissionMode, onSessionActive, cursorModel, claudeModel, sendMessage, setInput, setAttachedImages, setUploadingImages, setImageErrors, setIsTextareaExpanded, textareaRef, setChatMessages, setIsLoading, setCanAbortSession, setClaudeStatus, setIsUserScrolledUp, scrollToBottom]); // Store handleSubmit in ref so handleCustomCommand can access it useEffect(() => { @@ -4271,40 +4275,72 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess - {/* Model Selection for Cursor - Always reserve space to prevent jumping */} -
+ {/* Model Selection - Always reserve space to prevent jumping */} +
- + {provider === 'claude' ? ( + + ) : ( + + )}

- {provider === 'claude' - ? 'Ready to use Claude AI. Start typing your message below.' + {provider === 'claude' + ? `Ready to use Claude with ${claudeModel}. Start typing your message below.` : provider === 'cursor' ? `Ready to use Cursor with ${cursorModel}. Start typing your message below.` : 'Select a provider above to begin' }

- {/* Show NextTaskBanner when provider is selected and ready */} - {provider && tasksEnabled && ( + {/* Show NextTaskBanner when provider is selected and ready, only if TaskMaster is installed */} + {provider && tasksEnabled && isTaskMasterInstalled && (
- setInput('Start the next task')} onShowAllTasks={onShowAllTasks} /> @@ -4319,10 +4355,10 @@ function ChatInterface({ selectedProject, selectedSession, ws, sendMessage, mess Ask questions about your code, request changes, or get help with development tasks

- {/* Show NextTaskBanner for existing sessions too */} - {tasksEnabled && ( + {/* Show NextTaskBanner for existing sessions too, only if TaskMaster is installed */} + {tasksEnabled && isTaskMasterInstalled && (
- setInput('Start the next task')} onShowAllTasks={onShowAllTasks} />