@launchdarkly/server-sdk-ai 0.14.1 → 0.15.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 (197) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/index.cjs +1117 -0
  3. package/dist/index.cjs.map +1 -0
  4. package/dist/index.d.cts +1022 -0
  5. package/dist/index.d.ts +1022 -0
  6. package/dist/index.js +1071 -0
  7. package/dist/index.js.map +1 -0
  8. package/package.json +22 -5
  9. package/__tests__/Judge.test.ts +0 -521
  10. package/__tests__/LDAIClientImpl.test.ts +0 -594
  11. package/__tests__/LDAIConfigTrackerImpl.test.ts +0 -815
  12. package/__tests__/TokenUsage.test.ts +0 -119
  13. package/__tests__/TrackedChat.test.ts +0 -231
  14. package/dist/package.json +0 -53
  15. package/dist/src/LDAIClientImpl.d.ts +0 -39
  16. package/dist/src/LDAIClientImpl.d.ts.map +0 -1
  17. package/dist/src/LDAIClientImpl.js +0 -164
  18. package/dist/src/LDAIClientImpl.js.map +0 -1
  19. package/dist/src/LDAIConfigTrackerImpl.d.ts +0 -74
  20. package/dist/src/LDAIConfigTrackerImpl.d.ts.map +0 -1
  21. package/dist/src/LDAIConfigTrackerImpl.js +0 -207
  22. package/dist/src/LDAIConfigTrackerImpl.js.map +0 -1
  23. package/dist/src/LDClientMin.d.ts +0 -11
  24. package/dist/src/LDClientMin.d.ts.map +0 -1
  25. package/dist/src/LDClientMin.js +0 -3
  26. package/dist/src/LDClientMin.js.map +0 -1
  27. package/dist/src/api/LDAIClient.d.ts +0 -258
  28. package/dist/src/api/LDAIClient.d.ts.map +0 -1
  29. package/dist/src/api/LDAIClient.js +0 -3
  30. package/dist/src/api/LDAIClient.js.map +0 -1
  31. package/dist/src/api/chat/TrackedChat.d.ts +0 -72
  32. package/dist/src/api/chat/TrackedChat.d.ts.map +0 -1
  33. package/dist/src/api/chat/TrackedChat.js +0 -125
  34. package/dist/src/api/chat/TrackedChat.js.map +0 -1
  35. package/dist/src/api/chat/index.d.ts +0 -3
  36. package/dist/src/api/chat/index.d.ts.map +0 -1
  37. package/dist/src/api/chat/index.js +0 -19
  38. package/dist/src/api/chat/index.js.map +0 -1
  39. package/dist/src/api/chat/types.d.ts +0 -22
  40. package/dist/src/api/chat/types.d.ts.map +0 -1
  41. package/dist/src/api/chat/types.js +0 -3
  42. package/dist/src/api/chat/types.js.map +0 -1
  43. package/dist/src/api/config/LDAIConfigTracker.d.ts +0 -209
  44. package/dist/src/api/config/LDAIConfigTracker.d.ts.map +0 -1
  45. package/dist/src/api/config/LDAIConfigTracker.js +0 -3
  46. package/dist/src/api/config/LDAIConfigTracker.js.map +0 -1
  47. package/dist/src/api/config/LDAIConfigUtils.d.ts +0 -2
  48. package/dist/src/api/config/LDAIConfigUtils.d.ts.map +0 -1
  49. package/dist/src/api/config/LDAIConfigUtils.js +0 -145
  50. package/dist/src/api/config/LDAIConfigUtils.js.map +0 -1
  51. package/dist/src/api/config/index.d.ts +0 -3
  52. package/dist/src/api/config/index.d.ts.map +0 -1
  53. package/dist/src/api/config/index.js +0 -18
  54. package/dist/src/api/config/index.js.map +0 -1
  55. package/dist/src/api/config/types.d.ts +0 -206
  56. package/dist/src/api/config/types.d.ts.map +0 -1
  57. package/dist/src/api/config/types.js +0 -3
  58. package/dist/src/api/config/types.js.map +0 -1
  59. package/dist/src/api/index.d.ts +0 -7
  60. package/dist/src/api/index.d.ts.map +0 -1
  61. package/dist/src/api/index.js +0 -23
  62. package/dist/src/api/index.js.map +0 -1
  63. package/dist/src/api/judge/EvaluationSchemaBuilder.d.ts +0 -11
  64. package/dist/src/api/judge/EvaluationSchemaBuilder.d.ts.map +0 -1
  65. package/dist/src/api/judge/EvaluationSchemaBuilder.js +0 -52
  66. package/dist/src/api/judge/EvaluationSchemaBuilder.js.map +0 -1
  67. package/dist/src/api/judge/Judge.d.ts +0 -63
  68. package/dist/src/api/judge/Judge.d.ts.map +0 -1
  69. package/dist/src/api/judge/Judge.js +0 -151
  70. package/dist/src/api/judge/Judge.js.map +0 -1
  71. package/dist/src/api/judge/index.d.ts +0 -3
  72. package/dist/src/api/judge/index.d.ts.map +0 -1
  73. package/dist/src/api/judge/index.js +0 -6
  74. package/dist/src/api/judge/index.js.map +0 -1
  75. package/dist/src/api/judge/types.d.ts +0 -37
  76. package/dist/src/api/judge/types.d.ts.map +0 -1
  77. package/dist/src/api/judge/types.js +0 -3
  78. package/dist/src/api/judge/types.js.map +0 -1
  79. package/dist/src/api/metrics/BedrockTokenUsage.d.ts +0 -7
  80. package/dist/src/api/metrics/BedrockTokenUsage.d.ts.map +0 -1
  81. package/dist/src/api/metrics/BedrockTokenUsage.js +0 -12
  82. package/dist/src/api/metrics/BedrockTokenUsage.js.map +0 -1
  83. package/dist/src/api/metrics/LDAIMetrics.d.ts +0 -17
  84. package/dist/src/api/metrics/LDAIMetrics.d.ts.map +0 -1
  85. package/dist/src/api/metrics/LDAIMetrics.js +0 -3
  86. package/dist/src/api/metrics/LDAIMetrics.js.map +0 -1
  87. package/dist/src/api/metrics/LDFeedbackKind.d.ts +0 -14
  88. package/dist/src/api/metrics/LDFeedbackKind.d.ts.map +0 -1
  89. package/dist/src/api/metrics/LDFeedbackKind.js +0 -18
  90. package/dist/src/api/metrics/LDFeedbackKind.js.map +0 -1
  91. package/dist/src/api/metrics/LDTokenUsage.d.ts +0 -18
  92. package/dist/src/api/metrics/LDTokenUsage.d.ts.map +0 -1
  93. package/dist/src/api/metrics/LDTokenUsage.js +0 -3
  94. package/dist/src/api/metrics/LDTokenUsage.js.map +0 -1
  95. package/dist/src/api/metrics/OpenAiUsage.d.ts +0 -7
  96. package/dist/src/api/metrics/OpenAiUsage.d.ts.map +0 -1
  97. package/dist/src/api/metrics/OpenAiUsage.js +0 -13
  98. package/dist/src/api/metrics/OpenAiUsage.js.map +0 -1
  99. package/dist/src/api/metrics/VercelAISDKTokenUsage.d.ts +0 -9
  100. package/dist/src/api/metrics/VercelAISDKTokenUsage.d.ts.map +0 -1
  101. package/dist/src/api/metrics/VercelAISDKTokenUsage.js +0 -13
  102. package/dist/src/api/metrics/VercelAISDKTokenUsage.js.map +0 -1
  103. package/dist/src/api/metrics/index.d.ts +0 -7
  104. package/dist/src/api/metrics/index.d.ts.map +0 -1
  105. package/dist/src/api/metrics/index.js +0 -23
  106. package/dist/src/api/metrics/index.js.map +0 -1
  107. package/dist/src/api/providers/AIProvider.d.ts +0 -52
  108. package/dist/src/api/providers/AIProvider.d.ts.map +0 -1
  109. package/dist/src/api/providers/AIProvider.js +0 -88
  110. package/dist/src/api/providers/AIProvider.js.map +0 -1
  111. package/dist/src/api/providers/AIProviderFactory.d.ts +0 -39
  112. package/dist/src/api/providers/AIProviderFactory.d.ts.map +0 -1
  113. package/dist/src/api/providers/AIProviderFactory.js +0 -102
  114. package/dist/src/api/providers/AIProviderFactory.js.map +0 -1
  115. package/dist/src/api/providers/index.d.ts +0 -3
  116. package/dist/src/api/providers/index.d.ts.map +0 -1
  117. package/dist/src/api/providers/index.js +0 -19
  118. package/dist/src/api/providers/index.js.map +0 -1
  119. package/dist/src/index.d.ts +0 -19
  120. package/dist/src/index.d.ts.map +0 -1
  121. package/dist/src/index.js +0 -29
  122. package/dist/src/index.js.map +0 -1
  123. package/docs/.nojekyll +0 -1
  124. package/docs/assets/highlight.css +0 -92
  125. package/docs/assets/main.js +0 -58
  126. package/docs/assets/search.js +0 -1
  127. package/docs/assets/style.css +0 -1379
  128. package/docs/classes/AIProvider.html +0 -210
  129. package/docs/classes/AIProviderFactory.html +0 -208
  130. package/docs/classes/Judge.html +0 -322
  131. package/docs/classes/TrackedChat.html +0 -322
  132. package/docs/enums/LDFeedbackKind.html +0 -115
  133. package/docs/functions/createBedrockTokenUsage.html +0 -94
  134. package/docs/functions/createOpenAiUsage.html +0 -94
  135. package/docs/functions/createVercelAISDKTokenUsage.html +0 -98
  136. package/docs/functions/initAi.html +0 -93
  137. package/docs/index.html +0 -136
  138. package/docs/interfaces/ChatResponse.html +0 -130
  139. package/docs/interfaces/EvalScore.html +0 -119
  140. package/docs/interfaces/JudgeResponse.html +0 -139
  141. package/docs/interfaces/LDAIAgentConfig.html +0 -178
  142. package/docs/interfaces/LDAIAgentConfigDefault.html +0 -155
  143. package/docs/interfaces/LDAIAgentRequestConfig.html +0 -129
  144. package/docs/interfaces/LDAIClient.html +0 -449
  145. package/docs/interfaces/LDAICompletionConfig.html +0 -178
  146. package/docs/interfaces/LDAICompletionConfigDefault.html +0 -155
  147. package/docs/interfaces/LDAIConfig.html +0 -158
  148. package/docs/interfaces/LDAIConfigDefault.html +0 -133
  149. package/docs/interfaces/LDAIConfigTracker.html +0 -530
  150. package/docs/interfaces/LDAIJudgeConfig.html +0 -178
  151. package/docs/interfaces/LDAIJudgeConfigDefault.html +0 -155
  152. package/docs/interfaces/LDAIMetrics.html +0 -121
  153. package/docs/interfaces/LDJudge.html +0 -119
  154. package/docs/interfaces/LDJudgeConfiguration.html +0 -109
  155. package/docs/interfaces/LDLogger.html +0 -189
  156. package/docs/interfaces/LDMessage.html +0 -119
  157. package/docs/interfaces/LDModelConfig.html +0 -139
  158. package/docs/interfaces/LDProviderConfig.html +0 -105
  159. package/docs/interfaces/LDTokenUsage.html +0 -129
  160. package/docs/interfaces/StructuredResponse.html +0 -129
  161. package/docs/types/LDAIConfigDefaultKind.html +0 -81
  162. package/docs/types/LDAIConfigKind.html +0 -81
  163. package/docs/types/LDAIConfigMode.html +0 -81
  164. package/docs/types/SupportedAIProvider.html +0 -81
  165. package/docs/variables/SUPPORTED_AI_PROVIDERS.html +0 -81
  166. package/jest.config.js +0 -7
  167. package/src/LDAIClientImpl.ts +0 -327
  168. package/src/LDAIConfigTrackerImpl.ts +0 -288
  169. package/src/LDClientMin.ts +0 -18
  170. package/src/api/LDAIClient.ts +0 -325
  171. package/src/api/chat/TrackedChat.ts +0 -163
  172. package/src/api/chat/index.ts +0 -2
  173. package/src/api/chat/types.ts +0 -24
  174. package/src/api/config/LDAIConfigTracker.ts +0 -238
  175. package/src/api/config/LDAIConfigUtils.ts +0 -212
  176. package/src/api/config/index.ts +0 -3
  177. package/src/api/config/types.ts +0 -260
  178. package/src/api/index.ts +0 -6
  179. package/src/api/judge/EvaluationSchemaBuilder.ts +0 -54
  180. package/src/api/judge/Judge.ts +0 -218
  181. package/src/api/judge/index.ts +0 -2
  182. package/src/api/judge/types.ts +0 -41
  183. package/src/api/metrics/BedrockTokenUsage.ts +0 -13
  184. package/src/api/metrics/LDAIMetrics.ts +0 -18
  185. package/src/api/metrics/LDFeedbackKind.ts +0 -13
  186. package/src/api/metrics/LDTokenUsage.ts +0 -19
  187. package/src/api/metrics/OpenAiUsage.ts +0 -13
  188. package/src/api/metrics/VercelAISDKTokenUsage.ts +0 -15
  189. package/src/api/metrics/index.ts +0 -6
  190. package/src/api/providers/AIProvider.ts +0 -94
  191. package/src/api/providers/AIProviderFactory.ts +0 -152
  192. package/src/api/providers/index.ts +0 -2
  193. package/src/index.ts +0 -24
  194. package/tsconfig.eslint.json +0 -5
  195. package/tsconfig.json +0 -21
  196. package/tsconfig.ref.json +0 -7
  197. package/typedoc.json +0 -5
@@ -1,119 +0,0 @@
1
- import {
2
- createBedrockTokenUsage,
3
- createOpenAiUsage,
4
- createVercelAISDKTokenUsage,
5
- } from '../src/api/metrics';
6
-
7
- it('createBedrockTokenUsage should create token usage with all values provided', () => {
8
- const usage = createBedrockTokenUsage({
9
- totalTokens: 100,
10
- inputTokens: 40,
11
- outputTokens: 60,
12
- });
13
-
14
- expect(usage).toEqual({
15
- total: 100,
16
- input: 40,
17
- output: 60,
18
- });
19
- });
20
-
21
- it('createBedrockTokenUsage should default to 0 for missing values', () => {
22
- const usage = createBedrockTokenUsage({});
23
-
24
- expect(usage).toEqual({
25
- total: 0,
26
- input: 0,
27
- output: 0,
28
- });
29
- });
30
-
31
- it('createBedrockTokenUsage should handle explicitly undefined values', () => {
32
- const usage = createBedrockTokenUsage({
33
- totalTokens: undefined,
34
- inputTokens: 40,
35
- outputTokens: undefined,
36
- });
37
-
38
- expect(usage).toEqual({
39
- total: 0,
40
- input: 40,
41
- output: 0,
42
- });
43
- });
44
-
45
- it('createOpenAiUsage should create token usage with all values provided', () => {
46
- const usage = createOpenAiUsage({
47
- total_tokens: 100,
48
- prompt_tokens: 40,
49
- completion_tokens: 60,
50
- });
51
-
52
- expect(usage).toEqual({
53
- total: 100,
54
- input: 40,
55
- output: 60,
56
- });
57
- });
58
-
59
- it('createOpenAiUsage should default to 0 for missing values', () => {
60
- const usage = createOpenAiUsage({});
61
-
62
- expect(usage).toEqual({
63
- total: 0,
64
- input: 0,
65
- output: 0,
66
- });
67
- });
68
-
69
- it('createOpenAiUsage should handle explicitly undefined values', () => {
70
- const usage = createOpenAiUsage({
71
- total_tokens: undefined,
72
- prompt_tokens: 40,
73
- completion_tokens: undefined,
74
- });
75
-
76
- expect(usage).toEqual({
77
- total: 0,
78
- input: 40,
79
- output: 0,
80
- });
81
- });
82
-
83
- it('createVercelAISDKTokenUsage should create token usage with all values provided', () => {
84
- const usage = createVercelAISDKTokenUsage({
85
- totalTokens: 100,
86
- promptTokens: 40,
87
- completionTokens: 60,
88
- });
89
-
90
- expect(usage).toEqual({
91
- total: 100,
92
- input: 40,
93
- output: 60,
94
- });
95
- });
96
-
97
- it('createVercelAISDKTokenUsage should default to 0 for missing values', () => {
98
- const usage = createVercelAISDKTokenUsage({});
99
-
100
- expect(usage).toEqual({
101
- total: 0,
102
- input: 0,
103
- output: 0,
104
- });
105
- });
106
-
107
- it('createVercelAISDKTokenUsage should handle explicitly undefined values', () => {
108
- const usage = createVercelAISDKTokenUsage({
109
- totalTokens: undefined,
110
- promptTokens: 40,
111
- completionTokens: undefined,
112
- });
113
-
114
- expect(usage).toEqual({
115
- total: 0,
116
- input: 40,
117
- output: 0,
118
- });
119
- });
@@ -1,231 +0,0 @@
1
- import { TrackedChat } from '../src/api/chat/TrackedChat';
2
- import { ChatResponse } from '../src/api/chat/types';
3
- import { LDAIConfigTracker } from '../src/api/config/LDAIConfigTracker';
4
- import { LDAICompletionConfig, LDMessage } from '../src/api/config/types';
5
- import { AIProvider } from '../src/api/providers/AIProvider';
6
-
7
- describe('TrackedChat', () => {
8
- let mockProvider: jest.Mocked<AIProvider>;
9
- let mockTracker: jest.Mocked<LDAIConfigTracker>;
10
- let aiConfig: LDAICompletionConfig;
11
-
12
- beforeEach(() => {
13
- // Mock the AIProvider
14
- mockProvider = {
15
- invokeModel: jest.fn(),
16
- } as any;
17
-
18
- // Mock the LDAIConfigTracker
19
- mockTracker = {
20
- trackMetricsOf: jest.fn(),
21
- trackDuration: jest.fn(),
22
- trackTokens: jest.fn(),
23
- trackSuccess: jest.fn(),
24
- trackError: jest.fn(),
25
- trackFeedback: jest.fn(),
26
- trackTimeToFirstToken: jest.fn(),
27
- trackDurationOf: jest.fn(),
28
- trackOpenAIMetrics: jest.fn(),
29
- trackBedrockConverseMetrics: jest.fn(),
30
- trackVercelAIMetrics: jest.fn(),
31
- getSummary: jest.fn(),
32
- } as any;
33
-
34
- // Create a basic AI config
35
- aiConfig = {
36
- key: 'test-config',
37
- enabled: true,
38
- messages: [{ role: 'system', content: 'You are a helpful assistant.' }],
39
- model: { name: 'gpt-4' },
40
- provider: { name: 'openai' },
41
- tracker: mockTracker,
42
- };
43
- });
44
-
45
- describe('appendMessages', () => {
46
- it('appends messages to the conversation history', () => {
47
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
48
-
49
- const messagesToAppend: LDMessage[] = [
50
- { role: 'user', content: 'Hello' },
51
- { role: 'assistant', content: 'Hi there!' },
52
- ];
53
-
54
- chat.appendMessages(messagesToAppend);
55
-
56
- const messages = chat.getMessages(false);
57
- expect(messages).toHaveLength(2);
58
- expect(messages[0]).toEqual({ role: 'user', content: 'Hello' });
59
- expect(messages[1]).toEqual({ role: 'assistant', content: 'Hi there!' });
60
- });
61
-
62
- it('appends multiple message batches sequentially', () => {
63
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
64
-
65
- chat.appendMessages([{ role: 'user', content: 'First message' }]);
66
- chat.appendMessages([{ role: 'assistant', content: 'Second message' }]);
67
- chat.appendMessages([{ role: 'user', content: 'Third message' }]);
68
-
69
- const messages = chat.getMessages(false);
70
- expect(messages).toHaveLength(3);
71
- expect(messages[0].content).toBe('First message');
72
- expect(messages[1].content).toBe('Second message');
73
- expect(messages[2].content).toBe('Third message');
74
- });
75
-
76
- it('handles empty message array', () => {
77
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
78
-
79
- chat.appendMessages([]);
80
-
81
- const messages = chat.getMessages(false);
82
- expect(messages).toHaveLength(0);
83
- });
84
- });
85
-
86
- describe('getMessages', () => {
87
- it('returns only conversation history when includeConfigMessages is false', () => {
88
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
89
-
90
- chat.appendMessages([
91
- { role: 'user', content: 'User message' },
92
- { role: 'assistant', content: 'Assistant message' },
93
- ]);
94
-
95
- const messages = chat.getMessages(false);
96
-
97
- expect(messages).toHaveLength(2);
98
- expect(messages[0]).toEqual({ role: 'user', content: 'User message' });
99
- expect(messages[1]).toEqual({ role: 'assistant', content: 'Assistant message' });
100
- });
101
-
102
- it('returns only conversation history when includeConfigMessages is omitted (defaults to false)', () => {
103
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
104
-
105
- chat.appendMessages([{ role: 'user', content: 'User message' }]);
106
-
107
- const messages = chat.getMessages();
108
-
109
- expect(messages).toHaveLength(1);
110
- expect(messages[0]).toEqual({ role: 'user', content: 'User message' });
111
- });
112
-
113
- it('returns config messages prepended when includeConfigMessages is true', () => {
114
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
115
-
116
- chat.appendMessages([
117
- { role: 'user', content: 'User message' },
118
- { role: 'assistant', content: 'Assistant message' },
119
- ]);
120
-
121
- const messages = chat.getMessages(true);
122
-
123
- expect(messages).toHaveLength(3);
124
- expect(messages[0]).toEqual({ role: 'system', content: 'You are a helpful assistant.' });
125
- expect(messages[1]).toEqual({ role: 'user', content: 'User message' });
126
- expect(messages[2]).toEqual({ role: 'assistant', content: 'Assistant message' });
127
- });
128
-
129
- it('returns only config messages when no conversation history exists and includeConfigMessages is true', () => {
130
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
131
-
132
- const messages = chat.getMessages(true);
133
-
134
- expect(messages).toHaveLength(1);
135
- expect(messages[0]).toEqual({ role: 'system', content: 'You are a helpful assistant.' });
136
- });
137
-
138
- it('returns empty array when no messages exist and includeConfigMessages is false', () => {
139
- const configWithoutMessages: LDAICompletionConfig = {
140
- ...aiConfig,
141
- messages: [],
142
- };
143
- const chat = new TrackedChat(configWithoutMessages, mockTracker, mockProvider);
144
-
145
- const messages = chat.getMessages(false);
146
-
147
- expect(messages).toHaveLength(0);
148
- });
149
-
150
- it('returns a copy of the messages array (not a reference)', () => {
151
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
152
-
153
- chat.appendMessages([{ role: 'user', content: 'Original message' }]);
154
-
155
- const messages1 = chat.getMessages();
156
- const messages2 = chat.getMessages();
157
-
158
- expect(messages1).not.toBe(messages2);
159
- expect(messages1).toEqual(messages2);
160
-
161
- // Modifying returned array should not affect internal state
162
- messages1.push({ role: 'assistant', content: 'Modified' });
163
-
164
- const messages3 = chat.getMessages();
165
- expect(messages3).toHaveLength(1);
166
- expect(messages3[0].content).toBe('Original message');
167
- });
168
-
169
- it('handles undefined config messages gracefully', () => {
170
- const configWithoutMessages: LDAICompletionConfig = {
171
- ...aiConfig,
172
- messages: undefined,
173
- };
174
- const chat = new TrackedChat(configWithoutMessages, mockTracker, mockProvider);
175
-
176
- chat.appendMessages([{ role: 'user', content: 'User message' }]);
177
-
178
- const messagesWithConfig = chat.getMessages(true);
179
- expect(messagesWithConfig).toHaveLength(1);
180
- expect(messagesWithConfig[0].content).toBe('User message');
181
-
182
- const messagesWithoutConfig = chat.getMessages(false);
183
- expect(messagesWithoutConfig).toHaveLength(1);
184
- expect(messagesWithoutConfig[0].content).toBe('User message');
185
- });
186
- });
187
-
188
- describe('integration with invoke', () => {
189
- it('adds messages from invoke to history accessible via getMessages', async () => {
190
- const mockResponse: ChatResponse = {
191
- message: { role: 'assistant', content: 'Response from model' },
192
- metrics: { success: true },
193
- };
194
-
195
- mockTracker.trackMetricsOf.mockImplementation(async (extractor, func) => func());
196
-
197
- mockProvider.invokeModel.mockResolvedValue(mockResponse);
198
-
199
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
200
-
201
- await chat.invoke('Hello');
202
-
203
- const messages = chat.getMessages(false);
204
- expect(messages).toHaveLength(2);
205
- expect(messages[0]).toEqual({ role: 'user', content: 'Hello' });
206
- expect(messages[1]).toEqual({ role: 'assistant', content: 'Response from model' });
207
- });
208
-
209
- it('preserves appended messages when invoking', async () => {
210
- const mockResponse: ChatResponse = {
211
- message: { role: 'assistant', content: 'Response' },
212
- metrics: { success: true },
213
- };
214
-
215
- mockTracker.trackMetricsOf.mockImplementation(async (extractor, func) => func());
216
-
217
- mockProvider.invokeModel.mockResolvedValue(mockResponse);
218
-
219
- const chat = new TrackedChat(aiConfig, mockTracker, mockProvider);
220
-
221
- chat.appendMessages([{ role: 'user', content: 'Pre-appended message' }]);
222
- await chat.invoke('New user input');
223
-
224
- const messages = chat.getMessages(false);
225
- expect(messages).toHaveLength(3);
226
- expect(messages[0].content).toBe('Pre-appended message');
227
- expect(messages[1].content).toBe('New user input');
228
- expect(messages[2].content).toBe('Response');
229
- });
230
- });
231
- });
package/dist/package.json DELETED
@@ -1,53 +0,0 @@
1
- {
2
- "name": "@launchdarkly/server-sdk-ai",
3
- "version": "0.14.1",
4
- "description": "LaunchDarkly AI SDK for Server-Side JavaScript",
5
- "homepage": "https://github.com/launchdarkly/js-core/tree/main/packages/sdk/server-ai",
6
- "repository": {
7
- "type": "git",
8
- "url": "https://github.com/launchdarkly/js-core.git"
9
- },
10
- "main": "dist/src/index.js",
11
- "types": "dist/src/index.d.ts",
12
- "type": "commonjs",
13
- "scripts": {
14
- "build": "npx tsc",
15
- "lint": "npx eslint . --ext .ts",
16
- "prettier": "prettier --write '**/*.@(js|ts|tsx|json|css)' --ignore-path ../../../.prettierignore",
17
- "lint:fix": "yarn run lint --fix",
18
- "check": "yarn prettier && yarn lint && yarn build && yarn test",
19
- "test": "jest"
20
- },
21
- "keywords": [
22
- "launchdarkly",
23
- "ai",
24
- "llm"
25
- ],
26
- "author": "LaunchDarkly",
27
- "license": "Apache-2.0",
28
- "dependencies": {
29
- "mustache": "^4.2.0"
30
- },
31
- "devDependencies": {
32
- "@launchdarkly/js-server-sdk-common": "2.16.2",
33
- "@trivago/prettier-plugin-sort-imports": "^4.1.1",
34
- "@types/jest": "^29.5.3",
35
- "@types/mustache": "^4.2.5",
36
- "@typescript-eslint/eslint-plugin": "^6.20.0",
37
- "@typescript-eslint/parser": "^6.20.0",
38
- "eslint": "^8.45.0",
39
- "eslint-config-airbnb-base": "^15.0.0",
40
- "eslint-config-airbnb-typescript": "^17.1.0",
41
- "eslint-config-prettier": "^8.8.0",
42
- "eslint-plugin-import": "^2.27.5",
43
- "eslint-plugin-jest": "^27.6.3",
44
- "eslint-plugin-prettier": "^5.0.0",
45
- "jest": "^29.6.1",
46
- "prettier": "^3.0.0",
47
- "ts-jest": "^29.1.1",
48
- "typescript": "5.1.6"
49
- },
50
- "peerDependencies": {
51
- "@launchdarkly/js-server-sdk-common": "2.x"
52
- }
53
- }
@@ -1,39 +0,0 @@
1
- import { LDContext } from '@launchdarkly/js-server-sdk-common';
2
- import { TrackedChat } from './api/chat';
3
- import { LDAIAgentConfig, LDAIAgentConfigDefault, LDAIAgentRequestConfig, LDAICompletionConfig, LDAICompletionConfigDefault, LDAIJudgeConfig, LDAIJudgeConfigDefault } from './api/config';
4
- import { Judge } from './api/judge/Judge';
5
- import { LDAIClient } from './api/LDAIClient';
6
- import { SupportedAIProvider } from './api/providers';
7
- import { LDClientMin } from './LDClientMin';
8
- export declare class LDAIClientImpl implements LDAIClient {
9
- private _ldClient;
10
- private _logger?;
11
- constructor(_ldClient: LDClientMin);
12
- private _interpolateTemplate;
13
- private _evaluate;
14
- private _applyInterpolation;
15
- private _initializeJudges;
16
- completionConfig(key: string, context: LDContext, defaultValue: LDAICompletionConfigDefault, variables?: Record<string, unknown>): Promise<LDAICompletionConfig>;
17
- /**
18
- * @deprecated Use `completionConfig` instead. This method will be removed in a future version.
19
- */
20
- config(key: string, context: LDContext, defaultValue: LDAICompletionConfigDefault, variables?: Record<string, unknown>): Promise<LDAICompletionConfig>;
21
- judgeConfig(key: string, context: LDContext, defaultValue: LDAIJudgeConfigDefault, variables?: Record<string, unknown>): Promise<LDAIJudgeConfig>;
22
- agentConfig(key: string, context: LDContext, defaultValue: LDAIAgentConfigDefault, variables?: Record<string, unknown>): Promise<LDAIAgentConfig>;
23
- /**
24
- * @deprecated Use `agentConfig` instead. This method will be removed in a future version.
25
- */
26
- agent(key: string, context: LDContext, defaultValue: LDAIAgentConfigDefault, variables?: Record<string, unknown>): Promise<LDAIAgentConfig>;
27
- agentConfigs<const T extends readonly LDAIAgentRequestConfig[]>(agentConfigs: T, context: LDContext): Promise<Record<T[number]['key'], LDAIAgentConfig>>;
28
- /**
29
- * @deprecated Use `agentConfigs` instead. This method will be removed in a future version.
30
- */
31
- agents<const T extends readonly LDAIAgentRequestConfig[]>(agentConfigs: T, context: LDContext): Promise<Record<T[number]['key'], LDAIAgentConfig>>;
32
- createChat(key: string, context: LDContext, defaultValue: LDAICompletionConfigDefault, variables?: Record<string, unknown>, defaultAiProvider?: SupportedAIProvider): Promise<TrackedChat | undefined>;
33
- createJudge(key: string, context: LDContext, defaultValue: LDAIJudgeConfigDefault, variables?: Record<string, unknown>, defaultAiProvider?: SupportedAIProvider): Promise<Judge | undefined>;
34
- /**
35
- * @deprecated Use `createChat` instead. This method will be removed in a future version.
36
- */
37
- initChat(key: string, context: LDContext, defaultValue: LDAICompletionConfigDefault, variables?: Record<string, unknown>, defaultAiProvider?: SupportedAIProvider): Promise<TrackedChat | undefined>;
38
- }
39
- //# sourceMappingURL=LDAIClientImpl.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LDAIClientImpl.d.ts","sourceRoot":"","sources":["../../src/LDAIClientImpl.ts"],"names":[],"mappings":"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"}
@@ -1,164 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.LDAIClientImpl = void 0;
4
- const Mustache = require("mustache");
5
- const chat_1 = require("./api/chat");
6
- const LDAIConfigUtils_1 = require("./api/config/LDAIConfigUtils");
7
- const Judge_1 = require("./api/judge/Judge");
8
- const providers_1 = require("./api/providers");
9
- const LDAIConfigTrackerImpl_1 = require("./LDAIConfigTrackerImpl");
10
- /**
11
- * Tracking event keys for AI SDK usage metrics.
12
- */
13
- const TRACK_CONFIG_SINGLE = '$ld:ai:config:function:single';
14
- const TRACK_CONFIG_CREATE_CHAT = '$ld:ai:config:function:createChat';
15
- const TRACK_JUDGE_SINGLE = '$ld:ai:judge:function:single';
16
- const TRACK_JUDGE_CREATE = '$ld:ai:judge:function:createJudge';
17
- const TRACK_AGENT_SINGLE = '$ld:ai:agent:function:single';
18
- const TRACK_AGENT_MULTIPLE = '$ld:ai:agent:function:multiple';
19
- class LDAIClientImpl {
20
- constructor(_ldClient) {
21
- this._ldClient = _ldClient;
22
- this._logger = _ldClient.logger;
23
- }
24
- _interpolateTemplate(template, variables) {
25
- return Mustache.render(template, variables, undefined, { escape: (item) => item });
26
- }
27
- async _evaluate(key, context, defaultValue, mode, variables) {
28
- var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k, _l;
29
- const ldFlagValue = LDAIConfigUtils_1.LDAIConfigUtils.toFlagValue(defaultValue, mode);
30
- const value = await this._ldClient.variation(key, context, ldFlagValue);
31
- // Validate mode match
32
- // eslint-disable-next-line no-underscore-dangle
33
- const flagMode = (_b = (_a = value._ldMeta) === null || _a === void 0 ? void 0 : _a.mode) !== null && _b !== void 0 ? _b : 'completion';
34
- if (flagMode !== mode) {
35
- (_c = this._logger) === null || _c === void 0 ? void 0 : _c.warn(`AI Config mode mismatch for ${key}: expected ${mode}, got ${flagMode}. Returning disabled config.`);
36
- return LDAIConfigUtils_1.LDAIConfigUtils.createDisabledConfig(key, mode);
37
- }
38
- const tracker = new LDAIConfigTrackerImpl_1.LDAIConfigTrackerImpl(this._ldClient, key,
39
- // eslint-disable-next-line no-underscore-dangle
40
- (_e = (_d = value._ldMeta) === null || _d === void 0 ? void 0 : _d.variationKey) !== null && _e !== void 0 ? _e : '',
41
- // eslint-disable-next-line no-underscore-dangle
42
- (_g = (_f = value._ldMeta) === null || _f === void 0 ? void 0 : _f.version) !== null && _g !== void 0 ? _g : 1, (_j = (_h = value.model) === null || _h === void 0 ? void 0 : _h.name) !== null && _j !== void 0 ? _j : '', (_l = (_k = value.provider) === null || _k === void 0 ? void 0 : _k.name) !== null && _l !== void 0 ? _l : '', context);
43
- const config = LDAIConfigUtils_1.LDAIConfigUtils.fromFlagValue(key, value, tracker);
44
- // Apply variable interpolation (always needed for ldctx)
45
- return this._applyInterpolation(config, context, variables);
46
- }
47
- _applyInterpolation(config, context, variables) {
48
- const allVariables = Object.assign(Object.assign({}, variables), { ldctx: context });
49
- if ('messages' in config && config.messages) {
50
- return Object.assign(Object.assign({}, config), { messages: config.messages.map((entry) => (Object.assign(Object.assign({}, entry), { content: this._interpolateTemplate(entry.content, allVariables) }))) });
51
- }
52
- if ('instructions' in config && config.instructions) {
53
- return Object.assign(Object.assign({}, config), { instructions: this._interpolateTemplate(config.instructions, allVariables) });
54
- }
55
- return config;
56
- }
57
- async _initializeJudges(judgeConfigs, context, variables, defaultAiProvider) {
58
- const judges = {};
59
- const judgePromises = judgeConfigs.map(async (judgeConfig) => {
60
- const judge = await this.createJudge(judgeConfig.key, context, { enabled: false }, variables, defaultAiProvider);
61
- return judge ? { key: judgeConfig.key, judge } : null;
62
- });
63
- const results = await Promise.all(judgePromises);
64
- results.forEach((result) => {
65
- if (result) {
66
- judges[result.key] = result.judge;
67
- }
68
- });
69
- return judges;
70
- }
71
- async completionConfig(key, context, defaultValue, variables) {
72
- this._ldClient.track(TRACK_CONFIG_SINGLE, context, key, 1);
73
- const config = await this._evaluate(key, context, defaultValue, 'completion', variables);
74
- return config;
75
- }
76
- /**
77
- * @deprecated Use `completionConfig` instead. This method will be removed in a future version.
78
- */
79
- async config(key, context, defaultValue, variables) {
80
- return this.completionConfig(key, context, defaultValue, variables);
81
- }
82
- async judgeConfig(key, context, defaultValue, variables) {
83
- this._ldClient.track(TRACK_JUDGE_SINGLE, context, key, 1);
84
- const config = await this._evaluate(key, context, defaultValue, 'judge', variables);
85
- return config;
86
- }
87
- async agentConfig(key, context, defaultValue, variables) {
88
- this._ldClient.track(TRACK_AGENT_SINGLE, context, key, 1);
89
- const config = await this._evaluate(key, context, defaultValue, 'agent', variables);
90
- return config;
91
- }
92
- /**
93
- * @deprecated Use `agentConfig` instead. This method will be removed in a future version.
94
- */
95
- async agent(key, context, defaultValue, variables) {
96
- return this.agentConfig(key, context, defaultValue, variables);
97
- }
98
- async agentConfigs(agentConfigs, context) {
99
- this._ldClient.track(TRACK_AGENT_MULTIPLE, context, agentConfigs.length, agentConfigs.length);
100
- const agents = {};
101
- await Promise.all(agentConfigs.map(async (config) => {
102
- const agent = await this._evaluate(config.key, context, config.defaultValue, 'agent', config.variables);
103
- agents[config.key] = agent;
104
- }));
105
- return agents;
106
- }
107
- /**
108
- * @deprecated Use `agentConfigs` instead. This method will be removed in a future version.
109
- */
110
- async agents(agentConfigs, context) {
111
- return this.agentConfigs(agentConfigs, context);
112
- }
113
- async createChat(key, context, defaultValue, variables, defaultAiProvider) {
114
- var _a, _b, _c;
115
- this._ldClient.track(TRACK_CONFIG_CREATE_CHAT, context, key, 1);
116
- const config = await this.completionConfig(key, context, defaultValue, variables);
117
- if (!config.enabled || !config.tracker) {
118
- (_a = this._logger) === null || _a === void 0 ? void 0 : _a.info(`Chat configuration is disabled: ${key}`);
119
- return undefined;
120
- }
121
- const provider = await providers_1.AIProviderFactory.create(config, this._logger, defaultAiProvider);
122
- if (!provider) {
123
- return undefined;
124
- }
125
- const judges = await this._initializeJudges((_c = (_b = config.judgeConfiguration) === null || _b === void 0 ? void 0 : _b.judges) !== null && _c !== void 0 ? _c : [], context, variables, defaultAiProvider);
126
- return new chat_1.TrackedChat(config, config.tracker, provider, judges, this._logger);
127
- }
128
- async createJudge(key, context, defaultValue, variables, defaultAiProvider) {
129
- var _a, _b, _c, _d;
130
- this._ldClient.track(TRACK_JUDGE_CREATE, context, key, 1);
131
- try {
132
- if ((variables === null || variables === void 0 ? void 0 : variables.message_history) !== undefined) {
133
- (_a = this._logger) === null || _a === void 0 ? void 0 : _a.warn("The variable 'message_history' is reserved by the judge and will be ignored.");
134
- }
135
- if ((variables === null || variables === void 0 ? void 0 : variables.response_to_evaluate) !== undefined) {
136
- (_b = this._logger) === null || _b === void 0 ? void 0 : _b.warn("The variable 'response_to_evaluate' is reserved by the judge and will be ignored.");
137
- }
138
- // Overwrite reserved variables to ensure they remain as placeholders for judge evaluation
139
- const extendedVariables = Object.assign(Object.assign({}, variables), { message_history: '{{message_history}}', response_to_evaluate: '{{response_to_evaluate}}' });
140
- const judgeConfig = await this.judgeConfig(key, context, defaultValue, extendedVariables);
141
- if (!judgeConfig.enabled || !judgeConfig.tracker) {
142
- (_c = this._logger) === null || _c === void 0 ? void 0 : _c.info(`Judge configuration is disabled: ${key}`);
143
- return undefined;
144
- }
145
- const provider = await providers_1.AIProviderFactory.create(judgeConfig, this._logger, defaultAiProvider);
146
- if (!provider) {
147
- return undefined;
148
- }
149
- return new Judge_1.Judge(judgeConfig, judgeConfig.tracker, provider, this._logger);
150
- }
151
- catch (error) {
152
- (_d = this._logger) === null || _d === void 0 ? void 0 : _d.error(`Failed to initialize judge ${key}:`, error);
153
- return undefined;
154
- }
155
- }
156
- /**
157
- * @deprecated Use `createChat` instead. This method will be removed in a future version.
158
- */
159
- async initChat(key, context, defaultValue, variables, defaultAiProvider) {
160
- return this.createChat(key, context, defaultValue, variables, defaultAiProvider);
161
- }
162
- }
163
- exports.LDAIClientImpl = LDAIClientImpl;
164
- //# sourceMappingURL=LDAIClientImpl.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"LDAIClientImpl.js","sourceRoot":"","sources":["../../src/LDAIClientImpl.ts"],"names":[],"mappings":"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"}