|
|
@@ -1017,7 +1017,7 @@ export function renderModelPrice(
|
|
|
cacheRatio = 1.0,
|
|
|
image = false,
|
|
|
imageRatio = 1.0,
|
|
|
- imageOutputTokens = 0,
|
|
|
+ imageInputTokens = 0,
|
|
|
webSearch = false,
|
|
|
webSearchCallCount = 0,
|
|
|
webSearchPrice = 0,
|
|
|
@@ -1027,6 +1027,8 @@ export function renderModelPrice(
|
|
|
audioInputSeperatePrice = false,
|
|
|
audioInputTokens = 0,
|
|
|
audioInputPrice = 0,
|
|
|
+ imageOutputTokens = 0,
|
|
|
+ imageOutputPrice = 0,
|
|
|
) {
|
|
|
const { ratio: effectiveGroupRatio, label: ratioLabel } = getEffectiveRatio(
|
|
|
groupRatio,
|
|
|
@@ -1057,9 +1059,9 @@ export function renderModelPrice(
|
|
|
let effectiveInputTokens =
|
|
|
inputTokens - cacheTokens + cacheTokens * cacheRatio;
|
|
|
// Handle image tokens if present
|
|
|
- if (image && imageOutputTokens > 0) {
|
|
|
+ if (image && imageInputTokens > 0) {
|
|
|
effectiveInputTokens =
|
|
|
- inputTokens - imageOutputTokens + imageOutputTokens * imageRatio;
|
|
|
+ inputTokens - imageInputTokens + imageInputTokens * imageRatio;
|
|
|
}
|
|
|
if (audioInputTokens > 0) {
|
|
|
effectiveInputTokens -= audioInputTokens;
|
|
|
@@ -1069,7 +1071,8 @@ export function renderModelPrice(
|
|
|
(audioInputTokens / 1000000) * audioInputPrice * groupRatio +
|
|
|
(completionTokens / 1000000) * completionRatioPrice * groupRatio +
|
|
|
(webSearchCallCount / 1000) * webSearchPrice * groupRatio +
|
|
|
- (fileSearchCallCount / 1000) * fileSearchPrice * groupRatio;
|
|
|
+ (fileSearchCallCount / 1000) * fileSearchPrice * groupRatio +
|
|
|
+ (imageOutputTokens / 1000000) * imageOutputPrice * groupRatio;
|
|
|
|
|
|
return (
|
|
|
<>
|
|
|
@@ -1104,7 +1107,7 @@ export function renderModelPrice(
|
|
|
)}
|
|
|
</p>
|
|
|
)}
|
|
|
- {image && imageOutputTokens > 0 && (
|
|
|
+ {image && imageInputTokens > 0 && (
|
|
|
<p>
|
|
|
{i18next.t(
|
|
|
'图片输入价格:${{price}} * {{ratio}} = ${{total}} / 1M tokens (图片倍率: {{imageRatio}})',
|
|
|
@@ -1131,17 +1134,26 @@ export function renderModelPrice(
|
|
|
})}
|
|
|
</p>
|
|
|
)}
|
|
|
+ {imageOutputPrice > 0 && imageOutputTokens > 0 && (
|
|
|
+ <p>
|
|
|
+ {i18next.t('图片输出价格:${{price}} * 分组倍率{{ratio}} = ${{total}} / 1M tokens', {
|
|
|
+ price: imageOutputPrice,
|
|
|
+ ratio: groupRatio,
|
|
|
+ total: imageOutputPrice * groupRatio,
|
|
|
+ })}
|
|
|
+ </p>
|
|
|
+ )}
|
|
|
<p></p>
|
|
|
<p>
|
|
|
{(() => {
|
|
|
// 构建输入部分描述
|
|
|
let inputDesc = '';
|
|
|
- if (image && imageOutputTokens > 0) {
|
|
|
+ if (image && imageInputTokens > 0) {
|
|
|
inputDesc = i18next.t(
|
|
|
'(输入 {{nonImageInput}} tokens + 图片输入 {{imageInput}} tokens * {{imageRatio}} / 1M tokens * ${{price}}',
|
|
|
{
|
|
|
- nonImageInput: inputTokens - imageOutputTokens,
|
|
|
- imageInput: imageOutputTokens,
|
|
|
+ nonImageInput: inputTokens - imageInputTokens,
|
|
|
+ imageInput: imageInputTokens,
|
|
|
imageRatio: imageRatio,
|
|
|
price: inputRatioPrice,
|
|
|
},
|
|
|
@@ -1211,6 +1223,16 @@ export function renderModelPrice(
|
|
|
},
|
|
|
)
|
|
|
: '',
|
|
|
+ imageOutputPrice > 0 && imageOutputTokens > 0
|
|
|
+ ? i18next.t(
|
|
|
+ ' + 图片输出 {{tokenCounts}} tokens * ${{price}} / 1M tokens * 分组倍率{{ratio}}',
|
|
|
+ {
|
|
|
+ tokenCounts: imageOutputTokens,
|
|
|
+ price: imageOutputPrice,
|
|
|
+ ratio: groupRatio,
|
|
|
+ },
|
|
|
+ )
|
|
|
+ : '',
|
|
|
].join('');
|
|
|
|
|
|
return i18next.t(
|