mirror of
https://github.com/sipeed/picoclaw.git
synced 2026-06-12 18:08:54 +00:00
8a046e951a
Allow configuring provider-specific fields like reasoning_split for minimax via the model config's extra_body map. These fields are merged into the request body last, giving them precedence over default values. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
93 lines
2.2 KiB
TypeScript
93 lines
2.2 KiB
TypeScript
import { refreshGatewayState } from "@/store/gateway"
|
|
|
|
// API client for model list management.
|
|
|
|
export interface ModelInfo {
|
|
index: number
|
|
model_name: string
|
|
model: string
|
|
api_base?: string
|
|
api_key: string
|
|
proxy?: string
|
|
auth_method?: string
|
|
// Advanced fields
|
|
connect_mode?: string
|
|
workspace?: string
|
|
rpm?: number
|
|
max_tokens_field?: string
|
|
request_timeout?: number
|
|
thinking_level?: string
|
|
extra_body?: Record<string, any>
|
|
// Meta
|
|
configured: boolean
|
|
is_default: boolean
|
|
}
|
|
|
|
interface ModelsListResponse {
|
|
models: ModelInfo[]
|
|
total: number
|
|
default_model: string
|
|
}
|
|
|
|
interface ModelActionResponse {
|
|
status: string
|
|
index?: number
|
|
default_model?: string
|
|
}
|
|
|
|
const BASE_URL = ""
|
|
|
|
async function request<T>(path: string, options?: RequestInit): Promise<T> {
|
|
const res = await fetch(`${BASE_URL}${path}`, options)
|
|
if (!res.ok) {
|
|
throw new Error(`API error: ${res.status} ${res.statusText}`)
|
|
}
|
|
return res.json() as Promise<T>
|
|
}
|
|
|
|
export async function getModels(): Promise<ModelsListResponse> {
|
|
return request<ModelsListResponse>("/api/models")
|
|
}
|
|
|
|
export async function addModel(
|
|
model: Partial<ModelInfo>,
|
|
): Promise<ModelActionResponse> {
|
|
return request<ModelActionResponse>("/api/models", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(model),
|
|
})
|
|
}
|
|
|
|
export async function updateModel(
|
|
index: number,
|
|
model: Partial<ModelInfo>,
|
|
): Promise<ModelActionResponse> {
|
|
return request<ModelActionResponse>(`/api/models/${index}`, {
|
|
method: "PUT",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify(model),
|
|
})
|
|
}
|
|
|
|
export async function deleteModel(index: number): Promise<ModelActionResponse> {
|
|
return request<ModelActionResponse>(`/api/models/${index}`, {
|
|
method: "DELETE",
|
|
})
|
|
}
|
|
|
|
export async function setDefaultModel(
|
|
modelName: string,
|
|
): Promise<ModelActionResponse> {
|
|
const response = await request<ModelActionResponse>("/api/models/default", {
|
|
method: "POST",
|
|
headers: { "Content-Type": "application/json" },
|
|
body: JSON.stringify({ model_name: modelName }),
|
|
})
|
|
|
|
await refreshGatewayState()
|
|
return response
|
|
}
|
|
|
|
export type { ModelsListResponse, ModelActionResponse }
|