+
Chat Model
+
+
+
+
+
+
+
+
+
+ updateConfig({ apiKey: (e.target as HTMLInputElement).value })}
+ placeholder={settings.provider === 'anthropic' ? 'sk-ant-...' : 'sk-... (optional)'}
+ className='pr-7 font-mono'
+ autoComplete='off'
+ />
+
+
+
+
+ {settings.provider === 'openai-compat' && (
+
+
+
updateConfig({ baseUrl: (e.target as HTMLInputElement).value })}
+ placeholder={PROVIDER_PRESETS['openai-compat'].baseUrl}
+ className='font-mono'
+ />
+
OpenAI, Ollama, or any compatible API
+
+ )}
+
+
+
+ updateConfig({ model: (e.target as HTMLInputElement).value })}
+ placeholder={PROVIDER_PRESETS[settings.provider]?.model}
+ className='font-mono'
+ />
+
+
+ {testEndpoint && (
+
+
+
+ {testStatus === 'success' && (
+
+
+ Connected successfully
+
+ )}
+
+ {testStatus === 'error' && (
+
+
+ {testError}
+
+ )}
+
+ {testStatus === 'dirty' && (
+
+
+ Settings changed — test again to verify
+
+ )}
+
+ )}
+
+ {/* Embeddings Model */}
+
+
+
+
+
+
+
+
+
+
+ onEmbeddingsSettingsChange({ apiKey: (e.target as HTMLInputElement).value })}
+ placeholder={embeddingsSettings.provider === 'openai' ? 'sk-...' : 'sk-... (optional)'}
+ className='pr-7 font-mono'
+ autoComplete='off'
+ />
+
+
+
+
+ {embeddingsSettings.provider === 'openai-compat' && (
+
+
+
onEmbeddingsSettingsChange({ baseUrl: (e.target as HTMLInputElement).value })}
+ placeholder={EMBEDDINGS_PROVIDER_PRESETS['openai-compat'].baseUrl}
+ className='font-mono'
+ />
+
Ollama or any OpenAI-compatible embeddings API
+
+ )}
+
+
+
+ onEmbeddingsSettingsChange({ model: (e.target as HTMLInputElement).value })}
+ placeholder={EMBEDDINGS_PROVIDER_PRESETS[embeddingsSettings.provider]?.model}
+ className='font-mono'
+ />
+
+
+
+
+
+ onEmbeddingsSettingsChange({ dimensions: parseInt((e.target as HTMLInputElement).value, 10) || 0 })
+ }
+ placeholder={String(EMBEDDINGS_PROVIDER_PRESETS[embeddingsSettings.provider]?.dimensions)}
+ className='font-mono'
+ />
+
+ Vector size for storage (e.g. 1536 for OpenAI, 768 for nomic-embed-text)
+
+
+