refactor: drop request-body token override, keep env-only config

The unauthenticated /api/validate-model endpoint should not let callers
raise the token budget; the env var / admin setting alone fixes #883.
Also import the shared constants in the settings registry instead of
duplicating them, and move the setting to the Features group alongside
the other validation settings.
This commit is contained in:
dayuan.jiang
2026-07-11 22:30:20 +09:00
parent c1e4b1c9bf
commit eb2fa69f58
4 changed files with 35 additions and 32 deletions
-5
View File
@@ -32,9 +32,6 @@ interface ValidateRequest {
awsRegion?: string
// Vertex AI specific
vertexApiKey?: string // Express Mode API key
// Optional test token budget override
maxTokens?: number
max_tokens?: number
}
export async function POST(req: Request) {
@@ -52,8 +49,6 @@ export async function POST(req: Request) {
vertexApiKey,
} = body
const validationMaxTokens = resolveModelValidationMaxTokens(
body.maxTokens,
body.max_tokens,
process.env.MODEL_VALIDATION_MAX_TOKENS,
)
+16 -11
View File
@@ -10,6 +10,11 @@
// - ADMIN_PASSWORD / SETTINGS_FILE: bootstrap values, env-only to avoid lockout
// - Per-provider reasoning/thinking tuning vars: env-only (see env.example)
import {
DEFAULT_MODEL_VALIDATION_MAX_TOKENS,
MAX_MODEL_VALIDATION_MAX_TOKENS,
} from "@/lib/model-validation"
export type SettingType = "string" | "secret" | "number" | "boolean" | "enum"
export interface SettingDef {
@@ -88,17 +93,6 @@ export const SETTINGS_REGISTRY: SettingDef[] = [
label: "Max Output Tokens",
min: 1,
},
{
key: "MODEL_VALIDATION_MAX_TOKENS",
group: "generation",
type: "number",
label: "Model Validation Max Tokens",
description:
"Token budget for model test requests. Increase for reasoning models that may emit thinking tokens first.",
min: 1,
max: 64000,
default: "1000",
},
// ── Access Control ───────────────────────────────────────────────
{
@@ -134,6 +128,17 @@ export const SETTINGS_REGISTRY: SettingDef[] = [
label: "Validation Timeout (ms)",
min: 1000,
},
{
key: "MODEL_VALIDATION_MAX_TOKENS",
group: "features",
type: "number",
label: "Model Validation Max Tokens",
description:
"Token budget for model test requests. Increase for reasoning models that may emit thinking tokens first.",
min: 1,
max: MAX_MODEL_VALIDATION_MAX_TOKENS,
default: String(DEFAULT_MODEL_VALIDATION_MAX_TOKENS),
},
{
key: "ENABLE_HISTORY_XML_REPLACE",
group: "features",
+6 -12
View File
@@ -7,22 +7,16 @@ export function parseModelValidationMaxTokens(value: unknown): number | null {
const numeric =
typeof value === "number" ? value : Number(String(value).trim())
if (
!Number.isFinite(numeric) ||
!Number.isInteger(numeric) ||
numeric < 1
) {
if (!Number.isInteger(numeric) || numeric < 1) {
return null
}
return Math.min(numeric, MAX_MODEL_VALIDATION_MAX_TOKENS)
}
export function resolveModelValidationMaxTokens(...sources: unknown[]): number {
for (const source of sources) {
const parsed = parseModelValidationMaxTokens(source)
if (parsed !== null) return parsed
}
return DEFAULT_MODEL_VALIDATION_MAX_TOKENS
export function resolveModelValidationMaxTokens(value: unknown): number {
return (
parseModelValidationMaxTokens(value) ??
DEFAULT_MODEL_VALIDATION_MAX_TOKENS
)
}
+13 -4
View File
@@ -8,14 +8,23 @@ import {
describe("model validation token budget", () => {
it("defaults to a larger reasoning-friendly budget", () => {
expect(resolveModelValidationMaxTokens()).toBe(
expect(resolveModelValidationMaxTokens(undefined)).toBe(
DEFAULT_MODEL_VALIDATION_MAX_TOKENS,
)
})
it("prefers the first valid source", () => {
expect(resolveModelValidationMaxTokens(2000, 3000)).toBe(2000)
expect(resolveModelValidationMaxTokens("bad", "3000")).toBe(3000)
it("parses valid env values", () => {
expect(resolveModelValidationMaxTokens("2000")).toBe(2000)
expect(resolveModelValidationMaxTokens(" 300 ")).toBe(300)
})
it("falls back to the default on invalid values", () => {
expect(resolveModelValidationMaxTokens("abc")).toBe(
DEFAULT_MODEL_VALIDATION_MAX_TOKENS,
)
expect(resolveModelValidationMaxTokens("")).toBe(
DEFAULT_MODEL_VALIDATION_MAX_TOKENS,
)
})
it("rejects invalid values", () => {