Files
wehub-resource-sync c48612c494
CI / E2E Tests (push) Has been cancelled
CI / Lint, Typecheck & Unit Tests (push) Has been cancelled
Docs Build / Build docs site (push) Has been cancelled
Publish @openmaic packages / Build, validate & publish (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:03:23 +08:00

78 lines
2.6 KiB
TypeScript

import { NextRequest } from 'next/server';
import { createLogger } from '@/lib/logger';
import { apiError, apiSuccess } from '@/lib/server/api-response';
import { resolveModel } from '@/lib/server/resolve-model';
import { callLLM } from '@/lib/ai/llm';
const log = createLogger('Verify Model');
export async function POST(req: NextRequest) {
let model: string | undefined;
try {
const body = await req.json();
const { apiKey, baseUrl, providerType } = body;
model = body.model;
if (!model) {
return apiError('MISSING_REQUIRED_FIELD', 400, 'Model name is required');
}
// Parse model string and resolve server-side fallback
let languageModel;
try {
const result = await resolveModel({
modelString: model,
apiKey: apiKey || '',
baseUrl: baseUrl || undefined,
providerType,
});
languageModel = result.model;
} catch (error) {
return apiError(
'INVALID_REQUEST',
401,
error instanceof Error ? error.message : String(error),
);
}
// Send a minimal test message. Use the unified wrapper so compatible
// providers can receive provider-specific request options.
const { text } = await callLLM(
{
model: languageModel,
prompt: 'Say "OK" if you can hear me.',
maxOutputTokens: 64,
},
'verify-model',
undefined,
{ mode: 'disabled', enabled: false },
);
return apiSuccess({
message: 'Connection successful',
response: text,
});
} catch (error) {
log.error(`Model verification failed [model="${model ?? 'unknown'}"]:`, error);
let errorMessage = 'Connection failed';
if (error instanceof Error) {
// Parse common error messages
if (error.message.includes('401') || error.message.includes('Unauthorized')) {
errorMessage = 'API key is invalid or expired';
} else if (error.message.includes('404') || error.message.includes('not found')) {
errorMessage = 'Model not found or API endpoint error';
} else if (error.message.includes('429')) {
errorMessage = 'API rate limit exceeded, please try again later';
} else if (error.message.includes('ENOTFOUND') || error.message.includes('ECONNREFUSED')) {
errorMessage = 'Cannot connect to API server, please check the Base URL';
} else if (error.message.includes('timeout')) {
errorMessage = 'Connection timed out, please check your network';
} else {
errorMessage = error.message;
}
}
return apiError('INTERNAL_ERROR', 500, errorMessage);
}
}