feat(webui): simplify model preset settings (#5061)

This commit is contained in:
chengyongru
2026-07-24 00:55:06 +08:00
committed by GitHub
parent d993c81f08
commit aae259c790
29 changed files with 4548 additions and 1182 deletions
+82 -9
View File
@@ -15,6 +15,7 @@ import type {
ModelConfigurationUpdate,
NetworkSafetySettingsUpdate,
PairingPayload,
ProviderCreationUpdate,
ProviderModelsPayload,
ProviderOAuthCompletionResult,
ProviderOAuthLoginResult,
@@ -54,6 +55,7 @@ function isSlashCommandLifecycle(value: unknown): value is SlashCommandLifecycle
const CHANNEL_VALUES_HEADER = "X-Nanobot-Channel-Values";
const API_SERVICE_VALUES_HEADER = "X-Nanobot-API-Service-Values";
const OAUTH_CODE_HEADER = "X-Nanobot-OAuth-Code";
const PROVIDER_VALUES_HEADER = "X-Nanobot-Provider-Values";
export class ApiError extends Error {
status: number;
@@ -767,6 +769,27 @@ export async function updateSettings(
return request<SettingsPayload>(`${base}/api/settings/update?${query}`, token);
}
function appendModelGenerationSettings(
query: URLSearchParams,
configuration: Pick<
ModelConfigurationCreate,
"maxTokens" | "contextWindowTokens" | "temperature" | "reasoningEffort"
>,
): void {
if (configuration.maxTokens !== undefined) {
query.set("max_tokens", String(configuration.maxTokens));
}
if (configuration.contextWindowTokens !== undefined) {
query.set("context_window_tokens", String(configuration.contextWindowTokens));
}
if (configuration.temperature !== undefined) {
query.set("temperature", String(configuration.temperature));
}
if (configuration.reasoningEffort !== undefined) {
query.set("reasoning_effort", configuration.reasoningEffort ?? "");
}
}
export async function createModelConfiguration(
token: string,
configuration: ModelConfigurationCreate,
@@ -777,6 +800,7 @@ export async function createModelConfiguration(
query.set("label", configuration.label);
query.set("provider", configuration.provider);
query.set("model", configuration.model);
appendModelGenerationSettings(query, configuration);
return request<SettingsPayload>(
`${base}/api/settings/model-configurations/create?${query}`,
token,
@@ -793,29 +817,78 @@ export async function updateModelConfiguration(
if (configuration.label !== undefined) query.set("label", configuration.label);
if (configuration.provider !== undefined) query.set("provider", configuration.provider);
if (configuration.model !== undefined) query.set("model", configuration.model);
if (configuration.contextWindowTokens !== undefined) {
query.set("context_window_tokens", String(configuration.contextWindowTokens));
}
appendModelGenerationSettings(query, configuration);
return request<SettingsPayload>(
`${base}/api/settings/model-configurations/update?${query}`,
token,
);
}
export async function deleteModelConfiguration(
token: string,
name: string,
base: string = "",
): Promise<SettingsPayload> {
const query = new URLSearchParams({ name });
return request<SettingsPayload>(
`${base}/api/settings/model-configurations/delete?${query}`,
token,
);
}
export async function migrateModelConfigurations(
token: string,
base: string = "",
): Promise<SettingsPayload> {
return request<SettingsPayload>(
`${base}/api/settings/model-configurations/migrate`,
token,
);
}
export async function updateModelCallOrder(
token: string,
order: string[],
base: string = "",
): Promise<SettingsPayload> {
const query = new URLSearchParams({ order: JSON.stringify(order) });
return request<SettingsPayload>(
`${base}/api/settings/model-call-order/update?${query}`,
token,
);
}
export async function updateProviderSettings(
token: string,
update: ProviderSettingsUpdate,
base: string = "",
): Promise<SettingsPayload> {
const query = new URLSearchParams();
query.set("provider", update.provider);
if (update.apiKey !== undefined) query.set("api_key", update.apiKey);
if (update.apiBase !== undefined) query.set("api_base", update.apiBase);
if (update.apiType !== undefined) query.set("api_type", update.apiType);
if (update.proxy !== undefined) query.set("proxy", update.proxy);
const { provider, ...values } = update;
const query = new URLSearchParams({ provider });
return request<SettingsPayload>(
`${base}/api/settings/provider/update?${query}`,
token,
{
headers: {
[PROVIDER_VALUES_HEADER]: encodeURIComponent(JSON.stringify(values)),
},
},
);
}
export async function createProviderSettings(
token: string,
update: ProviderCreationUpdate,
base: string = "",
): Promise<SettingsPayload> {
return request<SettingsPayload>(
`${base}/api/settings/provider/create`,
token,
{
headers: {
[PROVIDER_VALUES_HEADER]: encodeURIComponent(JSON.stringify(update)),
},
},
);
}
+46
View File
@@ -432,9 +432,14 @@ export interface SettingsPayload {
reasoning_effort: string | null;
reasoning_effort_values?: string[];
}>;
model_call_order: string[];
model_call_order_editable: boolean;
created_model_preset?: string;
created_provider?: string;
providers: Array<{
name: string;
label: string;
is_custom?: boolean;
configured: boolean;
auth_type?: "api_key" | "oauth";
api_key_required?: boolean;
@@ -448,6 +453,22 @@ export interface SettingsPayload {
oauth_expires_at?: number | null;
oauth_login_supported?: boolean;
proxy?: string | null;
advanced_fields?: Array<
| "api_type"
| "extra_headers"
| "extra_body"
| "extra_query"
| "proxy"
| "thinking_style"
| "region"
| "profile"
>;
extra_headers?: Record<string, string> | null;
extra_body?: Record<string, unknown> | null;
extra_query?: Record<string, string> | null;
thinking_style?: string | null;
region?: string | null;
profile?: string | null;
}>;
web_search: {
provider: string;
@@ -941,6 +962,10 @@ export interface ModelConfigurationCreate {
label: string;
provider: string;
model: string;
maxTokens?: number;
contextWindowTokens?: number;
temperature?: number;
reasoningEffort?: string | null;
}
export interface ModelConfigurationUpdate {
@@ -948,15 +973,36 @@ export interface ModelConfigurationUpdate {
label?: string;
provider?: string;
model?: string;
maxTokens?: number;
contextWindowTokens?: number;
temperature?: number;
reasoningEffort?: string | null;
}
export interface ProviderSettingsUpdate {
provider: string;
displayName?: string;
apiKey?: string;
apiBase?: string;
apiType?: "auto" | "chat_completions" | "responses";
proxy?: string;
extraHeaders?: string;
extraBody?: string;
extraQuery?: string;
thinkingStyle?: string;
region?: string;
profile?: string;
}
export interface ProviderCreationUpdate {
name: string;
apiKey?: string;
apiBase: string;
proxy?: string;
extraHeaders?: string;
extraBody?: string;
extraQuery?: string;
thinkingStyle?: string;
}
export interface WebSearchSettingsUpdate {