diff --git a/packages/sdk/server-ai/__tests__/LDAIConfigTrackerImpl.test.ts b/packages/sdk/server-ai/__tests__/LDAIConfigTrackerImpl.test.ts index 1cf9f839b..33ec018ca 100644 --- a/packages/sdk/server-ai/__tests__/LDAIConfigTrackerImpl.test.ts +++ b/packages/sdk/server-ai/__tests__/LDAIConfigTrackerImpl.test.ts @@ -1,5 +1,6 @@ import { LDContext } from '@launchdarkly/js-server-sdk-common'; +import { name as aiSdkName, version as aiSdkVersion } from '../package.json'; import { LDFeedbackKind } from '../src/api/metrics'; import { LDAIConfigTrackerImpl } from '../src/LDAIConfigTrackerImpl'; import { LDClientMin } from '../src/LDClientMin'; @@ -18,6 +19,16 @@ const version = 1; const modelName = 'test-model'; const providerName = 'test-provider'; +const getExpectedTrackData = () => ({ + configKey, + variationKey, + version, + modelName, + providerName, + aiSdkName, + aiSdkVersion, +}); + beforeEach(() => { jest.clearAllMocks(); }); @@ -37,7 +48,7 @@ it('tracks duration', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:duration:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1000, ); }); @@ -60,7 +71,7 @@ it('tracks duration of async function', async () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:duration:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1000, ); }); @@ -80,7 +91,7 @@ it('tracks time to first token', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:ttf', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1000, ); }); @@ -100,7 +111,7 @@ it('tracks positive feedback', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:feedback:user:positive', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); }); @@ -120,7 +131,7 @@ it('tracks negative feedback', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:feedback:user:negative', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); }); @@ -140,7 +151,7 @@ it('tracks success', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:success', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); }); @@ -172,14 +183,14 @@ it('tracks OpenAI usage', async () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:duration:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1000, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:success', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); @@ -193,21 +204,21 @@ it('tracks OpenAI usage', async () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), TOTAL_TOKENS, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:input', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), PROMPT_TOKENS, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:output', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), COMPLETION_TOKENS, ); }); @@ -234,14 +245,14 @@ it('tracks error when OpenAI metrics function throws', async () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:duration:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1000, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:error', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); @@ -283,7 +294,7 @@ it('tracks Bedrock conversation with successful response', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:success', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); @@ -297,28 +308,28 @@ it('tracks Bedrock conversation with successful response', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:duration:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 500, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), TOTAL_TOKENS, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:input', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), PROMPT_TOKENS, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:output', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), COMPLETION_TOKENS, ); }); @@ -345,7 +356,7 @@ it('tracks Bedrock conversation with error response', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:error', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); @@ -385,14 +396,14 @@ describe('Vercel AI SDK generateText', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:duration:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1000, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:success', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); @@ -406,21 +417,21 @@ describe('Vercel AI SDK generateText', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), TOTAL_TOKENS, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:input', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), PROMPT_TOKENS, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:output', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), COMPLETION_TOKENS, ); }); @@ -447,14 +458,14 @@ describe('Vercel AI SDK generateText', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:duration:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1000, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:error', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); @@ -491,21 +502,21 @@ it('tracks tokens', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), TOTAL_TOKENS, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:input', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), PROMPT_TOKENS, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:output', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), COMPLETION_TOKENS, ); }); @@ -537,7 +548,7 @@ it('only tracks non-zero token counts', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:input', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 50, ); @@ -623,7 +634,7 @@ it('tracks duration when async function throws', async () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:duration:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1000, ); }); @@ -643,7 +654,7 @@ it('tracks error', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:error', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); }); @@ -679,7 +690,7 @@ describe('trackMetricsOf', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:success', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); @@ -687,19 +698,19 @@ describe('trackMetricsOf', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:total', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 100, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:input', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 50, ); expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:tokens:output', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 50, ); }); @@ -729,7 +740,7 @@ describe('trackMetricsOf', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:error', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); }); @@ -755,7 +766,7 @@ describe('trackMetricsOf', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:error', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); @@ -789,7 +800,7 @@ describe('trackMetricsOf', () => { expect(mockTrack).toHaveBeenCalledWith( '$ld:ai:generation:success', testContext, - { configKey, variationKey, version, modelName, providerName }, + getExpectedTrackData(), 1, ); diff --git a/packages/sdk/server-ai/package.json b/packages/sdk/server-ai/package.json index 99b5e773a..b29317b3d 100644 --- a/packages/sdk/server-ai/package.json +++ b/packages/sdk/server-ai/package.json @@ -7,8 +7,8 @@ "type": "git", "url": "https://github.com/launchdarkly/js-core.git" }, - "main": "dist/index.js", - "types": "dist/index.d.ts", + "main": "dist/src/index.js", + "types": "dist/src/index.d.ts", "type": "commonjs", "scripts": { "build": "npx tsc", diff --git a/packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts b/packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts index 9990c8505..f4e6624a7 100644 --- a/packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts +++ b/packages/sdk/server-ai/src/LDAIConfigTrackerImpl.ts @@ -1,5 +1,6 @@ import { LDContext } from '@launchdarkly/js-server-sdk-common'; +import { name as aiSdkName, version as aiSdkVersion } from '../package.json'; import { LDAIConfigTracker } from './api/config'; import { LDAIMetricSummary } from './api/config/LDAIConfigTracker'; import { EvalScore } from './api/judge/types'; @@ -32,6 +33,8 @@ export class LDAIConfigTrackerImpl implements LDAIConfigTracker { version: number; modelName: string; providerName: string; + aiSdkName: string; + aiSdkVersion: string; } { return { variationKey: this._variationKey, @@ -39,6 +42,8 @@ export class LDAIConfigTrackerImpl implements LDAIConfigTracker { version: this._version, modelName: this._modelName, providerName: this._providerName, + aiSdkName, + aiSdkVersion, }; } diff --git a/packages/sdk/server-ai/src/api/config/LDAIConfigTracker.ts b/packages/sdk/server-ai/src/api/config/LDAIConfigTracker.ts index 130a8d041..eb9beb258 100644 --- a/packages/sdk/server-ai/src/api/config/LDAIConfigTracker.ts +++ b/packages/sdk/server-ai/src/api/config/LDAIConfigTracker.ts @@ -42,6 +42,10 @@ export interface LDAIConfigTracker { variationKey: string; configKey: string; version: number; + modelName: string; + providerName: string; + aiSdkName: string; + aiSdkVersion: string; }; /** * Track the duration of generation. diff --git a/packages/sdk/server-ai/tsconfig.json b/packages/sdk/server-ai/tsconfig.json index 2d1f62a18..19ba2bdc2 100644 --- a/packages/sdk/server-ai/tsconfig.json +++ b/packages/sdk/server-ai/tsconfig.json @@ -1,6 +1,7 @@ { "compilerOptions": { - "rootDir": "src", + // Uses "." so it can load package.json. + "rootDir": ".", "outDir": "dist", "target": "es2017", "lib": ["es6"], @@ -16,6 +17,5 @@ "stripInternal": true, "moduleResolution": "node" }, - "include": ["src"], - "exclude": ["**/*.test.ts", "dist", "node_modules", "__tests__"] + "exclude": ["**/*.test.ts", "dist", "node_modules", "__tests__", "examples"] } diff --git a/packages/sdk/server-ai/tsconfig.ref.json b/packages/sdk/server-ai/tsconfig.ref.json index 0c86b2c55..34a1cb607 100644 --- a/packages/sdk/server-ai/tsconfig.ref.json +++ b/packages/sdk/server-ai/tsconfig.ref.json @@ -1,6 +1,6 @@ { "extends": "./tsconfig.json", - "include": ["src/**/*"], + "include": ["src/**/*", "package.json"], "compilerOptions": { "composite": true }