/** * @license * Copyright 2025 Qwen Team * SPDX-License-Identifier: Apache-2.0 */ import type React from 'react'; import { useMemo, useState } from 'react'; import { Box, Text } from 'ink'; import Link from 'ink-link'; import { AuthType } from '@qwen-code/qwen-code-core'; import { useConfig } from '../../contexts/ConfigContext.js'; import { theme } from '../../semantic-colors.js'; import { useKeypress } from '../../hooks/useKeypress.js'; import { MultiSelect } from '../shared/MultiSelect.js'; import { t } from '../../../i18n/index.js'; interface ArenaStartDialogProps { onClose: () => void; onConfirm: (selectedModels: string[]) => void; } const MODEL_PROVIDERS_DOCUMENTATION_URL = 'https://qwenlm.github.io/qwen-code-docs/en/users/configuration/settings/#modelproviders'; export function ArenaStartDialog({ onClose, onConfirm, }: ArenaStartDialogProps): React.JSX.Element { const config = useConfig(); const [errorMessage, setErrorMessage] = useState(null); const modelItems = useMemo(() => { const allModels = config.getAllConfiguredModels(); const selectableModels = allModels.filter((model) => !model.isRuntimeModel); return selectableModels.map((model) => { const token = `${model.authType}:${model.id}`; const isQwenOauth = model.authType === AuthType.QWEN_OAUTH; return { key: token, value: token, label: `[${model.authType}] ${model.label}`, disabled: isQwenOauth, }; }); }, [config]); const hasDisabledQwenOauth = modelItems.some((item) => item.disabled); const selectableModelCount = modelItems.filter( (item) => !item.disabled, ).length; const needsMoreModels = selectableModelCount < 2; const shouldShowMoreModelsHint = selectableModelCount >= 2 && selectableModelCount < 3; useKeypress( (key) => { if (key.name === 'escape') { onClose(); } }, { isActive: true }, ); const handleConfirm = (values: string[]) => { if (values.length < 2) { setErrorMessage( t('Please select at least 2 models to start an Arena session.'), ); return; } setErrorMessage(null); onConfirm(values); }; return ( {t('Select Models')} {modelItems.length === 0 ? ( {t('No models available. Please configure models first.')} ) : ( )} {errorMessage && ( {errorMessage} )} {(hasDisabledQwenOauth || needsMoreModels) && ( {hasDisabledQwenOauth && ( {t('Note: qwen-oauth models are not supported in Arena.')} )} {needsMoreModels && ( <> {t('Arena requires at least 2 models. To add more:')} {t( ' - Run /auth to set up a Coding Plan (includes multiple models)', )} {t(' - Or configure modelProviders in settings.json')} )} )} {shouldShowMoreModelsHint && ( <> {t('Configure more models with the modelProviders guide:')} {MODEL_PROVIDERS_DOCUMENTATION_URL} )} {t('Space to toggle, Enter to confirm, Esc to cancel')} ); }