From 8eeae00737e0b97090fd388985ec2d9bf7569dcd Mon Sep 17 00:00:00 2001 From: CaIon Date: Fri, 24 Apr 2026 00:33:41 +0800 Subject: [PATCH] fix: resolve runtime crashes in render.jsx and TieredPricingEditor.jsx - render.jsx: change const destructuring of completionRatio/audioRatio to use raw names with ?? 0 defaults, preventing "Assignment to constant variable" errors in renderModelPrice, renderAudioModelPrice, and renderClaudeModelPrice - TieredPricingEditor.jsx: add missing MATCH_GTE import, remove misleading alias help text, preserve conditions for single-tier configs --- web/src/helpers/render.jsx | 38 +++++-------------- .../Ratio/components/TieredPricingEditor.jsx | 14 +++---- 2 files changed, 17 insertions(+), 35 deletions(-) diff --git a/web/src/helpers/render.jsx b/web/src/helpers/render.jsx index 14ce0d3e..d7ba6546 100644 --- a/web/src/helpers/render.jsx +++ b/web/src/helpers/render.jsx @@ -1643,7 +1643,7 @@ export function renderModelPrice(opts) { completion_tokens: completionTokens = 0, model_ratio: modelRatio = 0, model_price: modelPrice = -1, - completion_ratio: completionRatio, + completion_ratio: _completionRatio, group_ratio: _groupRatio, user_group_ratio, cache_tokens: cacheTokens = 0, @@ -1669,6 +1669,7 @@ export function renderModelPrice(opts) { user_group_ratio, ); let groupRatio = effectiveGroupRatio; + const completionRatio = _completionRatio ?? 0; const { symbol, rate } = getCurrencyConfig(); @@ -1695,9 +1696,6 @@ export function renderModelPrice(opts) { ]); } - if (completionRatio === undefined) { - completionRatio = 0; - } const inputRatioPrice = modelRatio * 2.0; const completionRatioPrice = modelRatio * 2.0 * completionRatio; const cacheRatioPrice = modelRatio * 2.0 * cacheRatio; @@ -1908,10 +1906,6 @@ export function renderModelPrice(opts) { ); } - if (completionRatio === undefined) { - completionRatio = 0; - } - const modelRatioValue = formatRatioValue(modelRatio); const completionRatioValue = formatRatioValue(completionRatio); const cacheRatioValue = formatRatioValue(cacheRatio); @@ -2408,11 +2402,11 @@ export function renderAudioModelPrice(opts) { completion_tokens: completionTokens = 0, model_ratio: modelRatio = 0, model_price: modelPrice = -1, - completion_ratio: completionRatio, + completion_ratio: _completionRatio, audio_input: audioInputTokens = 0, audio_output: audioCompletionTokens = 0, - audio_ratio: audioRatio, - audio_completion_ratio: audioCompletionRatio, + audio_ratio: _audioRatio, + audio_completion_ratio: _audioCompletionRatio, group_ratio: _groupRatio, user_group_ratio, cache_tokens: cacheTokens = 0, @@ -2424,6 +2418,9 @@ export function renderAudioModelPrice(opts) { user_group_ratio, ); let groupRatio = effectiveGroupRatio; + const completionRatio = _completionRatio ?? 0; + const audioRatio = parseFloat(_audioRatio ?? 0).toFixed(6); + const audioCompletionRatio = _audioCompletionRatio ?? 0; // 获取货币配置 const { symbol, rate } = getCurrencyConfig(); @@ -2450,10 +2447,6 @@ export function renderAudioModelPrice(opts) { ]); } - if (completionRatio === undefined) { - completionRatio = 0; - } - audioRatio = parseFloat(audioRatio).toFixed(6); const inputRatioPrice = modelRatio * 2.0; const completionRatioPrice = modelRatio * 2.0 * completionRatio; const textPrice = @@ -2541,10 +2534,6 @@ export function renderAudioModelPrice(opts) { ); } - if (completionRatio === undefined) { - completionRatio = 0; - } - const modelRatioValue = formatRatioValue(modelRatio); const completionRatioValue = formatRatioValue(completionRatio); const cacheRatioValue = formatRatioValue(cacheRatio); @@ -2695,7 +2684,7 @@ export function renderClaudeModelPrice(opts) { completion_tokens: completionTokens = 0, model_ratio: modelRatio = 0, model_price: modelPrice = -1, - completion_ratio: completionRatio, + completion_ratio: _completionRatio, group_ratio: _groupRatio, user_group_ratio, cache_tokens: cacheTokens = 0, @@ -2713,6 +2702,7 @@ export function renderClaudeModelPrice(opts) { user_group_ratio, ); let groupRatio = effectiveGroupRatio; + const completionRatio = _completionRatio ?? 0; // 获取货币配置 const { symbol, rate } = getCurrencyConfig(); @@ -2739,10 +2729,6 @@ export function renderClaudeModelPrice(opts) { ]); } - if (completionRatio === undefined) { - completionRatio = 0; - } - const inputRatioPrice = modelRatio * 2.0; const completionRatioPrice = modelRatio * 2.0 * completionRatio; const cacheRatioPrice = modelRatio * 2.0 * cacheRatio; @@ -2926,10 +2912,6 @@ export function renderClaudeModelPrice(opts) { ); } - if (completionRatio === undefined) { - completionRatio = 0; - } - const modelRatioValue = formatRatioValue(modelRatio); const completionRatioValue = formatRatioValue(completionRatio); const cacheRatioValue = formatRatioValue(cacheRatio); diff --git a/web/src/pages/Setting/Ratio/components/TieredPricingEditor.jsx b/web/src/pages/Setting/Ratio/components/TieredPricingEditor.jsx index 3e3a59c4..ec06a340 100644 --- a/web/src/pages/Setting/Ratio/components/TieredPricingEditor.jsx +++ b/web/src/pages/Setting/Ratio/components/TieredPricingEditor.jsx @@ -49,6 +49,7 @@ import { MATCH_EXISTS, MATCH_CONTAINS, MATCH_RANGE, + MATCH_GTE, SOURCE_HEADER, SOURCE_PARAM, SOURCE_TIME, @@ -164,7 +165,12 @@ function generateExprFromVisualConfig(config) { if (tiers.length === 1) { const t = tiers[0]; const label = t.label || 'default'; - return `tier("${label}", ${buildTierBodyExpr(t)})`; + const body = `tier("${label}", ${buildTierBodyExpr(t)})`; + const cond = buildConditionStr(t.conditions); + if (cond) { + return `${cond} ? ${body} : p * 0 + c * 0`; + } + return body; } const parts = []; @@ -885,12 +891,6 @@ function RawExprEditor({ exprString, onChange, t }) { abs(x), header(name),{' '} param(path), has(source, text) -
- {t('也支持更好懂的别名')}: prompt_tokens,{' '} - completion_tokens, cache_read_tokens,{' '} - cache_create_tokens,{' '} - cache_create_1h_tokens -
} style={{ marginBottom: 12 }}