From 4e019023684e799e4a8bcbe9887558ab175a9558 Mon Sep 17 00:00:00 2001 From: 7418 <7418@openclaw.ai> Date: Fri, 13 Mar 2026 00:47:03 +0800 Subject: [PATCH] fix: Volcengine model list pollution + missing by-cwd route MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - provider-catalog: getDefaultModelsForProvider() now returns preset's defaultModels even when empty, instead of falling through to ANTHROPIC_DEFAULT_MODELS. Fixes Volcengine (defaultModels: []) incorrectly showing Sonnet/Opus/Haiku. - providers/models route: remove DEFAULT_MODELS fallback when both DB and catalog are empty — providers like Volcengine that require user-specified model names should show only those models. - Add missing src/app/api/chat/sessions/by-cwd/route.ts that was untracked; without it worktree switching would 404 in release builds. Co-Authored-By: Claude Opus 4.6 --- src/app/api/chat/sessions/by-cwd/route.ts | 15 +++++++++++++++ src/app/api/providers/models/route.ts | 8 ++++---- src/lib/provider-catalog.ts | 6 ++++-- 3 files changed, 23 insertions(+), 6 deletions(-) create mode 100644 src/app/api/chat/sessions/by-cwd/route.ts diff --git a/src/app/api/chat/sessions/by-cwd/route.ts b/src/app/api/chat/sessions/by-cwd/route.ts new file mode 100644 index 0000000..1e464a9 --- /dev/null +++ b/src/app/api/chat/sessions/by-cwd/route.ts @@ -0,0 +1,15 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getLatestSessionByWorkingDirectory } from '@/lib/db'; + +export async function GET(req: NextRequest) { + const cwd = req.nextUrl.searchParams.get('cwd'); + if (!cwd) { + return NextResponse.json({ error: 'cwd is required' }, { status: 400 }); + } + + const session = getLatestSessionByWorkingDirectory(cwd); + if (session) { + return NextResponse.json({ sessionId: session.id }); + } + return NextResponse.json({ sessionId: null }); +} diff --git a/src/app/api/providers/models/route.ts b/src/app/api/providers/models/route.ts index eb3eef8..761855f 100644 --- a/src/app/api/providers/models/route.ts +++ b/src/app/api/providers/models/route.ts @@ -128,14 +128,14 @@ export async function GET() { capabilities: m.capabilities as Record | undefined, })); - // Start with DB models + catalog defaults + // Start with DB models + catalog defaults. + // If both are empty (e.g. Volcengine where user must specify model names), + // leave rawModels empty — do NOT fall back to DEFAULT_MODELS (Sonnet/Opus/Haiku). if (dbModels.length > 0) { const dbIds = new Set(dbModels.map(m => m.value)); rawModels = [...dbModels, ...catalogRaw.filter(m => !dbIds.has(m.value))]; - } else if (catalogRaw.length > 0) { - rawModels = [...catalogRaw]; } else { - rawModels = [...DEFAULT_MODELS]; + rawModels = [...catalogRaw]; } // Inject role_models_json.default into the list if not already present diff --git a/src/lib/provider-catalog.ts b/src/lib/provider-catalog.ts index 719a00e..e8d97fa 100644 --- a/src/lib/provider-catalog.ts +++ b/src/lib/provider-catalog.ts @@ -540,11 +540,13 @@ export function getDefaultModelsForProvider( ): CatalogModel[] { // Try to find a preset by base_url const preset = VENDOR_PRESETS.find(p => p.baseUrl && p.baseUrl === baseUrl); - if (preset && preset.defaultModels.length > 0) { + if (preset) { + // Preset matched — return its models even if empty (e.g. Volcengine + // requires users to specify their own model names, so defaultModels is []). return preset.defaultModels; } - // Protocol-based defaults + // Protocol-based defaults (only when no preset matched) if (protocol === 'anthropic' || protocol === 'openrouter' || protocol === 'bedrock' || protocol === 'vertex') { return ANTHROPIC_DEFAULT_MODELS; }