@@ -1,8 +1,11 @@
11package config
22
33import (
4+ "context"
45 "io"
56 "log/slog"
7+ "net/http"
8+ "net/http/httptest"
69 "os"
710 "os/exec"
811 "path/filepath"
@@ -317,7 +320,7 @@ func TestConfig_configureProviders(t *testing.T) {
317320 "OPENAI_API_KEY": "test-key",
318321 })
319322 resolver := NewShellVariableResolver(env)
320โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
323+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
321324 require.NoError(t, err)
322325 require.Equal(t, 1, cfg.Providers.Len())
323326
@@ -360,7 +363,7 @@ func TestConfig_configureProvidersWithOverride(t *testing.T) {
360363 "OPENAI_API_KEY": "test-key",
361364 })
362365 resolver := NewShellVariableResolver(env)
363โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
366+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
364367 require.NoError(t, err)
365368 require.Equal(t, 1, cfg.Providers.Len())
366369
@@ -402,7 +405,7 @@ func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
402405 "OPENAI_API_KEY": "test-key",
403406 })
404407 resolver := NewShellVariableResolver(env)
405โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
408+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
406409 require.NoError(t, err)
407410 // Should be to because of the env variable
408411 require.Equal(t, cfg.Providers.Len(), 2)
@@ -438,7 +441,7 @@ func TestConfig_configureProvidersBedrockWithCredentials(t *testing.T) {
438441 "AWS_SECRET_ACCESS_KEY": "test-secret-key",
439442 })
440443 resolver := NewShellVariableResolver(env)
441โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
444+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
442445 require.NoError(t, err)
443446 require.Equal(t, cfg.Providers.Len(), 1)
444447
@@ -464,7 +467,7 @@ func TestConfig_configureProvidersBedrockWithoutCredentials(t *testing.T) {
464467 cfg.setDefaults("/tmp", "")
465468 env := env.NewFromMap(map[string]string{})
466469 resolver := NewShellVariableResolver(env)
467โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
470+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
468471 require.NoError(t, err)
469472 // Provider should not be configured without credentials
470473 require.Equal(t, cfg.Providers.Len(), 0)
@@ -489,7 +492,7 @@ func TestConfig_configureProvidersVertexAIWithCredentials(t *testing.T) {
489492 "VERTEXAI_LOCATION": "us-central1",
490493 })
491494 resolver := NewShellVariableResolver(env)
492โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
495+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
493496 require.NoError(t, err)
494497 require.Equal(t, cfg.Providers.Len(), 1)
495498
@@ -521,7 +524,7 @@ func TestConfig_configureProvidersVertexAIWithoutCredentials(t *testing.T) {
521524 "GOOGLE_CLOUD_LOCATION": "us-central1",
522525 })
523526 resolver := NewShellVariableResolver(env)
524โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
527+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
525528 require.NoError(t, err)
526529 // Provider should not be configured without proper credentials
527530 require.Equal(t, cfg.Providers.Len(), 0)
@@ -546,7 +549,7 @@ func TestConfig_configureProvidersVertexAIMissingProject(t *testing.T) {
546549 "GOOGLE_CLOUD_LOCATION": "us-central1",
547550 })
548551 resolver := NewShellVariableResolver(env)
549โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
552+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
550553 require.NoError(t, err)
551554 // Provider should not be configured without project
552555 require.Equal(t, cfg.Providers.Len(), 0)
@@ -570,7 +573,7 @@ func TestConfig_configureProvidersSetProviderID(t *testing.T) {
570573 "OPENAI_API_KEY": "test-key",
571574 })
572575 resolver := NewShellVariableResolver(env)
573โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
576+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
574577 require.NoError(t, err)
575578 require.Equal(t, cfg.Providers.Len(), 1)
576579
@@ -761,7 +764,7 @@ func TestConfig_configureProvidersWithDisabledProvider(t *testing.T) {
761764 "OPENAI_API_KEY": "test-key",
762765 })
763766 resolver := NewShellVariableResolver(env)
764โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
767+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
765768 require.NoError(t, err)
766769
767770 require.Equal(t, cfg.Providers.Len(), 1)
@@ -789,7 +792,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
789792
790793 env := env.NewFromMap(map[string]string{})
791794 resolver := NewShellVariableResolver(env)
792โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
795+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
793796 require.NoError(t, err)
794797
795798 require.Equal(t, cfg.Providers.Len(), 1)
@@ -812,7 +815,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
812815
813816 env := env.NewFromMap(map[string]string{})
814817 resolver := NewShellVariableResolver(env)
815โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
818+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
816819 require.NoError(t, err)
817820
818821 require.Equal(t, cfg.Providers.Len(), 0)
@@ -820,7 +823,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
820823 require.False(t, exists)
821824 })
822825
823โ t.Run("custom provider with no models is removed", func(t *testing.T) {
826+ t.Run("custom provider with no models attempts discovery and is removed on failure", func(t *testing.T) {
824827 cfg := &Config{
825828 Providers: csync.NewMapFrom(map[string]ProviderConfig{
826829 "custom": {
@@ -834,14 +837,142 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
834837
835838 env := env.NewFromMap(map[string]string{})
836839 resolver := NewShellVariableResolver(env)
837โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
840+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
838841 require.NoError(t, err)
839842
840โ require.Equal(t, cfg.Providers.Len(), 0)
843+ // Discovery fails (unreachable URL) so provider is removed.
844+ require.Equal(t, 0, cfg.Providers.Len())
845+ _, exists := cfg.Providers.Get("custom")
846+ require.False(t, exists)
847+ })
848+
849+ t.Run("custom provider with no models and discover_models:false is removed", func(t *testing.T) {
850+ discoverFalse := false
851+ cfg := &Config{
852+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
853+ "custom": {
854+ APIKey: "test-key",
855+ BaseURL: "https://api.custom.com/v1",
856+ Models: []catwalk.Model{},
857+ AutoDiscoverModels: &discoverFalse,
858+ },
859+ }),
860+ }
861+ cfg.setDefaults("/tmp", "")
862+
863+ env := env.NewFromMap(map[string]string{})
864+ resolver := NewShellVariableResolver(env)
865+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
866+ require.NoError(t, err)
867+
868+ require.Equal(t, 0, cfg.Providers.Len())
841869 _, exists := cfg.Providers.Get("custom")
842870 require.False(t, exists)
843871 })
844872
873+ t.Run("custom provider with models and discover_models:true merges discovered models", func(t *testing.T) {
874+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
875+ w.Header().Set("Content-Type", "application/json")
876+ _, _ = w.Write([]byte(`{"data": [
877+ {"id": "existing-model", "object": "model"},
878+ {"id": "discovered-model", "object": "model"}
879+ ]}`))
880+ }))
881+ defer server.Close()
882+
883+ discoverTrue := true
884+ cfg := &Config{
885+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
886+ "custom": {
887+ APIKey: "test-key",
888+ BaseURL: server.URL + "/v1",
889+ Models: []catwalk.Model{
890+ {ID: "existing-model", Name: "My Custom Name", ContextWindow: 200000},
891+ },
892+ AutoDiscoverModels: &discoverTrue,
893+ },
894+ }),
895+ }
896+ cfg.setDefaults("/tmp", "")
897+
898+ env := env.NewFromMap(map[string]string{})
899+ resolver := NewShellVariableResolver(env)
900+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
901+ require.NoError(t, err)
902+
903+ require.Equal(t, 1, cfg.Providers.Len())
904+ p, exists := cfg.Providers.Get("custom")
905+ require.True(t, exists)
906+ require.Len(t, p.Models, 2)
907+
908+ // User-specified model keeps its custom fields.
909+ require.Equal(t, "existing-model", p.Models[0].ID)
910+ require.Equal(t, "My Custom Name", p.Models[0].Name)
911+ require.Equal(t, int64(200000), p.Models[0].ContextWindow)
912+
913+ // Discovered model is appended.
914+ require.Equal(t, "discovered-model", p.Models[1].ID)
915+ })
916+
917+ t.Run("custom provider with models and no discover_models uses only listed models", func(t *testing.T) {
918+ cfg := &Config{
919+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
920+ "custom": {
921+ APIKey: "test-key",
922+ BaseURL: "https://api.custom.com/v1",
923+ Models: []catwalk.Model{
924+ {ID: "my-model", Name: "My Model"},
925+ },
926+ },
927+ }),
928+ }
929+ cfg.setDefaults("/tmp", "")
930+
931+ env := env.NewFromMap(map[string]string{})
932+ resolver := NewShellVariableResolver(env)
933+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
934+ require.NoError(t, err)
935+
936+ require.Equal(t, 1, cfg.Providers.Len())
937+ p, exists := cfg.Providers.Get("custom")
938+ require.True(t, exists)
939+ require.Len(t, p.Models, 1)
940+ require.Equal(t, "my-model", p.Models[0].ID)
941+ })
942+
943+ t.Run("custom provider with no models auto-discovers successfully", func(t *testing.T) {
944+ server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
945+ w.Header().Set("Content-Type", "application/json")
946+ _, _ = w.Write([]byte(`{"data": [
947+ {"id": "auto-model-a", "object": "model"},
948+ {"id": "auto-model-b", "object": "model"}
949+ ]}`))
950+ }))
951+ defer server.Close()
952+
953+ cfg := &Config{
954+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
955+ "custom": {
956+ APIKey: "test-key",
957+ BaseURL: server.URL + "/v1",
958+ },
959+ }),
960+ }
961+ cfg.setDefaults("/tmp", "")
962+
963+ env := env.NewFromMap(map[string]string{})
964+ resolver := NewShellVariableResolver(env)
965+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
966+ require.NoError(t, err)
967+
968+ require.Equal(t, 1, cfg.Providers.Len())
969+ p, exists := cfg.Providers.Get("custom")
970+ require.True(t, exists)
971+ require.Len(t, p.Models, 2)
972+ require.Equal(t, "auto-model-a", p.Models[0].ID)
973+ require.Equal(t, "auto-model-b", p.Models[1].ID)
974+ })
975+
845976 t.Run("custom provider with unsupported type is removed", func(t *testing.T) {
846977 cfg := &Config{
847978 Providers: csync.NewMapFrom(map[string]ProviderConfig{
@@ -859,7 +990,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
859990
860991 env := env.NewFromMap(map[string]string{})
861992 resolver := NewShellVariableResolver(env)
862โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
993+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
863994 require.NoError(t, err)
864995
865996 require.Equal(t, cfg.Providers.Len(), 0)
@@ -884,7 +1015,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
8841015
8851016 env := env.NewFromMap(map[string]string{})
8861017 resolver := NewShellVariableResolver(env)
887โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
1018+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
8881019 require.NoError(t, err)
8891020
8901021 require.Equal(t, cfg.Providers.Len(), 1)
@@ -912,7 +1043,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
9121043
9131044 env := env.NewFromMap(map[string]string{})
9141045 resolver := NewShellVariableResolver(env)
915โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
1046+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
9161047 require.NoError(t, err)
9171048
9181049 require.Equal(t, cfg.Providers.Len(), 1)
@@ -942,7 +1073,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
9421073
9431074 env := env.NewFromMap(map[string]string{})
9441075 resolver := NewShellVariableResolver(env)
945โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
1076+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
9461077 require.NoError(t, err)
9471078
9481079 require.Equal(t, cfg.Providers.Len(), 0)
@@ -977,7 +1108,7 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
9771108 "GOOGLE_GENAI_USE_VERTEXAI": "false",
9781109 })
9791110 resolver := NewShellVariableResolver(env)
980โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1111+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
9811112 require.NoError(t, err)
9821113
9831114 require.Equal(t, cfg.Providers.Len(), 0)
@@ -1008,7 +1139,7 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
10081139
10091140 env := env.NewFromMap(map[string]string{})
10101141 resolver := NewShellVariableResolver(env)
1011โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1142+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
10121143 require.NoError(t, err)
10131144
10141145 require.Equal(t, cfg.Providers.Len(), 0)
@@ -1039,7 +1170,7 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
10391170
10401171 env := env.NewFromMap(map[string]string{})
10411172 resolver := NewShellVariableResolver(env)
1042โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1173+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
10431174 require.NoError(t, err)
10441175
10451176 require.Equal(t, cfg.Providers.Len(), 0)
@@ -1072,7 +1203,7 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
10721203 "OPENAI_API_KEY": "test-key",
10731204 })
10741205 resolver := NewShellVariableResolver(env)
1075โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1206+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
10761207 require.NoError(t, err)
10771208
10781209 require.Equal(t, cfg.Providers.Len(), 1)
@@ -1106,7 +1237,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
11061237 cfg.setDefaults("/tmp", "")
11071238 env := env.NewFromMap(map[string]string{})
11081239 resolver := NewShellVariableResolver(env)
1109โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1240+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
11101241 require.NoError(t, err)
11111242
11121243 large, small, err := cfg.defaultModelSelection(knownProviders)
@@ -1142,7 +1273,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
11421273 cfg.setDefaults("/tmp", "")
11431274 env := env.NewFromMap(map[string]string{})
11441275 resolver := NewShellVariableResolver(env)
1145โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1276+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
11461277 require.NoError(t, err)
11471278
11481279 _, _, err = cfg.defaultModelSelection(knownProviders)
@@ -1172,7 +1303,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
11721303 cfg.setDefaults("/tmp", "")
11731304 env := env.NewFromMap(map[string]string{})
11741305 resolver := NewShellVariableResolver(env)
1175โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1306+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
11761307 require.NoError(t, err)
11771308 _, _, err = cfg.defaultModelSelection(knownProviders)
11781309 require.NoError(t, err)
@@ -1215,7 +1346,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
12151346 cfg.setDefaults("/tmp", "")
12161347 env := env.NewFromMap(map[string]string{})
12171348 resolver := NewShellVariableResolver(env)
1218โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1349+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
12191350 require.NoError(t, err)
12201351 large, small, err := cfg.defaultModelSelection(knownProviders)
12211352 require.NoError(t, err)
@@ -1259,7 +1390,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
12591390 cfg.setDefaults("/tmp", "")
12601391 env := env.NewFromMap(map[string]string{})
12611392 resolver := NewShellVariableResolver(env)
1262โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1393+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
12631394 require.NoError(t, err)
12641395 _, _, err = cfg.defaultModelSelection(knownProviders)
12651396 require.Error(t, err)
@@ -1301,7 +1432,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
13011432 cfg.setDefaults("/tmp", "")
13021433 env := env.NewFromMap(map[string]string{})
13031434 resolver := NewShellVariableResolver(env)
1304โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1435+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
13051436 require.NoError(t, err)
13061437 large, small, err := cfg.defaultModelSelection(knownProviders)
13071438 require.NoError(t, err)
@@ -1346,7 +1477,7 @@ func TestConfig_configureProvidersDisableDefaultProviders(t *testing.T) {
13461477 "OPENAI_API_KEY": "test-key",
13471478 })
13481479 resolver := NewShellVariableResolver(env)
1349โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1480+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
13501481 require.ErrorContains(t, err, "no custom providers")
13511482
13521483 // openai should NOT be present because it lacks base_url and models.
@@ -1389,7 +1520,7 @@ func TestConfig_configureProvidersDisableDefaultProviders(t *testing.T) {
13891520 "OPENAI_API_KEY": "test-key",
13901521 })
13911522 resolver := NewShellVariableResolver(env)
1392โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1523+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
13931524 require.NoError(t, err)
13941525
13951526 // Only fully specified provider should be present.
@@ -1443,7 +1574,7 @@ func TestConfig_configureProvidersDisableDefaultProviders(t *testing.T) {
14431574 "ANTHROPIC_API_KEY": "test-key",
14441575 })
14451576 resolver := NewShellVariableResolver(env)
1446โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1577+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
14471578 require.NoError(t, err)
14481579
14491580 // Both providers should be present.
@@ -1454,7 +1585,7 @@ func TestConfig_configureProvidersDisableDefaultProviders(t *testing.T) {
14541585 require.True(t, exists, "anthropic should be present")
14551586 })
14561587
1457โ t.Run("when enabled, provider missing models is rejected", func(t *testing.T) {
1588+ t.Run("when enabled, provider missing models attempts discovery but still triggers no-custom-providers error", func(t *testing.T) {
14581589 cfg := &Config{
14591590 Options: &Options{
14601591 DisableDefaultProviders: true,
@@ -1471,10 +1602,10 @@ func TestConfig_configureProvidersDisableDefaultProviders(t *testing.T) {
14711602
14721603 env := env.NewFromMap(map[string]string{})
14731604 resolver := NewShellVariableResolver(env)
1474โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
1605+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
14751606 require.ErrorContains(t, err, "no custom providers")
14761607
1477โ // Provider should be rejected for missing models.
1608+ // Discovery fails (unreachable URL) so provider is removed.
14781609 require.Equal(t, 0, cfg.Providers.Len())
14791610 })
14801611
@@ -1495,7 +1626,7 @@ func TestConfig_configureProvidersDisableDefaultProviders(t *testing.T) {
14951626
14961627 env := env.NewFromMap(map[string]string{})
14971628 resolver := NewShellVariableResolver(env)
1498โ err := cfg.configureProviders(testStore(cfg), env, resolver, []catwalk.Provider{})
1629+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, []catwalk.Provider{})
14991630 require.ErrorContains(t, err, "no custom providers")
15001631
15011632 // Provider should be rejected for missing base_url.
@@ -1553,7 +1684,7 @@ func TestConfig_configureSelectedModels(t *testing.T) {
15531684 store := &ConfigStore{config: cfg, globalDataPath: globalPath}
15541685 env := env.NewFromMap(map[string]string{})
15551686 resolver := NewShellVariableResolver(env)
1556โ err := cfg.configureProviders(store, env, resolver, knownProviders)
1687+ err := cfg.configureProviders(context.Background(), store, env, resolver, knownProviders)
15571688 require.NoError(t, err)
15581689
15591690 err = configureSelectedModels(store, knownProviders, false)
@@ -1603,7 +1734,7 @@ func TestConfig_configureSelectedModels(t *testing.T) {
16031734 cfg.setDefaults("/tmp", "")
16041735 env := env.NewFromMap(map[string]string{})
16051736 resolver := NewShellVariableResolver(env)
1606โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1737+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
16071738 require.NoError(t, err)
16081739
16091740 err = configureSelectedModels(testStore(cfg), knownProviders, true)
@@ -1665,7 +1796,7 @@ func TestConfig_configureSelectedModels(t *testing.T) {
16651796 cfg.setDefaults("/tmp", "")
16661797 env := env.NewFromMap(map[string]string{})
16671798 resolver := NewShellVariableResolver(env)
1668โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1799+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
16691800 require.NoError(t, err)
16701801
16711802 err = configureSelectedModels(testStore(cfg), knownProviders, true)
@@ -1710,7 +1841,7 @@ func TestConfig_configureSelectedModels(t *testing.T) {
17101841 cfg.setDefaults("/tmp", "")
17111842 env := env.NewFromMap(map[string]string{})
17121843 resolver := NewShellVariableResolver(env)
1713โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1844+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
17141845 require.NoError(t, err)
17151846
17161847 err = configureSelectedModels(testStore(cfg), knownProviders, true)
@@ -1749,7 +1880,7 @@ func TestConfig_configureProviders_HyperAPIKeyFromEnv(t *testing.T) {
17491880 "HYPER_API_KEY": "env-api-key",
17501881 })
17511882 resolver := NewShellVariableResolver(env)
1752โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1883+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
17531884 require.NoError(t, err)
17541885 require.Equal(t, 1, cfg.Providers.Len())
17551886
@@ -1796,7 +1927,7 @@ func TestConfig_configureProviders_HyperAPIKeyFromConfigOverrides(t *testing.T)
17961927 "HYPER_API_KEY": "env-api-key",
17971928 })
17981929 resolver := NewShellVariableResolver(env)
1799โ err := cfg.configureProviders(testStore(cfg), env, resolver, knownProviders)
1930+ err := cfg.configureProviders(context.Background(), testStore(cfg), env, resolver, knownProviders)
18001931 require.NoError(t, err)
18011932 require.Equal(t, 1, cfg.Providers.Len())
18021933
@@ -1839,7 +1970,7 @@ func TestConfig_configureProviders_ProviderHeaderResolveError(t *testing.T) {
18391970 })
18401971 resolver := NewShellVariableResolver(testEnv)
18411972
1842โ err := cfg.configureProviders(testStore(cfg), testEnv, resolver, knownProviders)
1973+ err := cfg.configureProviders(context.Background(), testStore(cfg), testEnv, resolver, knownProviders)
18431974 require.Error(t, err, "failing $(cmd) in a header must fail the provider load")
18441975 require.Contains(t, err.Error(), "X-Broken", "error must name the offending header")
18451976}
@@ -1871,7 +2002,7 @@ func TestConfig_configureProviders_CatwalkDefaultWithUnsetVarLoads(t *testing.T)
18712002 })
18722003 resolver := NewShellVariableResolver(testEnv)
18732004
1874โ err := cfg.configureProviders(testStore(cfg), testEnv, resolver, knownProviders)
2005+ err := cfg.configureProviders(context.Background(), testStore(cfg), testEnv, resolver, knownProviders)
18752006 require.NoError(t, err, "optional env-gated header must not fail the load")
18762007
18772008 pc, ok := cfg.Providers.Get("openai")
@@ -1907,7 +2038,7 @@ func TestConfig_configureProviders_LiteralEmptyHeaderDropped(t *testing.T) {
19072038 })
19082039 resolver := NewShellVariableResolver(testEnv)
19092040
1910โ err := cfg.configureProviders(testStore(cfg), testEnv, resolver, []catwalk.Provider{})
2041+ err := cfg.configureProviders(context.Background(), testStore(cfg), testEnv, resolver, []catwalk.Provider{})
19112042 require.NoError(t, err)
19122043
19132044 pc, ok := cfg.Providers.Get("my-llm")
@@ -1944,7 +2075,7 @@ func TestConfig_configureProviders_EchoEmptyHeaderDropped(t *testing.T) {
19442075 })
19452076 resolver := NewShellVariableResolver(testEnv)
19462077
1947โ err := cfg.configureProviders(testStore(cfg), testEnv, resolver, knownProviders)
2078+ err := cfg.configureProviders(context.Background(), testStore(cfg), testEnv, resolver, knownProviders)
19482079 require.NoError(t, err)
19492080
19502081 pc, ok := cfg.Providers.Get("openai")
@@ -1992,7 +2123,7 @@ func TestConfig_configureProviders_UnsetAPIKeySkipsProvider(t *testing.T) {
19922123 })
19932124 resolver := NewShellVariableResolver(testEnv)
19942125
1995โ err := cfg.configureProviders(testStore(cfg), testEnv, resolver, knownProviders)
2126+ err := cfg.configureProviders(context.Background(), testStore(cfg), testEnv, resolver, knownProviders)
19962127 require.NoError(t, err, "skip path must not surface as a load error")
19972128
19982129 require.Equal(t, 0, cfg.Providers.Len(), "provider with unset API key must be skipped")
@@ -2030,7 +2161,7 @@ func TestConfig_configureProviders_FailingAPIKeyCmdSkipsProvider(t *testing.T) {
20302161 })
20312162 resolver := NewShellVariableResolver(testEnv)
20322163
2033โ err := cfg.configureProviders(testStore(cfg), testEnv, resolver, knownProviders)
2164+ err := cfg.configureProviders(context.Background(), testStore(cfg), testEnv, resolver, knownProviders)
20342165 require.NoError(t, err, "failing $(cmd) in API key must skip provider, not fail load")
20352166
20362167 require.Equal(t, 0, cfg.Providers.Len(), "provider with failing $(cmd) API key must be skipped")
@@ -2067,7 +2198,7 @@ func TestConfig_configureProviders_UnsetAzureEndpointSkipsProvider(t *testing.T)
20672198 })
20682199 resolver := NewShellVariableResolver(testEnv)
20692200
2070โ err := cfg.configureProviders(testStore(cfg), testEnv, resolver, knownProviders)
2201+ err := cfg.configureProviders(context.Background(), testStore(cfg), testEnv, resolver, knownProviders)
20712202 require.NoError(t, err)
20722203
20732204 require.Equal(t, 0, cfg.Providers.Len(), "azure provider with unset endpoint must be skipped")