diff --git a/frontend/packages/core/src/components/AIProviderSelect/index.tsx b/frontend/packages/core/src/components/AIProviderSelect/index.tsx index 3437fb1b..cb1bd4cf 100644 --- a/frontend/packages/core/src/components/AIProviderSelect/index.tsx +++ b/frontend/packages/core/src/components/AIProviderSelect/index.tsx @@ -46,8 +46,7 @@ const AIProviderSelect: React.FC = ({ value, onChange, st if (code === STATUS_CODE.SUCCESS) { isMounted && setProviders(data.providers) if (!data.providers?.length) return - - const selectedProvider: AIProvider = value ? providers.find((p) => p.id === value) : data.providers[0] + const selectedProvider: AIProvider = value ? data.providers.find((p) => p.id === value) : data.providers[0] onChange?.(selectedProvider.id, selectedProvider) } else { message.error(msg || t('Failed to fetch AI providers')) diff --git a/frontend/packages/core/src/pages/aiApis/index.tsx b/frontend/packages/core/src/pages/aiApis/index.tsx index d4e5e236..e7880e53 100644 --- a/frontend/packages/core/src/pages/aiApis/index.tsx +++ b/frontend/packages/core/src/pages/aiApis/index.tsx @@ -12,13 +12,15 @@ import AIProviderSelect, { AIProvider } from '@core/components/AIProviderSelect' import { App, Divider, Space, Typography } from 'antd' import dayjs from 'dayjs' import React, { useEffect, useRef, useState } from 'react' +import { useSearchParams } from 'react-router-dom' import ApiKeyContent from './components/ApiKeyContent' import { APIKey, EditAPIKey } from './types' const KeySettings: React.FC = () => { const pageListRef = useRef(null) const { modal, message } = App.useApp() - const [selectedProvider, setSelectedProvider] = useState() + const [searchParams] = useSearchParams() + const [selectedProvider, setSelectedProvider] = useState(searchParams.get('modelId') || '') const [provider, setProvider] = useState() const [apiKeys, setApiKeys] = useState([]) const { fetchData } = useFetch() diff --git a/frontend/packages/core/src/pages/aiSetting/AIFlowChart.tsx b/frontend/packages/core/src/pages/aiSetting/AIFlowChart.tsx index 06bf6549..834057dd 100644 --- a/frontend/packages/core/src/pages/aiSetting/AIFlowChart.tsx +++ b/frontend/packages/core/src/pages/aiSetting/AIFlowChart.tsx @@ -1,5 +1,6 @@ 'use client' +import { BasicResponse } from '@common/const/const' import { useFetch } from '@common/hooks/http' import { CoordinateExtent, @@ -20,19 +21,15 @@ import { ModelCardNode } from './components/ModelCardNode' import { ServiceCardNode } from './components/NodeComponents' import { LAYOUT } from './constants' import './styles.css' -import { ModelData } from './types' +import { AiSettingListItem, ModelData } from './types' -interface ApiResponse { - data: { - backup: { - id: string - name: string - } - providers: ModelData[] +export type ApiResponse = BasicResponse<{ + backup: { + id: string + name: string } - code: number - success: string -} + providers: ModelData[] +}> const calculateNodePositions = (models: ModelData[], startY = LAYOUT.NODE_START_Y, gap = LAYOUT.NODE_GAP) => { return models.reduce( @@ -46,7 +43,7 @@ const calculateNodePositions = (models: ModelData[], startY = LAYOUT.NODE_START_ }, [`${model.id}-keys`]: { x: LAYOUT.KEY_NODE_X, - y + y: y + 16 } } }, @@ -64,7 +61,7 @@ const edgeTypes: EdgeTypes = { custom: CustomEdge } -const AIFlowChart = () => { +const AIFlowChart = ({ openModal }: { openModal: (entity: AiSettingListItem) => Promise }) => { const [modelData, setModelData] = useState([]) const [nodes, setNodes, onNodesChange] = useNodesState([]) const [edges, setEdges, onEdgesChange] = useEdgesState([]) @@ -94,7 +91,7 @@ const AIFlowChart = () => { type: 'serviceCard', position: { x: LAYOUT.SERVICE_NODE_X, y: serviceY }, data: { - title: 'API Service', + title: 'API Services', count: modelData.length } }, @@ -105,8 +102,10 @@ const AIFlowChart = () => { data: { title: model.name, status: model.status, - defaultModel: model.default_llm, - logo: model.logo + defaultLlm: model.default_llm, + logo: model.logo, + id: model.id, + openModal } })), ...modelData.map((model) => ({ @@ -114,7 +113,7 @@ const AIFlowChart = () => { type: 'keyCard', position: positions[`${model.id}-keys`], data: { - title: 'API Keys', + title: '', keys: (model.keys || []).map((key, index) => ({ id: key.id, status: key.status, @@ -138,6 +137,7 @@ const AIFlowChart = () => { source: model.id, target: `${model.id}-keys`, label: `${model.key_count} keys`, + data: { id: model.id }, animated: true })) ] @@ -147,8 +147,8 @@ const AIFlowChart = () => { }, [modelData]) const calculateExtent = useCallback(() => { - const left = LAYOUT.SERVICE_NODE_X - 100 - const right = LAYOUT.KEY_NODE_X + 100 + const left = LAYOUT.SERVICE_NODE_X + const right = LAYOUT.KEY_NODE_X const top = 0 // Allow slight negative scroll to reduce top padding const bottom = LAYOUT.NODE_START_Y + modelData.length * LAYOUT.NODE_GAP return [ @@ -207,7 +207,7 @@ const AIFlowChart = () => { ...n, position: { x: LAYOUT.KEY_NODE_X, - y: LAYOUT.NODE_START_Y + index * LAYOUT.NODE_GAP + y: LAYOUT.NODE_START_Y + index * LAYOUT.NODE_GAP + 16 } } } diff --git a/frontend/packages/core/src/pages/aiSetting/AIUnconfigure.tsx b/frontend/packages/core/src/pages/aiSetting/AIUnconfigure.tsx index 2f94679f..4e924444 100644 --- a/frontend/packages/core/src/pages/aiSetting/AIUnconfigure.tsx +++ b/frontend/packages/core/src/pages/aiSetting/AIUnconfigure.tsx @@ -5,7 +5,7 @@ import { useFetch } from '@common/hooks/http' import { $t } from '@common/locales' import { App, Button, Card, Empty, Spin, Tag } from 'antd' import { FC, memo, useEffect, useState } from 'react' -import { AiSettingListItem } from './AiSettingList' +import { AiSettingListItem } from './types' const CardBox = memo( ({ @@ -92,11 +92,11 @@ const ModelCardArea = ({ ) } -interface AIUnconfigureProps { +interface AIUnConfigureProps { openModal: (entity: AiSettingListItem) => Promise } -const AIUnconfigure: FC = ({ openModal }) => { +const AIUnConfigure: FC = ({ openModal }) => { const { message } = App.useApp() const { fetchData } = useFetch() const [aiSettingList, setAiSettingList] = useState([]) @@ -141,7 +141,7 @@ const AIUnconfigure: FC = ({ openModal }) => {
{aiSettingList.filter((item) => !item.configured).length > 0 && ( <> - !item.configured) || []} /> + !item.configured) || []} /> )}
@@ -152,4 +152,4 @@ const AIUnconfigure: FC = ({ openModal }) => { ) } -export default AIUnconfigure +export default AIUnConfigure diff --git a/frontend/packages/core/src/pages/aiSetting/AiSettingList.tsx b/frontend/packages/core/src/pages/aiSetting/AiSettingList.tsx index fb66cb74..7d670d0a 100644 --- a/frontend/packages/core/src/pages/aiSetting/AiSettingList.tsx +++ b/frontend/packages/core/src/pages/aiSetting/AiSettingList.tsx @@ -9,7 +9,7 @@ import { App, Tabs } from 'antd' import { useRef } from 'react' import AIFlowChart from './AIFlowChart' import AiSettingModalContent, { AiSettingModalContentHandle } from './AiSettingModal' -import AIUnconfigure from './AIUnconfigure' +import AIUnConfigure from './AIUnconfigure' import { AiProviderConfig, AiSettingListItem } from './types' const AiSettingList = () => { @@ -19,6 +19,7 @@ const AiSettingList = () => { const { setAiConfigFlushed, accessData } = useGlobalContext() const openModal = async (entity: AiSettingListItem) => { + console.log(entity) message.loading($t(RESPONSE_TIPS.loading)) const { code, data, msg } = await fetchData>('ai/provider/config', { method: 'GET', @@ -87,12 +88,12 @@ const AiSettingList = () => { { key: 'flow', label: $t('已设置'), - children: + children: }, { key: 'config', label: $t('未设置'), - children:
{}
+ children:
{}
} ]} /> diff --git a/frontend/packages/core/src/pages/aiSetting/AiSettingModal.tsx b/frontend/packages/core/src/pages/aiSetting/AiSettingModal.tsx index 862a7d71..26092df0 100644 --- a/frontend/packages/core/src/pages/aiSetting/AiSettingModal.tsx +++ b/frontend/packages/core/src/pages/aiSetting/AiSettingModal.tsx @@ -113,7 +113,7 @@ const AiSettingModalContent = forwardRef {x.id} - {x?.scopes?.map((s) => {s?.toLocaleUpperCase()})} + {x?.scopes?.map((s) => {s?.toLocaleUpperCase()})} ) }))} diff --git a/frontend/packages/core/src/pages/aiSetting/components/CustomEdge.tsx b/frontend/packages/core/src/pages/aiSetting/components/CustomEdge.tsx index f3cbff89..c4afd894 100644 --- a/frontend/packages/core/src/pages/aiSetting/components/CustomEdge.tsx +++ b/frontend/packages/core/src/pages/aiSetting/components/CustomEdge.tsx @@ -31,7 +31,7 @@ export default function CustomEdge({ {label && ( = ({ data }) = style={{ border: '1px solid var(--border-color)' }} > -
+
{title}
Promise } export const ModelCardNode: React.FC<{ data: ModelCardNodeData }> = ({ data }) => { - const { title, status, defaultModel, logo } = data + const { title, status, defaultLlm, logo } = data return (
= ({ data }) = console.log('Default:', data.id)} + onClick={() => data.openModal?.({ id: data.id, defaultLlm: defaultLlm })} />
{t('默认:')} - {defaultModel} + {defaultLlm}
diff --git a/frontend/packages/core/src/pages/aiSetting/components/ServiceCardNode.tsx b/frontend/packages/core/src/pages/aiSetting/components/ServiceCardNode.tsx index b2237fd3..176d80da 100644 --- a/frontend/packages/core/src/pages/aiSetting/components/ServiceCardNode.tsx +++ b/frontend/packages/core/src/pages/aiSetting/components/ServiceCardNode.tsx @@ -11,7 +11,7 @@ export const ServiceCardNode: React.FC = () => {
- AI Service + AI Services
) diff --git a/frontend/packages/core/src/pages/aiSetting/constants.ts b/frontend/packages/core/src/pages/aiSetting/constants.ts index 9da8d084..a6635ffe 100644 --- a/frontend/packages/core/src/pages/aiSetting/constants.ts +++ b/frontend/packages/core/src/pages/aiSetting/constants.ts @@ -1,5 +1,5 @@ export const LAYOUT = { - SERVICE_NODE_X: 50, + SERVICE_NODE_X: 0, NODE_START_Y: 20, NODE_GAP: 120, MODEL_NODE_X: 500, diff --git a/frontend/packages/core/src/pages/keySettings/index.tsx b/frontend/packages/core/src/pages/keySettings/index.tsx index 58e8dc93..e5a3d8a7 100644 --- a/frontend/packages/core/src/pages/keySettings/index.tsx +++ b/frontend/packages/core/src/pages/keySettings/index.tsx @@ -12,15 +12,16 @@ import AIProviderSelect, { AIProvider } from '@core/components/AIProviderSelect' import { App, Divider, Space, Typography } from 'antd' import dayjs from 'dayjs' import React, { useEffect, useRef, useState } from 'react' +import { useSearchParams } from 'react-router-dom' import ApiKeyContent from './components/ApiKeyContent' import { APIKey, EditAPIKey } from './types' const KeySettings: React.FC = () => { const pageListRef = useRef(null) const { modal, message } = App.useApp() - const [selectedProvider, setSelectedProvider] = useState() + const [searchParams] = useSearchParams() + const [selectedProvider, setSelectedProvider] = useState(searchParams.get('modelId') || '') const [provider, setProvider] = useState() - const [apiKeys, setApiKeys] = useState([]) const { fetchData } = useFetch() const [searchWord, setSearchWord] = useState('') const [total, setTotal] = useState(0)