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,
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);
@@ -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 }) {
<code>abs(x)</code>, <code>header(name)</code>,{' '}
<code>param(path)</code>, <code>has(source, text)</code>
</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>
}
style={{ marginBottom: 12 }}