@@ -8,9 +8,9 @@ import (
88 "strings"
99 "testing"
1010
11+ "github.com/charmbracelet/catwalk/pkg/catwalk"
1112 "github.com/charmbracelet/crush/internal/csync"
1213 "github.com/charmbracelet/crush/internal/env"
13− "github.com/charmbracelet/crush/internal/fur/provider"
1414 "github.com/stretchr/testify/assert"
1515)
1616
@@ -56,12 +56,12 @@ func TestConfig_setDefaults(t *testing.T) {
5656}
5757
5858func TestConfig_configureProviders(t *testing.T) {
59− knownProviders := []provider.Provider{
59+ knownProviders := []catwalk.Provider{
6060 {
6161 ID: "openai",
6262 APIKey: "$OPENAI_API_KEY",
6363 APIEndpoint: "https://api.openai.com/v1",
64− Models: []provider.Model{{
64+ Models: []catwalk.Model{{
6565 ID: "test-model",
6666 }},
6767 },
@@ -83,12 +83,12 @@ func TestConfig_configureProviders(t *testing.T) {
8383}
8484
8585func TestConfig_configureProvidersWithOverride(t *testing.T) {
86− knownProviders := []provider.Provider{
86+ knownProviders := []catwalk.Provider{
8787 {
8888 ID: "openai",
8989 APIKey: "$OPENAI_API_KEY",
9090 APIEndpoint: "https://api.openai.com/v1",
91− Models: []provider.Model{{
91+ Models: []catwalk.Model{{
9292 ID: "test-model",
9393 }},
9494 },
@@ -100,10 +100,10 @@ func TestConfig_configureProvidersWithOverride(t *testing.T) {
100100 cfg.Providers.Set("openai", ProviderConfig{
101101 APIKey: "xyz",
102102 BaseURL: "https://api.openai.com/v2",
103− Models: []provider.Model{
103+ Models: []catwalk.Model{
104104 {
105− ID: "test-model",
106− Model: "Updated",
105+ ID: "test-model",
106+ Name: "Updated",
107107 },
108108 {
109109 ID: "another-model",
@@ -125,16 +125,16 @@ func TestConfig_configureProvidersWithOverride(t *testing.T) {
125125 assert.Equal(t, "xyz", pc.APIKey)
126126 assert.Equal(t, "https://api.openai.com/v2", pc.BaseURL)
127127 assert.Len(t, pc.Models, 2)
128− assert.Equal(t, "Updated", pc.Models[0].Model)
128+ assert.Equal(t, "Updated", pc.Models[0].Name)
129129}
130130
131131func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
132− knownProviders := []provider.Provider{
132+ knownProviders := []catwalk.Provider{
133133 {
134134 ID: "openai",
135135 APIKey: "$OPENAI_API_KEY",
136136 APIEndpoint: "https://api.openai.com/v1",
137− Models: []provider.Model{{
137+ Models: []catwalk.Model{{
138138 ID: "test-model",
139139 }},
140140 },
@@ -145,7 +145,7 @@ func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
145145 "custom": {
146146 APIKey: "xyz",
147147 BaseURL: "https://api.someendpoint.com/v2",
148− Models: []provider.Model{
148+ Models: []catwalk.Model{
149149 {
150150 ID: "test-model",
151151 },
@@ -176,12 +176,12 @@ func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
176176}
177177
178178func TestConfig_configureProvidersBedrockWithCredentials(t *testing.T) {
179− knownProviders := []provider.Provider{
179+ knownProviders := []catwalk.Provider{
180180 {
181− ID: provider.InferenceProviderBedrock,
181+ ID: catwalk.InferenceProviderBedrock,
182182 APIKey: "",
183183 APIEndpoint: "",
184− Models: []provider.Model{{
184+ Models: []catwalk.Model{{
185185 ID: "anthropic.claude-sonnet-4-20250514-v1:0",
186186 }},
187187 },
@@ -205,12 +205,12 @@ func TestConfig_configureProvidersBedrockWithCredentials(t *testing.T) {
205205}
206206
207207func TestConfig_configureProvidersBedrockWithoutCredentials(t *testing.T) {
208− knownProviders := []provider.Provider{
208+ knownProviders := []catwalk.Provider{
209209 {
210− ID: provider.InferenceProviderBedrock,
210+ ID: catwalk.InferenceProviderBedrock,
211211 APIKey: "",
212212 APIEndpoint: "",
213− Models: []provider.Model{{
213+ Models: []catwalk.Model{{
214214 ID: "anthropic.claude-sonnet-4-20250514-v1:0",
215215 }},
216216 },
@@ -227,12 +227,12 @@ func TestConfig_configureProvidersBedrockWithoutCredentials(t *testing.T) {
227227}
228228
229229func TestConfig_configureProvidersBedrockWithoutUnsupportedModel(t *testing.T) {
230− knownProviders := []provider.Provider{
230+ knownProviders := []catwalk.Provider{
231231 {
232− ID: provider.InferenceProviderBedrock,
232+ ID: catwalk.InferenceProviderBedrock,
233233 APIKey: "",
234234 APIEndpoint: "",
235− Models: []provider.Model{{
235+ Models: []catwalk.Model{{
236236 ID: "some-random-model",
237237 }},
238238 },
@@ -250,12 +250,12 @@ func TestConfig_configureProvidersBedrockWithoutUnsupportedModel(t *testing.T) {
250250}
251251
252252func TestConfig_configureProvidersVertexAIWithCredentials(t *testing.T) {
253− knownProviders := []provider.Provider{
253+ knownProviders := []catwalk.Provider{
254254 {
255− ID: provider.InferenceProviderVertexAI,
255+ ID: catwalk.InferenceProviderVertexAI,
256256 APIKey: "",
257257 APIEndpoint: "",
258− Models: []provider.Model{{
258+ Models: []catwalk.Model{{
259259 ID: "gemini-pro",
260260 }},
261261 },
@@ -282,12 +282,12 @@ func TestConfig_configureProvidersVertexAIWithCredentials(t *testing.T) {
282282}
283283
284284func TestConfig_configureProvidersVertexAIWithoutCredentials(t *testing.T) {
285− knownProviders := []provider.Provider{
285+ knownProviders := []catwalk.Provider{
286286 {
287− ID: provider.InferenceProviderVertexAI,
287+ ID: catwalk.InferenceProviderVertexAI,
288288 APIKey: "",
289289 APIEndpoint: "",
290− Models: []provider.Model{{
290+ Models: []catwalk.Model{{
291291 ID: "gemini-pro",
292292 }},
293293 },
@@ -308,12 +308,12 @@ func TestConfig_configureProvidersVertexAIWithoutCredentials(t *testing.T) {
308308}
309309
310310func TestConfig_configureProvidersVertexAIMissingProject(t *testing.T) {
311− knownProviders := []provider.Provider{
311+ knownProviders := []catwalk.Provider{
312312 {
313− ID: provider.InferenceProviderVertexAI,
313+ ID: catwalk.InferenceProviderVertexAI,
314314 APIKey: "",
315315 APIEndpoint: "",
316− Models: []provider.Model{{
316+ Models: []catwalk.Model{{
317317 ID: "gemini-pro",
318318 }},
319319 },
@@ -333,12 +333,12 @@ func TestConfig_configureProvidersVertexAIMissingProject(t *testing.T) {
333333}
334334
335335func TestConfig_configureProvidersSetProviderID(t *testing.T) {
336− knownProviders := []provider.Provider{
336+ knownProviders := []catwalk.Provider{
337337 {
338338 ID: "openai",
339339 APIKey: "$OPENAI_API_KEY",
340340 APIEndpoint: "https://api.openai.com/v1",
341− Models: []provider.Model{{
341+ Models: []catwalk.Model{{
342342 ID: "test-model",
343343 }},
344344 },
@@ -455,12 +455,12 @@ func TestConfig_IsConfigured(t *testing.T) {
455455}
456456
457457func TestConfig_configureProvidersWithDisabledProvider(t *testing.T) {
458− knownProviders := []provider.Provider{
458+ knownProviders := []catwalk.Provider{
459459 {
460460 ID: "openai",
461461 APIKey: "$OPENAI_API_KEY",
462462 APIEndpoint: "https://api.openai.com/v1",
463− Models: []provider.Model{{
463+ Models: []catwalk.Model{{
464464 ID: "test-model",
465465 }},
466466 },
@@ -494,7 +494,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
494494 Providers: csync.NewMapFrom(map[string]ProviderConfig{
495495 "custom": {
496496 BaseURL: "https://api.custom.com/v1",
497− Models: []provider.Model{{
497+ Models: []catwalk.Model{{
498498 ID: "test-model",
499499 }},
500500 },
@@ -507,7 +507,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
507507
508508 env := env.NewFromMap(map[string]string{})
509509 resolver := NewEnvironmentVariableResolver(env)
510− err := cfg.configureProviders(env, resolver, []provider.Provider{})
510+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
511511 assert.NoError(t, err)
512512
513513 assert.Equal(t, cfg.Providers.Len(), 1)
@@ -520,7 +520,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
520520 Providers: csync.NewMapFrom(map[string]ProviderConfig{
521521 "custom": {
522522 APIKey: "test-key",
523− Models: []provider.Model{{
523+ Models: []catwalk.Model{{
524524 ID: "test-model",
525525 }},
526526 },
@@ -530,7 +530,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
530530
531531 env := env.NewFromMap(map[string]string{})
532532 resolver := NewEnvironmentVariableResolver(env)
533− err := cfg.configureProviders(env, resolver, []provider.Provider{})
533+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
534534 assert.NoError(t, err)
535535
536536 assert.Equal(t, cfg.Providers.Len(), 0)
@@ -544,7 +544,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
544544 "custom": {
545545 APIKey: "test-key",
546546 BaseURL: "https://api.custom.com/v1",
547− Models: []provider.Model{},
547+ Models: []catwalk.Model{},
548548 },
549549 }),
550550 }
@@ -552,7 +552,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
552552
553553 env := env.NewFromMap(map[string]string{})
554554 resolver := NewEnvironmentVariableResolver(env)
555− err := cfg.configureProviders(env, resolver, []provider.Provider{})
555+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
556556 assert.NoError(t, err)
557557
558558 assert.Equal(t, cfg.Providers.Len(), 0)
@@ -567,7 +567,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
567567 APIKey: "test-key",
568568 BaseURL: "https://api.custom.com/v1",
569569 Type: "unsupported",
570− Models: []provider.Model{{
570+ Models: []catwalk.Model{{
571571 ID: "test-model",
572572 }},
573573 },
@@ -577,7 +577,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
577577
578578 env := env.NewFromMap(map[string]string{})
579579 resolver := NewEnvironmentVariableResolver(env)
580− err := cfg.configureProviders(env, resolver, []provider.Provider{})
580+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
581581 assert.NoError(t, err)
582582
583583 assert.Equal(t, cfg.Providers.Len(), 0)
@@ -591,8 +591,8 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
591591 "custom": {
592592 APIKey: "test-key",
593593 BaseURL: "https://api.custom.com/v1",
594− Type: provider.TypeOpenAI,
595− Models: []provider.Model{{
594+ Type: catwalk.TypeOpenAI,
595+ Models: []catwalk.Model{{
596596 ID: "test-model",
597597 }},
598598 },
@@ -602,7 +602,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
602602
603603 env := env.NewFromMap(map[string]string{})
604604 resolver := NewEnvironmentVariableResolver(env)
605− err := cfg.configureProviders(env, resolver, []provider.Provider{})
605+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
606606 assert.NoError(t, err)
607607
608608 assert.Equal(t, cfg.Providers.Len(), 1)
@@ -619,9 +619,9 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
619619 "custom": {
620620 APIKey: "test-key",
621621 BaseURL: "https://api.custom.com/v1",
622− Type: provider.TypeOpenAI,
622+ Type: catwalk.TypeOpenAI,
623623 Disable: true,
624− Models: []provider.Model{{
624+ Models: []catwalk.Model{{
625625 ID: "test-model",
626626 }},
627627 },
@@ -631,7 +631,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
631631
632632 env := env.NewFromMap(map[string]string{})
633633 resolver := NewEnvironmentVariableResolver(env)
634− err := cfg.configureProviders(env, resolver, []provider.Provider{})
634+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
635635 assert.NoError(t, err)
636636
637637 assert.Equal(t, cfg.Providers.Len(), 0)
@@ -642,12 +642,12 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
642642
643643func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
644644 t.Run("VertexAI provider removed when credentials missing with existing config", func(t *testing.T) {
645− knownProviders := []provider.Provider{
645+ knownProviders := []catwalk.Provider{
646646 {
647− ID: provider.InferenceProviderVertexAI,
647+ ID: catwalk.InferenceProviderVertexAI,
648648 APIKey: "",
649649 APIEndpoint: "",
650− Models: []provider.Model{{
650+ Models: []catwalk.Model{{
651651 ID: "gemini-pro",
652652 }},
653653 },
@@ -675,12 +675,12 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
675675 })
676676
677677 t.Run("Bedrock provider removed when AWS credentials missing with existing config", func(t *testing.T) {
678− knownProviders := []provider.Provider{
678+ knownProviders := []catwalk.Provider{
679679 {
680− ID: provider.InferenceProviderBedrock,
680+ ID: catwalk.InferenceProviderBedrock,
681681 APIKey: "",
682682 APIEndpoint: "",
683− Models: []provider.Model{{
683+ Models: []catwalk.Model{{
684684 ID: "anthropic.claude-sonnet-4-20250514-v1:0",
685685 }},
686686 },
@@ -706,12 +706,12 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
706706 })
707707
708708 t.Run("provider removed when API key missing with existing config", func(t *testing.T) {
709− knownProviders := []provider.Provider{
709+ knownProviders := []catwalk.Provider{
710710 {
711711 ID: "openai",
712712 APIKey: "$MISSING_API_KEY",
713713 APIEndpoint: "https://api.openai.com/v1",
714− Models: []provider.Model{{
714+ Models: []catwalk.Model{{
715715 ID: "test-model",
716716 }},
717717 },
@@ -737,12 +737,12 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
737737 })
738738
739739 t.Run("known provider should still be added if the endpoint is missing the client will use default endpoints", func(t *testing.T) {
740− knownProviders := []provider.Provider{
740+ knownProviders := []catwalk.Provider{
741741 {
742742 ID: "openai",
743743 APIKey: "$OPENAI_API_KEY",
744744 APIEndpoint: "$MISSING_ENDPOINT",
745− Models: []provider.Model{{
745+ Models: []catwalk.Model{{
746746 ID: "test-model",
747747 }},
748748 },
@@ -772,13 +772,13 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
772772
773773func TestConfig_defaultModelSelection(t *testing.T) {
774774 t.Run("default behavior uses the default models for given provider", func(t *testing.T) {
775− knownProviders := []provider.Provider{
775+ knownProviders := []catwalk.Provider{
776776 {
777777 ID: "openai",
778778 APIKey: "abc",
779779 DefaultLargeModelID: "large-model",
780780 DefaultSmallModelID: "small-model",
781− Models: []provider.Model{
781+ Models: []catwalk.Model{
782782 {
783783 ID: "large-model",
784784 DefaultMaxTokens: 1000,
@@ -808,13 +808,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
808808 assert.Equal(t, int64(500), small.MaxTokens)
809809 })
810810 t.Run("should error if no providers configured", func(t *testing.T) {
811− knownProviders := []provider.Provider{
811+ knownProviders := []catwalk.Provider{
812812 {
813813 ID: "openai",
814814 APIKey: "$MISSING_KEY",
815815 DefaultLargeModelID: "large-model",
816816 DefaultSmallModelID: "small-model",
817− Models: []provider.Model{
817+ Models: []catwalk.Model{
818818 {
819819 ID: "large-model",
820820 DefaultMaxTokens: 1000,
@@ -838,13 +838,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
838838 assert.Error(t, err)
839839 })
840840 t.Run("should error if model is missing", func(t *testing.T) {
841− knownProviders := []provider.Provider{
841+ knownProviders := []catwalk.Provider{
842842 {
843843 ID: "openai",
844844 APIKey: "abc",
845845 DefaultLargeModelID: "large-model",
846846 DefaultSmallModelID: "small-model",
847− Models: []provider.Model{
847+ Models: []catwalk.Model{
848848 {
849849 ID: "not-large-model",
850850 DefaultMaxTokens: 1000,
@@ -868,13 +868,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
868868 })
869869
870870 t.Run("should configure the default models with a custom provider", func(t *testing.T) {
871− knownProviders := []provider.Provider{
871+ knownProviders := []catwalk.Provider{
872872 {
873873 ID: "openai",
874874 APIKey: "$MISSING", // will not be included in the config
875875 DefaultLargeModelID: "large-model",
876876 DefaultSmallModelID: "small-model",
877− Models: []provider.Model{
877+ Models: []catwalk.Model{
878878 {
879879 ID: "not-large-model",
880880 DefaultMaxTokens: 1000,
@@ -892,7 +892,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
892892 "custom": {
893893 APIKey: "test-key",
894894 BaseURL: "https://api.custom.com/v1",
895− Models: []provider.Model{
895+ Models: []catwalk.Model{
896896 {
897897 ID: "model",
898898 DefaultMaxTokens: 600,
@@ -917,13 +917,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
917917 })
918918
919919 t.Run("should fail if no model configured", func(t *testing.T) {
920− knownProviders := []provider.Provider{
920+ knownProviders := []catwalk.Provider{
921921 {
922922 ID: "openai",
923923 APIKey: "$MISSING", // will not be included in the config
924924 DefaultLargeModelID: "large-model",
925925 DefaultSmallModelID: "small-model",
926− Models: []provider.Model{
926+ Models: []catwalk.Model{
927927 {
928928 ID: "not-large-model",
929929 DefaultMaxTokens: 1000,
@@ -941,7 +941,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
941941 "custom": {
942942 APIKey: "test-key",
943943 BaseURL: "https://api.custom.com/v1",
944− Models: []provider.Model{},
944+ Models: []catwalk.Model{},
945945 },
946946 }),
947947 }
@@ -954,13 +954,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
954954 assert.Error(t, err)
955955 })
956956 t.Run("should use the default provider first", func(t *testing.T) {
957− knownProviders := []provider.Provider{
957+ knownProviders := []catwalk.Provider{
958958 {
959959 ID: "openai",
960960 APIKey: "set",
961961 DefaultLargeModelID: "large-model",
962962 DefaultSmallModelID: "small-model",
963− Models: []provider.Model{
963+ Models: []catwalk.Model{
964964 {
965965 ID: "large-model",
966966 DefaultMaxTokens: 1000,
@@ -978,7 +978,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
978978 "custom": {
979979 APIKey: "test-key",
980980 BaseURL: "https://api.custom.com/v1",
981− Models: []provider.Model{
981+ Models: []catwalk.Model{
982982 {
983983 ID: "large-model",
984984 DefaultMaxTokens: 1000,
@@ -1005,13 +1005,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
10051005
10061006func TestConfig_configureSelectedModels(t *testing.T) {
10071007 t.Run("should override defaults", func(t *testing.T) {
1008− knownProviders := []provider.Provider{
1008+ knownProviders := []catwalk.Provider{
10091009 {
10101010 ID: "openai",
10111011 APIKey: "abc",
10121012 DefaultLargeModelID: "large-model",
10131013 DefaultSmallModelID: "small-model",
1014− Models: []provider.Model{
1014+ Models: []catwalk.Model{
10151015 {
10161016 ID: "larger-model",
10171017 DefaultMaxTokens: 2000,
@@ -1053,13 +1053,13 @@ func TestConfig_configureSelectedModels(t *testing.T) {
10531053 assert.Equal(t, int64(500), small.MaxTokens)
10541054 })
10551055 t.Run("should be possible to use multiple providers", func(t *testing.T) {
1056− knownProviders := []provider.Provider{
1056+ knownProviders := []catwalk.Provider{
10571057 {
10581058 ID: "openai",
10591059 APIKey: "abc",
10601060 DefaultLargeModelID: "large-model",
10611061 DefaultSmallModelID: "small-model",
1062− Models: []provider.Model{
1062+ Models: []catwalk.Model{
10631063 {
10641064 ID: "large-model",
10651065 DefaultMaxTokens: 1000,
@@ -1075,7 +1075,7 @@ func TestConfig_configureSelectedModels(t *testing.T) {
10751075 APIKey: "abc",
10761076 DefaultLargeModelID: "a-large-model",
10771077 DefaultSmallModelID: "a-small-model",
1078− Models: []provider.Model{
1078+ Models: []catwalk.Model{
10791079 {
10801080 ID: "a-large-model",
10811081 DefaultMaxTokens: 1000,
@@ -1116,13 +1116,13 @@ func TestConfig_configureSelectedModels(t *testing.T) {
11161116 })
11171117
11181118 t.Run("should override the max tokens only", func(t *testing.T) {
1119− knownProviders := []provider.Provider{
1119+ knownProviders := []catwalk.Provider{
11201120 {
11211121 ID: "openai",
11221122 APIKey: "abc",
11231123 DefaultLargeModelID: "large-model",
11241124 DefaultSmallModelID: "small-model",
1125− Models: []provider.Model{
1125+ Models: []catwalk.Model{
11261126 {
11271127 ID: "large-model",
11281128 DefaultMaxTokens: 1000,