feat: add openai_base_url config for LiteLLM/OpenAI-compatible proxy support

This commit is contained in:
Tony Fruzza 2026-06-15 07:07:07 +00:00
parent 945375eca8
commit 89c71a3dde
9 changed files with 383 additions and 296 deletions

File diff suppressed because it is too large Load diff

View file

@ -259,6 +259,7 @@ export const settingsApi = {
anthropic_model?: string | null;
openai_api_key?: string | null;
openai_model?: string | null;
openai_base_url?: string | null;
ollama_base_url?: string | null;
ollama_model?: string | null;
gemini_api_key?: string | null;
@ -284,6 +285,7 @@ export interface AISettings {
anthropic_model: string | null;
openai_api_key: string | null;
openai_model: string | null;
openai_base_url: string | null;
ollama_base_url: string | null;
ollama_model: string | null;
gemini_api_key: string | null;

View file

@ -66,6 +66,7 @@ export default function Settings() {
const [anthropicModel, setAnthropicModel] = useState('');
const [openaiApiKey, setOpenaiApiKey] = useState('');
const [openaiModel, setOpenaiModel] = useState('');
const [openaiBaseUrl, setOpenaiBaseUrl] = useState('');
const [ollamaBaseUrl, setOllamaBaseUrl] = useState('');
const [ollamaModel, setOllamaModel] = useState('');
const [availableOllamaModels, setAvailableOllamaModels] = useState<string[]>([]);
@ -135,6 +136,7 @@ export default function Settings() {
setAnthropicModel(aiRes.data.anthropic_model || '');
setOpenaiApiKey(aiRes.data.openai_api_key || '');
setOpenaiModel(aiRes.data.openai_model || '');
setOpenaiBaseUrl(aiRes.data.openai_base_url || '');
setOllamaBaseUrl(aiRes.data.ollama_base_url || '');
setOllamaModel(aiRes.data.ollama_model || '');
setGeminiApiKey(aiRes.data.gemini_api_key || '');
@ -462,6 +464,7 @@ export default function Settings() {
anthropic_model: aiProvider === 'anthropic' ? anthropicModel || null : undefined,
openai_api_key: openaiApiKey || undefined,
openai_model: aiProvider === 'openai' ? openaiModel || null : undefined,
openai_base_url: aiProvider === 'openai' ? openaiBaseUrl || null : undefined,
ollama_base_url: aiProvider === 'ollama' ? ollamaBaseUrl || null : undefined,
ollama_model: aiProvider === 'ollama' ? ollamaModel || null : undefined,
gemini_api_key: geminiApiKey || undefined,
@ -471,6 +474,7 @@ export default function Settings() {
setAIVerificationEnabled(response.data.ai_verification_enabled ?? false);
setAnthropicModel(response.data.anthropic_model || '');
setOpenaiModel(response.data.openai_model || '');
setOpenaiBaseUrl(response.data.openai_base_url || '');
setGeminiModel(response.data.gemini_model || '');
setAnthropicApiKey('');
setOpenaiApiKey('');
@ -1763,6 +1767,21 @@ export default function Settings() {
{aiSettings?.openai_model && ` (currently: ${aiSettings.openai_model})`}
</p>
</div>
<div className="settings-form-group">
<label>Base URL (optional for LiteLLM / OpenAI-compatible proxies)</label>
<input
type="text"
value={openaiBaseUrl}
onChange={(e) => setOpenaiBaseUrl(e.target.value)}
placeholder="https://api.openai.com/v1"
/>
<p className="hint">
Leave blank for default OpenAI API. Set to your LiteLLM proxy URL (e.g., http://litellm:4000/v1)
to use a custom model provider.
{aiSettings?.openai_base_url && ` (currently: ${aiSettings.openai_base_url})`}
</p>
</div>
</>
)}

View file

@ -1 +1 @@
{"root":["./src/app.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/api/client.ts","./src/components/aistatusbadge.tsx","./src/components/authform.tsx","./src/components/layout.tsx","./src/components/notificationbell.tsx","./src/components/particlebackground.tsx","./src/components/passwordinput.tsx","./src/components/pricechart.tsx","./src/components/priceselectionmodal.tsx","./src/components/productcard.tsx","./src/components/productform.tsx","./src/components/sparkline.tsx","./src/components/stocktimeline.tsx","./src/context/authcontext.tsx","./src/context/toastcontext.tsx","./src/hooks/useauth.ts","./src/pages/dashboard.tsx","./src/pages/login.tsx","./src/pages/notificationhistory.tsx","./src/pages/productdetail.tsx","./src/pages/register.tsx","./src/pages/settings.tsx"],"version":"5.9.3"}
{"root":["./src/App.tsx","./src/main.tsx","./src/vite-env.d.ts","./src/api/client.ts","./src/components/AIStatusBadge.tsx","./src/components/AuthForm.tsx","./src/components/Layout.tsx","./src/components/NotificationBell.tsx","./src/components/ParticleBackground.tsx","./src/components/PasswordInput.tsx","./src/components/PriceChart.tsx","./src/components/PriceSelectionModal.tsx","./src/components/ProductCard.tsx","./src/components/ProductForm.tsx","./src/components/Sparkline.tsx","./src/components/StockTimeline.tsx","./src/context/AuthContext.tsx","./src/context/ToastContext.tsx","./src/hooks/useAuth.ts","./src/pages/Dashboard.tsx","./src/pages/Login.tsx","./src/pages/NotificationHistory.tsx","./src/pages/ProductDetail.tsx","./src/pages/Register.tsx","./src/pages/Settings.tsx"],"version":"5.9.3"}