@launchdarkly/server-sdk-ai 0.13.0 → 0.14.1

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 +39 -0
  2. package/README.md +1 -1
  3. package/__tests__/Judge.test.ts +521 -0
  4. package/__tests__/LDAIClientImpl.test.ts +535 -323
  5. package/__tests__/LDAIConfigTrackerImpl.test.ts +50 -290
  6. package/__tests__/TrackedChat.test.ts +5 -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} +12 -11
  13. package/dist/src/LDAIConfigTrackerImpl.d.ts.map +1 -0
  14. package/dist/{LDAIConfigTrackerImpl.js → src/LDAIConfigTrackerImpl.js} +21 -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 +25 -25
  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 +145 -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 +206 -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 +151 -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 +37 -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 +139 -0
  104. package/docs/interfaces/LDAIAgentConfig.html +90 -31
  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} +96 -90
  109. package/docs/interfaces/LDAICompletionConfigDefault.html +155 -0
  110. package/docs/interfaces/LDAIConfig.html +52 -75
  111. package/docs/interfaces/LDAIConfigDefault.html +133 -0
  112. package/docs/interfaces/LDAIConfigTracker.html +102 -63
  113. package/docs/interfaces/LDAIJudgeConfig.html +178 -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} +35 -23
  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 -35
  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 +31 -54
  132. package/src/api/LDAIClient.ts +166 -33
  133. package/src/api/chat/TrackedChat.ts +68 -5
  134. package/src/api/chat/types.ts +8 -1
  135. package/src/api/config/LDAIConfigTracker.ts +27 -30
  136. package/src/api/config/LDAIConfigUtils.ts +212 -0
  137. package/src/api/config/index.ts +2 -2
  138. package/src/api/config/types.ts +260 -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 +218 -0
  142. package/src/api/judge/index.ts +2 -0
  143. package/src/api/judge/types.ts +41 -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 -14
  154. package/dist/LDAIConfigMapper.d.ts.map +0 -1
  155. package/dist/LDAIConfigMapper.js +0 -59
  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 -95
  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 -31
  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 -69
  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 -104
  216. package/src/api/config/VercelAISDK.ts +0 -33
  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,4 +1,4 @@
1
- <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>SUPPORTED_AI_PROVIDERS | @launchdarkly/server-sdk-ai - v0.13.0</title><meta name="description" content="Documentation for @launchdarkly/server-sdk-ai"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/search.js" id="tsd-search-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os"</script><header class="tsd-page-toolbar">
1
+ <!DOCTYPE html><html class="default" lang="en"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>SUPPORTED_AI_PROVIDERS | @launchdarkly/server-sdk-ai - v0.14.1</title><meta name="description" content="Documentation for @launchdarkly/server-sdk-ai"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script defer src="../assets/main.js"></script><script async src="../assets/search.js" id="tsd-search-script"></script></head><body><script>document.documentElement.dataset.theme = localStorage.getItem("tsd-theme") || "os"</script><header class="tsd-page-toolbar">
2
2
  <div class="tsd-toolbar-contents container">
3
3
  <div class="table-cell" id="tsd-search" data-base="..">
4
4
  <div class="field"><label for="tsd-search-field" class="tsd-widget tsd-toolbar-icon search no-caption"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><path d="M15.7824 13.833L12.6666 10.7177C12.5259 10.5771 12.3353 10.499 12.1353 10.499H11.6259C12.4884 9.39596 13.001 8.00859 13.001 6.49937C13.001 2.90909 10.0914 0 6.50048 0C2.90959 0 0 2.90909 0 6.49937C0 10.0896 2.90959 12.9987 6.50048 12.9987C8.00996 12.9987 9.39756 12.4863 10.5008 11.6239V12.1332C10.5008 12.3332 10.5789 12.5238 10.7195 12.6644L13.8354 15.7797C14.1292 16.0734 14.6042 16.0734 14.8948 15.7797L15.7793 14.8954C16.0731 14.6017 16.0731 14.1267 15.7824 13.833ZM6.50048 10.499C4.29094 10.499 2.50018 8.71165 2.50018 6.49937C2.50018 4.29021 4.28781 2.49976 6.50048 2.49976C8.71001 2.49976 10.5008 4.28708 10.5008 6.49937C10.5008 8.70852 8.71314 10.499 6.50048 10.499Z" fill="var(--color-text)"></path></svg></label><input type="text" id="tsd-search-field" aria-label="Search"/></div>
@@ -6,7 +6,7 @@
6
6
  <div id="tsd-toolbar-links"></div></div>
7
7
  <ul class="results">
8
8
  <li class="state loading">Preparing search index...</li>
9
- <li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@launchdarkly/server-sdk-ai - v0.13.0</a></div>
9
+ <li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">@launchdarkly/server-sdk-ai - v0.14.1</a></div>
10
10
  <div class="table-cell" id="tsd-widgets"><a href="#" class="tsd-widget tsd-toolbar-icon menu no-caption" data-toggle="menu" aria-label="Menu"><svg width="16" height="16" viewBox="0 0 16 16" fill="none"><rect x="1" y="3" width="14" height="2" fill="var(--color-text)"></rect><rect x="1" y="7" width="14" height="2" fill="var(--color-text)"></rect><rect x="1" y="11" width="14" height="2" fill="var(--color-text)"></rect></svg></a></div></div></header>
11
11
  <div class="container container-main">
12
12
  <div class="col-content">
@@ -20,7 +20,7 @@
20
20
  </div>
21
21
  <div class="tsd-comment tsd-typography"></div><aside class="tsd-sources">
22
22
  <ul>
23
- <li>Defined in <a href="https://github.com/launchdarkly/js-core/blob/5339456/packages/sdk/server-ai/src/api/providers/AIProviderFactory.ts#L9">sdk/server-ai/src/api/providers/AIProviderFactory.ts:9</a></li></ul></aside></div>
23
+ <li>Defined in <a href="https://github.com/launchdarkly/js-core/blob/f40a435/packages/sdk/server-ai/src/api/providers/AIProviderFactory.ts#L9">sdk/server-ai/src/api/providers/AIProviderFactory.ts:9</a></li></ul></aside></div>
24
24
  <div class="col-sidebar">
25
25
  <div class="page-menu">
26
26
  <div class="tsd-navigation settings">
@@ -37,30 +37,40 @@
37
37
  <div class="tsd-theme-toggle">
38
38
  <h4 class="uppercase">Theme</h4><select id="tsd-theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></div></div></details></div></div>
39
39
  <div class="site-menu">
40
- <nav class="tsd-navigation"><a href="../index.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-4"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-namespace)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M9.33 16V7.24H10.77L13.446 14.74C13.43 14.54 13.41 14.296 13.386 14.008C13.37 13.712 13.354 13.404 13.338 13.084C13.33 12.756 13.326 12.448 13.326 12.16V7.24H14.37V16H12.93L10.266 8.5C10.282 8.692 10.298 8.936 10.314 9.232C10.33 9.52 10.342 9.828 10.35 10.156C10.366 10.476 10.374 10.784 10.374 11.08V16H9.33Z" fill="var(--color-text)"></path></g></svg><span>@launchdarkly/server-<wbr/>sdk-<wbr/>ai -<wbr/> v0.13.0</span></a>
40
+ <nav class="tsd-navigation"><a href="../index.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-4"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-namespace)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M9.33 16V7.24H10.77L13.446 14.74C13.43 14.54 13.41 14.296 13.386 14.008C13.37 13.712 13.354 13.404 13.338 13.084C13.33 12.756 13.326 12.448 13.326 12.16V7.24H14.37V16H12.93L10.266 8.5C10.282 8.692 10.298 8.936 10.314 9.232C10.33 9.52 10.342 9.828 10.35 10.156C10.366 10.476 10.374 10.784 10.374 11.08V16H9.33Z" fill="var(--color-text)"></path></g></svg><span>@launchdarkly/server-<wbr/>sdk-<wbr/>ai -<wbr/> v0.14.1</span></a>
41
41
  <ul class="tsd-small-nested-navigation">
42
42
  <li><a href="../enums/LDFeedbackKind.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-8"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-enum)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M9.45 16V7.24H14.49V8.224H10.518V10.936H14.07V11.908H10.518V15.016H14.49V16H9.45Z" fill="var(--color-text)"></path></g></svg><span>LDFeedback<wbr/>Kind</span></a></li>
43
43
  <li><a href="../classes/AIProvider.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-128"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-class)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M11.898 16.1201C11.098 16.1201 10.466 15.8961 10.002 15.4481C9.53803 15.0001 9.30603 14.3841 9.30603 13.6001V9.64012C9.30603 8.85612 9.53803 8.24012 10.002 7.79212C10.466 7.34412 11.098 7.12012 11.898 7.12012C12.682 7.12012 13.306 7.34812 13.77 7.80412C14.234 8.25212 14.466 8.86412 14.466 9.64012H13.386C13.386 9.14412 13.254 8.76412 12.99 8.50012C12.734 8.22812 12.37 8.09212 11.898 8.09212C11.426 8.09212 11.054 8.22412 10.782 8.48812C10.518 8.75212 10.386 9.13212 10.386 9.62812V13.6001C10.386 14.0961 10.518 14.4801 10.782 14.7521C11.054 15.0161 11.426 15.1481 11.898 15.1481C12.37 15.1481 12.734 15.0161 12.99 14.7521C13.254 14.4801 13.386 14.0961 13.386 13.6001H14.466C14.466 14.3761 14.234 14.9921 13.77 15.4481C13.306 15.8961 12.682 16.1201 11.898 16.1201Z" fill="var(--color-text)"></path></g></svg><span>AIProvider</span></a></li>
44
44
  <li><a href="../classes/AIProviderFactory.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-128"></use></svg><span>AIProvider<wbr/>Factory</span></a></li>
45
+ <li><a href="../classes/Judge.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-128"></use></svg><span>Judge</span></a></li>
45
46
  <li><a href="../classes/TrackedChat.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-128"></use></svg><span>Tracked<wbr/>Chat</span></a></li>
46
47
  <li><a href="../interfaces/ChatResponse.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-256"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-interface)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M9.51 16V15.016H11.298V8.224H9.51V7.24H14.19V8.224H12.402V15.016H14.19V16H9.51Z" fill="var(--color-text)"></path></g></svg><span>Chat<wbr/>Response</span></a></li>
47
- <li><a href="../interfaces/LDAIAgent.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIAgent</span></a></li>
48
+ <li><a href="../interfaces/EvalScore.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>Eval<wbr/>Score</span></a></li>
49
+ <li><a href="../interfaces/JudgeResponse.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>Judge<wbr/>Response</span></a></li>
48
50
  <li><a href="../interfaces/LDAIAgentConfig.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIAgent<wbr/>Config</span></a></li>
51
+ <li><a href="../interfaces/LDAIAgentConfigDefault.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIAgent<wbr/>Config<wbr/>Default</span></a></li>
52
+ <li><a href="../interfaces/LDAIAgentRequestConfig.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIAgent<wbr/>Request<wbr/>Config</span></a></li>
49
53
  <li><a href="../interfaces/LDAIClient.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIClient</span></a></li>
54
+ <li><a href="../interfaces/LDAICompletionConfig.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAICompletion<wbr/>Config</span></a></li>
55
+ <li><a href="../interfaces/LDAICompletionConfigDefault.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAICompletion<wbr/>Config<wbr/>Default</span></a></li>
50
56
  <li><a href="../interfaces/LDAIConfig.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIConfig</span></a></li>
57
+ <li><a href="../interfaces/LDAIConfigDefault.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIConfig<wbr/>Default</span></a></li>
51
58
  <li><a href="../interfaces/LDAIConfigTracker.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIConfig<wbr/>Tracker</span></a></li>
59
+ <li><a href="../interfaces/LDAIJudgeConfig.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIJudge<wbr/>Config</span></a></li>
60
+ <li><a href="../interfaces/LDAIJudgeConfigDefault.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIJudge<wbr/>Config<wbr/>Default</span></a></li>
52
61
  <li><a href="../interfaces/LDAIMetrics.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDAIMetrics</span></a></li>
62
+ <li><a href="../interfaces/LDJudge.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDJudge</span></a></li>
63
+ <li><a href="../interfaces/LDJudgeConfiguration.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDJudge<wbr/>Configuration</span></a></li>
53
64
  <li><a href="../interfaces/LDLogger.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDLogger</span></a></li>
54
65
  <li><a href="../interfaces/LDMessage.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDMessage</span></a></li>
55
66
  <li><a href="../interfaces/LDModelConfig.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDModel<wbr/>Config</span></a></li>
56
67
  <li><a href="../interfaces/LDProviderConfig.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDProvider<wbr/>Config</span></a></li>
57
68
  <li><a href="../interfaces/LDTokenUsage.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>LDToken<wbr/>Usage</span></a></li>
58
- <li><a href="../interfaces/VercelAISDKConfig.html" class="deprecated"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>VercelAISDKConfig</span></a></li>
59
- <li><a href="../interfaces/VercelAISDKMapOptions.html" class="deprecated"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>VercelAISDKMap<wbr/>Options</span></a></li>
60
- <li><a href="../types/LDAIAgentDefaults.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-2097152"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-type-alias)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M11.31 16V8.224H8.91V7.24H14.79V8.224H12.39V16H11.31Z" fill="var(--color-text)"></path></g></svg><span>LDAIAgent<wbr/>Defaults</span></a></li>
61
- <li><a href="../types/LDAIDefaults.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2097152"></use></svg><span>LDAIDefaults</span></a></li>
69
+ <li><a href="../interfaces/StructuredResponse.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-256"></use></svg><span>Structured<wbr/>Response</span></a></li>
70
+ <li><a href="../types/LDAIConfigDefaultKind.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-2097152"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-type-alias)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M11.31 16V8.224H8.91V7.24H14.79V8.224H12.39V16H11.31Z" fill="var(--color-text)"></path></g></svg><span>LDAIConfig<wbr/>Default<wbr/>Kind</span></a></li>
71
+ <li><a href="../types/LDAIConfigKind.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2097152"></use></svg><span>LDAIConfig<wbr/>Kind</span></a></li>
72
+ <li><a href="../types/LDAIConfigMode.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2097152"></use></svg><span>LDAIConfig<wbr/>Mode</span></a></li>
62
73
  <li><a href="../types/SupportedAIProvider.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2097152"></use></svg><span>SupportedAIProvider</span></a></li>
63
- <li><a href="../types/VercelAISDKProvider.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-2097152"></use></svg><span>VercelAISDKProvider</span></a></li>
64
74
  <li><a href="SUPPORTED_AI_PROVIDERS.html" class="current"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-32"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-variable)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M11.106 16L8.85 7.24H9.966L11.454 13.192C11.558 13.608 11.646 13.996 11.718 14.356C11.79 14.708 11.842 14.976 11.874 15.16C11.906 14.976 11.954 14.708 12.018 14.356C12.09 13.996 12.178 13.608 12.282 13.192L13.758 7.24H14.85L12.582 16H11.106Z" fill="var(--color-text)"></path></g></svg><span>SUPPORTED_<wbr/>AI_<wbr/>PROVIDERS</span></a></li>
65
75
  <li><a href="../functions/createBedrockTokenUsage.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><g id="icon-64"><rect fill="var(--color-icon-background)" stroke="var(--color-ts-function)" stroke-width="1.5" x="1" y="1" width="22" height="22" rx="6"></rect><path d="M9.39 16V7.24H14.55V8.224H10.446V11.128H14.238V12.112H10.47V16H9.39Z" fill="var(--color-text)"></path></g></svg><span>create<wbr/>Bedrock<wbr/>Token<wbr/>Usage</span></a></li>
66
76
  <li><a href="../functions/createOpenAiUsage.html"><svg class="tsd-kind-icon" viewBox="0 0 24 24"><use href="#icon-64"></use></svg><span>create<wbr/>Open<wbr/>Ai<wbr/>Usage</span></a></li>
package/package.json CHANGED
@@ -1,14 +1,14 @@
1
1
  {
2
2
  "name": "@launchdarkly/server-sdk-ai",
3
- "version": "0.13.0",
3
+ "version": "0.14.1",
4
4
  "description": "LaunchDarkly AI SDK for Server-Side JavaScript",
5
5
  "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/sdk/server-ai",
6
6
  "repository": {
7
7
  "type": "git",
8
8
  "url": "https://github.com/launchdarkly/js-core.git"
9
9
  },
10
- "main": "dist/index.js",
11
- "types": "dist/index.d.ts",
10
+ "main": "dist/src/index.js",
11
+ "types": "dist/src/index.d.ts",
12
12
  "type": "commonjs",
13
13
  "scripts": {
14
14
  "build": "npx tsc",
@@ -2,61 +2,37 @@ import * as Mustache from 'mustache';
2
2
 
3
3
  import { LDContext, LDLogger } from '@launchdarkly/js-server-sdk-common';
4
4
 
5
- import { LDAIAgent, LDAIAgentConfig, LDAIAgentDefaults } from './api/agents';
6
5
  import { TrackedChat } from './api/chat';
7
6
  import {
8
- LDAIConfig,
9
- LDAIConfigTracker,
10
- LDAIDefaults,
7
+ LDAIAgentConfig,
8
+ LDAIAgentConfigDefault,
9
+ LDAIAgentRequestConfig,
10
+ LDAICompletionConfig,
11
+ LDAICompletionConfigDefault,
12
+ LDAIConfigDefaultKind,
13
+ LDAIConfigKind,
14
+ LDAIConfigMode,
15
+ LDAIJudgeConfig,
16
+ LDAIJudgeConfigDefault,
17
+ LDJudge,
11
18
  LDMessage,
12
- LDModelConfig,
13
- LDProviderConfig,
14
- VercelAISDKConfig,
15
- VercelAISDKMapOptions,
16
- VercelAISDKProvider,
17
19
  } from './api/config';
20
+ import { LDAIConfigFlagValue, LDAIConfigUtils } from './api/config/LDAIConfigUtils';
21
+ import { Judge } from './api/judge/Judge';
18
22
  import { LDAIClient } from './api/LDAIClient';
19
23
  import { AIProviderFactory, SupportedAIProvider } from './api/providers';
20
- import { LDAIConfigMapper } from './LDAIConfigMapper';
21
24
  import { LDAIConfigTrackerImpl } from './LDAIConfigTrackerImpl';
22
25
  import { LDClientMin } from './LDClientMin';
23
26
 
24
- type Mode = 'completion' | 'agent';
25
-
26
- /**
27
- * Metadata associated with a model configuration variation.
28
- */
29
- interface LDMeta {
30
- variationKey: string;
31
- enabled: boolean;
32
- version?: number;
33
- mode?: Mode;
34
- }
35
-
36
27
  /**
37
- * Interface for the model configuration variation returned by LaunchDarkly. This is the internal
38
- * typing and not meant for exposure to the application developer.
28
+ * Tracking event keys for AI SDK usage metrics.
39
29
  */
40
- interface VariationContent {
41
- model?: LDModelConfig;
42
- messages?: LDMessage[];
43
- instructions?: string;
44
- provider?: LDProviderConfig;
45
- _ldMeta?: LDMeta;
46
- }
47
-
48
- /**
49
- * The result of evaluating a configuration.
50
- */
51
- interface EvaluationResult {
52
- tracker: LDAIConfigTracker;
53
- enabled: boolean;
54
- model?: LDModelConfig;
55
- provider?: LDProviderConfig;
56
- messages?: LDMessage[];
57
- instructions?: string;
58
- mode?: string;
59
- }
30
+ const TRACK_CONFIG_SINGLE = '$ld:ai:config:function:single';
31
+ const TRACK_CONFIG_CREATE_CHAT = '$ld:ai:config:function:createChat';
32
+ const TRACK_JUDGE_SINGLE = '$ld:ai:judge:function:single';
33
+ const TRACK_JUDGE_CREATE = '$ld:ai:judge:function:createJudge';
34
+ const TRACK_AGENT_SINGLE = '$ld:ai:agent:function:single';
35
+ const TRACK_AGENT_MULTIPLE = '$ld:ai:agent:function:multiple';
60
36
 
61
37
  export class LDAIClientImpl implements LDAIClient {
62
38
  private _logger?: LDLogger;
@@ -69,32 +45,26 @@ export class LDAIClientImpl implements LDAIClient {
69
45
  return Mustache.render(template, variables, undefined, { escape: (item: any) => item });
70
46
  }
71
47
 
72
- private static _toLDFlagValue(defaultValue: LDAIDefaults | LDAIAgentDefaults): {
73
- _ldMeta: { enabled: boolean };
74
- model?: LDModelConfig;
75
- messages?: LDMessage[];
76
- provider?: LDProviderConfig;
77
- instructions?: string;
78
- } {
79
- return {
80
- _ldMeta: { enabled: defaultValue.enabled ?? false },
81
- model: defaultValue.model,
82
- messages: 'messages' in defaultValue ? defaultValue.messages : undefined,
83
- provider: defaultValue.provider,
84
- instructions: 'instructions' in defaultValue ? defaultValue.instructions : undefined,
85
- };
86
- }
87
-
88
48
  private async _evaluate(
89
49
  key: string,
90
50
  context: LDContext,
91
- defaultValue: LDAIDefaults,
92
- ): Promise<EvaluationResult> {
93
- // Convert default value to LDFlagValue format
94
- // eslint-disable-next-line no-underscore-dangle
95
- const ldFlagValue = LDAIClientImpl._toLDFlagValue(defaultValue);
51
+ defaultValue: LDAIConfigDefaultKind,
52
+ mode: LDAIConfigMode,
53
+ variables?: Record<string, unknown>,
54
+ ): Promise<LDAIConfigKind> {
55
+ const ldFlagValue = LDAIConfigUtils.toFlagValue(defaultValue, mode);
56
+
57
+ const value: LDAIConfigFlagValue = await this._ldClient.variation(key, context, ldFlagValue);
96
58
 
97
- const value: VariationContent = await this._ldClient.variation(key, context, ldFlagValue);
59
+ // Validate mode match
60
+ // eslint-disable-next-line no-underscore-dangle
61
+ const flagMode = value._ldMeta?.mode ?? 'completion';
62
+ if (flagMode !== mode) {
63
+ this._logger?.warn(
64
+ `AI Config mode mismatch for ${key}: expected ${mode}, got ${flagMode}. Returning disabled config.`,
65
+ );
66
+ return LDAIConfigUtils.createDisabledConfig(key, mode);
67
+ }
98
68
 
99
69
  const tracker = new LDAIConfigTrackerImpl(
100
70
  this._ldClient,
@@ -108,174 +78,250 @@ export class LDAIClientImpl implements LDAIClient {
108
78
  context,
109
79
  );
110
80
 
111
- // eslint-disable-next-line no-underscore-dangle
112
- const enabled = !!value._ldMeta?.enabled;
113
-
114
- return {
115
- tracker,
116
- enabled,
117
- model: value.model,
118
- provider: value.provider,
119
- messages: value.messages,
120
- instructions: value.instructions,
121
- // eslint-disable-next-line no-underscore-dangle
122
- mode: value._ldMeta?.mode ?? 'completion',
123
- };
81
+ const config = LDAIConfigUtils.fromFlagValue(key, value, tracker);
82
+
83
+ // Apply variable interpolation (always needed for ldctx)
84
+ return this._applyInterpolation(config, context, variables);
124
85
  }
125
86
 
126
- private async _evaluateAgent(
127
- key: string,
87
+ private _applyInterpolation(
88
+ config: LDAIConfigKind,
128
89
  context: LDContext,
129
- defaultValue: LDAIAgentDefaults,
130
90
  variables?: Record<string, unknown>,
131
- ): Promise<LDAIAgent> {
132
- const {
133
- tracker,
134
- enabled,
135
- model,
136
- provider: configProvider,
137
- instructions,
138
- } = await this._evaluate(key, context, defaultValue);
139
-
140
- const agent: LDAIAgent = {
141
- tracker,
142
- enabled,
143
- };
144
-
145
- // We are going to modify the contents before returning them, so we make a copy.
146
- // This isn't a deep copy and the application developer should not modify the returned content.
147
- if (model) {
148
- agent.model = { ...model };
91
+ ): LDAIConfigKind {
92
+ const allVariables = { ...variables, ldctx: context };
93
+
94
+ if ('messages' in config && config.messages) {
95
+ return {
96
+ ...config,
97
+ messages: config.messages.map((entry: LDMessage) => ({
98
+ ...entry,
99
+ content: this._interpolateTemplate(entry.content, allVariables),
100
+ })),
101
+ };
149
102
  }
150
103
 
151
- if (configProvider) {
152
- agent.provider = { ...configProvider };
104
+ if ('instructions' in config && config.instructions) {
105
+ return {
106
+ ...config,
107
+ instructions: this._interpolateTemplate(config.instructions, allVariables),
108
+ };
153
109
  }
154
110
 
155
- const allVariables = { ...variables, ldctx: context };
111
+ return config;
112
+ }
156
113
 
157
- if (instructions) {
158
- agent.instructions = this._interpolateTemplate(instructions, allVariables);
159
- }
114
+ private async _initializeJudges(
115
+ judgeConfigs: LDJudge[],
116
+ context: LDContext,
117
+ variables?: Record<string, unknown>,
118
+ defaultAiProvider?: SupportedAIProvider,
119
+ ): Promise<Record<string, Judge>> {
120
+ const judges: Record<string, Judge> = {};
121
+
122
+ const judgePromises = judgeConfigs.map(async (judgeConfig) => {
123
+ const judge = await this.createJudge(
124
+ judgeConfig.key,
125
+ context,
126
+ { enabled: false },
127
+ variables,
128
+ defaultAiProvider,
129
+ );
130
+ return judge ? { key: judgeConfig.key, judge } : null;
131
+ });
132
+
133
+ const results = await Promise.all(judgePromises);
134
+ results.forEach((result) => {
135
+ if (result) {
136
+ judges[result.key] = result.judge;
137
+ }
138
+ });
139
+
140
+ return judges;
141
+ }
160
142
 
161
- return agent;
143
+ async completionConfig(
144
+ key: string,
145
+ context: LDContext,
146
+ defaultValue: LDAICompletionConfigDefault,
147
+ variables?: Record<string, unknown>,
148
+ ): Promise<LDAICompletionConfig> {
149
+ this._ldClient.track(TRACK_CONFIG_SINGLE, context, key, 1);
150
+
151
+ const config = await this._evaluate(key, context, defaultValue, 'completion', variables);
152
+ return config as LDAICompletionConfig;
162
153
  }
163
154
 
155
+ /**
156
+ * @deprecated Use `completionConfig` instead. This method will be removed in a future version.
157
+ */
164
158
  async config(
165
159
  key: string,
166
160
  context: LDContext,
167
- defaultValue: LDAIDefaults,
161
+ defaultValue: LDAICompletionConfigDefault,
168
162
  variables?: Record<string, unknown>,
169
- ): Promise<LDAIConfig> {
170
- this._ldClient.track('$ld:ai:config:function:single', context, key, 1);
171
-
172
- const {
173
- tracker,
174
- enabled,
175
- model,
176
- provider: configProvider,
177
- messages,
178
- } = await this._evaluate(key, context, defaultValue);
179
-
180
- const config: Omit<LDAIConfig, 'toVercelAISDK'> = {
181
- tracker,
182
- enabled,
183
- };
184
-
185
- // We are going to modify the contents before returning them, so we make a copy.
186
- // This isn't a deep copy and the application developer should not modify the returned content.
187
- if (model) {
188
- config.model = { ...model };
189
- }
190
- if (configProvider) {
191
- config.provider = { ...configProvider };
192
- }
193
- const allVariables = { ...variables, ldctx: context };
163
+ ): Promise<LDAICompletionConfig> {
164
+ return this.completionConfig(key, context, defaultValue, variables);
165
+ }
194
166
 
195
- if (messages) {
196
- config.messages = messages.map((entry: any) => ({
197
- ...entry,
198
- content: this._interpolateTemplate(entry.content, allVariables),
199
- }));
200
- }
167
+ async judgeConfig(
168
+ key: string,
169
+ context: LDContext,
170
+ defaultValue: LDAIJudgeConfigDefault,
171
+ variables?: Record<string, unknown>,
172
+ ): Promise<LDAIJudgeConfig> {
173
+ this._ldClient.track(TRACK_JUDGE_SINGLE, context, key, 1);
174
+
175
+ const config = await this._evaluate(key, context, defaultValue, 'judge', variables);
176
+ return config as LDAIJudgeConfig;
177
+ }
201
178
 
202
- const mapper = new LDAIConfigMapper(config.model, config.provider, config.messages);
179
+ async agentConfig(
180
+ key: string,
181
+ context: LDContext,
182
+ defaultValue: LDAIAgentConfigDefault,
183
+ variables?: Record<string, unknown>,
184
+ ): Promise<LDAIAgentConfig> {
185
+ this._ldClient.track(TRACK_AGENT_SINGLE, context, key, 1);
203
186
 
204
- return {
205
- ...config,
206
- toVercelAISDK: <TMod>(
207
- sdkProvider: VercelAISDKProvider<TMod> | Record<string, VercelAISDKProvider<TMod>>,
208
- options?: VercelAISDKMapOptions | undefined,
209
- ): VercelAISDKConfig<TMod> => mapper.toVercelAISDK(sdkProvider, options),
210
- };
187
+ const config = await this._evaluate(key, context, defaultValue, 'agent', variables);
188
+ return config as LDAIAgentConfig;
211
189
  }
212
190
 
191
+ /**
192
+ * @deprecated Use `agentConfig` instead. This method will be removed in a future version.
193
+ */
213
194
  async agent(
214
195
  key: string,
215
196
  context: LDContext,
216
- defaultValue: LDAIAgentDefaults,
197
+ defaultValue: LDAIAgentConfigDefault,
217
198
  variables?: Record<string, unknown>,
218
- ): Promise<LDAIAgent> {
219
- // Track agent usage
220
- this._ldClient.track('$ld:ai:agent:function:single', context, key, 1);
221
-
222
- return this._evaluateAgent(key, context, defaultValue, variables);
199
+ ): Promise<LDAIAgentConfig> {
200
+ return this.agentConfig(key, context, defaultValue, variables);
223
201
  }
224
202
 
225
- async agents<const T extends readonly (LDAIAgentConfig & { defaultValue: LDAIAgentDefaults })[]>(
203
+ async agentConfigs<const T extends readonly LDAIAgentRequestConfig[]>(
226
204
  agentConfigs: T,
227
205
  context: LDContext,
228
- ): Promise<Record<T[number]['key'], LDAIAgent>> {
229
- // Track multiple agents usage
230
- this._ldClient.track(
231
- '$ld:ai:agent:function:multiple',
232
- context,
233
- agentConfigs.length,
234
- agentConfigs.length,
235
- );
206
+ ): Promise<Record<T[number]['key'], LDAIAgentConfig>> {
207
+ this._ldClient.track(TRACK_AGENT_MULTIPLE, context, agentConfigs.length, agentConfigs.length);
236
208
 
237
- const agents = {} as Record<T[number]['key'], LDAIAgent>;
209
+ const agents = {} as Record<T[number]['key'], LDAIAgentConfig>;
238
210
 
239
211
  await Promise.all(
240
212
  agentConfigs.map(async (config) => {
241
- const agent = await this._evaluateAgent(
213
+ const agent = await this._evaluate(
242
214
  config.key,
243
215
  context,
244
216
  config.defaultValue,
217
+ 'agent',
245
218
  config.variables,
246
219
  );
247
- agents[config.key as T[number]['key']] = agent;
220
+ agents[config.key as T[number]['key']] = agent as LDAIAgentConfig;
248
221
  }),
249
222
  );
250
223
 
251
224
  return agents;
252
225
  }
253
226
 
254
- async initChat(
227
+ /**
228
+ * @deprecated Use `agentConfigs` instead. This method will be removed in a future version.
229
+ */
230
+ async agents<const T extends readonly LDAIAgentRequestConfig[]>(
231
+ agentConfigs: T,
232
+ context: LDContext,
233
+ ): Promise<Record<T[number]['key'], LDAIAgentConfig>> {
234
+ return this.agentConfigs(agentConfigs, context);
235
+ }
236
+
237
+ async createChat(
255
238
  key: string,
256
239
  context: LDContext,
257
- defaultValue: LDAIDefaults,
240
+ defaultValue: LDAICompletionConfigDefault,
258
241
  variables?: Record<string, unknown>,
259
242
  defaultAiProvider?: SupportedAIProvider,
260
243
  ): Promise<TrackedChat | undefined> {
261
- // Track chat initialization
262
- this._ldClient.track('$ld:ai:config:function:initChat', context, key, 1);
244
+ this._ldClient.track(TRACK_CONFIG_CREATE_CHAT, context, key, 1);
263
245
 
264
- const aiConfig = await this.config(key, context, defaultValue, variables);
246
+ const config = await this.completionConfig(key, context, defaultValue, variables);
265
247
 
266
- // Return undefined if the configuration is disabled
267
- if (!aiConfig.enabled) {
248
+ if (!config.enabled || !config.tracker) {
268
249
  this._logger?.info(`Chat configuration is disabled: ${key}`);
269
250
  return undefined;
270
251
  }
271
252
 
272
- // Create the AIProvider instance
273
- const provider = await AIProviderFactory.create(aiConfig, this._logger, defaultAiProvider);
253
+ const provider = await AIProviderFactory.create(config, this._logger, defaultAiProvider);
274
254
  if (!provider) {
275
255
  return undefined;
276
256
  }
277
257
 
278
- // Create the TrackedChat instance with the provider
279
- return new TrackedChat(aiConfig, aiConfig.tracker, provider);
258
+ const judges = await this._initializeJudges(
259
+ config.judgeConfiguration?.judges ?? [],
260
+ context,
261
+ variables,
262
+ defaultAiProvider,
263
+ );
264
+
265
+ return new TrackedChat(config, config.tracker, provider, judges, this._logger);
266
+ }
267
+
268
+ async createJudge(
269
+ key: string,
270
+ context: LDContext,
271
+ defaultValue: LDAIJudgeConfigDefault,
272
+ variables?: Record<string, unknown>,
273
+ defaultAiProvider?: SupportedAIProvider,
274
+ ): Promise<Judge | undefined> {
275
+ this._ldClient.track(TRACK_JUDGE_CREATE, context, key, 1);
276
+
277
+ try {
278
+ if (variables?.message_history !== undefined) {
279
+ this._logger?.warn(
280
+ "The variable 'message_history' is reserved by the judge and will be ignored.",
281
+ );
282
+ }
283
+ if (variables?.response_to_evaluate !== undefined) {
284
+ this._logger?.warn(
285
+ "The variable 'response_to_evaluate' is reserved by the judge and will be ignored.",
286
+ );
287
+ }
288
+
289
+ // Overwrite reserved variables to ensure they remain as placeholders for judge evaluation
290
+ const extendedVariables = {
291
+ ...variables,
292
+ message_history: '{{message_history}}',
293
+ response_to_evaluate: '{{response_to_evaluate}}',
294
+ };
295
+
296
+ const judgeConfig = await this.judgeConfig(key, context, defaultValue, extendedVariables);
297
+
298
+ if (!judgeConfig.enabled || !judgeConfig.tracker) {
299
+ this._logger?.info(`Judge configuration is disabled: ${key}`);
300
+ return undefined;
301
+ }
302
+
303
+ const provider = await AIProviderFactory.create(judgeConfig, this._logger, defaultAiProvider);
304
+ if (!provider) {
305
+ return undefined;
306
+ }
307
+
308
+ return new Judge(judgeConfig, judgeConfig.tracker, provider, this._logger);
309
+ } catch (error) {
310
+ this._logger?.error(`Failed to initialize judge ${key}:`, error);
311
+ return undefined;
312
+ }
313
+ }
314
+
315
+ /**
316
+ * @deprecated Use `createChat` instead. This method will be removed in a future version.
317
+ */
318
+ async initChat(
319
+ key: string,
320
+ context: LDContext,
321
+ defaultValue: LDAICompletionConfigDefault,
322
+ variables?: Record<string, unknown>,
323
+ defaultAiProvider?: SupportedAIProvider,
324
+ ): Promise<TrackedChat | undefined> {
325
+ return this.createChat(key, context, defaultValue, variables, defaultAiProvider);
280
326
  }
281
327
  }