diff --git a/web/src/components/trader/ModelConfigModal.tsx b/web/src/components/trader/ModelConfigModal.tsx index 6e8ea9f9..6759caad 100644 --- a/web/src/components/trader/ModelConfigModal.tsx +++ b/web/src/components/trader/ModelConfigModal.tsx @@ -4,11 +4,12 @@ import { Trash2, Brain, ExternalLink } from 'lucide-react' import type { AIModel } from '../../types' import type { Language } from '../../i18n/translations' import { t } from '../../i18n/translations' +import { api } from '../../lib/api' +import { getBeginnerWalletAddress } from '../../lib/onboarding' import { getModelIcon } from '../common/ModelIcons' import { ModelStepIndicator } from './ModelStepIndicator' import { ModelCard } from './ModelCard' import { - BLOCKRUN_MODELS, CLAW402_MODELS, AI_PROVIDER_CONFIG, DEFAULT_CLAW402_MODEL, @@ -50,6 +51,8 @@ export function ModelConfigModal({ const selectedModel = allModels?.find((m) => m.id === selectedModelId) || configuredModels?.find((m) => m.id === selectedModelId) + const configuredModel = + configuredModels?.find((m) => m.id === selectedModelId) || null useEffect(() => { if (editingModelId && selectedModel) { @@ -91,8 +94,6 @@ export function ModelConfigModal({ const configuredIds = new Set(configuredModels?.map((m) => m.id) || []) const isClaw402Selected = selectedModel?.provider === 'claw402' || selectedModel?.id === 'claw402' - const isBeginnerDefaultModel = - isClaw402Selected && getUserMode() === 'beginner' const stepLabels = [ t('modelConfig.selectModel', language), t( @@ -248,6 +249,14 @@ function ModelSelectionStep({ onSelectModel: (modelId: string) => void language: Language }) { + const [showOtherProviders, setShowOtherProviders] = useState(false) + const claw402Model = + availableModels.find((model) => model.provider === 'claw402') || null + const otherProviders = availableModels.filter( + (model) => + model.provider !== 'claw402' && !model.provider?.startsWith('blockrun') + ) + return (
@@ -255,12 +264,11 @@ function ModelSelectionStep({
{/* Claw402 Featured Card */} - {availableModels.some(m => m.provider === 'claw402') && ( + {claw402Model && ( @@ -876,9 +904,21 @@ function Claw402ConfigForm({ {/* New wallet backup warning */} {showNewWalletBackup && newWalletKey && ( -
-
- 🚨 {language === 'zh' ? '重要:请立即备份私钥!' : 'Important: Backup your private key NOW!'} +
+
+ 🚨{' '} + {language === 'zh' + ? '重要:请立即备份私钥!' + : 'Important: Backup your private key NOW!'}
{language === 'zh' @@ -886,7 +926,10 @@ function Claw402ConfigForm({ : 'This is your wallet private key. If lost, it cannot be recovered and all assets will be permanently lost. Copy and save it securely.'}
- + {newWalletKey}
-
-
✅ {language === 'zh' ? '建议保存到密码管理器(1Password / Bitwarden)' : 'Save to a password manager (1Password / Bitwarden)'}
-
✅ {language === 'zh' ? '或抄在纸上放安全的地方' : 'Or write it down and store it safely'}
-
❌ {language === 'zh' ? '不要截图发给别人' : 'Do NOT screenshot or share with anyone'}
+
+
+ ✅{' '} + {language === 'zh' + ? '建议保存到密码管理器(1Password / Bitwarden)' + : 'Save to a password manager (1Password / Bitwarden)'} +
+
+ ✅{' '} + {language === 'zh' + ? '或抄在纸上放安全的地方' + : 'Or write it down and store it safely'} +
+
+ ❌{' '} + {language === 'zh' + ? '不要截图发给别人' + : 'Do NOT screenshot or share with anyone'} +
)} @@ -1138,7 +1204,7 @@ function Claw402ConfigForm({ )} {/* Test Connection button */} - {isKeyValid && !validating && ( + {(isKeyValid || hasExistingWallet) && !validating && (
)} @@ -1372,10 +1443,10 @@ function StandardProviderConfigForm({ editingModelId && selectedModel.has_api_key ? '已保存,如需更换请重新输入' : selectedModel.provider === 'blockrun-base' - ? '0x... (EVM private key)' - : selectedModel.provider === 'blockrun-sol' - ? 'bs58 encoded key (Solana)' - : t('enterAPIKey', language) + ? '0x... (EVM private key)' + : selectedModel.provider === 'blockrun-sol' + ? 'bs58 encoded key (Solana)' + : t('enterAPIKey', language) } className="w-full px-4 py-3 rounded-xl" style={{ @@ -1388,80 +1459,84 @@ function StandardProviderConfigForm({
{/* Custom Base URL */} -
- - onBaseUrlChange(e.target.value)} - placeholder={t('customBaseURLPlaceholder', language)} - className="w-full px-4 py-3 rounded-xl" - style={{ - background: '#0B0E11', - border: '1px solid #2B3139', - color: '#EAECEF', - }} - /> -
- {t('leaveBlankForDefault', language)} + + + + {t('customBaseURL', language)} + + onBaseUrlChange(e.target.value)} + placeholder={t('customBaseURLPlaceholder', language)} + className="w-full px-4 py-3 rounded-xl" + style={{ + background: '#0B0E11', + border: '1px solid #2B3139', + color: '#EAECEF', + }} + /> +
+ {t('leaveBlankForDefault', language)} +
)} {/* Custom Model Name */} -
- - onModelNameChange(e.target.value)} - placeholder={t('customModelNamePlaceholder', language)} - className="w-full px-4 py-3 rounded-xl" - style={{ - background: '#0B0E11', - border: '1px solid #2B3139', - color: '#EAECEF', - }} - /> -
- {t('leaveBlankForDefaultModel', language)} + + + + {t('customModelName', language)} + + onModelNameChange(e.target.value)} + placeholder={t('customModelNamePlaceholder', language)} + className="w-full px-4 py-3 rounded-xl" + style={{ + background: '#0B0E11', + border: '1px solid #2B3139', + color: '#EAECEF', + }} + /> +
+ {t('leaveBlankForDefaultModel', language)} +
)}