import { WEBUI_API_BASE_URL, WEBUI_BASE_URL } from '$lib/constants'; import type { Banner } from '$lib/types'; export const importConfig = async (token: string, config) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/import`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ config: config }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const exportConfig = async (token: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/export`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getConnectionsConfig = async (token: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/connections`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setConnectionsConfig = async (token: string, config: object) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/connections`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...config }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getToolServerConnections = async (token: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/tool_servers`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setToolServerConnections = async (token: string, connections: object) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/tool_servers`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...connections }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getTerminalServerConnections = async (token: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/terminal_servers`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setTerminalServerConnections = async (token: string, connections: object) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/terminal_servers`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...connections }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; /** * Detect whether a terminal server URL points to an Orchestrator or a direct * Open Terminal instance. * * - GET {url}/api/v1/policies → 200 → "orchestrator" * - GET {url}/api/config → 200 → "terminal" * - Neither → null */ export const detectTerminalServerType = async ( url: string, key: string ): Promise<'orchestrator' | 'terminal' | null> => { const baseUrl = url.replace(/\/$/, ''); const headers: Record = {}; if (key) { headers['Authorization'] = `Bearer ${key}`; } // Orchestrators expose a policies API; plain terminals don't. try { const res = await fetch(`${baseUrl}/api/v1/policies`, { headers }); if (res.ok) return 'orchestrator'; } catch { // ignore } // Fall back to open-terminal config endpoint. try { const res = await fetch(`${baseUrl}/api/config`, { headers }); if (res.ok) return 'terminal'; } catch { // ignore } return null; }; /** * Create or update a policy on the orchestrator. * PUT {url}/api/v1/policies/{policyId} */ export const putOrchestratorPolicy = async ( url: string, key: string, policyId: string, policyData: object ): Promise => { let error = null; const baseUrl = url.replace(/\/$/, ''); const headers: Record = { 'Content-Type': 'application/json' }; if (key) { headers['Authorization'] = `Bearer ${key}`; } const res = await fetch(`${baseUrl}/api/v1/policies/${encodeURIComponent(policyId)}`, { method: 'PUT', headers, body: JSON.stringify(policyData) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const verifyToolServerConnection = async (token: string, connection: object) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/tool_servers/verify`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...connection }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; type RegisterOAuthClientForm = { url: string; client_id: string; client_name?: string; }; export const registerOAuthClient = async ( token: string, formData: RegisterOAuthClientForm, type: null | string = null ) => { let error = null; const searchParams = type ? `?type=${type}` : ''; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/oauth/clients/register${searchParams}`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...formData }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getOAuthClientAuthorizationUrl = (clientId: string, type: null | string = null) => { const oauthClientId = type ? `${type}:${clientId}` : clientId; return `${WEBUI_BASE_URL}/oauth/clients/${oauthClientId}/authorize`; }; export const getCodeExecutionConfig = async (token: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/code_execution`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setCodeExecutionConfig = async (token: string, config: object) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/code_execution`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...config }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getModelsConfig = async (token: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/models`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setModelsConfig = async (token: string, config: object) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/models`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ ...config }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setDefaultPromptSuggestions = async (token: string, promptSuggestions: string) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/suggestions`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ suggestions: promptSuggestions }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const getBanners = async (token: string): Promise => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/banners`, { method: 'GET', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` } }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; }; export const setBanners = async (token: string, banners: Banner[]) => { let error = null; const res = await fetch(`${WEBUI_API_BASE_URL}/configs/banners`, { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${token}` }, body: JSON.stringify({ banners: banners }) }) .then(async (res) => { if (!res.ok) throw await res.json(); return res.json(); }) .catch((err) => { console.error(err); error = err.detail; return null; }); if (error) { throw error; } return res; };