diff --git a/frontend/packages/common/src/components/aoplatform/TableBtnWithPermission.tsx b/frontend/packages/common/src/components/aoplatform/TableBtnWithPermission.tsx index f39b0ae7..7c938271 100644 --- a/frontend/packages/common/src/components/aoplatform/TableBtnWithPermission.tsx +++ b/frontend/packages/common/src/components/aoplatform/TableBtnWithPermission.tsx @@ -30,7 +30,9 @@ const TableIconName = { online: 'ic:baseline-check-circle', cancel: 'ic:baseline-cancel-schedule-send', refresh: 'ic:baseline-refresh', - logs: 'hugeicons:google-doc' + logs: 'hugeicons:google-doc', + disable: 'ic:baseline-pause-circle', + enable: 'ic:baseline-play-circle' } // 表格操作栏按钮,受权限控制 const TableBtnWithPermission = ({ diff --git a/frontend/packages/common/src/hooks/http.ts b/frontend/packages/common/src/hooks/http.ts index 6be30e0f..6688fdad 100644 --- a/frontend/packages/common/src/hooks/http.ts +++ b/frontend/packages/common/src/hooks/http.ts @@ -187,7 +187,7 @@ export function useFetch() { } // 如果响应体为JSON且指定了转换键,则转换响应数据 - if (isJsonHttp(response.headers)) { + if (options?.eoApiPrefix||isJsonHttp(response.headers)) { const data = await response.json() const newData = (await pluginEventHub.emit('httpResponse', { data, continue: true })) as Response return shouldTransformKeys ? (keysToCamel(newData, options.eoTransformKeys as string[]) as T) : data diff --git a/frontend/packages/core/src/pages/aiSetting/AIFlowChart.tsx b/frontend/packages/core/src/pages/aiSetting/AIFlowChart.tsx index 4a7e9b23..4ccf38d1 100644 --- a/frontend/packages/core/src/pages/aiSetting/AIFlowChart.tsx +++ b/frontend/packages/core/src/pages/aiSetting/AIFlowChart.tsx @@ -18,9 +18,9 @@ import CustomEdge from './components/CustomEdge' import { KeyStatusNode } from './components/KeyStatusNode' import { ModelCardNode } from './components/ModelCardNode' import { ServiceCardNode } from './components/NodeComponents' -import { ModelData } from './components/types' import { LAYOUT } from './constants' import './styles.css' +import { ModelData } from './types' interface ApiResponse { data: { diff --git a/frontend/packages/core/src/pages/aiSetting/components/KeyStatusNode.tsx b/frontend/packages/core/src/pages/aiSetting/components/KeyStatusNode.tsx index 741f8c44..5f56e782 100644 --- a/frontend/packages/core/src/pages/aiSetting/components/KeyStatusNode.tsx +++ b/frontend/packages/core/src/pages/aiSetting/components/KeyStatusNode.tsx @@ -1,6 +1,6 @@ import { Handle, Position } from '@xyflow/react' import React from 'react' -import { KeyData } from './types' +import { KeyData } from '../types' interface KeyStatusNodeData { id: string diff --git a/frontend/packages/core/src/pages/aiSetting/components/ModelCardNode.tsx b/frontend/packages/core/src/pages/aiSetting/components/ModelCardNode.tsx index f0ee9c99..02d92b1c 100644 --- a/frontend/packages/core/src/pages/aiSetting/components/ModelCardNode.tsx +++ b/frontend/packages/core/src/pages/aiSetting/components/ModelCardNode.tsx @@ -2,7 +2,7 @@ import { Icon } from '@iconify/react' import { Handle, Position } from '@xyflow/react' import { t } from 'i18next' import React from 'react' -import { ModelStatus } from './types' +import { ModelStatus } from '../types' interface ModelCardData { title: string diff --git a/frontend/packages/core/src/pages/aiSetting/components/types.ts b/frontend/packages/core/src/pages/aiSetting/types.ts similarity index 70% rename from frontend/packages/core/src/pages/aiSetting/components/types.ts rename to frontend/packages/core/src/pages/aiSetting/types.ts index e360509d..4935473e 100644 --- a/frontend/packages/core/src/pages/aiSetting/components/types.ts +++ b/frontend/packages/core/src/pages/aiSetting/types.ts @@ -1,5 +1,5 @@ -export type ModelStatus = 'enable' | 'abnormal'|'disable' -export type KeyStatus ='normal' | 'abnormal'|'disable' +export type ModelStatus = 'enable' | 'abnormal'|'disabled' +export type KeyStatus ='normal' | 'abnormal'|'disabled' export interface KeyData { id: string diff --git a/frontend/packages/core/src/pages/keySettings/components/ApiKeyModal.tsx b/frontend/packages/core/src/pages/keySettings/components/ApiKeyModal.tsx index c9ab7eff..8bbbf393 100644 --- a/frontend/packages/core/src/pages/keySettings/components/ApiKeyModal.tsx +++ b/frontend/packages/core/src/pages/keySettings/components/ApiKeyModal.tsx @@ -2,7 +2,7 @@ import { $t } from '@common/locales' import { DatePicker, Form, Input, Modal, Switch } from 'antd' import dayjs from 'dayjs' import React, { useEffect, useState } from 'react' -import { APIKey } from '..' +import { APIKey } from '../types' interface ApiKeyModalProps { visible: boolean diff --git a/frontend/packages/core/src/pages/keySettings/index.tsx b/frontend/packages/core/src/pages/keySettings/index.tsx index 3b3ab02d..d05e3c8e 100644 --- a/frontend/packages/core/src/pages/keySettings/index.tsx +++ b/frontend/packages/core/src/pages/keySettings/index.tsx @@ -9,17 +9,7 @@ import AIProviderSelect from '@core/components/AIProviderSelect' import { Divider, message, Space, Typography } from 'antd' import React, { useEffect, useRef, useState } from 'react' import ApiKeyModal from './components/ApiKeyModal' - -export interface APIKey extends Record { - id: string - name: string - status: 'normal' | 'exceeded' | 'expired' | 'disabled' | 'error' - use_token: number - update_time: string - expire_time: string - can_delete: boolean - priority: number -} +import { APIKey } from './types' const KeySettings: React.FC = () => { const pageListRef = useRef(null) @@ -84,8 +74,59 @@ const KeySettings: React.FC = () => { setEditingKey(null) } - const handleDelete = (id: string) => { - setApiKeys(apiKeys.filter((key) => key.id !== id)) + const handleDelete = async (id: string) => { + try { + const response = await fetchData>('ai/resource/key', { + method: 'DELETE', + eoParams: { + provider: selectedProvider, + id: id, + branchID: 0 + }, + eoApiPrefix: 'http://uat.apikit.com:11204/mockApi/aoplatform/api/v1/' + }) + + if (response.code === STATUS_CODE.SUCCESS) { + message.success($t('删除成功')) + pageListRef.current?.reload() + } else { + message.error(response.msg || RESPONSE_TIPS.error) + } + } catch (error) { + message.error(RESPONSE_TIPS.error) + } + } + + const handleToggleStatus = async (id: string, currentStatus: string) => { + try { + const newStatus = currentStatus === 'normal' ? 'disable' : 'enable' + const response = await fetchData>(`ai/resource/key/${newStatus}`, { + method: 'PUT', + eoParams: { + provider: selectedProvider, + id: id + }, + eoApiPrefix: 'http://uat.apikit.com:11204/mockApi/aoplatform/api/v1/' + }) + + if (response.code === STATUS_CODE.SUCCESS) { + message.success(newStatus === 'disable' ? $t('停用成功') : $t('启用成功')) + setApiKeys( + apiKeys.map((key) => + key.id === id + ? ({ + ...key, + status: newStatus === 'disable' ? 'disabled' : 'normal' + } as APIKey) + : (key as APIKey) + ) + ) + } else { + message.error(response.msg || RESPONSE_TIPS.error) + } + } catch (error) { + message.error(RESPONSE_TIPS.error) + } } const handleDragSortEnd = async (beforeIndex: number, afterIndex: number, newDataSource: APIKey[]) => { @@ -164,7 +205,7 @@ const KeySettings: React.FC = () => { { title: '', key: 'option', - btnNums: 3, + btnNums: 4, fixed: 'right', valueType: 'option', render: (_: React.ReactNode, entity: APIKey) => [ @@ -175,7 +216,20 @@ const KeySettings: React.FC = () => { onClick={() => handleEdit(entity)} btnTitle={$t('编辑')} />, - , + , + entity.status !== 'expired' && entity.status !== 'error' && ( + <> + handleToggleStatus(entity.id, entity.status)} + btnTitle={entity.status === 'normal' ? $t('停用') : $t('启用')} + /> + + + ), + { + id: string + name: string + status: 'normal' | 'exceeded' | 'expired' | 'disabled' | 'error' + use_token: number + update_time: string + expire_time: string + can_delete: boolean + priority: number + } + \ No newline at end of file