From fbeaf1395e161b49f822d1d06feba6cfcb647921 Mon Sep 17 00:00:00 2001 From: y574444354 <574444354@qq.com> Date: Thu, 16 Apr 2026 19:12:01 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=20CoStrict=20provider?= =?UTF-8?q?=20=E6=A8=A1=E5=9E=8B=E9=80=89=E6=8B=A9=E4=B8=8E=20token=20?= =?UTF-8?q?=E4=BC=B0=E7=AE=97=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - ConsoleOAuthFlow: 替换 ModelPicker 为直接 Select 组件,避免 getAPIProvider() 竞态导致显示标准 Anthropic 模型列表 - modelOptions: 简化模型选项逻辑,CoStrict 凭证持有者统一走 CoStrict 模型缓存路径,加载中显示提示而非标准模型列表 - provider/index: 回写 usage 和 stop_reason 到已 yield 的 assistant messages,与 Anthropic 原生路径保持一致 - tokenEstimation: 非 Anthropic 原生 provider(costrict/openai/ grok/gemini)统一使用粗略 token 估算 - 品牌文案: Claude → CoStrict 相关措辞修正 --- src/components/ConsoleOAuthFlow.tsx | 55 +++++++++++++------- src/components/ModelPicker.tsx | 2 +- src/constants/prompts.ts | 2 +- src/costrict/provider/index.ts | 18 +++++++ src/services/tokenEstimation.ts | 16 +++++- src/utils/betas.ts | 2 +- src/utils/model/modelOptions.ts | 80 ++++------------------------- 7 files changed, 81 insertions(+), 94 deletions(-) diff --git a/src/components/ConsoleOAuthFlow.tsx b/src/components/ConsoleOAuthFlow.tsx index 73ba8d0a5..d66cc58f7 100644 --- a/src/components/ConsoleOAuthFlow.tsx +++ b/src/components/ConsoleOAuthFlow.tsx @@ -17,7 +17,6 @@ import { getSettings_DEPRECATED, updateSettingsForSource } from '../utils/settin import { Select } from './CustomSelect/select.js'; import { Spinner } from './Spinner.js'; import TextInput from './TextInput.js'; -import { ModelPicker } from './ModelPicker.js'; import { useSetAppState } from '../state/AppState.js'; type Props = { @@ -1260,25 +1259,43 @@ function OAuthStatusMessage({ case 'costrict_model_select': { const sortedModels = [...oauthStatus.models].sort((a, b) => a.id.localeCompare(b.id)); + // 直接使用已获取的模型列表渲染选项,避免通用 ModelPicker 因 getAPIProvider() 竞态 + // 导致显示标准 Anthropic 模型列表而非 CoStrict 动态模型 + const costrictOptions = sortedModels.map(m => ({ + value: m.id, + label: m.name ?? m.id, + description: + m.id === 'Auto' + ? `${Math.round(((m as any).creditDiscount ?? 0) * 100)}% discount` + : `${(m as any).creditConsumption ?? '?'}x credit`, + })); return ( - { - const selected = model ?? sortedModels[0]?.id ?? ''; - process.env.COSTRICT_MODEL = selected; - setAppState(prev => ({ ...prev, mainLoopModel: selected, mainLoopModelForSession: null })); - setOAuthStatus({ state: 'success' }); - void onDone(); - }} - onCancel={() => { - const selected = sortedModels[0]?.id ?? ''; - process.env.COSTRICT_MODEL = selected; - setAppState(prev => ({ ...prev, mainLoopModel: selected, mainLoopModelForSession: null })); - setOAuthStatus({ state: 'success' }); - void onDone(); - }} - /> + + + + Select model + + Login successful. Select a CoStrict model to use: + + +