250 lines · 7.4 KB · TypeScript
RawDownload
import type {  ModelDownload,  EngineJob,  ModelInfo,  ModelRecommendation,  StarterPreset,  StorageInfo,  StudioDiagnostics,  StudioSettings,  RuntimeBackendInfo,  RuntimeCudaInfo,  RuntimeRocmInfo,  RuntimeTarget,} from "../types";import { encodePathSegments, type ApiCore, type RequestOptions } from "./core"; export interface StudioModelsRoot {  path: string;  exists: boolean;  sources?: string[];  recipe_ids?: string[];} export interface VllmRuntimeInfo {  installed: boolean;  version: string | null;  python_path: string | null;  vllm_bin: string | null;  upgrade_command_available?: boolean;  bundled_wheel: {    path: string;    version: string | null;  } | null;} export interface VllmRuntimeConfig {  config: string | null;  error?: string | null;} export interface RuntimeJobResponse {  job_id: string;  job: EngineJob;} export function createStudioApi(core: ApiCore) {  return {    getModels: (): Promise<{      models: ModelInfo[];      roots?: StudioModelsRoot[];      configured_models_dir?: string;    }> => core.request("/v1/studio/models"),     getStudioSettings: (options?: RequestOptions): Promise<StudioSettings> =>      core.request("/studio/settings", options),     updateStudioSettings: (payload: {      models_dir?: string | null;      ui_preferences?: Record<string, string> | null;    }): Promise<StudioSettings & { success: boolean }> =>      core.request("/studio/settings", {        method: "POST",        body: JSON.stringify(payload),      }),     getStudioDiagnostics: (): Promise<StudioDiagnostics> => core.request("/studio/diagnostics"),     getStudioStorage: (): Promise<StorageInfo> => core.request("/studio/storage"),     getModelRecommendations: (): Promise<{      recommendations: ModelRecommendation[];      max_vram_gb: number;    }> => core.request("/studio/recommendations"),     getStarterPresets: (): Promise<{      presets: StarterPreset[];      max_vram_gb: number;    }> => core.request("/studio/presets"),     getDownloads: (): Promise<{ downloads: ModelDownload[] }> => core.request("/studio/downloads"),     startDownload: (params: {      model_id: string;      revision?: string;      destination_dir?: string;      allow_patterns?: string[];      ignore_patterns?: string[];      hf_token?: string;    }): Promise<{ download: ModelDownload }> =>      core.request("/studio/downloads", {        method: "POST",        body: JSON.stringify(params),        timeout: 120_000,        retries: 0,      }),     pauseDownload: (id: string): Promise<{ download: ModelDownload }> =>      core.request(`/studio/downloads/${encodePathSegments(id)}/pause`, { method: "POST" }),     resumeDownload: (id: string, hfToken?: string): Promise<{ download: ModelDownload }> =>      core.request(`/studio/downloads/${encodePathSegments(id)}/resume`, {        method: "POST",        body: hfToken ? JSON.stringify({ hf_token: hfToken }) : "{}",      }),     cancelDownload: (id: string): Promise<{ download: ModelDownload }> =>      core.request(`/studio/downloads/${encodePathSegments(id)}/cancel`, { method: "POST" }),     deleteModel: (path: string): Promise<{ success: boolean }> =>      core.request("/studio/models/delete", { method: "POST", body: JSON.stringify({ path }) }),     moveModel: (      sourcePath: string,      targetRoot: string,    ): Promise<{ success: boolean; target: string }> =>      core.request("/studio/models/move", {        method: "POST",        body: JSON.stringify({ source_path: sourcePath, target_root: targetRoot }),      }),     getProviders: (): Promise<{      providers: Array<{        id: string;        name: string;        base_url: string;        enabled: boolean;        has_api_key: boolean;      }>;    }> => core.request("/studio/providers"),     createProvider: (payload: {      id: string;      name: string;      base_url: string;      api_key: string;      enabled?: boolean;    }): Promise<{      success: boolean;      provider: {        id: string;        name: string;        base_url: string;        enabled: boolean;        has_api_key: boolean;      };    }> =>      core.request("/studio/providers", {        method: "POST",        body: JSON.stringify(payload),      }),     updateProvider: (      id: string,      payload: {        name?: string;        base_url?: string;        api_key?: string;        enabled?: boolean;      },    ): Promise<{      success: boolean;      provider: {        id: string;        name: string;        base_url: string;        enabled: boolean;        has_api_key: boolean;      };    }> =>      core.request(`/studio/providers/${encodePathSegments(id)}`, {        method: "PUT",        body: JSON.stringify(payload),      }),     deleteProvider: (id: string): Promise<{ success: boolean }> =>      core.request(`/studio/providers/${encodePathSegments(id)}`, {        method: "DELETE",      }),     getProviderModels: (): Promise<{      providers: Array<{        provider: string;        models: Array<{ id: string; name?: string }>;      }>;    }> => core.request("/studio/provider-models"),     getVllmRuntime: (): Promise<VllmRuntimeInfo> => core.request("/runtime/vllm"),     getRuntimeTargets: (): Promise<{ targets: RuntimeTarget[] }> =>      core.request("/runtime/targets"),     createRuntimeJob: (payload: {      backend: "vllm" | "sglang" | "llamacpp" | "mlx";      targetId?: string;      type?: "install" | "update" | "download" | "inspect";      command?: string;      args?: string[];      version?: string;      preferBundled?: boolean;    }): Promise<{ job: EngineJob }> =>      core.request("/runtime/jobs", {        method: "POST",        body: JSON.stringify({          backend: payload.backend,          targetId: payload.targetId,          type: payload.type,          command: payload.command,          args: payload.args,          version: payload.version,          prefer_bundled: payload.preferBundled,        }),      }),     getRuntimeJobs: (): Promise<{ jobs: EngineJob[] }> => core.request("/runtime/jobs"),     getRuntimeJob: (id: string): Promise<{ job: EngineJob }> =>      core.request(`/runtime/jobs/${encodePathSegments(id)}`),     cancelRuntimeJob: (id: string): Promise<{ job: EngineJob }> =>      core.request(`/runtime/jobs/${encodePathSegments(id)}/cancel`, { method: "POST" }),     getVllmRuntimeConfig: (): Promise<VllmRuntimeConfig> => core.request("/runtime/vllm/config"),     getSglangRuntime: (): Promise<RuntimeBackendInfo> => core.request("/runtime/sglang"),     getLlamacppRuntime: (): Promise<RuntimeBackendInfo> => core.request("/runtime/llamacpp"),     getMlxRuntime: (): Promise<RuntimeBackendInfo> => core.request("/runtime/mlx"),     getLlamacppRuntimeConfig: (): Promise<{ config: string | null; error?: string | null }> =>      core.request("/runtime/llamacpp/config"),     getCudaRuntime: (): Promise<RuntimeCudaInfo> => core.request("/runtime/cuda"),     getRocmRuntime: (): Promise<RuntimeRocmInfo> => core.request("/runtime/rocm"),     upgradeRuntime: (      backend: "vllm" | "sglang" | "llamacpp" | "mlx" | "cuda" | "rocm",      payload: { preferBundled?: boolean; version?: string; targetId?: string } = {},    ): Promise<RuntimeJobResponse> =>      core.request(`/runtime/${backend}/upgrade`, {        method: "POST",        body: JSON.stringify({          prefer_bundled: payload.preferBundled,          version: payload.version,          targetId: payload.targetId,        }),      }),  };}