@@ -2,6 +2,8 @@ package model
22
33import (
44 "testing"
5+
6+ "github.com/cnjack/jcode/internal/config"
57)
68
79// TestLookupModel tests model lookup from the generated registry.
@@ -83,3 +85,88 @@ func TestHasProvider(t *testing.T) {
8385 t .Error ("Expected HasProvider to return false for non-existent provider" )
8486 }
8587}
88+
89+ func TestMergeConfigProvidersInheritsGrokFamilyImageSupport (t * testing.T ) {
90+ registry := NewModelRegistryWithConfig (& config.Config {
91+ Providers : map [string ]* config.ProviderConfig {
92+ "xai" : {
93+ CustomModels : []config.CustomModelConfig {{
94+ ID : "grok-4.6" , Name : "Grok 4.6" , ToolCall : true , Managed : true ,
95+ }},
96+ },
97+ },
98+ })
99+ _ , got , ok := registry .LookupModel ("xai" , "grok-4.6" )
100+ if ! ok || got == nil {
101+ t .Fatal ("managed grok-4.6 was not merged" )
102+ }
103+ if ! got .Attachment || ! got .SupportsImageInput () {
104+ t .Fatalf ("grok-4.6 should inherit grok-4.5 image support: %#v" , got )
105+ }
106+ if ! got .Reasoning || got .Limit == nil || got .Limit .Context <= 0 {
107+ t .Fatalf ("grok-4.6 should inherit grok-4.5 reasoning/context: %#v" , got )
108+ }
109+ }
110+
111+ func TestRelatedRegistryModelDoesNotMatchImagineIDs (t * testing.T ) {
112+ provider := NewModelRegistry ().GetProvider ("xai" )
113+ if RelatedRegistryModel (provider , "grok-imagine-image" ) != nil {
114+ t .Fatal ("image-generation ids must not inherit chat-family metadata" )
115+ }
116+ related := RelatedRegistryModel (provider , "grok-4.6" )
117+ if related == nil || related .ID != "grok-4.5" {
118+ t .Fatalf ("related grok-4.6 = %#v" , related )
119+ }
120+ }
121+
122+ func TestRelatedRegistryModelIgnoresLiveCustomSiblings (t * testing.T ) {
123+ registry := NewModelRegistry ()
124+ provider := registry .GetProvider ("xai" )
125+ if provider == nil {
126+ t .Fatal ("xai missing" )
127+ }
128+ provider .Models ["grok-4.7" ] = & RegistryModel {
129+ ID : "grok-4.7" , Name : "Custom Grok 4.7" , DefaultEnabled : true ,
130+ }
131+ related := RelatedRegistryModel (provider , "grok-4.6" )
132+ if related == nil || related .ID != "grok-4.5" {
133+ t .Fatalf ("related grok-4.6 should stay on baked-in grok-4.5, got %#v" , related )
134+ }
135+ }
136+
137+ func TestRelatedBakedInModelPicksClosestEnabledSibling (t * testing.T ) {
138+ models := map [string ]* RegistryModel {
139+ "grok-4.1" : {ID : "grok-4.1" , DefaultEnabled : true },
140+ "grok-4.5" : {ID : "grok-4.5" , DefaultEnabled : true },
141+ "grok-4.8" : {ID : "grok-4.8" , DefaultEnabled : false },
142+ }
143+ got := relatedBakedInModel (models , "grok-4.6" )
144+ if got == nil || got .ID != "grok-4.5" {
145+ t .Fatalf ("closest sibling for grok-4.6 = %#v" , got )
146+ }
147+
148+ models ["grok-4.5-preview" ] = & RegistryModel {ID : "grok-4.5-preview" , DefaultEnabled : true }
149+ got = relatedBakedInModel (models , "grok-4.5-new" )
150+ if got == nil || got .ID != "grok-4.5" {
151+ t .Fatalf ("tied versions should pick lexicographically first enabled id, got %#v" , got )
152+ }
153+ }
154+
155+ func TestMergeConfigProvidersCopiesModalitiesWhenLiveAttachmentIsSet (t * testing.T ) {
156+ registry := NewModelRegistryWithConfig (& config.Config {
157+ Providers : map [string ]* config.ProviderConfig {
158+ "xai" : {
159+ CustomModels : []config.CustomModelConfig {{
160+ ID : "grok-4.6" , Name : "Grok 4.6" , ToolCall : true , Managed : true , Attachment : true ,
161+ }},
162+ },
163+ },
164+ })
165+ _ , got , ok := registry .LookupModel ("xai" , "grok-4.6" )
166+ if ! ok || got == nil {
167+ t .Fatal ("managed grok-4.6 was not merged" )
168+ }
169+ if ! got .Attachment || ! got .SupportsImageInput () {
170+ t .Fatalf ("live attachment should still copy related modalities: %#v" , got )
171+ }
172+ }
0 commit comments