| 290 | } |
| 291 | |
| 292 | func runConfigModel() error { |
| 293 | configPath, err := defaultConfigPath() |
| 294 | if err != nil { |
| 295 | return err |
| 296 | } |
| 297 | |
| 298 | cfg, err := loadOrCreateConfig(configPath) |
| 299 | if err != nil { |
| 300 | return fmt.Errorf("load config: %w", err) |
| 301 | } |
| 302 | |
| 303 | if cfg.Provider == "" { |
| 304 | return fmt.Errorf("no provider configured. Run 'ocr config provider' first") |
| 305 | } |
| 306 | |
| 307 | currentModel := "" |
| 308 | provider := llm.Provider{Name: cfg.Provider, DisplayName: cfg.Provider} |
| 309 | isCustom := false |
| 310 | registryModels := []string(nil) |
| 311 | if preset, isPreset := llm.LookupProvider(cfg.Provider); isPreset { |
| 312 | provider = preset |
| 313 | registryModels = append([]string(nil), preset.Models...) |
| 314 | if entry, ok := cfg.Providers[cfg.Provider]; ok { |
| 315 | currentModel = activeModelForProvider(cfg, cfg.Provider, entry) |
| 316 | provider.Models = mergeModelLists(provider.Models, entry.Models) |
| 317 | } |
| 318 | } else { |
| 319 | isCustom = true |
| 320 | entry, ok := cfg.CustomProviders[cfg.Provider] |
| 321 | if !ok { |
| 322 | return fmt.Errorf("provider %q is not configured in custom_providers", cfg.Provider) |
| 323 | } |
| 324 | currentModel = activeModelForProvider(cfg, cfg.Provider, entry) |
| 325 | provider.DisplayName = cfg.Provider + " (custom)" |
| 326 | provider.Protocol = entry.Protocol |
| 327 | provider.BaseURL = entry.URL |
| 328 | provider.Models = mergeModelLists(entry.Models) |
| 329 | } |
| 330 | |
| 331 | m := newModelTUIConfig(modelTUIConfig{ |
| 332 | Provider: provider, |
| 333 | CurrentModel: currentModel, |
| 334 | RegistryModels: registryModels, |
| 335 | ExistingCfg: cfg, |
| 336 | ConfigPath: configPath, |
| 337 | ProviderName: cfg.Provider, |
| 338 | IsCustom: isCustom, |
| 339 | }) |
| 340 | p := tea.NewProgram(m) |
| 341 | finalModel, err := p.Run() |
| 342 | if err != nil { |
| 343 | return fmt.Errorf("TUI error: %w", err) |
| 344 | } |
| 345 | |
| 346 | final := finalModel.(modelTUIModel) |
| 347 | if final.cancelled { |
| 348 | printWizardCancelled(final.savedInSession, "Model list changes") |
| 349 | return nil |