peerbench 0.0.1 → 0.0.2-alpha-dev.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 (63) hide show
  1. package/README.md +332 -2
  2. package/dist/abstract-Dec9Sc5O.d.ts +12 -0
  3. package/dist/aggregators/index.d.ts +67 -0
  4. package/dist/aggregators/index.js +46 -0
  5. package/dist/aggregators/index.js.map +1 -0
  6. package/dist/benchmarks/index.d.ts +1041 -0
  7. package/dist/benchmarks/index.js +458 -0
  8. package/dist/benchmarks/index.js.map +1 -0
  9. package/dist/chunk-4UBK6452.js +128 -0
  10. package/dist/chunk-4UBK6452.js.map +1 -0
  11. package/dist/chunk-ERALDEZY.js +112 -0
  12. package/dist/chunk-ERALDEZY.js.map +1 -0
  13. package/dist/chunk-HMQYGCKI.js +11 -0
  14. package/dist/chunk-HMQYGCKI.js.map +1 -0
  15. package/dist/chunk-NUEOE3K5.js +8 -0
  16. package/dist/chunk-NUEOE3K5.js.map +1 -0
  17. package/dist/chunk-OQE6TQXZ.js +42 -0
  18. package/dist/chunk-OQE6TQXZ.js.map +1 -0
  19. package/dist/chunk-PZ5AY32C.js +10 -0
  20. package/dist/chunk-PZ5AY32C.js.map +1 -0
  21. package/dist/chunk-Q6GSOHOP.js +44 -0
  22. package/dist/chunk-Q6GSOHOP.js.map +1 -0
  23. package/dist/chunk-QY5MPNNB.js +28 -0
  24. package/dist/chunk-QY5MPNNB.js.map +1 -0
  25. package/dist/chunk-R76XA2K6.js +229 -0
  26. package/dist/chunk-R76XA2K6.js.map +1 -0
  27. package/dist/chunk-TRNCF2BG.js +35 -0
  28. package/dist/chunk-TRNCF2BG.js.map +1 -0
  29. package/dist/chunk-UHHHSYVE.js +11 -0
  30. package/dist/chunk-UHHHSYVE.js.map +1 -0
  31. package/dist/chunk-YY33MNMV.js +65 -0
  32. package/dist/chunk-YY33MNMV.js.map +1 -0
  33. package/dist/chunk-ZEWI24CV.js +365 -0
  34. package/dist/chunk-ZEWI24CV.js.map +1 -0
  35. package/dist/index-BAioQhp2.d.ts +27 -0
  36. package/dist/index.d.ts +59 -3841
  37. package/dist/index.js +31 -3545
  38. package/dist/index.js.map +1 -1
  39. package/dist/json-file-ZwzLUbje.d.ts +73 -0
  40. package/dist/llm-DNj_tp2T.d.ts +22 -0
  41. package/dist/llm-judge-QThCZ9TQ.d.ts +67 -0
  42. package/dist/provider-BDjGp2y-.d.ts +10 -0
  43. package/dist/providers/index.d.ts +69 -0
  44. package/dist/providers/index.js +18 -0
  45. package/dist/providers/index.js.map +1 -0
  46. package/dist/rate-limiter-CSmVIRsM.d.ts +60 -0
  47. package/dist/schemas/extensions/index.d.ts +28 -0
  48. package/dist/schemas/extensions/index.js +19 -0
  49. package/dist/schemas/extensions/index.js.map +1 -0
  50. package/dist/schemas/index.d.ts +200 -0
  51. package/dist/schemas/index.js +24 -0
  52. package/dist/schemas/index.js.map +1 -0
  53. package/dist/schemas/llm/index.d.ts +116 -0
  54. package/dist/schemas/llm/index.js +15 -0
  55. package/dist/schemas/llm/index.js.map +1 -0
  56. package/dist/scorers/index.d.ts +64 -0
  57. package/dist/scorers/index.js +16 -0
  58. package/dist/scorers/index.js.map +1 -0
  59. package/dist/storages/index.d.ts +69 -0
  60. package/dist/storages/index.js +98 -0
  61. package/dist/storages/index.js.map +1 -0
  62. package/package.json +46 -22
  63. package/LICENSE +0 -21
@@ -0,0 +1,458 @@
1
+ import {
2
+ SimpleSystemPromptSchemaV1
3
+ } from "../chunk-Q6GSOHOP.js";
4
+ import {
5
+ defineRunner
6
+ } from "../chunk-QY5MPNNB.js";
7
+ import {
8
+ BaseResponseSchemaV1,
9
+ BaseScoreSchemaV1,
10
+ BaseTestCaseSchemaV1,
11
+ defineResponseSchema,
12
+ defineScoreSchema,
13
+ defineTestCaseSchema
14
+ } from "../chunk-YY33MNMV.js";
15
+ import "../chunk-OQE6TQXZ.js";
16
+ import {
17
+ ScoringMethod
18
+ } from "../chunk-HMQYGCKI.js";
19
+ import {
20
+ JSONFileStorage
21
+ } from "../chunk-ERALDEZY.js";
22
+ import {
23
+ LLMAsAJudgeScorer,
24
+ MCQScorer
25
+ } from "../chunk-ZEWI24CV.js";
26
+ import {
27
+ AbstractLLMProvider
28
+ } from "../chunk-R76XA2K6.js";
29
+ import {
30
+ PEERBENCH_NAMESPACE
31
+ } from "../chunk-UHHHSYVE.js";
32
+ import {
33
+ idGeneratorUUIDv7
34
+ } from "../chunk-4UBK6452.js";
35
+ import {
36
+ ExtensionLLMAsAJudgeScoreFieldsV1,
37
+ ExtensionLLMResponseFieldsV1
38
+ } from "../chunk-TRNCF2BG.js";
39
+ import "../chunk-NUEOE3K5.js";
40
+ import {
41
+ __export
42
+ } from "../chunk-PZ5AY32C.js";
43
+
44
+ // src/benchmarks/peerbench/index.ts
45
+ var peerbench_exports = {};
46
+ __export(peerbench_exports, {
47
+ MCQKind: () => MCQKind,
48
+ MCQResponseSchemaV1: () => MCQResponseSchemaV1,
49
+ MCQScoreSchemaV1: () => MCQScoreSchemaV1,
50
+ MCQTestCaseSchemaV1: () => MCQTestCaseSchemaV1,
51
+ MultiTurnKind: () => MultiTurnKind,
52
+ MultiTurnResponseSchemaV1: () => MultiTurnResponseSchemaV1,
53
+ MultiTurnScoreSchemaV1: () => MultiTurnScoreSchemaV1,
54
+ MultiTurnTestCaseSchemaV1: () => MultiTurnTestCaseSchemaV1,
55
+ PeerbenchJSONStorage: () => PeerbenchJSONStorage,
56
+ QAKind: () => QAKind,
57
+ QAResponseSchemaV1: () => QAResponseSchemaV1,
58
+ QAScoreSchemaV1: () => QAScoreSchemaV1,
59
+ QATestCaseSchemaV1: () => QATestCaseSchemaV1,
60
+ peerbenchRunner: () => peerbenchRunner
61
+ });
62
+
63
+ // src/benchmarks/peerbench/schema-sets/mcq.v1.ts
64
+ import { z } from "zod";
65
+ var MCQKind = `llm/mcq`;
66
+ var MCQTestCaseSchemaV1 = defineTestCaseSchema({
67
+ baseSchema: BaseTestCaseSchemaV1,
68
+ namespace: PEERBENCH_NAMESPACE,
69
+ kind: MCQKind,
70
+ schemaVersion: 1,
71
+ fields: {
72
+ question: z.string(),
73
+ options: z.record(z.string(), z.string()),
74
+ correctAnswerKeys: z.string().array()
75
+ }
76
+ });
77
+ var MCQResponseSchemaV1 = defineResponseSchema({
78
+ baseSchema: BaseResponseSchemaV1,
79
+ namespace: PEERBENCH_NAMESPACE,
80
+ kind: MCQKind,
81
+ schemaVersion: 1,
82
+ fields: {
83
+ ...ExtensionLLMResponseFieldsV1
84
+ }
85
+ });
86
+ var MCQScoreSchemaV1 = defineScoreSchema({
87
+ baseSchema: BaseScoreSchemaV1,
88
+ namespace: PEERBENCH_NAMESPACE,
89
+ kind: MCQKind,
90
+ schemaVersion: 1,
91
+ fields: {
92
+ ...ExtensionLLMAsAJudgeScoreFieldsV1,
93
+ extractedAnswers: z.array(z.string())
94
+ }
95
+ });
96
+
97
+ // src/benchmarks/peerbench/schema-sets/multi-turn.v1.ts
98
+ import { z as z2 } from "zod";
99
+ var MultiTurnKind = `llm/multi-turn`;
100
+ var MultiTurnTestCaseSchemaV1 = defineTestCaseSchema({
101
+ baseSchema: BaseTestCaseSchemaV1,
102
+ namespace: PEERBENCH_NAMESPACE,
103
+ kind: MultiTurnKind,
104
+ schemaVersion: 1,
105
+ fields: {
106
+ messages: z2.object({
107
+ role: z2.string(),
108
+ content: z2.string(),
109
+ goodAnswers: z2.string().array().optional(),
110
+ badAnswers: z2.string().array().optional()
111
+ }).array(),
112
+ maxTurns: z2.number().optional(),
113
+ expectedOutcome: z2.string().optional()
114
+ }
115
+ });
116
+ var MultiTurnResponseSchemaV1 = defineResponseSchema({
117
+ baseSchema: BaseResponseSchemaV1,
118
+ namespace: PEERBENCH_NAMESPACE,
119
+ kind: MultiTurnKind,
120
+ schemaVersion: 1,
121
+ fields: {
122
+ ...ExtensionLLMResponseFieldsV1,
123
+ replies: z2.object({
124
+ messageIndex: z2.number(),
125
+ startedAt: z2.number(),
126
+ completedAt: z2.number(),
127
+ data: z2.string(),
128
+ inputTokensUsed: z2.number().optional(),
129
+ outputTokensUsed: z2.number().optional(),
130
+ inputCost: z2.string().optional(),
131
+ outputCost: z2.string().optional()
132
+ }).array()
133
+ }
134
+ });
135
+ var MultiTurnScoreSchemaV1 = defineScoreSchema({
136
+ baseSchema: BaseScoreSchemaV1,
137
+ namespace: PEERBENCH_NAMESPACE,
138
+ kind: MultiTurnKind,
139
+ schemaVersion: 1,
140
+ fields: {
141
+ ...ExtensionLLMAsAJudgeScoreFieldsV1,
142
+ individualScores: z2.object({
143
+ replyIndex: z2.number(),
144
+ value: z2.number()
145
+ }).array()
146
+ }
147
+ });
148
+
149
+ // src/benchmarks/peerbench/schema-sets/qa.v1.ts
150
+ import { z as z3 } from "zod";
151
+ var QAKind = `llm/qa`;
152
+ var QATestCaseSchemaV1 = defineTestCaseSchema({
153
+ baseSchema: BaseTestCaseSchemaV1,
154
+ namespace: PEERBENCH_NAMESPACE,
155
+ kind: QAKind,
156
+ schemaVersion: 1,
157
+ fields: {
158
+ question: z3.string(),
159
+ goodAnswers: z3.string().array(),
160
+ badAnswers: z3.string().array()
161
+ }
162
+ });
163
+ var QAResponseSchemaV1 = defineResponseSchema({
164
+ baseSchema: BaseResponseSchemaV1,
165
+ namespace: PEERBENCH_NAMESPACE,
166
+ kind: QAKind,
167
+ schemaVersion: 1,
168
+ fields: {
169
+ ...ExtensionLLMResponseFieldsV1
170
+ }
171
+ });
172
+ var QAScoreSchemaV1 = defineScoreSchema({
173
+ baseSchema: BaseScoreSchemaV1,
174
+ namespace: PEERBENCH_NAMESPACE,
175
+ kind: QAKind,
176
+ schemaVersion: 1,
177
+ fields: {
178
+ ...ExtensionLLMAsAJudgeScoreFieldsV1
179
+ }
180
+ });
181
+
182
+ // src/benchmarks/peerbench/runner.ts
183
+ import Handlebars from "handlebars";
184
+ import z4 from "zod";
185
+ var peerbenchRunner = defineRunner(
186
+ {
187
+ schemaSets: [
188
+ {
189
+ testCase: MCQTestCaseSchemaV1,
190
+ response: MCQResponseSchemaV1,
191
+ score: MCQScoreSchemaV1
192
+ },
193
+ {
194
+ testCase: QATestCaseSchemaV1,
195
+ response: QAResponseSchemaV1,
196
+ score: QAScoreSchemaV1
197
+ }
198
+ ],
199
+ providers: [AbstractLLMProvider],
200
+ scorers: [LLMAsAJudgeScorer, MCQScorer],
201
+ runConfigSchema: {
202
+ model: z4.string(),
203
+ llmJudgeModel: z4.string().optional(),
204
+ llmJudgeSystemPrompt: SimpleSystemPromptSchemaV1.optional(),
205
+ systemPrompt: SimpleSystemPromptSchemaV1.optional(),
206
+ templateVariables: z4.record(z4.string(), z4.string()).optional()
207
+ }
208
+ },
209
+ async (params) => {
210
+ const { testCase, provider, scorer, runConfig } = params;
211
+ const messages = [];
212
+ if (runConfig.systemPrompt) {
213
+ messages.push({
214
+ role: "system",
215
+ content: runConfig.systemPrompt.content
216
+ });
217
+ }
218
+ if (testCase.kind === "llm/mcq.tc") {
219
+ messages.push({
220
+ role: "user",
221
+ content: formatMCQ(testCase)
222
+ });
223
+ templateMessages(messages, runConfig.templateVariables ?? {});
224
+ return runMCQ({
225
+ testCase,
226
+ messages,
227
+ provider,
228
+ scorer,
229
+ runConfig,
230
+ idGenerators: {
231
+ response: params.idGenerators?.response ?? idGeneratorUUIDv7,
232
+ score: params.idGenerators?.score ?? idGeneratorUUIDv7
233
+ }
234
+ });
235
+ }
236
+ if (testCase.kind === "llm/qa.tc") {
237
+ if (scorer && scorer?.kind !== `${PEERBENCH_NAMESPACE}/llm-as-a-judge`) {
238
+ throw new Error(
239
+ `QA test cases can only be scored with an LLM as a judge scorer, but ${scorer?.kind} was provided`
240
+ );
241
+ }
242
+ messages.push({
243
+ role: "user",
244
+ content: testCase.question
245
+ });
246
+ templateMessages(messages, runConfig.templateVariables ?? {});
247
+ return runQA({
248
+ testCase,
249
+ messages,
250
+ provider,
251
+ scorer,
252
+ runConfig,
253
+ idGenerators: {
254
+ response: params.idGenerators?.response ?? idGeneratorUUIDv7,
255
+ score: params.idGenerators?.score ?? idGeneratorUUIDv7
256
+ }
257
+ });
258
+ }
259
+ throw new Error("Unsupported test case kind");
260
+ }
261
+ );
262
+ async function runQA(params) {
263
+ const { messages, testCase, provider, scorer, runConfig } = params;
264
+ const providerResponse = await provider.forward({
265
+ model: runConfig.model,
266
+ messages
267
+ });
268
+ const response = await QAResponseSchemaV1.newWithId(
269
+ {
270
+ data: providerResponse.data,
271
+ startedAt: providerResponse.startedAt,
272
+ completedAt: providerResponse.completedAt,
273
+ testCaseId: testCase.id,
274
+ modelSlug: runConfig.model,
275
+ provider: provider.kind,
276
+ systemPromptId: runConfig.systemPrompt?.id,
277
+ inputTokensUsed: providerResponse.inputTokensUsed,
278
+ outputTokensUsed: providerResponse.outputTokensUsed,
279
+ inputCost: providerResponse.inputCost,
280
+ outputCost: providerResponse.outputCost
281
+ },
282
+ params.idGenerators?.response ?? idGeneratorUUIDv7
283
+ );
284
+ if (scorer?.kind === `${PEERBENCH_NAMESPACE}/llm-as-a-judge`) {
285
+ if (!runConfig.llmJudgeModel) {
286
+ throw new Error(
287
+ "LLM judge model is required when using LLM as a judge scorer"
288
+ );
289
+ }
290
+ const scorerResult = await scorer.score({
291
+ model: runConfig.llmJudgeModel,
292
+ response: response.data,
293
+ rubric: `Expected/Valid answers: ${testCase.goodAnswers.join("\n")}
294
+ Invalid answers: ${testCase.badAnswers.join("\n")}`,
295
+ systemPrompt: runConfig.llmJudgeSystemPrompt?.content,
296
+ criteria: [
297
+ {
298
+ id: "correctness",
299
+ description: "Is the response matches with the expected/valid answers in terms of meaning?",
300
+ weight: 1
301
+ }
302
+ ]
303
+ });
304
+ if (scorerResult !== null) {
305
+ const score = await QAScoreSchemaV1.newWithId(
306
+ {
307
+ scoringMethod: ScoringMethod.ai,
308
+ value: scorerResult.value,
309
+ responseId: response.id,
310
+ explanation: scorerResult.explanation,
311
+ metadata: scorerResult.metadata,
312
+ scorerAIInputCost: scorerResult.inputCost,
313
+ scorerAIOutputCost: scorerResult.outputCost,
314
+ scorerAIInputTokensUsed: scorerResult.inputTokensUsed,
315
+ scorerAIOutputTokensUsed: scorerResult.outputTokensUsed,
316
+ scorerAIProvider: scorerResult.provider,
317
+ scorerAIModelSlug: runConfig.llmJudgeModel,
318
+ scorerAISystemPromptId: runConfig.llmJudgeSystemPrompt?.id
319
+ },
320
+ params.idGenerators?.score ?? idGeneratorUUIDv7
321
+ );
322
+ return { response, score };
323
+ }
324
+ }
325
+ return { response };
326
+ }
327
+ async function runMCQ(params) {
328
+ const { messages, testCase, provider, scorer, runConfig } = params;
329
+ const providerResponse = await provider.forward({
330
+ model: runConfig.model,
331
+ messages
332
+ });
333
+ const response = await MCQResponseSchemaV1.newWithId(
334
+ {
335
+ data: providerResponse.data,
336
+ startedAt: providerResponse.startedAt,
337
+ completedAt: providerResponse.completedAt,
338
+ testCaseId: testCase.id,
339
+ modelSlug: runConfig.model,
340
+ provider: provider.kind,
341
+ systemPromptId: runConfig.systemPrompt?.id,
342
+ inputTokensUsed: providerResponse.inputTokensUsed,
343
+ outputTokensUsed: providerResponse.outputTokensUsed,
344
+ inputCost: providerResponse.inputCost,
345
+ outputCost: providerResponse.outputCost
346
+ },
347
+ params.idGenerators?.response ?? idGeneratorUUIDv7
348
+ );
349
+ if (scorer?.kind === `${PEERBENCH_NAMESPACE}/mcq`) {
350
+ const scorerResult = await scorer.score({
351
+ response: response.data,
352
+ choices: testCase.options,
353
+ correctAnswers: testCase.correctAnswerKeys
354
+ });
355
+ if (scorerResult !== null) {
356
+ const score = await MCQScoreSchemaV1.newWithId(
357
+ {
358
+ scoringMethod: ScoringMethod.algo,
359
+ value: scorerResult.value,
360
+ responseId: response.id,
361
+ extractedAnswers: scorerResult.extractedAnswers,
362
+ explanation: scorerResult.explanation,
363
+ metadata: scorerResult.metadata
364
+ },
365
+ params.idGenerators?.score ?? idGeneratorUUIDv7
366
+ );
367
+ return { response, score };
368
+ }
369
+ }
370
+ if (scorer?.kind === `${PEERBENCH_NAMESPACE}/llm-as-a-judge`) {
371
+ if (!runConfig.llmJudgeModel) {
372
+ throw new Error(
373
+ "LLM judge model is required when using LLM as a judge scorer"
374
+ );
375
+ }
376
+ const scorerResult = await scorer.score({
377
+ model: runConfig.llmJudgeModel,
378
+ criteria: [
379
+ {
380
+ id: "correctness",
381
+ description: "Is the given answer key matches with one of the correct answer keys?",
382
+ weight: 1
383
+ }
384
+ ],
385
+ rubric: `Answer text itself or the key (A, B, C) is accepted
386
+ Valid answer keys: ${testCase.correctAnswerKeys.map((key) => `- ${key}`).join("\n")}
387
+ Valid Answer texts: ${testCase.correctAnswerKeys.map((key) => `- ${testCase.options?.[key] ?? ""}`).join("\n")}`,
388
+ fieldsToExtract: {
389
+ extractedAnswers: z4.string().array().describe(
390
+ "The extracted answer keys, valid or invalid (even if the answer text is provided rather than the key)"
391
+ )
392
+ },
393
+ response: response.data,
394
+ systemPrompt: runConfig.llmJudgeSystemPrompt?.content
395
+ });
396
+ if (scorerResult !== null) {
397
+ const score = await MCQScoreSchemaV1.newWithId(
398
+ {
399
+ scoringMethod: ScoringMethod.ai,
400
+ value: scorerResult.value,
401
+ extractedAnswers: scorerResult.extractedFields.extractedAnswers,
402
+ responseId: response.id,
403
+ explanation: scorerResult.explanation,
404
+ metadata: scorerResult.metadata,
405
+ scorerAIInputCost: scorerResult.inputCost,
406
+ scorerAIOutputCost: scorerResult.outputCost,
407
+ scorerAIInputTokensUsed: scorerResult.inputTokensUsed,
408
+ scorerAIOutputTokensUsed: scorerResult.outputTokensUsed,
409
+ scorerAIProvider: scorerResult.provider,
410
+ scorerAIModelSlug: runConfig.llmJudgeModel,
411
+ scorerAISystemPromptId: runConfig.llmJudgeSystemPrompt?.id
412
+ },
413
+ params.idGenerators?.score ?? idGeneratorUUIDv7
414
+ );
415
+ return { response, score };
416
+ }
417
+ }
418
+ return { response };
419
+ }
420
+ function formatMCQ(testCase) {
421
+ return `Question: ${testCase.question}
422
+ Options:
423
+ ${Object.entries(
424
+ testCase.options ?? {}
425
+ ).map(([key, value]) => `${key}: ${value}`).join("\n")}`;
426
+ }
427
+ function templateMessages(messages, templateVariables) {
428
+ for (let i = 0; i < messages.length; i++) {
429
+ const template = Handlebars.compile(messages[i].content);
430
+ messages[i].content = template(templateVariables);
431
+ }
432
+ }
433
+
434
+ // src/benchmarks/peerbench/storages/json.ts
435
+ import z5 from "zod";
436
+ var PeerbenchJSONStorage = class extends JSONFileStorage {
437
+ constructor(config) {
438
+ super({
439
+ path: config.path,
440
+ chunkSize: config.chunkSize,
441
+ schema: z5.union([
442
+ MCQTestCaseSchemaV1,
443
+ MCQResponseSchemaV1,
444
+ MCQScoreSchemaV1,
445
+ QATestCaseSchemaV1,
446
+ QAResponseSchemaV1,
447
+ QAScoreSchemaV1,
448
+ MultiTurnTestCaseSchemaV1,
449
+ MultiTurnResponseSchemaV1,
450
+ MultiTurnScoreSchemaV1
451
+ ])
452
+ });
453
+ }
454
+ };
455
+ export {
456
+ peerbench_exports as peerbench
457
+ };
458
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/benchmarks/peerbench/index.ts","../../src/benchmarks/peerbench/schema-sets/mcq.v1.ts","../../src/benchmarks/peerbench/schema-sets/multi-turn.v1.ts","../../src/benchmarks/peerbench/schema-sets/qa.v1.ts","../../src/benchmarks/peerbench/runner.ts","../../src/benchmarks/peerbench/storages/json.ts"],"sourcesContent":["export * from \"./schema-sets/mcq.v1\";\nexport * from \"./schema-sets/multi-turn.v1\";\nexport * from \"./schema-sets/qa.v1\";\n\nexport * from \"./runner\";\n\nexport * from \"./storages/json\";\n","import { PEERBENCH_NAMESPACE } from \"@/constants\";\nimport {\n BaseResponseSchemaV1,\n BaseScoreSchemaV1,\n BaseTestCaseSchemaV1,\n defineResponseSchema,\n defineScoreSchema,\n defineTestCaseSchema,\n} from \"@/schemas\";\nimport { ExtensionLLMResponseFieldsV1 } from \"@/schemas/extensions/response/llm\";\nimport { ExtensionLLMAsAJudgeScoreFieldsV1 } from \"@/schemas/extensions/score/llm-as-a-judge-scorer\";\nimport { z } from \"zod\";\n\nexport const MCQKind = `llm/mcq` as const;\n\nexport const MCQTestCaseSchemaV1 = defineTestCaseSchema({\n baseSchema: BaseTestCaseSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: MCQKind,\n schemaVersion: 1,\n fields: {\n question: z.string(),\n options: z.record(z.string(), z.string()),\n correctAnswerKeys: z.string().array(),\n },\n});\nexport type MCQTestCaseV1 = z.infer<typeof MCQTestCaseSchemaV1>;\n\nexport const MCQResponseSchemaV1 = defineResponseSchema({\n baseSchema: BaseResponseSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: MCQKind,\n schemaVersion: 1,\n fields: {\n ...ExtensionLLMResponseFieldsV1,\n },\n});\nexport type MCQResponseV1 = z.infer<typeof MCQResponseSchemaV1>;\n\nexport const MCQScoreSchemaV1 = defineScoreSchema({\n baseSchema: BaseScoreSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: MCQKind,\n schemaVersion: 1,\n fields: {\n ...ExtensionLLMAsAJudgeScoreFieldsV1,\n extractedAnswers: z.array(z.string()),\n },\n});\nexport type MCQScoreV1 = z.infer<typeof MCQScoreSchemaV1>;\n","import { PEERBENCH_NAMESPACE } from \"@/constants\";\nimport {\n BaseResponseSchemaV1,\n BaseScoreSchemaV1,\n BaseTestCaseSchemaV1,\n defineResponseSchema,\n defineScoreSchema,\n defineTestCaseSchema,\n} from \"@/schemas\";\nimport { ExtensionLLMResponseFieldsV1 } from \"@/schemas/extensions/response/llm\";\nimport { ExtensionLLMAsAJudgeScoreFieldsV1 } from \"@/schemas/extensions/score/llm-as-a-judge-scorer\";\nimport { z } from \"zod\";\n\nexport const MultiTurnKind = `llm/multi-turn` as const;\n\nexport const MultiTurnTestCaseSchemaV1 = defineTestCaseSchema({\n baseSchema: BaseTestCaseSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: MultiTurnKind,\n schemaVersion: 1,\n fields: {\n messages: z\n .object({\n role: z.string(),\n content: z.string(),\n goodAnswers: z.string().array().optional(),\n badAnswers: z.string().array().optional(),\n })\n .array(),\n\n maxTurns: z.number().optional(),\n expectedOutcome: z.string().optional(),\n },\n});\nexport type MultiTurnTestCaseV1 = z.infer<typeof MultiTurnTestCaseSchemaV1>;\n\nexport const MultiTurnResponseSchemaV1 = defineResponseSchema({\n baseSchema: BaseResponseSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: MultiTurnKind,\n schemaVersion: 1,\n fields: {\n ...ExtensionLLMResponseFieldsV1,\n replies: z\n .object({\n messageIndex: z.number(),\n startedAt: z.number(),\n completedAt: z.number(),\n data: z.string(),\n\n inputTokensUsed: z.number().optional(),\n outputTokensUsed: z.number().optional(),\n inputCost: z.string().optional(),\n outputCost: z.string().optional(),\n })\n .array(),\n },\n});\nexport type MultiTurnResponseV1 = z.infer<typeof MultiTurnResponseSchemaV1>;\n\nexport const MultiTurnScoreSchemaV1 = defineScoreSchema({\n baseSchema: BaseScoreSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: MultiTurnKind,\n schemaVersion: 1,\n fields: {\n ...ExtensionLLMAsAJudgeScoreFieldsV1,\n individualScores: z\n .object({\n replyIndex: z.number(),\n value: z.number(),\n })\n .array(),\n },\n});\nexport type MultiTurnScoreV1 = z.infer<typeof MultiTurnScoreSchemaV1>;\n","import { PEERBENCH_NAMESPACE } from \"@/constants\";\nimport {\n BaseResponseSchemaV1,\n BaseScoreSchemaV1,\n BaseTestCaseSchemaV1,\n defineResponseSchema,\n defineScoreSchema,\n defineTestCaseSchema,\n} from \"@/schemas\";\nimport { ExtensionLLMResponseFieldsV1 } from \"@/schemas/extensions/response/llm\";\nimport { ExtensionLLMAsAJudgeScoreFieldsV1 } from \"@/schemas/extensions/score/llm-as-a-judge-scorer\";\nimport { z } from \"zod\";\n\nexport const QAKind = `llm/qa` as const;\n\nexport const QATestCaseSchemaV1 = defineTestCaseSchema({\n baseSchema: BaseTestCaseSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: QAKind,\n schemaVersion: 1,\n fields: {\n question: z.string(),\n goodAnswers: z.string().array(),\n badAnswers: z.string().array(),\n },\n});\nexport type QATestCaseV1 = z.infer<typeof QATestCaseSchemaV1>;\n\nexport const QAResponseSchemaV1 = defineResponseSchema({\n baseSchema: BaseResponseSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: QAKind,\n schemaVersion: 1,\n fields: {\n ...ExtensionLLMResponseFieldsV1,\n },\n});\nexport type QAResponseV1 = z.infer<typeof QAResponseSchemaV1>;\n\nexport const QAScoreSchemaV1 = defineScoreSchema({\n baseSchema: BaseScoreSchemaV1,\n namespace: PEERBENCH_NAMESPACE,\n kind: QAKind,\n schemaVersion: 1,\n fields: {\n ...ExtensionLLMAsAJudgeScoreFieldsV1,\n },\n});\nexport type QAScoreV1 = z.infer<typeof QAScoreSchemaV1>;\n","import { defineRunner } from \"@/helpers/define-runner\";\nimport { AbstractLLMProvider } from \"@/providers\";\nimport {\n SimpleSystemPromptSchemaV1,\n SimpleSystemPromptV1,\n} from \"@/schemas/llm\";\nimport { LLMAsAJudgeScorer, MCQScorer } from \"@/scorers\";\nimport { IdGenerator, ScoringMethod } from \"@/types\";\nimport { idGeneratorUUIDv7 } from \"@/utils\";\nimport { ChatCompletionMessageParam } from \"openai/resources/index\";\nimport Handlebars from \"handlebars\";\nimport z from \"zod\";\nimport {\n MCQResponseSchemaV1,\n MCQScoreSchemaV1,\n MCQTestCaseSchemaV1,\n MCQTestCaseV1,\n} from \"./schema-sets/mcq.v1\";\nimport {\n QAResponseSchemaV1,\n QAScoreSchemaV1,\n QATestCaseSchemaV1,\n QATestCaseV1,\n} from \"./schema-sets/qa.v1\";\nimport { PEERBENCH_NAMESPACE } from \"@/constants\";\n\nexport const peerbenchRunner = defineRunner(\n {\n schemaSets: [\n {\n testCase: MCQTestCaseSchemaV1,\n response: MCQResponseSchemaV1,\n score: MCQScoreSchemaV1,\n },\n {\n testCase: QATestCaseSchemaV1,\n response: QAResponseSchemaV1,\n score: QAScoreSchemaV1,\n },\n ],\n providers: [AbstractLLMProvider],\n scorers: [LLMAsAJudgeScorer, MCQScorer],\n\n runConfigSchema: {\n model: z.string(),\n llmJudgeModel: z.string().optional(),\n llmJudgeSystemPrompt: SimpleSystemPromptSchemaV1.optional(),\n systemPrompt: SimpleSystemPromptSchemaV1.optional(),\n templateVariables: z.record(z.string(), z.string()).optional(),\n },\n },\n async (params) => {\n const { testCase, provider, scorer, runConfig } = params;\n const messages: ChatCompletionMessageParam[] = [];\n\n if (runConfig.systemPrompt) {\n messages.push({\n role: \"system\",\n content: runConfig.systemPrompt.content,\n });\n }\n\n if (testCase.kind === \"llm/mcq.tc\") {\n messages.push({\n role: \"user\",\n content: formatMCQ(testCase),\n });\n templateMessages(messages, runConfig.templateVariables ?? {});\n\n return runMCQ({\n testCase,\n messages,\n provider,\n scorer,\n runConfig,\n idGenerators: {\n response: params.idGenerators?.response ?? idGeneratorUUIDv7,\n score: params.idGenerators?.score ?? idGeneratorUUIDv7,\n },\n });\n }\n\n if (testCase.kind === \"llm/qa.tc\") {\n if (\n scorer &&\n scorer?.kind !== (`${PEERBENCH_NAMESPACE}/llm-as-a-judge` as const)\n ) {\n throw new Error(\n `QA test cases can only be scored with an LLM as a judge scorer, but ${scorer?.kind} was provided`\n );\n }\n\n messages.push({\n role: \"user\",\n content: testCase.question,\n });\n templateMessages(messages, runConfig.templateVariables ?? {});\n\n return runQA({\n testCase,\n messages,\n provider,\n scorer,\n runConfig,\n idGenerators: {\n response: params.idGenerators?.response ?? idGeneratorUUIDv7,\n score: params.idGenerators?.score ?? idGeneratorUUIDv7,\n },\n });\n }\n\n throw new Error(\"Unsupported test case kind\");\n }\n);\n\nasync function runQA(params: {\n messages: ChatCompletionMessageParam[];\n testCase: QATestCaseV1;\n provider: AbstractLLMProvider;\n scorer?: LLMAsAJudgeScorer;\n runConfig: {\n model: string;\n llmJudgeModel?: string;\n llmJudgeSystemPrompt?: SimpleSystemPromptV1;\n systemPrompt?: SimpleSystemPromptV1;\n };\n idGenerators: {\n response: IdGenerator;\n score: IdGenerator;\n };\n}) {\n const { messages, testCase, provider, scorer, runConfig } = params;\n\n const providerResponse = await provider.forward({\n model: runConfig.model,\n messages,\n });\n\n const response = await QAResponseSchemaV1.newWithId(\n {\n data: providerResponse.data,\n startedAt: providerResponse.startedAt,\n completedAt: providerResponse.completedAt,\n testCaseId: testCase.id,\n modelSlug: runConfig.model,\n provider: provider.kind,\n systemPromptId: runConfig.systemPrompt?.id,\n\n inputTokensUsed: providerResponse.inputTokensUsed,\n outputTokensUsed: providerResponse.outputTokensUsed,\n inputCost: providerResponse.inputCost,\n outputCost: providerResponse.outputCost,\n },\n params.idGenerators?.response ?? idGeneratorUUIDv7\n );\n\n if (scorer?.kind === (`${PEERBENCH_NAMESPACE}/llm-as-a-judge` as const)) {\n if (!runConfig.llmJudgeModel) {\n throw new Error(\n \"LLM judge model is required when using LLM as a judge scorer\"\n );\n }\n\n const scorerResult = await scorer.score({\n model: runConfig.llmJudgeModel,\n response: response.data,\n rubric: `Expected/Valid answers: ${testCase.goodAnswers.join(\"\\n\")}\\nInvalid answers: ${testCase.badAnswers.join(\"\\n\")}`,\n systemPrompt: runConfig.llmJudgeSystemPrompt?.content,\n criteria: [\n {\n id: \"correctness\",\n description:\n \"Is the response matches with the expected/valid answers in terms of meaning?\",\n weight: 1,\n },\n ],\n });\n\n if (scorerResult !== null) {\n const score = await QAScoreSchemaV1.newWithId(\n {\n scoringMethod: ScoringMethod.ai,\n value: scorerResult.value,\n responseId: response.id,\n explanation: scorerResult.explanation,\n metadata: scorerResult.metadata,\n scorerAIInputCost: scorerResult.inputCost,\n scorerAIOutputCost: scorerResult.outputCost,\n scorerAIInputTokensUsed: scorerResult.inputTokensUsed,\n scorerAIOutputTokensUsed: scorerResult.outputTokensUsed,\n scorerAIProvider: scorerResult.provider,\n scorerAIModelSlug: runConfig.llmJudgeModel,\n scorerAISystemPromptId: runConfig.llmJudgeSystemPrompt?.id,\n },\n params.idGenerators?.score ?? idGeneratorUUIDv7\n );\n\n return { response, score };\n }\n }\n\n return { response };\n}\n\nasync function runMCQ(params: {\n messages: ChatCompletionMessageParam[];\n testCase: MCQTestCaseV1;\n provider: AbstractLLMProvider;\n scorer?: MCQScorer | LLMAsAJudgeScorer;\n runConfig: {\n model: string;\n llmJudgeModel?: string;\n llmJudgeSystemPrompt?: SimpleSystemPromptV1;\n systemPrompt?: SimpleSystemPromptV1;\n };\n idGenerators: {\n response: IdGenerator;\n score: IdGenerator;\n };\n}) {\n const { messages, testCase, provider, scorer, runConfig } = params;\n\n const providerResponse = await provider.forward({\n model: runConfig.model,\n messages,\n });\n\n const response = await MCQResponseSchemaV1.newWithId(\n {\n data: providerResponse.data,\n startedAt: providerResponse.startedAt,\n completedAt: providerResponse.completedAt,\n testCaseId: testCase.id,\n modelSlug: runConfig.model,\n provider: provider.kind,\n systemPromptId: runConfig.systemPrompt?.id,\n\n inputTokensUsed: providerResponse.inputTokensUsed,\n outputTokensUsed: providerResponse.outputTokensUsed,\n inputCost: providerResponse.inputCost,\n outputCost: providerResponse.outputCost,\n },\n params.idGenerators?.response ?? idGeneratorUUIDv7\n );\n\n if (scorer?.kind === (`${PEERBENCH_NAMESPACE}/mcq` as const)) {\n const scorerResult = await scorer.score({\n response: response.data,\n choices: testCase.options,\n correctAnswers: testCase.correctAnswerKeys,\n });\n\n if (scorerResult !== null) {\n const score = await MCQScoreSchemaV1.newWithId(\n {\n scoringMethod: ScoringMethod.algo,\n value: scorerResult.value,\n responseId: response.id,\n extractedAnswers: scorerResult.extractedAnswers,\n explanation: scorerResult.explanation,\n metadata: scorerResult.metadata,\n },\n params.idGenerators?.score ?? idGeneratorUUIDv7\n );\n\n return { response, score };\n }\n }\n\n if (scorer?.kind === (`${PEERBENCH_NAMESPACE}/llm-as-a-judge` as const)) {\n if (!runConfig.llmJudgeModel) {\n throw new Error(\n \"LLM judge model is required when using LLM as a judge scorer\"\n );\n }\n\n const scorerResult = await scorer.score({\n model: runConfig.llmJudgeModel,\n criteria: [\n {\n id: \"correctness\",\n description:\n \"Is the given answer key matches with one of the correct answer keys?\",\n weight: 1,\n },\n ],\n rubric: `Answer text itself or the key (A, B, C) is accepted\nValid answer keys: ${testCase.correctAnswerKeys.map((key) => `- ${key}`).join(\"\\n\")}\nValid Answer texts: ${testCase.correctAnswerKeys.map((key) => `- ${testCase.options?.[key] ?? \"\"}`).join(\"\\n\")}`,\n fieldsToExtract: {\n extractedAnswers: z\n .string()\n .array()\n .describe(\n \"The extracted answer keys, valid or invalid (even if the answer text is provided rather than the key)\"\n ),\n },\n response: response.data,\n systemPrompt: runConfig.llmJudgeSystemPrompt?.content,\n });\n\n if (scorerResult !== null) {\n const score = await MCQScoreSchemaV1.newWithId(\n {\n scoringMethod: ScoringMethod.ai,\n value: scorerResult.value,\n extractedAnswers: scorerResult.extractedFields.extractedAnswers,\n responseId: response.id,\n explanation: scorerResult.explanation,\n metadata: scorerResult.metadata,\n scorerAIInputCost: scorerResult.inputCost,\n scorerAIOutputCost: scorerResult.outputCost,\n scorerAIInputTokensUsed: scorerResult.inputTokensUsed,\n scorerAIOutputTokensUsed: scorerResult.outputTokensUsed,\n scorerAIProvider: scorerResult.provider,\n scorerAIModelSlug: runConfig.llmJudgeModel,\n scorerAISystemPromptId: runConfig.llmJudgeSystemPrompt?.id,\n },\n params.idGenerators?.score ?? idGeneratorUUIDv7\n );\n\n return { response, score };\n }\n }\n\n return { response };\n}\n\nfunction formatMCQ(testCase: MCQTestCaseV1) {\n return `Question: ${testCase.question}\\nOptions:\\n${Object.entries(\n testCase.options ?? {}\n )\n .map(([key, value]) => `${key}: ${value}`)\n .join(\"\\n\")}`;\n}\n\nfunction templateMessages(\n messages: ChatCompletionMessageParam[],\n templateVariables: Record<string, string>\n) {\n for (let i = 0; i < messages.length; i++) {\n const template = Handlebars.compile(messages[i]!.content);\n messages[i]!.content = template(templateVariables);\n }\n}\n","import { JSONFileStorage } from \"@/storages/json-file\";\nimport {\n MCQResponseSchemaV1,\n MCQResponseV1,\n MCQScoreSchemaV1,\n MCQScoreV1,\n MCQTestCaseSchemaV1,\n MCQTestCaseV1,\n} from \"../schema-sets/mcq.v1\";\nimport {\n QAResponseSchemaV1,\n QAResponseV1,\n QAScoreSchemaV1,\n QAScoreV1,\n QATestCaseSchemaV1,\n QATestCaseV1,\n} from \"../schema-sets/qa.v1\";\nimport {\n MultiTurnResponseSchemaV1,\n MultiTurnResponseV1,\n MultiTurnScoreSchemaV1,\n MultiTurnScoreV1,\n MultiTurnTestCaseSchemaV1,\n MultiTurnTestCaseV1,\n} from \"../schema-sets/multi-turn.v1\";\nimport z from \"zod\";\n\nexport class PeerbenchJSONStorage extends JSONFileStorage<\n | MCQTestCaseV1\n | MCQResponseV1\n | MCQScoreV1\n | QATestCaseV1\n | QAResponseV1\n | QAScoreV1\n | MultiTurnTestCaseV1\n | MultiTurnResponseV1\n | MultiTurnScoreV1\n> {\n constructor(config: { path: string; chunkSize?: number }) {\n super({\n path: config.path,\n chunkSize: config.chunkSize,\n\n schema: z.union([\n MCQTestCaseSchemaV1,\n MCQResponseSchemaV1,\n MCQScoreSchemaV1,\n QATestCaseSchemaV1,\n QAResponseSchemaV1,\n QAScoreSchemaV1,\n MultiTurnTestCaseSchemaV1,\n MultiTurnResponseSchemaV1,\n MultiTurnScoreSchemaV1,\n ]),\n });\n }\n}\n"],"mappings":"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","names":["z","z","z","z","z"]}
@@ -0,0 +1,128 @@
1
+ // src/utils/sleep.ts
2
+ async function sleep(ms, signal) {
3
+ return new Promise((resolve, reject) => {
4
+ if (signal?.aborted) {
5
+ return reject(new Error("Aborted"));
6
+ }
7
+ const timeout = setTimeout(() => {
8
+ cleanup();
9
+ resolve();
10
+ }, ms);
11
+ const onAbort = () => {
12
+ cleanup();
13
+ reject(new Error("Aborted"));
14
+ };
15
+ const cleanup = () => {
16
+ clearTimeout(timeout);
17
+ signal?.removeEventListener("abort", onAbort);
18
+ };
19
+ signal?.addEventListener("abort", onAbort);
20
+ });
21
+ }
22
+
23
+ // src/utils/llm.ts
24
+ import { jsonrepair } from "jsonrepair";
25
+ function parseResponseAsJSON(response) {
26
+ try {
27
+ return JSON.parse(jsonrepair(response));
28
+ } catch (e) {
29
+ if (process?.env?.PB_SDK_DEBUG) {
30
+ console.log("Original response", JSON.stringify(response));
31
+ console.error("Error parsing response as JSON", e);
32
+ }
33
+ }
34
+ }
35
+
36
+ // src/utils/rate-limiter.ts
37
+ var RateLimiter = class {
38
+ maxWeight;
39
+ timeWindow;
40
+ timestamps = [];
41
+ constructor(options = {}) {
42
+ this.maxWeight = options.maxWeight ?? 25;
43
+ this.timeWindow = options.timeWindow ?? 1e3;
44
+ }
45
+ /**
46
+ * Checks if rate limiting is disabled
47
+ */
48
+ isDisabled() {
49
+ return this.maxWeight <= 0;
50
+ }
51
+ /**
52
+ * Disables rate limiting. Set `maxWeight` to re-enable it.
53
+ */
54
+ disable() {
55
+ this.maxWeight = 0;
56
+ }
57
+ /**
58
+ * Returns how many weight of calls are there in the current time window
59
+ */
60
+ getCurrentCalls() {
61
+ const now = Date.now();
62
+ this.timestamps = this.timestamps.filter(
63
+ (ts) => now - ts < this.timeWindow
64
+ );
65
+ return this.timestamps.length;
66
+ }
67
+ /**
68
+ * Executes the given function with rate limiting applied
69
+ */
70
+ async execute(func, { weight = 1, signal } = {}) {
71
+ if (this.maxWeight <= 0) {
72
+ return await func();
73
+ }
74
+ await this.waitForRateLimit(weight, signal);
75
+ return await func();
76
+ }
77
+ /**
78
+ * Waits until rate limit allows the specified weight of calls
79
+ */
80
+ async waitForRateLimit(weight, signal) {
81
+ const now = Date.now();
82
+ this.timestamps = this.timestamps.filter(
83
+ (ts) => now - ts < this.timeWindow
84
+ );
85
+ if (this.timestamps.length + weight <= this.maxWeight) {
86
+ for (let i = 0; i < weight; i++) {
87
+ this.timestamps.push(now);
88
+ }
89
+ return;
90
+ }
91
+ const earliest = this.timestamps[0];
92
+ const waitTime = this.timeWindow - (now - (earliest ?? 0));
93
+ await sleep(waitTime, signal);
94
+ return this.waitForRateLimit(weight, signal);
95
+ }
96
+ /**
97
+ * Resets the rate limited weight of calls
98
+ */
99
+ reset() {
100
+ this.timestamps = [];
101
+ }
102
+ };
103
+
104
+ // src/utils/string.ts
105
+ function bufferToString(buffer, encoding = "utf-8") {
106
+ const decoder = new TextDecoder(encoding);
107
+ return decoder.decode(buffer);
108
+ }
109
+ function stringToBuffer(str) {
110
+ const encoder = new TextEncoder();
111
+ return encoder.encode(str);
112
+ }
113
+
114
+ // src/utils/id-generator.ts
115
+ import { v7 as uuidv7 } from "uuid";
116
+ var idGeneratorUUIDv7 = () => {
117
+ return uuidv7();
118
+ };
119
+
120
+ export {
121
+ sleep,
122
+ parseResponseAsJSON,
123
+ RateLimiter,
124
+ bufferToString,
125
+ stringToBuffer,
126
+ idGeneratorUUIDv7
127
+ };
128
+ //# sourceMappingURL=chunk-4UBK6452.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/utils/sleep.ts","../src/utils/llm.ts","../src/utils/rate-limiter.ts","../src/utils/string.ts","../src/utils/id-generator.ts"],"sourcesContent":["export async function sleep(ms: number, signal?: AbortSignal) {\n return new Promise<void>((resolve, reject) => {\n if (signal?.aborted) {\n return reject(new Error(\"Aborted\"));\n }\n\n const timeout = setTimeout(() => {\n cleanup();\n resolve();\n }, ms);\n\n const onAbort = () => {\n cleanup();\n reject(new Error(\"Aborted\"));\n };\n\n const cleanup = () => {\n clearTimeout(timeout);\n signal?.removeEventListener(\"abort\", onAbort);\n };\n\n signal?.addEventListener(\"abort\", onAbort);\n });\n}\n","import { jsonrepair } from \"jsonrepair\";\n\n/**\n * Tries to repair and parse LLM response as a JSON object. LLM must\n * be configured to return a JSON object. This function only helps to\n * get rid out of some additional formatting (e.g. ```json) and repair\n * the JSON syntax (e.g missing comma, single quotes instead double).\n */\nexport function parseResponseAsJSON<T>(response: string) {\n try {\n return JSON.parse(jsonrepair(response)) as T;\n } catch (e) {\n if (process?.env?.PB_SDK_DEBUG) {\n console.log(\"Original response\", JSON.stringify(response));\n console.error(\"Error parsing response as JSON\", e);\n }\n }\n}\n","import { sleep } from \"./sleep\";\n\nexport interface RateLimiterOptions {\n /**\n * Maximum weight of calls allowed within a time window. Each call has a weight of 1 by default.\n * Rate limiting is disabled when this is 0 or negative.\n * @default 25\n */\n maxWeight?: number;\n\n /**\n * Time window in milliseconds for rate limiting\n * @default 1000\n */\n timeWindow?: number;\n}\n\nexport interface RateLimiterCallOptions {\n /**\n * Weight of the call. Rate limiting is applied based on the total weight of the calls.\n * @default 1\n */\n weight?: number;\n\n /**\n * Abort signal for cancellation\n */\n signal?: AbortSignal;\n}\n\n/**\n * Generic rate limiter. It can be used to limit async function calls\n * by a given number of calls within a time window.\n */\nexport class RateLimiter {\n maxWeight: number;\n timeWindow: number;\n\n private timestamps: number[] = [];\n\n constructor(options: RateLimiterOptions = {}) {\n this.maxWeight = options.maxWeight ?? 25;\n this.timeWindow = options.timeWindow ?? 1000;\n }\n\n /**\n * Checks if rate limiting is disabled\n */\n isDisabled(): boolean {\n return this.maxWeight <= 0;\n }\n\n /**\n * Disables rate limiting. Set `maxWeight` to re-enable it.\n */\n disable() {\n this.maxWeight = 0;\n }\n\n /**\n * Returns how many weight of calls are there in the current time window\n */\n getCurrentCalls(): number {\n const now = Date.now();\n this.timestamps = this.timestamps.filter(\n (ts) => now - ts < this.timeWindow\n );\n return this.timestamps.length;\n }\n\n /**\n * Executes the given function with rate limiting applied\n */\n async execute<T = unknown>(\n func: () => Promise<T>,\n { weight = 1, signal }: RateLimiterCallOptions = {}\n ): Promise<T> {\n // If maxWeight is zero/negative, execute immediately (no rate limiting)\n if (this.maxWeight <= 0) {\n return await func();\n }\n\n await this.waitForRateLimit(weight, signal);\n return await func();\n }\n\n /**\n * Waits until rate limit allows the specified weight of calls\n */\n private async waitForRateLimit(\n weight: number,\n signal?: AbortSignal\n ): Promise<void> {\n const now = Date.now();\n\n // Clear timestamps from the old time period\n this.timestamps = this.timestamps.filter(\n (ts) => now - ts < this.timeWindow\n );\n\n // Check if there are empty slots for the requests\n if (this.timestamps.length + weight <= this.maxWeight) {\n for (let i = 0; i < weight; i++) {\n this.timestamps.push(now);\n }\n return;\n }\n\n // Calculate how much time to wait for the next time window\n const earliest = this.timestamps[0];\n const waitTime = this.timeWindow - (now - (earliest ?? 0));\n\n await sleep(waitTime, signal);\n\n // Retry after waiting\n return this.waitForRateLimit(weight, signal);\n }\n\n /**\n * Resets the rate limited weight of calls\n */\n reset(): void {\n this.timestamps = [];\n }\n}\n","/**\n * Converts the given byte array to a string\n */\nexport function bufferToString(\n buffer: Uint8Array,\n encoding: BufferEncoding = \"utf-8\"\n): string {\n const decoder = new TextDecoder(encoding);\n return decoder.decode(buffer);\n}\n\n/**\n * Converts the given string to a byte array\n */\nexport function stringToBuffer(str: string): Uint8Array {\n const encoder = new TextEncoder();\n return encoder.encode(str);\n}\n","import { IdGenerator } from \"@/types\";\nimport { v7 as uuidv7 } from \"uuid\";\n\nexport const idGeneratorUUIDv7: IdGenerator = () => {\n return uuidv7();\n};\n"],"mappings":";AAAA,eAAsB,MAAM,IAAY,QAAsB;AAC5D,SAAO,IAAI,QAAc,CAAC,SAAS,WAAW;AAC5C,QAAI,QAAQ,SAAS;AACnB,aAAO,OAAO,IAAI,MAAM,SAAS,CAAC;AAAA,IACpC;AAEA,UAAM,UAAU,WAAW,MAAM;AAC/B,cAAQ;AACR,cAAQ;AAAA,IACV,GAAG,EAAE;AAEL,UAAM,UAAU,MAAM;AACpB,cAAQ;AACR,aAAO,IAAI,MAAM,SAAS,CAAC;AAAA,IAC7B;AAEA,UAAM,UAAU,MAAM;AACpB,mBAAa,OAAO;AACpB,cAAQ,oBAAoB,SAAS,OAAO;AAAA,IAC9C;AAEA,YAAQ,iBAAiB,SAAS,OAAO;AAAA,EAC3C,CAAC;AACH;;;ACvBA,SAAS,kBAAkB;AAQpB,SAAS,oBAAuB,UAAkB;AACvD,MAAI;AACF,WAAO,KAAK,MAAM,WAAW,QAAQ,CAAC;AAAA,EACxC,SAAS,GAAG;AACV,QAAI,SAAS,KAAK,cAAc;AAC9B,cAAQ,IAAI,qBAAqB,KAAK,UAAU,QAAQ,CAAC;AACzD,cAAQ,MAAM,kCAAkC,CAAC;AAAA,IACnD;AAAA,EACF;AACF;;;ACiBO,IAAM,cAAN,MAAkB;AAAA,EACvB;AAAA,EACA;AAAA,EAEQ,aAAuB,CAAC;AAAA,EAEhC,YAAY,UAA8B,CAAC,GAAG;AAC5C,SAAK,YAAY,QAAQ,aAAa;AACtC,SAAK,aAAa,QAAQ,cAAc;AAAA,EAC1C;AAAA;AAAA;AAAA;AAAA,EAKA,aAAsB;AACpB,WAAO,KAAK,aAAa;AAAA,EAC3B;AAAA;AAAA;AAAA;AAAA,EAKA,UAAU;AACR,SAAK,YAAY;AAAA,EACnB;AAAA;AAAA;AAAA;AAAA,EAKA,kBAA0B;AACxB,UAAM,MAAM,KAAK,IAAI;AACrB,SAAK,aAAa,KAAK,WAAW;AAAA,MAChC,CAAC,OAAO,MAAM,KAAK,KAAK;AAAA,IAC1B;AACA,WAAO,KAAK,WAAW;AAAA,EACzB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAM,QACJ,MACA,EAAE,SAAS,GAAG,OAAO,IAA4B,CAAC,GACtC;AAEZ,QAAI,KAAK,aAAa,GAAG;AACvB,aAAO,MAAM,KAAK;AAAA,IACpB;AAEA,UAAM,KAAK,iBAAiB,QAAQ,MAAM;AAC1C,WAAO,MAAM,KAAK;AAAA,EACpB;AAAA;AAAA;AAAA;AAAA,EAKA,MAAc,iBACZ,QACA,QACe;AACf,UAAM,MAAM,KAAK,IAAI;AAGrB,SAAK,aAAa,KAAK,WAAW;AAAA,MAChC,CAAC,OAAO,MAAM,KAAK,KAAK;AAAA,IAC1B;AAGA,QAAI,KAAK,WAAW,SAAS,UAAU,KAAK,WAAW;AACrD,eAAS,IAAI,GAAG,IAAI,QAAQ,KAAK;AAC/B,aAAK,WAAW,KAAK,GAAG;AAAA,MAC1B;AACA;AAAA,IACF;AAGA,UAAM,WAAW,KAAK,WAAW,CAAC;AAClC,UAAM,WAAW,KAAK,cAAc,OAAO,YAAY;AAEvD,UAAM,MAAM,UAAU,MAAM;AAG5B,WAAO,KAAK,iBAAiB,QAAQ,MAAM;AAAA,EAC7C;AAAA;AAAA;AAAA;AAAA,EAKA,QAAc;AACZ,SAAK,aAAa,CAAC;AAAA,EACrB;AACF;;;ACzHO,SAAS,eACd,QACA,WAA2B,SACnB;AACR,QAAM,UAAU,IAAI,YAAY,QAAQ;AACxC,SAAO,QAAQ,OAAO,MAAM;AAC9B;AAKO,SAAS,eAAe,KAAyB;AACtD,QAAM,UAAU,IAAI,YAAY;AAChC,SAAO,QAAQ,OAAO,GAAG;AAC3B;;;AChBA,SAAS,MAAM,cAAc;AAEtB,IAAM,oBAAiC,MAAM;AAClD,SAAO,OAAO;AAChB;","names":[]}