@@ -150,6 +150,82 @@ func TestParseModelName(t *testing.T) {
150150 }
151151}
152152
153+ func TestParseModelKeyAndVersion (t * testing.T ) {
154+ // modelKey/modelVersion are intentionally not exposed on Config (they'd read as properties of
155+ // the LLM itself, e.g. a version like "5.4"); the only place they surface is the tracker's
156+ // stamped event data, mirroring variationKey/version.
157+ tests := []struct {
158+ name string
159+ json []byte
160+ expectedKey string
161+ expectedVersion int
162+ }{
163+ {
164+ name : "missing" ,
165+ json : []byte (`{"model": {"name": "gpt-4"}}` ),
166+ expectedKey : "" ,
167+ expectedVersion : 1 ,
168+ },
169+ {
170+ name : "modelKey and modelVersion set" ,
171+ json : []byte (`{"model": {"name": "gpt-4"}, "_ldMeta": {"modelKey": "my-model", "modelVersion": 2}}` ),
172+ expectedKey : "my-model" ,
173+ expectedVersion : 2 ,
174+ },
175+ {
176+ name : "modelVersion only" ,
177+ json : []byte (`{"model": {"name": "gpt-4"}, "_ldMeta": {"modelVersion": 3}}` ),
178+ expectedKey : "" ,
179+ expectedVersion : 3 ,
180+ },
181+ }
182+
183+ for _ , test := range tests {
184+ t .Run (test .name , func (t * testing.T ) {
185+ mockSDK := newMockSDK (test .json , nil )
186+ client , err := NewClient (mockSDK )
187+ require .NoError (t , err )
188+ require .NotNil (t , client )
189+ mockSDK .events = nil
190+
191+ defaultVal := NewConfig ().Enable ().WithMessage ("hello" , datamodel .User ).Build ()
192+ cfg := client .CompletionConfig ("key" , ldcontext .New ("user" ), defaultVal , nil )
193+ tracker := cfg .CreateTracker ()
194+ require .NotNil (t , tracker )
195+ assert .NoError (t , tracker .TrackSuccess ())
196+
197+ require .NotEmpty (t , mockSDK .events )
198+ data := mockSDK .events [len (mockSDK .events )- 1 ].data
199+ assert .Equal (t , test .expectedKey , data .GetByKey ("modelKey" ).StringValue ())
200+ assert .Equal (t , test .expectedVersion , data .GetByKey ("modelVersion" ).IntValue ())
201+ })
202+ }
203+ }
204+
205+ func TestCreateTrackerStampsModelKeyAndVersionOnTrackData (t * testing.T ) {
206+ configJSON := []byte (`{
207+ "_ldMeta": {"variationKey": "var-1", "enabled": true, "version": 1, "modelKey": "my-model", "modelVersion": 2},
208+ "model": {"name": "gpt-4"},
209+ "provider": {"name": "openai"},
210+ "messages": [{"content": "hello", "role": "user"}]
211+ }` )
212+
213+ mockSDK := newMockSDK (configJSON , nil )
214+ client , err := NewClient (mockSDK )
215+ require .NoError (t , err )
216+ mockSDK .events = nil
217+
218+ cfg := client .CompletionConfig ("my-config" , ldcontext .New ("user" ), Disabled (), nil )
219+ tracker := cfg .CreateTracker ()
220+ require .NotNil (t , tracker )
221+ assert .NoError (t , tracker .TrackSuccess ())
222+
223+ require .NotEmpty (t , mockSDK .events )
224+ data := mockSDK .events [len (mockSDK .events )- 1 ].data
225+ assert .Equal (t , "my-model" , data .GetByKey ("modelKey" ).StringValue ())
226+ assert .Equal (t , 2 , data .GetByKey ("modelVersion" ).IntValue ())
227+ }
228+
153229func TestParseProviderName (t * testing.T ) {
154230 tests := []struct {
155231 name string
@@ -1009,6 +1085,8 @@ func TestClient_CreateTracker_RoundTrip(t *testing.T) {
10091085 // modelName and providerName should be empty on reconstructed tracker
10101086 assert .Equal (t , "" , feedbackEvent .data .GetByKey ("modelName" ).StringValue ())
10111087 assert .Equal (t , "" , feedbackEvent .data .GetByKey ("providerName" ).StringValue ())
1088+ assert .False (t , feedbackEvent .data .GetByKey ("modelKey" ).IsDefined ())
1089+ assert .Equal (t , 1 , feedbackEvent .data .GetByKey ("modelVersion" ).IntValue ())
10121090}
10131091
10141092func TestClient_CreateTracker_InvalidToken (t * testing.T ) {
0 commit comments