diff --git a/frontend/packages/core/src/const/ai-service/type.ts b/frontend/packages/core/src/const/ai-service/type.ts index 27062c72..d7086490 100644 --- a/frontend/packages/core/src/const/ai-service/type.ts +++ b/frontend/packages/core/src/const/ai-service/type.ts @@ -9,6 +9,7 @@ export type AiServiceConfigFieldType = { name?: string; id?: string; provider?:string + model?:string prefix?:string; logo?:string; logoFile?:UploadFile; diff --git a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx index 59b2174d..d6c271ef 100644 --- a/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx +++ b/frontend/packages/core/src/pages/aiService/api/AiServiceInsideRouterCreate.tsx @@ -189,7 +189,7 @@ const AiServiceInsideRouterCreate = () => { const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { setLlmList(data.models) - const localId = id || aiServiceInfo?.name + const localId = id || aiServiceInfo?.model if (replaceDefaultLlm) { setDefaultLlm((prev) => { diff --git a/frontend/packages/core/src/pages/system/SystemConfig.tsx b/frontend/packages/core/src/pages/system/SystemConfig.tsx index 8fe9e74b..cbd9c34c 100644 --- a/frontend/packages/core/src/pages/system/SystemConfig.tsx +++ b/frontend/packages/core/src/pages/system/SystemConfig.tsx @@ -1,12 +1,6 @@ import { LoadingOutlined } from '@ant-design/icons' import WithPermission from '@common/components/aoplatform/WithPermission.tsx' -import { - BasicResponse, - DELETE_TIPS, - PLACEHOLDER, - RESPONSE_TIPS, - STATUS_CODE -} from '@common/const/const.tsx' +import { BasicResponse, DELETE_TIPS, PLACEHOLDER, RESPONSE_TIPS, STATUS_CODE } from '@common/const/const.tsx' import { EntityItem, MemberItem, SimpleTeamItem } from '@common/const/type.ts' import { useBreadcrumb } from '@common/contexts/BreadcrumbContext.tsx' import { useGlobalContext } from '@common/contexts/GlobalStateContext.tsx' @@ -50,15 +44,10 @@ const SystemConfig = forwardRef((_, ref) => { const [tagOptionList, setTagOptionList] = useState([]) const [serviceClassifyOptionList, setServiceClassifyOptionList] = useState() const [uploadLoading, setUploadLoading] = useState(false) - const { - checkPermission, - accessInit, - getGlobalAccessData, - state, - aiConfigFlushed, - setAiConfigFlushed - } = useGlobalContext() + const { checkPermission, accessInit, getGlobalAccessData, state, aiConfigFlushed, setAiConfigFlushed } = + useGlobalContext() const [providerOptionList, setProviderOptionList] = useState() + const [modelList, setModelList] = useState() const location = useLocation() const currentUrl = location.pathname @@ -77,18 +66,80 @@ const SystemConfig = forwardRef((_, ref) => { fetchData>('simple/ai/providers/configured', { method: 'GET', eoTransformKeys: [], - eoParams: { all: true} - }).then(response => { + eoParams: { all: true } + }).then((response) => { const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { const configuredProvider = data.providers - ?.filter(x => x.configured) + ?.filter((x) => x.configured) ?.map((x: SimpleAiProviderItem) => { return { ...x, label: x.name, value: x.id } }) setProviderOptionList(configuredProvider) if (!serviceId && configuredProvider.length > 0) { form.setFieldsValue({ provider: configuredProvider[0]?.id }) + if (configuredProvider[0]?.type === 'local') { + getLocalModelList() + } else { + getOnlineModelList(configuredProvider[0]?.id) + } + } + if (serviceId && configuredProvider.length > 0) { + const providerID = form.getFieldValue('provider') + const provider = configuredProvider?.find((item: any) => item.id === providerID) + if (provider?.type === 'local') { + getLocalModelList(false) + } else { + getOnlineModelList(provider?.id, false) + } + } + } else { + message.error(msg || $t(RESPONSE_TIPS.error)) + } + }) + } + + const modelProviderChange = (id: string) => { + const provider = providerOptionList?.find((item) => item.id === id) + if (provider?.type === 'local') { + getLocalModelList() + } else { + getOnlineModelList(provider?.id) + } + } + + const getLocalModelList = (setDefaultLlm = true) => { + fetchData>('simple/ai/models/local/configured', { + method: 'GET' + }).then((response) => { + const { code, data, msg } = response + if (code === STATUS_CODE.SUCCESS) { + const localModelList = data.models?.map((x: any) => { + return { ...x, label: x.name, value: x.id } + }) + setModelList(localModelList) + if (setDefaultLlm && localModelList.length > 0) { + form.setFieldsValue({ model: localModelList[0]?.id }) + } + } else { + message.error(msg || $t(RESPONSE_TIPS.error)) + } + }) + } + const getOnlineModelList = (id: string, setDefaultLlm = true) => { + fetchData>('ai/provider/llms', { + method: 'GET', + eoParams: { provider: id }, + eoTransformKeys: ['default_llm'] + }).then((response) => { + const { code, data, msg } = response + if (code === STATUS_CODE.SUCCESS) { + const localModelList = data.llms?.map((x: any) => { + return { ...x, label: x.id, value: x.id } + }) + setModelList(localModelList) + if (setDefaultLlm && localModelList.length > 0) { + form.setFieldsValue({ model: localModelList[0]?.id }) } } else { message.error(msg || $t(RESPONSE_TIPS.error)) @@ -137,9 +188,7 @@ const SystemConfig = forwardRef((_, ref) => { } const uploadButton = ( -
- {uploadLoading ? : } -
+
{uploadLoading ? : }
) const getTagAndServiceClassifyList = () => { @@ -147,7 +196,7 @@ const SystemConfig = forwardRef((_, ref) => { setServiceClassifyOptionList([]) fetchData>('catalogues', { method: 'GET' - }).then(response => { + }).then((response) => { const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { setTagOptionList( @@ -175,7 +224,7 @@ const SystemConfig = forwardRef((_, ref) => { method: 'GET', eoParams: { team: teamId, service: serviceId }, eoTransformKeys: ['team_id', 'service_type', 'approval_type', 'service_kind'] - }).then(response => { + }).then((response) => { const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { setTimeout(() => { @@ -196,6 +245,7 @@ const SystemConfig = forwardRef((_, ref) => { }) setImageBase64(data.service.logo) setShowClassify(data.service.serviceType === 'public') + getProviderOptionList() }, 0) } else { message.error(msg || $t(RESPONSE_TIPS.error)) @@ -204,21 +254,19 @@ const SystemConfig = forwardRef((_, ref) => { } const onFinish: () => Promise = () => { - return form.validateFields().then(value => { + return form.validateFields().then((value) => { return fetchData>( serviceId === undefined ? 'team/service' : 'service/info', { method: serviceId === undefined ? 'POST' : 'PUT', eoParams: { - ...(serviceId === undefined - ? { team: value.team } - : { service: serviceId, team: teamId }) + ...(serviceId === undefined ? { team: value.team } : { service: serviceId, team: teamId }) }, eoBody: { ...value, prefix: value.prefix?.trim() }, eoTransformKeys: ['serviceType', 'approvalType', 'serviceKind'] } ) - .then(response => { + .then((response) => { const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { message.success(msg || $t(RESPONSE_TIPS.success)) @@ -229,7 +277,7 @@ const SystemConfig = forwardRef((_, ref) => { return Promise.reject(msg || $t(RESPONSE_TIPS.error)) } }) - .catch(errorInfo => { + .catch((errorInfo) => { return Promise.reject(errorInfo) }) }) @@ -241,7 +289,7 @@ const SystemConfig = forwardRef((_, ref) => { fetchData>( !checkPermission('system.workspace.team.view_all') ? 'simple/teams/mine' : 'simple/teams', { method: 'GET', eoTransformKeys: [] } - ).then(response => { + ).then((response) => { const { code, data, msg } = response if (code === STATUS_CODE.SUCCESS) { setTeamOptionList( @@ -262,7 +310,7 @@ const SystemConfig = forwardRef((_, ref) => { fetchData>('team/service', { method: 'DELETE', eoParams: { team: teamId, service: serviceId } - }).then(response => { + }).then((response) => { const { code, msg } = response if (code === STATUS_CODE.SUCCESS) { message.success(msg || $t(RESPONSE_TIPS.success)) @@ -285,7 +333,6 @@ const SystemConfig = forwardRef((_, ref) => { getTeamOptionList() }) } - getProviderOptionList() getTagAndServiceClassifyList() if (serviceId !== undefined) { setOnEdit(true) @@ -299,6 +346,7 @@ const SystemConfig = forwardRef((_, ref) => { } ]) } else { + getProviderOptionList() setOnEdit(false) const id = uuidv4() form.setFieldValue('id', id) @@ -333,7 +381,7 @@ const SystemConfig = forwardRef((_, ref) => { // const serviceTypeOptions = useMemo(()=>SERVICE_KIND_OPTIONS.map((x)=>({...x, label:$t(x.label)})),[state.language]); // const visualizationOptions = useMemo(()=>SERVICE_VISUALIZATION_OPTIONS.map((x)=>({...x, label:$t(x.label)})),[state.language]) const approvalOptions = useMemo( - () => SERVICE_APPROVAL_OPTIONS.map(x => ({ ...x, label: $t(x.label) })), + () => SERVICE_APPROVAL_OPTIONS.map((x) => ({ ...x, label: $t(x.label) })), [state.language] ) @@ -364,21 +412,13 @@ const SystemConfig = forwardRef((_, ref) => { name="id" rules={[{ required: true, whitespace: true }]} > - + {!onEdit && ( - - label={$t('服务类型')} - name="serviceKind" - rules={[{ required: true }]} - > + label={$t('服务类型')} name="serviceKind" rules={[{ required: true }]}> { + onChange={(e) => { setShowAI(e.target.value === 'ai') }} > @@ -398,39 +438,40 @@ const SystemConfig = forwardRef((_, ref) => { )} {showAI && ( - - label={$t('默认 AI 供应商')} - name="provider" - rules={[{ required: true }]} - extra={ - serviceId - ? $t('创建 API 时会默认选择该供应商,修改默认供应商不会影响现有 API') - : '' - } - > - {providerOptionList && providerOptionList.length > 0 ? ( - - ) : ( -

- {$t('未配置任何 AI 模型供应商,')} - setAiConfigFlushed(false)}> - {$t('立即配置')} - -

- )} - + <> + + label={$t('默认 AI 供应商')} + name="provider" + rules={[{ required: true }]} + extra={serviceId ? $t('创建 API 时会默认选择该供应商,修改默认供应商不会影响现有 API') : ''} + > + {providerOptionList && providerOptionList.length > 0 ? ( + + ) : ( +

+ {$t('未配置任何 AI 模型供应商,')} + setAiConfigFlushed(false)}> + {$t('立即配置')} + +

+ )} + + label={$t('默认模型')} name="model" rules={[{ required: true }]}> + + + )} - label={$t('API 调用前缀')} name="prefix" - extra={$t( - '作为服务内所有API的前缀,比如host/{service_name}/{api_path},影响较大,谨慎修改' - )} + extra={$t('作为服务内所有API的前缀,比如host/{service_name}/{api_path},影响较大,谨慎修改')} rules={[ { required: true, whitespace: true }, { @@ -438,18 +479,10 @@ const SystemConfig = forwardRef((_, ref) => { } ]} > - + {!onEdit && ( - - label={$t('所属团队')} - name="team" - rules={[{ required: true }]} - > + label={$t('所属团队')} name="team" rules={[{ required: true }]}>