feat(model-settings): add system default model configuration dialog

This commit is contained in:
2025-10-22 11:51:27 +08:00
parent 4784fcb23f
commit 497ebfba9f
5 changed files with 485 additions and 52 deletions

View File

@@ -1,13 +1,16 @@
import { useState, useCallback } from 'react';
import { useState, useCallback, useMemo } from 'react';
import { useMessage } from '@/hooks/useSnackbar';
import userService from '@/services/user_service';
import logger from '@/utils/logger';
import type {
import type {
ApiKeyFormData,
AzureOpenAIFormData,
BedrockFormData,
OllamaFormData,
} from '../components/ModelDialogs';
import type { ITenantInfo } from '@/interfaces/database/knowledge';
import { useLlmList } from '@/hooks/llm-hooks';
import type { LlmModelType } from '@/constants/knowledge';
// 对话框状态管理 hook
export const useDialogState = () => {
@@ -42,7 +45,7 @@ export const useDialogState = () => {
// API Key 对话框管理
export const useApiKeyDialog = () => {
const dialogState = useDialogState();
const showMessage = useMessage();
const showMessage = useMessage();
const [factoryName, setFactoryName] = useState('');
const openApiKeyDialog = useCallback((factory: string, data?: Partial<ApiKeyFormData>, isEdit = false) => {
@@ -81,7 +84,7 @@ export const useApiKeyDialog = () => {
// Azure OpenAI 对话框管理
export const useAzureOpenAIDialog = () => {
const dialogState = useDialogState();
const showMessage = useMessage();
const showMessage = useMessage();
const submitAzureOpenAI = useCallback(async (data: AzureOpenAIFormData) => {
dialogState.setLoading(true);
@@ -114,7 +117,7 @@ export const useAzureOpenAIDialog = () => {
// AWS Bedrock 对话框管理
export const useBedrockDialog = () => {
const dialogState = useDialogState();
const showMessage = useMessage();
const showMessage = useMessage();
const submitBedrock = useCallback(async (data: BedrockFormData) => {
dialogState.setLoading(true);
@@ -148,7 +151,7 @@ export const useBedrockDialog = () => {
// Ollama 对话框管理
export const useOllamaDialog = () => {
const dialogState = useDialogState();
const showMessage = useMessage();
const showMessage = useMessage();
const submitOllama = useCallback(async (data: OllamaFormData) => {
dialogState.setLoading(true);
@@ -178,7 +181,7 @@ export const useOllamaDialog = () => {
// 删除操作管理
export const useDeleteOperations = () => {
const showMessage = useMessage();
const showMessage = useMessage();
const [loading, setLoading] = useState(false);
const deleteLlm = useCallback(async (factoryName: string, modelName: string) => {
@@ -224,9 +227,56 @@ export const useDeleteOperations = () => {
// 系统默认模型设置
export const useSystemModelSetting = () => {
const dialogState = useDialogState();
const showMessage = useMessage();
const showMessage = useMessage();
const submitSystemModelSetting = useCallback(async (data: { defaultModel: string }) => {
const { data: llmList } = useLlmList();
const getOptionsByModelType = useCallback((modelType: LlmModelType) => {
return Object.entries(llmList)
.filter(([, value]) =>
modelType
? value.some((x) => x.model_type.includes(modelType))
: true,
)
.map(([key, value]) => {
return {
label: key,
options: value
.filter(
(x) =>
(modelType ? x.model_type.includes(modelType) : true) &&
x.available,
)
.map((x) => ({
label: x.llm_name,
value: `${x.llm_name}@${x.fid}`,
disabled: !x.available,
model: x,
})),
};
})
.filter((x) => x.options.length > 0);
}, [llmList]);
const allModelOptions = useMemo(() => {
const llmOptions = getOptionsByModelType('chat');
const image2textOptions = getOptionsByModelType('image2text');
const embeddingOptions = getOptionsByModelType('embedding');
const speech2textOptions = getOptionsByModelType('speech2text');
const rerankOptions = getOptionsByModelType('rerank');
const ttsOptions = getOptionsByModelType('tts');
return {
llmOptions,
image2textOptions,
embeddingOptions,
speech2textOptions,
rerankOptions,
ttsOptions,
}
}, [llmList, getOptionsByModelType]);
const submitSystemModelSetting = useCallback(async (data: Partial<ITenantInfo>) => {
dialogState.setLoading(true);
try {
// 这里需要根据实际的 API 接口调整
@@ -245,6 +295,7 @@ export const useSystemModelSetting = () => {
return {
...dialogState,
submitSystemModelSetting,
allModelOptions,
};
};