|
|
@@ -953,6 +953,71 @@ function getEffectiveRatio(groupRatio, user_group_ratio) {
|
|
|
};
|
|
|
}
|
|
|
|
|
|
+// Shared core for simple price rendering (used by OpenAI-like and Claude-like variants)
|
|
|
+function renderPriceSimpleCore({
|
|
|
+ modelRatio,
|
|
|
+ modelPrice = -1,
|
|
|
+ groupRatio,
|
|
|
+ user_group_ratio,
|
|
|
+ cacheTokens = 0,
|
|
|
+ cacheRatio = 1.0,
|
|
|
+ cacheCreationTokens = 0,
|
|
|
+ cacheCreationRatio = 1.0,
|
|
|
+ image = false,
|
|
|
+ imageRatio = 1.0,
|
|
|
+ isSystemPromptOverride = false
|
|
|
+}) {
|
|
|
+ const { ratio: effectiveGroupRatio, label: ratioLabel } = getEffectiveRatio(
|
|
|
+ groupRatio,
|
|
|
+ user_group_ratio,
|
|
|
+ );
|
|
|
+ const finalGroupRatio = effectiveGroupRatio;
|
|
|
+
|
|
|
+ if (modelPrice !== -1) {
|
|
|
+ return i18next.t('价格:${{price}} * {{ratioType}}:{{ratio}}', {
|
|
|
+ price: modelPrice,
|
|
|
+ ratioType: ratioLabel,
|
|
|
+ ratio: finalGroupRatio,
|
|
|
+ });
|
|
|
+ }
|
|
|
+
|
|
|
+ const parts = [];
|
|
|
+ // base: model ratio
|
|
|
+ parts.push(i18next.t('模型: {{ratio}}'));
|
|
|
+
|
|
|
+ // cache part (label differs when with image)
|
|
|
+ if (cacheTokens !== 0) {
|
|
|
+ parts.push(i18next.t('缓存: {{cacheRatio}}'));
|
|
|
+ }
|
|
|
+
|
|
|
+ // cache creation part (Claude specific if passed)
|
|
|
+ if (cacheCreationTokens !== 0) {
|
|
|
+ parts.push(i18next.t('缓存创建: {{cacheCreationRatio}}'));
|
|
|
+ }
|
|
|
+
|
|
|
+ // image part
|
|
|
+ if (image) {
|
|
|
+ parts.push(i18next.t('图片输入: {{imageRatio}}'));
|
|
|
+ }
|
|
|
+
|
|
|
+ parts.push(`{{ratioType}}: {{groupRatio}}`);
|
|
|
+
|
|
|
+ let result = i18next.t(parts.join(' * '), {
|
|
|
+ ratio: modelRatio,
|
|
|
+ ratioType: ratioLabel,
|
|
|
+ groupRatio: finalGroupRatio,
|
|
|
+ cacheRatio: cacheRatio,
|
|
|
+ cacheCreationRatio: cacheCreationRatio,
|
|
|
+ imageRatio: imageRatio,
|
|
|
+ })
|
|
|
+
|
|
|
+ if (isSystemPromptOverride) {
|
|
|
+ result += '\n\r' + i18next.t('系统提示覆盖');
|
|
|
+ }
|
|
|
+
|
|
|
+ return result;
|
|
|
+}
|
|
|
+
|
|
|
export function renderModelPrice(
|
|
|
inputTokens,
|
|
|
completionTokens,
|
|
|
@@ -1245,56 +1310,26 @@ export function renderModelPriceSimple(
|
|
|
user_group_ratio,
|
|
|
cacheTokens = 0,
|
|
|
cacheRatio = 1.0,
|
|
|
+ cacheCreationTokens = 0,
|
|
|
+ cacheCreationRatio = 1.0,
|
|
|
image = false,
|
|
|
imageRatio = 1.0,
|
|
|
+ isSystemPromptOverride = false,
|
|
|
+ provider = 'openai',
|
|
|
) {
|
|
|
- const { ratio: effectiveGroupRatio, label: ratioLabel } = getEffectiveRatio(groupRatio, user_group_ratio);
|
|
|
- groupRatio = effectiveGroupRatio;
|
|
|
- if (modelPrice !== -1) {
|
|
|
- return i18next.t('价格:${{price}} * {{ratioType}}:{{ratio}}', {
|
|
|
- price: modelPrice,
|
|
|
- ratioType: ratioLabel,
|
|
|
- ratio: groupRatio,
|
|
|
- });
|
|
|
- } else {
|
|
|
- if (image && cacheTokens !== 0) {
|
|
|
- return i18next.t(
|
|
|
- '模型: {{ratio}} * {{ratioType}}: {{groupRatio}} * 缓存倍率: {{cacheRatio}} * 图片输入倍率: {{imageRatio}}',
|
|
|
- {
|
|
|
- ratio: modelRatio,
|
|
|
- ratioType: ratioLabel,
|
|
|
- groupRatio: groupRatio,
|
|
|
- cacheRatio: cacheRatio,
|
|
|
- imageRatio: imageRatio,
|
|
|
- },
|
|
|
- );
|
|
|
- } else if (image) {
|
|
|
- return i18next.t(
|
|
|
- '模型: {{ratio}} * {{ratioType}}: {{groupRatio}} * 图片输入倍率: {{imageRatio}}',
|
|
|
- {
|
|
|
- ratio: modelRatio,
|
|
|
- ratioType: ratioLabel,
|
|
|
- groupRatio: groupRatio,
|
|
|
- imageRatio: imageRatio,
|
|
|
- },
|
|
|
- );
|
|
|
- } else if (cacheTokens !== 0) {
|
|
|
- return i18next.t(
|
|
|
- '模型: {{ratio}} * 分组: {{groupRatio}} * 缓存: {{cacheRatio}}',
|
|
|
- {
|
|
|
- ratio: modelRatio,
|
|
|
- groupRatio: groupRatio,
|
|
|
- cacheRatio: cacheRatio,
|
|
|
- },
|
|
|
- );
|
|
|
- } else {
|
|
|
- return i18next.t('模型: {{ratio}} * {{ratioType}}:{{groupRatio}}', {
|
|
|
- ratio: modelRatio,
|
|
|
- ratioType: ratioLabel,
|
|
|
- groupRatio: groupRatio,
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
+ return renderPriceSimpleCore({
|
|
|
+ modelRatio,
|
|
|
+ modelPrice,
|
|
|
+ groupRatio,
|
|
|
+ user_group_ratio,
|
|
|
+ cacheTokens,
|
|
|
+ cacheRatio,
|
|
|
+ cacheCreationTokens,
|
|
|
+ cacheCreationRatio,
|
|
|
+ image,
|
|
|
+ imageRatio,
|
|
|
+ isSystemPromptOverride
|
|
|
+ });
|
|
|
}
|
|
|
|
|
|
export function renderAudioModelPrice(
|
|
|
@@ -1635,46 +1670,7 @@ export function renderClaudeLogContent(
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-export function renderClaudeModelPriceSimple(
|
|
|
- modelRatio,
|
|
|
- modelPrice = -1,
|
|
|
- groupRatio,
|
|
|
- user_group_ratio,
|
|
|
- cacheTokens = 0,
|
|
|
- cacheRatio = 1.0,
|
|
|
- cacheCreationTokens = 0,
|
|
|
- cacheCreationRatio = 1.0,
|
|
|
-) {
|
|
|
- const { ratio: effectiveGroupRatio, label: ratioLabel } = getEffectiveRatio(groupRatio, user_group_ratio);
|
|
|
- groupRatio = effectiveGroupRatio;
|
|
|
-
|
|
|
- if (modelPrice !== -1) {
|
|
|
- return i18next.t('价格:${{price}} * {{ratioType}}:{{ratio}}', {
|
|
|
- price: modelPrice,
|
|
|
- ratioType: ratioLabel,
|
|
|
- ratio: groupRatio,
|
|
|
- });
|
|
|
- } else {
|
|
|
- if (cacheTokens !== 0 || cacheCreationTokens !== 0) {
|
|
|
- return i18next.t(
|
|
|
- '模型: {{ratio}} * {{ratioType}}: {{groupRatio}} * 缓存: {{cacheRatio}}',
|
|
|
- {
|
|
|
- ratio: modelRatio,
|
|
|
- ratioType: ratioLabel,
|
|
|
- groupRatio: groupRatio,
|
|
|
- cacheRatio: cacheRatio,
|
|
|
- cacheCreationRatio: cacheCreationRatio,
|
|
|
- },
|
|
|
- );
|
|
|
- } else {
|
|
|
- return i18next.t('模型: {{ratio}} * {{ratioType}}: {{groupRatio}}', {
|
|
|
- ratio: modelRatio,
|
|
|
- ratioType: ratioLabel,
|
|
|
- groupRatio: groupRatio,
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
-}
|
|
|
+// 已统一至 renderModelPriceSimple,若仍有遗留引用,请改为传入 provider='claude'
|
|
|
|
|
|
/**
|
|
|
* rehype 插件:将段落等文本节点拆分为逐词 <span>,并添加淡入动画 class。
|