diff --git a/frontend/src/lib/api.ts b/frontend/src/lib/api.ts index 206ec4f6..2b94edad 100644 --- a/frontend/src/lib/api.ts +++ b/frontend/src/lib/api.ts @@ -17,7 +17,20 @@ export const isTauri = () => typeof window !== 'undefined' && !!window.__TAURI_I const DESKTOP_API = 'http://127.0.0.1:8000'; -const getBase = () => { +const getSettingsApiUrl = (): string => { + try { + const raw = localStorage.getItem('openjarvis-settings'); + if (raw) { + const parsed = JSON.parse(raw); + if (parsed.apiUrl) return parsed.apiUrl.replace(/\/+$/, ''); + } + } catch {} + return ''; +}; + +export const getBase = (): string => { + const settingsUrl = getSettingsApiUrl(); + if (settingsUrl) return settingsUrl; if (import.meta.env.VITE_API_URL) return import.meta.env.VITE_API_URL; if (isTauri()) return DESKTOP_API; return ''; diff --git a/frontend/src/lib/sse.ts b/frontend/src/lib/sse.ts index b1cf624b..addd10b9 100644 --- a/frontend/src/lib/sse.ts +++ b/frontend/src/lib/sse.ts @@ -1,5 +1,5 @@ import type { SSEEvent } from '../types'; -import { isTauri } from './api'; +import { getBase } from './api'; export interface ChatRequest { model: string; @@ -7,13 +7,11 @@ export interface ChatRequest { stream: true; } -const DESKTOP_API = 'http://127.0.0.1:8000'; - export async function* streamChat( request: ChatRequest, signal?: AbortSignal, ): AsyncGenerator { - const base = import.meta.env.VITE_API_URL || (isTauri() ? DESKTOP_API : ''); + const base = getBase(); const response = await fetch(`${base}/v1/chat/completions`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, diff --git a/frontend/src/pages/SettingsPage.tsx b/frontend/src/pages/SettingsPage.tsx index 91b8566b..2dbe4c37 100644 --- a/frontend/src/pages/SettingsPage.tsx +++ b/frontend/src/pages/SettingsPage.tsx @@ -188,7 +188,7 @@ export function SettingsPage() { - +