ui : rename model API types to mirror endpoints

Drop the Router prefix from client-side API types; names now map
directly to the /models endpoint family (load/unload/download/list).
Merge ApiModelListResponse into ApiModelsListResponse (same endpoint
shape in both modes) and remove the duplicate ModelsService.listRouter().

Assisted-by: pi
This commit is contained in:
Aleksander Grygier
2026-08-28 11:03:49 +02:00
parent 2d64ea1290
commit 01da32baf2
7 changed files with 45 additions and 82 deletions
+10 -18
View File
@@ -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,
+1 -1
View File
@@ -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)
+6 -17
View File
@@ -56,19 +56,8 @@ export class ModelsService {
*
* @returns List of available models with basic metadata
*/
static async list(): Promise<ApiModelListResponse> {
return apiFetch<ApiModelListResponse>(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<ApiRouterModelsListResponse> {
return apiFetch<ApiRouterModelsListResponse>(API_MODELS.LIST);
static async list(): Promise<ApiModelsListResponse> {
return apiFetch<ApiModelsListResponse>(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<ApiRouterModelsLoadResponse> {
static async load(modelId: string, extraArgs?: string[]): Promise<ApiModelsLoadResponse> {
const payload: { model: string; extra_args?: string[] } = { model: modelId };
if (extraArgs && extraArgs.length > 0) {
payload.extra_args = extraArgs;
}
return apiPost<ApiRouterModelsLoadResponse>(API_MODELS.LOAD, payload);
return apiPost<ApiModelsLoadResponse>(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<ApiRouterModelsUnloadResponse> {
return apiPost<ApiRouterModelsUnloadResponse>(API_MODELS.UNLOAD, { model: modelId });
static async unload(modelId: string): Promise<ApiModelsUnloadResponse> {
return apiPost<ApiModelsUnloadResponse>(API_MODELS.UNLOAD, { model: modelId });
}
/**
@@ -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<void> {
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);
+15 -28
View File
@@ -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;
}
+7 -9
View File
@@ -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';
+1 -1
View File
@@ -49,7 +49,7 @@ export interface ApiFetchOptions extends Omit<RequestInit, 'headers'> {
* @example
* ```typescript
* // GET request
* const models = await apiFetch<ApiModelListResponse>('/v1/models');
* const models = await apiFetch<ApiModelsListResponse>('/v1/models');
*
* // POST request
* const result = await apiFetch<ApiResponse>('/models/load', {