import React, { useContext, useEffect, useState } from 'react'; import { API, copy, showError, showSuccess } from '../helpers'; import { Banner, Layout, Modal, Table, Tag, Tooltip } from '@douyinfe/semi-ui'; import { stringToColor } from '../helpers/render.js'; import { UserContext } from '../context/User/index.js'; import Text from '@douyinfe/semi-ui/lib/es/typography/text'; function renderQuotaType(type) { // Ensure all cases are string literals by adding quotes. switch (type) { case 1: return ( 按次计费 ); case 0: return ( 按量计费 ); default: return ( 未知 ); } } function renderAvailable(available) { return available ? ( 可用 ) : ( 不可用 ); } const ModelPricing = () => { const columns = [ { title: '可用性', dataIndex: 'available', render: (text, record, index) => { return renderAvailable(text); }, }, { title: '提供者', dataIndex: 'owner_by', render: (text, record, index) => { return ( <> {text} ); }, }, { title: '模型名称', dataIndex: 'model_name', // 以finish_time作为dataIndex render: (text, record, index) => { return ( <> { copyText(text); }} > {text} ); }, }, { title: '计费类型', dataIndex: 'quota_type', render: (text, record, index) => { return renderQuotaType(parseInt(text)); }, }, { title: '模型倍率', dataIndex: 'model_ratio', render: (text, record, index) => { return
{record.quota_type === 0 ? text : 'N/A'}
; }, }, { title: '补全倍率', dataIndex: 'completion_ratio', render: (text, record, index) => { let ratio = parseFloat(text.toFixed(3)); return
{record.quota_type === 0 ? ratio : 'N/A'}
; }, }, { title: '模型价格', dataIndex: 'model_price', render: (text, record, index) => { let content = text; if (record.quota_type === 0) { let inputRatioPrice = record.model_ratio * 2.0 * record.group_ratio; let completionRatioPrice = record.model_ratio * record.completion_ratio * 2.0 * record.group_ratio; content = ( <> 提示 ${inputRatioPrice} / 1M tokens
补全 ${completionRatioPrice} / 1M tokens ); } else { let price = parseFloat(text) * record.group_ratio; content = <>模型价格:${price}; } return
{content}
; }, }, ]; const [models, setModels] = useState([]); const [loading, setLoading] = useState(true); const [userState, userDispatch] = useContext(UserContext); const [groupRatio, setGroupRatio] = useState(1); const setModelsFormat = (models, groupRatio) => { for (let i = 0; i < models.length; i++) { models[i].key = i; models[i].group_ratio = groupRatio; } // sort by quota_type models.sort((a, b) => { return a.quota_type - b.quota_type; }); // sort by owner_by, openai is max, other use localeCompare models.sort((a, b) => { if (a.owner_by === 'openai') { return -1; } else if (b.owner_by === 'openai') { return 1; } else { return a.owner_by.localeCompare(b.owner_by); } }); setModels(models); }; const loadPricing = async () => { setLoading(true); let url = ''; url = `/api/pricing`; const res = await API.get(url); const { success, message, data, group_ratio } = res.data; if (success) { setGroupRatio(group_ratio); setModelsFormat(data, group_ratio); } else { showError(message); } setLoading(false); }; const refresh = async () => { await loadPricing(); }; const copyText = async (text) => { if (await copy(text)) { showSuccess('已复制:' + text); } else { // setSearchKeyword(text); Modal.error({ title: '无法复制到剪贴板,请手动复制', content: text }); } }; useEffect(() => { refresh().then(); }, []); return ( <> {userState.user ? ( ) : ( )} ); }; export default ModelPricing;