Skip to content

Commit ef90564

Browse files
authored
feat: Include AI SDK version in tracking information (#985)
1 parent 960a499 commit ef90564

File tree

6 files changed

+65
-45
lines changed

6 files changed

+65
-45
lines changed

packages/sdk/server-ai/__tests__/LDAIConfigTrackerImpl.test.ts

Lines changed: 50 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { LDContext } from '@launchdarkly/js-server-sdk-common';
22

3+
import { name as aiSdkName, version as aiSdkVersion } from '../package.json';
34
import { LDFeedbackKind } from '../src/api/metrics';
45
import { LDAIConfigTrackerImpl } from '../src/LDAIConfigTrackerImpl';
56
import { LDClientMin } from '../src/LDClientMin';
@@ -18,6 +19,16 @@ const version = 1;
1819
const modelName = 'test-model';
1920
const providerName = 'test-provider';
2021

22+
const getExpectedTrackData = () => ({
23+
configKey,
24+
variationKey,
25+
version,
26+
modelName,
27+
providerName,
28+
aiSdkName,
29+
aiSdkVersion,
30+
});
31+
2132
beforeEach(() => {
2233
jest.clearAllMocks();
2334
});
@@ -37,7 +48,7 @@ it('tracks duration', () => {
3748
expect(mockTrack).toHaveBeenCalledWith(
3849
'$ld:ai:duration:total',
3950
testContext,
40-
{ configKey, variationKey, version, modelName, providerName },
51+
getExpectedTrackData(),
4152
1000,
4253
);
4354
});
@@ -60,7 +71,7 @@ it('tracks duration of async function', async () => {
6071
expect(mockTrack).toHaveBeenCalledWith(
6172
'$ld:ai:duration:total',
6273
testContext,
63-
{ configKey, variationKey, version, modelName, providerName },
74+
getExpectedTrackData(),
6475
1000,
6576
);
6677
});
@@ -80,7 +91,7 @@ it('tracks time to first token', () => {
8091
expect(mockTrack).toHaveBeenCalledWith(
8192
'$ld:ai:tokens:ttf',
8293
testContext,
83-
{ configKey, variationKey, version, modelName, providerName },
94+
getExpectedTrackData(),
8495
1000,
8596
);
8697
});
@@ -100,7 +111,7 @@ it('tracks positive feedback', () => {
100111
expect(mockTrack).toHaveBeenCalledWith(
101112
'$ld:ai:feedback:user:positive',
102113
testContext,
103-
{ configKey, variationKey, version, modelName, providerName },
114+
getExpectedTrackData(),
104115
1,
105116
);
106117
});
@@ -120,7 +131,7 @@ it('tracks negative feedback', () => {
120131
expect(mockTrack).toHaveBeenCalledWith(
121132
'$ld:ai:feedback:user:negative',
122133
testContext,
123-
{ configKey, variationKey, version, modelName, providerName },
134+
getExpectedTrackData(),
124135
1,
125136
);
126137
});
@@ -140,7 +151,7 @@ it('tracks success', () => {
140151
expect(mockTrack).toHaveBeenCalledWith(
141152
'$ld:ai:generation:success',
142153
testContext,
143-
{ configKey, variationKey, version, modelName, providerName },
154+
getExpectedTrackData(),
144155
1,
145156
);
146157
});
@@ -172,14 +183,14 @@ it('tracks OpenAI usage', async () => {
172183
expect(mockTrack).toHaveBeenCalledWith(
173184
'$ld:ai:duration:total',
174185
testContext,
175-
{ configKey, variationKey, version, modelName, providerName },
186+
getExpectedTrackData(),
176187
1000,
177188
);
178189

179190
expect(mockTrack).toHaveBeenCalledWith(
180191
'$ld:ai:generation:success',
181192
testContext,
182-
{ configKey, variationKey, version, modelName, providerName },
193+
getExpectedTrackData(),
183194
1,
184195
);
185196

@@ -193,21 +204,21 @@ it('tracks OpenAI usage', async () => {
193204
expect(mockTrack).toHaveBeenCalledWith(
194205
'$ld:ai:tokens:total',
195206
testContext,
196-
{ configKey, variationKey, version, modelName, providerName },
207+
getExpectedTrackData(),
197208
TOTAL_TOKENS,
198209
);
199210

200211
expect(mockTrack).toHaveBeenCalledWith(
201212
'$ld:ai:tokens:input',
202213
testContext,
203-
{ configKey, variationKey, version, modelName, providerName },
214+
getExpectedTrackData(),
204215
PROMPT_TOKENS,
205216
);
206217

207218
expect(mockTrack).toHaveBeenCalledWith(
208219
'$ld:ai:tokens:output',
209220
testContext,
210-
{ configKey, variationKey, version, modelName, providerName },
221+
getExpectedTrackData(),
211222
COMPLETION_TOKENS,
212223
);
213224
});
@@ -234,14 +245,14 @@ it('tracks error when OpenAI metrics function throws', async () => {
234245
expect(mockTrack).toHaveBeenCalledWith(
235246
'$ld:ai:duration:total',
236247
testContext,
237-
{ configKey, variationKey, version, modelName, providerName },
248+
getExpectedTrackData(),
238249
1000,
239250
);
240251

241252
expect(mockTrack).toHaveBeenCalledWith(
242253
'$ld:ai:generation:error',
243254
testContext,
244-
{ configKey, variationKey, version, modelName, providerName },
255+
getExpectedTrackData(),
245256
1,
246257
);
247258

@@ -283,7 +294,7 @@ it('tracks Bedrock conversation with successful response', () => {
283294
expect(mockTrack).toHaveBeenCalledWith(
284295
'$ld:ai:generation:success',
285296
testContext,
286-
{ configKey, variationKey, version, modelName, providerName },
297+
getExpectedTrackData(),
287298
1,
288299
);
289300

@@ -297,28 +308,28 @@ it('tracks Bedrock conversation with successful response', () => {
297308
expect(mockTrack).toHaveBeenCalledWith(
298309
'$ld:ai:duration:total',
299310
testContext,
300-
{ configKey, variationKey, version, modelName, providerName },
311+
getExpectedTrackData(),
301312
500,
302313
);
303314

304315
expect(mockTrack).toHaveBeenCalledWith(
305316
'$ld:ai:tokens:total',
306317
testContext,
307-
{ configKey, variationKey, version, modelName, providerName },
318+
getExpectedTrackData(),
308319
TOTAL_TOKENS,
309320
);
310321

311322
expect(mockTrack).toHaveBeenCalledWith(
312323
'$ld:ai:tokens:input',
313324
testContext,
314-
{ configKey, variationKey, version, modelName, providerName },
325+
getExpectedTrackData(),
315326
PROMPT_TOKENS,
316327
);
317328

318329
expect(mockTrack).toHaveBeenCalledWith(
319330
'$ld:ai:tokens:output',
320331
testContext,
321-
{ configKey, variationKey, version, modelName, providerName },
332+
getExpectedTrackData(),
322333
COMPLETION_TOKENS,
323334
);
324335
});
@@ -345,7 +356,7 @@ it('tracks Bedrock conversation with error response', () => {
345356
expect(mockTrack).toHaveBeenCalledWith(
346357
'$ld:ai:generation:error',
347358
testContext,
348-
{ configKey, variationKey, version, modelName, providerName },
359+
getExpectedTrackData(),
349360
1,
350361
);
351362

@@ -385,14 +396,14 @@ describe('Vercel AI SDK generateText', () => {
385396
expect(mockTrack).toHaveBeenCalledWith(
386397
'$ld:ai:duration:total',
387398
testContext,
388-
{ configKey, variationKey, version, modelName, providerName },
399+
getExpectedTrackData(),
389400
1000,
390401
);
391402

392403
expect(mockTrack).toHaveBeenCalledWith(
393404
'$ld:ai:generation:success',
394405
testContext,
395-
{ configKey, variationKey, version, modelName, providerName },
406+
getExpectedTrackData(),
396407
1,
397408
);
398409

@@ -406,21 +417,21 @@ describe('Vercel AI SDK generateText', () => {
406417
expect(mockTrack).toHaveBeenCalledWith(
407418
'$ld:ai:tokens:total',
408419
testContext,
409-
{ configKey, variationKey, version, modelName, providerName },
420+
getExpectedTrackData(),
410421
TOTAL_TOKENS,
411422
);
412423

413424
expect(mockTrack).toHaveBeenCalledWith(
414425
'$ld:ai:tokens:input',
415426
testContext,
416-
{ configKey, variationKey, version, modelName, providerName },
427+
getExpectedTrackData(),
417428
PROMPT_TOKENS,
418429
);
419430

420431
expect(mockTrack).toHaveBeenCalledWith(
421432
'$ld:ai:tokens:output',
422433
testContext,
423-
{ configKey, variationKey, version, modelName, providerName },
434+
getExpectedTrackData(),
424435
COMPLETION_TOKENS,
425436
);
426437
});
@@ -447,14 +458,14 @@ describe('Vercel AI SDK generateText', () => {
447458
expect(mockTrack).toHaveBeenCalledWith(
448459
'$ld:ai:duration:total',
449460
testContext,
450-
{ configKey, variationKey, version, modelName, providerName },
461+
getExpectedTrackData(),
451462
1000,
452463
);
453464

454465
expect(mockTrack).toHaveBeenCalledWith(
455466
'$ld:ai:generation:error',
456467
testContext,
457-
{ configKey, variationKey, version, modelName, providerName },
468+
getExpectedTrackData(),
458469
1,
459470
);
460471

@@ -491,21 +502,21 @@ it('tracks tokens', () => {
491502
expect(mockTrack).toHaveBeenCalledWith(
492503
'$ld:ai:tokens:total',
493504
testContext,
494-
{ configKey, variationKey, version, modelName, providerName },
505+
getExpectedTrackData(),
495506
TOTAL_TOKENS,
496507
);
497508

498509
expect(mockTrack).toHaveBeenCalledWith(
499510
'$ld:ai:tokens:input',
500511
testContext,
501-
{ configKey, variationKey, version, modelName, providerName },
512+
getExpectedTrackData(),
502513
PROMPT_TOKENS,
503514
);
504515

505516
expect(mockTrack).toHaveBeenCalledWith(
506517
'$ld:ai:tokens:output',
507518
testContext,
508-
{ configKey, variationKey, version, modelName, providerName },
519+
getExpectedTrackData(),
509520
COMPLETION_TOKENS,
510521
);
511522
});
@@ -537,7 +548,7 @@ it('only tracks non-zero token counts', () => {
537548
expect(mockTrack).toHaveBeenCalledWith(
538549
'$ld:ai:tokens:input',
539550
testContext,
540-
{ configKey, variationKey, version, modelName, providerName },
551+
getExpectedTrackData(),
541552
50,
542553
);
543554

@@ -623,7 +634,7 @@ it('tracks duration when async function throws', async () => {
623634
expect(mockTrack).toHaveBeenCalledWith(
624635
'$ld:ai:duration:total',
625636
testContext,
626-
{ configKey, variationKey, version, modelName, providerName },
637+
getExpectedTrackData(),
627638
1000,
628639
);
629640
});
@@ -643,7 +654,7 @@ it('tracks error', () => {
643654
expect(mockTrack).toHaveBeenCalledWith(
644655
'$ld:ai:generation:error',
645656
testContext,
646-
{ configKey, variationKey, version, modelName, providerName },
657+
getExpectedTrackData(),
647658
1,
648659
);
649660
});
@@ -679,27 +690,27 @@ describe('trackMetricsOf', () => {
679690
expect(mockTrack).toHaveBeenCalledWith(
680691
'$ld:ai:generation:success',
681692
testContext,
682-
{ configKey, variationKey, version, modelName, providerName },
693+
getExpectedTrackData(),
683694
1,
684695
);
685696

686697
// Should track token usage
687698
expect(mockTrack).toHaveBeenCalledWith(
688699
'$ld:ai:tokens:total',
689700
testContext,
690-
{ configKey, variationKey, version, modelName, providerName },
701+
getExpectedTrackData(),
691702
100,
692703
);
693704
expect(mockTrack).toHaveBeenCalledWith(
694705
'$ld:ai:tokens:input',
695706
testContext,
696-
{ configKey, variationKey, version, modelName, providerName },
707+
getExpectedTrackData(),
697708
50,
698709
);
699710
expect(mockTrack).toHaveBeenCalledWith(
700711
'$ld:ai:tokens:output',
701712
testContext,
702-
{ configKey, variationKey, version, modelName, providerName },
713+
getExpectedTrackData(),
703714
50,
704715
);
705716
});
@@ -729,7 +740,7 @@ describe('trackMetricsOf', () => {
729740
expect(mockTrack).toHaveBeenCalledWith(
730741
'$ld:ai:generation:error',
731742
testContext,
732-
{ configKey, variationKey, version, modelName, providerName },
743+
getExpectedTrackData(),
733744
1,
734745
);
735746
});
@@ -755,7 +766,7 @@ describe('trackMetricsOf', () => {
755766
expect(mockTrack).toHaveBeenCalledWith(
756767
'$ld:ai:generation:error',
757768
testContext,
758-
{ configKey, variationKey, version, modelName, providerName },
769+
getExpectedTrackData(),
759770
1,
760771
);
761772

@@ -789,7 +800,7 @@ describe('trackMetricsOf', () => {
789800
expect(mockTrack).toHaveBeenCalledWith(
790801
'$ld:ai:generation:success',
791802
testContext,
792-
{ configKey, variationKey, version, modelName, providerName },
803+
getExpectedTrackData(),
793804
1,
794805
);
795806

packages/sdk/server-ai/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
"type": "git",
88
"url": "https://github.com/launchdarkly/js-core.git"
99
},
10-
"main": "dist/index.js",
11-
"types": "dist/index.d.ts",
10+
"main": "dist/src/index.js",
11+
"types": "dist/src/index.d.ts",
1212
"type": "commonjs",
1313
"scripts": {
1414
"build": "npx tsc",

packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { LDContext } from '@launchdarkly/js-server-sdk-common';
22

3+
import { name as aiSdkName, version as aiSdkVersion } from '../package.json';
34
import { LDAIConfigTracker } from './api/config';
45
import { LDAIMetricSummary } from './api/config/LDAIConfigTracker';
56
import { EvalScore } from './api/judge/types';
@@ -32,13 +33,17 @@ export class LDAIConfigTrackerImpl implements LDAIConfigTracker {
3233
version: number;
3334
modelName: string;
3435
providerName: string;
36+
aiSdkName: string;
37+
aiSdkVersion: string;
3538
} {
3639
return {
3740
variationKey: this._variationKey,
3841
configKey: this._configKey,
3942
version: this._version,
4043
modelName: this._modelName,
4144
providerName: this._providerName,
45+
aiSdkName,
46+
aiSdkVersion,
4247
};
4348
}
4449

0 commit comments

Comments
 (0)