/*
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 { Tag, Space, Tooltip, Switch } from '@douyinfe/semi-ui';
import { IconHelpCircle } from '@douyinfe/semi-icons';
import { renderModelTag, stringToColor } from '../../../helpers';
function renderQuotaType(type, t) {
switch (type) {
case 1:
return (
{t('按次计费')}
);
case 0:
return (
{t('按量计费')}
);
default:
return t('未知');
}
}
function renderSupportedEndpoints(endpoints) {
if (!endpoints || endpoints.length === 0) {
return null;
}
return (
{endpoints.map((endpoint, idx) => (
{endpoint}
))}
);
}
export const getPricingTableColumns = ({
t,
selectedGroup,
groupRatio,
copyText,
setModalImageUrl,
setIsModalOpenurl,
currency,
tokenUnit,
setTokenUnit,
displayPrice,
showRatio,
}) => {
const endpointColumn = {
title: t('可用端点类型'),
dataIndex: 'supported_endpoint_types',
fixed: 'right',
render: (text, record, index) => {
return renderSupportedEndpoints(text);
},
};
const modelNameColumn = {
title: t('模型名称'),
dataIndex: 'model_name',
render: (text, record, index) => {
return renderModelTag(text, {
onClick: () => {
copyText(text);
}
});
},
onFilter: (value, record) =>
record.model_name.toLowerCase().includes(value.toLowerCase()),
};
const quotaColumn = {
title: t('计费类型'),
dataIndex: 'quota_type',
render: (text, record, index) => {
return renderQuotaType(parseInt(text), t);
},
sorter: (a, b) => a.quota_type - b.quota_type,
};
const baseColumns = [modelNameColumn, quotaColumn];
const ratioColumn = {
title: () => (
{t('倍率')}
{
setModalImageUrl('/ratio.png');
setIsModalOpenurl(true);
}}
/>
),
dataIndex: 'model_ratio',
render: (text, record, index) => {
const completionRatio = parseFloat(record.completion_ratio.toFixed(3));
const content = (
{t('模型倍率')}:{record.quota_type === 0 ? text : t('无')}
{t('补全倍率')}:
{record.quota_type === 0 ? completionRatio : t('无')}
{t('分组倍率')}:{groupRatio[selectedGroup]}
);
return content;
},
};
const priceColumn = {
title: (
{t('模型价格')}
{/* 计费单位切换 */}
setTokenUnit(checked ? 'K' : 'M')}
checkedText="K"
uncheckedText="M"
/>
),
dataIndex: 'model_price',
render: (text, record, index) => {
if (record.quota_type === 0) {
const inputRatioPriceUSD = record.model_ratio * 2 * groupRatio[selectedGroup];
const completionRatioPriceUSD =
record.model_ratio * record.completion_ratio * 2 * groupRatio[selectedGroup];
const unitDivisor = tokenUnit === 'K' ? 1000 : 1;
const unitLabel = tokenUnit === 'K' ? 'K' : 'M';
const rawDisplayInput = displayPrice(inputRatioPriceUSD);
const rawDisplayCompletion = displayPrice(completionRatioPriceUSD);
const numInput = parseFloat(rawDisplayInput.replace(/[^0-9.]/g, '')) / unitDivisor;
const numCompletion = parseFloat(rawDisplayCompletion.replace(/[^0-9.]/g, '')) / unitDivisor;
const displayInput = `${currency === 'CNY' ? '¥' : '$'}${numInput.toFixed(3)}`;
const displayCompletion = `${currency === 'CNY' ? '¥' : '$'}${numCompletion.toFixed(3)}`;
return (
{t('提示')} {displayInput} / 1{unitLabel} tokens
{t('补全')} {displayCompletion} / 1{unitLabel} tokens
);
} else {
const priceUSD = parseFloat(text) * groupRatio[selectedGroup];
const displayVal = displayPrice(priceUSD);
return (
{t('模型价格')}:{displayVal}
);
}
},
};
const columns = [...baseColumns];
if (showRatio) {
columns.push(ratioColumn);
}
columns.push(priceColumn);
columns.push(endpointColumn);
return columns;
};