File size: 2,134 Bytes
0cac9cf
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
"""Interactive setup flow for provider, model, and API key configuration."""

from getpass import getpass

from rich.console import Console
from rich.prompt import Prompt
from rich.table import Table

from .config import PROVIDERS, ProviderConfig
from .state import find_env_api_key, save_state


def select_provider(console: Console) -> ProviderConfig:
	"""Display provider choices and return selected provider configuration."""
	table = Table(title="Choose Provider")
	table.add_column("Key", style="cyan", justify="right")
	table.add_column("Provider", style="green")
	table.add_row("1", "Gemini")
	table.add_row("2", "Groq")
	table.add_row("3", "Nvidia")
	table.add_row("4", "Ollama")
	console.print(table)
	choice = Prompt.ask("Enter choice", choices=["1", "2", "3", "4"], console=console)
	config = PROVIDERS.get(choice)
	if not config:
		raise RuntimeError("Invalid provider choice. Pick a number from 1 to 4.")
	return config


def resolve_api_key(config: ProviderConfig) -> str:
	"""Resolve API key from prompt input, env vars, or sensible local defaults."""
	env_key = find_env_api_key(config.env_key_names)
	if config.name == "ollama":
		# Ollama typically runs locally and does not require a secret key.
		entered = getpass("API key (optional for Ollama; press Enter to skip): ").strip()
		return entered or env_key or "ollama"

	entered = getpass("API key (hidden input): ").strip()
	if entered:
		return entered
	if env_key:
		return env_key
	env_hint = " or ".join(config.env_key_names)
	raise RuntimeError(f"Missing API key. Provide one in prompt or set {env_hint}.")


def run_setup(console: Console) -> dict[str, str]:
	"""Run end-to-end setup and persist selected provider credentials/state."""
	config = select_provider(console)
	console.print(f"\nSelected: [bold green]{config.name}[/bold green]")
	model = Prompt.ask("Model", default=config.default_model, console=console).strip() or config.default_model
	api_key = resolve_api_key(config)
	save_state(config.name, api_key, model)
	console.print(f"Saved setup for provider '{config.name}'.")
	return {"provider": config.name, "api_key": api_key, "model": model}