Przeglądaj źródła

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
CaIon 2 tygodni temu
rodzic
commit
8eeae00737

+ 10 - 28
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);

+ 7 - 7
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 }) {
               <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 }}