diff --git a/scripts/setup_worker_model.ps1 b/scripts/setup_worker_model.ps1 index dfcbc211..4c1a07bb 100644 --- a/scripts/setup_worker_model.ps1 +++ b/scripts/setup_worker_model.ps1 @@ -299,6 +299,11 @@ $zaiKey = [System.Environment]::GetEnvironmentVariable("ZAI_API_KEY", "User") if (-not $zaiKey) { $zaiKey = $env:ZAI_API_KEY } if ($zaiKey) { $ZaiCredDetected = $true } +$MinimaxCredDetected = $false +$minimaxKey = [System.Environment]::GetEnvironmentVariable("MINIMAX_API_KEY", "User") +if (-not $minimaxKey) { $minimaxKey = $env:MINIMAX_API_KEY } +if ($minimaxKey) { $MinimaxCredDetected = $true } + $KimiCredDetected = $false $kimiConfigPath = Join-Path $env:USERPROFILE ".kimi\config.toml" if (Test-Path $kimiConfigPath) { $KimiCredDetected = $true } @@ -311,6 +316,14 @@ $hiveKey = [System.Environment]::GetEnvironmentVariable("HIVE_API_KEY", "User") if (-not $hiveKey) { $hiveKey = $env:HIVE_API_KEY } if ($hiveKey) { $HiveCredDetected = $true } +$AntigravityCredDetected = $false +# Check native Antigravity IDE (Windows) SQLite state DB +$antigravityVscdbPath = Join-Path $env:APPDATA "Antigravity\User\globalStorage\state.vscdb" +if (Test-Path $antigravityVscdbPath) { $AntigravityCredDetected = $true } +# Native OAuth credentials +$antigravityAccountsPath = Join-Path $env:USERPROFILE ".hive\antigravity-accounts.json" +if (Test-Path $antigravityAccountsPath) { $AntigravityCredDetected = $true } + # Detect API key providers $ProviderMenuEnvVars = @("ANTHROPIC_API_KEY", "OPENAI_API_KEY", "GEMINI_API_KEY", "GROQ_API_KEY", "CEREBRAS_API_KEY", "OPENROUTER_API_KEY") $ProviderMenuNames = @("Anthropic (Claude) - Recommended", "OpenAI (GPT)", "Google Gemini - Free tier available", "Groq - Fast, free tier", "Cerebras - Fast, free tier", "OpenRouter - Bring any OpenRouter model") @@ -339,7 +352,9 @@ if (Test-Path $HiveConfigFile) { $PrevEnvVar = if ($prevLlm.api_key_env_var) { $prevLlm.api_key_env_var } else { "" } if ($prevLlm.use_claude_code_subscription) { $PrevSubMode = "claude_code" } elseif ($prevLlm.use_codex_subscription) { $PrevSubMode = "codex" } + elseif ($prevLlm.use_antigravity_subscription) { $PrevSubMode = "antigravity" } elseif ($prevLlm.use_kimi_code_subscription) { $PrevSubMode = "kimi_code" } + elseif ($prevLlm.provider -eq "minimax" -or ($prevLlm.api_base -and $prevLlm.api_base -like "*api.minimax.io*")) { $PrevSubMode = "minimax_code" } elseif ($prevLlm.api_base -and $prevLlm.api_base -like "*api.z.ai*") { $PrevSubMode = "zai_code" } elseif ($prevLlm.api_base -and $prevLlm.api_base -like "*api.kimi.com*") { $PrevSubMode = "kimi_code" } elseif ($prevLlm.provider -eq "hive" -or ($prevLlm.api_base -and $prevLlm.api_base -like "*adenhq.com*")) { $PrevSubMode = "hive_llm" } @@ -352,11 +367,13 @@ $DefaultChoice = "" if ($PrevSubMode -or $PrevProvider) { $prevCredValid = $false switch ($PrevSubMode) { - "claude_code" { if ($ClaudeCredDetected) { $prevCredValid = $true } } - "zai_code" { if ($ZaiCredDetected) { $prevCredValid = $true } } - "codex" { if ($CodexCredDetected) { $prevCredValid = $true } } - "kimi_code" { if ($KimiCredDetected) { $prevCredValid = $true } } - "hive_llm" { if ($HiveCredDetected) { $prevCredValid = $true } } + "claude_code" { if ($ClaudeCredDetected) { $prevCredValid = $true } } + "zai_code" { if ($ZaiCredDetected) { $prevCredValid = $true } } + "codex" { if ($CodexCredDetected) { $prevCredValid = $true } } + "minimax_code" { if ($MinimaxCredDetected) { $prevCredValid = $true } } + "kimi_code" { if ($KimiCredDetected) { $prevCredValid = $true } } + "hive_llm" { if ($HiveCredDetected) { $prevCredValid = $true } } + "antigravity" { if ($AntigravityCredDetected) { $prevCredValid = $true } } default { if ($PrevEnvVar) { $envVal = [System.Environment]::GetEnvironmentVariable($PrevEnvVar, "Process") @@ -367,21 +384,25 @@ if ($PrevSubMode -or $PrevProvider) { } if ($prevCredValid) { switch ($PrevSubMode) { - "claude_code" { $DefaultChoice = "1" } - "zai_code" { $DefaultChoice = "2" } - "codex" { $DefaultChoice = "3" } - "kimi_code" { $DefaultChoice = "4" } - "hive_llm" { $DefaultChoice = "5" } + "claude_code" { $DefaultChoice = "1" } + "zai_code" { $DefaultChoice = "2" } + "codex" { $DefaultChoice = "3" } + "minimax_code" { $DefaultChoice = "4" } + "kimi_code" { $DefaultChoice = "5" } + "hive_llm" { $DefaultChoice = "6" } + "antigravity" { $DefaultChoice = "7" } } if (-not $DefaultChoice) { switch ($PrevProvider) { - "anthropic" { $DefaultChoice = "6" } - "openai" { $DefaultChoice = "7" } - "gemini" { $DefaultChoice = "8" } - "groq" { $DefaultChoice = "9" } - "cerebras" { $DefaultChoice = "10" } - "openrouter" { $DefaultChoice = "11" } - "kimi" { $DefaultChoice = "4" } + "anthropic" { $DefaultChoice = "8" } + "openai" { $DefaultChoice = "9" } + "gemini" { $DefaultChoice = "10" } + "groq" { $DefaultChoice = "11" } + "cerebras" { $DefaultChoice = "12" } + "openrouter" { $DefaultChoice = "13" } + "minimax" { $DefaultChoice = "4" } + "kimi" { $DefaultChoice = "5" } + "hive" { $DefaultChoice = "6" } } } } @@ -413,26 +434,40 @@ Write-Host ") OpenAI Codex Subscription " -NoNewline Write-Color -Text "(use your Codex/ChatGPT Plus plan)" -Color DarkGray -NoNewline if ($CodexCredDetected) { Write-Color -Text " (credential detected)" -Color Green } else { Write-Host "" } -# 4) Kimi Code +# 4) MiniMax Coding Key Write-Host " " -NoNewline Write-Color -Text "4" -Color Cyan -NoNewline +Write-Host ") MiniMax Coding Key " -NoNewline +Write-Color -Text "(use your MiniMax coding key)" -Color DarkGray -NoNewline +if ($MinimaxCredDetected) { Write-Color -Text " (credential detected)" -Color Green } else { Write-Host "" } + +# 5) Kimi Code +Write-Host " " -NoNewline +Write-Color -Text "5" -Color Cyan -NoNewline Write-Host ") Kimi Code Subscription " -NoNewline Write-Color -Text "(use your Kimi Code plan)" -Color DarkGray -NoNewline if ($KimiCredDetected) { Write-Color -Text " (credential detected)" -Color Green } else { Write-Host "" } -# 5) Hive LLM +# 6) Hive LLM Write-Host " " -NoNewline -Write-Color -Text "5" -Color Cyan -NoNewline +Write-Color -Text "6" -Color Cyan -NoNewline Write-Host ") Hive LLM " -NoNewline Write-Color -Text "(use your Hive API key)" -Color DarkGray -NoNewline if ($HiveCredDetected) { Write-Color -Text " (credential detected)" -Color Green } else { Write-Host "" } +# 7) Antigravity Subscription +Write-Host " " -NoNewline +Write-Color -Text "7" -Color Cyan -NoNewline +Write-Host ") Antigravity Subscription " -NoNewline +Write-Color -Text "(use your Google/Gemini plan)" -Color DarkGray -NoNewline +if ($AntigravityCredDetected) { Write-Color -Text " (credential detected)" -Color Green } else { Write-Host "" } + Write-Host "" Write-Color -Text " API key providers:" -Color Cyan -# 6-11) API key providers +# 8-13) API key providers for ($idx = 0; $idx -lt $ProviderMenuEnvVars.Count; $idx++) { - $num = $idx + 6 + $num = $idx + 8 $envVal = [System.Environment]::GetEnvironmentVariable($ProviderMenuEnvVars[$idx], "Process") if (-not $envVal) { $envVal = [System.Environment]::GetEnvironmentVariable($ProviderMenuEnvVars[$idx], "User") } Write-Host " " -NoNewline @@ -441,7 +476,7 @@ for ($idx = 0; $idx -lt $ProviderMenuEnvVars.Count; $idx++) { if ($envVal) { Write-Color -Text " (credential detected)" -Color Green } else { Write-Host "" } } -$SkipChoice = 6 + $ProviderMenuEnvVars.Count +$SkipChoice = 8 + $ProviderMenuEnvVars.Count Write-Host " " -NoNewline Write-Color -Text "$SkipChoice" -Color Cyan -NoNewline Write-Host ") Skip for now" @@ -534,6 +569,19 @@ switch ($num) { } } 4 { + # MiniMax Coding Key + $SubscriptionMode = "minimax_code" + $SelectedEnvVar = "MINIMAX_API_KEY" + $SelectedProviderId = "minimax" + $SelectedModel = "MiniMax-M2.5" + $SelectedMaxTokens = 32768 + $SelectedMaxContextTokens = 900000 # MiniMax M2.5 — 1M context window + $SelectedApiBase = "https://api.minimax.io/v1" + Write-Host "" + Write-Ok "Using MiniMax coding key" + Write-Color -Text " Model: MiniMax-M2.5 | API: api.minimax.io" -Color DarkGray + } + 5 { # Kimi Code Subscription $SubscriptionMode = "kimi_code" $SelectedProviderId = "kimi" @@ -545,7 +593,7 @@ switch ($num) { Write-Ok "Using Kimi Code subscription" Write-Color -Text " Model: kimi-k2.5 | API: api.kimi.com/coding" -Color DarkGray } - 5 { + 6 { # Hive LLM $SubscriptionMode = "hive_llm" $SelectedProviderId = "hive" @@ -569,9 +617,54 @@ switch ($num) { } Write-Color -Text " Model: $SelectedModel | API: $HiveLlmEndpoint" -Color DarkGray } - { $_ -ge 6 -and $_ -le 11 } { + 7 { + # Antigravity Subscription + if (-not $AntigravityCredDetected) { + Write-Host "" + Write-Color -Text " Setting up Antigravity authentication..." -Color Cyan + Write-Host "" + Write-Color -Text " A browser window will open for Google OAuth." -Color Yellow + Write-Host " Sign in with your Google account that has Antigravity access." + Write-Host "" + + # Run native OAuth flow + try { + Push-Location $ProjectDir + & $UvCmd run python (Join-Path $ProjectDir "core\antigravity_auth.py") auth account add 2>&1 + Pop-Location + # Re-detect credentials + $antigravityAccountsPath = Join-Path $env:USERPROFILE ".hive\antigravity-accounts.json" + if (Test-Path $antigravityAccountsPath) { + $AntigravityCredDetected = $true + } + } catch { + Pop-Location + } + + if (-not $AntigravityCredDetected) { + Write-Host "" + Write-Fail "Authentication failed or was cancelled." + Write-Host "" + exit 1 + } + } + + if ($AntigravityCredDetected) { + $SubscriptionMode = "antigravity" + $SelectedProviderId = "openai" + $SelectedModel = "gemini-3-flash" + $SelectedMaxTokens = 32768 + $SelectedMaxContextTokens = 1000000 # Gemini 3 Flash — 1M context window + Write-Host "" + Write-Warn "Using Antigravity can technically cause your account suspension. Please use at your own risk." + Write-Host "" + Write-Ok "Using Antigravity subscription" + Write-Color -Text " Model: gemini-3-flash | Direct OAuth (no proxy required)" -Color DarkGray + } + } + { $_ -ge 8 -and $_ -le 13 } { # API key providers - $provIdx = $num - 6 + $provIdx = $num - 8 $SelectedEnvVar = $ProviderMenuEnvVars[$provIdx] $SelectedProviderId = $ProviderMenuIds[$provIdx] $providerName = $ProviderMenuNames[$provIdx] -replace ' - .*', '' # strip description @@ -732,6 +825,73 @@ if ($SubscriptionMode -eq "zai_code") { } } +# For MiniMax coding key: prompt for API key with verification + retry +if ($SubscriptionMode -eq "minimax_code") { + while ($true) { + $existingMinimax = [System.Environment]::GetEnvironmentVariable("MINIMAX_API_KEY", "User") + if (-not $existingMinimax) { $existingMinimax = $env:MINIMAX_API_KEY } + + if ($existingMinimax) { + $masked = $existingMinimax.Substring(0, [Math]::Min(4, $existingMinimax.Length)) + "..." + $existingMinimax.Substring([Math]::Max(0, $existingMinimax.Length - 4)) + Write-Host "" + Write-Color -Text " $([char]0x2B22) Current MiniMax key: $masked" -Color Green + $apiKey = Read-Host " Press Enter to keep, or paste a new key to replace" + } else { + Write-Host "" + Write-Host "Get your API key from: " -NoNewline + Write-Color -Text "https://platform.minimax.io/user-center/basic-information/interface-key" -Color Cyan + Write-Host "" + $apiKey = Read-Host "Paste your MiniMax API key (or press Enter to skip)" + } + + if ($apiKey) { + [System.Environment]::SetEnvironmentVariable("MINIMAX_API_KEY", $apiKey, "User") + $env:MINIMAX_API_KEY = $apiKey + Write-Host "" + Write-Ok "MiniMax API key saved as User environment variable" + + # Health check the new key + Write-Host " Verifying MiniMax API key... " -NoNewline + try { + Push-Location $ProjectDir + $hcResult = & $UvCmd run python (Join-Path $ProjectDir "scripts/check_llm_key.py") "minimax" $apiKey "https://api.minimax.io/v1" 2>$null + Pop-Location + $hcJson = $hcResult | ConvertFrom-Json + if ($hcJson.valid -eq $true) { + Write-Color -Text "ok" -Color Green + break + } elseif ($hcJson.valid -eq $false) { + Write-Color -Text "failed" -Color Red + Write-Warn $hcJson.message + [System.Environment]::SetEnvironmentVariable("MINIMAX_API_KEY", $null, "User") + Remove-Item -Path "Env:\MINIMAX_API_KEY" -ErrorAction SilentlyContinue + Write-Host "" + Read-Host " Press Enter to try again" + } else { + Write-Color -Text "--" -Color Yellow + Write-Color -Text " Could not verify key (network issue). The key has been saved." -Color DarkGray + break + } + } catch { + Pop-Location + Write-Color -Text "--" -Color Yellow + Write-Color -Text " Could not verify key (network issue). The key has been saved." -Color DarkGray + break + } + } elseif (-not $existingMinimax) { + Write-Host "" + Write-Warn "Skipped. Add your MiniMax API key later:" + Write-Color -Text " [System.Environment]::SetEnvironmentVariable('MINIMAX_API_KEY', 'your-key', 'User')" -Color Cyan + $SelectedEnvVar = "" + $SelectedProviderId = "" + $SubscriptionMode = "" + break + } else { + break + } + } +} + # For Kimi Code subscription: prompt for API key with verification + retry if ($SubscriptionMode -eq "kimi_code") { while ($true) { @@ -910,9 +1070,21 @@ if ($SelectedProviderId) { $workerLlm["use_claude_code_subscription"] = $true } elseif ($SubscriptionMode -eq "codex") { $workerLlm["use_codex_subscription"] = $true + } elseif ($SubscriptionMode -eq "antigravity") { + $workerLlm["use_antigravity_subscription"] = $true + # Pass along any Antigravity OAuth env vars if set + $agSecret = [System.Environment]::GetEnvironmentVariable("ANTIGRAVITY_CLIENT_SECRET", "User") + if (-not $agSecret) { $agSecret = $env:ANTIGRAVITY_CLIENT_SECRET } + if ($agSecret) { $workerLlm["antigravity_client_secret"] = $agSecret } + $agClientId = [System.Environment]::GetEnvironmentVariable("ANTIGRAVITY_CLIENT_ID", "User") + if (-not $agClientId) { $agClientId = $env:ANTIGRAVITY_CLIENT_ID } + if ($agClientId) { $workerLlm["antigravity_client_id"] = $agClientId } } elseif ($SubscriptionMode -eq "zai_code") { $workerLlm["api_base"] = "https://api.z.ai/api/coding/paas/v4" $workerLlm["api_key_env_var"] = $SelectedEnvVar + } elseif ($SubscriptionMode -eq "minimax_code") { + $workerLlm["api_base"] = "https://api.minimax.io/v1" + $workerLlm["api_key_env_var"] = $SelectedEnvVar } elseif ($SubscriptionMode -eq "kimi_code") { $workerLlm["api_base"] = "https://api.kimi.com/coding" $workerLlm["api_key_env_var"] = $SelectedEnvVar