@@ -8,8 +8,8 @@ import (
88 "strings"
99 "testing"
1010
11+ "github.com/charmbracelet/catwalk/pkg/catwalk"
1112 "github.com/charmbracelet/crush/internal/env"
12− "github.com/charmbracelet/crush/internal/fur/provider"
1313 "github.com/stretchr/testify/assert"
1414)
1515
@@ -54,12 +54,12 @@ func TestConfig_setDefaults(t *testing.T) {
5454}
5555
5656func TestConfig_configureProviders(t *testing.T) {
57− knownProviders := []provider.Provider{
57+ knownProviders := []catwalk.Provider{
5858 {
5959 ID: "openai",
6060 APIKey: "$OPENAI_API_KEY",
6161 APIEndpoint: "https://api.openai.com/v1",
62− Models: []provider.Model{{
62+ Models: []catwalk.Model{{
6363 ID: "test-model",
6464 }},
6565 },
@@ -80,12 +80,12 @@ func TestConfig_configureProviders(t *testing.T) {
8080}
8181
8282func TestConfig_configureProvidersWithOverride(t *testing.T) {
83− knownProviders := []provider.Provider{
83+ knownProviders := []catwalk.Provider{
8484 {
8585 ID: "openai",
8686 APIKey: "$OPENAI_API_KEY",
8787 APIEndpoint: "https://api.openai.com/v1",
88− Models: []provider.Model{{
88+ Models: []catwalk.Model{{
8989 ID: "test-model",
9090 }},
9191 },
@@ -96,10 +96,10 @@ func TestConfig_configureProvidersWithOverride(t *testing.T) {
9696 "openai": {
9797 APIKey: "xyz",
9898 BaseURL: "https://api.openai.com/v2",
99− Models: []provider.Model{
99+ Models: []catwalk.Model{
100100 {
101− ID: "test-model",
102− Model: "Updated",
101+ ID: "test-model",
102+ Name: "Updated",
103103 },
104104 {
105105 ID: "another-model",
@@ -122,16 +122,16 @@ func TestConfig_configureProvidersWithOverride(t *testing.T) {
122122 assert.Equal(t, "xyz", cfg.Providers["openai"].APIKey)
123123 assert.Equal(t, "https://api.openai.com/v2", cfg.Providers["openai"].BaseURL)
124124 assert.Len(t, cfg.Providers["openai"].Models, 2)
125− assert.Equal(t, "Updated", cfg.Providers["openai"].Models[0].Model)
125+ assert.Equal(t, "Updated", cfg.Providers["openai"].Models[0].Name)
126126}
127127
128128func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
129− knownProviders := []provider.Provider{
129+ knownProviders := []catwalk.Provider{
130130 {
131131 ID: "openai",
132132 APIKey: "$OPENAI_API_KEY",
133133 APIEndpoint: "https://api.openai.com/v1",
134− Models: []provider.Model{{
134+ Models: []catwalk.Model{{
135135 ID: "test-model",
136136 }},
137137 },
@@ -142,7 +142,7 @@ func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
142142 "custom": {
143143 APIKey: "xyz",
144144 BaseURL: "https://api.someendpoint.com/v2",
145− Models: []provider.Model{
145+ Models: []catwalk.Model{
146146 {
147147 ID: "test-model",
148148 },
@@ -172,12 +172,12 @@ func TestConfig_configureProvidersWithNewProvider(t *testing.T) {
172172}
173173
174174func TestConfig_configureProvidersBedrockWithCredentials(t *testing.T) {
175− knownProviders := []provider.Provider{
175+ knownProviders := []catwalk.Provider{
176176 {
177− ID: provider.InferenceProviderBedrock,
177+ ID: catwalk.InferenceProviderBedrock,
178178 APIKey: "",
179179 APIEndpoint: "",
180− Models: []provider.Model{{
180+ Models: []catwalk.Model{{
181181 ID: "anthropic.claude-sonnet-4-20250514-v1:0",
182182 }},
183183 },
@@ -201,12 +201,12 @@ func TestConfig_configureProvidersBedrockWithCredentials(t *testing.T) {
201201}
202202
203203func TestConfig_configureProvidersBedrockWithoutCredentials(t *testing.T) {
204− knownProviders := []provider.Provider{
204+ knownProviders := []catwalk.Provider{
205205 {
206− ID: provider.InferenceProviderBedrock,
206+ ID: catwalk.InferenceProviderBedrock,
207207 APIKey: "",
208208 APIEndpoint: "",
209− Models: []provider.Model{{
209+ Models: []catwalk.Model{{
210210 ID: "anthropic.claude-sonnet-4-20250514-v1:0",
211211 }},
212212 },
@@ -223,12 +223,12 @@ func TestConfig_configureProvidersBedrockWithoutCredentials(t *testing.T) {
223223}
224224
225225func TestConfig_configureProvidersBedrockWithoutUnsupportedModel(t *testing.T) {
226− knownProviders := []provider.Provider{
226+ knownProviders := []catwalk.Provider{
227227 {
228− ID: provider.InferenceProviderBedrock,
228+ ID: catwalk.InferenceProviderBedrock,
229229 APIKey: "",
230230 APIEndpoint: "",
231− Models: []provider.Model{{
231+ Models: []catwalk.Model{{
232232 ID: "some-random-model",
233233 }},
234234 },
@@ -246,12 +246,12 @@ func TestConfig_configureProvidersBedrockWithoutUnsupportedModel(t *testing.T) {
246246}
247247
248248func TestConfig_configureProvidersVertexAIWithCredentials(t *testing.T) {
249− knownProviders := []provider.Provider{
249+ knownProviders := []catwalk.Provider{
250250 {
251− ID: provider.InferenceProviderVertexAI,
251+ ID: catwalk.InferenceProviderVertexAI,
252252 APIKey: "",
253253 APIEndpoint: "",
254− Models: []provider.Model{{
254+ Models: []catwalk.Model{{
255255 ID: "gemini-pro",
256256 }},
257257 },
@@ -278,12 +278,12 @@ func TestConfig_configureProvidersVertexAIWithCredentials(t *testing.T) {
278278}
279279
280280func TestConfig_configureProvidersVertexAIWithoutCredentials(t *testing.T) {
281− knownProviders := []provider.Provider{
281+ knownProviders := []catwalk.Provider{
282282 {
283− ID: provider.InferenceProviderVertexAI,
283+ ID: catwalk.InferenceProviderVertexAI,
284284 APIKey: "",
285285 APIEndpoint: "",
286− Models: []provider.Model{{
286+ Models: []catwalk.Model{{
287287 ID: "gemini-pro",
288288 }},
289289 },
@@ -304,12 +304,12 @@ func TestConfig_configureProvidersVertexAIWithoutCredentials(t *testing.T) {
304304}
305305
306306func TestConfig_configureProvidersVertexAIMissingProject(t *testing.T) {
307− knownProviders := []provider.Provider{
307+ knownProviders := []catwalk.Provider{
308308 {
309− ID: provider.InferenceProviderVertexAI,
309+ ID: catwalk.InferenceProviderVertexAI,
310310 APIKey: "",
311311 APIEndpoint: "",
312− Models: []provider.Model{{
312+ Models: []catwalk.Model{{
313313 ID: "gemini-pro",
314314 }},
315315 },
@@ -329,12 +329,12 @@ func TestConfig_configureProvidersVertexAIMissingProject(t *testing.T) {
329329}
330330
331331func TestConfig_configureProvidersSetProviderID(t *testing.T) {
332− knownProviders := []provider.Provider{
332+ knownProviders := []catwalk.Provider{
333333 {
334334 ID: "openai",
335335 APIKey: "$OPENAI_API_KEY",
336336 APIEndpoint: "https://api.openai.com/v1",
337− Models: []provider.Model{{
337+ Models: []catwalk.Model{{
338338 ID: "test-model",
339339 }},
340340 },
@@ -450,12 +450,12 @@ func TestConfig_IsConfigured(t *testing.T) {
450450}
451451
452452func TestConfig_configureProvidersWithDisabledProvider(t *testing.T) {
453− knownProviders := []provider.Provider{
453+ knownProviders := []catwalk.Provider{
454454 {
455455 ID: "openai",
456456 APIKey: "$OPENAI_API_KEY",
457457 APIEndpoint: "https://api.openai.com/v1",
458− Models: []provider.Model{{
458+ Models: []catwalk.Model{{
459459 ID: "test-model",
460460 }},
461461 },
@@ -489,7 +489,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
489489 Providers: map[string]ProviderConfig{
490490 "custom": {
491491 BaseURL: "https://api.custom.com/v1",
492− Models: []provider.Model{{
492+ Models: []catwalk.Model{{
493493 ID: "test-model",
494494 }},
495495 },
@@ -502,7 +502,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
502502
503503 env := env.NewFromMap(map[string]string{})
504504 resolver := NewEnvironmentVariableResolver(env)
505− err := cfg.configureProviders(env, resolver, []provider.Provider{})
505+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
506506 assert.NoError(t, err)
507507
508508 assert.Len(t, cfg.Providers, 1)
@@ -515,7 +515,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
515515 Providers: map[string]ProviderConfig{
516516 "custom": {
517517 APIKey: "test-key",
518− Models: []provider.Model{{
518+ Models: []catwalk.Model{{
519519 ID: "test-model",
520520 }},
521521 },
@@ -525,7 +525,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
525525
526526 env := env.NewFromMap(map[string]string{})
527527 resolver := NewEnvironmentVariableResolver(env)
528− err := cfg.configureProviders(env, resolver, []provider.Provider{})
528+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
529529 assert.NoError(t, err)
530530
531531 assert.Len(t, cfg.Providers, 0)
@@ -539,7 +539,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
539539 "custom": {
540540 APIKey: "test-key",
541541 BaseURL: "https://api.custom.com/v1",
542− Models: []provider.Model{},
542+ Models: []catwalk.Model{},
543543 },
544544 },
545545 }
@@ -547,7 +547,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
547547
548548 env := env.NewFromMap(map[string]string{})
549549 resolver := NewEnvironmentVariableResolver(env)
550− err := cfg.configureProviders(env, resolver, []provider.Provider{})
550+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
551551 assert.NoError(t, err)
552552
553553 assert.Len(t, cfg.Providers, 0)
@@ -562,7 +562,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
562562 APIKey: "test-key",
563563 BaseURL: "https://api.custom.com/v1",
564564 Type: "unsupported",
565− Models: []provider.Model{{
565+ Models: []catwalk.Model{{
566566 ID: "test-model",
567567 }},
568568 },
@@ -572,7 +572,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
572572
573573 env := env.NewFromMap(map[string]string{})
574574 resolver := NewEnvironmentVariableResolver(env)
575− err := cfg.configureProviders(env, resolver, []provider.Provider{})
575+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
576576 assert.NoError(t, err)
577577
578578 assert.Len(t, cfg.Providers, 0)
@@ -586,8 +586,8 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
586586 "custom": {
587587 APIKey: "test-key",
588588 BaseURL: "https://api.custom.com/v1",
589− Type: provider.TypeOpenAI,
590− Models: []provider.Model{{
589+ Type: catwalk.TypeOpenAI,
590+ Models: []catwalk.Model{{
591591 ID: "test-model",
592592 }},
593593 },
@@ -597,7 +597,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
597597
598598 env := env.NewFromMap(map[string]string{})
599599 resolver := NewEnvironmentVariableResolver(env)
600− err := cfg.configureProviders(env, resolver, []provider.Provider{})
600+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
601601 assert.NoError(t, err)
602602
603603 assert.Len(t, cfg.Providers, 1)
@@ -614,9 +614,9 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
614614 "custom": {
615615 APIKey: "test-key",
616616 BaseURL: "https://api.custom.com/v1",
617− Type: provider.TypeOpenAI,
617+ Type: catwalk.TypeOpenAI,
618618 Disable: true,
619− Models: []provider.Model{{
619+ Models: []catwalk.Model{{
620620 ID: "test-model",
621621 }},
622622 },
@@ -626,7 +626,7 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
626626
627627 env := env.NewFromMap(map[string]string{})
628628 resolver := NewEnvironmentVariableResolver(env)
629− err := cfg.configureProviders(env, resolver, []provider.Provider{})
629+ err := cfg.configureProviders(env, resolver, []catwalk.Provider{})
630630 assert.NoError(t, err)
631631
632632 assert.Len(t, cfg.Providers, 0)
@@ -637,12 +637,12 @@ func TestConfig_configureProvidersCustomProviderValidation(t *testing.T) {
637637
638638func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
639639 t.Run("VertexAI provider removed when credentials missing with existing config", func(t *testing.T) {
640− knownProviders := []provider.Provider{
640+ knownProviders := []catwalk.Provider{
641641 {
642− ID: provider.InferenceProviderVertexAI,
642+ ID: catwalk.InferenceProviderVertexAI,
643643 APIKey: "",
644644 APIEndpoint: "",
645− Models: []provider.Model{{
645+ Models: []catwalk.Model{{
646646 ID: "gemini-pro",
647647 }},
648648 },
@@ -670,12 +670,12 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
670670 })
671671
672672 t.Run("Bedrock provider removed when AWS credentials missing with existing config", func(t *testing.T) {
673− knownProviders := []provider.Provider{
673+ knownProviders := []catwalk.Provider{
674674 {
675− ID: provider.InferenceProviderBedrock,
675+ ID: catwalk.InferenceProviderBedrock,
676676 APIKey: "",
677677 APIEndpoint: "",
678− Models: []provider.Model{{
678+ Models: []catwalk.Model{{
679679 ID: "anthropic.claude-sonnet-4-20250514-v1:0",
680680 }},
681681 },
@@ -701,12 +701,12 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
701701 })
702702
703703 t.Run("provider removed when API key missing with existing config", func(t *testing.T) {
704− knownProviders := []provider.Provider{
704+ knownProviders := []catwalk.Provider{
705705 {
706706 ID: "openai",
707707 APIKey: "$MISSING_API_KEY",
708708 APIEndpoint: "https://api.openai.com/v1",
709− Models: []provider.Model{{
709+ Models: []catwalk.Model{{
710710 ID: "test-model",
711711 }},
712712 },
@@ -732,12 +732,12 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
732732 })
733733
734734 t.Run("known provider should still be added if the endpoint is missing the client will use default endpoints", func(t *testing.T) {
735− knownProviders := []provider.Provider{
735+ knownProviders := []catwalk.Provider{
736736 {
737737 ID: "openai",
738738 APIKey: "$OPENAI_API_KEY",
739739 APIEndpoint: "$MISSING_ENDPOINT",
740− Models: []provider.Model{{
740+ Models: []catwalk.Model{{
741741 ID: "test-model",
742742 }},
743743 },
@@ -767,13 +767,13 @@ func TestConfig_configureProvidersEnhancedCredentialValidation(t *testing.T) {
767767
768768func TestConfig_defaultModelSelection(t *testing.T) {
769769 t.Run("default behavior uses the default models for given provider", func(t *testing.T) {
770− knownProviders := []provider.Provider{
770+ knownProviders := []catwalk.Provider{
771771 {
772772 ID: "openai",
773773 APIKey: "abc",
774774 DefaultLargeModelID: "large-model",
775775 DefaultSmallModelID: "small-model",
776− Models: []provider.Model{
776+ Models: []catwalk.Model{
777777 {
778778 ID: "large-model",
779779 DefaultMaxTokens: 1000,
@@ -803,13 +803,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
803803 assert.Equal(t, int64(500), small.MaxTokens)
804804 })
805805 t.Run("should error if no providers configured", func(t *testing.T) {
806− knownProviders := []provider.Provider{
806+ knownProviders := []catwalk.Provider{
807807 {
808808 ID: "openai",
809809 APIKey: "$MISSING_KEY",
810810 DefaultLargeModelID: "large-model",
811811 DefaultSmallModelID: "small-model",
812− Models: []provider.Model{
812+ Models: []catwalk.Model{
813813 {
814814 ID: "large-model",
815815 DefaultMaxTokens: 1000,
@@ -833,13 +833,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
833833 assert.Error(t, err)
834834 })
835835 t.Run("should error if model is missing", func(t *testing.T) {
836− knownProviders := []provider.Provider{
836+ knownProviders := []catwalk.Provider{
837837 {
838838 ID: "openai",
839839 APIKey: "abc",
840840 DefaultLargeModelID: "large-model",
841841 DefaultSmallModelID: "small-model",
842− Models: []provider.Model{
842+ Models: []catwalk.Model{
843843 {
844844 ID: "not-large-model",
845845 DefaultMaxTokens: 1000,
@@ -863,13 +863,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
863863 })
864864
865865 t.Run("should configure the default models with a custom provider", func(t *testing.T) {
866− knownProviders := []provider.Provider{
866+ knownProviders := []catwalk.Provider{
867867 {
868868 ID: "openai",
869869 APIKey: "$MISSING", // will not be included in the config
870870 DefaultLargeModelID: "large-model",
871871 DefaultSmallModelID: "small-model",
872− Models: []provider.Model{
872+ Models: []catwalk.Model{
873873 {
874874 ID: "not-large-model",
875875 DefaultMaxTokens: 1000,
@@ -887,7 +887,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
887887 "custom": {
888888 APIKey: "test-key",
889889 BaseURL: "https://api.custom.com/v1",
890− Models: []provider.Model{
890+ Models: []catwalk.Model{
891891 {
892892 ID: "model",
893893 DefaultMaxTokens: 600,
@@ -912,13 +912,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
912912 })
913913
914914 t.Run("should fail if no model configured", func(t *testing.T) {
915− knownProviders := []provider.Provider{
915+ knownProviders := []catwalk.Provider{
916916 {
917917 ID: "openai",
918918 APIKey: "$MISSING", // will not be included in the config
919919 DefaultLargeModelID: "large-model",
920920 DefaultSmallModelID: "small-model",
921− Models: []provider.Model{
921+ Models: []catwalk.Model{
922922 {
923923 ID: "not-large-model",
924924 DefaultMaxTokens: 1000,
@@ -936,7 +936,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
936936 "custom": {
937937 APIKey: "test-key",
938938 BaseURL: "https://api.custom.com/v1",
939− Models: []provider.Model{},
939+ Models: []catwalk.Model{},
940940 },
941941 },
942942 }
@@ -949,13 +949,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
949949 assert.Error(t, err)
950950 })
951951 t.Run("should use the default provider first", func(t *testing.T) {
952− knownProviders := []provider.Provider{
952+ knownProviders := []catwalk.Provider{
953953 {
954954 ID: "openai",
955955 APIKey: "set",
956956 DefaultLargeModelID: "large-model",
957957 DefaultSmallModelID: "small-model",
958− Models: []provider.Model{
958+ Models: []catwalk.Model{
959959 {
960960 ID: "large-model",
961961 DefaultMaxTokens: 1000,
@@ -973,7 +973,7 @@ func TestConfig_defaultModelSelection(t *testing.T) {
973973 "custom": {
974974 APIKey: "test-key",
975975 BaseURL: "https://api.custom.com/v1",
976− Models: []provider.Model{
976+ Models: []catwalk.Model{
977977 {
978978 ID: "large-model",
979979 DefaultMaxTokens: 1000,
@@ -1000,13 +1000,13 @@ func TestConfig_defaultModelSelection(t *testing.T) {
10001000
10011001func TestConfig_configureSelectedModels(t *testing.T) {
10021002 t.Run("should override defaults", func(t *testing.T) {
1003− knownProviders := []provider.Provider{
1003+ knownProviders := []catwalk.Provider{
10041004 {
10051005 ID: "openai",
10061006 APIKey: "abc",
10071007 DefaultLargeModelID: "large-model",
10081008 DefaultSmallModelID: "small-model",
1009− Models: []provider.Model{
1009+ Models: []catwalk.Model{
10101010 {
10111011 ID: "larger-model",
10121012 DefaultMaxTokens: 2000,
@@ -1048,13 +1048,13 @@ func TestConfig_configureSelectedModels(t *testing.T) {
10481048 assert.Equal(t, int64(500), small.MaxTokens)
10491049 })
10501050 t.Run("should be possible to use multiple providers", func(t *testing.T) {
1051− knownProviders := []provider.Provider{
1051+ knownProviders := []catwalk.Provider{
10521052 {
10531053 ID: "openai",
10541054 APIKey: "abc",
10551055 DefaultLargeModelID: "large-model",
10561056 DefaultSmallModelID: "small-model",
1057− Models: []provider.Model{
1057+ Models: []catwalk.Model{
10581058 {
10591059 ID: "large-model",
10601060 DefaultMaxTokens: 1000,
@@ -1070,7 +1070,7 @@ func TestConfig_configureSelectedModels(t *testing.T) {
10701070 APIKey: "abc",
10711071 DefaultLargeModelID: "a-large-model",
10721072 DefaultSmallModelID: "a-small-model",
1073− Models: []provider.Model{
1073+ Models: []catwalk.Model{
10741074 {
10751075 ID: "a-large-model",
10761076 DefaultMaxTokens: 1000,
@@ -1111,13 +1111,13 @@ func TestConfig_configureSelectedModels(t *testing.T) {
11111111 })
11121112
11131113 t.Run("should override the max tokens only", func(t *testing.T) {
1114− knownProviders := []provider.Provider{
1114+ knownProviders := []catwalk.Provider{
11151115 {
11161116 ID: "openai",
11171117 APIKey: "abc",
11181118 DefaultLargeModelID: "large-model",
11191119 DefaultSmallModelID: "small-model",
1120− Models: []provider.Model{
1120+ Models: []catwalk.Model{
11211121 {
11221122 ID: "large-model",
11231123 DefaultMaxTokens: 1000,