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
This commit is contained in:
CaIon
2026-04-24 00:33:41 +08:00
parent 6bde1a9c8d
commit 8eeae00737
2 changed files with 17 additions and 35 deletions
+10 -28
View File
@@ -1643,7 +1643,7 @@ export function renderModelPrice(opts) {
completion_tokens: completionTokens = 0, completion_tokens: completionTokens = 0,
model_ratio: modelRatio = 0, model_ratio: modelRatio = 0,
model_price: modelPrice = -1, model_price: modelPrice = -1,
completion_ratio: completionRatio, completion_ratio: _completionRatio,
group_ratio: _groupRatio, group_ratio: _groupRatio,
user_group_ratio, user_group_ratio,
cache_tokens: cacheTokens = 0, cache_tokens: cacheTokens = 0,
@@ -1669,6 +1669,7 @@ export function renderModelPrice(opts) {
user_group_ratio, user_group_ratio,
); );
let groupRatio = effectiveGroupRatio; let groupRatio = effectiveGroupRatio;
const completionRatio = _completionRatio ?? 0;
const { symbol, rate } = getCurrencyConfig(); const { symbol, rate } = getCurrencyConfig();
@@ -1695,9 +1696,6 @@ export function renderModelPrice(opts) {
]); ]);
} }
if (completionRatio === undefined) {
completionRatio = 0;
}
const inputRatioPrice = modelRatio * 2.0; const inputRatioPrice = modelRatio * 2.0;
const completionRatioPrice = modelRatio * 2.0 * completionRatio; const completionRatioPrice = modelRatio * 2.0 * completionRatio;
const cacheRatioPrice = modelRatio * 2.0 * cacheRatio; const cacheRatioPrice = modelRatio * 2.0 * cacheRatio;
@@ -1908,10 +1906,6 @@ export function renderModelPrice(opts) {
); );
} }
if (completionRatio === undefined) {
completionRatio = 0;
}
const modelRatioValue = formatRatioValue(modelRatio); const modelRatioValue = formatRatioValue(modelRatio);
const completionRatioValue = formatRatioValue(completionRatio); const completionRatioValue = formatRatioValue(completionRatio);
const cacheRatioValue = formatRatioValue(cacheRatio); const cacheRatioValue = formatRatioValue(cacheRatio);
@@ -2408,11 +2402,11 @@ export function renderAudioModelPrice(opts) {
completion_tokens: completionTokens = 0, completion_tokens: completionTokens = 0,
model_ratio: modelRatio = 0, model_ratio: modelRatio = 0,
model_price: modelPrice = -1, model_price: modelPrice = -1,
completion_ratio: completionRatio, completion_ratio: _completionRatio,
audio_input: audioInputTokens = 0, audio_input: audioInputTokens = 0,
audio_output: audioCompletionTokens = 0, audio_output: audioCompletionTokens = 0,
audio_ratio: audioRatio, audio_ratio: _audioRatio,
audio_completion_ratio: audioCompletionRatio, audio_completion_ratio: _audioCompletionRatio,
group_ratio: _groupRatio, group_ratio: _groupRatio,
user_group_ratio, user_group_ratio,
cache_tokens: cacheTokens = 0, cache_tokens: cacheTokens = 0,
@@ -2424,6 +2418,9 @@ export function renderAudioModelPrice(opts) {
user_group_ratio, user_group_ratio,
); );
let groupRatio = effectiveGroupRatio; let groupRatio = effectiveGroupRatio;
const completionRatio = _completionRatio ?? 0;
const audioRatio = parseFloat(_audioRatio ?? 0).toFixed(6);
const audioCompletionRatio = _audioCompletionRatio ?? 0;
// 获取货币配置 // 获取货币配置
const { symbol, rate } = getCurrencyConfig(); 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 inputRatioPrice = modelRatio * 2.0;
const completionRatioPrice = modelRatio * 2.0 * completionRatio; const completionRatioPrice = modelRatio * 2.0 * completionRatio;
const textPrice = const textPrice =
@@ -2541,10 +2534,6 @@ export function renderAudioModelPrice(opts) {
); );
} }
if (completionRatio === undefined) {
completionRatio = 0;
}
const modelRatioValue = formatRatioValue(modelRatio); const modelRatioValue = formatRatioValue(modelRatio);
const completionRatioValue = formatRatioValue(completionRatio); const completionRatioValue = formatRatioValue(completionRatio);
const cacheRatioValue = formatRatioValue(cacheRatio); const cacheRatioValue = formatRatioValue(cacheRatio);
@@ -2695,7 +2684,7 @@ export function renderClaudeModelPrice(opts) {
completion_tokens: completionTokens = 0, completion_tokens: completionTokens = 0,
model_ratio: modelRatio = 0, model_ratio: modelRatio = 0,
model_price: modelPrice = -1, model_price: modelPrice = -1,
completion_ratio: completionRatio, completion_ratio: _completionRatio,
group_ratio: _groupRatio, group_ratio: _groupRatio,
user_group_ratio, user_group_ratio,
cache_tokens: cacheTokens = 0, cache_tokens: cacheTokens = 0,
@@ -2713,6 +2702,7 @@ export function renderClaudeModelPrice(opts) {
user_group_ratio, user_group_ratio,
); );
let groupRatio = effectiveGroupRatio; let groupRatio = effectiveGroupRatio;
const completionRatio = _completionRatio ?? 0;
// 获取货币配置 // 获取货币配置
const { symbol, rate } = getCurrencyConfig(); const { symbol, rate } = getCurrencyConfig();
@@ -2739,10 +2729,6 @@ export function renderClaudeModelPrice(opts) {
]); ]);
} }
if (completionRatio === undefined) {
completionRatio = 0;
}
const inputRatioPrice = modelRatio * 2.0; const inputRatioPrice = modelRatio * 2.0;
const completionRatioPrice = modelRatio * 2.0 * completionRatio; const completionRatioPrice = modelRatio * 2.0 * completionRatio;
const cacheRatioPrice = modelRatio * 2.0 * cacheRatio; const cacheRatioPrice = modelRatio * 2.0 * cacheRatio;
@@ -2926,10 +2912,6 @@ export function renderClaudeModelPrice(opts) {
); );
} }
if (completionRatio === undefined) {
completionRatio = 0;
}
const modelRatioValue = formatRatioValue(modelRatio); const modelRatioValue = formatRatioValue(modelRatio);
const completionRatioValue = formatRatioValue(completionRatio); const completionRatioValue = formatRatioValue(completionRatio);
const cacheRatioValue = formatRatioValue(cacheRatio); const cacheRatioValue = formatRatioValue(cacheRatio);
@@ -49,6 +49,7 @@ import {
MATCH_EXISTS, MATCH_EXISTS,
MATCH_CONTAINS, MATCH_CONTAINS,
MATCH_RANGE, MATCH_RANGE,
MATCH_GTE,
SOURCE_HEADER, SOURCE_HEADER,
SOURCE_PARAM, SOURCE_PARAM,
SOURCE_TIME, SOURCE_TIME,
@@ -164,7 +165,12 @@ function generateExprFromVisualConfig(config) {
if (tiers.length === 1) { if (tiers.length === 1) {
const t = tiers[0]; const t = tiers[0];
const label = t.label || 'default'; 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 = []; const parts = [];
@@ -885,12 +891,6 @@ function RawExprEditor({ exprString, onChange, t }) {
<code>abs(x)</code>, <code>header(name)</code>,{' '} <code>abs(x)</code>, <code>header(name)</code>,{' '}
<code>param(path)</code>, <code>has(source, text)</code> <code>param(path)</code>, <code>has(source, text)</code>
</div> </div>
<div>
{t('也支持更好懂的别名')}: <code>prompt_tokens</code>,{' '}
<code>completion_tokens</code>, <code>cache_read_tokens</code>,{' '}
<code>cache_create_tokens</code>,{' '}
<code>cache_create_1h_tokens</code>
</div>
</div> </div>
} }
style={{ marginBottom: 12 }} style={{ marginBottom: 12 }}