/* 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, Popover } from '@douyinfe/semi-ui'; import { timestamp2string, getLobeHubIcon, stringToColor } from '../../../helpers'; 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 description with ellipsis const renderDescription = (text) => { return ( {text || '-'} ); }; // Render tags const renderTags = (text) => { if (!text) return '-'; const tagsArr = text.split(',').filter(Boolean); const maxDisplayTags = 3; const displayTags = tagsArr.slice(0, maxDisplayTags); const remainingTags = tagsArr.slice(maxDisplayTags); return ( {displayTags.map((tag, index) => ( {tag} ))} {remainingTags.length > 0 && ( {remainingTags.map((tag, index) => ( {tag} ))} } position="top" > +{remainingTags.length} )} ); }; // Render endpoints const renderEndpoints = (text) => { try { const arr = JSON.parse(text); if (Array.isArray(arr)) { return ( {arr.map((ep) => ( {ep} ))} ); } } catch (_) { } return text || '-'; }; // Render bound channels const renderBoundChannels = (channels) => { if (!channels || channels.length === 0) return '-'; return ( {channels.map((c, idx) => ( {c.name}({c.type}) ))} ); }; // Render operations column const renderOperations = (text, record, setEditingModel, setShowEdit, manageModel, refresh, t) => { return ( {record.status === 1 ? ( ) : ( )} ); }; export const getModelsColumns = ({ t, manageModel, setEditingModel, setShowEdit, refresh, vendorMap, }) => { return [ { title: t('模型名称'), dataIndex: 'model_name', }, { title: t('描述'), dataIndex: 'description', render: renderDescription, }, { 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: '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 ), }, ]; };