/** * Helper file for calls being made to proxy */ import { all_admin_roles } from "@/utils/roles"; import { message } from "antd"; import { TagNewRequest, TagUpdateRequest, TagDeleteRequest, TagInfoRequest, TagListResponse, TagInfoResponse } from "./tag_management/types"; import { Team } from "./key_team_helpers/key_list"; const isLocal = process.env.NODE_ENV === "development"; export const proxyBaseUrl = isLocal ? "http://localhost:4000" : null; if (isLocal != true) { console.log = function() {}; } export const DEFAULT_ORGANIZATION = "default_organization"; export interface Model { model_name: string; litellm_params: Object; model_info: Object | null; } export interface Organization { organization_id: string | null; organization_alias: string; budget_id: string; metadata: Record; models: string[]; spend: number; model_spend: Record; created_at: string; created_by: string; updated_at: string; updated_by: string; litellm_budget_table: any; // Simplified to any since we don't need the detailed structure teams: any[] | null; users: any[] | null; members: any[] | null; } export interface CredentialItem { credential_name: string; credential_values: object; credential_info: { custom_llm_provider?: string; description?: string; required?: boolean; }; } export interface CredentialsResponse { credentials: CredentialItem[]; } const baseUrl = "/"; // Assuming the base URL is the root let lastErrorTime = 0; const sleep = (ms: number) => new Promise(resolve => setTimeout(resolve, ms)); const handleError = async (errorData: string) => { const currentTime = Date.now(); if (currentTime - lastErrorTime > 60000) { // 60000 milliseconds = 60 seconds if (errorData.includes("Authentication Error - Expired Key")) { message.info("UI Session Expired. Logging out."); lastErrorTime = currentTime; await sleep(3000); // 5 second sleep document.cookie = "token=; expires=Thu, 01 Jan 1970 00:00:00 UTC; path=/;"; window.location.href = baseUrl; } lastErrorTime = currentTime; } else { console.log("Error suppressed to prevent spam:", errorData); } }; // Global variable for the header name let globalLitellmHeaderName: string = "Authorization"; // Function to set the global header name export function setGlobalLitellmHeaderName(headerName: string = "Authorization") { console.log(`setGlobalLitellmHeaderName: ${headerName}`); globalLitellmHeaderName = headerName; } export const getOpenAPISchema = async () => { const url = proxyBaseUrl ? `${proxyBaseUrl}/openapi.json` : `/openapi.json`; const response = await fetch(url); const jsonData = await response.json(); return jsonData; } export const modelCostMap = async ( accessToken: string, ) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/get/litellm_model_cost_map` : `/get/litellm_model_cost_map`; const response = await fetch( url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, } ); const jsonData = await response.json(); console.log(`received litellm model cost data: ${jsonData}`); return jsonData; } catch (error) { console.error("Failed to get model cost map:", error); throw error; } }; export const modelCreateCall = async ( accessToken: string, formValues: Model ) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/model/new` : `/model/new`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, }), }); if (!response.ok) { const errorData = await response.text(); const errorMsg = errorData|| "Network response was not ok"; message.error(errorMsg); throw new Error(errorMsg); } const data = await response.json(); console.log("API Response:", data); // Close any existing messages before showing new ones message.destroy(); // Sequential success messages message.success(`Model ${formValues.model_name} created successfully`, 2); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const modelSettingsCall = async (accessToken: String) => { /** * Get all configurable params for setting a model */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/model/settings` : `/model/settings`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error: any) { console.error("Failed to get model settings:", error); } }; export const modelDeleteCall = async ( accessToken: string, model_id: string ) => { console.log(`model_id in model delete call: ${model_id}`); try { const url = proxyBaseUrl ? `${proxyBaseUrl}/model/delete` : `/model/delete`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ id: model_id, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const budgetDeleteCall = async ( accessToken: string | null, budget_id: string ) => { console.log(`budget_id in budget delete call: ${budget_id}`); if (accessToken == null) { return; } try { const url = proxyBaseUrl ? `${proxyBaseUrl}/budget/delete` : `/budget/delete`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ id: budget_id, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const budgetCreateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in budgetCreateCall:", formValues); // Log the form values before making the API call console.log("Form Values after check:", formValues); const url = proxyBaseUrl ? `${proxyBaseUrl}/budget/new` : `/budget/new`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const budgetUpdateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in budgetUpdateCall:", formValues); // Log the form values before making the API call console.log("Form Values after check:", formValues); const url = proxyBaseUrl ? `${proxyBaseUrl}/budget/update` : `/budget/update`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const invitationCreateCall = async ( accessToken: string, userID: string // Assuming formValues is an object ) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/invitation/new` : `/invitation/new`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ user_id: userID, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const invitationClaimCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in invitationCreateCall:", formValues); // Log the form values before making the API call console.log("Form Values after check:", formValues); const url = proxyBaseUrl ? `${proxyBaseUrl}/invitation/claim` : `/invitation/claim`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const alertingSettingsCall = async (accessToken: String) => { /** * Get all configurable params for setting a model */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/alerting/settings` : `/alerting/settings`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const keyCreateCall = async ( accessToken: string, userID: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in keyCreateCall:", formValues); // Log the form values before making the API call // check if formValues.description is not undefined, make it a string and add it to formValues.metadata if (formValues.description) { // add to formValues.metadata if (!formValues.metadata) { formValues.metadata = {}; } // value needs to be in "", valid JSON formValues.metadata.description = formValues.description; // remove descrption from formValues delete formValues.description; formValues.metadata = JSON.stringify(formValues.metadata); } // if formValues.metadata is not undefined, make it a valid dict if (formValues.metadata) { console.log("formValues.metadata:", formValues.metadata); // if there's an exception JSON.parse, show it in the message try { formValues.metadata = JSON.parse(formValues.metadata); } catch (error) { throw new Error("Failed to parse metadata: " + error); } } console.log("Form Values after check:", formValues); const url = proxyBaseUrl ? `${proxyBaseUrl}/key/generate` : `/key/generate`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ user_id: userID, ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error(errorData); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const userCreateCall = async ( accessToken: string, userID: string | null, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in keyCreateCall:", formValues); // Log the form values before making the API call // check if formValues.description is not undefined, make it a string and add it to formValues.metadata if (formValues.description) { // add to formValues.metadata if (!formValues.metadata) { formValues.metadata = {}; } // value needs to be in "", valid JSON formValues.metadata.description = formValues.description; // remove descrption from formValues delete formValues.description; formValues.metadata = JSON.stringify(formValues.metadata); } formValues.auto_create_key = false; // if formValues.metadata is not undefined, make it a valid dict if (formValues.metadata) { console.log("formValues.metadata:", formValues.metadata); // if there's an exception JSON.parse, show it in the message try { formValues.metadata = JSON.parse(formValues.metadata); } catch (error) { throw new Error("Failed to parse metadata: " + error); } } console.log("Form Values after check:", formValues); const url = proxyBaseUrl ? `${proxyBaseUrl}/user/new` : `/user/new`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ user_id: userID, ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error(errorData); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const keyDeleteCall = async (accessToken: String, user_key: String) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/key/delete` : `/key/delete`; console.log("in keyDeleteCall:", user_key); //message.info("Making key delete request"); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ keys: [user_key], }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("API Key Deleted"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const userDeleteCall = async (accessToken: string, userIds: string[]) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/user/delete` : `/user/delete`; console.log("in userDeleteCall:", userIds); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ user_ids: userIds, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("User(s) Deleted"); return data; } catch (error) { console.error("Failed to delete user(s):", error); throw error; } }; export const teamDeleteCall = async (accessToken: String, teamID: String) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/team/delete` : `/team/delete`; console.log("in teamDeleteCall:", teamID); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ team_ids: [teamID], }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to delete key:", error); throw error; } }; export const userListCall = async ( accessToken: String, userIDs: string[] | null = null, page: number | null = null, page_size: number | null = null, userEmail: string | null = null, userRole: string | null = null, team: string | null = null, ) => { /** * Get all available teams on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/user/list` : `/user/list`; console.log("in userListCall"); const queryParams = new URLSearchParams(); if (userIDs && userIDs.length > 0) { // Convert array to comma-separated string const userIDsString = userIDs.join(','); queryParams.append('user_ids', userIDsString); } if (page) { queryParams.append('page', page.toString()); } if (page_size) { queryParams.append('page_size', page_size.toString()); } if (userEmail) { queryParams.append('user_email', userEmail); } if (userRole) { queryParams.append('role', userRole); } if (team) { queryParams.append('team', team); } const queryString = queryParams.toString(); if (queryString) { url += `?${queryString}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("/user/list API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const userInfoCall = async ( accessToken: String, userID: String | null, userRole: String, viewAll: Boolean = false, page: number | null, page_size: number | null, lookup_user_id: boolean = false ) => { console.log(`userInfoCall: ${userID}, ${userRole}, ${viewAll}, ${page}, ${page_size}, ${lookup_user_id}`) try { let url: string; if (viewAll) { // Use /user/list endpoint when viewAll is true url = proxyBaseUrl ? `${proxyBaseUrl}/user/list` : `/user/list`; const queryParams = new URLSearchParams(); if (page != null) queryParams.append('page', page.toString()); if (page_size != null) queryParams.append('page_size', page_size.toString()); url += `?${queryParams.toString()}`; } else { // Use /user/info endpoint for individual user info url = proxyBaseUrl ? `${proxyBaseUrl}/user/info` : `/user/info`; if ((userRole === "Admin" || userRole === "Admin Viewer") && !lookup_user_id) { // do nothing } else if (userID) { url += `?user_id=${userID}`; } } console.log("Requesting user data from:", url); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; } catch (error) { console.error("Failed to fetch user data:", error); throw error; } }; export const teamInfoCall = async ( accessToken: String, teamID: String | null ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/team/info` : `/team/info`; if (teamID) { url = `${url}?team_id=${teamID}`; } console.log("in teamInfoCall"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const teamListCall = async ( accessToken: String, organizationID: string | null, userID: String | null = null, ) => { /** * Get all available teams on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/team/list` : `/team/list`; console.log("in teamInfoCall"); const queryParams = new URLSearchParams(); if (userID) { queryParams.append('user_id', userID.toString()); } if (organizationID) { queryParams.append('organization_id', organizationID.toString()); } const queryString = queryParams.toString(); if (queryString) { url += `?${queryString}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("/team/list API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const availableTeamListCall = async ( accessToken: String, ) => { /** * Get all available teams on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/team/available` : `/team/available`; console.log("in availableTeamListCall"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("/team/available_teams API Response:", data); return data; } catch (error) { throw error; } }; export const organizationListCall = async (accessToken: String) => { /** * Get all organizations on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/organization/list` : `/organization/list`; const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const organizationInfoCall = async ( accessToken: String, organizationID: String ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/organization/info` : `/organization/info`; if (organizationID) { url = `${url}?organization_id=${organizationID}`; } console.log("in teamInfoCall"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const organizationCreateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in organizationCreateCall:", formValues); // Log the form values before making the API call if (formValues.metadata) { console.log("formValues.metadata:", formValues.metadata); // if there's an exception JSON.parse, show it in the message try { formValues.metadata = JSON.parse(formValues.metadata); } catch (error) { console.error("Failed to parse metadata:", error); throw new Error("Failed to parse metadata: " + error); } } const url = proxyBaseUrl ? `${proxyBaseUrl}/organization/new` : `/organization/new`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const organizationUpdateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in organizationUpdateCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/organization/update` : `/organization/update`; const response = await fetch(url, { method: "PATCH", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Update Team Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const organizationDeleteCall = async ( accessToken: string, organizationID: string ) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/organization/delete` : `/organization/delete`; const response = await fetch(url, { method: "DELETE", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ organization_ids: [organizationID] }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error(`Error deleting organization: ${errorData}`); } const data = await response.json(); return data; } catch (error) { console.error("Failed to delete organization:", error); throw error; } }; export const transformRequestCall = async (accessToken: String, request: object) => { /** * Transform request */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/utils/transform_request` : `/utils/transform_request`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify(request), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } } export const userDailyActivityCall = async (accessToken: String, startTime: Date, endTime: Date, page: number = 1) => { /** * Get daily user activity on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/user/daily/activity` : `/user/daily/activity`; const queryParams = new URLSearchParams(); queryParams.append('start_date', startTime.toISOString()); queryParams.append('end_date', endTime.toISOString()); queryParams.append('page_size', '1000'); queryParams.append('page', page.toString()); const queryString = queryParams.toString(); if (queryString) { url += `?${queryString}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const tagDailyActivityCall = async (accessToken: String, startTime: Date, endTime: Date, page: number = 1, tags: string[] | null = null) => { /** * Get daily user activity on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/tag/daily/activity` : `/tag/daily/activity`; const queryParams = new URLSearchParams(); queryParams.append('start_date', startTime.toISOString()); queryParams.append('end_date', endTime.toISOString()); queryParams.append('page_size', '1000'); queryParams.append('page', page.toString()); if (tags) { queryParams.append('tags', tags.join(',')); } const queryString = queryParams.toString(); if (queryString) { url += `?${queryString}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const teamDailyActivityCall = async (accessToken: String, startTime: Date, endTime: Date, page: number = 1, teamIds: string[] | null = null) => { /** * Get daily user activity on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/team/daily/activity` : `/team/daily/activity`; const queryParams = new URLSearchParams(); queryParams.append('start_date', startTime.toISOString()); queryParams.append('end_date', endTime.toISOString()); queryParams.append('page_size', '1000'); queryParams.append('page', page.toString()); if (teamIds) { queryParams.append('team_ids', teamIds.join(',')); } queryParams.append('exclude_team_ids', 'litellm-dashboard'); const queryString = queryParams.toString(); if (queryString) { url += `?${queryString}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const getTotalSpendCall = async (accessToken: String) => { /** * Get all models on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend` : `/global/spend`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const getOnboardingCredentials = async (inviteUUID: String) => { /** * Get all models on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/onboarding/get_token` : `/onboarding/get_token`; url += `?invite_link=${inviteUUID}`; const response = await fetch(url, { method: "GET", headers: { "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const claimOnboardingToken = async ( accessToken: string, inviteUUID: string, userID: string, password: String ) => { const url = proxyBaseUrl ? `${proxyBaseUrl}/onboarding/claim_token` : `/onboarding/claim_token`; try { const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ invitation_link: inviteUUID, user_id: userID, password: password, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to delete key:", error); throw error; } }; export const regenerateKeyCall = async (accessToken: string, keyToRegenerate: string, formData: any) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/key/${keyToRegenerate}/regenerate` : `/key/${keyToRegenerate}/regenerate`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify(formData), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Regenerate key Response:", data); return data; } catch (error) { console.error("Failed to regenerate key:", error); throw error; } }; let ModelListerrorShown = false; let errorTimer: NodeJS.Timeout | null = null; export const modelInfoCall = async ( accessToken: String, userID: String, userRole: String ) => { /** * Get all models on proxy */ try { console.log("modelInfoCall:", accessToken, userID, userRole); let url = proxyBaseUrl ? `${proxyBaseUrl}/v2/model/info` : `/v2/model/info`; if (!all_admin_roles.includes(userRole as string)) { // only show users models they've added url += `?user_models_only=true`; } //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { let errorData = await response.text(); errorData += `error shown=${ModelListerrorShown}` if (!ModelListerrorShown) { if (errorData.includes("No model list passed")) { errorData = "No Models Exist. Click Add Model to get started."; } message.info(errorData, 10); ModelListerrorShown = true; if (errorTimer) clearTimeout(errorTimer); errorTimer = setTimeout(() => { ModelListerrorShown = false; }, 10000); } throw new Error("Network response was not ok"); } const data = await response.json(); console.log("modelInfoCall:", data); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const modelInfoV1Call = async (accessToken: String, modelId: String) => { /** * Get all models on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/v1/model/info` : `/v1/model/info`; url += `?litellm_model_id=${modelId}`; const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("modelInfoV1Call:", data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const modelHubCall = async (accessToken: String) => { /** * Get all models on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/model_group/info` : `/model_group/info`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("modelHubCall:", data); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; // Function to get allowed IPs export const getAllowedIPs = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/get/allowed_ips` : `/get/allowed_ips`; const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error(`Network response was not ok: ${errorData}`); } const data = await response.json(); console.log("getAllowedIPs:", data); return data.data; // Assuming the API returns { data: [...] } } catch (error) { console.error("Failed to get allowed IPs:", error); throw error; } }; // Function to add an allowed IP export const addAllowedIP = async (accessToken: String, ip: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/add/allowed_ip` : `/add/allowed_ip`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ip: ip }), }); if (!response.ok) { const errorData = await response.text(); throw new Error(`Network response was not ok: ${errorData}`); } const data = await response.json(); console.log("addAllowedIP:", data); return data; } catch (error) { console.error("Failed to add allowed IP:", error); throw error; } }; // Function to delete an allowed IP export const deleteAllowedIP = async (accessToken: String, ip: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/delete/allowed_ip` : `/delete/allowed_ip`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ip: ip }), }); if (!response.ok) { const errorData = await response.text(); throw new Error(`Network response was not ok: ${errorData}`); } const data = await response.json(); console.log("deleteAllowedIP:", data); return data; } catch (error) { console.error("Failed to delete allowed IP:", error); throw error; } }; export const modelMetricsCall = async ( accessToken: String, userID: String, userRole: String, modelGroup: String | null, startTime: String | undefined, endTime: String | undefined, apiKey: String | null, customer: String | null ) => { /** * Get all models on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/model/metrics` : `/model/metrics`; if (modelGroup) { url = `${url}?_selected_model_group=${modelGroup}&startTime=${startTime}&endTime=${endTime}&api_key=${apiKey}&customer=${customer}`; } // message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); // message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const streamingModelMetricsCall = async ( accessToken: String, modelGroup: String | null, startTime: String | undefined, endTime: String | undefined ) => { /** * Get all models on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/model/streaming_metrics` : `/model/streaming_metrics`; if (modelGroup) { url = `${url}?_selected_model_group=${modelGroup}&startTime=${startTime}&endTime=${endTime}`; } // message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); // message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const modelMetricsSlowResponsesCall = async ( accessToken: String, userID: String, userRole: String, modelGroup: String | null, startTime: String | undefined, endTime: String | undefined, apiKey: String | null, customer: String | null ) => { /** * Get all models on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/model/metrics/slow_responses` : `/model/metrics/slow_responses`; if (modelGroup) { url = `${url}?_selected_model_group=${modelGroup}&startTime=${startTime}&endTime=${endTime}&api_key=${apiKey}&customer=${customer}`; } // message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); // message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const modelExceptionsCall = async ( accessToken: String, userID: String, userRole: String, modelGroup: String | null, startTime: String | undefined, endTime: String | undefined, apiKey: String | null, customer: String | null ) => { /** * Get all models on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/model/metrics/exceptions` : `/model/metrics/exceptions`; if (modelGroup) { url = `${url}?_selected_model_group=${modelGroup}&startTime=${startTime}&endTime=${endTime}&api_key=${apiKey}&customer=${customer}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); // message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const modelAvailableCall = async ( accessToken: String, userID: String, userRole: String, return_wildcard_routes: boolean = false, teamID: String | null = null ) => { /** * Get all the models user has access to */ console.log("in /models calls, globalLitellmHeaderName", globalLitellmHeaderName) try { let url = proxyBaseUrl ? `${proxyBaseUrl}/models` : `/models`; const params = new URLSearchParams(); if (return_wildcard_routes === true) { params.append('return_wildcard_routes', 'True'); } if (teamID) { params.append('team_id', teamID.toString()); } if (params.toString()) { url += `?${params.toString()}`; } //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const keySpendLogsCall = async (accessToken: String, token: String) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/logs` : `/global/spend/logs`; console.log("in keySpendLogsCall:", url); const response = await fetch(`${url}?api_key=${token}`, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const teamSpendLogsCall = async (accessToken: String) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/teams` : `/global/spend/teams`; console.log("in teamSpendLogsCall:", url); const response = await fetch(`${url}`, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const tagsSpendLogsCall = async ( accessToken: String, startTime: String | undefined, endTime: String | undefined, tags: String[] | undefined ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/tags` : `/global/spend/tags`; if (startTime && endTime) { url = `${url}?start_date=${startTime}&end_date=${endTime}`; } // if tags, convert the list to a comma separated string if (tags) { url += `${url}&tags=${tags.join(",")}`; } console.log("in tagsSpendLogsCall:", url); const response = await fetch(`${url}`, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const allTagNamesCall = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/all_tag_names` : `/global/spend/all_tag_names`; console.log("in global/spend/all_tag_names call", url); const response = await fetch(`${url}`, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const allEndUsersCall = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/all_end_users` : `/global/all_end_users`; console.log("in global/all_end_users call", url); const response = await fetch(`${url}`, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const userFilterUICall = async (accessToken: String, params: URLSearchParams) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/user/filter/ui` : `/user/filter/ui`; if (params.get("user_email")) { url += `?user_email=${params.get("user_email")}`; } if (params.get("user_id")) { url += `?user_id=${params.get("user_id")}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } return await response.json(); } catch (error) { console.error("Failed to create key:", error); throw error; } } export const userSpendLogsCall = async ( accessToken: String, token: String, userRole: String, userID: String, startTime: String, endTime: String ) => { try { console.log(`user role in spend logs call: ${userRole}`); let url = proxyBaseUrl ? `${proxyBaseUrl}/spend/logs` : `/spend/logs`; if (userRole == "App Owner") { url = `${url}?user_id=${userID}&start_date=${startTime}&end_date=${endTime}`; } else { url = `${url}?start_date=${startTime}&end_date=${endTime}`; } //message.info("Making spend logs request"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("Spend Logs received"); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const uiSpendLogsCall = async ( accessToken: String, api_key?: string, team_id?: string, request_id?: string, start_date?: string, end_date?: string, page?: number, page_size?: number, user_id?: string, ) => { try { // Construct base URL let url = proxyBaseUrl ? `${proxyBaseUrl}/spend/logs/ui` : `/spend/logs/ui`; // Add query parameters if they exist const queryParams = new URLSearchParams(); if (api_key) queryParams.append('api_key', api_key); if (team_id) queryParams.append('team_id', team_id); if (request_id) queryParams.append('request_id', request_id); if (start_date) queryParams.append('start_date', start_date); if (end_date) queryParams.append('end_date', end_date); if (page) queryParams.append('page', page.toString()); if (page_size) queryParams.append('page_size', page_size.toString()); if (user_id) queryParams.append('user_id', user_id); // Append query parameters to URL if any exist const queryString = queryParams.toString(); if (queryString) { url += `?${queryString}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Spend Logs Response:", data); return data; } catch (error) { console.error("Failed to fetch spend logs:", error); throw error; } }; export const adminSpendLogsCall = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/logs` : `/global/spend/logs`; //message.info("Making spend logs request"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("Spend Logs received"); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const adminTopKeysCall = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/keys?limit=5` : `/global/spend/keys?limit=5`; //message.info("Making spend keys request"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("Spend Logs received"); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const adminTopEndUsersCall = async ( accessToken: String, keyToken: String | null, startTime: String | undefined, endTime: String | undefined ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/end_users` : `/global/spend/end_users`; let body = ""; if (keyToken) { body = JSON.stringify({ api_key: keyToken, startTime: startTime, endTime: endTime, }); } else { body = JSON.stringify({ startTime: startTime, endTime: endTime }); } //message.info("Making top end users request"); // Define requestOptions with body as an optional property const requestOptions = { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: body, }; const response = await fetch(url, requestOptions); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("Top End users received"); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const adminspendByProvider = async ( accessToken: String, keyToken: String | null, startTime: String | undefined, endTime: String | undefined ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/provider` : `/global/spend/provider`; if (startTime && endTime) { url += `?start_date=${startTime}&end_date=${endTime}`; } if (keyToken) { url += `&api_key=${keyToken}`; } const requestOptions = { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, }, }; const response = await fetch(url, requestOptions); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to fetch spend data:", error); throw error; } }; export const adminGlobalActivity = async ( accessToken: String, startTime: String | undefined, endTime: String | undefined ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/activity` : `/global/activity`; if (startTime && endTime) { url += `?start_date=${startTime}&end_date=${endTime}`; } const requestOptions = { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, }, }; const response = await fetch(url, requestOptions); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to fetch spend data:", error); throw error; } }; export const adminGlobalCacheActivity = async ( accessToken: String, startTime: String | undefined, endTime: String | undefined ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/activity/cache_hits` : `/global/activity/cache_hits`; if (startTime && endTime) { url += `?start_date=${startTime}&end_date=${endTime}`; } const requestOptions = { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, }, }; const response = await fetch(url, requestOptions); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to fetch spend data:", error); throw error; } }; export const adminGlobalActivityPerModel = async ( accessToken: String, startTime: String | undefined, endTime: String | undefined ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/activity/model` : `/global/activity/model`; if (startTime && endTime) { url += `?start_date=${startTime}&end_date=${endTime}`; } const requestOptions = { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, }, }; const response = await fetch(url, requestOptions); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to fetch spend data:", error); throw error; } }; export const adminGlobalActivityExceptions = async ( accessToken: String, startTime: String | undefined, endTime: String | undefined, modelGroup: String ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/activity/exceptions` : `/global/activity/exceptions`; if (startTime && endTime) { url += `?start_date=${startTime}&end_date=${endTime}`; } if (modelGroup) { url += `&model_group=${modelGroup}`; } const requestOptions = { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, }, }; const response = await fetch(url, requestOptions); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to fetch spend data:", error); throw error; } }; export const adminGlobalActivityExceptionsPerDeployment = async ( accessToken: String, startTime: String | undefined, endTime: String | undefined, modelGroup: String ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/activity/exceptions/deployment` : `/global/activity/exceptions/deployment`; if (startTime && endTime) { url += `?start_date=${startTime}&end_date=${endTime}`; } if (modelGroup) { url += `&model_group=${modelGroup}`; } const requestOptions = { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, }, }; const response = await fetch(url, requestOptions); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to fetch spend data:", error); throw error; } }; export const adminTopModelsCall = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/spend/models?limit=5` : `/global/spend/models?limit=5`; //message.info("Making top models request"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("Top Models received"); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const keyInfoCall = async (accessToken: String, keys: String[]) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/v2/key/info` : `/v2/key/info`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ keys: keys, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const testConnectionRequest = async ( accessToken: string, litellm_params: Record, mode: string, ) => { try { console.log("Sending model connection test request:", JSON.stringify(litellm_params)); // Construct the URL based on environment const url = proxyBaseUrl ? `${proxyBaseUrl}/health/test_connection` : `/health/test_connection`; const response = await fetch(url, { method: 'POST', headers: { 'Content-Type': 'application/json', [globalLitellmHeaderName]: `Bearer ${accessToken}` }, body: JSON.stringify( { litellm_params: litellm_params, mode: mode, } ) }); // Check for non-JSON responses first const contentType = response.headers.get('content-type'); if (!contentType || !contentType.includes('application/json')) { const text = await response.text(); console.error("Received non-JSON response:", text); throw new Error(`Received non-JSON response (${response.status}: ${response.statusText}). Check network tab for details.`); } const data = await response.json(); if (!response.ok || data.status === "error") { // Return the error response instead of throwing an error // This allows the caller to handle the error format properly if (data.status === "error") { return data; // Return the full error response } else { return { status: "error", message: data.error?.message || `Connection test failed: ${response.status} ${response.statusText}` }; } } return data; } catch (error) { console.error("Model connection test error:", error); // For network errors or other exceptions, still throw throw error; } }; // ... existing code ... export const keyInfoV1Call = async (accessToken: string, key: string) => { try { console.log("entering keyInfoV1Call"); let url = proxyBaseUrl ? `${proxyBaseUrl}/key/info` : `/key/info`; url = `${url}?key=${key}`; // Add key as query parameter const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, // Remove body since this is a GET request }); console.log("response", response); if (!response.ok) { const errorData = await response.text(); handleError(errorData); message.error("Failed to fetch key info - " + errorData); } const data = await response.json(); console.log("data", data); return data; } catch (error) { console.error("Failed to fetch key info:", error); throw error; } }; export const keyListCall = async ( accessToken: String, organizationID: string | null, teamID: string | null, selectedKeyAlias: string | null, page: number, pageSize: number, ) => { /** * Get all available teams on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/key/list` : `/key/list`; console.log("in keyListCall"); const queryParams = new URLSearchParams(); if (teamID) { queryParams.append('team_id', teamID.toString()); } if (organizationID) { queryParams.append('organization_id', organizationID.toString()); } if (selectedKeyAlias) { queryParams.append('key_alias', selectedKeyAlias) } if (page) { queryParams.append('page', page.toString()); } if (pageSize) { queryParams.append('size', pageSize.toString()); } queryParams.append('return_full_object', 'true'); queryParams.append('include_team_keys', 'true'); const queryString = queryParams.toString(); if (queryString) { url += `?${queryString}`; } const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("/team/list API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const spendUsersCall = async (accessToken: String, userID: String) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/spend/users` : `/spend/users`; console.log("in spendUsersCall:", url); const response = await fetch(`${url}?user_id=${userID}`, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; } catch (error) { console.error("Failed to get spend for user", error); throw error; } }; export const userRequestModelCall = async ( accessToken: String, model: String, UserID: String, justification: String ) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/user/request_model` : `/user/request_model`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ models: [model], user_id: UserID, justification: justification, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success(""); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const userGetRequesedtModelsCall = async (accessToken: String) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/user/get_requests` : `/user/get_requests`; console.log("in userGetRequesedtModelsCall:", url); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success(""); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get requested models:", error); throw error; } }; export interface User { user_role: string; user_id: string; user_email: string; [key: string]: string; // Include any other potential keys in the dictionary } export const userGetAllUsersCall = async ( accessToken: String, role: String ) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/user/get_users?role=${role}` : `/user/get_users?role=${role}`; console.log("in userGetAllUsersCall:", url); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("Got all users"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get requested models:", error); throw error; } }; export const getPossibleUserRoles = async (accessToken: String) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/user/available_roles` : `/user/available_roles`; const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("response from user/available_role", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { throw error; } }; export const teamCreateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in teamCreateCall:", formValues); // Log the form values before making the API call if (formValues.metadata) { console.log("formValues.metadata:", formValues.metadata); // if there's an exception JSON.parse, show it in the message try { formValues.metadata = JSON.parse(formValues.metadata); } catch (error) { throw new Error("Failed to parse metadata: " + error); } } const url = proxyBaseUrl ? `${proxyBaseUrl}/team/new` : `/team/new`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const credentialCreateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in credentialCreateCall:", formValues); // Log the form values before making the API call if (formValues.metadata) { console.log("formValues.metadata:", formValues.metadata); // if there's an exception JSON.parse, show it in the message try { formValues.metadata = JSON.parse(formValues.metadata); } catch (error) { throw new Error("Failed to parse metadata: " + error); } } const url = proxyBaseUrl ? `${proxyBaseUrl}/credentials` : `/credentials`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const credentialListCall = async ( accessToken: String, ) => { /** * Get all available teams on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/credentials` : `/credentials`; console.log("in credentialListCall"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("/credentials API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const credentialGetCall = async (accessToken: String, credentialName: String | null, modelId: String | null) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/credentials` : `/credentials`; if (credentialName) { url += `/by_name/${credentialName}`; } else if (modelId) { url += `/by_model/${modelId}`; } console.log("in credentialListCall"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("/credentials API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const credentialDeleteCall = async (accessToken: String, credentialName: String) => { try { const url = proxyBaseUrl ? `${proxyBaseUrl}/credentials/${credentialName}` : `/credentials/${credentialName}`; console.log("in credentialDeleteCall:", credentialName); const response = await fetch(url, { method: "DELETE", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to delete key:", error); throw error; } }; export const credentialUpdateCall = async ( accessToken: string, credentialName: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in credentialUpdateCall:", formValues); // Log the form values before making the API call if (formValues.metadata) { console.log("formValues.metadata:", formValues.metadata); // if there's an exception JSON.parse, show it in the message try { formValues.metadata = JSON.parse(formValues.metadata); } catch (error) { throw new Error("Failed to parse metadata: " + error); } } const url = proxyBaseUrl ? `${proxyBaseUrl}/credentials/${credentialName}` : `/credentials/${credentialName}`; const response = await fetch(url, { method: "PATCH", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const keyUpdateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in keyUpdateCall:", formValues); // Log the form values before making the API call if (formValues.model_tpm_limit) { console.log("formValues.model_tpm_limit:", formValues.model_tpm_limit); // if there's an exception JSON.parse, show it in the message try { formValues.model_tpm_limit = JSON.parse(formValues.model_tpm_limit); } catch (error) { throw new Error("Failed to parse model_tpm_limit: " + error); } } if (formValues.model_rpm_limit) { console.log("formValues.model_rpm_limit:", formValues.model_rpm_limit); // if there's an exception JSON.parse, show it in the message try { formValues.model_rpm_limit = JSON.parse(formValues.model_rpm_limit); } catch (error) { throw new Error("Failed to parse model_rpm_limit: " + error); } } const url = proxyBaseUrl ? `${proxyBaseUrl}/key/update` : `/key/update`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Update key Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const teamUpdateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in teamUpateCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/team/update` : `/team/update`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json() as { data: Team, team_id: string }; console.log("Update Team Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const modelUpdateCall = async ( accessToken: string, formValues: Record // Assuming formValues is an object ) => { try { console.log("Form Values in modelUpateCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/model/update` : `/model/update`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error update from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Update model Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to update model:", error); throw error; } }; export interface Member { role: string; user_id: string | null; user_email?: string | null; } export const teamMemberAddCall = async ( accessToken: string, teamId: string, formValues: Member // Assuming formValues is an object ) => { try { console.log("Form Values in teamMemberAddCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/team/member_add` : `/team/member_add`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ team_id: teamId, member: formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const teamMemberUpdateCall = async ( accessToken: string, teamId: string, formValues: Member // Assuming formValues is an object ) => { try { console.log("Form Values in teamMemberAddCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/team/member_update` : `/team/member_update`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ team_id: teamId, role: formValues.role, user_id: formValues.user_id, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } } export const teamMemberDeleteCall = async ( accessToken: string, teamId: string, formValues: Member // Assuming formValues is an object ) => { try { console.log("Form Values in teamMemberAddCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/team/member_delete` : `/team/member_delete`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ team_id: teamId, ...(formValues.user_email !== undefined && { user_email: formValues.user_email }), ...(formValues.user_id !== undefined && { user_id: formValues.user_id }) }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } } export const organizationMemberAddCall = async ( accessToken: string, organizationId: string, formValues: Member // Assuming formValues is an object ) => { try { console.log("Form Values in teamMemberAddCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/organization/member_add` : `/organization/member_add`; const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ organization_id: organizationId, member: formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error(errorData); } const data = await response.json(); console.log("API Response:", data); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create organization member:", error); throw error; } }; export const organizationMemberDeleteCall = async ( accessToken: string, organizationId: string, userId: string ) => { try { console.log("Form Values in organizationMemberDeleteCall:", userId); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/organization/member_delete` : `/organization/member_delete`; const response = await fetch(url, { method: "DELETE", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ organization_id: organizationId, user_id: userId }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; } catch (error) { console.error("Failed to delete organization member:", error); throw error; } }; export const organizationMemberUpdateCall = async ( accessToken: string, organizationId: string, formValues: Member // Assuming formValues is an object ) => { try { console.log("Form Values in organizationMemberUpdateCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/organization/member_update` : `/organization/member_update`; const response = await fetch(url, { method: "PATCH", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ organization_id: organizationId, ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); return data; } catch (error) { console.error("Failed to update organization member:", error); throw error; } }; export const userUpdateUserCall = async ( accessToken: string, formValues: any, // Assuming formValues is an object userRole: string | null ) => { try { console.log("Form Values in userUpdateUserCall:", formValues); // Log the form values before making the API call const url = proxyBaseUrl ? `${proxyBaseUrl}/user/update` : `/user/update`; let response_body = { ...formValues }; if (userRole !== null) { response_body["user_role"] = userRole; } response_body = JSON.stringify(response_body); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: response_body, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); console.error("Error response from the server:", errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("API Response:", data); //message.success("User role updated"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const PredictedSpendLogsCall = async ( accessToken: string, requestData: any ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/global/predict/spend/logs` : `/global/predict/spend/logs`; //message.info("Predicting spend logs request"); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ data: requestData, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log(data); //message.success("Predicted Logs received"); return data; } catch (error) { console.error("Failed to create key:", error); throw error; } }; export const slackBudgetAlertsHealthCheck = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/health/services?service=slack_budget_alerts` : `/health/services?service=slack_budget_alerts`; console.log("Checking Slack Budget Alerts service health"); //message.info("Sending Test Slack alert..."); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); // throw error with message throw new Error(errorData); } const data = await response.json(); message.success("Test Slack Alert worked - check your Slack!"); console.log("Service Health Response:", data); // You can add additional logic here based on the response if needed return data; } catch (error) { console.error("Failed to perform health check:", error); throw error; } }; export const serviceHealthCheck = async ( accessToken: String, service: String ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/health/services?service=${service}` : `/health/services?service=${service}`; console.log("Checking Slack Budget Alerts service health"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); // throw error with message throw new Error(errorData); } const data = await response.json(); message.success( `Test request to ${service} made - check logs/alerts on ${service} to verify` ); // You can add additional logic here based on the response if needed return data; } catch (error) { console.error("Failed to perform health check:", error); throw error; } }; export const getBudgetList = async (accessToken: String) => { /** * Get all configurable params for setting a budget */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/budget/list` : `/budget/list`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const getBudgetSettings = async (accessToken: String) => { /** * Get all configurable params for setting a budget */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/budget/settings` : `/budget/settings`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const getCallbacksCall = async ( accessToken: String, userID: String, userRole: String ) => { /** * Get all the models user has access to */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/get/config/callbacks` : `/get/config/callbacks`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const getGeneralSettingsCall = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/list?config_type=general_settings` : `/config/list?config_type=general_settings`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const getPassThroughEndpointsCall = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/pass_through_endpoint` : `/config/pass_through_endpoint`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const getConfigFieldSetting = async ( accessToken: String, fieldName: string ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/field/info?field_name=${fieldName}` : `/config/field/info?field_name=${fieldName}`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to set callbacks:", error); throw error; } }; export const updatePassThroughFieldSetting = async ( accessToken: String, fieldName: string, fieldValue: any ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/pass_through_endpoint` : `/config/pass_through_endpoint`; let formData = { field_name: fieldName, field_value: fieldValue, }; //message.info("Requesting model data"); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify(formData), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); message.success("Successfully updated value!"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to set callbacks:", error); throw error; } }; export const createPassThroughEndpoint = async ( accessToken: String, formValues: Record ) => { /** * Set callbacks on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/pass_through_endpoint` : `/config/pass_through_endpoint`; //message.info("Requesting model data"); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to set callbacks:", error); throw error; } }; export const updateConfigFieldSetting = async ( accessToken: String, fieldName: string, fieldValue: any ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/field/update` : `/config/field/update`; let formData = { field_name: fieldName, field_value: fieldValue, config_type: "general_settings", }; //message.info("Requesting model data"); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify(formData), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); message.success("Successfully updated value!"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to set callbacks:", error); throw error; } }; export const deleteConfigFieldSetting = async ( accessToken: String, fieldName: String ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/field/delete` : `/config/field/delete`; let formData = { field_name: fieldName, config_type: "general_settings", }; //message.info("Requesting model data"); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify(formData), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); message.success("Field reset on proxy"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const deletePassThroughEndpointsCall = async (accessToken: String, endpointId: string) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/pass_through_endpoint?endpoint_id=${endpointId}` : `/config/pass_through_endpoint${endpointId}`; //message.info("Requesting model data"); const response = await fetch(url, { method: "DELETE", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const setCallbacksCall = async ( accessToken: String, formValues: Record ) => { /** * Set callbacks on proxy */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/config/update` : `/config/update`; //message.info("Requesting model data"); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ ...formValues, // Include formValues in the request body }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to set callbacks:", error); throw error; } }; export const healthCheckCall = async (accessToken: String) => { /** * Get all the models user has access to */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/health` : `/health`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to call /health:", error); throw error; } }; export const cachingHealthCheckCall = async (accessToken: String) => { /** * Get all the models user has access to */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/cache/ping` : `/cache/ping`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error(errorData); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to call /cache/ping:", error); throw error; } }; export const getProxyUISettings = async ( accessToken: String, ) => { /** * Get all the models user has access to */ try { let url = proxyBaseUrl ? `${proxyBaseUrl}/sso/get/ui_settings` : `/sso/get/ui_settings`; //message.info("Requesting model data"); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); throw new Error("Network response was not ok"); } const data = await response.json(); //message.info("Received model data"); return data; // Handle success - you might want to update some state or UI based on the created key } catch (error) { console.error("Failed to get callbacks:", error); throw error; } }; export const getGuardrailsList = async (accessToken: String) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/guardrails/list` : `/guardrails/list`; const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Guardrails list response:", data); return data; } catch (error) { console.error("Failed to fetch guardrails list:", error); throw error; } }; export const uiSpendLogDetailsCall = async ( accessToken: string, logId: string, start_date: string ) => { try { // Construct base URL let url = proxyBaseUrl ? `${proxyBaseUrl}/spend/logs/ui/${logId}?start_date=${encodeURIComponent(start_date)}` : `/spend/logs/ui/${logId}?start_date=${encodeURIComponent(start_date)}`; console.log("Fetching log details from:", url); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Fetched log details:", data); return data; } catch (error) { console.error("Failed to fetch log details:", error); throw error; } }; export const getInternalUserSettings = async (accessToken: string) => { try { // Construct base URL let url = proxyBaseUrl ? `${proxyBaseUrl}/get/internal_user_settings` : `/get/internal_user_settings`; console.log("Fetching SSO settings from:", url); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Fetched SSO settings:", data); return data; } catch (error) { console.error("Failed to fetch SSO settings:", error); throw error; } }; export const updateInternalUserSettings = async (accessToken: string, settings: Record) => { try { // Construct base URL let url = proxyBaseUrl ? `${proxyBaseUrl}/update/internal_user_settings` : `/update/internal_user_settings`; console.log("Updating internal user settings:", settings); const response = await fetch(url, { method: "PATCH", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify(settings), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Updated internal user settings:", data); message.success("Internal user settings updated successfully"); return data; } catch (error) { console.error("Failed to update internal user settings:", error); throw error; } }; export const listMCPTools = async (accessToken: string) => { try { // Construct base URL let url = proxyBaseUrl ? `${proxyBaseUrl}/mcp/tools/list` : `/mcp/tools/list`; console.log("Fetching MCP tools from:", url); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Fetched MCP tools:", data); return data; } catch (error) { console.error("Failed to fetch MCP tools:", error); throw error; } }; export const callMCPTool = async (accessToken: string, toolName: string, toolArguments: Record) => { try { // Construct base URL let url = proxyBaseUrl ? `${proxyBaseUrl}/mcp/tools/call` : `/mcp/tools/call`; console.log("Calling MCP tool:", toolName, "with arguments:", toolArguments); const response = await fetch(url, { method: "POST", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify({ name: toolName, arguments: toolArguments, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("MCP tool call response:", data); return data; } catch (error) { console.error("Failed to call MCP tool:", error); throw error; } }; export const tagCreateCall = async ( accessToken: string, formValues: TagNewRequest ): Promise => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/tag/new` : `/tag/new`; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify(formValues), }); if (!response.ok) { const errorData = await response.text(); await handleError(errorData); return; } return await response.json(); } catch (error) { console.error("Error creating tag:", error); throw error; } }; export const tagUpdateCall = async ( accessToken: string, formValues: TagUpdateRequest ): Promise => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/tag/update` : `/tag/update`; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify(formValues), }); if (!response.ok) { const errorData = await response.text(); await handleError(errorData); return; } return await response.json(); } catch (error) { console.error("Error updating tag:", error); throw error; } }; export const tagInfoCall = async ( accessToken: string, tagNames: string[] ): Promise => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/tag/info` : `/tag/info`; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify({ names: tagNames }), }); if (!response.ok) { const errorData = await response.text(); await handleError(errorData); return {}; } const data = await response.json(); return data as TagInfoResponse; } catch (error) { console.error("Error getting tag info:", error); throw error; } }; export const tagListCall = async (accessToken: string): Promise => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/tag/list` : `/tag/list`; const response = await fetch(url, { method: "GET", headers: { Authorization: `Bearer ${accessToken}`, }, }); if (!response.ok) { const errorData = await response.text(); await handleError(errorData); return {}; } const data = await response.json(); return data as TagListResponse; } catch (error) { console.error("Error listing tags:", error); throw error; } }; export const tagDeleteCall = async ( accessToken: string, tagName: string ): Promise => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/tag/delete` : `/tag/delete`; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify({ name: tagName }), }); if (!response.ok) { const errorData = await response.text(); await handleError(errorData); return; } return await response.json(); } catch (error) { console.error("Error deleting tag:", error); throw error; } }; export const getDefaultTeamSettings = async (accessToken: string) => { try { // Construct base URL let url = proxyBaseUrl ? `${proxyBaseUrl}/get/default_team_settings` : `/get/default_team_settings`; console.log("Fetching default team settings from:", url); const response = await fetch(url, { method: "GET", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Fetched default team settings:", data); return data; } catch (error) { console.error("Failed to fetch default team settings:", error); throw error; } }; export const updateDefaultTeamSettings = async (accessToken: string, settings: Record) => { try { // Construct base URL let url = proxyBaseUrl ? `${proxyBaseUrl}/update/default_team_settings` : `/update/default_team_settings`; console.log("Updating default team settings:", settings); const response = await fetch(url, { method: "PATCH", headers: { [globalLitellmHeaderName]: `Bearer ${accessToken}`, "Content-Type": "application/json", }, body: JSON.stringify(settings), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Updated default team settings:", data); message.success("Default team settings updated successfully"); return data; } catch (error) { console.error("Failed to update default team settings:", error); throw error; } }; export const getTeamPermissionsCall = async ( accessToken: string, teamId: string ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/team/permissions_list?team_id=${teamId}` : `/team/permissions_list?team_id=${teamId}`; const response = await fetch(url, { method: "GET", headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}`, }, }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Team permissions response:", data); return data; } catch (error) { console.error("Failed to get team permissions:", error); throw error; } }; export const teamPermissionsUpdateCall = async ( accessToken: string, teamId: string, permissions: string[] ) => { try { let url = proxyBaseUrl ? `${proxyBaseUrl}/team/permissions_update` : `/team/permissions_update`; const response = await fetch(url, { method: "POST", headers: { "Content-Type": "application/json", Authorization: `Bearer ${accessToken}`, }, body: JSON.stringify({ team_id: teamId, team_member_permissions: permissions, }), }); if (!response.ok) { const errorData = await response.text(); handleError(errorData); throw new Error("Network response was not ok"); } const data = await response.json(); console.log("Team permissions response:", data); return data; } catch (error) { console.error("Failed to update team permissions:", error); throw error; } };