promptfoo 0.102.3 → 0.103.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 (150) hide show
  1. package/dist/package.json +1 -1
  2. package/dist/src/app/assets/{index-isMhDyh1.js → index-hVGk-Oul.js} +276 -277
  3. package/dist/src/app/assets/{index.es-BNF9PUeN.js → index.es-CcK3JjZn.js} +1 -1
  4. package/dist/src/app/assets/{sync-DaNyhPy-.js → sync-BaigR5eq.js} +1 -1
  5. package/dist/src/app/index.html +1 -1
  6. package/dist/src/assertions/geval.d.ts +3 -0
  7. package/dist/src/assertions/geval.d.ts.map +1 -0
  8. package/dist/src/assertions/geval.js +39 -0
  9. package/dist/src/assertions/geval.js.map +1 -0
  10. package/dist/src/assertions/index.d.ts +1 -1
  11. package/dist/src/assertions/index.d.ts.map +1 -1
  12. package/dist/src/assertions/index.js +2 -0
  13. package/dist/src/assertions/index.js.map +1 -1
  14. package/dist/src/assertions/utils.d.ts +2 -2
  15. package/dist/src/database/tables.d.ts +12 -12
  16. package/dist/src/googleSheets.d.ts +7 -0
  17. package/dist/src/googleSheets.d.ts.map +1 -1
  18. package/dist/src/googleSheets.js +32 -1
  19. package/dist/src/googleSheets.js.map +1 -1
  20. package/dist/src/integrations/huggingfaceDatasets.d.ts +3 -0
  21. package/dist/src/integrations/huggingfaceDatasets.d.ts.map +1 -0
  22. package/dist/src/integrations/huggingfaceDatasets.js +87 -0
  23. package/dist/src/integrations/huggingfaceDatasets.js.map +1 -0
  24. package/dist/src/matchers.d.ts +1 -0
  25. package/dist/src/matchers.d.ts.map +1 -1
  26. package/dist/src/matchers.js +74 -0
  27. package/dist/src/matchers.js.map +1 -1
  28. package/dist/src/models/evalResult.d.ts.map +1 -1
  29. package/dist/src/models/evalResult.js +8 -1
  30. package/dist/src/models/evalResult.js.map +1 -1
  31. package/dist/src/providers/bedrock.d.ts.map +1 -1
  32. package/dist/src/providers/bedrock.js +10 -3
  33. package/dist/src/providers/bedrock.js.map +1 -1
  34. package/dist/src/providers/simulatedUser.d.ts.map +1 -1
  35. package/dist/src/providers/simulatedUser.js +5 -0
  36. package/dist/src/providers/simulatedUser.js.map +1 -1
  37. package/dist/src/providers.d.ts.map +1 -1
  38. package/dist/src/providers.js +4 -0
  39. package/dist/src/providers.js.map +1 -1
  40. package/dist/src/redteam/constants.d.ts +7 -3
  41. package/dist/src/redteam/constants.d.ts.map +1 -1
  42. package/dist/src/redteam/constants.js +27 -1
  43. package/dist/src/redteam/constants.js.map +1 -1
  44. package/dist/src/redteam/graders.d.ts.map +1 -1
  45. package/dist/src/redteam/graders.js +2 -0
  46. package/dist/src/redteam/graders.js.map +1 -1
  47. package/dist/src/redteam/index.d.ts +1 -1
  48. package/dist/src/redteam/index.d.ts.map +1 -1
  49. package/dist/src/redteam/index.js +10 -2
  50. package/dist/src/redteam/index.js.map +1 -1
  51. package/dist/src/redteam/plugins/beavertails.d.ts +17 -0
  52. package/dist/src/redteam/plugins/beavertails.d.ts.map +1 -0
  53. package/dist/src/redteam/plugins/beavertails.js +104 -0
  54. package/dist/src/redteam/plugins/beavertails.js.map +1 -0
  55. package/dist/src/redteam/plugins/index.d.ts.map +1 -1
  56. package/dist/src/redteam/plugins/index.js +2 -0
  57. package/dist/src/redteam/plugins/index.js.map +1 -1
  58. package/dist/src/redteam/plugins/intent.d.ts +6 -3
  59. package/dist/src/redteam/plugins/intent.d.ts.map +1 -1
  60. package/dist/src/redteam/plugins/intent.js +32 -13
  61. package/dist/src/redteam/plugins/intent.js.map +1 -1
  62. package/dist/src/redteam/plugins/pliny.d.ts.map +1 -1
  63. package/dist/src/redteam/plugins/pliny.js +1 -1
  64. package/dist/src/redteam/plugins/pliny.js.map +1 -1
  65. package/dist/src/redteam/providers/bestOfN.d.ts +16 -0
  66. package/dist/src/redteam/providers/bestOfN.d.ts.map +1 -0
  67. package/dist/src/redteam/providers/bestOfN.js +103 -0
  68. package/dist/src/redteam/providers/bestOfN.js.map +1 -0
  69. package/dist/src/redteam/providers/crescendo/index.d.ts.map +1 -1
  70. package/dist/src/redteam/providers/crescendo/index.js +20 -0
  71. package/dist/src/redteam/providers/crescendo/index.js.map +1 -1
  72. package/dist/src/redteam/providers/goat.d.ts.map +1 -1
  73. package/dist/src/redteam/providers/goat.js +7 -0
  74. package/dist/src/redteam/providers/goat.js.map +1 -1
  75. package/dist/src/redteam/providers/iterative.d.ts +3 -0
  76. package/dist/src/redteam/providers/iterative.d.ts.map +1 -1
  77. package/dist/src/redteam/providers/iterative.js +63 -26
  78. package/dist/src/redteam/providers/iterative.js.map +1 -1
  79. package/dist/src/redteam/providers/iterativeImage.d.ts.map +1 -1
  80. package/dist/src/redteam/providers/iterativeImage.js +17 -0
  81. package/dist/src/redteam/providers/iterativeImage.js.map +1 -1
  82. package/dist/src/redteam/providers/iterativeTree.d.ts +7 -17
  83. package/dist/src/redteam/providers/iterativeTree.d.ts.map +1 -1
  84. package/dist/src/redteam/providers/iterativeTree.js +59 -9
  85. package/dist/src/redteam/providers/iterativeTree.js.map +1 -1
  86. package/dist/src/redteam/providers/prompts.d.ts.map +1 -1
  87. package/dist/src/redteam/providers/prompts.js +25 -3
  88. package/dist/src/redteam/providers/prompts.js.map +1 -1
  89. package/dist/src/redteam/providers/shared.d.ts +1 -0
  90. package/dist/src/redteam/providers/shared.d.ts.map +1 -1
  91. package/dist/src/redteam/providers/shared.js +8 -0
  92. package/dist/src/redteam/providers/shared.js.map +1 -1
  93. package/dist/src/redteam/shared.d.ts.map +1 -1
  94. package/dist/src/redteam/shared.js +1 -0
  95. package/dist/src/redteam/shared.js.map +1 -1
  96. package/dist/src/redteam/strategies/bestOfN.d.ts +3 -0
  97. package/dist/src/redteam/strategies/bestOfN.d.ts.map +1 -0
  98. package/dist/src/redteam/strategies/bestOfN.js +35 -0
  99. package/dist/src/redteam/strategies/bestOfN.js.map +1 -0
  100. package/dist/src/redteam/strategies/index.d.ts.map +1 -1
  101. package/dist/src/redteam/strategies/index.js +22 -12
  102. package/dist/src/redteam/strategies/index.js.map +1 -1
  103. package/dist/src/redteam/util.d.ts.map +1 -1
  104. package/dist/src/redteam/util.js +14 -3
  105. package/dist/src/redteam/util.js.map +1 -1
  106. package/dist/src/server/routes/redteam.js +2 -1
  107. package/dist/src/server/routes/redteam.js.map +1 -1
  108. package/dist/src/telemetry.d.ts +6 -0
  109. package/dist/src/telemetry.d.ts.map +1 -1
  110. package/dist/src/telemetry.js +6 -0
  111. package/dist/src/telemetry.js.map +1 -1
  112. package/dist/src/testCases.d.ts.map +1 -1
  113. package/dist/src/testCases.js +7 -0
  114. package/dist/src/testCases.js.map +1 -1
  115. package/dist/src/types/index.d.ts +343 -343
  116. package/dist/src/types/index.d.ts.map +1 -1
  117. package/dist/src/types/index.js +1 -0
  118. package/dist/src/types/index.js.map +1 -1
  119. package/dist/src/util/index.d.ts +4 -4
  120. package/dist/src/validators/redteam.js +2 -2
  121. package/dist/src/validators/redteam.js.map +1 -1
  122. package/dist/test/factories/evalFactory.d.ts +8 -8
  123. package/dist/test/googleSheets.test.d.ts +2 -0
  124. package/dist/test/googleSheets.test.d.ts.map +1 -0
  125. package/dist/test/googleSheets.test.js +240 -0
  126. package/dist/test/googleSheets.test.js.map +1 -0
  127. package/dist/test/integrations/huggingfaceDatasets.test.d.ts +2 -0
  128. package/dist/test/integrations/huggingfaceDatasets.test.d.ts.map +1 -0
  129. package/dist/test/integrations/huggingfaceDatasets.test.js +147 -0
  130. package/dist/test/integrations/huggingfaceDatasets.test.js.map +1 -0
  131. package/dist/test/models/evalResult.test.d.ts +2 -0
  132. package/dist/test/models/evalResult.test.d.ts.map +1 -0
  133. package/dist/test/models/evalResult.test.js +217 -0
  134. package/dist/test/models/evalResult.test.js.map +1 -0
  135. package/dist/test/providers/bedrock.test.js +110 -0
  136. package/dist/test/providers/bedrock.test.js.map +1 -1
  137. package/dist/test/redteam/plugins/intent.test.d.ts +2 -0
  138. package/dist/test/redteam/plugins/intent.test.d.ts.map +1 -0
  139. package/dist/test/redteam/plugins/intent.test.js +172 -0
  140. package/dist/test/redteam/plugins/intent.test.js.map +1 -0
  141. package/dist/test/redteam/providers/iterative.test.d.ts +2 -0
  142. package/dist/test/redteam/providers/iterative.test.d.ts.map +1 -0
  143. package/dist/test/redteam/providers/iterative.test.js +61 -0
  144. package/dist/test/redteam/providers/iterative.test.js.map +1 -0
  145. package/dist/test/redteam/providers/iterativeTree.test.js +46 -8
  146. package/dist/test/redteam/providers/iterativeTree.test.js.map +1 -1
  147. package/dist/test/redteam/validators.test.js +2 -0
  148. package/dist/test/redteam/validators.test.js.map +1 -1
  149. package/dist/tsconfig.tsbuildinfo +1 -1
  150. package/package.json +1 -1
@@ -0,0 +1,240 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const fetch_1 = require("../src/fetch");
7
+ const googleSheets_1 = require("../src/googleSheets");
8
+ const logger_1 = __importDefault(require("../src/logger"));
9
+ const utils_1 = require("./util/utils");
10
+ jest.mock('../src/logger', () => ({
11
+ debug: jest.fn(),
12
+ error: jest.fn(),
13
+ }));
14
+ jest.mock('../src/fetch', () => ({
15
+ fetchWithProxy: jest.fn(),
16
+ }));
17
+ const mockSpreadsheetsApi = {
18
+ get: jest.fn(),
19
+ values: {
20
+ get: jest.fn(),
21
+ update: jest.fn(),
22
+ },
23
+ batchUpdate: jest.fn(),
24
+ };
25
+ // Update mock setup for better auth handling
26
+ const mockAuthClient = {
27
+ getClient: jest.fn().mockResolvedValue({}),
28
+ };
29
+ // Mock Google Sheets API
30
+ jest.mock('@googleapis/sheets', () => {
31
+ return {
32
+ sheets: jest.fn(() => ({
33
+ spreadsheets: mockSpreadsheetsApi,
34
+ })),
35
+ auth: {
36
+ GoogleAuth: jest.fn(() => mockAuthClient),
37
+ },
38
+ };
39
+ });
40
+ describe('Google Sheets Integration', () => {
41
+ const TEST_SHEET_URL = 'https://docs.google.com/spreadsheets/d/1234567890/edit';
42
+ const TEST_SHEET_URL_WITH_GID = 'https://docs.google.com/spreadsheets/d/1234567890/edit?gid=98765';
43
+ beforeEach(() => {
44
+ jest.clearAllMocks();
45
+ });
46
+ describe('checkGoogleSheetAccess', () => {
47
+ it('should return public:true for accessible sheets', async () => {
48
+ const mockFetch = jest.spyOn(global, 'fetch').mockImplementation();
49
+ mockFetch.mockResolvedValue({
50
+ ok: true,
51
+ status: 200,
52
+ });
53
+ const result = await (0, googleSheets_1.checkGoogleSheetAccess)(TEST_SHEET_URL);
54
+ expect(result).toEqual({ public: true, status: 200 });
55
+ expect(mockFetch).toHaveBeenCalledWith(TEST_SHEET_URL);
56
+ });
57
+ it('should return public:false for inaccessible sheets', async () => {
58
+ const mockFetch = jest.spyOn(global, 'fetch').mockImplementation();
59
+ mockFetch.mockResolvedValue({
60
+ ok: false,
61
+ status: 403,
62
+ });
63
+ const result = await (0, googleSheets_1.checkGoogleSheetAccess)(TEST_SHEET_URL);
64
+ expect(result).toEqual({ public: false, status: 403 });
65
+ expect(mockFetch).toHaveBeenCalledWith(TEST_SHEET_URL);
66
+ });
67
+ it('should handle network errors gracefully', async () => {
68
+ const mockFetch = jest.spyOn(global, 'fetch').mockImplementation();
69
+ mockFetch.mockRejectedValue(new Error('Network error'));
70
+ const result = await (0, googleSheets_1.checkGoogleSheetAccess)(TEST_SHEET_URL);
71
+ expect(result).toEqual({ public: false });
72
+ expect(logger_1.default.error).toHaveBeenCalledWith('Error checking sheet access:', expect.any(Error));
73
+ });
74
+ });
75
+ describe('fetchCsvFromGoogleSheetUnauthenticated', () => {
76
+ it('should fetch and parse CSV data correctly', async () => {
77
+ const mockCsvData = 'header1,header2\nvalue1,value2';
78
+ const expectedUrl = `${TEST_SHEET_URL.replace(/\/edit.*$/, '/export')}?format=csv`;
79
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValue((0, utils_1.createMockResponse)({
80
+ text: () => Promise.resolve(mockCsvData),
81
+ }));
82
+ const result = await (0, googleSheets_1.fetchCsvFromGoogleSheetUnauthenticated)(TEST_SHEET_URL);
83
+ expect(result).toEqual([{ header1: 'value1', header2: 'value2' }]);
84
+ expect(fetch_1.fetchWithProxy).toHaveBeenCalledWith(expectedUrl);
85
+ });
86
+ it('should handle gid parameter correctly', async () => {
87
+ const mockCsvData = 'header1,header2\nvalue1,value2';
88
+ const baseUrl = TEST_SHEET_URL_WITH_GID.replace(/\/edit.*$/, '/export');
89
+ const expectedUrl = `${baseUrl}?format=csv&gid=98765`;
90
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValue((0, utils_1.createMockResponse)({
91
+ text: () => Promise.resolve(mockCsvData),
92
+ }));
93
+ await (0, googleSheets_1.fetchCsvFromGoogleSheetUnauthenticated)(TEST_SHEET_URL_WITH_GID);
94
+ expect(fetch_1.fetchWithProxy).toHaveBeenCalledWith(expectedUrl);
95
+ });
96
+ it('should throw error on non-200 response', async () => {
97
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValue((0, utils_1.createMockResponse)({ status: 403 }));
98
+ await expect((0, googleSheets_1.fetchCsvFromGoogleSheetUnauthenticated)(TEST_SHEET_URL)).rejects.toThrow('Failed to fetch CSV from Google Sheets URL');
99
+ });
100
+ });
101
+ describe('fetchCsvFromGoogleSheetAuthenticated', () => {
102
+ const spreadsheets = mockSpreadsheetsApi;
103
+ beforeEach(() => {
104
+ jest.clearAllMocks();
105
+ // Set up default sheet response
106
+ spreadsheets.get.mockResolvedValue({
107
+ data: {
108
+ sheets: [
109
+ {
110
+ properties: {
111
+ sheetId: 98765,
112
+ title: 'TestSheet',
113
+ },
114
+ },
115
+ ],
116
+ },
117
+ });
118
+ });
119
+ it('should fetch and parse authenticated sheet data', async () => {
120
+ const mockResponse = {
121
+ data: {
122
+ values: [
123
+ ['header1', 'header2'],
124
+ ['value1', 'value2'],
125
+ ],
126
+ },
127
+ };
128
+ spreadsheets.values.get.mockResolvedValue(mockResponse);
129
+ const result = await (0, googleSheets_1.fetchCsvFromGoogleSheetAuthenticated)(TEST_SHEET_URL);
130
+ expect(result).toEqual([{ header1: 'value1', header2: 'value2' }]);
131
+ expect(spreadsheets.values.get).toHaveBeenCalledWith({
132
+ spreadsheetId: '1234567890',
133
+ range: 'A1:ZZZ',
134
+ auth: mockAuthClient,
135
+ });
136
+ });
137
+ it('should handle gid parameter correctly', async () => {
138
+ spreadsheets.values.get.mockResolvedValue({
139
+ data: {
140
+ values: [['header'], ['value']],
141
+ },
142
+ });
143
+ await (0, googleSheets_1.fetchCsvFromGoogleSheetAuthenticated)(TEST_SHEET_URL_WITH_GID);
144
+ expect(spreadsheets.get).toHaveBeenCalledWith({
145
+ spreadsheetId: '1234567890',
146
+ auth: mockAuthClient,
147
+ });
148
+ expect(spreadsheets.values.get).toHaveBeenCalledWith({
149
+ spreadsheetId: '1234567890',
150
+ range: 'TestSheet!A1:ZZZ',
151
+ auth: mockAuthClient,
152
+ });
153
+ });
154
+ it('should throw error for invalid sheet URL', async () => {
155
+ await expect((0, googleSheets_1.fetchCsvFromGoogleSheetAuthenticated)('invalid-url')).rejects.toThrow('Invalid Google Sheets URL');
156
+ });
157
+ });
158
+ describe('writeCsvToGoogleSheet', () => {
159
+ const spreadsheets = mockSpreadsheetsApi;
160
+ const testRows = [{ header1: 'value1', header2: 'value2' }];
161
+ beforeEach(() => {
162
+ jest.clearAllMocks();
163
+ // Set up default sheet response
164
+ spreadsheets.get.mockResolvedValue({
165
+ data: {
166
+ sheets: [
167
+ {
168
+ properties: {
169
+ sheetId: 98765,
170
+ title: 'TestSheet',
171
+ },
172
+ },
173
+ ],
174
+ },
175
+ });
176
+ });
177
+ it('should write data to existing sheet', async () => {
178
+ const mockDate = 1234567890;
179
+ jest.spyOn(Date, 'now').mockReturnValue(mockDate);
180
+ spreadsheets.values.update.mockResolvedValue({});
181
+ await (0, googleSheets_1.writeCsvToGoogleSheet)(testRows, TEST_SHEET_URL);
182
+ expect(spreadsheets.values.update).toHaveBeenCalledWith({
183
+ spreadsheetId: '1234567890',
184
+ range: `Sheet${mockDate}!A1:ZZZ`,
185
+ valueInputOption: 'USER_ENTERED',
186
+ auth: mockAuthClient,
187
+ requestBody: {
188
+ values: [
189
+ ['header1', 'header2'],
190
+ ['value1', 'value2'],
191
+ ],
192
+ },
193
+ });
194
+ });
195
+ it('should create new sheet when no gid provided', async () => {
196
+ // Mock Date.now() to get consistent sheet names in tests
197
+ const mockDate = 1234567890;
198
+ jest.spyOn(Date, 'now').mockReturnValue(mockDate);
199
+ spreadsheets.batchUpdate.mockResolvedValue({});
200
+ spreadsheets.values.update.mockResolvedValue({});
201
+ await (0, googleSheets_1.writeCsvToGoogleSheet)(testRows, TEST_SHEET_URL);
202
+ expect(spreadsheets.batchUpdate).toHaveBeenCalledWith({
203
+ spreadsheetId: '1234567890',
204
+ auth: mockAuthClient,
205
+ requestBody: {
206
+ requests: [
207
+ {
208
+ addSheet: {
209
+ properties: {
210
+ title: `Sheet${mockDate}`,
211
+ },
212
+ },
213
+ },
214
+ ],
215
+ },
216
+ });
217
+ });
218
+ it('should use existing sheet when gid provided', async () => {
219
+ spreadsheets.values.update.mockResolvedValue({});
220
+ await (0, googleSheets_1.writeCsvToGoogleSheet)(testRows, TEST_SHEET_URL_WITH_GID);
221
+ expect(spreadsheets.batchUpdate).not.toHaveBeenCalled();
222
+ expect(spreadsheets.values.update).toHaveBeenCalledWith({
223
+ spreadsheetId: '1234567890',
224
+ range: 'TestSheet!A1:ZZZ',
225
+ valueInputOption: 'USER_ENTERED',
226
+ auth: mockAuthClient,
227
+ requestBody: {
228
+ values: [
229
+ ['header1', 'header2'],
230
+ ['value1', 'value2'],
231
+ ],
232
+ },
233
+ });
234
+ });
235
+ it('should throw error for invalid sheet URL', async () => {
236
+ await expect((0, googleSheets_1.writeCsvToGoogleSheet)(testRows, 'invalid-url')).rejects.toThrow('Invalid Google Sheets URL');
237
+ });
238
+ });
239
+ });
240
+ //# sourceMappingURL=googleSheets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"googleSheets.test.js","sourceRoot":"","sources":["../../test/googleSheets.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=huggingfaceDatasets.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingfaceDatasets.test.d.ts","sourceRoot":"","sources":["../../../test/integrations/huggingfaceDatasets.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,147 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const fetch_1 = require("../../src/fetch");
4
+ const huggingfaceDatasets_1 = require("../../src/integrations/huggingfaceDatasets");
5
+ jest.mock('../../src/fetch', () => ({
6
+ fetchWithProxy: jest.fn(),
7
+ }));
8
+ describe('huggingfaceDatasets', () => {
9
+ beforeEach(() => {
10
+ jest.mocked(fetch_1.fetchWithProxy).mockClear();
11
+ });
12
+ it('should fetch and parse dataset with default parameters', async () => {
13
+ // Mock API response
14
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValueOnce({
15
+ ok: true,
16
+ json: async () => ({
17
+ num_rows_total: 2,
18
+ features: [
19
+ { name: 'act', type: { dtype: 'string', _type: 'Value' } },
20
+ { name: 'prompt', type: { dtype: 'string', _type: 'Value' } },
21
+ ],
22
+ rows: [
23
+ { row: { act: 'Linux Terminal', prompt: 'List all files' } },
24
+ { row: { act: 'Math Tutor', prompt: 'Solve 2+2' } },
25
+ ],
26
+ }),
27
+ });
28
+ const tests = await (0, huggingfaceDatasets_1.fetchHuggingFaceDataset)('huggingface://datasets/test/dataset');
29
+ // Verify the fetch call
30
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledWith(expect.stringContaining('https://datasets-server.huggingface.co/rows'));
31
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledWith(expect.stringContaining('split=test'));
32
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledWith(expect.stringContaining('config=default'));
33
+ // Verify the parsed results
34
+ expect(tests).toHaveLength(2);
35
+ expect(tests[0].vars).toEqual({
36
+ act: 'Linux Terminal',
37
+ prompt: 'List all files',
38
+ });
39
+ expect(tests[1].vars).toEqual({
40
+ act: 'Math Tutor',
41
+ prompt: 'Solve 2+2',
42
+ });
43
+ });
44
+ it('should handle custom query parameters', async () => {
45
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValueOnce({
46
+ ok: true,
47
+ json: async () => ({
48
+ num_rows_total: 1,
49
+ features: [
50
+ { name: 'question', type: { dtype: 'string', _type: 'Value' } },
51
+ { name: 'answer', type: { dtype: 'string', _type: 'Value' } },
52
+ ],
53
+ rows: [{ row: { question: 'What is 2+2?', answer: '4' } }],
54
+ }),
55
+ });
56
+ await (0, huggingfaceDatasets_1.fetchHuggingFaceDataset)('huggingface://datasets/test/dataset?split=train&config=custom');
57
+ // Verify custom parameters were used
58
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledWith(expect.stringContaining('split=train'));
59
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledWith(expect.stringContaining('config=custom'));
60
+ });
61
+ it('should handle pagination', async () => {
62
+ // First page response
63
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValueOnce({
64
+ ok: true,
65
+ json: async () => ({
66
+ num_rows_total: 3,
67
+ features: [{ name: 'text', type: { dtype: 'string', _type: 'Value' } }],
68
+ rows: [{ row: { text: 'First' } }, { row: { text: 'Second' } }],
69
+ }),
70
+ });
71
+ // Second page response
72
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValueOnce({
73
+ ok: true,
74
+ json: async () => ({
75
+ num_rows_total: 3,
76
+ features: [{ name: 'text', type: { dtype: 'string', _type: 'Value' } }],
77
+ rows: [{ row: { text: 'Third' } }],
78
+ }),
79
+ });
80
+ const tests = await (0, huggingfaceDatasets_1.fetchHuggingFaceDataset)('huggingface://datasets/test/dataset');
81
+ // Verify pagination
82
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledTimes(2);
83
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenNthCalledWith(1, expect.stringContaining('length=100'));
84
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenNthCalledWith(2, expect.stringContaining('length=100'));
85
+ // Verify all results were combined
86
+ expect(tests).toHaveLength(3);
87
+ expect(tests.map((t) => t.vars?.text)).toEqual(['First', 'Second', 'Third']);
88
+ });
89
+ it('should handle API errors', async () => {
90
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValueOnce({
91
+ ok: false,
92
+ statusText: 'Not Found',
93
+ });
94
+ await expect((0, huggingfaceDatasets_1.fetchHuggingFaceDataset)('huggingface://datasets/nonexistent/dataset')).rejects.toThrow('[Huggingface Dataset] Failed to fetch dataset: Not Found');
95
+ });
96
+ it('should respect user-specified limit parameter', async () => {
97
+ // Mock response with more data than the limit
98
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValueOnce({
99
+ ok: true,
100
+ json: async () => ({
101
+ num_rows_total: 5,
102
+ features: [{ name: 'text', type: { dtype: 'string', _type: 'Value' } }],
103
+ rows: [{ row: { text: 'First' } }, { row: { text: 'Second' } }, { row: { text: 'Third' } }],
104
+ }),
105
+ });
106
+ const tests = await (0, huggingfaceDatasets_1.fetchHuggingFaceDataset)('huggingface://datasets/test/dataset?limit=2');
107
+ // Verify the request includes the correct length parameter
108
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledTimes(1);
109
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledWith(expect.stringContaining('length=2'));
110
+ // Verify only limited number of results are returned
111
+ expect(tests).toHaveLength(2);
112
+ expect(tests.map((t) => t.vars?.text)).toEqual(['First', 'Second']);
113
+ });
114
+ it('should handle limit larger than page size', async () => {
115
+ // First page response
116
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValueOnce({
117
+ ok: true,
118
+ json: async () => ({
119
+ num_rows_total: 150,
120
+ features: [{ name: 'text', type: { dtype: 'string', _type: 'Value' } }],
121
+ rows: Array(100)
122
+ .fill(null)
123
+ .map((_, i) => ({ row: { text: `Item ${i + 1}` } })),
124
+ }),
125
+ });
126
+ // Second page response
127
+ jest.mocked(fetch_1.fetchWithProxy).mockResolvedValueOnce({
128
+ ok: true,
129
+ json: async () => ({
130
+ num_rows_total: 150,
131
+ features: [{ name: 'text', type: { dtype: 'string', _type: 'Value' } }],
132
+ rows: Array(20)
133
+ .fill(null)
134
+ .map((_, i) => ({ row: { text: `Item ${i + 101}` } })),
135
+ }),
136
+ });
137
+ const tests = await (0, huggingfaceDatasets_1.fetchHuggingFaceDataset)('huggingface://datasets/test/dataset?limit=120');
138
+ // Verify pagination with limit
139
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenCalledTimes(2);
140
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenNthCalledWith(1, expect.stringContaining('length=100'));
141
+ expect(jest.mocked(fetch_1.fetchWithProxy)).toHaveBeenNthCalledWith(2, expect.stringContaining('length=20'));
142
+ // Verify we got exactly the number of results specified by limit
143
+ expect(tests).toHaveLength(120);
144
+ expect(tests[119].vars?.text).toBe('Item 120');
145
+ });
146
+ });
147
+ //# sourceMappingURL=huggingfaceDatasets.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"huggingfaceDatasets.test.js","sourceRoot":"","sources":["../../../test/integrations/huggingfaceDatasets.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=evalResult.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"evalResult.test.d.ts","sourceRoot":"","sources":["../../../test/models/evalResult.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,217 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const migrate_1 = require("../../src/migrate");
7
+ const evalResult_1 = __importDefault(require("../../src/models/evalResult"));
8
+ const utils_1 = require("../../src/prompts/utils");
9
+ const types_1 = require("../../src/types");
10
+ const json_1 = require("../../src/util/json");
11
+ describe('EvalResult', () => {
12
+ beforeAll(async () => {
13
+ await (0, migrate_1.runDbMigrations)();
14
+ });
15
+ const mockProvider = {
16
+ id: 'test-provider',
17
+ label: 'Test Provider',
18
+ };
19
+ const mockTestCase = {
20
+ vars: {},
21
+ provider: mockProvider,
22
+ };
23
+ const mockPrompt = {
24
+ raw: 'Test prompt',
25
+ display: 'Test prompt',
26
+ label: 'Test label',
27
+ };
28
+ const mockEvaluateResult = {
29
+ promptIdx: 0,
30
+ testIdx: 0,
31
+ prompt: mockPrompt,
32
+ success: true,
33
+ score: 1,
34
+ provider: mockProvider,
35
+ testCase: mockTestCase,
36
+ vars: {},
37
+ latencyMs: 100,
38
+ cost: 0.01,
39
+ metadata: {},
40
+ failureReason: types_1.ResultFailureReason.NONE,
41
+ id: 'test-id',
42
+ promptId: (0, utils_1.hashPrompt)(mockPrompt),
43
+ namedScores: {},
44
+ response: undefined,
45
+ };
46
+ describe('createFromEvaluateResult', () => {
47
+ it('should create and persist an EvalResult', async () => {
48
+ const evalId = 'test-eval-id';
49
+ const result = await evalResult_1.default.createFromEvaluateResult(evalId, mockEvaluateResult, mockTestCase);
50
+ expect(result).toBeInstanceOf(evalResult_1.default);
51
+ expect(result.evalId).toBe(evalId);
52
+ expect(result.promptId).toBe((0, utils_1.hashPrompt)(mockPrompt));
53
+ expect(result.persisted).toBe(true);
54
+ // Verify it was persisted to database
55
+ const retrieved = await evalResult_1.default.findById(result.id);
56
+ expect(retrieved).not.toBeNull();
57
+ expect(retrieved?.score).toBe(mockEvaluateResult.score);
58
+ });
59
+ it('should create without persisting when persist option is false', async () => {
60
+ const evalId = 'test-eval-id';
61
+ const result = await evalResult_1.default.createFromEvaluateResult(evalId, mockEvaluateResult, mockTestCase, { persist: false });
62
+ expect(result).toBeInstanceOf(evalResult_1.default);
63
+ expect(result.persisted).toBe(false);
64
+ // Verify it was not persisted to database
65
+ const retrieved = await evalResult_1.default.findById(result.id);
66
+ expect(retrieved).toBeNull();
67
+ });
68
+ it('should properly handle circular references in provider', async () => {
69
+ const evalId = 'test-eval-id';
70
+ // Create a provider with a circular reference
71
+ const circularProvider = {
72
+ id: 'test-provider',
73
+ label: 'Test Provider',
74
+ config: {
75
+ circular: undefined,
76
+ },
77
+ };
78
+ circularProvider.config.circular = circularProvider;
79
+ const testCaseWithCircular = {
80
+ ...mockTestCase,
81
+ provider: circularProvider,
82
+ };
83
+ // Pre-serialize the provider to handle circular references
84
+ const serializedProvider = JSON.parse((0, json_1.safeJsonStringify)(circularProvider));
85
+ const resultWithCircular = await evalResult_1.default.createFromEvaluateResult(evalId, {
86
+ ...mockEvaluateResult,
87
+ provider: serializedProvider, // Use pre-serialized provider
88
+ }, {
89
+ ...testCaseWithCircular,
90
+ provider: serializedProvider, // Use pre-serialized provider
91
+ }, { persist: true });
92
+ // Verify the provider was properly serialized
93
+ expect(resultWithCircular.testCase.provider).toEqual({
94
+ id: 'test-provider',
95
+ label: 'Test Provider',
96
+ config: {},
97
+ });
98
+ // Verify it can be persisted without errors
99
+ const retrieved = await evalResult_1.default.findById(resultWithCircular.id);
100
+ expect(retrieved).not.toBeNull();
101
+ expect(retrieved?.testCase.provider).toEqual({
102
+ id: 'test-provider',
103
+ label: 'Test Provider',
104
+ config: {},
105
+ });
106
+ });
107
+ it('should preserve non-circular provider properties', async () => {
108
+ const evalId = 'test-eval-id';
109
+ const providerWithNestedData = {
110
+ id: 'test-provider',
111
+ label: 'Test Provider',
112
+ config: {
113
+ apiKey: 'secret-key',
114
+ options: {
115
+ temperature: 0.7,
116
+ maxTokens: 100,
117
+ },
118
+ },
119
+ };
120
+ const testCaseWithNestedData = {
121
+ ...mockTestCase,
122
+ provider: providerWithNestedData,
123
+ };
124
+ const result = await evalResult_1.default.createFromEvaluateResult(evalId, {
125
+ ...mockEvaluateResult,
126
+ provider: providerWithNestedData,
127
+ }, testCaseWithNestedData, { persist: true });
128
+ // Verify nested properties are preserved
129
+ expect(result.testCase.provider).toEqual(providerWithNestedData);
130
+ // Verify it can be persisted and retrieved with all properties intact
131
+ const retrieved = await evalResult_1.default.findById(result.id);
132
+ expect(retrieved).not.toBeNull();
133
+ expect(retrieved?.testCase.provider).toEqual(providerWithNestedData);
134
+ });
135
+ });
136
+ describe('findManyByEvalId', () => {
137
+ it('should retrieve multiple results for an eval ID', async () => {
138
+ const evalId = 'test-eval-id-multiple';
139
+ // Create multiple results
140
+ await evalResult_1.default.createFromEvaluateResult(evalId, {
141
+ ...mockEvaluateResult,
142
+ testIdx: 0,
143
+ }, mockTestCase);
144
+ await evalResult_1.default.createFromEvaluateResult(evalId, {
145
+ ...mockEvaluateResult,
146
+ testIdx: 1,
147
+ }, mockTestCase);
148
+ const results = await evalResult_1.default.findManyByEvalId(evalId);
149
+ expect(results).toHaveLength(2);
150
+ expect(results[0]).toBeInstanceOf(evalResult_1.default);
151
+ expect(results[1]).toBeInstanceOf(evalResult_1.default);
152
+ });
153
+ it('should filter by testIdx when provided', async () => {
154
+ const evalId = 'test-eval-id-filter';
155
+ await evalResult_1.default.createFromEvaluateResult(evalId, {
156
+ ...mockEvaluateResult,
157
+ testIdx: 0,
158
+ }, mockTestCase);
159
+ await evalResult_1.default.createFromEvaluateResult(evalId, {
160
+ ...mockEvaluateResult,
161
+ testIdx: 1,
162
+ }, mockTestCase);
163
+ const results = await evalResult_1.default.findManyByEvalId(evalId, { testIdx: 0 });
164
+ expect(results).toHaveLength(1);
165
+ expect(results[0].testIdx).toBe(0);
166
+ });
167
+ });
168
+ describe('save', () => {
169
+ it('should save new results', async () => {
170
+ const result = new evalResult_1.default({
171
+ id: 'test-save-id',
172
+ evalId: 'test-eval-id',
173
+ promptIdx: 0,
174
+ testIdx: 0,
175
+ testCase: mockTestCase,
176
+ prompt: mockPrompt,
177
+ success: true,
178
+ score: 1,
179
+ response: null,
180
+ gradingResult: null,
181
+ provider: mockProvider,
182
+ failureReason: types_1.ResultFailureReason.NONE,
183
+ namedScores: {},
184
+ });
185
+ await result.save();
186
+ expect(result.persisted).toBe(true);
187
+ const retrieved = await evalResult_1.default.findById(result.id);
188
+ expect(retrieved).not.toBeNull();
189
+ });
190
+ it('should update existing results', async () => {
191
+ const result = await evalResult_1.default.createFromEvaluateResult('test-eval-id', mockEvaluateResult, mockTestCase);
192
+ result.score = 0.5;
193
+ await result.save();
194
+ const retrieved = await evalResult_1.default.findById(result.id);
195
+ expect(retrieved?.score).toBe(0.5);
196
+ });
197
+ });
198
+ describe('toEvaluateResult', () => {
199
+ it('should convert EvalResult to EvaluateResult format', async () => {
200
+ const result = await evalResult_1.default.createFromEvaluateResult('test-eval-id', mockEvaluateResult, mockTestCase);
201
+ const evaluateResult = result.toEvaluateResult();
202
+ // Only test the specific fields we care about
203
+ expect(evaluateResult).toEqual(expect.objectContaining({
204
+ promptIdx: mockEvaluateResult.promptIdx,
205
+ testIdx: mockEvaluateResult.testIdx,
206
+ prompt: mockEvaluateResult.prompt,
207
+ success: mockEvaluateResult.success,
208
+ score: mockEvaluateResult.score,
209
+ provider: {
210
+ id: mockProvider.id,
211
+ label: mockProvider.label,
212
+ },
213
+ }));
214
+ });
215
+ });
216
+ });
217
+ //# sourceMappingURL=evalResult.test.js.map