@launchdarkly/server-sdk-ai 0.12.3 → 0.14.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (242) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/README.md +2 -2
  3. package/__tests__/Judge.test.ts +496 -0
  4. package/__tests__/LDAIClientImpl.test.ts +530 -323
  5. package/__tests__/LDAIConfigTrackerImpl.test.ts +50 -290
  6. package/__tests__/TrackedChat.test.ts +4 -5
  7. package/dist/package.json +53 -0
  8. package/dist/src/LDAIClientImpl.d.ts +39 -0
  9. package/dist/src/LDAIClientImpl.d.ts.map +1 -0
  10. package/dist/src/LDAIClientImpl.js +164 -0
  11. package/dist/src/LDAIClientImpl.js.map +1 -0
  12. package/dist/{LDAIConfigTrackerImpl.d.ts → src/LDAIConfigTrackerImpl.d.ts} +13 -11
  13. package/dist/src/LDAIConfigTrackerImpl.d.ts.map +1 -0
  14. package/dist/{LDAIConfigTrackerImpl.js → src/LDAIConfigTrackerImpl.js} +59 -44
  15. package/dist/src/LDAIConfigTrackerImpl.js.map +1 -0
  16. package/dist/src/LDClientMin.d.ts.map +1 -0
  17. package/dist/{LDClientMin.js.map → src/LDClientMin.js.map} +1 -1
  18. package/dist/src/api/LDAIClient.d.ts +258 -0
  19. package/dist/src/api/LDAIClient.d.ts.map +1 -0
  20. package/dist/{api → src/api}/LDAIClient.js.map +1 -1
  21. package/dist/{api → src/api}/chat/TrackedChat.d.ts +22 -4
  22. package/dist/src/api/chat/TrackedChat.d.ts.map +1 -0
  23. package/dist/{api → src/api}/chat/TrackedChat.js +43 -2
  24. package/dist/src/api/chat/TrackedChat.js.map +1 -0
  25. package/dist/src/api/chat/index.d.ts.map +1 -0
  26. package/dist/src/api/chat/index.js.map +1 -0
  27. package/dist/src/api/chat/types.d.ts +22 -0
  28. package/dist/src/api/chat/types.d.ts.map +1 -0
  29. package/dist/{api → src/api}/chat/types.js.map +1 -1
  30. package/dist/{api → src/api}/config/LDAIConfigTracker.d.ts +41 -22
  31. package/dist/src/api/config/LDAIConfigTracker.d.ts.map +1 -0
  32. package/dist/src/api/config/LDAIConfigTracker.js.map +1 -0
  33. package/dist/src/api/config/LDAIConfigUtils.d.ts +2 -0
  34. package/dist/src/api/config/LDAIConfigUtils.d.ts.map +1 -0
  35. package/dist/src/api/config/LDAIConfigUtils.js +141 -0
  36. package/dist/src/api/config/LDAIConfigUtils.js.map +1 -0
  37. package/dist/src/api/config/index.d.ts +3 -0
  38. package/dist/src/api/config/index.d.ts.map +1 -0
  39. package/dist/{api/agents → src/api/config}/index.js +1 -1
  40. package/dist/src/api/config/index.js.map +1 -0
  41. package/dist/src/api/config/types.d.ts +202 -0
  42. package/dist/src/api/config/types.d.ts.map +1 -0
  43. package/dist/{api/agents/LDAIAgent.js → src/api/config/types.js} +1 -1
  44. package/dist/src/api/config/types.js.map +1 -0
  45. package/dist/{api → src/api}/index.d.ts +1 -1
  46. package/dist/src/api/index.d.ts.map +1 -0
  47. package/dist/{api → src/api}/index.js +1 -1
  48. package/dist/src/api/index.js.map +1 -0
  49. package/dist/src/api/judge/EvaluationSchemaBuilder.d.ts +11 -0
  50. package/dist/src/api/judge/EvaluationSchemaBuilder.d.ts.map +1 -0
  51. package/dist/src/api/judge/EvaluationSchemaBuilder.js +52 -0
  52. package/dist/src/api/judge/EvaluationSchemaBuilder.js.map +1 -0
  53. package/dist/src/api/judge/Judge.d.ts +63 -0
  54. package/dist/src/api/judge/Judge.d.ts.map +1 -0
  55. package/dist/src/api/judge/Judge.js +149 -0
  56. package/dist/src/api/judge/Judge.js.map +1 -0
  57. package/dist/src/api/judge/index.d.ts +3 -0
  58. package/dist/src/api/judge/index.d.ts.map +1 -0
  59. package/dist/src/api/judge/index.js +6 -0
  60. package/dist/src/api/judge/index.js.map +1 -0
  61. package/dist/src/api/judge/types.d.ts +35 -0
  62. package/dist/src/api/judge/types.d.ts.map +1 -0
  63. package/dist/{api/config/LDAIConfig.js → src/api/judge/types.js} +1 -1
  64. package/dist/src/api/judge/types.js.map +1 -0
  65. package/dist/src/api/metrics/BedrockTokenUsage.d.ts.map +1 -0
  66. package/dist/src/api/metrics/BedrockTokenUsage.js.map +1 -0
  67. package/dist/src/api/metrics/LDAIMetrics.d.ts.map +1 -0
  68. package/dist/src/api/metrics/LDAIMetrics.js.map +1 -0
  69. package/dist/src/api/metrics/LDFeedbackKind.d.ts.map +1 -0
  70. package/dist/src/api/metrics/LDFeedbackKind.js.map +1 -0
  71. package/dist/src/api/metrics/LDTokenUsage.d.ts.map +1 -0
  72. package/dist/src/api/metrics/LDTokenUsage.js.map +1 -0
  73. package/dist/src/api/metrics/OpenAiUsage.d.ts.map +1 -0
  74. package/dist/src/api/metrics/OpenAiUsage.js.map +1 -0
  75. package/dist/src/api/metrics/VercelAISDKTokenUsage.d.ts.map +1 -0
  76. package/dist/src/api/metrics/VercelAISDKTokenUsage.js.map +1 -0
  77. package/dist/src/api/metrics/index.d.ts.map +1 -0
  78. package/dist/src/api/metrics/index.js.map +1 -0
  79. package/dist/{api → src/api}/providers/AIProvider.d.ts +20 -3
  80. package/dist/src/api/providers/AIProvider.d.ts.map +1 -0
  81. package/dist/src/api/providers/AIProvider.js +88 -0
  82. package/dist/src/api/providers/AIProvider.js.map +1 -0
  83. package/dist/{api → src/api}/providers/AIProviderFactory.d.ts +2 -2
  84. package/dist/src/api/providers/AIProviderFactory.d.ts.map +1 -0
  85. package/dist/src/api/providers/AIProviderFactory.js.map +1 -0
  86. package/dist/src/api/providers/index.d.ts.map +1 -0
  87. package/dist/src/api/providers/index.js.map +1 -0
  88. package/dist/src/index.d.ts.map +1 -0
  89. package/dist/src/index.js.map +1 -0
  90. package/docs/assets/search.js +1 -1
  91. package/docs/classes/AIProvider.html +55 -20
  92. package/docs/classes/AIProviderFactory.html +27 -17
  93. package/docs/classes/Judge.html +322 -0
  94. package/docs/classes/TrackedChat.html +97 -29
  95. package/docs/enums/LDFeedbackKind.html +22 -12
  96. package/docs/functions/createBedrockTokenUsage.html +20 -10
  97. package/docs/functions/createOpenAiUsage.html +20 -10
  98. package/docs/functions/createVercelAISDKTokenUsage.html +20 -10
  99. package/docs/functions/initAi.html +20 -10
  100. package/docs/index.html +36 -16
  101. package/docs/interfaces/ChatResponse.html +35 -14
  102. package/docs/interfaces/EvalScore.html +119 -0
  103. package/docs/interfaces/JudgeResponse.html +129 -0
  104. package/docs/interfaces/LDAIAgentConfig.html +81 -33
  105. package/docs/interfaces/{LDAIAgent.html → LDAIAgentConfigDefault.html} +51 -41
  106. package/docs/interfaces/LDAIAgentRequestConfig.html +129 -0
  107. package/docs/interfaces/LDAIClient.html +234 -40
  108. package/docs/interfaces/{VercelAISDKConfig.html → LDAICompletionConfig.html} +86 -86
  109. package/docs/interfaces/LDAICompletionConfigDefault.html +155 -0
  110. package/docs/interfaces/LDAIConfig.html +45 -75
  111. package/docs/interfaces/LDAIConfigDefault.html +133 -0
  112. package/docs/interfaces/LDAIConfigTracker.html +140 -59
  113. package/docs/interfaces/LDAIJudgeConfig.html +167 -0
  114. package/docs/interfaces/LDAIJudgeConfigDefault.html +155 -0
  115. package/docs/interfaces/LDAIMetrics.html +22 -12
  116. package/docs/interfaces/LDJudge.html +119 -0
  117. package/docs/interfaces/{VercelAISDKMapOptions.html → LDJudgeConfiguration.html} +36 -19
  118. package/docs/interfaces/LDLogger.html +19 -9
  119. package/docs/interfaces/LDMessage.html +22 -12
  120. package/docs/interfaces/LDModelConfig.html +23 -13
  121. package/docs/interfaces/LDProviderConfig.html +21 -11
  122. package/docs/interfaces/LDTokenUsage.html +23 -13
  123. package/docs/interfaces/StructuredResponse.html +129 -0
  124. package/docs/types/{VercelAISDKProvider.html → LDAIConfigDefaultKind.html} +26 -31
  125. package/docs/types/{LDAIAgentDefaults.html → LDAIConfigKind.html} +24 -14
  126. package/docs/types/{LDAIDefaults.html → LDAIConfigMode.html} +24 -24
  127. package/docs/types/SupportedAIProvider.html +20 -10
  128. package/docs/variables/SUPPORTED_AI_PROVIDERS.html +20 -10
  129. package/package.json +3 -3
  130. package/src/LDAIClientImpl.ts +222 -176
  131. package/src/LDAIConfigTrackerImpl.ts +73 -54
  132. package/src/api/LDAIClient.ts +166 -33
  133. package/src/api/chat/TrackedChat.ts +64 -5
  134. package/src/api/chat/types.ts +8 -1
  135. package/src/api/config/LDAIConfigTracker.ts +46 -27
  136. package/src/api/config/LDAIConfigUtils.ts +201 -0
  137. package/src/api/config/index.ts +2 -2
  138. package/src/api/config/types.ts +256 -0
  139. package/src/api/index.ts +1 -1
  140. package/src/api/judge/EvaluationSchemaBuilder.ts +54 -0
  141. package/src/api/judge/Judge.ts +216 -0
  142. package/src/api/judge/index.ts +2 -0
  143. package/src/api/judge/types.ts +39 -0
  144. package/src/api/providers/AIProvider.ts +54 -3
  145. package/src/api/providers/AIProviderFactory.ts +4 -4
  146. package/tsconfig.json +3 -3
  147. package/tsconfig.ref.json +1 -1
  148. package/__tests__/LDAIConfigMapper.test.ts +0 -159
  149. package/dist/LDAIClientImpl.d.ts +0 -23
  150. package/dist/LDAIClientImpl.d.ts.map +0 -1
  151. package/dist/LDAIClientImpl.js +0 -128
  152. package/dist/LDAIClientImpl.js.map +0 -1
  153. package/dist/LDAIConfigMapper.d.ts +0 -10
  154. package/dist/LDAIConfigMapper.d.ts.map +0 -1
  155. package/dist/LDAIConfigMapper.js +0 -55
  156. package/dist/LDAIConfigMapper.js.map +0 -1
  157. package/dist/LDAIConfigTrackerImpl.d.ts.map +0 -1
  158. package/dist/LDAIConfigTrackerImpl.js.map +0 -1
  159. package/dist/LDClientMin.d.ts.map +0 -1
  160. package/dist/api/LDAIClient.d.ts +0 -169
  161. package/dist/api/LDAIClient.d.ts.map +0 -1
  162. package/dist/api/agents/LDAIAgent.d.ts +0 -32
  163. package/dist/api/agents/LDAIAgent.d.ts.map +0 -1
  164. package/dist/api/agents/LDAIAgent.js.map +0 -1
  165. package/dist/api/agents/index.d.ts +0 -2
  166. package/dist/api/agents/index.d.ts.map +0 -1
  167. package/dist/api/agents/index.js.map +0 -1
  168. package/dist/api/chat/TrackedChat.d.ts.map +0 -1
  169. package/dist/api/chat/TrackedChat.js.map +0 -1
  170. package/dist/api/chat/index.d.ts.map +0 -1
  171. package/dist/api/chat/index.js.map +0 -1
  172. package/dist/api/chat/types.d.ts +0 -16
  173. package/dist/api/chat/types.d.ts.map +0 -1
  174. package/dist/api/config/LDAIConfig.d.ts +0 -92
  175. package/dist/api/config/LDAIConfig.d.ts.map +0 -1
  176. package/dist/api/config/LDAIConfig.js.map +0 -1
  177. package/dist/api/config/LDAIConfigTracker.d.ts.map +0 -1
  178. package/dist/api/config/LDAIConfigTracker.js.map +0 -1
  179. package/dist/api/config/VercelAISDK.d.ts +0 -19
  180. package/dist/api/config/VercelAISDK.d.ts.map +0 -1
  181. package/dist/api/config/VercelAISDK.js +0 -3
  182. package/dist/api/config/VercelAISDK.js.map +0 -1
  183. package/dist/api/config/index.d.ts +0 -4
  184. package/dist/api/config/index.d.ts.map +0 -1
  185. package/dist/api/config/index.js +0 -19
  186. package/dist/api/config/index.js.map +0 -1
  187. package/dist/api/index.d.ts.map +0 -1
  188. package/dist/api/index.js.map +0 -1
  189. package/dist/api/metrics/BedrockTokenUsage.d.ts.map +0 -1
  190. package/dist/api/metrics/BedrockTokenUsage.js.map +0 -1
  191. package/dist/api/metrics/LDAIMetrics.d.ts.map +0 -1
  192. package/dist/api/metrics/LDAIMetrics.js.map +0 -1
  193. package/dist/api/metrics/LDFeedbackKind.d.ts.map +0 -1
  194. package/dist/api/metrics/LDFeedbackKind.js.map +0 -1
  195. package/dist/api/metrics/LDTokenUsage.d.ts.map +0 -1
  196. package/dist/api/metrics/LDTokenUsage.js.map +0 -1
  197. package/dist/api/metrics/OpenAiUsage.d.ts.map +0 -1
  198. package/dist/api/metrics/OpenAiUsage.js.map +0 -1
  199. package/dist/api/metrics/VercelAISDKTokenUsage.d.ts.map +0 -1
  200. package/dist/api/metrics/VercelAISDKTokenUsage.js.map +0 -1
  201. package/dist/api/metrics/index.d.ts.map +0 -1
  202. package/dist/api/metrics/index.js.map +0 -1
  203. package/dist/api/providers/AIProvider.d.ts.map +0 -1
  204. package/dist/api/providers/AIProvider.js +0 -31
  205. package/dist/api/providers/AIProvider.js.map +0 -1
  206. package/dist/api/providers/AIProviderFactory.d.ts.map +0 -1
  207. package/dist/api/providers/AIProviderFactory.js.map +0 -1
  208. package/dist/api/providers/index.d.ts.map +0 -1
  209. package/dist/api/providers/index.js.map +0 -1
  210. package/dist/index.d.ts.map +0 -1
  211. package/dist/index.js.map +0 -1
  212. package/src/LDAIConfigMapper.ts +0 -65
  213. package/src/api/agents/LDAIAgent.ts +0 -36
  214. package/src/api/agents/index.ts +0 -1
  215. package/src/api/config/LDAIConfig.ts +0 -101
  216. package/src/api/config/VercelAISDK.ts +0 -21
  217. /package/dist/{LDClientMin.d.ts → src/LDClientMin.d.ts} +0 -0
  218. /package/dist/{LDClientMin.js → src/LDClientMin.js} +0 -0
  219. /package/dist/{api → src/api}/LDAIClient.js +0 -0
  220. /package/dist/{api → src/api}/chat/index.d.ts +0 -0
  221. /package/dist/{api → src/api}/chat/index.js +0 -0
  222. /package/dist/{api → src/api}/chat/types.js +0 -0
  223. /package/dist/{api → src/api}/config/LDAIConfigTracker.js +0 -0
  224. /package/dist/{api → src/api}/metrics/BedrockTokenUsage.d.ts +0 -0
  225. /package/dist/{api → src/api}/metrics/BedrockTokenUsage.js +0 -0
  226. /package/dist/{api → src/api}/metrics/LDAIMetrics.d.ts +0 -0
  227. /package/dist/{api → src/api}/metrics/LDAIMetrics.js +0 -0
  228. /package/dist/{api → src/api}/metrics/LDFeedbackKind.d.ts +0 -0
  229. /package/dist/{api → src/api}/metrics/LDFeedbackKind.js +0 -0
  230. /package/dist/{api → src/api}/metrics/LDTokenUsage.d.ts +0 -0
  231. /package/dist/{api → src/api}/metrics/LDTokenUsage.js +0 -0
  232. /package/dist/{api → src/api}/metrics/OpenAiUsage.d.ts +0 -0
  233. /package/dist/{api → src/api}/metrics/OpenAiUsage.js +0 -0
  234. /package/dist/{api → src/api}/metrics/VercelAISDKTokenUsage.d.ts +0 -0
  235. /package/dist/{api → src/api}/metrics/VercelAISDKTokenUsage.js +0 -0
  236. /package/dist/{api → src/api}/metrics/index.d.ts +0 -0
  237. /package/dist/{api → src/api}/metrics/index.js +0 -0
  238. /package/dist/{api → src/api}/providers/AIProviderFactory.js +0 -0
  239. /package/dist/{api → src/api}/providers/index.d.ts +0 -0
  240. /package/dist/{api → src/api}/providers/index.js +0 -0
  241. /package/dist/{index.d.ts → src/index.d.ts} +0 -0
  242. /package/dist/{index.js → src/index.js} +0 -0
@@ -1,3 +1,4 @@
1
+ import { EvalScore } from '../judge/types';
1
2
  import { LDAIMetrics, LDFeedbackKind, LDTokenUsage } from '../metrics';
2
3
 
3
4
  /**
@@ -34,6 +35,18 @@ export interface LDAIMetricSummary {
34
35
  * The LDAIConfigTracker is used to track various details about AI operations.
35
36
  */
36
37
  export interface LDAIConfigTracker {
38
+ /**
39
+ * Get the data for tracking.
40
+ */
41
+ getTrackData(): {
42
+ variationKey: string;
43
+ configKey: string;
44
+ version: number;
45
+ modelName: string;
46
+ providerName: string;
47
+ aiSdkName: string;
48
+ aiSdkVersion: string;
49
+ };
37
50
  /**
38
51
  * Track the duration of generation.
39
52
  *
@@ -74,6 +87,13 @@ export interface LDAIConfigTracker {
74
87
  */
75
88
  trackTimeToFirstToken(timeToFirstTokenMs: number): void;
76
89
 
90
+ /**
91
+ * Track evaluation scores for multiple metrics.
92
+ *
93
+ * @param scores Record mapping metric keys to their evaluation scores
94
+ */
95
+ trackEvalScores(scores: Record<string, EvalScore>): void;
96
+
77
97
  /**
78
98
  * Track the duration of execution of the provided function.
79
99
  *
@@ -106,6 +126,32 @@ export interface LDAIConfigTracker {
106
126
  func: () => Promise<TRes>,
107
127
  ): Promise<TRes>;
108
128
 
129
+ /**
130
+ * Track metrics for a streaming AI operation.
131
+ *
132
+ * This function will track the duration of the operation, extract metrics using the provided
133
+ * metrics extractor function, and track success or error status accordingly.
134
+ *
135
+ * Unlike trackMetricsOf, this method is designed for streaming operations where:
136
+ * - The stream is created and returned immediately (synchronously)
137
+ * - Metrics are extracted asynchronously in the background once the stream completes
138
+ * - Duration is tracked from stream creation to metrics extraction completion
139
+ *
140
+ * The stream is returned immediately so the caller can begin consuming it without waiting.
141
+ * Metrics extraction happens in the background and does not block stream consumption.
142
+ *
143
+ * If the stream creator throws, then this method will also throw and record an error.
144
+ * If metrics extraction fails, the error is logged but does not affect stream consumption.
145
+ *
146
+ * @param streamCreator Function that creates and returns the stream (synchronous)
147
+ * @param metricsExtractor Function that asynchronously extracts metrics from the stream
148
+ * @returns The stream result (returned immediately, not a Promise)
149
+ */
150
+ trackStreamMetricsOf<TStream>(
151
+ streamCreator: () => TStream,
152
+ metricsExtractor: (stream: TStream) => Promise<LDAIMetrics>,
153
+ ): TStream;
154
+
109
155
  /**
110
156
  * Track an OpenAI operation.
111
157
  *
@@ -178,33 +224,6 @@ export interface LDAIConfigTracker {
178
224
  func: () => Promise<TRes>,
179
225
  ): Promise<TRes>;
180
226
 
181
- /**
182
- * Track a Vercel AI SDK streamText operation.
183
- *
184
- * This function will track the duration of the operation, the token usage, and the success or error status.
185
- *
186
- * If the provided function throws, then this method will also throw.
187
- * In the case the provided function throws, this function will record the duration and an error.
188
- * A failed operation will not have any token usage data.
189
- *
190
- * @param func Function which executes the operation.
191
- * @returns The result of the operation.
192
- */
193
- trackVercelAISDKStreamTextMetrics<
194
- TRes extends {
195
- finishReason?: Promise<string>;
196
- usage?: Promise<{
197
- totalTokens?: number;
198
- inputTokens?: number;
199
- promptTokens?: number;
200
- outputTokens?: number;
201
- completionTokens?: number;
202
- }>;
203
- },
204
- >(
205
- func: () => TRes,
206
- ): TRes;
207
-
208
227
  /**
209
228
  * Get a summary of the tracked metrics.
210
229
  */
@@ -0,0 +1,201 @@
1
+ import { LDAIConfigTracker } from './LDAIConfigTracker';
2
+ import {
3
+ LDAIAgentConfig,
4
+ LDAICompletionConfig,
5
+ LDAIConfigDefaultKind,
6
+ LDAIConfigKind,
7
+ LDAIConfigMode,
8
+ LDAIJudgeConfig,
9
+ LDJudgeConfiguration,
10
+ LDMessage,
11
+ LDModelConfig,
12
+ LDProviderConfig,
13
+ } from './types';
14
+
15
+ /**
16
+ * Internal flag value structure returned by LaunchDarkly.
17
+ * This represents the raw data structure that LaunchDarkly returns for AI configuration flags.
18
+ *
19
+ * @internal - Not meant for external use
20
+ */
21
+ export interface LDAIConfigFlagValue {
22
+ _ldMeta?: {
23
+ variationKey?: string;
24
+ enabled: boolean;
25
+ version?: number;
26
+ mode?: LDAIConfigMode;
27
+ };
28
+ model?: LDModelConfig;
29
+ messages?: LDMessage[];
30
+ provider?: LDProviderConfig;
31
+ instructions?: string;
32
+ evaluationMetricKeys?: string[];
33
+ judgeConfiguration?: LDJudgeConfiguration;
34
+ }
35
+
36
+ /**
37
+ * Utility class for converting between AI configuration types and LaunchDarkly flag values.
38
+ *
39
+ * @internal - This class and its types are internal implementation details and should not be used by SDK consumers.
40
+ */
41
+ export class LDAIConfigUtils {
42
+ /**
43
+ * Converts a default AI configuration to a LaunchDarkly flag value format.
44
+ *
45
+ * @param config The default AI configuration to convert
46
+ * @param mode The mode for the configuration
47
+ * @returns The flag value structure for LaunchDarkly
48
+ */
49
+ static toFlagValue(config: LDAIConfigDefaultKind, mode: LDAIConfigMode): LDAIConfigFlagValue {
50
+ const flagValue: LDAIConfigFlagValue = {
51
+ _ldMeta: {
52
+ variationKey: '', // Not available when converting from config
53
+ enabled: config.enabled ?? false,
54
+ mode,
55
+ },
56
+ model: config.model,
57
+ };
58
+
59
+ if ('messages' in config && config.messages !== undefined) {
60
+ flagValue.messages = config.messages;
61
+ }
62
+ if (config.provider !== undefined) {
63
+ flagValue.provider = config.provider;
64
+ }
65
+ if ('instructions' in config && config.instructions !== undefined) {
66
+ flagValue.instructions = config.instructions;
67
+ }
68
+ if ('evaluationMetricKeys' in config && config.evaluationMetricKeys !== undefined) {
69
+ flagValue.evaluationMetricKeys = config.evaluationMetricKeys;
70
+ }
71
+ if ('judgeConfiguration' in config && config.judgeConfiguration !== undefined) {
72
+ flagValue.judgeConfiguration = config.judgeConfiguration;
73
+ }
74
+
75
+ return flagValue;
76
+ }
77
+
78
+ /**
79
+ * Converts a LaunchDarkly flag value to the appropriate AI configuration type.
80
+ *
81
+ * @param flagValue The flag value from LaunchDarkly
82
+ * @param tracker The tracker to add to the config
83
+ * @returns The appropriate AI configuration type
84
+ */
85
+ static fromFlagValue(flagValue: LDAIConfigFlagValue, tracker: LDAIConfigTracker): LDAIConfigKind {
86
+ // Determine the actual mode from flag value
87
+ // eslint-disable-next-line no-underscore-dangle
88
+ const flagValueMode = flagValue._ldMeta?.mode;
89
+
90
+ switch (flagValueMode) {
91
+ case 'agent':
92
+ return this.toAgentConfig(flagValue, tracker);
93
+ case 'judge':
94
+ return this.toJudgeConfig(flagValue, tracker);
95
+ case 'completion':
96
+ default:
97
+ return this.toCompletionConfig(flagValue, tracker);
98
+ }
99
+ }
100
+
101
+ /**
102
+ * Creates a disabled configuration of the specified mode.
103
+ *
104
+ * @param mode The mode for the disabled config
105
+ * @returns A disabled config of the appropriate type
106
+ */
107
+ static createDisabledConfig(mode: LDAIConfigMode): LDAIConfigKind {
108
+ switch (mode) {
109
+ case 'agent':
110
+ return {
111
+ enabled: false,
112
+ tracker: undefined,
113
+ } as LDAIAgentConfig;
114
+ case 'judge':
115
+ return {
116
+ enabled: false,
117
+ tracker: undefined,
118
+ evaluationMetricKeys: [],
119
+ } as LDAIJudgeConfig;
120
+ case 'completion':
121
+ default:
122
+ // Default to completion config for completion mode or any unexpected mode
123
+ return {
124
+ enabled: false,
125
+ tracker: undefined,
126
+ } as LDAICompletionConfig;
127
+ }
128
+ }
129
+
130
+ /**
131
+ * Creates the base configuration that all config types share.
132
+ *
133
+ * @param flagValue The flag value from LaunchDarkly
134
+ * @returns Base configuration object
135
+ */
136
+ private static _toBaseConfig(flagValue: LDAIConfigFlagValue) {
137
+ return {
138
+ // eslint-disable-next-line no-underscore-dangle
139
+ enabled: flagValue._ldMeta?.enabled ?? false,
140
+ model: flagValue.model,
141
+ provider: flagValue.provider,
142
+ };
143
+ }
144
+
145
+ /**
146
+ * Creates a completion config from flag value data.
147
+ *
148
+ * @param flagValue The flag value from LaunchDarkly
149
+ * @param tracker The tracker to add to the config
150
+ * @returns A completion configuration
151
+ */
152
+ static toCompletionConfig(
153
+ flagValue: LDAIConfigFlagValue,
154
+ tracker: LDAIConfigTracker,
155
+ ): LDAICompletionConfig {
156
+ return {
157
+ ...this._toBaseConfig(flagValue),
158
+ tracker,
159
+ messages: flagValue.messages,
160
+ judgeConfiguration: flagValue.judgeConfiguration,
161
+ };
162
+ }
163
+
164
+ /**
165
+ * Creates an agent config from flag value data.
166
+ *
167
+ * @param flagValue The flag value from LaunchDarkly
168
+ * @param tracker The tracker to add to the config
169
+ * @returns An agent configuration
170
+ */
171
+ static toAgentConfig(
172
+ flagValue: LDAIConfigFlagValue,
173
+ tracker: LDAIConfigTracker,
174
+ ): LDAIAgentConfig {
175
+ return {
176
+ ...this._toBaseConfig(flagValue),
177
+ tracker,
178
+ instructions: flagValue.instructions,
179
+ judgeConfiguration: flagValue.judgeConfiguration,
180
+ };
181
+ }
182
+
183
+ /**
184
+ * Creates a judge config from flag value data.
185
+ *
186
+ * @param flagValue The flag value from LaunchDarkly
187
+ * @param tracker The tracker to add to the config
188
+ * @returns A judge configuration
189
+ */
190
+ static toJudgeConfig(
191
+ flagValue: LDAIConfigFlagValue,
192
+ tracker: LDAIConfigTracker,
193
+ ): LDAIJudgeConfig {
194
+ return {
195
+ ...this._toBaseConfig(flagValue),
196
+ tracker,
197
+ messages: flagValue.messages,
198
+ evaluationMetricKeys: flagValue.evaluationMetricKeys || [],
199
+ };
200
+ }
201
+ }
@@ -1,3 +1,3 @@
1
- export * from './LDAIConfig';
2
- export * from './VercelAISDK';
1
+ export * from './types';
2
+ // LDAIConfigUtils is intentionally not exported - it's an internal utility class
3
3
  export { LDAIConfigTracker } from './LDAIConfigTracker';
@@ -0,0 +1,256 @@
1
+ import { LDAIConfigTracker } from './LDAIConfigTracker';
2
+
3
+ // ============================================================================
4
+ // Foundation Types
5
+ // ============================================================================
6
+
7
+ /**
8
+ * Information about prompts.
9
+ */
10
+ export interface LDMessage {
11
+ /**
12
+ * The role of the prompt.
13
+ */
14
+ role: 'user' | 'assistant' | 'system';
15
+ /**
16
+ * Content for the prompt.
17
+ */
18
+ content: string;
19
+ }
20
+
21
+ /**
22
+ * Configuration related to the model.
23
+ */
24
+ export interface LDModelConfig {
25
+ /**
26
+ * The ID of the model.
27
+ */
28
+ name: string;
29
+
30
+ /**
31
+ * Model specific parameters.
32
+ */
33
+ parameters?: { [index: string]: unknown };
34
+
35
+ /**
36
+ * Additional user-specified parameters.
37
+ */
38
+ custom?: { [index: string]: unknown };
39
+ }
40
+
41
+ export interface LDProviderConfig {
42
+ /**
43
+ * The name of the provider.
44
+ */
45
+ name: string;
46
+ }
47
+
48
+ // ============================================================================
49
+ // Judge Types
50
+ // ============================================================================
51
+
52
+ /**
53
+ * Configuration for a single judge attachment.
54
+ */
55
+ export interface LDJudge {
56
+ /** The key of the judge AI Config */
57
+ key: string;
58
+ /** Sampling rate for evaluation (0.0 to 1.0) */
59
+ samplingRate: number;
60
+ }
61
+
62
+ /**
63
+ * Configuration for judge attachment to AI Configs.
64
+ */
65
+ export interface LDJudgeConfiguration {
66
+ /** Array of judge configurations */
67
+ judges: LDJudge[];
68
+ }
69
+
70
+ // ============================================================================
71
+ // Base AI Config Types
72
+ // ============================================================================
73
+
74
+ /**
75
+ * Base AI Config interface for default implementations with optional enabled property.
76
+ */
77
+ export interface LDAIConfigDefault {
78
+ /**
79
+ * Optional model configuration.
80
+ */
81
+ model?: LDModelConfig;
82
+
83
+ /**
84
+ * Optional configuration for the provider.
85
+ */
86
+ provider?: LDProviderConfig;
87
+
88
+ /**
89
+ * Whether the configuration is enabled. Defaults to false when not provided.
90
+ */
91
+ enabled?: boolean;
92
+ }
93
+
94
+ /**
95
+ * Base AI Config interface without mode-specific fields.
96
+ */
97
+ export interface LDAIConfig extends Omit<LDAIConfigDefault, 'enabled'> {
98
+ /**
99
+ * Whether the configuration is enabled.
100
+ */
101
+ enabled: boolean;
102
+
103
+ /**
104
+ * A tracker which can be used to generate analytics.
105
+ * Undefined for disabled configs.
106
+ */
107
+ tracker?: LDAIConfigTracker;
108
+ }
109
+
110
+ // ============================================================================
111
+ // Default AI Config Implementation Types
112
+ // ============================================================================
113
+
114
+ /**
115
+ * Default Agent-specific AI Config with instructions.
116
+ */
117
+ export interface LDAIAgentConfigDefault extends LDAIConfigDefault {
118
+ /**
119
+ * Instructions for the agent.
120
+ */
121
+ instructions?: string;
122
+ /**
123
+ * Judge configuration for AI Configs being evaluated.
124
+ * References judge AI Configs that should evaluate this AI Config.
125
+ */
126
+ judgeConfiguration?: LDJudgeConfiguration;
127
+ }
128
+
129
+ /**
130
+ * Default Completion AI Config (default mode).
131
+ */
132
+ export interface LDAICompletionConfigDefault extends LDAIConfigDefault {
133
+ /**
134
+ * Optional prompt data for completion configurations.
135
+ */
136
+ messages?: LDMessage[];
137
+ /**
138
+ * Judge configuration for AI Configs being evaluated.
139
+ * References judge AI Configs that should evaluate this AI Config.
140
+ */
141
+ judgeConfiguration?: LDJudgeConfiguration;
142
+ }
143
+
144
+ /**
145
+ * Default Judge-specific AI Config with required evaluation metric key.
146
+ */
147
+ export interface LDAIJudgeConfigDefault extends LDAIConfigDefault {
148
+ /**
149
+ * Optional prompt data for judge configurations.
150
+ */
151
+ messages?: LDMessage[];
152
+ /**
153
+ * Evaluation metric keys for judge configurations.
154
+ * The keys of the metrics that this judge can evaluate.
155
+ */
156
+ evaluationMetricKeys?: string[];
157
+ }
158
+
159
+ /**
160
+ * Union type for all default AI Config variants.
161
+ */
162
+ export type LDAIConfigDefaultKind =
163
+ | LDAIAgentConfigDefault
164
+ | LDAICompletionConfigDefault
165
+ | LDAIJudgeConfigDefault;
166
+
167
+ // ============================================================================
168
+ // AI Config Implementation Types
169
+ // ============================================================================
170
+
171
+ /**
172
+ * Agent-specific AI Config with instructions.
173
+ */
174
+ export interface LDAIAgentConfig extends LDAIConfig {
175
+ /**
176
+ * Instructions for the agent.
177
+ */
178
+ instructions?: string;
179
+ /**
180
+ * Judge configuration for AI Configs being evaluated.
181
+ * References judge AI Configs that should evaluate this AI Config.
182
+ */
183
+ judgeConfiguration?: LDJudgeConfiguration;
184
+ }
185
+
186
+ /**
187
+ * Completion AI Config (default mode).
188
+ */
189
+ export interface LDAICompletionConfig extends LDAIConfig {
190
+ /**
191
+ * Optional prompt data for completion configurations.
192
+ */
193
+ messages?: LDMessage[];
194
+ /**
195
+ * Judge configuration for AI Configs being evaluated.
196
+ * References judge AI Configs that should evaluate this AI Config.
197
+ */
198
+ judgeConfiguration?: LDJudgeConfiguration;
199
+ }
200
+
201
+ /**
202
+ * Judge-specific AI Config with required evaluation metric key.
203
+ */
204
+ export interface LDAIJudgeConfig extends LDAIConfig {
205
+ /**
206
+ * Optional prompt data for judge configurations.
207
+ */
208
+ messages?: LDMessage[];
209
+ /**
210
+ * Evaluation metric keys for judge configurations.
211
+ * The keys of the metrics that this judge can evaluate.
212
+ */
213
+ evaluationMetricKeys: string[];
214
+ }
215
+
216
+ // ============================================================================
217
+ // Union Types
218
+ // ============================================================================
219
+
220
+ /**
221
+ * Union type for all AI Config variants.
222
+ */
223
+ export type LDAIConfigKind = LDAIAgentConfig | LDAICompletionConfig | LDAIJudgeConfig;
224
+
225
+ // ============================================================================
226
+ // Agent-Specific Request Type
227
+ // ============================================================================
228
+
229
+ /**
230
+ * Configuration for a single agent request.
231
+ */
232
+ export interface LDAIAgentRequestConfig {
233
+ /**
234
+ * The agent key to retrieve.
235
+ */
236
+ key: string;
237
+
238
+ /**
239
+ * Default configuration for the agent.
240
+ */
241
+ defaultValue: LDAIAgentConfigDefault;
242
+
243
+ /**
244
+ * Variables for instructions interpolation.
245
+ */
246
+ variables?: Record<string, unknown>;
247
+ }
248
+
249
+ // ============================================================================
250
+ // Mode Type
251
+ // ============================================================================
252
+
253
+ /**
254
+ * Mode type for AI configurations.
255
+ */
256
+ export type LDAIConfigMode = 'completion' | 'agent' | 'judge';
package/src/api/index.ts CHANGED
@@ -1,6 +1,6 @@
1
1
  export * from './config';
2
- export * from './agents';
3
2
  export * from './chat';
3
+ export * from './judge';
4
4
  export * from './metrics';
5
5
  export * from './LDAIClient';
6
6
  export * from './providers';
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Internal class for building dynamic evaluation response schemas.
3
+ * Not exported - only used internally by TrackedJudge.
4
+ */
5
+ class EvaluationSchemaBuilder {
6
+ static build(evaluationMetricKeys: string[]): Record<string, unknown> {
7
+ return {
8
+ type: 'object',
9
+ properties: {
10
+ evaluations: {
11
+ type: 'object',
12
+ description: `Object containing evaluation results for ${evaluationMetricKeys.join(', ')} metrics`,
13
+ properties: this._buildKeyProperties(evaluationMetricKeys),
14
+ required: evaluationMetricKeys,
15
+ additionalProperties: false,
16
+ },
17
+ },
18
+ required: ['evaluations'],
19
+ additionalProperties: false,
20
+ } as const;
21
+ }
22
+
23
+ private static _buildKeyProperties(evaluationMetricKeys: string[]) {
24
+ return evaluationMetricKeys.reduce(
25
+ (acc, key) => {
26
+ acc[key] = this._buildKeySchema(key);
27
+ return acc;
28
+ },
29
+ {} as Record<string, unknown>,
30
+ );
31
+ }
32
+
33
+ private static _buildKeySchema(key: string) {
34
+ return {
35
+ type: 'object',
36
+ properties: {
37
+ score: {
38
+ type: 'number',
39
+ minimum: 0,
40
+ maximum: 1,
41
+ description: `Score between 0.0 and 1.0 for ${key}`,
42
+ },
43
+ reasoning: {
44
+ type: 'string',
45
+ description: `Reasoning behind the score for ${key}`,
46
+ },
47
+ },
48
+ required: ['score', 'reasoning'],
49
+ additionalProperties: false,
50
+ };
51
+ }
52
+ }
53
+
54
+ export { EvaluationSchemaBuilder };