Browse Source

feat(channel-pricing): 前端支持缓存/图片/音频倍率编辑和展示

- ChannelPricingView.jsx: initValues 添加 5 个高级比例字段 + 按量计费模式下新增高级比例表单区块
- ChannelPricingCard.jsx: tableData 映射 cache_ratio/cache_creation_ratio + 条件列展示

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
master
fengsilin 3 weeks ago
parent
commit
129e17ac42
2 changed files with 36 additions and 1 deletions
  1. +23
    -1
      web/src/components/table/model-pricing/modal/components/ChannelPricingCard.jsx
  2. +13
    -0
      web/src/pages/Setting/Ratio/ChannelPricingView.jsx

+ 23
- 1
web/src/components/table/model-pricing/modal/components/ChannelPricingCard.jsx View File

@@ -112,6 +112,8 @@ const ChannelPricingCard = ({
completionRatio: item.completion_ratio,
modelPrice: item.model_price,
hasCustomPricing: item.has_custom_pricing,
cacheRatio: item.cache_ratio,
cacheCreationRatio: item.cache_creation_ratio,
}));

// 判断是否存在按次计费的渠道
@@ -205,6 +207,26 @@ const ChannelPricingCard = ({
]
: [];

// 判断是否存在高级比例数据
const hasAdvancedPricing = tableData.some(
(item) => item.cacheRatio > 0 || item.cacheCreationRatio > 0
);

const advancedColumns = hasAdvancedPricing
? [
{
title: t('缓存读取'),
dataIndex: 'cacheRatio',
render: (v) => (v > 0 ? v : '-'),
},
{
title: t('缓存创建'),
dataIndex: 'cacheCreationRatio',
render: (v) => (v > 0 ? v : '-'),
},
]
: [];

// 只有存在按次计费的渠道时才显示固定价格列
const callBasedColumn = hasCallBased
? [
@@ -226,7 +248,7 @@ const ChannelPricingCard = ({
]
: [];

const columns = [...baseColumns, ...tokenBasedColumns, ...callBasedColumn];
const columns = [...baseColumns, ...tokenBasedColumns, ...advancedColumns, ...callBasedColumn];

return (
<Card className='!rounded-2xl shadow-sm border-0 mb-6'>


+ 13
- 0
web/src/pages/Setting/Ratio/ChannelPricingView.jsx View File

@@ -490,6 +490,11 @@ const ChannelPricingView = ({ channels, channelPricings, tags, onRefresh }) => {
completion_ratio: editingRecord?.pricing?.completion_ratio ?? 0,
model_price: editingRecord?.pricing?.model_price ?? 0,
tag_ids: getInitialTagIds(editingRecord?.pricing),
cache_ratio: editingRecord?.pricing?.cache_ratio ?? 0,
cache_creation_ratio: editingRecord?.pricing?.cache_creation_ratio ?? 0,
image_ratio: editingRecord?.pricing?.image_ratio ?? 0,
audio_ratio: editingRecord?.pricing?.audio_ratio ?? 0,
audio_completion_ratio: editingRecord?.pricing?.audio_completion_ratio ?? 0,
}}
>
<Form.Input
@@ -576,6 +581,14 @@ const ChannelPricingView = ({ channels, channelPricings, tags, onRefresh }) => {
initValue={tokenPrices.outputTokenPrice}
/>
</div>

<Form.Section text={t('高级比例(留空使用全局默认值)')}>
<Form.InputNumber field="cache_ratio" label={t('缓存读取倍率')} min={0} step={0.01} placeholder={t('全局默认值')} />
<Form.InputNumber field="cache_creation_ratio" label={t('缓存创建倍率(5分钟)')} min={0} step={0.01} placeholder={t('全局默认值(1小时自动按 1.6x 计算)')} />
<Form.InputNumber field="image_ratio" label={t('图片倍率')} min={0} step={0.01} placeholder={t('全局默认值')} />
<Form.InputNumber field="audio_ratio" label={t('音频输入倍率')} min={0} step={0.01} placeholder={t('全局默认值')} />
<Form.InputNumber field="audio_completion_ratio" label={t('音频输出倍率')} min={0} step={0.01} placeholder={t('全局默认值')} />
</Form.Section>
</>
)}
{currentQuotaType === 1 && (


Loading…
Cancel
Save