@@ -9,6 +9,7 @@ import (
99 "testing"
1010
1111 "github.com/charmbracelet/catwalk/pkg/catwalk"
12+ "github.com/charmbracelet/crush/internal/csync"
1213 "github.com/charmbracelet/crush/internal/env"
1314 "github.com/stretchr/testify/assert"
1415)
@@ -29,9 +30,10 @@ func TestConfig_LoadFromReaders(t *testing.T) {
2930
3031 assert.NoError(t, err)
3132 assert.NotNil(t, loadedConfig)
32− assert.Len(t, loadedConfig.Providers, 1)
33− assert.Equal(t, "key2", loadedConfig.Providers["openai"].APIKey)
34− assert.Equal(t, "https://api.openai.com/v2", loadedConfig.Providers["openai"].BaseURL)
33+ assert.Equal(t, 1, loadedConfig.Providers.Len())
34+ pc, _ := loadedConfig.Providers.Get("openai")
35+ assert.Equal(t, "key2", pc.APIKey)
36+ assert.Equal(t, "https://api.openai.com/v2", pc.BaseURL)
3537}
3638
3739func TestConfig_setDefaults(t *testing.T) {
@@ -73,10 +75,11 @@ func TestConfig_configureProviders(t *testing.T) {
7375 resolver := NewEnvironmentVariableResolver(env)
7476 err := cfg.configureProviders(env, resolver, knownProviders)
7577 assert.NoError(t, err)
76− assert.Len(t, cfg.Providers, 1)
78+ assert.Equal(t, 1, cfg.Providers.Len())
7779
7880 // We want to make sure that we keep the configured API key as a placeholder
79− assert.Equal(t, "$OPENAI_API_KEY", cfg.Providers["openai"].APIKey)
81+ pc, _ := cfg.Providers.Get("openai")
82+ assert.Equal(t, "$OPENAI_API_KEY", pc.APIKey)
8083}
8184
8285func TestConfig_configureProvidersWithOverride(t *testing.T) {
@@ -92,22 +95,21 @@ func TestConfig_configureProvidersWithOverride(t *testing.T) {
9295 }
9396
9497 cfg := &Config{
95− Providers: map[string]ProviderConfig{
96− "openai": {
97− APIKey: "xyz",
98− BaseURL: "https://api.openai.com/v2",
99− Models: []catwalk.Model{
100− {
101− ID: "test-model",
102− Name: "Updated",
103− },
104− {
105− ID: "another-model",
106− },
107− },
98+ Providers: csync.NewMap[string, ProviderConfig](),
99+ }
100+ cfg.Providers.Set("openai", ProviderConfig{
101+ APIKey: "xyz",
102+ BaseURL: "https://api.openai.com/v2",
103+ Models: []catwalk.Model{
104+ {
105+ ID: "test-model",
106+ Name: "Updated",
107+ },
108+ {
109+ ID: "another-model",
108110 },
109111 },
110− }
112+ })
111113 cfg.setDefaults("/tmp")
112114
113115 env := env.NewFromMap(map[string]string{
@@ -116,13 +118,14 @@ func TestConfig_configureProvidersWithOverride(t *testing.T) {
116118 resolver := NewEnvironmentVariableResolver(env)
117119 err := cfg.configureProviders(env, resolver, knownProviders)
118120 assert.NoError(t, err)
119− assert.Len(t, cfg.Providers, 1)
121+ assert.Equal(t, 1, cfg.Providers.Len())
120122
121123 // We want to make sure that we keep the configured API key as a placeholder
122− assert.Equal(t, "xyz", cfg.Providers["openai"].APIKey)
123− assert.Equal(t, "https://api.openai.com/v2", cfg.Providers["openai"].BaseURL)
124− assert.Len(t, cfg.Providers["openai"].Models, 2)
125− assert.Equal(t, "Updated", cfg.Providers["openai"].Models[0].Name)
124+ pc, _ := cfg.Providers.Get("openai")
125+ assert.Equal(t, "xyz", pc.APIKey)
126+ assert.Equal(t, "https://api.openai.com/v2", pc.BaseURL)
127+ assert.Len(t, pc.Models, 2)
128+ assert.Equal(t, "Updated", pc.Models[0].Name)
126129}
127130
128131func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
@@ -138,7 +141,7 @@ func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
138141 }
139142
140143 cfg := &Config{
141− Providers: map[string]ProviderConfig{
144+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
142145 "custom": {
143146 APIKey: "xyz",
144147 BaseURL: "https://api.someendpoint.com/v2",
@@ -148,7 +151,7 @@ func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
148151 },
149152 },
150153 },
151− },
154+ }),
152155 }
153156 cfg.setDefaults("/tmp")
154157 env := env.NewFromMap(map[string]string{
@@ -158,16 +161,17 @@ func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
158161 err := cfg.configureProviders(env, resolver, knownProviders)
159162 assert.NoError(t, err)
160163 // Should be to because of the env variable
161− assert.Len(t, cfg.Providers, 2)
164+ assert.Equal(t, cfg.Providers.Len(), 2)
162165
163166 // We want to make sure that we keep the configured API key as a placeholder
164− assert.Equal(t, "xyz", cfg.Providers["custom"].APIKey)
167+ pc, _ := cfg.Providers.Get("custom")
168+ assert.Equal(t, "xyz", pc.APIKey)
165169 // Make sure we set the ID correctly
166− assert.Equal(t, "custom", cfg.Providers["custom"].ID)
167− assert.Equal(t, "https://api.someendpoint.com/v2", cfg.Providers["custom"].BaseURL)
168− assert.Len(t, cfg.Providers["custom"].Models, 1)
170+ assert.Equal(t, "custom", pc.ID)
171+ assert.Equal(t, "https://api.someendpoint.com/v2", pc.BaseURL)
172+ assert.Len(t, pc.Models, 1)
169173
170− _, ok := cfg.Providers["openai"]
174+ _, ok := cfg.Providers.Get("openai")
171175 assert.True(t, ok, "OpenAI provider should still be present")
172176}
173177
@@ -192,9 +196,9 @@ func TestConfig_configureProvidersBedrockWithCredentials(t *testing.T) {
192196 resolver := NewEnvironmentVariableResolver(env)
193197 err := cfg.configureProviders(env, resolver, knownProviders)
194198 assert.NoError(t, err)
195− assert.Len(t, cfg.Providers, 1)
199+ assert.Equal(t, cfg.Providers.Len(), 1)
196200
197− bedrockProvider, ok := cfg.Providers["bedrock"]
201+ bedrockProvider, ok := cfg.Providers.Get("bedrock")
198202 assert.True(t, ok, "Bedrock provider should be present")
199203 assert.Len(t, bedrockProvider.Models, 1)
200204 assert.Equal(t, "anthropic.claude-sonnet-4-20250514-v1:0", bedrockProvider.Models[0].ID)
@@ -219,7 +223,7 @@ func TestConfig_configureProvidersBedrockWithoutCredentials(t *testing.T) {
219223 err := cfg.configureProviders(env, resolver, knownProviders)
220224 assert.NoError(t, err)
221225 // Provider should not be configured without credentials
222− assert.Len(t, cfg.Providers, 0)
226+ assert.Equal(t, cfg.Providers.Len(), 0)
223227}
224228
225229func TestConfig_configureProvidersBedrockWithoutUnsupportedModel(t *testing.T) {
@@ -267,9 +271,9 @@ func TestConfig_configureProvidersVertexAIWithCredentials(t *testing.T) {
267271 resolver := NewEnvironmentVariableResolver(env)
268272 err := cfg.configureProviders(env, resolver, knownProviders)
269273 assert.NoError(t, err)
270− assert.Len(t, cfg.Providers, 1)
274+ assert.Equal(t, cfg.Providers.Len(), 1)
271275
272− vertexProvider, ok := cfg.Providers["vertexai"]
276+ vertexProvider, ok := cfg.Providers.Get("vertexai")
273277 assert.True(t, ok, "VertexAI provider should be present")
274278 assert.Len(t, vertexProvider.Models, 1)
275279 assert.Equal(t, "gemini-pro", vertexProvider.Models[0].ID)
@@ -300,7 +304,7 @@ func TestConfig_configureProvidersVertexAIWithoutCredentials(t *testing.T) {
300304 err := cfg.configureProviders(env, resolver, knownProviders)
301305 assert.NoError(t, err)
302306 // Provider should not be configured without proper credentials
303− assert.Len(t, cfg.Providers, 0)
307+ assert.Equal(t, cfg.Providers.Len(), 0)
304308}
305309
306310func TestConfig_configureProvidersVertexAIMissingProject(t *testing.T) {
@@ -325,7 +329,7 @@ func TestConfig_configureProvidersVertexAIMissingProject(t *testing.T) {
325329 err := cfg.configureProviders(env, resolver, knownProviders)
326330 assert.NoError(t, err)
327331 // Provider should not be configured without project
328− assert.Len(t, cfg.Providers, 0)
332+ assert.Equal(t, cfg.Providers.Len(), 0)
329333}
330334
331335func TestConfig_configureProvidersSetProviderID(t *testing.T) {
@@ -348,16 +352,17 @@ func TestConfig_configureProvidersSetProviderID(t *testing.T) {
348352 resolver := NewEnvironmentVariableResolver(env)
349353 err := cfg.configureProviders(env, resolver, knownProviders)
350354 assert.NoError(t, err)
351− assert.Len(t, cfg.Providers, 1)
355+ assert.Equal(t, cfg.Providers.Len(), 1)
352356
353357 // Provider ID should be set
354− assert.Equal(t, "openai", cfg.Providers["openai"].ID)
358+ pc, _ := cfg.Providers.Get("openai")
359+ assert.Equal(t, "openai", pc.ID)
355360}
356361
357362func TestConfig_EnabledProviders(t *testing.T) {
358363 t.Run("all providers enabled", func(t *testing.T) {
359364 cfg := &Config{
360− Providers: map[string]ProviderConfig{
365+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
361366 "openai": {
362367 ID: "openai",
363368 APIKey: "key1",
@@ -368,7 +373,7 @@ func TestConfig_EnabledProviders(t *testing.T) {
368373 APIKey: "key2",
369374 Disable: false,
370375 },
371− },
376+ }),
372377 }
373378
374379 enabled := cfg.EnabledProviders()
@@ -377,7 +382,7 @@ func TestConfig_EnabledProviders(t *testing.T) {
377382
378383 t.Run("some providers disabled", func(t *testing.T) {
379384 cfg := &Config{
380− Providers: map[string]ProviderConfig{
385+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
381386 "openai": {
382387 ID: "openai",
383388 APIKey: "key1",
@@ -388,7 +393,7 @@ func TestConfig_EnabledProviders(t *testing.T) {
388393 APIKey: "key2",
389394 Disable: true,
390395 },
391− },
396+ }),
392397 }
393398
394399 enabled := cfg.EnabledProviders()
@@ -398,7 +403,7 @@ func TestConfig_EnabledProviders(t *testing.T) {
398403
399404 t.Run("empty providers map", func(t *testing.T) {
400405 cfg := &Config{
401− Providers: map[string]ProviderConfig{},
406+ Providers: csync.NewMap[string, ProviderConfig](),
402407 }
403408
404409 enabled := cfg.EnabledProviders()
@@ -409,13 +414,13 @@ func TestConfig_EnabledProviders(t *testing.T) {
409414func TestConfig_IsConfigured(t *testing.T) {
410415 t.Run("returns true when at least one provider is enabled", func(t *testing.T) {
411416 cfg := &Config{
412− Providers: map[string]ProviderConfig{
417+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
413418 "openai": {
414419 ID: "openai",
415420 APIKey: "key1",
416421 Disable: false,
417422 },
418− },
423+ }),
419424 }
420425
421426 assert.True(t, cfg.IsConfigured())
@@ -423,7 +428,7 @@ func TestConfig_IsConfigured(t *testing.T) {
423428
424429 t.Run("returns false when no providers are configured", func(t *testing.T) {
425430 cfg := &Config{
426− Providers: map[string]ProviderConfig{},
431+ Providers: csync.NewMap[string, ProviderConfig](),
427432 }
428433
429434 assert.False(t, cfg.IsConfigured())
@@ -431,7 +436,7 @@ func TestConfig_IsConfigured(t *testing.T) {
431436
432437 t.Run("returns false when all providers are disabled", func(t *testing.T) {
433438 cfg := &Config{
434− Providers: map[string]ProviderConfig{
439+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
435440 "openai": {
436441 ID: "openai",
437442 APIKey: "key1",
@@ -442,7 +447,7 @@ func TestConfig_IsConfigured(t *testing.T) {
442447 APIKey: "key2",
443448 Disable: true,
444449 },
445− },
450+ }),
446451 }
447452
448453 assert.False(t, cfg.IsConfigured())
@@ -462,11 +467,11 @@ func TestConfig_configureProvidersWithDisabledProvider(t *testing.T) {
462467 }
463468
464469 cfg := &Config{
465− Providers: map[string]ProviderConfig{
470+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
466471 "openai": {
467472 Disable: true,
468473 },
469− },
474+ }),
470475 }
471476 cfg.setDefaults("/tmp")
472477
@@ -478,15 +483,15 @@ func TestConfig_configureProvidersWithDisabledProvider(t *testing.T) {
478483 assert.NoError(t, err)
479484
480485 // Provider should be removed from config when disabled
481− assert.Len(t, cfg.Providers, 0)
482− _, exists := cfg.Providers["openai"]
486+ assert.Equal(t, cfg.Providers.Len(), 0)
487+ _, exists := cfg.Providers.Get("openai")
483488 assert.False(t, exists)
484489}
485490
486491func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
487492 t.Run("custom provider with missing API key is allowed, but not known providers", func(t *testing.T) {
488493 cfg := &Config{
489− Providers: map[string]ProviderConfig{
494+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
490495 "custom": {
491496 BaseURL: "https://api.custom.com/v1",
492497 Models: []catwalk.Model{{
@@ -496,7 +501,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
496501 "openai": {
497502 APIKey: "$MISSING",
498503 },
499− },
504+ }),
500505 }
501506 cfg.setDefaults("/tmp")
502507
@@ -505,21 +510,21 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
505510 err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
506511 assert.NoError(t, err)
507512
508− assert.Len(t, cfg.Providers, 1)
509− _, exists := cfg.Providers["custom"]
513+ assert.Equal(t, cfg.Providers.Len(), 1)
514+ _, exists := cfg.Providers.Get("custom")
510515 assert.True(t, exists)
511516 })
512517
513518 t.Run("custom provider with missing BaseURL is removed", func(t *testing.T) {
514519 cfg := &Config{
515− Providers: map[string]ProviderConfig{
520+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
516521 "custom": {
517522 APIKey: "test-key",
518523 Models: []catwalk.Model{{
519524 ID: "test-model",
520525 }},
521526 },
522− },
527+ }),
523528 }
524529 cfg.setDefaults("/tmp")
525530
@@ -528,20 +533,20 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
528533 err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
529534 assert.NoError(t, err)
530535
531− assert.Len(t, cfg.Providers, 0)
532− _, exists := cfg.Providers["custom"]
536+ assert.Equal(t, cfg.Providers.Len(), 0)
537+ _, exists := cfg.Providers.Get("custom")
533538 assert.False(t, exists)
534539 })
535540
536541 t.Run("custom provider with no models is removed", func(t *testing.T) {
537542 cfg := &Config{
538− Providers: map[string]ProviderConfig{
543+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
539544 "custom": {
540545 APIKey: "test-key",
541546 BaseURL: "https://api.custom.com/v1",
542547 Models: []catwalk.Model{},
543548 },
544− },
549+ }),
545550 }
546551 cfg.setDefaults("/tmp")
547552
@@ -550,14 +555,14 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
550555 err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
551556 assert.NoError(t, err)
552557
553− assert.Len(t, cfg.Providers, 0)
554− _, exists := cfg.Providers["custom"]
558+ assert.Equal(t, cfg.Providers.Len(), 0)
559+ _, exists := cfg.Providers.Get("custom")
555560 assert.False(t, exists)
556561 })
557562
558563 t.Run("custom provider with unsupported type is removed", func(t *testing.T) {
559564 cfg := &Config{
560− Providers: map[string]ProviderConfig{
565+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
561566 "custom": {
562567 APIKey: "test-key",
563568 BaseURL: "https://api.custom.com/v1",
@@ -566,7 +571,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
566571 ID: "test-model",
567572 }},
568573 },
569− },
574+ }),
570575 }
571576 cfg.setDefaults("/tmp")
572577
@@ -575,14 +580,14 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
575580 err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
576581 assert.NoError(t, err)
577582
578− assert.Len(t, cfg.Providers, 0)
579− _, exists := cfg.Providers["custom"]
583+ assert.Equal(t, cfg.Providers.Len(), 0)
584+ _, exists := cfg.Providers.Get("custom")
580585 assert.False(t, exists)
581586 })
582587
583588 t.Run("valid custom provider is kept and ID is set", func(t *testing.T) {
584589 cfg := &Config{
585− Providers: map[string]ProviderConfig{
590+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
586591 "custom": {
587592 APIKey: "test-key",
588593 BaseURL: "https://api.custom.com/v1",
@@ -591,7 +596,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
591596 ID: "test-model",
592597 }},
593598 },
594− },
599+ }),
595600 }
596601 cfg.setDefaults("/tmp")
597602
@@ -600,8 +605,8 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
600605 err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
601606 assert.NoError(t, err)
602607
603− assert.Len(t, cfg.Providers, 1)
604− customProvider, exists := cfg.Providers["custom"]
608+ assert.Equal(t, cfg.Providers.Len(), 1)
609+ customProvider, exists := cfg.Providers.Get("custom")
605610 assert.True(t, exists)
606611 assert.Equal(t, "custom", customProvider.ID)
607612 assert.Equal(t, "test-key", customProvider.APIKey)
@@ -610,7 +615,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
610615
611616 t.Run("disabled custom provider is removed", func(t *testing.T) {
612617 cfg := &Config{
613− Providers: map[string]ProviderConfig{
618+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
614619 "custom": {
615620 APIKey: "test-key",
616621 BaseURL: "https://api.custom.com/v1",
@@ -620,7 +625,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
620625 ID: "test-model",
621626 }},
622627 },
623− },
628+ }),
624629 }
625630 cfg.setDefaults("/tmp")
626631
@@ -629,8 +634,8 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
629634 err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
630635 assert.NoError(t, err)
631636
632− assert.Len(t, cfg.Providers, 0)
633− _, exists := cfg.Providers["custom"]
637+ assert.Equal(t, cfg.Providers.Len(), 0)
638+ _, exists := cfg.Providers.Get("custom")
634639 assert.False(t, exists)
635640 })
636641}
@@ -649,11 +654,11 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
649654 }
650655
651656 cfg := &Config{
652− Providers: map[string]ProviderConfig{
657+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
653658 "vertexai": {
654659 BaseURL: "custom-url",
655660 },
656− },
661+ }),
657662 }
658663 cfg.setDefaults("/tmp")
659664
@@ -664,8 +669,8 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
664669 err := cfg.configureProviders(env, resolver, knownProviders)
665670 assert.NoError(t, err)
666671
667− assert.Len(t, cfg.Providers, 0)
668− _, exists := cfg.Providers["vertexai"]
672+ assert.Equal(t, cfg.Providers.Len(), 0)
673+ _, exists := cfg.Providers.Get("vertexai")
669674 assert.False(t, exists)
670675 })
671676
@@ -682,11 +687,11 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
682687 }
683688
684689 cfg := &Config{
685− Providers: map[string]ProviderConfig{
690+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
686691 "bedrock": {
687692 BaseURL: "custom-url",
688693 },
689− },
694+ }),
690695 }
691696 cfg.setDefaults("/tmp")
692697
@@ -695,8 +700,8 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
695700 err := cfg.configureProviders(env, resolver, knownProviders)
696701 assert.NoError(t, err)
697702
698− assert.Len(t, cfg.Providers, 0)
699− _, exists := cfg.Providers["bedrock"]
703+ assert.Equal(t, cfg.Providers.Len(), 0)
704+ _, exists := cfg.Providers.Get("bedrock")
700705 assert.False(t, exists)
701706 })
702707
@@ -713,11 +718,11 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
713718 }
714719
715720 cfg := &Config{
716− Providers: map[string]ProviderConfig{
721+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
717722 "openai": {
718723 BaseURL: "custom-url",
719724 },
720− },
725+ }),
721726 }
722727 cfg.setDefaults("/tmp")
723728
@@ -726,8 +731,8 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
726731 err := cfg.configureProviders(env, resolver, knownProviders)
727732 assert.NoError(t, err)
728733
729− assert.Len(t, cfg.Providers, 0)
730− _, exists := cfg.Providers["openai"]
734+ assert.Equal(t, cfg.Providers.Len(), 0)
735+ _, exists := cfg.Providers.Get("openai")
731736 assert.False(t, exists)
732737 })
733738
@@ -744,11 +749,11 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
744749 }
745750
746751 cfg := &Config{
747− Providers: map[string]ProviderConfig{
752+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
748753 "openai": {
749754 APIKey: "test-key",
750755 },
751− },
756+ }),
752757 }
753758 cfg.setDefaults("/tmp")
754759
@@ -759,8 +764,8 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
759764 err := cfg.configureProviders(env, resolver, knownProviders)
760765 assert.NoError(t, err)
761766
762− assert.Len(t, cfg.Providers, 1)
763− _, exists := cfg.Providers["openai"]
767+ assert.Equal(t, cfg.Providers.Len(), 1)
768+ _, exists := cfg.Providers.Get("openai")
764769 assert.True(t, exists)
765770 })
766771}
@@ -883,7 +888,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
883888 }
884889
885890 cfg := &Config{
886− Providers: map[string]ProviderConfig{
891+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
887892 "custom": {
888893 APIKey: "test-key",
889894 BaseURL: "https://api.custom.com/v1",
@@ -894,7 +899,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
894899 },
895900 },
896901 },
897− },
902+ }),
898903 }
899904 cfg.setDefaults("/tmp")
900905 env := env.NewFromMap(map[string]string{})
@@ -932,13 +937,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
932937 }
933938
934939 cfg := &Config{
935− Providers: map[string]ProviderConfig{
940+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
936941 "custom": {
937942 APIKey: "test-key",
938943 BaseURL: "https://api.custom.com/v1",
939944 Models: []catwalk.Model{},
940945 },
941− },
946+ }),
942947 }
943948 cfg.setDefaults("/tmp")
944949 env := env.NewFromMap(map[string]string{})
@@ -969,7 +974,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
969974 }
970975
971976 cfg := &Config{
972− Providers: map[string]ProviderConfig{
977+ Providers: csync.NewMapFrom(map[string]ProviderConfig{
973978 "custom": {
974979 APIKey: "test-key",
975980 BaseURL: "https://api.custom.com/v1",
@@ -980,7 +985,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
980985 },
981986 },
982987 },
983− },
988+ }),
984989 }
985990 cfg.setDefaults("/tmp")
986991 env := env.NewFromMap(map[string]string{})