diff --git a/tools/ui/src/app.d.ts b/tools/ui/src/app.d.ts index 5309dce8f4..1c3d006824 100644 --- a/tools/ui/src/app.d.ts +++ b/tools/ui/src/app.d.ts @@ -18,20 +18,17 @@ import type { ApiErrorResponse, ApiLlamaCppServerProps, ApiModelDataEntry, - ApiModelListResponse, ApiModelLoadStage, + ApiModelsListResponse, + ApiModelsLoadRequest, + ApiModelsLoadResponse, ApiModelsSseData, ApiModelsSseEvent, ApiModelsSseProgress, + ApiModelsStatusResponse, + ApiModelsUnloadRequest, + ApiModelsUnloadResponse, ApiProcessingState, - ApiRouterModelMeta, - ApiRouterModelsListResponse, - ApiRouterModelsLoadRequest, - ApiRouterModelsLoadResponse, - ApiRouterModelsStatusRequest, - ApiRouterModelsStatusResponse, - ApiRouterModelsUnloadRequest, - ApiRouterModelsUnloadResponse, ChatAttachmentDisplayItem, // Chat types ChatMessagePromptProgress, @@ -89,16 +86,11 @@ declare global { ApiModelsSseProgress, ApiModelsSseData, ApiModelsSseEvent, - ApiModelListResponse, + ApiModelsListResponse, + ApiModelsLoadResponse, + ApiModelsStatusResponse, + ApiModelsUnloadResponse, ApiProcessingState, - ApiRouterModelMeta, - ApiRouterModelsLoadRequest, - ApiRouterModelsLoadResponse, - ApiRouterModelsStatusRequest, - ApiRouterModelsStatusResponse, - ApiRouterModelsListResponse, - ApiRouterModelsUnloadRequest, - ApiRouterModelsUnloadResponse, // Chat types ChatAttachmentDisplayItem, ChatMessagePromptProgress, diff --git a/tools/ui/src/lib/services/index.ts b/tools/ui/src/lib/services/index.ts index cfd0077acc..960109c036 100644 --- a/tools/ui/src/lib/services/index.ts +++ b/tools/ui/src/lib/services/index.ts @@ -136,7 +136,7 @@ export { ConversationTransferService } from './conversation-transfer.service'; * * **Server Mode Behavior:** * - **MODEL mode**: Only `list()` is relevant — single model always loaded - * - **ROUTER mode**: Full lifecycle — `list()`, `listRouter()`, `load()`, `unload()` + * - **ROUTER mode**: Full lifecycle — `list()`, `load()`, `unload()` * * **Endpoints:** * - `GET /v1/models` — OpenAI-compatible model list (both modes) diff --git a/tools/ui/src/lib/services/models.service.ts b/tools/ui/src/lib/services/models.service.ts index b0fcca0eec..070c935c65 100644 --- a/tools/ui/src/lib/services/models.service.ts +++ b/tools/ui/src/lib/services/models.service.ts @@ -56,19 +56,8 @@ export class ModelsService { * * @returns List of available models with basic metadata */ - static async list(): Promise { - return apiFetch(API_MODELS.LIST); - } - - /** - * Fetch list of all models with detailed metadata (ROUTER mode). - * Returns models with load status, paths, and other metadata - * beyond what the OpenAI-compatible endpoint provides. - * - * @returns List of models with detailed status and configuration info - */ - static async listRouter(): Promise { - return apiFetch(API_MODELS.LIST); + static async list(): Promise { + return apiFetch(API_MODELS.LIST); } /** @@ -80,14 +69,14 @@ export class ModelsService { * @param extraArgs - Optional additional arguments to pass to the model instance * @returns Load response from the server */ - static async load(modelId: string, extraArgs?: string[]): Promise { + static async load(modelId: string, extraArgs?: string[]): Promise { const payload: { model: string; extra_args?: string[] } = { model: modelId }; if (extraArgs && extraArgs.length > 0) { payload.extra_args = extraArgs; } - return apiPost(API_MODELS.LOAD, payload); + return apiPost(API_MODELS.LOAD, payload); } /** @@ -220,8 +209,8 @@ export class ModelsService { * @param modelId - Model identifier to unload * @returns Unload response from the server */ - static async unload(modelId: string): Promise { - return apiPost(API_MODELS.UNLOAD, { model: modelId }); + static async unload(modelId: string): Promise { + return apiPost(API_MODELS.UNLOAD, { model: modelId }); } /** diff --git a/tools/ui/src/lib/stores/models/index.svelte.ts b/tools/ui/src/lib/stores/models/index.svelte.ts index 90d6fe76b7..095b343b9f 100644 --- a/tools/ui/src/lib/stores/models/index.svelte.ts +++ b/tools/ui/src/lib/stores/models/index.svelte.ts @@ -193,15 +193,15 @@ class ModelsStore implements ModelPropsHost, ModelStatusHost { } /** - * Fetch router models with full metadata (ROUTER mode only). - * No-op in router mode — fetch() already calls listRouter() internally. + * Fetch models with full metadata (ROUTER mode only). + * No-op in MODEL mode — fetch() already calls list() internally. * Kept for API compatibility (e.g. handleOpenChange dropdown open handler). */ async fetchRouterModels(): Promise { if (!serverStore.isRouterMode) return; try { - const response = await ModelsService.listRouter(); + const response = await ModelsService.list(); this.routerModels = response.data; await this.props.fetchModalitiesForLoadedModels(); @@ -358,9 +358,7 @@ class ModelsStore implements ModelPropsHost, ModelStatusHost { * Both MODEL and ROUTER modes share the same mapping logic; * they differ only in which endpoint is called. */ - private buildModelOptions( - response: ApiModelListResponse | ApiRouterModelsListResponse - ): ModelOption[] { + private buildModelOptions(response: ApiModelsListResponse): ModelOption[] { return response.data.map((item: ApiModelDataEntry, index: number) => { const details = response.models?.[index]; const rawCapabilities = Array.isArray(details?.capabilities) ? details?.capabilities : []; @@ -390,7 +388,6 @@ class ModelsStore implements ModelPropsHost, ModelStatusHost { return this.buildModelOptions(response); } - /** * Filter to models visible in the UI (ui !== false). */ @@ -422,7 +419,7 @@ class ModelsStore implements ModelPropsHost, ModelStatusHost { const router = serverStore.isRouterMode; if (router) { - const response = await ModelsService.listRouter(); + const response = await ModelsService.list(); this.routerModels = response.data; this.models = this.buildModelOptions(response); diff --git a/tools/ui/src/lib/types/api.d.ts b/tools/ui/src/lib/types/api.d.ts index ebf0a2a48b..6abe2f3781 100644 --- a/tools/ui/src/lib/types/api.d.ts +++ b/tools/ui/src/lib/types/api.d.ts @@ -174,12 +174,6 @@ export interface ApiModelDetails { }; } -export interface ApiModelListResponse { - object: string; - data: ApiModelDataEntry[]; - models?: ApiModelDetails[]; -} - export interface ApiLlamaCppServerProps { default_generation_settings: { id: number; @@ -448,10 +442,10 @@ export interface ApiProcessingState { } /** - * Router model metadata - extended from ApiModelDataEntry with additional router-specific fields + * Model metadata - extended from ApiModelDataEntry with additional fields * @deprecated Use ApiModelDataEntry instead - the /models endpoint returns this structure directly */ -export interface ApiRouterModelMeta { +export interface ApiModelMeta { /** Model identifier (e.g., "ggml-org/Qwen2.5-Omni-7B-GGUF:latest") */ name: string; /** Path to model file or manifest */ @@ -469,31 +463,24 @@ export interface ApiRouterModelMeta { } /** - * Request to load a model + * Request body for POST /models/load */ -export interface ApiRouterModelsLoadRequest { +export interface ApiModelsLoadRequest { model: string; } /** - * Response from loading a model + * Response from POST /models/load */ -export interface ApiRouterModelsLoadResponse { +export interface ApiModelsLoadResponse { success: boolean; error?: string; } -/** - * Request to check model status - */ -export interface ApiRouterModelsStatusRequest { - model: string; -} - /** * Response with model status */ -export interface ApiRouterModelsStatusResponse { +export interface ApiModelsStatusResponse { model: string; status: ModelStatus; port?: number; @@ -501,26 +488,26 @@ export interface ApiRouterModelsStatusResponse { } /** - * Response with list of all models from /models endpoint - * Note: This is the same as ApiModelListResponse - the endpoint returns the same structure - * regardless of server mode (MODEL or ROUTER) + * Response with list of all models from /v1/models and /models endpoints + * (same structure regardless of server mode) */ -export interface ApiRouterModelsListResponse { +export interface ApiModelsListResponse { object: string; data: ApiModelDataEntry[]; + models?: ApiModelDetails[]; } /** - * Request to unload a model + * Request body for POST /models/unload */ -export interface ApiRouterModelsUnloadRequest { +export interface ApiModelsUnloadRequest { model: string; } /** - * Response from unloading a model + * Response from POST /models/unload */ -export interface ApiRouterModelsUnloadResponse { +export interface ApiModelsUnloadResponse { success: boolean; error?: string; } diff --git a/tools/ui/src/lib/types/index.ts b/tools/ui/src/lib/types/index.ts index d91c2811a4..a572c59f0b 100644 --- a/tools/ui/src/lib/types/index.ts +++ b/tools/ui/src/lib/types/index.ts @@ -16,7 +16,6 @@ export type { ApiModelsSseData, ApiModelsSseEvent, ApiModelDetails, - ApiModelListResponse, ApiLlamaCppServerProps, ApiChatCompletionRequest, ApiChatCompletionToolCallFunctionDelta, @@ -26,14 +25,13 @@ export type { ApiChatCompletionResponse, ApiSlotData, ApiProcessingState, - ApiRouterModelMeta, - ApiRouterModelsLoadRequest, - ApiRouterModelsLoadResponse, - ApiRouterModelsStatusRequest, - ApiRouterModelsStatusResponse, - ApiRouterModelsListResponse, - ApiRouterModelsUnloadRequest, - ApiRouterModelsUnloadResponse, + ApiModelMeta, + ApiModelsLoadRequest, + ApiModelsLoadResponse, + ApiModelsStatusResponse, + ApiModelsListResponse, + ApiModelsUnloadRequest, + ApiModelsUnloadResponse, AudioInputFormat, ApiStreamSession } from './api'; diff --git a/tools/ui/src/lib/utils/api-fetch.ts b/tools/ui/src/lib/utils/api-fetch.ts index 2059200049..9aa3a85799 100644 --- a/tools/ui/src/lib/utils/api-fetch.ts +++ b/tools/ui/src/lib/utils/api-fetch.ts @@ -49,7 +49,7 @@ export interface ApiFetchOptions extends Omit { * @example * ```typescript * // GET request - * const models = await apiFetch('/v1/models'); + * const models = await apiFetch('/v1/models'); * * // POST request * const result = await apiFetch('/models/load', {