/* Copyright (C) 2025 QuantumNous This program is free software: you can redistribute it and/or modify it under the terms of the GNU Affero General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. You should have received a copy of the GNU Affero General Public License along with this program. If not, see . For commercial licensing, please contact support@quantumnous.com */ import React from 'react'; import { Button, Space, Tag, Typography, Modal } from '@douyinfe/semi-ui'; import { timestamp2string, getLobeHubIcon, stringToColor } from '../../../helpers'; import { renderLimitedItems, renderDescription } from './ui/RenderUtils.jsx'; const { Text } = Typography; // Render timestamp function renderTimestamp(timestamp) { return <>{timestamp2string(timestamp)}; } // Render vendor column with icon const renderVendorTag = (vendorId, vendorMap, t) => { if (!vendorId || !vendorMap[vendorId]) return '-'; const v = vendorMap[vendorId]; return ( {v.name} ); }; // Render groups (enable_groups) const renderGroups = (groups) => { if (!groups || groups.length === 0) return '-'; return renderLimitedItems({ items: groups, renderItem: (g, idx) => ( {g} ), }); }; // Render tags const renderTags = (text) => { if (!text) return '-'; const tagsArr = text.split(',').filter(Boolean); return renderLimitedItems({ items: tagsArr, renderItem: (tag, idx) => ( {tag} ), }); }; // Render endpoints const renderEndpoints = (text) => { let arr; try { arr = JSON.parse(text); } catch (_) { } if (!Array.isArray(arr)) return text || '-'; return renderLimitedItems({ items: arr, renderItem: (ep, idx) => ( {ep} ), }); }; // Render quota type const renderQuotaType = (qt, t) => { if (qt === 1) { return ( {t('按次计费')} ); } if (qt === 0) { return ( {t('按量计费')} ); } return qt ?? '-'; }; // Render bound channels const renderBoundChannels = (channels) => { if (!channels || channels.length === 0) return '-'; return renderLimitedItems({ items: channels, renderItem: (c, idx) => ( {c.name}({c.type}) ), }); }; // Render operations column const renderOperations = (text, record, setEditingModel, setShowEdit, manageModel, refresh, t) => { return ( {record.status === 1 ? ( ) : ( )} ); }; // 名称匹配类型渲染 const renderNameRule = (rule, t) => { const map = { 0: { color: 'green', label: t('精确') }, 1: { color: 'blue', label: t('前缀') }, 2: { color: 'orange', label: t('包含') }, 3: { color: 'purple', label: t('后缀') }, }; const cfg = map[rule]; if (!cfg) return '-'; return ( {cfg.label} ); }; export const getModelsColumns = ({ t, manageModel, setEditingModel, setShowEdit, refresh, vendorMap, }) => { return [ { title: t('模型名称'), dataIndex: 'model_name', render: (text) => ( e.stopPropagation()}> {text} ), }, { title: t('匹配类型'), dataIndex: 'name_rule', render: (val) => renderNameRule(val, t), }, { title: t('描述'), dataIndex: 'description', render: (text) => renderDescription(text, 200), }, { title: t('供应商'), dataIndex: 'vendor_id', render: (vendorId, record) => renderVendorTag(vendorId, vendorMap, t), }, { title: t('标签'), dataIndex: 'tags', render: renderTags, }, { title: t('端点'), dataIndex: 'endpoints', render: renderEndpoints, }, { title: t('已绑定渠道'), dataIndex: 'bound_channels', render: renderBoundChannels, }, { title: t('可用分组'), dataIndex: 'enable_groups', render: renderGroups, }, { title: t('计费类型'), dataIndex: 'quota_type', render: (qt) => renderQuotaType(qt, t), }, { title: t('创建时间'), dataIndex: 'created_time', render: (text, record, index) => { return
{renderTimestamp(text)}
; }, }, { title: t('更新时间'), dataIndex: 'updated_time', render: (text, record, index) => { return
{renderTimestamp(text)}
; }, }, { title: '', dataIndex: 'operate', fixed: 'right', render: (text, record, index) => renderOperations( text, record, setEditingModel, setShowEdit, manageModel, refresh, t ), }, ]; };