import { getLLMProviderAccountConfig } from '@/core/llm-manager/llm-provider-account-configs' import { SetupUI, setupConsola } from './setup-ui' const REMOTE_LLM_PROVIDERS = [ { ...getRequiredProviderAccountConfig('openrouter'), models: [ { label: 'openai/gpt-5.6-sol (Recommended)', value: 'openai/gpt-5.6-sol' }, { label: 'openai/gpt-5.6-terra', value: 'openai/gpt-5.6-terra' }, { label: 'openai/gpt-5.6-luna', value: 'openai/gpt-5.6-luna' }, { label: 'openai/gpt-5.5', value: 'openai/gpt-5.5' }, { label: 'openai/gpt-5.4', value: 'openai/gpt-5.4' }, { label: 'openai/gpt-5.4-mini', value: 'openai/gpt-5.4-mini' }, { label: 'anthropic/claude-fable-5', value: 'anthropic/claude-fable-5' }, { label: 'anthropic/claude-opus-4.8', value: 'anthropic/claude-opus-4.8' }, { label: 'anthropic/claude-opus-4.7', value: 'anthropic/claude-opus-4.7' }, { label: 'anthropic/claude-opus-4.6', value: 'anthropic/claude-opus-4.6' }, { label: 'anthropic/claude-sonnet-4.6', value: 'anthropic/claude-sonnet-4.6' }, { label: 'xiaomi/mimo-v2.5-pro', value: 'xiaomi/mimo-v2.5-pro' }, { label: 'z-ai/glm-5.2', value: 'z-ai/glm-5.2' }, { label: 'z-ai/glm-5.1', value: 'z-ai/glm-5.1' }, { label: 'z-ai/glm-5-turbo', value: 'z-ai/glm-5-turbo' }, { label: 'moonshotai/kimi-k2.6', value: 'moonshotai/kimi-k2.6' }, { label: 'minimax/minimax-m3', value: 'minimax/minimax-m3' } ] }, { ...getRequiredProviderAccountConfig('openai'), models: [ { label: 'GPT-5.6 Sol (Recommended)', value: 'gpt-5.6-sol' }, { label: 'GPT-5.6 Terra', value: 'gpt-5.6-terra' }, { label: 'GPT-5.6 Luna', value: 'gpt-5.6-luna' }, { label: 'GPT-5.5', value: 'gpt-5.5' }, { label: 'GPT-5.4', value: 'gpt-5.4' }, { label: 'GPT-5.4 mini', value: 'gpt-5.4-mini' }, { label: 'GPT-5.4 nano', value: 'gpt-5.4-nano' } ] }, { ...getRequiredProviderAccountConfig('anthropic'), models: [ { label: 'Claude Opus 4.8 (Recommended)', value: 'claude-opus-4-8' }, { label: 'Claude Fable 5', value: 'claude-fable-5' }, { label: 'Claude Opus 4.7', value: 'claude-opus-4-7' }, { label: 'Claude Opus 4.6', value: 'claude-opus-4-6' }, { label: 'Claude Sonnet 4.6', value: 'claude-sonnet-4-6' }, { label: 'Claude Haiku 4.5', value: 'claude-haiku-4-5' } ] }, { ...getRequiredProviderAccountConfig('zai'), models: [ { label: 'GLM-5.2 (Recommended)', value: 'glm-5.2' }, { label: 'GLM-5.1', value: 'glm-5.1' }, { label: 'GLM-5-Turbo', value: 'glm-5-turbo' }, { label: 'GLM-5', value: 'glm-5' } ] }, { ...getRequiredProviderAccountConfig('minimax'), models: [ { label: 'MiniMax-M3 (Recommended)', value: 'MiniMax-M3' }, { label: 'MiniMax-M2.7', value: 'MiniMax-M2.7' } ] }, { ...getRequiredProviderAccountConfig('moonshotai'), models: [ { label: 'Kimi K2.6', value: 'kimi-k2.6' }, { label: 'Kimi K2.5', value: 'kimi-k2.5' } ] } ] function getRequiredProviderAccountConfig(providerValue) { const providerAccountConfig = getLLMProviderAccountConfig(providerValue) if (!providerAccountConfig || !providerAccountConfig.apiKeyURL) { throw new Error( `Missing provider account configuration for "${providerValue}".` ) } return providerAccountConfig } function getProviderOptions() { return REMOTE_LLM_PROVIDERS.map((provider) => ({ label: provider.label, value: provider.value })) } function getProviderConfig(providerValue) { return REMOTE_LLM_PROVIDERS.find( (provider) => provider.value === providerValue ) } /** * Ask for a remote LLM provider, model, and API key when local AI is skipped. */ export default async function setupRemoteLLM() { SetupUI.info( 'No problem. I can use an online AI service instead.' ) SetupUI.info( 'I just need 3 quick details so I can connect it for you.' ) const providerValue = await setupConsola.prompt( 'Which online AI service should I use?', { type: 'select', initial: REMOTE_LLM_PROVIDERS[0].value, options: getProviderOptions(), cancel: 'default' } ) const provider = getProviderConfig(providerValue) if (!provider) { throw new Error(`Unsupported remote LLM provider "${providerValue}".`) } const modelValue = await setupConsola.prompt( `Which model should I use with ${provider.label}?`, { type: 'select', initial: provider.models[0].value, options: provider.models, cancel: 'default' } ) SetupUI.info( `Create your API key here: ${SetupUI.underlined(provider.apiKeyURL)}` ) const apiKey = await setupConsola.prompt( `Paste your ${provider.label} API key. I will save it in your local .env file.`, { type: 'text', placeholder: 'Paste API key here', validate(value) { if (!value || value.trim() === '') { return 'Please paste your API key.' } }, cancel: 'default' } ) return { remoteLLMProvider: provider.value, remoteLLMModel: modelValue, remoteLLMAPIKeyEnv: provider.apiKeyEnv, remoteLLMAPIKey: apiKey } }