first-update

This commit is contained in:
2026-03-17 14:36:31 +08:00
parent 72f08aee7c
commit 4eddf05e79
516 changed files with 115270 additions and 1 deletions

View File

@@ -0,0 +1,103 @@
import { NextResponse } from 'next/server';
import { createInitModelConfig, getModelConfigByProjectId, saveModelConfig } from '@/lib/db/model-config';
import { DEFAULT_MODEL_SETTINGS, MODEL_PROVIDERS } from '@/constant/model';
import { getProject } from '@/lib/db/projects';
import { sortProvidersByPriority } from '@/lib/util/providerLogo';
function normalizeModelEndpoint(endpoint = '') {
let normalizedEndpoint = String(endpoint).trim();
if (!normalizedEndpoint) {
return '';
}
if (normalizedEndpoint.includes('/chat/completions')) {
normalizedEndpoint = normalizedEndpoint.replace('/chat/completions', '');
}
return normalizedEndpoint;
}
// 获取模型配置列表
export async function GET(request, { params }) {
try {
const { projectId } = params;
// 验证项目 ID
if (!projectId) {
return NextResponse.json({ error: 'The project ID cannot be empty' }, { status: 400 });
}
let modelConfigList = await getModelConfigByProjectId(projectId);
if (!modelConfigList || modelConfigList.length === 0) {
let insertModelConfigList = [];
const sortedProviders = sortProvidersByPriority(MODEL_PROVIDERS, item => item.id);
sortedProviders.forEach(item => {
let data = {
projectId: projectId,
providerId: item.id,
providerName: item.name,
endpoint: item.defaultEndpoint,
apiKey: '',
modelId: '',
modelName: '',
type: 'text',
temperature: DEFAULT_MODEL_SETTINGS.temperature,
maxTokens: DEFAULT_MODEL_SETTINGS.maxTokens,
topK: 0,
topP: DEFAULT_MODEL_SETTINGS.topP,
status: 1
};
insertModelConfigList.push(data);
});
modelConfigList = await createInitModelConfig(insertModelConfigList);
}
modelConfigList = sortProvidersByPriority(modelConfigList, item => item.providerId);
let project = await getProject(projectId);
return NextResponse.json({ data: modelConfigList, defaultModelConfigId: project.defaultModelConfigId });
} catch (error) {
console.error('Error obtaining model configuration:', String(error));
return NextResponse.json({ error: 'Failed to obtain model configuration' }, { status: 500 });
}
}
// 保存模型配置
export async function POST(request, { params }) {
try {
const { projectId } = params;
// 验证项目 ID
if (!projectId) {
return NextResponse.json({ error: 'The project ID cannot be empty' }, { status: 400 });
}
// 获取请求体
const modelConfig = await request.json();
// 验证请求体
if (!modelConfig) {
return NextResponse.json({ error: 'The model configuration cannot be empty ' }, { status: 400 });
}
modelConfig.projectId = projectId;
modelConfig.endpoint = normalizeModelEndpoint(modelConfig.endpoint);
// 如果没有 modelId使用 modelName 补齐(兼容旧逻辑)
if (!modelConfig.modelId && modelConfig.modelName) {
modelConfig.modelId = modelConfig.modelName;
}
// 如果没有 modelName使用 modelId 补齐
if (!modelConfig.modelName && modelConfig.modelId) {
modelConfig.modelName = modelConfig.modelId;
}
if (!modelConfig.topK) {
modelConfig.topK = 0;
}
if (!modelConfig.status) {
modelConfig.status = 1;
}
const parsedMaxTokens = Number(modelConfig.maxTokens ?? DEFAULT_MODEL_SETTINGS.maxTokens);
if (!Number.isInteger(parsedMaxTokens) || parsedMaxTokens < 1) {
return NextResponse.json({ error: 'maxTokens must be a positive integer' }, { status: 400 });
}
modelConfig.maxTokens = parsedMaxTokens;
const res = await saveModelConfig(modelConfig);
return NextResponse.json(res);
} catch (error) {
console.error('Error updating model configuration:', String(error));
return NextResponse.json({ error: 'Failed to update model configuration' }, { status: 500 });
}
}