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
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types.ts","../src/validation/did.ts","../src/utils/json.ts","../src/utils/cid.ts","../src/utils/sleep.ts","../src/utils/file.ts","../src/utils/prompt.ts","../src/utils/sha256.ts","../src/utils/did.ts","../src/utils/string.ts","../src/utils/llm.ts","../src/utils/validation.ts","../src/utils/builder.ts","../src/collectors/abstract/abstract-collector.ts","../src/collectors/abstract/abstract-rss-collector.ts","../src/collectors/pubmed-collector.ts","../src/collectors/simple-general-rss-collector.ts","../src/collectors/string-collector.ts","../src/errors/polyfill.ts","../src/errors/provider.ts","../src/errors/parser.ts","../src/errors/codes.ts","../src/generators/abstract/abstract-generator.ts","../src/generators/pubmed/trp-generator.ts","../src/validation/enum.ts","../src/generators/pubmed/helpers/paragraph-merge.ts","../src/generators/pubmed/helpers/replace-entities.ts","../src/generators/pubmed/helpers/crypto-random.ts","../src/providers/abstract/abstract-provider.ts","../src/providers/llm/base-llm-provider.ts","../src/providers/llm/openrouter.ts","../src/providers/llm/nearai.ts","../src/generators/mcq-generator.ts","../src/utils/debug.ts","../src/scorers/abstract/abstract-scorer.ts","../src/scorers/multiple-choice-scorer.ts","../src/scorers/exact-match-scorer.ts","../src/scorers/ref-answer-equality-llm-judge-scorer.ts","../src/scorers/similarity-scorer.ts","../src/scorers/llm-judge-scorer.ts","../src/generators/open-ended-generator.ts","../src/registries/abstract/abstract-registry.ts","../src/registries/peerbench-registry.ts","../src/parsers/abstract-parser.ts","../src/parsers/generic-array.ts","../src/parsers/medqa.ts","../src/parsers/mmlu-pro.ts","../src/parsers/pb.ts","../src/parsers/data-parser.ts","../src/constants/system-prompts.ts"],"sourcesContent":["import { z } from \"zod\";\nimport { DIDasUUIDSchema } from \"./validation/did\";\n\nexport const PromptTypes = {\n MultipleChoice: \"multiple-choice\",\n OrderSentences: \"order-sentences\",\n TextReplacement: \"text-replacement\",\n Typo: \"typo\",\n OpenEnded: \"open-ended\",\n OpenEndedWithDocs: \"open-ended-with-docs\",\n} as const;\n\nexport type PromptType = (typeof PromptTypes)[keyof typeof PromptTypes];\n\nexport const ScoringMethods = {\n /**\n * Scored by a human\n */\n human: \"human\",\n\n /**\n * Scored using an AI model\n */\n ai: \"ai\",\n\n /**\n * Scored using an algorithm\n */\n algo: \"algo\",\n} as const;\n\nexport type ScoringMethod =\n (typeof ScoringMethods)[keyof typeof ScoringMethods];\n\nexport const PromptSchema = z\n .object({\n /**\n * Decentralized identifier of the Prompt\n */\n did: DIDasUUIDSchema,\n\n /**\n * The question that is going to be asked to the model\n */\n question: z.object({\n /**\n * Question data itself\n */\n data: z.string(),\n\n /**\n * CID v1 calculation of the question string\n */\n cid: z.string(),\n\n /**\n * SHA256 hash of the question string\n */\n sha256: z.string(),\n }),\n\n /**\n * Multiple choice answers for the question where the keys are letters and the values are the answers.\n */\n options: z.record(z.string(), z.string()).optional(),\n\n /**\n * Full prompt that is going to be sent to the model\n */\n fullPrompt: z.object({\n /**\n * Full prompt itself\n */\n data: z.string(),\n\n /**\n * CID v1 calculation of the full prompt string\n */\n cid: z.string(),\n\n /**\n * SHA256 hash of the full prompt string\n */\n sha256: z.string(),\n }),\n\n /**\n * Type of the Prompt\n */\n type: z.nativeEnum(PromptTypes),\n\n /**\n * Expected option value for the question\n */\n answer: z.string().optional(),\n\n /**\n * Expected letter of the answer (e.g \"A\", \"B\" or \"C\")\n */\n answerKey: z.string().optional(),\n\n /**\n * Additional metadata related to the Prompt\n */\n metadata: z.record(z.string(), z.any()).optional(),\n\n /**\n * Expected Scorer identifiers that can be used to\n * score the Responses for this Prompt\n */\n scorers: z.array(z.string()).optional(),\n })\n .transform((prompt, ctx) => {\n if (prompt.type === PromptTypes.MultipleChoice) {\n if (Object.keys(prompt.options || {}).length === 0) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"No options provided for multiple choice question\",\n });\n return z.NEVER;\n }\n\n if (\n Object.values(prompt.options || {}).some(\n (value) => value?.trim() === \"\"\n )\n ) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Multiple choice options cannot be empty\",\n });\n return z.NEVER;\n }\n\n if (!prompt.answerKey) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Correct answer key cannot be empty\",\n });\n return z.NEVER;\n }\n\n if (!prompt.answer) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"Correct answer value cannot be empty\",\n });\n return z.NEVER;\n }\n }\n\n return prompt;\n });\n\n/**\n * PeerBench Prompt object\n */\nexport type Prompt = z.infer<typeof PromptSchema>;\n\nexport const TaskSchema = z.object({\n /**\n * Decentralized identifier of the Task\n */\n did: z.string().startsWith(\"did:task:\"),\n\n /**\n * The Prompts that the Task has\n */\n prompts: z.array(PromptSchema),\n\n /**\n * CID v1 calculation of the Task file\n */\n cid: z.string(),\n\n /**\n * SHA256 calculation of the Task file\n */\n sha256: z.string(),\n\n /**\n * Basename of the Task file\n */\n fileName: z.string(),\n\n /**\n * Full path of the Task file\n */\n path: z.string(),\n});\n\n/**\n * Task object that includes the prompts and the Task file metadata\n */\nexport type Task = z.infer<typeof TaskSchema>;\n\nexport const PromptResponseSchema = z.object({\n /**\n * Unique identifier of the Response\n */\n did: DIDasUUIDSchema,\n\n /**\n * Name of the Provider that the Response comes from\n */\n provider: z.string(),\n\n /**\n * ID of the Model that was used by the Provider\n */\n modelId: z.string(),\n\n /**\n * Known name of the model by peerBench\n */\n modelName: z.string(),\n\n /**\n * Owner of the model\n */\n modelOwner: z.string(),\n\n /**\n * The entity that responsible for hosting the model\n */\n modelHost: z.string(),\n\n /**\n * The Prompt that used to achieve this Response.\n */\n prompt: PromptSchema,\n\n /**\n * CID v1 calculation of the Response data.\n */\n cid: z.string(),\n\n /**\n * SHA256 calculation of the Response data.\n */\n sha256: z.string(),\n\n /**\n * Response data itself.\n */\n data: z.string(),\n\n /**\n * Timestamp when the Prompt sent to the Model\n */\n startedAt: z.number(),\n\n /**\n * Timestamp when the Model responded this particular Prompt.\n */\n finishedAt: z.number(),\n\n /**\n * Unique identifier of which run this Response belongs to\n */\n runId: 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 metadata: z.record(z.string(), z.any()).optional(),\n});\n\nexport type PromptResponse = z.infer<typeof PromptResponseSchema>;\n\nexport const PromptScoreSchema = PromptResponseSchema.extend({\n prompt:\n // Modify some of the fields of the Prompt in case\n // if the Score object doesn't want to include original Prompt data\n PromptSchema.sourceType()\n .extend({\n options: PromptSchema.sourceType().shape.options.optional(),\n\n question: PromptSchema.sourceType().shape.question.extend({\n data: PromptSchema.sourceType().shape.question.shape.data.optional(),\n }),\n\n fullPrompt: PromptSchema.sourceType().shape.fullPrompt.extend({\n data: PromptSchema.sourceType().shape.fullPrompt.shape.data.optional(),\n }),\n\n type: PromptSchema.sourceType().shape.type.optional(),\n answer: PromptSchema.sourceType().shape.answer.optional(),\n answerKey: PromptSchema.sourceType().shape.answerKey.optional(),\n })\n .optional(),\n data: z.string().optional(),\n\n /**\n * Unique identifier of this Scoring result. This is named\n * like this because `did` field represents the Response ID since\n * the Score object inherits from the Response object.\n */\n scoreDID: DIDasUUIDSchema,\n\n /**\n * Additional metadata about the Scoring result. This is named\n * like this because `metadata` field represents the Response metadata since\n * the Score object inherits from the Response object.\n */\n scoreMetadata: z.record(z.string(), z.any()).optional(),\n\n score: z.number().min(0).max(1),\n method: z.nativeEnum(ScoringMethods),\n\n /**\n * Explanation about how the score was calculated.\n */\n explanation: z.string().optional(),\n\n // Only presented if the scoring method is `ai`\n scorerAI: z\n .object({\n provider: z.string(),\n modelName: z.string(),\n modelHost: z.string(),\n modelOwner: z.string(),\n modelId: 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 .optional(),\n});\nexport type PromptScore = z.infer<typeof PromptScoreSchema>;\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport type PromptOptions = Record<string, string>;\n","import { z } from \"zod\";\nimport { removeDIDPrefix } from \"../utils\";\n\n/**\n * Parses the string and removes the `did:<entity type>:` prefix from it\n * then applies the given schema to the rest of the string\n */\nexport function DIDSchema<Input, Output>(\n schema: z.ZodSchema<Input, z.ZodTypeDef, Output>\n) {\n return (\n z\n .string()\n // TODO: Maybe in the future we can force \"did:<entity type>:\" prefix\n // .startsWith(\"did:....\")\n .transform((val) => removeDIDPrefix(val))\n .pipe(schema)\n );\n}\n\nexport const DIDasUUIDSchema = DIDSchema(\n z.string().uuid({ message: \"Invalid DID\" })\n);\n","import { stringify } from \"safe-stable-stringify\";\n\n/**\n * Parses JSONL formatted string into an array\n * @returns An array of parsed JSON lines\n */\nexport function parseJSONL<T>(\n str: string,\n options?: { errorOnInvalid?: boolean }\n): T[] {\n return str\n .split(\"\\n\") // Split per line\n .filter((line) => line.trim() !== \"\") // Filter empty lines\n .map((line) => {\n const obj = tryParseJson(line);\n if (options?.errorOnInvalid && !obj) {\n throw new Error(`Invalid JSON line: ${line}`);\n }\n return obj;\n }) // Parse line (parse as undefined if it is invalid)\n .filter((obj) => obj !== undefined); // Filter invalid lines\n}\n\n/**\n * Tries to parse the given string as JSON.\n * Returns `undefined` if it is not a valid JSON entity.\n */\nexport function tryParseJson<T = any>(content: string): T | undefined {\n try {\n return JSON.parse(content);\n } catch {\n // Invalid JSON\n }\n}\n\n/**\n * Stringifies the given JSON value using `safe-stable-stringify` in a stable manner.\n * This stable method generates the same string output for the same input value (including objects).\n */\nexport function stableStringify(value: any) {\n return stringify(value);\n}\n","import { CID } from \"multiformats/cid\";\nimport { sha256 } from \"multiformats/hashes/sha2\";\nimport * as json from \"multiformats/codecs/json\";\n\n/**\n * Calculates the CID of the given data\n */\nexport async function calculateCID(data: unknown) {\n const bytes = json.encode(data);\n\n const hash = await sha256.digest(bytes);\n const cid = CID.create(1, json.code, hash);\n\n return cid;\n}\n","export async function sleep(ms: number) {\n return await new Promise<void>((res) => setTimeout(res, ms));\n}\n","/**\n * Reads the file and returns the content as a string.\n * @param path - The path to the file.\n * @returns The content of the file as a string.\n */\nexport async function readFile(path: string): Promise<Uint8Array> {\n if (typeof window === \"undefined\") {\n // Node.js environment\n const { readFileSync, statSync } = await import(\"node:fs\");\n if (!statSync(path, { throwIfNoEntry: false })?.isFile()) {\n throw new Error(`File doesn't exist: ${path}`);\n }\n\n return readFileSync(path);\n } else {\n // Browser environment\n throw new Error(\n \"File system operations are not supported in browser environment. Use readFromContent instead.\"\n );\n }\n}\n","import { PromptOptions } from \"@/types\";\n\n/**\n * Prepares the full Prompt that is going to be sent to the model\n */\nexport function preparePrompt(question: string, options: PromptOptions = {}) {\n // If the options are not provided or empty, means that\n // the question is already a full prompt\n if (options && Object.keys(options).length === 0) {\n return question;\n }\n\n // Append answers to the full prompt\n let fullPrompt = `${question}\\n\\n`;\n for (const [letter, answer] of Object.entries(options)) {\n fullPrompt += `${letter}: ${answer}\\n`;\n }\n\n return fullPrompt;\n}\n","/**\n * Calculates the SHA-256 hash of the given text or byte array.\n * @param input - The text or byte array to calculate the hash of.\n * @returns The SHA-256 hash of the given input.\n */\nexport async function calculateSHA256(\n input: string | Uint8Array\n): Promise<string> {\n if (typeof window !== \"undefined\" && window.crypto) {\n // Browser environment\n let data: Uint8Array;\n if (input instanceof Uint8Array) {\n data = input;\n } else {\n const encoder = new TextEncoder();\n data = encoder.encode(input);\n }\n const buffer = await window.crypto.subtle.digest(\"SHA-256\", data);\n const hashArray = Array.from(new Uint8Array(buffer));\n return hashArray.map((b) => b.toString(16).padStart(2, \"0\")).join(\"\");\n } else {\n // Node.js environment\n const { createHash } = await import(\"crypto\");\n if (input instanceof Uint8Array) {\n return createHash(\"sha256\").update(Buffer.from(input)).digest(\"hex\");\n }\n return createHash(\"sha256\").update(input).digest(\"hex\");\n }\n}\n","/**\n * Removes the `did:<entity type>:` prefix from the given string and returns the rest.\n */\nexport function removeDIDPrefix(did: string) {\n if (!did.startsWith(\"did:\")) {\n return did;\n }\n\n const parts = did.split(\":\");\n if (parts.length < 3) {\n return did;\n }\n\n // Get rid out of the prefix\n return parts.slice(2).join(\":\");\n}\n","/**\n * Formats the given milliseconds into a human-readable time string.\n * @param ms The time in milliseconds\n */\nexport function formatMs(\n ms: number,\n options?: {\n /**\n * When true, includes all time units (days, hours, minutes, seconds, ms) in the output\n */\n full?: boolean;\n\n /**\n * Indicates which time units to include in the output. Defaults to [\"millisecond\", \"second\", \"minute\", \"hour\", \"day\"]. Only used if `full` option is true.\n */\n include?: (\"millisecond\" | \"hour\" | \"second\" | \"minute\" | \"day\")[];\n }\n) {\n const {\n full = false,\n include = [\"millisecond\", \"second\", \"minute\", \"hour\", \"day\"],\n } = options ?? {};\n const totalSeconds = ms / 1000;\n\n if (full) {\n const days = Math.floor(totalSeconds / 86400);\n const hours = Math.floor((totalSeconds % 86400) / 3600);\n const minutes = Math.floor((totalSeconds % 3600) / 60);\n const seconds = Math.floor(totalSeconds % 60);\n const milliseconds = ms % 1000;\n\n const parts: string[] = [];\n\n if (days > 0 && include.includes(\"day\")) {\n parts.push(days + (days === 1 ? \" day\" : \" days\"));\n }\n if (hours > 0 && include.includes(\"hour\")) {\n parts.push(hours + (hours === 1 ? \" hour\" : \" hours\"));\n }\n if (minutes > 0 && include.includes(\"minute\")) {\n parts.push(minutes + (minutes === 1 ? \" minute\" : \" minutes\"));\n }\n if (seconds > 0 && include.includes(\"second\")) {\n parts.push(seconds + (seconds === 1 ? \" second\" : \" seconds\"));\n }\n if (milliseconds > 0 && include.includes(\"millisecond\")) {\n parts.push(milliseconds + \"ms\");\n }\n\n return parts.join(\", \");\n }\n\n if (totalSeconds >= 86400) {\n const days = Math.floor(totalSeconds / 86400);\n return days.toFixed(2) + (days === 1 ? \" day\" : \" days\");\n }\n // Otherwise, if there are at least 3600 seconds, show hours only.\n else if (totalSeconds >= 3600) {\n const hours = Math.floor(totalSeconds / 3600);\n return hours.toFixed(0) + (hours === 1 ? \" hour\" : \" hours\");\n }\n // Otherwise, if there are at least 60 seconds, show minutes only.\n else if (totalSeconds >= 60) {\n const minutes = Math.floor(totalSeconds / 60);\n return minutes.toFixed(0) + (minutes === 1 ? \" minute\" : \" minutes\");\n }\n // Otherwise, if there is at least 1 second, show seconds.\n else if (totalSeconds >= 1) {\n return (\n totalSeconds.toFixed(0) + (totalSeconds === 1 ? \" second\" : \" seconds\")\n );\n }\n // Otherwise, show milliseconds.\n else {\n return ms.toFixed(0) + \"ms\";\n }\n}\n\n/**\n * Converts a byte array to a string using the TextDecoder\n * @param buffer - The byte array to convert\n * @returns The string representation of the byte array\n */\nexport function bufferToString(buffer: Uint8Array): string {\n const decoder = new TextDecoder();\n return decoder.decode(buffer);\n}\n\n/**\n * Converts a string to a byte array using the TextEncoder\n * @param str - The string to convert\n * @returns The byte array representation of the string\n */\nexport function stringToBuffer(str: string): Uint8Array {\n const encoder = new TextEncoder();\n return encoder.encode(str);\n}\n\n/**\n * Python like string formatter. Replaces the `{key}` with the value from the `values` object.\n */\nexport function formatString(str: string, values: Record<string, string>) {\n return str.replace(/\\{(\\w+)\\}/g, (_, key) => values[key] ?? `{${key}}`);\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).\n */\nexport function parseResponseAsJSON<T>(response: string) {\n try {\n const json = extractJSONFromResponse(response);\n if (!json) {\n throw new Error(\"No JSON found in the response\");\n }\n\n return JSON.parse(jsonrepair(json)) 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\n/**\n * Extracts the first JSON formatted part from the response\n */\nexport function extractJSONFromResponse(response: string) {\n const jsonRegex = /```(json)?\\n*(?<content>.*?)\\n*```/s;\n const jsonMatch = response.match(jsonRegex);\n\n return jsonMatch?.groups?.content;\n}\n","import { z } from \"zod\";\n\n/**\n * Extracts the first error message (if there is any)\n * from a Zod safe parse result and format it.\n * @param safeParseReturn\n * @param path Path of the parsing object. It will be used to indicate the invalid field if the info is not available in the validation error.\n */\nexport function parseValidationError<T, K>(\n safeParseReturn: z.SafeParseReturnType<T, K>,\n path?: string\n) {\n path ??= \"\";\n\n if (safeParseReturn?.error) {\n const firstError = safeParseReturn.error.errors[0];\n\n if (path) {\n path = `${path}: `;\n }\n\n // Include path if there is\n path =\n firstError.path.length > 0 ? `\"${firstError.path.join(\".\")}\": ` : path;\n return `${path}${firstError.message}`;\n }\n}\n\n/**\n * Checks the error state of the given Zod safe parse result\n * and throws an error if there is any.\n * @param safeParseReturn\n * @param path Path of the parsing object. It will be used to indicate the invalid field if the info is not available in the validation error.\n */\nexport function checkValidationError<T, K>(\n safeParseReturn: z.SafeParseReturnType<T, K>,\n path?: string\n) {\n if (safeParseReturn?.error) {\n throw new Error(parseValidationError(safeParseReturn, path));\n }\n\n return safeParseReturn.data;\n}\n","import { ForwardResponse } from \"@/providers\";\nimport {\n Prompt,\n PromptResponseSchema,\n PromptSchema,\n PromptScoreSchema,\n PromptType,\n} from \"@/types\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport { calculateSHA256 } from \"./sha256\";\nimport { calculateCID } from \"./cid\";\nimport { z } from \"zod\";\n\n/**\n * Builds a valid Prompt object from the given parameters.\n */\nexport async function buildPrompt(params: {\n did?: string;\n question: string;\n fullPrompt?: string;\n options?: Record<string, string>;\n answer?: string;\n answerKey?: string;\n type: PromptType;\n metadata?: Record<string, any>;\n scorers?: string[];\n}) {\n return PromptSchema.parse({\n did: params.did ?? uuidv7(),\n options: params.options ?? undefined,\n question: {\n data: params.question,\n cid: await calculateCID(params.question).then((c) => c.toString()),\n sha256: await calculateSHA256(params.question),\n },\n fullPrompt: {\n data: params.fullPrompt ?? params.question,\n cid: await calculateCID(params.fullPrompt ?? params.question).then((c) =>\n c.toString()\n ),\n sha256: await calculateSHA256(params.fullPrompt ?? params.question),\n },\n type: params.type,\n answer: params.answer ?? undefined,\n answerKey: params.answerKey ?? undefined,\n metadata: params.metadata ?? undefined,\n scorers: params.scorers ?? undefined,\n });\n}\n\n/**\n * Builds a valid PromptResponse object from the given parameters.\n */\nexport async function buildResponse(params: {\n prompt: Prompt;\n forwardResponse: ForwardResponse;\n provider: string;\n modelId: string;\n\n did?: string;\n modelName?: string;\n modelOwner?: string;\n modelHost?: string;\n runId?: string;\n metadata?: Record<string, any>;\n}) {\n return PromptResponseSchema.parse({\n did: params.did ?? uuidv7(),\n runId: params.runId ?? uuidv7(),\n data: params.forwardResponse.data,\n sha256: await calculateSHA256(params.forwardResponse.data),\n cid: await calculateCID(params.forwardResponse.data).then((c) =>\n c.toString()\n ),\n startedAt: params.forwardResponse.startedAt.getTime(),\n finishedAt: params.forwardResponse.completedAt.getTime(),\n prompt: params.prompt,\n metadata: params.metadata,\n\n provider: params.provider,\n modelId: params.modelId,\n modelName: params.modelName || \"unknown\",\n modelOwner: params.modelOwner || \"unknown\",\n modelHost: params.modelHost || \"auto\",\n\n inputTokensUsed: params.forwardResponse.inputTokensUsed,\n inputCost: params.forwardResponse.inputCost,\n\n outputTokensUsed: params.forwardResponse.outputTokensUsed,\n outputCost: params.forwardResponse.outputCost,\n });\n}\n\n/**\n * Builds a valid PromptScore object from the given parameters.\n */\nexport async function buildScore(\n params: Omit<z.input<typeof PromptScoreSchema>, \"scoreDID\"> & {\n // If not given then auto generates a new one.\n scoreDID?: string;\n }\n) {\n return PromptScoreSchema.parse({\n ...params,\n scoreDID: params.scoreDID ?? uuidv7(),\n });\n}\n","export abstract class AbstractCollector<TOutput> {\n /**\n * String identifier of the collector.\n */\n abstract readonly identifier: string;\n\n /**\n * Collects data from a source\n * @param sourceUrl The URL or identifier of the source\n * @param options Additional options for collection (optional)\n * @returns Promise resolving to the collected data or null if failed\n */\n abstract collect(\n source: unknown,\n options?: Record<string, any>\n ): Promise<TOutput | undefined>;\n\n /**\n * Initializes the collector (depends on the implementation)\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async initialize(...args: any[]): Promise<void> {\n // Default implementation does nothing\n // Implement in subclasses if needed\n }\n}\n","import { XMLParser } from \"fast-xml-parser\";\nimport { AbstractCollector } from \"./abstract-collector\";\nimport { z } from \"zod\";\n\nexport abstract class AbstractRSSCollector<\n TOutput,\n> extends AbstractCollector<TOutput> {\n protected parser: XMLParser;\n abstract feedSchema: z.ZodSchema<unknown>;\n\n constructor() {\n super();\n this.parser = new XMLParser({});\n }\n\n /**\n * Helper function to fetch the feed from the URL\n * @param url The URL of the feed\n * @returns Raw XML string of the feed\n */\n protected async fetchFeed(url: string): Promise<string> {\n const response = await fetch(url);\n if (!response.ok) {\n throw new Error(`HTTP error! status: ${response.status}`);\n }\n\n return response.text();\n }\n\n /**\n * Parses the raw XML string and validates it\n * against the defined `FeedStructure` schema\n * @param xml The raw XML string\n * @returns Structured data of the RSS feed\n */\n protected async parseFeedXML(\n xml: string\n ): Promise<z.infer<(typeof this)[\"feedSchema\"]>> {\n const parsedData = this.parser.parse(xml);\n return await this.feedSchema.parseAsync(parsedData);\n }\n}\n","import { AbstractRSSCollector } from \"./abstract/abstract-rss-collector\";\nimport { z } from \"zod\";\nimport * as cheerio from \"cheerio\";\n\n/**\n * TODO: Write a description for this collector\n */\nexport class PubMedCollector extends AbstractRSSCollector<PubMedCollectedData> {\n readonly identifier = \"pubmed\";\n feedSchema = z.object({\n rss: z.object({\n channel: z.object({\n title: z.string(),\n link: z.string(),\n description: z.string(),\n pubDate: z.string(),\n lastBuildDate: z.string().optional(),\n language: z.string().optional(),\n item: z\n .any()\n .transform((data) => (Array.isArray(data) ? data : [data]))\n .pipe(\n z.array(\n z.object({\n title: z.string(),\n link: z.string(),\n description: z.string(),\n guid: z.string(),\n pubDate: z.string(),\n \"content:encoded\": z.string(),\n })\n )\n ),\n }),\n }),\n });\n\n async collect(url: string) {\n const feed = await this.parseFeedXML(await this.fetchFeed(url));\n const parsed = [];\n const tags = new Set<string>();\n\n tags.add(\"pubmed\");\n\n for (const article of feed.rss.channel.item) {\n const $ = cheerio.load(article[\"content:encoded\"]);\n const elements = $(\"p\");\n const texts: string[] = [];\n const paragraphs: Record<string, string> = {};\n\n elements.each((i, el) => {\n // First paragraph only includes string\n // version of some metadata which is redundant\n if (i === 0) return;\n\n const text = $(el).text().trim();\n\n // Those paragraphs don't include any\n // useful information so skip them\n if (\n text === \"\" ||\n text === \"ABSTRACT\" ||\n text.startsWith(\"PMID:\") ||\n text.startsWith(\"DOI:\")\n ) {\n return;\n }\n texts.push(text);\n });\n\n // If we can parse a title from the first item that means\n // this abstract text is structured into paragraphs so we can use it\n if (this.parseParagraphTitle(texts[0])) {\n tags.add(feed.rss.channel.title);\n for (const text of texts) {\n const match = this.parseParagraphTitle(text);\n if (match) {\n paragraphs[match[1].trim()] = match[2].trim();\n }\n }\n\n // Save it\n parsed.push({\n pmid: article.guid,\n title: article.title,\n paragraphs,\n tags: Array.from(tags),\n });\n }\n }\n\n return parsed;\n }\n\n /**\n * Parses the title of a paragraph which\n * is in the format of \"TITLE:\"\n */\n private parseParagraphTitle(text: string) {\n const paragraphRegex = /^([A-Z|\\s]+):\\s*(.*)/;\n const match = text.match(paragraphRegex);\n return match;\n }\n}\n\nexport type PubMedCollectedData = {\n pmid: string;\n title: string;\n paragraphs: Record<string, string>;\n tags: string[];\n}[];\n","import { AbstractRSSCollector } from \"./abstract/abstract-rss-collector\";\nimport { z } from \"zod\";\nimport * as cheerio from \"cheerio\";\n\n/**\n * A general-purpose RSS collector that can handle heterogeneous RSS feeds.\n * Intelligently extracts and cleans text content while preserving raw XML data.\n */\nexport class SimpleGeneralRSSCollector extends AbstractRSSCollector<SimpleGeneralRSSCollectedData> {\n readonly identifier = \"simple-general-rss\";\n \n feedSchema = z.object({\n // Handle both RSS and RDF formats\n rss: z.object({\n channel: z.object({\n title: z.string().optional(),\n link: z.string().optional(),\n description: z.string().optional(),\n pubDate: z.string().optional(),\n lastBuildDate: z.string().optional(),\n language: z.string().optional(),\n item: z\n .any()\n .transform((data) => (Array.isArray(data) ? data : [data]))\n .pipe(\n z.array(\n z.object({\n title: z.string(),\n link: z.string().optional(),\n description: z.string().optional(),\n guid: z.union([z.string(), z.object({}).passthrough()]).optional(),\n pubDate: z.string().optional(),\n \"content:encoded\": z.string().optional(),\n // Handle various RSS namespaces and extensions\n \"dc:creator\": z.union([z.string(), z.array(z.string())]).optional(),\n \"dc:date\": z.string().optional(),\n \"dc:title\": z.string().optional(),\n \"dc:subject\": z.string().optional(),\n \"dc:publisher\": z.string().optional(),\n \"dc:identifier\": z.union([z.string(), z.array(z.string())]).optional(),\n \"dc:rights\": z.string().optional(),\n \"dc:source\": z.string().optional(),\n \"prism:publicationDate\": z.string().optional(),\n \"prism:section\": z.string().optional(),\n \"prism:volume\": z.string().optional(),\n \"prism:number\": z.string().optional(),\n \"prism:startingPage\": z.string().optional(),\n \"prism:endingPage\": z.string().optional(),\n \"arxiv:announce_type\": z.string().optional(),\n category: z.union([z.string(), z.array(z.string())]).optional(),\n })\n )\n ),\n }),\n }).optional(),\n // Handle RDF format (like medRxiv)\n rdf: z.object({\n channel: z.object({\n title: z.string().optional(),\n link: z.string().optional(),\n description: z.string().optional(),\n items: z.object({\n \"rdf:Seq\": z.object({\n \"rdf:li\": z.any().optional(),\n }).optional(),\n }).optional(),\n item: z\n .any()\n .transform((data) => (Array.isArray(data) ? data : [data]))\n .pipe(\n z.array(\n z.object({\n title: z.string(),\n link: z.string().optional(),\n description: z.string().optional(),\n \"dc:creator\": z.union([z.string(), z.array(z.string())]).optional(),\n \"dc:date\": z.string().optional(),\n \"dc:title\": z.string().optional(),\n \"dc:subject\": z.string().optional(),\n \"dc:publisher\": z.string().optional(),\n \"dc:identifier\": z.union([z.string(), z.array(z.string())]).optional(),\n \"dc:rights\": z.string().optional(),\n \"dc:source\": z.string().optional(),\n \"prism:publicationDate\": z.string().optional(),\n \"prism:section\": z.string().optional(),\n \"prism:volume\": z.string().optional(),\n \"prism:number\": z.string().optional(),\n \"prism:startingPage\": z.string().optional(),\n \"prism:endingPage\": z.string().optional(),\n category: z.union([z.string(), z.array(z.string())]).optional(),\n })\n )\n ).optional(),\n }).optional(),\n }).optional(),\n // Handle Atom feeds\n feed: z.object({\n title: z.string().optional(),\n link: z.string().optional(),\n entry: z\n .any()\n .transform((data) => (Array.isArray(data) ? data : [data]))\n .pipe(\n z.array(\n z.object({\n title: z.string(),\n link: z.string().optional(),\n summary: z.string().optional(),\n content: z.string().optional(),\n author: z.string().optional(),\n published: z.string().optional(),\n id: z.string().optional(),\n })\n )\n ),\n }).optional(),\n // Allow any other structure and try to extract items dynamically\n });\n\n async collect(url: string) {\n const rawXml = await this.fetchFeed(url);\n const feed = await this.parseFeedXML(rawXml);\n const parsed: SimpleGeneralRSSCollectedData = [];\n const tags = new Set<string>();\n\n // Try to extract items from different possible structures\n let items: any[] = [];\n let channelTitle = \"\";\n\n // Check RSS format\n if (feed.rss?.channel?.item) {\n items = feed.rss.channel.item;\n channelTitle = feed.rss.channel.title || \"\";\n }\n // Check RDF format\n else if (feed.rdf?.channel?.item) {\n items = feed.rdf.channel.item;\n channelTitle = feed.rdf.channel.title || \"\";\n }\n // Check RDF 1.0 format with items/rdf:Seq structure (like medRxiv)\n else if (feed.rdf?.channel?.items?.[\"rdf:Seq\"]?.[\"rdf:li\"]) {\n // This is RDF 1.0 format where items are just references\n console.log(\"RDF 1.0 format detected - items are references, not content\");\n items = [];\n channelTitle = feed.rdf.channel.title || \"\";\n }\n // Check Atom format\n else if (feed.feed?.entry) {\n items = feed.feed.entry;\n channelTitle = feed.feed.title || \"\";\n }\n // Try to find items dynamically in any structure\n else {\n items = this.findItemsDynamically(feed);\n channelTitle = this.findChannelTitle(feed) || \"\";\n }\n\n // If no items found with standard methods, try regex fallback\n if (items.length === 0) {\n console.log(\"No items found with standard parsing, trying regex fallback...\");\n items = this.findItemsWithRegex(rawXml);\n \n // Try to find channel title from the raw XML if we still don't have it\n if (!channelTitle) {\n channelTitle = this.findChannelTitleWithRegex(rawXml) || \"\";\n }\n }\n\n console.log(`Items found: ${items.length}`);\n\n // Add feed-level tags if available\n if (channelTitle) {\n tags.add(channelTitle.toLowerCase().replace(/\\s+/g, \"-\"));\n }\n tags.add(\"rss-feed\");\n\n for (const item of items) {\n // Extract and clean the main text content\n const mainText = this.extractMainText(item);\n \n // Skip items with very short content (likely just metadata)\n if (mainText.length < 200) {\n console.log(`Skipping item with short content (${mainText.length} chars): ${item.title?.substring(0, 50)}...`);\n continue;\n }\n \n // Extract additional metadata\n const metadata = this.extractMetadata(item);\n \n // Create tags from available fields\n const itemTags = this.extractTags(item, tags);\n\n parsed.push({\n title: item.title,\n link: item.link,\n mainText: mainText, // Already cleaned in extractMainText\n rawXml: item, // Keep the raw XML data for future use\n metadata,\n tags: itemTags,\n pubDate: item.pubDate || item.published,\n guid: this.extractGuidValue(item.guid) || item.id,\n });\n }\n\n return parsed;\n }\n\n /**\n * Extracts GUID value from either a string or object\n */\n private extractGuidValue(guid: any): string | undefined {\n if (typeof guid === 'string') {\n return guid;\n }\n if (guid && typeof guid === 'object') {\n // Try common GUID object properties\n if (guid._text) return guid._text;\n if (guid.text) return guid.text;\n if (guid.value) return guid.value;\n if (guid.content) return guid.content;\n if (guid.id) return guid.id;\n // If none of the above, try to stringify the object\n try {\n return JSON.stringify(guid);\n } catch {\n return undefined;\n }\n }\n return undefined;\n }\n\n /**\n * Dynamically searches for items in any XML structure\n */\n private findItemsDynamically(feed: any): any[] {\n const items: any[] = [];\n \n // Recursively search for arrays that might contain items\n const searchForItems = (obj: any, path: string[] = []): void => {\n if (Array.isArray(obj)) {\n // Check if this array looks like it contains items\n if (obj.length > 0 && obj[0] && typeof obj[0] === 'object') {\n const firstItem = obj[0];\n if (firstItem.title || firstItem['dc:title'] || firstItem.name || firstItem.link) {\n items.push(...obj);\n return;\n }\n }\n }\n \n if (obj && typeof obj === 'object') {\n for (const [key, value] of Object.entries(obj)) {\n // Look for common item container names\n if (key.toLowerCase().includes('item') || \n key.toLowerCase().includes('entry') || \n key.toLowerCase().includes('article') ||\n key.toLowerCase().includes('post')) {\n if (Array.isArray(value)) {\n items.push(...value);\n return;\n }\n }\n searchForItems(value, [...path, key]);\n }\n }\n };\n \n searchForItems(feed);\n return items;\n }\n\n /**\n * Fallback method using regex to find items when standard parsing fails\n */\n private findItemsWithRegex(xmlString: string): any[] {\n try {\n console.log(\"Using regex fallback to find items...\");\n console.log(`XML length: ${xmlString.length} characters`);\n \n // Look for the first few item tags to understand the structure\n const firstItemMatch = xmlString.match(/<item[^>]*>/i);\n if (firstItemMatch) {\n console.log(`Found first item tag: ${firstItemMatch[0]}`);\n }\n \n // Look for title tags to understand the structure\n const titleMatches = xmlString.match(/<title[^>]*>.*?<\\/title>/gi);\n if (titleMatches) {\n console.log(`Found ${titleMatches.length} title tags`);\n console.log(`First few titles: ${titleMatches.slice(0, 3).map(t => t.substring(0, 100))}`);\n }\n \n // Improved regex to find <item> elements with content, handling CDATA\n const itemRegex = /<item[^>]*>([\\s\\S]*?)<\\/item>/gi;\n const items: any[] = [];\n let match;\n \n while ((match = itemRegex.exec(xmlString)) !== null) {\n const itemXml = match[1];\n \n // Extract title (handle CDATA)\n const titleMatch = itemXml.match(/<title[^>]*>[\\s\\S]*?<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>[\\s\\S]*?<\\/title>/i) || \n itemXml.match(/<title[^>]*>([\\s\\S]*?)<\\/title>/i);\n const title = titleMatch ? this.cleanText(titleMatch[1]) : \"\";\n \n // Extract description (handle CDATA)\n const descMatch = itemXml.match(/<description[^>]*>[\\s\\S]*?<!\\[CDATA\\[([\\s\\S]*?)\\]\\]>[\\s\\S]*?<\\/description>/i) || \n itemXml.match(/<description[^>]*>([\\s\\S]*?)<\\/description>/i);\n const description = descMatch ? this.cleanText(descMatch[1]) : \"\";\n \n // Extract link\n const linkMatch = itemXml.match(/<link[^>]*>([\\s\\S]*?)<\\/link>/i);\n const link = linkMatch ? this.cleanText(linkMatch[1]) : \"\";\n \n // Only include items with substantial content\n if (title && description && description.length > 100) {\n items.push({\n title,\n link,\n description,\n rawXml: itemXml\n });\n }\n }\n \n console.log(`Regex fallback found ${items.length} items`);\n return items;\n } catch (error) {\n console.log(`Regex fallback failed: ${error}`);\n return [];\n }\n }\n\n /**\n * Dynamically searches for channel title in any XML structure\n */\n private findChannelTitle(feed: any): string | undefined {\n const searchForTitle = (obj: any): string | undefined => {\n if (obj && typeof obj === 'object') {\n if (obj.title) return obj.title;\n if (obj.name) return obj.name;\n\n for (const value of Object.values(obj)) {\n const result = searchForTitle(value);\n if (result) return result;\n }\n }\n return undefined;\n };\n\n return searchForTitle(feed);\n }\n\n /**\n * Find channel title using regex\n */\n private findChannelTitleWithRegex(xmlString: string): string | undefined {\n try {\n // Look for channel title\n const titleMatch = xmlString.match(/<channel[^>]*>[\\s\\S]*?<title[^>]*>([\\s\\S]*?)<\\/title>/i);\n if (titleMatch) {\n return this.cleanText(titleMatch[1]);\n }\n \n // Look for feed title (Atom)\n const feedTitleMatch = xmlString.match(/<feed[^>]*>[\\s\\S]*?<title[^>]*>([\\s\\S]*?)<\\/title>/i);\n if (feedTitleMatch) {\n return this.cleanText(feedTitleMatch[1]);\n }\n \n return undefined;\n } catch (error) {\n console.log(`Regex channel title search failed: ${error}`);\n return undefined;\n }\n }\n\n /**\n * Intelligently extracts the main text content from an RSS item.\n * Finds the element with the most text and appends other text-rich elements.\n * Returns cleaned, combined text content.\n */\n private extractMainText(item: any): string {\n // Define potential text fields in order of preference\n const textFields = [\n \"content:encoded\",\n \"description\", \n \"dc:description\",\n \"summary\",\n \"excerpt\",\n \"abstract\",\n \"content\",\n \"body\"\n ];\n \n // Find the primary text field (the one with the most content)\n let primaryText = \"\";\n let primaryField = \"\";\n let maxLength = 0;\n \n for (const field of textFields) {\n if (item[field] && typeof item[field] === \"string\") {\n const cleanLength = this.cleanText(item[field]).length;\n if (cleanLength > maxLength) {\n maxLength = cleanLength;\n primaryText = item[field];\n primaryField = field;\n }\n }\n }\n \n // If no primary text found, fall back to title\n if (!primaryText) {\n return item.title || \"\";\n }\n \n // Collect additional text from other fields that might have substantial content\n const additionalTexts: string[] = [];\n \n for (const field of textFields) {\n if (field !== primaryField && item[field] && typeof item[field] === \"string\") {\n const cleanText = this.cleanText(item[field]);\n // Only include if it has meaningful content (more than just a few words)\n if (cleanText.length > 20 && !this.isDuplicateContent(primaryText, cleanText)) {\n additionalTexts.push(cleanText);\n }\n }\n }\n \n // Also check for other potential text fields that might not be in our standard list\n for (const [key, value] of Object.entries(item)) {\n if (typeof value === \"string\" && \n !textFields.includes(key) && \n !key.startsWith(\"dc:\") && \n !key.startsWith(\"prism:\") && \n !key.startsWith(\"arxiv:\") &&\n key !== \"title\" &&\n key !== \"link\" &&\n key !== \"guid\" &&\n key !== \"pubDate\") {\n \n const cleanText = this.cleanText(value);\n if (cleanText.length > 20 && !this.isDuplicateContent(primaryText, cleanText)) {\n additionalTexts.push(cleanText);\n }\n }\n }\n \n // Combine primary text with additional texts\n let combinedText = primaryText;\n if (additionalTexts.length > 0) {\n combinedText += \"\\n\\n\" + additionalTexts.join(\"\\n\\n\");\n }\n \n // Clean the combined text\n return this.cleanText(combinedText);\n }\n\n /**\n * Checks if two text contents are substantially similar to avoid duplication\n */\n private isDuplicateContent(primaryText: string, additionalText: string): boolean {\n const primary = primaryText.toLowerCase().trim();\n const additional = additionalText.toLowerCase().trim();\n \n // If one is contained within the other, it's likely duplicate\n if (primary.includes(additional) || additional.includes(primary)) {\n return true;\n }\n \n // If they share a significant portion of words, they might be duplicates\n const primaryWords = primary.split(/\\s+/).filter(word => word.length > 3);\n const additionalWords = additional.split(/\\s+/).filter(word => word.length > 3);\n \n if (primaryWords.length === 0 || additionalWords.length === 0) {\n return false;\n }\n \n const commonWords = primaryWords.filter(word => additionalWords.includes(word));\n const similarity = commonWords.length / Math.max(primaryWords.length, additionalWords.length);\n \n // If more than 70% of words are common, consider it duplicate\n return similarity > 0.7;\n }\n\n /**\n * Cleans text of HTML tags, special characters, and formatting.\n * Preserves readable text while removing markup.\n */\n private cleanText(text: string): string {\n if (!text) return \"\";\n\n // Load HTML content with cheerio for parsing\n const $ = cheerio.load(text);\n \n // Remove script and style elements\n $(\"script, style\").remove();\n \n // Extract text content\n let cleaned = $.text();\n \n // Clean up whitespace and special characters\n cleaned = cleaned\n .replace(/\\s+/g, \" \") // Normalize whitespace\n .replace(/&lt;/g, \"<\") // Decode HTML entities\n .replace(/&gt;/g, \">\")\n .replace(/&amp;/g, \"&\")\n .replace(/&quot;/g, '\"')\n .replace(/&#39;/g, \"'\")\n .replace(/&nbsp;/g, \" \")\n .replace(/\\[CDATA\\[/g, \"\") // Remove CDATA markers\n .replace(/\\]\\]>/g, \"\")\n .replace(/\\n+/g, \" \") // Replace newlines with spaces\n .replace(/\\t+/g, \" \") // Replace tabs with spaces\n .trim();\n\n return cleaned;\n }\n\n /**\n * Extracts structured metadata from RSS item fields.\n */\n private extractMetadata(item: any): Record<string, any> {\n const metadata: Record<string, any> = {};\n \n // Extract Dublin Core metadata\n if (item[\"dc:creator\"]) metadata.creator = item[\"dc:creator\"];\n if (item[\"dc:date\"]) metadata.date = item[\"dc:date\"];\n if (item[\"dc:subject\"]) metadata.subject = item[\"dc:subject\"];\n if (item[\"dc:publisher\"]) metadata.publisher = item[\"dc:publisher\"];\n if (item[\"dc:identifier\"]) metadata.identifier = item[\"dc:identifier\"];\n if (item[\"dc:rights\"]) metadata.rights = item[\"dc:rights\"];\n if (item[\"dc:source\"]) metadata.source = item[\"dc:source\"];\n \n // Extract PRISM metadata\n if (item[\"prism:publicationDate\"]) metadata.publicationDate = item[\"prism:publicationDate\"];\n if (item[\"prism:section\"]) metadata.section = item[\"prism:section\"];\n if (item[\"prism:volume\"]) metadata.volume = item[\"prism:volume\"];\n if (item[\"prism:number\"]) metadata.number = item[\"prism:number\"];\n if (item[\"prism:startingPage\"]) metadata.startingPage = item[\"prism:startingPage\"];\n if (item[\"prism:endingPage\"]) metadata.endingPage = item[\"prism:endingPage\"];\n \n // Extract arXiv metadata\n if (item[\"arxiv:announce_type\"]) metadata.announceType = item[\"arxiv:announce_type\"];\n \n // Extract categories\n if (item.category) {\n if (Array.isArray(item.category)) {\n metadata.categories = item.category;\n } else {\n metadata.categories = [item.category];\n }\n }\n\n return metadata;\n }\n\n /**\n * Extracts tags from the item and combines with feed-level tags.\n */\n private extractTags(item: any, baseTags: Set<string>): string[] {\n const tags = new Set(baseTags);\n \n // Add tags from categories\n if (item.category) {\n if (Array.isArray(item.category)) {\n item.category.forEach((cat: string) => tags.add(cat.toLowerCase().replace(/\\s+/g, \"-\")));\n } else {\n tags.add(item.category.toLowerCase().replace(/\\s+/g, \"-\"));\n }\n }\n \n // Add tags from subject\n if (item[\"dc:subject\"]) {\n tags.add(item[\"dc:subject\"].toLowerCase().replace(/\\s+/g, \"-\"));\n }\n \n // Add tags from section\n if (item[\"prism:section\"]) {\n tags.add(item[\"prism:section\"].toLowerCase().replace(/\\s+/g, \"-\"));\n }\n \n // Add tags from source/publisher\n if (item[\"dc:source\"]) {\n tags.add(item[\"dc:source\"].toLowerCase().replace(/\\s+/g, \"-\"));\n }\n if (item[\"dc:publisher\"]) {\n tags.add(item[\"dc:publisher\"].toLowerCase().replace(/\\s+/g, \"-\"));\n }\n\n return Array.from(tags);\n }\n}\n\nexport type SimpleGeneralRSSCollectedData = {\n title: string;\n link?: string;\n mainText: string;\n rawXml: any; // Raw XML data for future use\n metadata: Record<string, any>;\n tags: string[];\n pubDate?: string;\n guid?: string;\n}[];\n","import { AbstractCollector } from \"./abstract/abstract-collector\";\n\n/**\n * Simple string collector that takes a string as input and outputs it as-is.\n * Useful for basic string processing or when you need to pass through string data.\n */\nexport class StringCollector extends AbstractCollector<string> {\n readonly identifier = \"string\";\n\n async collect(source: unknown) {\n // Check if the source is a string\n if (typeof source === \"string\") {\n return source;\n }\n\n // If source is not a string, return undefined\n return undefined;\n }\n}\n","// This is an internal polyfill that is used by custom Error classes\n// to make them work in both Node.js and browser environments.\n\nexport function captureStackTrace(\n error: Error,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n constructor: Function\n) {\n if (typeof window === \"undefined\") {\n Error.captureStackTrace(error, constructor);\n } else {\n error.stack = new Error(error.message).stack;\n }\n}\n","import { captureStackTrace } from \"./polyfill\";\n\nexport class ForwardError extends Error {\n startedAt: Date;\n code?: string;\n\n constructor(\n message: string,\n options?: ErrorOptions & { startedAt: Date; code?: string }\n ) {\n super(message, options);\n this.startedAt = options?.startedAt || new Date();\n this.code = options?.code;\n captureStackTrace(this, this.constructor);\n }\n}\n","import { captureStackTrace } from \"./polyfill\";\n\nexport class InvalidDataError extends Error {\n constructor(message?: string) {\n super(message || \"Data is in an invalid format\");\n this.name = \"InvalidDataError\";\n captureStackTrace(this, this.constructor);\n }\n}\n\nexport class ParserIsNotCompatibleError extends InvalidDataError {\n constructor() {\n super(\"Parser is not compatible with the data\");\n this.name = \"ParserIsNotCompatibleError\";\n captureStackTrace(this, this.constructor);\n }\n}\n","export const PEERBENCH_ERROR_CODES = {\n PROVIDER_FORWARD_FAILED: \"PROVIDER_FORWARD_FAILED\",\n PROVIDER_UNAUTHORIZED: \"PROVIDER_UNAUTHORIZED\",\n PROVIDER_MAX_RETRIES_REACHED: \"PROVIDER_MAX_RETRIES_REACHED\",\n} as const;\nexport type PeerBenchErrorCode =\n (typeof PEERBENCH_ERROR_CODES)[keyof typeof PEERBENCH_ERROR_CODES];\n","import { MaybePromise, Prompt, PromptType } from \"@/types\";\nimport { z } from \"zod\";\nimport { v7 as uuidv7 } from \"uuid\";\nimport { calculateCID } from \"@/utils/cid\";\nimport { calculateSHA256 } from \"@/utils/sha256\";\n\n/**\n * Abstract prompt generator class\n */\nexport abstract class AbstractGenerator {\n abstract readonly identifier: string;\n abstract inputSchema: z.ZodSchema<unknown>;\n\n /**\n * Generate prompt from the collected source data\n * @param input - Raw input data that will be validated against inputSchema\n * @param options - Optional configuration options\n * @returns Promise resolving to an array of prompts\n */\n async generate(\n input: unknown,\n options?: Parameters<this[\"generatePrompts\"]>[1]\n ): Promise<Prompt[]> {\n // Validate input using the schema\n const validatedInput = this.inputSchema.parse(input);\n\n // Call the protected method with validated input\n return this.generatePrompts(validatedInput, options);\n }\n\n /**\n * Abstract method that implementors MUST override.\n * This method receives already validated input data.\n *\n * NOTE: Callers must use `generate()` method\n */\n abstract generatePrompts(\n input: z.infer<(typeof this)[\"inputSchema\"]>,\n options?: Record<string, any>\n ): Promise<Prompt[]>;\n\n /**\n * Checks whether the generator can handle the given input\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n canHandle(input: any): MaybePromise<boolean> {\n return true;\n }\n\n /**\n * Initializes the generator (depends on the implementation)\n */\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n async initialize(...args: any[]): Promise<void> {\n // Default implementation does nothing\n // Implement in subclasses if needed\n }\n\n async buildPrompt(params: {\n /**\n * Base question\n */\n question: string;\n\n /**\n * For multiple choice prompts, includes each option as letter-answer pairs\n */\n options?: Record<string, string>;\n\n /**\n * Correct answer that is expected. For multiple choice prompts,\n * this is the letter of the correct answer.\n */\n correctAnswer: string;\n\n /**\n * The full Prompt text that will be sent.\n */\n fullPrompt: string;\n\n /**\n * Prompt type\n */\n type: PromptType;\n\n /**\n * Metadata\n */\n metadata?: Record<string, any>;\n\n /**\n * Expected Scorers that can be used to\n * score the Responses for this Prompt\n */\n scorers?: string[];\n }): Promise<Prompt> {\n const questionCID = await calculateCID(params.question).then((cid) =>\n cid.toString()\n );\n const questionSHA256 = await calculateSHA256(params.question);\n\n const fullPromptCID = await calculateCID(params.fullPrompt).then((cid) =>\n cid.toString()\n );\n const fullPromptSHA256 = await calculateSHA256(params.fullPrompt);\n\n return {\n did: uuidv7(),\n question: {\n data: params.question,\n cid: questionCID,\n sha256: questionSHA256,\n },\n\n // If the Prompt is a Multiple Choice, the answer data should be\n // the value of the correct answer key\n answer:\n params.options === undefined || Object.keys(params.options).length === 0\n ? params.correctAnswer\n : params.options[params.correctAnswer], // If the options is provided then the correctAnswer points to the letter of the correct answer\n\n // Answer key is only valid when the options are provided\n // which means the Prompt is a multiple choice question\n answerKey:\n params.options === undefined || Object.keys(params.options).length === 0\n ? \"\"\n : params.correctAnswer,\n\n options: params.options ?? {},\n\n fullPrompt: {\n data: params.fullPrompt,\n cid: fullPromptCID,\n sha256: fullPromptSHA256,\n },\n\n type: params.type,\n\n metadata: {\n generatorIdentifier: this.identifier,\n ...(params.metadata || {}),\n },\n\n scorers: params.scorers ?? [],\n };\n }\n}\n","import { TypeOf, z } from \"zod\";\nimport { AbstractGenerator } from \"../abstract/abstract-generator\";\nimport { EnumSchema } from \"@/validation/enum\";\nimport {\n paragraphMerge,\n ParagraphMergeStrategy,\n} from \"./helpers/paragraph-merge\";\nimport { replaceEntities } from \"./helpers/replace-entities\";\nimport { parseResponseAsJSON } from \"@/utils/llm\";\nimport { cryptoRandom } from \"./helpers/crypto-random\";\nimport { OpenRouterProvider } from \"@/providers\";\nimport { PromptTypes } from \"@/types\";\nimport { BaseLLMProvider } from \"@/providers/llm/base-llm-provider\";\n\nexport class TRPGenerator extends AbstractGenerator {\n identifier = \"trp\";\n inputSchema = z.array(\n z.object({\n pmid: z.string(),\n title: z.string(),\n paragraphs: z.record(z.string(), z.string()),\n tags: z.array(z.string()),\n })\n );\n\n optionsSchema = z.object(\n {\n openRouterApiKey: z.string(),\n paragraphMergeStrategy: EnumSchema(ParagraphMergeStrategy).default(\n ParagraphMergeStrategy.TitlesWithinSentences\n ),\n model: z.string(),\n placeholder: z.string().default(\"{}\"),\n nerPrompt: z\n .string()\n .optional()\n .default(\n `You are a Named Entity Recognition model which is specialized on medical relevant texts. Your task is extracting all medical related entities. Your output strictly forced to be a JSON array of strings where each item represents a single entity that you've extracted. Markdown formatting is forbidden. JSON output must be minified.`\n ),\n },\n { message: \"No options provided\" }\n );\n\n async generatePrompts(\n input: TypeOf<this[\"inputSchema\"]>,\n options?: z.input<(typeof this)[\"optionsSchema\"]>\n ) {\n const parsedOptions = this.optionsSchema.parse(options);\n const provider = new OpenRouterProvider({\n apiKey: parsedOptions.openRouterApiKey,\n });\n\n // Generate Prompts for each article\n const generatedPrompts = await Promise.all(\n input.map((article) =>\n this.generatePromptFromArticle(article, provider, parsedOptions)\n )\n );\n\n return generatedPrompts.filter((prompt) => prompt !== null);\n }\n\n private async generatePromptFromArticle(\n article: TypeOf<this[\"inputSchema\"]>[number],\n provider: OpenRouterProvider,\n options: z.infer<(typeof this)[\"optionsSchema\"]>\n ) {\n const tags: string[] = [\n `generator-${this.identifier}`,\n \"perform-ner\",\n `merge-paragraphs-${options.paragraphMergeStrategy}`,\n `ner-for-medical-related-entities`,\n ];\n\n const text = `${article.title}\\n\\n${paragraphMerge(\n article.paragraphs,\n options.paragraphMergeStrategy\n )}`;\n\n const entities = await this.doNER({\n text,\n provider,\n model: options.model,\n systemPrompt: options.nerPrompt,\n });\n\n if (!entities) {\n return null;\n }\n\n const modifiedText = replaceEntities(text, entities, options.placeholder);\n\n const fullPrompt = `TEXT:\\n${modifiedText!}\\n\\nENTITIES:\\n${entities!\n .sort(() => cryptoRandom() - 0.5)\n .map((e) => `\"${e}\"`)\n .join(\", \")}`;\n\n return await this.buildPrompt({\n question: modifiedText,\n fullPrompt,\n correctAnswer: text, // Original formatted text is the correct answer\n type: PromptTypes.TextReplacement,\n metadata: {\n articleTags: article.tags,\n articleId: article.pmid,\n paragraphMergeStrategy: options.paragraphMergeStrategy,\n entityTypes: [\"medical-related-entities\"],\n entities,\n brainModel: options.model,\n generatorTags: tags,\n\n tags: [...tags, ...article.tags],\n },\n });\n }\n\n private async doNER(params: {\n text: string;\n provider: BaseLLMProvider;\n model: string;\n systemPrompt: string;\n }) {\n const { text, provider, model, systemPrompt } = params;\n const { data } = await provider.forward(text, {\n model,\n system: systemPrompt,\n });\n\n return parseResponseAsJSON<string[]>(data);\n }\n}\n","import { z } from \"zod\";\n\n/**\n * Parses the given string as an enum value based on either\n * the keys or values of the given enum.\n * @param lookFor - Whether to look for the key or value\n */\nexport function EnumSchema<T>(\n _enum: Record<string, T>,\n lookFor: \"key\" | \"value\" = \"value\"\n) {\n return z.string().transform((value, ctx) => {\n let enumValue: T | undefined;\n\n if (lookFor === \"key\") {\n enumValue = _enum[value as keyof typeof _enum];\n } else {\n const values = Object.values(_enum);\n enumValue = values.find((v) => v === value);\n }\n\n if (!enumValue) {\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: `Invalid enum value: ${value}`,\n });\n return z.NEVER;\n }\n\n return enumValue;\n });\n}\n","/**\n * Merges the paragraphs of a Pubmed article into a single string.\n */\nexport function paragraphMerge(\n paragraphs: Record<string, string>,\n strategy: ParagraphMergeStrategyType\n) {\n switch (strategy) {\n case ParagraphMergeStrategy.WithoutTitles:\n return Object.entries(paragraphs)\n .map(([, value]) => value)\n .join(\"\\n\");\n case ParagraphMergeStrategy.TitlesAsSentences:\n return Object.entries(paragraphs)\n .map(([key, value]) => `${key}. ${value}`)\n .join(\"\\n\");\n case ParagraphMergeStrategy.TitlesWithinSentences:\n return Object.entries(paragraphs)\n .map(([key, value]) => `${key}: ${value}`)\n .join(\"\\n\");\n default:\n throw new Error(`Invalid paragraph merge strategy: ${strategy}`);\n }\n}\n\nexport const ParagraphMergeStrategy = {\n WithoutTitles: \"without-titles\",\n TitlesAsSentences: \"with-titles-as-sentences\",\n TitlesWithinSentences: \"titles-within-sentences\",\n} as const;\nexport type ParagraphMergeStrategyType =\n (typeof ParagraphMergeStrategy)[keyof typeof ParagraphMergeStrategy];\n","export function replaceEntities(\n text: string,\n entities: string[],\n placeholder = \"{}\"\n) {\n if (!entities || entities.length === 0) return text;\n\n // Escape regex specials\n const esc = (s: string) => s.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n\n // Longer first so \"foo bar\" wins over \"foo\"\n const pattern = entities\n .map(esc)\n .sort((a, b) => b.length - a.length)\n .join(\"|\");\n\n // Whole-word only (ASCII word chars); add \"i\" for case-insensitive\n const re = new RegExp(`\\\\b(?:${pattern})\\\\b`, \"g\");\n\n return text.replace(re, placeholder);\n}\n","export function cryptoRandom() {\n return crypto.getRandomValues(new Uint32Array(1))[0] / 2 ** 32;\n}\n","/**\n * Abstract class for Providers.\n *\n * A Provider is the entity that is responsible for forwarding the given inputs\n * to the underlying infrastructure (e.g LLM, API, image generation model) and\n * collecting its response as a byte array.\n */\nexport abstract class AbstractProvider<TInput, TOutput> {\n /**\n * Unique identifier of the Provider.\n */\n abstract readonly identifier: string;\n\n /**\n * Forwards the given input to the Provider and returns the response.\n *\n * @example\n * ```ts\n * const provider = new ImageGenerationProvider();\n *\n * // Input and the options are provider specific.\n * // In this example we are using a Provider that generates images from text inputs.\n * const response = await provider.forward(\"A beautiful sunset over a calm ocean\", {\n * width: 1024,\n * height: 1024,\n * });\n *\n * // Write the generated image to a file\n * await fs.writeFile(\"response.png\", response.data);\n * ```\n */\n abstract forward(\n input: TInput,\n options?: any\n ): Promise<ProviderResponse<TOutput>>;\n}\n\n/**\n * Type of the response returned by the Provider.\n */\nexport type ProviderResponse<TData = Uint8Array> = {\n /**\n * The date and time when the response was started.\n */\n startedAt: Date;\n\n /**\n * The date and time when the response was completed.\n */\n completedAt: Date;\n\n /**\n * The response data.\n */\n data: TData;\n};\n","import { AbstractProvider } from \"@/providers/abstract/abstract-provider\";\nimport { MaybePromise } from \"@/types\";\nimport { ForwardError } from \"@/errors/provider\";\nimport { sleep } from \"@/utils/sleep\";\nimport { ChatCompletionMessageParam } from \"openai/resources/chat/completions\";\nimport OpenAI, { APIError } from \"openai\";\nimport { PEERBENCH_ERROR_CODES } from \"@/errors/codes\";\n\n/**\n * Base class for LLM based Providers. It uses OpenAI's API client to forward the\n * inputs to the underlying LLM and returns the response as a string. Also implements\n * rate limiting and timeout features for parallel execution.\n */\nexport abstract class BaseLLMProvider extends AbstractProvider<string, string> {\n protected timestamps: number[] = [];\n timeout: number;\n rateLimit: number;\n rateLimitTimeWindow: number;\n client: OpenAI;\n maxRetries: number;\n\n /**\n * Initialize a new LLM provider\n * @param options Options for the provider\n */\n constructor(options: BaseLLMProviderOptions) {\n super();\n\n this.rateLimit = options.rateLimit ?? 20;\n this.rateLimitTimeWindow = options.rateLimitTimeWindow ?? 3000;\n this.timeout = options.timeout ?? 5 * 60_000;\n this.maxRetries = options.maxRetries ?? 5;\n\n // Initialize the client\n this.client = new OpenAI({\n baseURL: options.baseURL,\n apiKey: options.apiKey,\n maxRetries: options.maxRetries,\n timeout: options.timeout,\n dangerouslyAllowBrowser: true,\n });\n }\n\n async enforceRateLimit(): Promise<void> {\n const now = Date.now();\n\n this.timestamps = this.timestamps.filter(\n (ts) => now - ts < this.rateLimitTimeWindow\n );\n\n if (this.timestamps.length < this.rateLimit) {\n this.timestamps.push(now);\n return;\n }\n\n const earliest = this.timestamps[0];\n const waitTime = this.rateLimitTimeWindow - (now - earliest);\n\n await sleep(waitTime);\n\n return this.enforceRateLimit();\n }\n\n /**\n * Fetch all supported models from the provider\n * @returns Array of model information\n */\n async getSupportedModels(): Promise<ModelInfo[]> {\n await this.enforceRateLimit();\n\n try {\n const response = await this.client.models.list();\n const models = response.data;\n const parsedModels = await Promise.all(\n models.map(async (model) => {\n const parsed = await this.parseModelInfo(model);\n\n if (!parsed) {\n return;\n }\n\n return {\n ...parsed,\n metadata: {\n // These fields might not be available in all models\n contextWindow: (model as any).context_window,\n maxTokens: (model as any).max_tokens,\n pricing: (model as any).pricing\n ? {\n input: (model as any).pricing.input,\n output: (model as any).pricing.output,\n }\n : undefined,\n },\n };\n })\n );\n\n // Filter out the models that are not mapped correctly and returned as undefined from parsing method\n return parsedModels.filter((model) => model !== undefined);\n } catch (error) {\n throw new Error(\n `Failed to fetch supported models: ${error instanceof Error ? error.message : \"Unknown error\"}`\n );\n }\n }\n\n async forward(\n input: string | ChatCompletionMessageParam[],\n options: BaseLLMProviderForwardOptions\n ): Promise<ForwardResponse> {\n await this.enforceRateLimit();\n\n let retryCount = this.maxRetries;\n while (retryCount > 0) {\n const startedAt = new Date();\n try {\n const messages: ChatCompletionMessageParam[] = [];\n\n // If caller decided to pass the messages as an array, use them directly\n if (Array.isArray(input)) {\n messages.push(...input);\n } else {\n // Add system message if provided\n if (options?.system) {\n messages.push({\n role: \"system\",\n content: options.system,\n });\n }\n\n // Add user message\n messages.push({\n role: \"user\",\n content: input,\n });\n }\n\n const response = await this.client.chat.completions.create(\n {\n model: options.model,\n messages,\n temperature: options.temperature,\n },\n { signal: options?.abortSignal, timeout: this.timeout }\n );\n\n if (\"error\" in response) {\n const err = response.error as any;\n throw new Error(\n `${err.message} - Code ${err.code} - ${JSON.stringify(err)}`\n );\n }\n\n return {\n data: response?.choices?.[0]?.message?.content || \"\",\n inputTokensUsed: response?.usage?.prompt_tokens,\n outputTokensUsed: response?.usage?.completion_tokens,\n startedAt,\n completedAt: new Date(),\n };\n } catch (err) {\n if (err instanceof APIError && err.status === 401) {\n throw new ForwardError(\n `Invalid credentials provided for the Provider`,\n {\n cause: err,\n startedAt,\n code: PEERBENCH_ERROR_CODES.PROVIDER_UNAUTHORIZED,\n }\n );\n }\n\n retryCount--;\n\n // More likely an empty HTTP response returned by the Provider\n // and it couldn't be parsed as JSON by the OpenAI SDK. We need to retry the request\n // More info can be found in the following links:\n // https://www.reddit.com/r/SillyTavernAI/comments/1ik95vr/deepseek_r1_on_openrouter_returning_blank_messages/\n // https://github.com/cline/cline/issues/60\n if (err instanceof SyntaxError) {\n console.debug(err);\n continue;\n }\n\n // If it was another error, just continue until we run out of retries\n if (retryCount !== 0) {\n continue;\n }\n\n throw new ForwardError(\n `Failed to forward prompt to the model: ${err instanceof Error ? err.message : err}`,\n {\n cause: err,\n startedAt,\n code: PEERBENCH_ERROR_CODES.PROVIDER_FORWARD_FAILED,\n }\n );\n }\n }\n\n throw new ForwardError(\n `Failed to forward prompt to the model: Max retries reached`,\n {\n startedAt: new Date(),\n code: PEERBENCH_ERROR_CODES.PROVIDER_MAX_RETRIES_REACHED,\n }\n );\n }\n\n /**\n * Parses the given model ID that includes the model name, owner, and sub-provider (if any).\n * @param id Model ID that has the format `<sub provider name if any>/<model owner>/<model name>`\n * @deprecated\n */\n abstract parseModelInfo(\n modelOrId: OpenAI.Models.Model | string\n ): MaybePromise<ModelInfo | undefined>;\n}\n\nexport type ForwardResponse = {\n data: string;\n startedAt: Date;\n completedAt: Date;\n\n inputTokensUsed?: number;\n inputCost?: string;\n\n outputTokensUsed?: number;\n outputCost?: string;\n};\n\nexport type BaseLLMProviderOptions = {\n /**\n * API key for the provider\n */\n apiKey: string;\n\n /**\n * Base URL for the provider\n */\n baseURL?: string;\n\n /**\n * Maximum number of retries for the provider\n */\n maxRetries?: number;\n\n /**\n * Timeout for the provider\n */\n timeout?: number;\n\n /**\n * Rate limit for the provider\n */\n rateLimit?: number;\n\n /**\n * Rate limit time window for the provider\n */\n rateLimitTimeWindow?: number;\n};\n\nexport type BaseLLMProviderForwardOptions = {\n model: string;\n system?: string;\n abortSignal?: AbortSignal;\n temperature?: number;\n};\n\n/**\n * Parsed information about the model.\n */\nexport type ModelInfo = {\n /**\n * Original ID of the model that can be used in the requests\n */\n id: string;\n\n /**\n * Unified name of the model\n */\n name: LargeLanguageModelType;\n\n /**\n * Unified owner of the model\n */\n owner: LargeLanguageModelOwnerType;\n\n /**\n * Provider name of the model\n * TODO: This field might be redundant\n */\n provider: string;\n\n /**\n * The entity that responsible for hosting the model\n */\n host?: string;\n\n /**\n * The tier of the model (e.g free, max)\n */\n tier?: string;\n\n /**\n * Additional metadata (warning: not might be available always)\n */\n metadata?: Record<string, unknown>;\n};\n\n/**\n * Known LLM owners\n */\nexport const LargeLanguageModelOwner = {\n Meta: \"meta\",\n OpenAI: \"openai\",\n Deepseek: \"deepseek\",\n Qwen: \"qwen\",\n Google: \"google\",\n XAI: \"x-ai\",\n Anthropic: \"anthropic\",\n Mistral: \"mistral\",\n} as const;\n\nexport type LargeLanguageModelOwnerType =\n (typeof LargeLanguageModelOwner)[keyof typeof LargeLanguageModelOwner];\n\n/**\n * Known models of Meta\n */\nexport const MetaModels = {\n Llama_4_Maverick: \"llama-4-maverick\",\n Llama_4_Scout: \"llama-4-scout\",\n Llama_3_3_70b_Instruct: \"llama-3.3-70b-instruct\",\n Llama_3_1_8b_Instruct: \"llama-3.1-8b-instruct\",\n Llama_3_1_70b_Instruct: \"llama-3.1-70b-instruct\",\n} as const;\n\n/**\n * Known models of Qwen\n */\nexport const QwenModels = {\n QwQ_32b: \"qwq-32b\",\n} as const;\n\n/**\n * Known models of DeepSeek\n */\nexport const DeepSeekModels = {\n V3: \"deepseek-v3\",\n V3_0324: \"deepseek-v3-0324\",\n} as const;\n\n/**\n * Known models of XAI\n */\nexport const XAIModels = {\n Grok3_Beta: \"grok-3-beta\",\n Grok4: \"grok-4\",\n} as const;\n\n/**\n * Known models of Google\n */\nexport const GoogleModels = {\n Gemini_2_0_Flash: \"gemini-2.0-flash\",\n Gemini_2_5_Flash_Lite: \"gemini-2.5-flash-lite\",\n Gemini_2_5_Pro: \"gemini-2.5-pro\",\n} as const;\n\n/**\n * Known models of Anthropic\n */\nexport const AnthropicModels = {\n Claude_3_7_Sonnet: \"claude-3.7-sonnet\",\n Claude_Sonnet_4_5: \"claude-sonnet-4.5\",\n} as const;\n\n/**\n * Known models of OpenAI\n */\nexport const OpenAIModels = {\n ChatGPT_4o: \"chatgpt-4o-latest\",\n GPT_4o: \"gpt-4o\",\n GPT_4o_Mini: \"gpt-4o-mini\",\n GPT_5: \"gpt-5\",\n} as const;\n\nexport const MistralModels = {\n Ministral_8B: \"ministral-8b\",\n} as const;\n\n/**\n * Known models of all providers\n */\nexport const LargeLanguageModel = {\n [LargeLanguageModelOwner.Meta]: MetaModels,\n [LargeLanguageModelOwner.Deepseek]: DeepSeekModels,\n [LargeLanguageModelOwner.Qwen]: QwenModels,\n [LargeLanguageModelOwner.Google]: GoogleModels,\n [LargeLanguageModelOwner.XAI]: XAIModels,\n [LargeLanguageModelOwner.OpenAI]: OpenAIModels,\n [LargeLanguageModelOwner.Anthropic]: AnthropicModels,\n [LargeLanguageModelOwner.Mistral]: MistralModels,\n} as const;\n\nexport type LargeLanguageModelType =\n | (typeof MetaModels)[keyof typeof MetaModels]\n | (typeof DeepSeekModels)[keyof typeof DeepSeekModels]\n | (typeof QwenModels)[keyof typeof QwenModels]\n | (typeof GoogleModels)[keyof typeof GoogleModels]\n | (typeof XAIModels)[keyof typeof XAIModels]\n | (typeof AnthropicModels)[keyof typeof AnthropicModels]\n | (typeof OpenAIModels)[keyof typeof OpenAIModels]\n | (typeof MistralModels)[keyof typeof MistralModels];\n","import {\n BaseLLMProvider,\n BaseLLMProviderForwardOptions,\n BaseLLMProviderOptions,\n ForwardResponse,\n LargeLanguageModel,\n LargeLanguageModelOwner,\n LargeLanguageModelOwnerType,\n LargeLanguageModelType,\n ModelInfo,\n} from \"@/providers/llm/base-llm-provider\";\nimport { ChatCompletionMessageParam } from \"openai/resources/chat\";\nimport axios from \"axios\";\nimport OpenAI from \"openai\";\nimport Decimal from \"decimal.js\";\n\nconst baseURL = \"https://openrouter.ai/api/v1\";\nconst MODELS_CACHE_TTL = 1000 * 60 * 60 * 24; // 24 hours\n\nexport class OpenRouterProvider extends BaseLLMProvider {\n private models: ModelsResponse | undefined = undefined;\n private modelsCachePromise: Promise<ModelsResponse | undefined> =\n Promise.resolve(undefined);\n private modelsUpdatedAt = 0;\n\n readonly identifier = \"openrouter.ai\";\n\n constructor(options: OpenRouterProviderOptions) {\n super({\n ...options,\n baseURL,\n });\n }\n\n /**\n * Updates the cache that holds information about OpenRouter models\n * including pricing information. It will be valid for 24 hours as\n * long as the instance of this Provider object is alive.\n */\n private async updateModelsCache() {\n // Chain each update method call to the promise.\n // This approach prevents race conditions between multiple calls.\n // Since each call is chained to the end of the previous one,\n // each promise makes a request only if the models cache is not updated\n // in the last call. Otherwise it simply resolves to the cached value.\n this.modelsCachePromise = this.modelsCachePromise\n .then(async () => {\n if (\n // The data presented in the cache\n this.models !== undefined &&\n // The cache is still valid\n Date.now() - this.modelsUpdatedAt < MODELS_CACHE_TTL\n ) {\n return this.models;\n }\n\n // If the cache is not valid, update it\n return axios\n .get<ModelsResponse>(`${baseURL}/models`)\n .then((res) => res.data)\n .then((data) => {\n // Only get the models that supports text input and output\n data = {\n data: data.data.filter(\n (m) =>\n m.architecture.input_modalities.includes(\"text\") &&\n m.architecture.output_modalities.includes(\"text\")\n ),\n };\n\n this.models = data;\n this.modelsUpdatedAt = Date.now();\n\n return data;\n });\n })\n .catch(() => undefined);\n\n // Wait for the promise chain to resolve\n await this.modelsCachePromise;\n }\n\n /**\n * Returns the detailed information about\n * the models that are available on OpenRouter.\n */\n async getModelDetails(): Promise<ModelsResponse[\"data\"] | undefined>;\n async getModelDetails(\n modelId: string\n ): Promise<ModelsResponse[\"data\"][number] | undefined>;\n async getModelDetails(modelId?: string) {\n await this.updateModelsCache();\n\n if (modelId === undefined) {\n return this.models?.data;\n }\n\n return this.models?.data.find((model) => model.id === modelId);\n }\n\n /**\n * Returns the credits that the account has on openrouter.ai\n */\n async getCredits() {\n const response = await axios.get(`${baseURL}/credits`, {\n headers: {\n Authorization: `Bearer ${this.client.apiKey}`,\n },\n });\n return response.data;\n }\n\n /**\n * Makes a request to a protected endpoint to validate the API key.\n */\n async validateApiKey() {\n await axios.get(`${baseURL}/models/user`, {\n headers: {\n Authorization: `Bearer ${this.client.apiKey}`,\n },\n });\n\n // If the request is successful, the API key is valid\n return true;\n }\n\n async forward(\n input: string | ChatCompletionMessageParam[],\n options: BaseLLMProviderForwardOptions\n ): Promise<ForwardResponse> {\n // Extend `forward()` method to include cost information\n\n const [response] = await Promise.all([\n super.forward(input, options),\n this.updateModelsCache(), // Concurrently update the cache for cost info\n ]);\n\n // Get the model info from the cache\n const modelInfo = this.models?.data.find(\n (model) => model.id === options.model\n );\n let inputCost: string | undefined = undefined;\n let outputCost: string | undefined = undefined;\n\n if (modelInfo !== undefined) {\n // Use Decimal.js for more accurate calculation\n if (response.inputTokensUsed !== undefined) {\n inputCost = new Decimal(modelInfo.pricing.prompt)\n .mul(response.inputTokensUsed)\n .toFixed(10);\n }\n if (response.outputTokensUsed !== undefined) {\n outputCost = new Decimal(modelInfo.pricing.completion)\n .mul(response.outputTokensUsed)\n .toFixed(10);\n }\n }\n\n return {\n ...response,\n inputCost,\n outputCost,\n };\n }\n\n parseModelInfo(\n modelOrId: OpenAI.Models.Model | string\n ): ModelInfo | undefined {\n const id = typeof modelOrId === \"string\" ? modelOrId : modelOrId.id;\n const [, modelName] = id.split(\"/\");\n\n if (!modelName) {\n return;\n }\n\n let name: LargeLanguageModelType;\n let owner: LargeLanguageModelOwnerType;\n\n switch (modelName) {\n case \"ministral-8b\":\n owner = LargeLanguageModelOwner.Mistral;\n name = LargeLanguageModel[owner].Ministral_8B;\n break;\n case \"chatgpt-4o-latest\":\n owner = LargeLanguageModelOwner.OpenAI;\n name = LargeLanguageModel[owner].ChatGPT_4o;\n break;\n case \"gpt-4o-mini\":\n owner = LargeLanguageModelOwner.OpenAI;\n name = LargeLanguageModel[owner].GPT_4o_Mini;\n break;\n case \"deepseek-chat-v3-0324\":\n owner = LargeLanguageModelOwner.Deepseek;\n name = LargeLanguageModel[owner].V3_0324;\n break;\n case \"gpt-4o\":\n owner = LargeLanguageModelOwner.OpenAI;\n name = LargeLanguageModel[owner].GPT_4o;\n break;\n case \"gpt-5\":\n owner = LargeLanguageModelOwner.OpenAI;\n name = LargeLanguageModel[owner].GPT_5;\n break;\n case \"claude-3.7-sonnet\":\n owner = LargeLanguageModelOwner.Anthropic;\n name = LargeLanguageModel[owner].Claude_3_7_Sonnet;\n break;\n case \"claude-sonnet-4.5\":\n owner = LargeLanguageModelOwner.Anthropic;\n name = LargeLanguageModel[owner].Claude_Sonnet_4_5;\n break;\n case \"llama-3.3-70b-instruct\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_3_3_70b_Instruct;\n break;\n case \"llama-3.1-70b-instruct\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_3_1_70b_Instruct;\n break;\n case \"llama-3.1-8b-instruct\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_3_1_8b_Instruct;\n break;\n case \"deepseek-chat\":\n owner = LargeLanguageModelOwner.Deepseek;\n name = LargeLanguageModel[owner].V3;\n break;\n case \"qwq-32b\":\n owner = LargeLanguageModelOwner.Qwen;\n name = LargeLanguageModel[owner].QwQ_32b;\n break;\n case \"gemini-2.0-flash-001\":\n owner = LargeLanguageModelOwner.Google;\n name = LargeLanguageModel[owner].Gemini_2_0_Flash;\n break;\n case \"gemini-2.5-flash-lite\":\n owner = LargeLanguageModelOwner.Google;\n name = LargeLanguageModel[owner].Gemini_2_5_Flash_Lite;\n break;\n case \"gemini-2.5-pro\":\n owner = LargeLanguageModelOwner.Google;\n name = LargeLanguageModel[owner].Gemini_2_5_Pro;\n break;\n case \"grok-3-beta\":\n case \"grok-3\":\n owner = LargeLanguageModelOwner.XAI;\n name = LargeLanguageModel[owner].Grok3_Beta;\n break;\n case \"grok-4\":\n owner = LargeLanguageModelOwner.XAI;\n name = LargeLanguageModel[owner].Grok4;\n break;\n case \"llama-4-maverick\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_4_Maverick;\n break;\n case \"llama-4-scout\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_4_Scout;\n break;\n default:\n return;\n }\n\n return {\n id,\n name,\n owner,\n provider: this.identifier.toLowerCase(),\n };\n }\n}\n\nexport type OpenRouterProviderOptions = Omit<BaseLLMProviderOptions, \"baseURL\">;\n\ntype PutModality = \"text\" | \"image\" | \"file\" | \"audio\";\ntype Modality = \"text->text\" | \"text+image->text\" | \"text+image->text+image\";\ntype ModelsResponse = {\n data: {\n readonly id: string;\n readonly canonical_slug: string;\n readonly hugging_face_id: null | string;\n readonly name: string;\n readonly created: number;\n readonly description: string;\n readonly context_length: number;\n readonly architecture: {\n readonly modality: Modality;\n readonly input_modalities: PutModality[];\n readonly output_modalities: PutModality[];\n readonly instruct_type: null | string;\n };\n readonly pricing: {\n readonly prompt: string;\n readonly completion: string;\n readonly request?: string;\n readonly image?: string;\n readonly web_search?: string;\n readonly internal_reasoning?: string;\n readonly input_cache_read?: string;\n readonly input_cache_write?: string;\n readonly audio?: string;\n };\n }[];\n};\n","import {\n BaseLLMProvider,\n BaseLLMProviderOptions,\n LargeLanguageModel,\n LargeLanguageModelOwner,\n LargeLanguageModelOwnerType,\n LargeLanguageModelType,\n ModelInfo,\n} from \"@/providers/llm/base-llm-provider\";\nimport OpenAI from \"openai\";\n\nexport class NearAIProvider extends BaseLLMProvider {\n readonly identifier = \"near.ai\";\n\n constructor(options: NearAIProviderOptions) {\n super({\n ...options,\n baseURL: \"https://api.near.ai/v1\",\n });\n }\n\n parseModelInfo(\n modelOrId: OpenAI.Models.Model | string\n ): ModelInfo | undefined {\n const id = typeof modelOrId === \"string\" ? modelOrId : modelOrId.id;\n let modelName: string | undefined;\n let host: string | undefined;\n\n if (id.startsWith(\"fireworks::\")) {\n const splitResult = id.split(\"/\");\n modelName = splitResult.pop();\n host = \"fireworks\";\n } else if (id.startsWith(\"hyperbolic::\")) {\n const splitResult = id.split(\"/\");\n modelName = splitResult.pop();\n host = \"hyperbolic\";\n }\n\n if (!modelName) {\n return;\n }\n\n let name: LargeLanguageModelType;\n let owner: LargeLanguageModelOwnerType;\n\n switch (modelName) {\n case \"llama4-maverick-instruct-basic\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_4_Maverick;\n break;\n case \"llama4-scout-instruct-basic\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_4_Scout;\n break;\n case \"llama-v3p3-70b-instruct\":\n case \"Llama-3.3-70B-Instruct\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_3_3_70b_Instruct;\n break;\n case \"llama-v3p1-8b-instruct\":\n owner = LargeLanguageModelOwner.Meta;\n name = LargeLanguageModel[owner].Llama_3_1_8b_Instruct;\n break;\n case \"deepseek-v3\":\n case \"DeepSeek-V3\":\n owner = LargeLanguageModelOwner.Deepseek;\n name = LargeLanguageModel[owner].V3;\n break;\n case \"qwq-32b\":\n owner = LargeLanguageModelOwner.Qwen;\n name = LargeLanguageModel[owner].QwQ_32b;\n break;\n default:\n return;\n }\n\n return {\n id,\n name,\n owner,\n host,\n provider: this.identifier.toLowerCase(),\n };\n }\n}\n\nexport type NearAIProviderOptions = Omit<BaseLLMProviderOptions, \"baseURL\">;\n","import { z } from \"zod\";\nimport { AbstractGenerator } from \"@/generators/abstract/abstract-generator\";\nimport { parseResponseAsJSON } from \"@/utils/llm\";\nimport { BaseLLMProvider, OpenRouterProvider } from \"@/providers\";\nimport { PromptTypes } from \"@/types\";\nimport { debugLog } from \"@/utils/debug\";\nimport { formatString, preparePrompt } from \"@/utils\";\nimport {\n ExactMatchScorer,\n MultipleChoiceScorer,\n RefAnswerEqualityLLMJudgeScorer,\n} from \"@/scorers\";\n\n/**\n * Generic Multiple Choice Question Generator using an LLM model\n */\nexport class MCQGenerator extends AbstractGenerator {\n readonly identifier = \"mcq\";\n\n inputSchema = z.array(z.any());\n\n optionsSchema = z\n .object(\n {\n /**\n * The API key for the OpenRouter provider. Won't be used if `provider` is given.\n */\n openRouterApiKey: z.string().optional(),\n\n /**\n * The Provider that is going to be used to generate the Prompts.\n */\n provider: z.instanceof(BaseLLMProvider).optional(),\n\n /**\n * The model that is going to be used to generate the prompts\n */\n model: z.string(),\n\n systemPromptPrefix: z.string().optional().default(\"\"),\n\n /**\n * Additional rules that will be appended to the system prompt.\n */\n systemPromptRules: z.array(z.string()).default([]),\n systemPrompt: z.string().optional()\n .default(`Take the input text and find a difficult question about the content. The question should test understanding of the key concepts, facts or relationships described in the text. The question should include enough context to answer it without the need to read the text. The question must not refer to the text in any way. The question must not want a very specific values such as p-values or time frames like when effect was on day. Each option must not be longer than 5-7 words.\n\nYou need to generate a multiple choice question with at least 8 options. Some of the options can be real terms from the domain, others can be plausible-sounding terms that you invent to sound authentic to the subject matter.\n{rules}\nYour output strictly forced to be a JSON object which applies the following schema:\n\\`\\`\\`json\n{\n \"question\": \"Question text\",\n \"options\": {\n \"A\": \"Option A text\",\n \"B\": \"Option B text\",\n \"C\": \"Option C text\",\n \"D\": \"Option D text\"\n // ....\n },\n \"answerKey\": \"C\",\n \"answer\": \"Option C text\"\n}\n\\`\\`\\`\n`),\n systemPromptSuffix: z.string().optional().default(\"\"),\n\n /**\n * The main function that parses the input value to a string.\n */\n parseInput: z.function().args(z.any()).returns(z.string()),\n\n /**\n * Whether to include the original data as a field inside the metadata.\n */\n includeOriginalInputAsMetadata: z.boolean().optional().default(false),\n\n /**\n * Additional metadata that is going to be added to the each Prompt.\n * If a function is given then that function takes an argument which\n * is the input value for each item and generates the additional metadata.\n */\n additionalMetadata: z\n .union([\n z\n .function()\n .args(z.any(), z.object({ systemPrompt: z.string() }))\n .returns(z.record(z.string(), z.any())),\n z.record(z.string(), z.any()),\n ])\n .optional(),\n },\n { message: \"No options provided\" }\n )\n .transform((options, ctx) => {\n if (options.provider !== undefined) {\n return options;\n }\n\n if (options.openRouterApiKey !== undefined) {\n return {\n ...options,\n provider: new OpenRouterProvider({\n apiKey: options.openRouterApiKey,\n }),\n };\n }\n\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"No provider or openRouterApiKey provided\",\n });\n\n return z.NEVER;\n });\n\n async generatePrompts(\n input: z.input<this[\"inputSchema\"]>,\n options?: z.input<this[\"optionsSchema\"]>\n ) {\n // Parse the options\n const parsedOptions = this.optionsSchema.parse(options);\n\n // Build the system prompt\n const systemPrompt = formatString(\n parsedOptions.systemPromptPrefix +\n parsedOptions.systemPrompt +\n parsedOptions.systemPromptSuffix,\n {\n rules:\n parsedOptions.systemPromptRules.length > 0\n ? `\\nAlso strictly follow the rules below:\\n${parsedOptions.systemPromptRules.join(\"\\n\")}\\n`\n : \"\",\n }\n );\n\n // Generate Prompts for each text input\n const results = await Promise.all(\n input.map((item) =>\n this.generateFromInput(\n item,\n parsedOptions.provider!,\n parsedOptions,\n systemPrompt\n )\n )\n );\n\n // Filter out null results\n return results.filter((result) => result !== null);\n }\n\n private async generateFromInput(\n input: any,\n provider: BaseLLMProvider,\n options: z.infer<this[\"optionsSchema\"]>,\n systemPrompt: string\n ) {\n const inputText = options.parseInput(input);\n\n // Forward request to the LLM\n const response = await provider.forward(inputText, {\n model: options.model,\n system: systemPrompt,\n });\n\n const mcq = parseResponseAsJSON<{\n question: string;\n options: Record<string, string>;\n answerKey: string;\n answer: string;\n }>(response.data);\n\n if (!mcq) {\n debugLog(\"Couldn't parsed the LLM response as a JSON:\", response.data);\n return null;\n }\n\n // Append the options to the full prompt\n const fullPrompt = preparePrompt(mcq.question, mcq.options);\n\n // Get the additional metadata\n const additionalMetadata =\n typeof options.additionalMetadata === \"function\"\n ? options.additionalMetadata(input, { systemPrompt })\n : options.additionalMetadata || {};\n\n return await this.buildPrompt({\n correctAnswer: mcq.answerKey || mcq.answer,\n question: mcq.question,\n options: mcq.options || {},\n fullPrompt: fullPrompt,\n type: PromptTypes.MultipleChoice,\n metadata: {\n tags: [\n `generator-${this.identifier}`,\n\n // Expand the tags field if it is provided within the additional metadata\n ...(Array.isArray(additionalMetadata.tags)\n ? additionalMetadata.tags\n : []),\n ],\n model: options.model,\n\n generatorIdentifier: this.identifier,\n generatorClassName: this.constructor.name,\n\n // Input might be an object but input text will be a string\n originalSourceInput: options.includeOriginalInputAsMetadata\n ? input\n : undefined,\n originalSourceInputText: inputText,\n\n ...additionalMetadata,\n },\n\n scorers: [\n // TODO: We should be able to access identifier without instantiating an object\n new MultipleChoiceScorer().identifier,\n new RefAnswerEqualityLLMJudgeScorer().identifier,\n new ExactMatchScorer().identifier,\n ],\n });\n }\n}\n","/**\n * Only for internal usage. Logs the arguments only if\n * a certain environment variable is set.\n */\nexport function debugLog(...args: any[]) {\n if (process?.env?.PB_SDK_DEBUG) {\n console.log(`[${new Date().toISOString()}] PB_SDK_DEBUG:`, ...args);\n }\n}\n","import { PromptResponse, MaybePromise, PromptScore } from \"@/types\";\n\n/**\n * Abstract base class for scorers\n */\nexport abstract class AbstractScorer {\n /**\n * Unique identifier for the scorer\n */\n abstract readonly identifier: string;\n\n /**\n * Score a single response\n * @param response The response to score\n * @param options Additional options for scoring\n * @returns PromptScore object including the given Response, Prompt and the calculated Score\n */\n abstract scoreOne(\n response: PromptResponse,\n options?: Record<string, any>\n ): MaybePromise<PromptScore | undefined>;\n\n /**\n * Checks whether the scorer is eligible to score the given response\n */\n abstract canScore(response: PromptResponse): MaybePromise<boolean>;\n}\n","import { AbstractScorer } from \"./abstract/abstract-scorer\";\nimport { PromptResponse, PromptScoreSchema, ScoringMethods } from \"@/types\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * Scorer implementation for multiple choice questions. Parses the answer letter\n * from the response text by looking for patterns like `answer is <letter>` or\n * `<letter>:` and compares it with the `answerKey` of the prompt.\n */\nexport class MultipleChoiceScorer extends AbstractScorer {\n readonly identifier = \"multiple-choice\";\n\n private readonly EXPLANATION_TEXT = `This scorer searches for multiple choice answers using the following patterns (in order):\n1) \"<!NO ANSWER!>\" (special marker indicating model's inability to answer),\n2) \"Answer is $\\\\boxed{answer text}$\" (full answer text in LaTeX boxed format),\n3) \"Answer is answer text\" (full answer text),\n4) \"Answer is **answer text**\" (full answer text in bold),\n5) \"Answer is $\\\\boxed{A}$\" or \"Answer is $\\\\boxed{A}$.\" (single letter in LaTeX boxed format, optional period),\n6) \"Answer is A\" (single letter),\n7) \"Answer is **A**\" (single letter in bold),\n8) \"A: ...\" (letter followed by colon),\n9) \"A) ...\" (letter followed by closing parenthesis and optional text),\n10) \"A)\" (letter followed by closing parenthesis).\nThe scorer extracts the answer from the last matching pattern (if multiple matches exist) and compares it with the expected answer key (or the answer text itself).`;\n\n /**\n * Score a multiple choice response\n */\n async scoreOne(response: PromptResponse) {\n if (!(await this.canScore(response))) {\n return undefined;\n }\n\n const { data, prompt } = response;\n let score = 0;\n\n // Direct answer comparison\n if (data.trim() === prompt.answerKey?.trim()) {\n score = 1;\n }\n\n // Look for answer patterns in the response\n let extractedAnswer = this.lookForAnswer(data!, prompt.answerKey!);\n if (extractedAnswer === prompt.answerKey) {\n score = 1;\n } else {\n // The model might have answered with the answer text\n // itself rather than the answer key. In this case, we need to\n // find the answer's letter that matches the answer text.\n const answerOption = Object.entries(prompt.options!).find(\n ([, value]) => value.trim() === extractedAnswer?.trim()\n );\n\n // Check if the given text is one of the available options\n // and it is the correct one.\n if (answerOption && answerOption[0] === prompt.answerKey) {\n score = 1;\n extractedAnswer = answerOption[0];\n }\n }\n\n return PromptScoreSchema.parse({\n ...response,\n score,\n scoreDID: uuidv7(),\n method: ScoringMethods.algo,\n prompt: response.prompt,\n scoreMetadata: {\n scorerIdentifier: this.identifier,\n extractedAnswer,\n },\n explanation: this.EXPLANATION_TEXT,\n });\n }\n\n async canScore(response: PromptResponse): Promise<boolean> {\n return (\n response.data !== undefined &&\n response.prompt !== undefined &&\n // TODO: Enable this condition once we are sure the structure of the Prompt and whether to include the type in there\n // response.prompt.type === PromptTypes.MultipleChoice &&\n response.prompt.options !== undefined &&\n Object.keys(response.prompt.options).length > 0 &&\n Boolean(response.prompt.answerKey) && // not undefined or empty string\n Boolean(response.prompt.answer) // not undefined or empty string\n );\n }\n\n /**\n * Extracts answer from Response text using regex patterns\n */\n private lookForAnswer(response: string, answer: string): string | undefined {\n /**\n * Patterns from most specific to least\n */\n const patterns = [\n {\n // \"<!NO ANSWER!>\"\n regex: /<!NO ANSWER!>/g,\n\n // Pattern matches, but no group is specified in the regex.\n // So the final value will be `undefined`.\n answerGroupIndex: 1,\n },\n {\n // \"Answer is $\\boxed{answer text}$\"\n regex: new RegExp(\n `[Aa]nswer is \\\\$\\\\\\\\boxed\\\\{(${this.escapeRegex(answer)})\\\\}\\\\$`,\n \"g\"\n ),\n answerGroupIndex: 1,\n },\n {\n // \"Answer is answer text\"\n regex: new RegExp(`[Aa]nswer is\\\\s+(${this.escapeRegex(answer)})`, \"g\"),\n answerGroupIndex: 1,\n },\n {\n // \"Answer is **answer text**\"\n regex: new RegExp(\n `[Aa]nswer is\\\\s+\\\\**(${this.escapeRegex(answer)})\\\\**`,\n \"g\"\n ),\n answerGroupIndex: 1,\n },\n {\n // \"Answer is $\\boxed{A}$.\"\n regex: /[Aa]nswer is \\$\\\\boxed\\{([A-Z])\\}\\$\\.?/g,\n answerGroupIndex: 1,\n },\n {\n // \"Answer is A\"\n regex: /[Aa]nswer is\\s+([A-Z])/g,\n answerGroupIndex: 1,\n },\n {\n // \"Answer is **A**\"\n regex: /[Aa]nswer is\\s+\\**([A-Z])\\**/g,\n answerGroupIndex: 1,\n },\n {\n // \"A: answer text\"\n regex: /([A-Z]):.+/g,\n answerGroupIndex: 1,\n },\n {\n // \"A) answer text\"\n regex: /([A-Z])\\)\\s*.+/g,\n answerGroupIndex: 1,\n },\n {\n // \"A)\"\n regex: /([A-Z])\\)/g,\n answerGroupIndex: 1,\n },\n ];\n\n for (const pattern of patterns) {\n const matches = Array.from(response.matchAll(pattern.regex));\n const match = matches.at(-1); // Use the last match\n\n if (match) {\n return match[pattern.answerGroupIndex];\n }\n }\n }\n\n private escapeRegex(str: string): string {\n return str.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n }\n}\n","import { AbstractScorer } from \"./abstract/abstract-scorer\";\nimport { PromptResponse, PromptScoreSchema, ScoringMethods } from \"@/types\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * It can be used both for multiple choice and free form questions.\n * If the Prompt includes options (aka it is multiple choice question) then\n * compares the `answerKey` field with the response and checks if they are the same.\n * Otherwise uses `answer` field for the same thing.\n */\nexport class ExactMatchScorer extends AbstractScorer {\n readonly identifier = \"exact-match\";\n\n async scoreOne(response: PromptResponse) {\n if (!(await this.canScore(response))) {\n return undefined;\n }\n\n let score = 0;\n\n // Use `answerKey` field for multiple choice questions\n // (If a Prompt has options, then it is a multiple choice question)\n if (\n response.prompt.options !== undefined &&\n Object.keys(response.prompt.options).length > 0\n ) {\n score =\n response.data?.trim() === response.prompt.answerKey?.trim() ? 1 : 0;\n } else {\n // Use `answer` field\n score = response.data?.trim() === response.prompt.answer?.trim() ? 1 : 0;\n }\n\n return PromptScoreSchema.parse({\n ...response,\n score,\n scoreDID: uuidv7(),\n method: ScoringMethods.algo,\n prompt: response.prompt,\n scoreMetadata: {\n scorerIdentifier: this.identifier,\n extractedAnswer: response.data?.trim(),\n },\n explanation: undefined,\n });\n }\n\n async canScore(response: PromptResponse): Promise<boolean> {\n return response.data !== undefined && response.prompt !== undefined;\n }\n}\n","import { z } from \"zod\";\nimport { AbstractScorer } from \"./abstract/abstract-scorer\";\nimport { PromptResponse, PromptScoreSchema, ScoringMethods } from \"@/types\";\nimport { BaseLLMProvider, OpenRouterProvider } from \"@/providers\";\nimport { parseResponseAsJSON } from \"@/utils/llm\";\nimport { formatString } from \"@/utils\";\nimport { debugLog } from \"@/utils/debug\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * A Scorer which uses an LLM model to judge the response against the correct answer.\n */\nexport class RefAnswerEqualityLLMJudgeScorer extends AbstractScorer {\n readonly identifier = \"ref-answer-equality-llm-judge-scorer\";\n\n optionsSchema = z\n .object({\n openRouterApiKey: z.string().optional(),\n provider: z.instanceof(BaseLLMProvider).optional(),\n model: z.string(),\n prompt: z.string().default(`\nJudge whether the following [response] to [question] is correct or not based on the precise and unambiguous [correctAnswer] OR [correctAnswerKey] (if the question was a multiple choice question) below.\n\n[question]: {question}\n\n[response]: {response}\n\n[correctAnswer]: {correctAnswer}\n[correctAnswerKey]: {correctAnswerKey}\n\nYour judgement must be in the format and criteria specified below:\n\\`\\`\\`json\n{\n \"extractedFinalAnswer\": \"The final exact answer extracted from the [response]. Put the extracted answer as 'None' if there is no exact, final answer to extract from the response.\",\n \"reasoning\": \"Explain why the extractedFinalAnswer is correct or incorrect based on [correctAnswer], focusing only on if there are meaningful differences between [correctAnswer] and the extractedFinalAnswer. Do not comment on any background to the problem, do not attempt to solve the problem, do not argue for any answer different than [correctAnswer], focus only on whether the answers match.\",\n \"correct\": \"Answer 'yes' if extracted_final_answer matches the [correctAnswer] given above, or is within a small margin of error for numerical problems. Answer 'no' otherwise, i.e. if there if there is any inconsistency, ambiguity, non-equivalency, or if the extracted answer is incorrect.\",\n \"confidence\": \"The extracted confidence score between 0% and 100% from [response]. Put 100 if there is no confidence score available.\"\n}\n\\`\\`\\``),\n promptSuffix: z.string().default(\"\"),\n promptPrefix: z.string().default(\"\"),\n })\n .transform((options, ctx) => {\n if (options.provider !== undefined) {\n return options;\n }\n\n if (options.openRouterApiKey !== undefined) {\n return {\n ...options,\n provider: new OpenRouterProvider({\n apiKey: options.openRouterApiKey,\n }),\n };\n }\n\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"No provider or openRouterApiKey provided\",\n });\n\n return z.NEVER;\n });\n\n async scoreOne(\n response: PromptResponse,\n options: z.input<typeof this.optionsSchema>\n ) {\n if (!(await this.canScore(response))) {\n return undefined;\n }\n\n const parsedOptions = this.optionsSchema.parse(options);\n const provider =\n options?.provider ??\n new OpenRouterProvider({\n apiKey: parsedOptions.openRouterApiKey!,\n });\n\n // Build the prompt\n const prompt = formatString(\n parsedOptions.promptPrefix +\n parsedOptions.prompt +\n parsedOptions.promptSuffix,\n {\n question: response.prompt.question.data,\n response: response.data!,\n correctAnswer: response.prompt.answer!,\n correctAnswerKey:\n // If the Prompt is a multiple choice question, then the model might have answered\n // with the correct answer key rather than the actual answer text so consider that\n // the answer key is also the correct answer\n response.prompt.answerKey || \"CORRECT ANSWER KEY IS NOT AVAILABLE\",\n }\n );\n\n const judge = await provider.forward(prompt, {\n model: parsedOptions.model,\n });\n\n const extractedJSON = parseResponseAsJSON<{\n correct: string;\n extractedFinalAnswer: string;\n reasoning: string;\n confidence: string;\n }>(judge.data);\n debugLog(\"Extracted JSON from Judge response:\", extractedJSON);\n debugLog(\"-------------------------------------\");\n\n let score = 0;\n if (extractedJSON && typeof extractedJSON === \"object\") {\n score = extractedJSON.correct.toLowerCase() === \"yes\" ? 1 : 0;\n }\n\n const modelInfo = await provider.parseModelInfo(parsedOptions.model);\n\n return PromptScoreSchema.parse({\n ...response,\n score,\n scoreDID: uuidv7(),\n prompt: response.prompt,\n method: ScoringMethods.ai,\n scorerAI: {\n provider: provider.identifier,\n modelName: modelInfo?.name ?? \"unknown\",\n modelHost: modelInfo?.host ?? \"auto\",\n modelOwner: modelInfo?.owner ?? \"unknown\",\n modelId: parsedOptions.model,\n inputTokensUsed: judge.inputTokensUsed,\n outputTokensUsed: judge.outputTokensUsed,\n inputCost: judge.inputCost,\n outputCost: judge.outputCost,\n },\n scoreMetadata: {\n scorerIdentifier: this.identifier,\n extractedAnswer: extractedJSON?.extractedFinalAnswer,\n reasoning: extractedJSON?.reasoning,\n confidence: extractedJSON?.confidence,\n },\n explanation: extractedJSON?.reasoning ?? undefined,\n });\n }\n\n async canScore(response: PromptResponse): Promise<boolean> {\n return (\n response.data !== undefined &&\n response.prompt !== undefined &&\n response.prompt.answer !== undefined\n );\n }\n}\n","import { AbstractScorer } from \"./abstract/abstract-scorer\";\nimport { PromptResponse, PromptScoreSchema, ScoringMethods } from \"@/types\";\nimport tokenizer from \"sbd\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * This Scorer splits the given Response and the answer into sentences and checks the similarity between them.\n * For each sentence that is placed correctly in the Response (same position as in the answer) it counts one score.\n * The final score is the ratio of the number of sentences that are placed correctly in the Response to the total number of sentences in the answer.\n * Simply `correctly_placed_sentences / total_sentence_count`. It uses `sbd` library to split the text into sentences.\n */\nexport class SimilarityScorer extends AbstractScorer {\n readonly identifier = \"similarity\";\n\n async scoreOne(response: PromptResponse, options?: { ignoreCase?: boolean }) {\n if (!(await this.canScore(response))) {\n return undefined;\n }\n\n const originalSentences = options?.ignoreCase\n ? tokenizer.sentences(response.prompt.answer!.toLowerCase())\n : tokenizer.sentences(response.prompt.answer!);\n const responseSentences = options?.ignoreCase\n ? tokenizer.sentences(response.data!.toLowerCase())\n : tokenizer.sentences(response.data!);\n\n let score = 0;\n for (let i = 0; i < originalSentences.length; i++) {\n const originalSentence = originalSentences[i];\n const responseSentence = responseSentences[i];\n\n // Count one point for each sentence found in the correct position\n if (originalSentence === responseSentence) {\n score += 1;\n }\n }\n\n return PromptScoreSchema.parse({\n ...response,\n scoreDID: uuidv7(),\n // Calculate the accuracy\n score: score / originalSentences.length,\n method: ScoringMethods.algo,\n prompt: response.prompt,\n scoreMetadata: {\n scorerIdentifier: this.identifier,\n correctPositionedSentences: score,\n totalSentencesInAnswer: originalSentences.length,\n totalSentencesInResponse: responseSentences.length,\n },\n explanation: undefined,\n });\n }\n\n async canScore(response: PromptResponse): Promise<boolean> {\n return (\n response.data !== undefined &&\n response.prompt !== undefined &&\n response.prompt.answer !== undefined\n );\n }\n}\n","import { z } from \"zod\";\nimport { AbstractScorer } from \"./abstract/abstract-scorer\";\nimport {\n PromptResponse,\n PromptResponseSchema,\n PromptScore,\n PromptScoreSchema,\n PromptTypes,\n ScoringMethods,\n} from \"@/types\";\nimport { BaseLLMProvider, OpenRouterProvider } from \"@/providers\";\nimport { debugLog } from \"@/utils/debug\";\nimport { ChatCompletionMessageParam } from \"openai/resources/chat\";\nimport { v7 as uuidv7 } from \"uuid\";\n\n/**\n * LLM Judge Scorer that supports both pointwise and pairwise evaluation modes\n */\nexport class LLMJudgeScorer extends AbstractScorer {\n readonly identifier = \"llm-judge\";\n\n optionsSchema = z\n .object({\n openRouterApiKey: z.string().optional(),\n provider: z.instanceof(BaseLLMProvider).optional(),\n model: z.string().default(\"openai/gpt-4o-mini\"),\n mode: z.enum([\"pointwise\", \"pairwise\"]).default(\"pointwise\"),\n criteria: z.array(CriterionSchema).min(1),\n meta: z.record(z.any(), z.any()).optional(),\n temperature: z.number().min(0).max(2).default(0.0),\n promptPrefix: z.string().default(\"\"),\n promptSuffix: z.string().default(\"\"),\n responseB: PromptResponseSchema.optional(),\n })\n .transform((options, ctx) => {\n if (options.provider !== undefined) {\n return options;\n }\n\n if (options.openRouterApiKey !== undefined) {\n return {\n ...options,\n provider: new OpenRouterProvider({\n apiKey: options.openRouterApiKey,\n }),\n };\n }\n\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"No provider or openRouterApiKey provided\",\n });\n\n return z.NEVER;\n });\n\n async scoreOne(\n response: PromptResponse,\n options: z.input<typeof this.optionsSchema>\n ) {\n if (!(await this.canScore(response, options))) {\n return undefined;\n }\n\n const parsedOptions = this.optionsSchema.parse(options);\n const provider =\n parsedOptions.provider ??\n new OpenRouterProvider({\n apiKey: parsedOptions.openRouterApiKey!,\n });\n\n if (parsedOptions.mode === \"pointwise\") {\n return this.scorePointwise(response, parsedOptions, provider);\n } else {\n // For pairwise mode, we need a second Response to compare against\n if (!parsedOptions.responseB) {\n throw new Error(\n \"Pairwise mode requires responseB to be provided in options.\"\n );\n }\n return this.scorePairwise(response, parsedOptions, provider);\n }\n }\n\n private systemPrompt() {\n return [\n \"You are a strict, fair evaluation judge.\",\n \"Only use information provided in the task and candidate answers.\",\n \"For each criterion, return an integer score within the provided scale and a very brief justification (≤2 sentences).\",\n \"Return only JSON that conforms to the requested schema.\",\n \"Do not include chain-of-thought or internal reasoning; just concise justifications.\",\n ].join(\" \");\n }\n\n private async scorePointwise(\n response: PromptResponse,\n options: z.infer<typeof this.optionsSchema>,\n provider: BaseLLMProvider\n ): Promise<PromptScore | undefined> {\n let task = response.prompt.fullPrompt.data;\n\n if (response.prompt.type === PromptTypes.MultipleChoice) {\n task += `\\nCorrect answer: ${response.prompt.answerKey} - ${response.prompt.answer}`;\n } else if (response.prompt.answer) {\n task += `\\nExpected answer: ${response.prompt.answer}`;\n }\n\n const norm = this.normalizeWeights(options.criteria);\n const user = [\n `TASK:\\n${task}`,\n options.meta\n ? `\\nADDITIONAL CONTEXT (may include references, constraints, expected behavior):\\n${JSON.stringify(options.meta, null, 2)}`\n : \"\",\n `\\nRUBRIC:\\n${this.renderCriteria(norm)}`,\n `\\nCANDIDATE ANSWER:\\n${response.data!}`,\n `\\nRESPONSE FORMAT (strict JSON):`,\n JSON.stringify(\n {\n perCriterion: [\n {\n id: \"<string>\",\n score: \"<integer within scale>\",\n justification: \"<≤2 sentences>\",\n },\n ],\n overall: \"<0..100 integer>\",\n verdict: \"<one of: 'strong-pass' | 'pass' | 'borderline' | 'fail'>\",\n notes: \"<optional, ≤3 short bullet points>\",\n },\n null,\n 2\n ),\n ].join(\"\");\n\n const scorePrompt = [\n user,\n \"\\nINSTRUCTIONS:\",\n \"- Compute per-criterion integer scores within each scale.\",\n \"- Compute weighted overall as a 0-100 integer: normalize weights, map each score to 0-100 by its scale, then weighted average.\",\n \"- Choose verdict thresholds: ≥85 strong-pass, 70-84 pass, 60-69 borderline, <60 fail.\",\n \"- Output valid JSON only.\",\n ].join(\"\\n\");\n const messages: ChatCompletionMessageParam[] = [\n { role: \"system\", content: this.systemPrompt() },\n {\n role: \"user\",\n content: scorePrompt,\n },\n ];\n\n const llmResponse = await provider.forward(messages, {\n model: options.model,\n });\n\n debugLog(\"LLM Response:\", llmResponse.data!);\n\n const json = extractFirstJSON<PointwiseResult>(llmResponse.data!);\n if (!Array.isArray(json.perCriterion)) {\n throw new Error(\"Model did not return perCriterion array.\");\n }\n debugLog(\"Extracted JSON from Judge response:\", json);\n\n // Compute overall score if not provided or invalid\n const computedOverall = this.computeOverallScore(json.perCriterion, norm);\n const overall =\n Number.isFinite(Number(json.overall)) && Number(json.overall) > 0\n ? Number(json.overall)\n : computedOverall;\n\n // Convert overall score (0-100) to 0-1 scale for PromptScore\n const score = Math.min(1, Math.max(0, overall / 100));\n let explanation = \"\";\n\n if (json.notes && json.notes.length > 0) {\n explanation = json.notes.join(\". \");\n }\n\n for (const criterion of json.perCriterion) {\n explanation += [\n `Criteria: ${criterion.id}`,\n `Score: ${criterion.score}`,\n `Justification:\\n${criterion.justification}\\n`,\n ].join(\"\\n\");\n }\n\n return PromptScoreSchema.parse({\n ...response,\n score,\n scoreDID: uuidv7(),\n prompt: response.prompt,\n method: ScoringMethods.ai,\n scorerAI: {\n provider: provider.identifier,\n modelId: options.model,\n modelHost: \"auto\",\n modelName: \"unknown\",\n modelOwner: \"unknown\",\n inputTokensUsed: llmResponse.inputTokensUsed,\n outputTokensUsed: llmResponse.outputTokensUsed,\n inputCost: llmResponse.inputCost,\n outputCost: llmResponse.outputCost,\n },\n scoreMetadata: {\n overall,\n scorerIdentifier: this.identifier,\n mode: \"pointwise\",\n perCriterion: json.perCriterion,\n verdict: json.verdict,\n scorePrompt,\n systemPrompt: this.systemPrompt(),\n },\n explanation: explanation || undefined,\n });\n }\n\n private async scorePairwise(\n response: PromptResponse,\n options: z.infer<typeof this.optionsSchema>,\n provider: BaseLLMProvider\n ): Promise<PromptScore | undefined> {\n if (!options.responseB || !response.data || !options.responseB.data) {\n return undefined;\n }\n\n const norm = this.normalizeWeights(options.criteria);\n const user = [\n `TASK:\\n${response.prompt.fullPrompt.data}`,\n options.meta\n ? `\\nADDITIONAL CONTEXT:\\n${JSON.stringify(options.meta, null, 2)}`\n : \"\",\n `\\nRUBRIC:\\n${this.renderCriteria(norm)}`,\n `\\nCANDIDATE A:\\n${response.data}`,\n `\\nCANDIDATE B:\\n${options.responseB.data}`,\n `\\nRESPONSE FORMAT (strict JSON):`,\n JSON.stringify(\n {\n winner: \"<'A' | 'B' | 'tie'>\",\n confidence: \"<integer 1..5>\",\n rationale: \"<≤3 sentences>\",\n perCriterion: [\n {\n id: \"<string>\",\n better: \"<'A'|'B'|'tie'>\",\n justification: \"<≤2 sentences>\",\n },\n ],\n },\n null,\n 2\n ),\n ].join(\"\");\n\n const systemPrompt = [\n this.systemPrompt(),\n \"When comparing, do not reward verbosity or length. Prefer factual accuracy, adherence to instructions, safety, and clarity.\",\n ].join(\" \");\n const messages: ChatCompletionMessageParam[] = [\n {\n role: \"system\",\n content: systemPrompt,\n },\n { role: \"user\", content: user },\n ];\n\n const content = await provider.forward(messages, {\n model: options.model,\n });\n const json = extractFirstJSON<PairwiseResult>(content.data!);\n\n debugLog(\"Original Pairwise Judge response:\", content.data!);\n debugLog(\"Extracted JSON from Pairwise Judge response:\", json);\n\n if (!json || ![\"A\", \"B\", \"tie\"].includes(json.winner)) {\n throw new Error(\"Model returned invalid pairwise result.\");\n }\n const confidence = Math.max(1, Math.min(5, Number(json.confidence) || 3));\n\n // Convert pairwise result to a score (0-1 scale)\n // If the other Response is better then the score\n // would be closer to 0.\n let score = 0.5; // default for tie\n if (json.winner === \"A\") {\n score = 1.0;\n } else if (json.winner === \"B\") {\n score = 0.0;\n }\n\n let explanation = \"\";\n\n if (json.rationale) {\n explanation = json.rationale;\n }\n\n for (const criterion of json.perCriterion) {\n explanation += [\n `Criteria: ${criterion.id}`,\n `Better: ${criterion.better}`,\n `Justification:\\n${criterion.justification}\\n`,\n ].join(\"\\n\");\n }\n\n return PromptScoreSchema.parse({\n ...response,\n score,\n scoreDID: uuidv7(),\n prompt: response.prompt,\n method: ScoringMethods.ai,\n scorerAI: {\n provider: provider.identifier,\n modelId: options.model,\n modelHost: \"auto\",\n modelName: \"unknown\",\n modelOwner: \"unknown\",\n inputTokensUsed: content.inputTokensUsed,\n outputTokensUsed: content.outputTokensUsed,\n inputCost: content.inputCost,\n outputCost: content.outputCost,\n },\n scoreMetadata: {\n scorerIdentifier: this.identifier,\n mode: \"pairwise\",\n winner: json.winner,\n confidence,\n rationale: json.rationale,\n perCriterion: json.perCriterion,\n responseB: options.responseB.data,\n systemPrompt,\n scorePrompt: user,\n },\n explanation: explanation || undefined,\n });\n }\n\n /**\n * Build the pairwise evaluation prompt\n */\n private buildPairwisePrompt(\n task: string,\n answerA: string,\n answerB: string,\n criteria: z.infer<typeof CriterionSchema>[],\n meta?: Record<string, any>,\n prefix = \"\",\n suffix = \"\"\n ): string {\n const rubric = this.renderCriteria(criteria);\n\n const userPrompt = [\n `TASK:\\n${task}`,\n meta ? `\\nADDITIONAL CONTEXT:\\n${JSON.stringify(meta, null, 2)}` : \"\",\n `\\nRUBRIC:\\n${rubric}`,\n `\\nCANDIDATE A:\\n${answerA}`,\n `\\nCANDIDATE B:\\n${answerB}`,\n `\\nRESPONSE FORMAT (strict JSON):`,\n JSON.stringify(\n {\n winner: \"<'A' | 'B' | 'tie'>\",\n confidence: \"<integer 1..5>\",\n rationale: \"<≤3 sentences>\",\n perCriterion: [\n {\n id: \"<string>\",\n better: \"<'A'|'B'|'tie'>\",\n justification: \"<≤2 sentences>\",\n },\n ],\n },\n null,\n 2\n ),\n ].join(\"\\n\");\n\n return `${prefix}${userPrompt}${suffix}`;\n }\n\n /**\n * Normalize criterion weights to sum to 1\n */\n private normalizeWeights(\n criteria: z.infer<typeof CriterionSchema>[]\n ): z.infer<typeof CriterionSchema>[] {\n const sum = criteria.reduce((a, c) => a + (c.weight ?? 1), 0) || 1;\n return criteria.map((c) => ({ ...c, weight: (c.weight ?? 1) / sum }));\n }\n\n /**\n * Render criteria as a formatted string\n */\n private renderCriteria(criteria: z.infer<typeof CriterionSchema>[]): string {\n return criteria\n .map((c, i) => {\n const mn = c.scale?.min ?? 0;\n const mx = c.scale?.max ?? 5;\n return `${i + 1}. id=\"${c.id}\" (weight=${c.weight}, scale=${mn}..${mx}) — ${c.description}`;\n })\n .join(\"\\n\");\n }\n\n /**\n * Compute overall score from per-criterion scores\n */\n private computeOverallScore(\n perCriterion: Array<{ id: string; score: number; justification: string }>,\n criteria: z.infer<typeof CriterionSchema>[]\n ): number {\n let total = 0;\n for (const pc of perCriterion) {\n const criterion = criteria.find((c) => c.id === pc.id);\n const { min, max, weight } = {\n min: criterion?.scale?.min ?? 0,\n max: criterion?.scale?.max ?? 5,\n weight: criterion?.weight ?? 0,\n };\n\n const score = Number(pc.score);\n if (!Number.isFinite(score)) continue;\n\n const clamped = Math.max(min, Math.min(max, score));\n const normalized100 =\n max === min ? 0 : ((clamped - min) / (max - min)) * 100;\n total += normalized100 * weight;\n }\n return Math.round(total);\n }\n\n /**\n * Extract criteria IDs from prompt text (fallback)\n */\n private extractCriteria(promptText: string): string[] {\n const ids: string[] = [];\n const re = /\\d+\\. id=\"([^\"]+)\"/g;\n let m;\n while ((m = re.exec(promptText)) !== null) {\n ids.push(m[1]);\n }\n return ids.length\n ? ids\n : [\"correctness\", \"instruction_following\", \"clarity\"];\n }\n\n async canScore(\n response: PromptResponse,\n options?: Record<string, any>\n ): Promise<boolean> {\n const hasValidResponse =\n response.data !== undefined && response.prompt !== undefined;\n\n if (!hasValidResponse) {\n return false;\n }\n\n // For pairwise mode, we also need to check if responseB is provided\n if (options?.mode === \"pairwise\") {\n return (\n options.responseB !== undefined &&\n options.responseB.data !== undefined &&\n options.responseB.prompt !== undefined\n );\n }\n\n return true;\n }\n}\n\n/**\n * Extract first JSON object from a string, with fallback parsing\n */\nfunction extractFirstJSON<T>(maybeJSON: string) {\n try {\n return JSON.parse(maybeJSON) as T;\n } catch {\n // Continue to fallback parsing\n }\n const start = maybeJSON.indexOf(\"{\");\n const end = maybeJSON.lastIndexOf(\"}\");\n if (start >= 0 && end > start) {\n const slice = maybeJSON.slice(start, end + 1);\n try {\n return JSON.parse(slice) as T;\n } catch {\n // Continue to error\n }\n }\n throw new Error(\"Failed to parse model response as JSON.\");\n}\n\n/**\n * Criterion schema for LLM judge scoring\n */\nconst CriterionSchema = z.object({\n id: z.string(),\n description: z.string(),\n weight: z.number().min(0).max(1).default(1),\n scale: z\n .object({\n min: z.number().default(0),\n max: z.number().default(5),\n })\n .default({ min: 0, max: 5 }),\n});\n\n/**\n * Pointwise scoring result schema\n */\ntype PointwiseResult = {\n perCriterion: Array<{\n id: string;\n score: number;\n justification: string;\n }>;\n overall: number;\n verdict: \"strong-pass\" | \"pass\" | \"borderline\" | \"fail\";\n notes?: string[];\n};\n\n/**\n * Pairwise scoring result schema\n */\ntype PairwiseResult = {\n winner: \"A\" | \"B\" | \"tie\";\n confidence: number;\n rationale: string;\n perCriterion: Array<{\n id: string;\n better: \"A\" | \"B\" | \"tie\";\n justification: string;\n }>;\n};\n","import { TypeOf, z } from \"zod\";\nimport { AbstractGenerator } from \"@/generators/abstract/abstract-generator\";\nimport { parseResponseAsJSON } from \"@/utils/llm\";\nimport { BaseLLMProvider, OpenRouterProvider } from \"@/providers\";\nimport { PromptTypes } from \"@/types\";\nimport { debugLog } from \"@/utils/debug\";\nimport { RefAnswerEqualityLLMJudgeScorer } from \"@/scorers\";\nimport { formatString } from \"@/utils\";\n\nexport class OpenEndedGenerator extends AbstractGenerator {\n readonly identifier = \"open-ended\";\n\n inputSchema = z.array(z.any());\n\n optionsSchema = z\n .object(\n {\n /**\n * The API key for the OpenRouter provider. Won't be used if `provider` is given.\n */\n openRouterApiKey: z.string().optional(),\n\n /**\n * The Provider that is going to be used to generate the Prompts.\n */\n provider: z.instanceof(BaseLLMProvider).optional(),\n\n /**\n * The model that is going to be used to generate the prompts\n */\n model: z.string(),\n\n /**\n * Adds an additional clue to the end of the question such as \"Answer with a positive number\"\n * which is relevant with the answer type expected.\n */\n addClueToQuestion: z.boolean().optional().default(true),\n\n /**\n * Additional rules that will be appended to the system prompt.\n */\n systemPromptRules: z.array(z.string()).default([]),\n systemPromptPrefix: z.string().optional().default(\"\"),\n systemPrompt: z.string().optional()\n .default(`Take the input text and find a difficult question about the content. The question should test understanding of the key concepts, facts or relationships described in the text. The question should include enough context to answer it without the need to read the text. The question must not refer to the text in any way. The question must not want a very specific values such as p-values or time frames like when effect was on day. Each option must not be longer than 5-7 words. {clue}\n{rules}\nYour output strictly forced to be a JSON object which applies the following schema:\n\\`\\`\\`json\n{\n \"question\": \"Question text\",\n \"answer\": \"Correct answer\"\n}\n\\`\\`\\`\n `),\n systemPromptSuffix: z.string().optional().default(\"\"),\n\n /**\n * The main function that parses the input value to a string.\n */\n parseInput: z.function().args(z.any()).returns(z.string()),\n\n /**\n * Whether to include the original as a field inside the metadata.\n */\n includeOriginalInputAsMetadata: z.boolean().optional().default(false),\n\n /**\n * Additional metadata that is going to be added to the each Prompt.\n * If a function is given then that function takes an argument which\n * is the input value for each item and generates the additional metadata.\n */\n additionalMetadata: z\n .union([\n z\n .function()\n .args(z.any(), z.object({ systemPrompt: z.string() }))\n .returns(z.record(z.string(), z.any())),\n z.record(z.string(), z.any()),\n ])\n .optional(),\n },\n { message: \"No options provided\" }\n )\n .transform((options, ctx) => {\n if (options.provider !== undefined) {\n return options;\n }\n\n if (options.openRouterApiKey !== undefined) {\n return {\n ...options,\n provider: new OpenRouterProvider({\n apiKey: options.openRouterApiKey,\n }),\n };\n }\n\n ctx.addIssue({\n code: z.ZodIssueCode.custom,\n message: \"No provider or openRouterApiKey provided\",\n });\n\n return z.NEVER;\n });\n\n async generatePrompts(\n input: TypeOf<this[\"inputSchema\"]>,\n options?: z.input<(typeof this)[\"optionsSchema\"]>\n ) {\n // Parse the options\n const parsedOptions = this.optionsSchema.parse(options);\n const provider =\n options?.provider ??\n new OpenRouterProvider({\n apiKey: parsedOptions.openRouterApiKey!,\n });\n\n // Build the system prompt\n const systemPrompt = formatString(\n parsedOptions.systemPromptPrefix +\n parsedOptions.systemPrompt +\n parsedOptions.systemPromptSuffix,\n {\n clue: parsedOptions.addClueToQuestion\n ? `The question must ends with a sentence that says \"Answer with ...\" where \"...\" represents the type of answer expected.`\n : \"\",\n rules:\n parsedOptions.systemPromptRules.length > 0\n ? `\\nAlso strictly follow the rules below:\\n${parsedOptions.systemPromptRules.join(\"\\n\")}\\n`\n : \"\",\n }\n );\n\n // Generate Prompts for each text input\n const results = await Promise.all(\n input.map((item) =>\n this.generateFromInput(item, provider, parsedOptions, systemPrompt)\n )\n );\n\n // Filter out null results\n return results.filter((result) => result !== null);\n }\n\n private async generateFromInput(\n input: any,\n provider: BaseLLMProvider,\n options: z.infer<(typeof this)[\"optionsSchema\"]>,\n systemPrompt: string\n ) {\n const inputText = options.parseInput(input);\n\n // Forward request to the LLM\n const response = await provider.forward(inputText, {\n model: options.model,\n system: systemPrompt,\n });\n\n // q = question\n const q = parseResponseAsJSON<{\n question: string;\n answer: string;\n }>(response.data);\n\n if (!q) {\n debugLog(\"Couldn't parsed the LLM response as a JSON:\", response.data);\n return null;\n }\n\n // Get the additional metadata\n const additionalMetadata =\n typeof options.additionalMetadata === \"function\"\n ? options.additionalMetadata(input, { systemPrompt })\n : options.additionalMetadata || {};\n\n return this.buildPrompt({\n correctAnswer: q.answer,\n question: q.question,\n options: {},\n fullPrompt: q.question,\n type: PromptTypes.OpenEnded,\n metadata: {\n tags: [\n `generator-${this.identifier}`,\n\n // Expand the tags field if it is provided within the additional metadata\n ...(Array.isArray(additionalMetadata.tags)\n ? additionalMetadata.tags\n : []),\n ],\n\n brainModel: options.model,\n model: options.model,\n\n promptGenClassName: this.constructor.name,\n promptGenJSClassName: this.constructor.name,\n\n // Input might be an object but input text will be a string\n originalSourceInput: options.includeOriginalInputAsMetadata\n ? input\n : undefined,\n originalSourceInputText: inputText,\n\n ...additionalMetadata,\n },\n\n scorers: [\n // TODO: We should be able to access identifier without instantiating an object\n new RefAnswerEqualityLLMJudgeScorer().identifier,\n ],\n });\n }\n}\n","import { MaybePromise, Prompt, PromptResponse, PromptScore } from \"@/types\";\n\n/**\n * Abstract Registry class\n *\n * A Registry implementation is responsible from sending, receiving and doing\n * other operations with an external service such as a remote server.\n */\nexport abstract class AbstractRegistry {\n /**\n * The unique identifier of the Registry.\n */\n abstract readonly identifier: string;\n\n /**\n * Uploads the given prompts to the Registry.\n *\n * @returns the number of prompts uploaded\n */\n abstract uploadPrompts(\n prompts: Prompt[],\n options?: Record<string, any>\n ): MaybePromise<number>;\n\n /**\n * Uploads the given responses to the Registry.\n *\n * @returns the number of responses uploaded\n */\n abstract uploadResponses(\n responses: PromptResponse[],\n options?: Record<string, any>\n ): MaybePromise<number>;\n\n /**\n * Uploads the given scores to the Registry.\n *\n * @returns the number of scores uploaded\n */\n abstract uploadScores(\n scores: PromptScore[],\n options?: Record<string, any> & {\n /**\n * Whether to include the response and prompt data in the scores\n */\n includeData?: boolean;\n }\n ): MaybePromise<number>;\n}\n","import {\n Prompt,\n PromptResponse,\n PromptScore,\n PromptResponseSchema,\n} from \"@/types\";\nimport { AbstractRegistry } from \"./abstract/abstract-registry\";\nimport { createClient, Session, SupabaseClient } from \"@supabase/supabase-js\";\nimport { sleep } from \"@/utils/sleep\";\nimport { Account } from \"viem\";\nimport { calculateSHA256, calculateCID, stableStringify } from \"@/utils\";\nimport axios from \"axios\";\n\n/**\n * Registry implementation for peerBench server\n */\nexport class PeerBenchRegistry extends AbstractRegistry {\n // TODO: Find a better way to force sub classes to define a static identifier\n // Static accessor for the identifier\n static readonly identifier = \"peerbench\";\n readonly identifier = PeerBenchRegistry.identifier;\n\n private token?: string;\n private supabaseClient?: SupabaseClient;\n private apiURL: string;\n private session: Session | null = null;\n private readonly email?: string;\n private readonly password?: string;\n private readonly authMethod?: \"token\" | \"cookie\";\n private refreshTokenInterval?: NodeJS.Timeout;\n private isRefreshingToken = false;\n private isClosed = false;\n private isInitialized = false;\n private tokenRefresher: boolean;\n\n constructor(options: PeerBenchRegistryOptions) {\n super();\n\n this.tokenRefresher = options.tokenRefresher ?? false;\n this.authMethod = options.authMethod ?? \"token\";\n this.apiURL = options.peerbenchApiURL;\n\n if (options.authMethod === \"token\" || options.authMethod === undefined) {\n this.supabaseClient = createClient(\n options.peerbenchSupabaseURL,\n options.peerbenchSupabaseAnonKey\n );\n\n this.email = options.email;\n this.password = options.password;\n }\n }\n\n async uploadPrompts(prompts: Prompt[], options: UploadPromptsOptions) {\n if (prompts.length === 0) {\n return 0;\n }\n\n await this.init();\n\n // Sign each Prompt if the account is provided\n const account = options?.account;\n if (account && account.signMessage) {\n prompts = await Promise.all(\n prompts.map(async (prompt) => {\n const promptWithSignature: typeof prompt & SignatureFields = {\n ...prompt,\n };\n\n const promptStringified = stableStringify(prompt)!;\n const hash = await calculateCID(promptStringified).then((c) =>\n c.toString()\n );\n const signature = await account.signMessage({\n message: hash,\n });\n\n promptWithSignature.signature = signature;\n promptWithSignature.publicKey = account.address;\n promptWithSignature.signatureType = \"cid\";\n promptWithSignature.keyType = \"secp256k1n\";\n\n return promptWithSignature;\n })\n );\n }\n\n const res = await axios.post(\n `${this.apiURL}/api/v2/prompts`,\n {\n promptSetId: options.promptSetId,\n prompts,\n },\n {\n withCredentials: this.authMethod === \"cookie\",\n headers: {\n Authorization:\n this.authMethod === \"token\" ? `Bearer ${this.token}` : undefined,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (res.status !== 200) {\n throw new Error(\n `Failed to upload Prompts: ${res?.data?.message || JSON.stringify(res?.data || \"No response available\")}`\n );\n }\n\n return prompts.length;\n }\n\n async uploadResponses(\n responses: PromptResponse[],\n options?: UploadResponsesOptions\n ): Promise<number> {\n if (responses.length === 0) {\n return 0;\n }\n\n await this.init();\n\n // Sign each Response if the account is provided\n const account = options?.account;\n if (account && account.signMessage) {\n responses = await Promise.all(\n responses.map(async (response) => {\n const responseWithSignature: typeof response & SignatureFields = {\n ...response,\n };\n\n const responseStringified = stableStringify(response)!;\n const hash = await calculateCID(responseStringified).then((c) =>\n c.toString()\n );\n const signature = await account.signMessage({\n message: hash,\n });\n\n responseWithSignature.signature = signature;\n responseWithSignature.publicKey = account.address;\n responseWithSignature.signatureType = \"cid\";\n responseWithSignature.keyType = \"secp256k1n\";\n\n return responseWithSignature;\n })\n );\n }\n\n // Submit the responses directly to v2 API\n const res = await axios.post(\n `${this.apiURL}/api/v2/responses`,\n { responses },\n {\n withCredentials: this.authMethod === \"cookie\",\n headers: {\n Authorization:\n this.authMethod === \"token\" ? `Bearer ${this.token}` : undefined,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (res.status !== 200) {\n throw new Error(\n `Failed to upload Responses: ${res?.data?.message || JSON.stringify(res?.data || \"No response available\")}`\n );\n }\n\n return responses.length;\n }\n\n async uploadScores(\n scores: PromptScore[],\n options?: UploadScoresOptions\n ): Promise<number> {\n if (scores.length === 0) {\n return 0;\n }\n\n await this.init();\n\n // Calculate hash registrations for each Score\n scores = await Promise.all(\n scores.map(async (score) => {\n if (!score.prompt) {\n throw new Error(\"Score must have a prompt for hash registration\");\n }\n if (!score.data) {\n throw new Error(\"Score must have data for hash registration\");\n }\n\n // Calculate prompt hash registrations\n const promptStringified = stableStringify(score.prompt)!;\n const promptHashSha256Registration =\n await calculateSHA256(promptStringified);\n const promptHashCIDRegistration = await calculateCID(\n promptStringified\n ).then((c) => c.toString());\n\n // Calculate response hash registrations\n // Score object derives from Response so we can easily extract the Response object using Zod schema\n const responseObject = PromptResponseSchema.parse(score);\n const responseStringified = stableStringify(responseObject)!;\n const responseHashSha256Registration =\n await calculateSHA256(responseStringified);\n const responseHashCIDRegistration = await calculateCID(\n responseStringified\n ).then((c) => c.toString());\n\n const scoreWithRegistration: typeof score &\n ScoreHashRegistrations &\n SignatureFields = {\n ...score,\n responseHashSha256Registration,\n responseHashCIDRegistration,\n promptHashSha256Registration,\n promptHashCIDRegistration,\n };\n\n // Sign the score if account is provided\n if (options?.account && options.account.signMessage) {\n const scoreStringified = stableStringify(score)!;\n const hash = await calculateCID(scoreStringified).then((c) =>\n c.toString()\n );\n const signature = await options.account.signMessage({\n message: hash,\n });\n\n scoreWithRegistration.signature = signature;\n scoreWithRegistration.publicKey = options.account.address;\n scoreWithRegistration.signatureType = \"cid\";\n scoreWithRegistration.keyType = \"secp256k1n\";\n }\n\n return scoreWithRegistration;\n })\n );\n\n // Submit the scores directly to v2 API\n const res = await axios.post(\n `${this.apiURL}/api/v2/scores`,\n { scores },\n {\n withCredentials: this.authMethod === \"cookie\",\n headers: {\n Authorization:\n this.authMethod === \"token\" ? `Bearer ${this.token}` : undefined,\n \"Content-Type\": \"application/json\",\n },\n }\n );\n\n if (res.status !== 200) {\n throw new Error(\n `Failed to upload Scores: ${res?.data?.message || JSON.stringify(res?.data || \"No response available\")}`\n );\n }\n\n return scores.length;\n }\n\n /**\n * Clears the interval execution for refreshing the token.\n */\n async clearRefreshInterval() {\n this.isClosed = true;\n clearInterval(this.refreshTokenInterval!);\n }\n\n private async init() {\n if (this.isClosed || this.isInitialized || this.authMethod === \"cookie\") {\n return;\n }\n\n const authData = await this.login(this.email!, this.password!);\n\n this.session = authData?.session || null;\n this.token = this.session?.access_token;\n\n if (!this.token) {\n throw new Error(\n `Failed authentication with peerBench: No token received`\n );\n }\n\n if (this.tokenRefresher) {\n // Refresh the token 15 minutes before it expires\n this.refreshTokenInterval = setInterval(\n () => this.refreshToken(),\n (this.session!.expires_in - 15 * 60) * 1000\n );\n }\n\n this.isInitialized = true;\n }\n\n /**\n * Refreshes the token if it is about to expire.\n */\n private async refreshToken() {\n if (this.isClosed || this.authMethod === \"cookie\") {\n return;\n }\n\n if (this.isRefreshingToken) {\n // Interval is already set\n return;\n }\n\n this.isRefreshingToken = true;\n while (!this.isClosed) {\n try {\n const { data, error } = await this.supabaseClient!.auth.refreshSession(\n this.session || undefined\n );\n if (error) {\n throw new Error(error.message);\n }\n\n this.session = data.session;\n this.token = this.session?.access_token;\n break;\n } catch (err) {\n console.error(`PeerBenchRegistry: Failed to refresh token`, err);\n console.error(`PeerBenchRegistry: Retrying in 10 seconds`);\n await sleep(10_000);\n }\n }\n this.isRefreshingToken = false;\n }\n\n private async login(email: string, password: string) {\n const { data, error } = await this.supabaseClient!.auth.signInWithPassword({\n email,\n password,\n });\n\n if (error) {\n throw new Error(`Failed login to peerBench: ${error.message}`);\n }\n\n if (!data.session) {\n throw new Error(`No session returned from peerBench authentication`);\n }\n\n return data;\n }\n}\n\nexport type PeerBenchRegistryOptionsBase = {\n peerbenchApiURL: string;\n\n /**\n * If you are using this instance in a browser environment, you can\n * use `cookie` approach to authenticate requests. In this case the\n * user must be logged in via Supabase auth.\n * @default \"token\"\n */\n authMethod?: \"token\" | \"cookie\";\n\n /**\n * Supabase tokens must be refreshed periodically.\n * But if the class usage is short-lived, it's not necessary to start\n * a background interval for refreshing the token.\n * @default false\n */\n tokenRefresher?: boolean;\n\n peerbenchSupabaseURL?: string;\n peerbenchSupabaseAnonKey?: string;\n email?: string;\n password?: string;\n};\n\nexport type PeerBenchRegistryOptions =\n | (PeerBenchRegistryOptionsBase & {\n authMethod?: \"token\";\n tokenRefresher?: boolean;\n peerbenchSupabaseURL: string;\n peerbenchSupabaseAnonKey: string;\n email: string;\n password: string;\n })\n | (PeerBenchRegistryOptionsBase & {\n authMethod: \"cookie\";\n tokenRefresher?: never;\n peerbenchSupabaseURL?: never;\n peerbenchSupabaseAnonKey?: never;\n email?: never;\n password?: never;\n });\n\n/**\n * Signature fields that can be added to prompts, responses, or scores\n * when signing with an account.\n */\nexport type SignatureFields = {\n signature?: string;\n publicKey?: string;\n signatureType?: \"sha256\" | \"cid\";\n keyType?: \"secp256k1n\";\n};\n\n/**\n * Hash registration fields required for score uploads\n */\nexport type ScoreHashRegistrations = {\n responseHashSha256Registration: string;\n responseHashCIDRegistration: string;\n promptHashSha256Registration: string;\n promptHashCIDRegistration: string;\n};\n\n/**\n * Options for uploading prompts\n */\nexport type UploadPromptsOptions = {\n promptSetId: number;\n account?: Account;\n};\n\n/**\n * Options for uploading responses\n */\nexport type UploadResponsesOptions = {\n account?: Account;\n};\n\n/**\n * Options for uploading scores\n */\nexport type UploadScoresOptions = {\n account?: Account;\n};\n","import { MaybePromise, Prompt, PromptResponse, PromptScore } from \"@/types\";\n\nexport abstract class AbstractParser {\n /**\n * String identifier of the parser. Must be\n * set to distunguish the parser from the others.\n */\n static readonly identifier: string = \"\";\n\n /**\n * Parses the given file\n */\n abstract parseFile(path: string): MaybePromise<ParseResult>;\n\n /**\n * Parses the given buffer or string\n */\n abstract parseContent(\n content: string | Uint8Array\n ): MaybePromise<ParseResult>;\n\n /**\n * Returns the identifier of the parser.\n */\n getIdentifier(): string | undefined {\n // The identifier can be defined either as a static class property or an instance property.\n // Recommended way is to define it as a static class property so we can access it without creating an instance.\n return (this.constructor as any)?.identifier || (this as any)?.identifier;\n }\n}\n\nexport type ParseResult = {\n prompts: Prompt[];\n responses: PromptResponse[];\n scores: PromptScore[];\n};\n","import { bufferToString, parseJSONL, readFile, tryParseJson } from \"@/utils\";\nimport { AbstractParser, ParseResult } from \"./abstract-parser\";\nimport { InvalidDataError } from \"@/errors/parser\";\nimport { MaybePromise, Prompt, PromptResponse, PromptScore } from \"@/types\";\n\n/**\n * Generic parser for the contents that formatted as JSON or JSONL array of objects.\n *\n * It uses the given builder functions to build the Prompt, Response,\n * and Score objects for the each object from the data that is parsed from the file/content.\n *\n * It also prevents having same Prompts with different IDs using the\n * `fullPrompt` CID calculation of the produced Prompt objects.\n */\nexport class GenericArrayParser extends AbstractParser {\n static readonly identifier: string = \"generic-array\";\n\n private promptBuilder: GenericArrayParserPromptBuilder;\n private responseBuilder?: GenericArrayParserResponseBuilder;\n private scoreBuilder?: GenericArrayParserScoreBuilder;\n constructor(options: {\n promptBuilder: GenericArrayParserPromptBuilder;\n responseBuilder?: GenericArrayParserResponseBuilder;\n scoreBuilder?: GenericArrayParserScoreBuilder;\n }) {\n super();\n this.promptBuilder = options.promptBuilder;\n this.responseBuilder = options.responseBuilder;\n this.scoreBuilder = options.scoreBuilder;\n }\n\n async parseFile(path: string): Promise<ParseResult> {\n const content = await readFile(path);\n return this.parseContent(content);\n }\n\n async parseContent(content: string | Uint8Array): Promise<ParseResult> {\n let data: unknown[] | undefined;\n\n // Convert ArrayBuffer to string if needed\n const contentString =\n typeof content === \"string\" ? content : bufferToString(content);\n\n // Try to parse it as JSON or JSONL\n data = tryParseJson(contentString);\n if (!data) {\n data = parseJSONL(contentString);\n }\n\n if (!data || !Array.isArray(data) || data.length === 0) {\n throw new InvalidDataError();\n }\n\n const includedPromptCIDs: Record<string, string> = {};\n const includedResponseDIDs: Record<string, string> = {};\n const includedScoreDIDs: Record<string, string> = {};\n const result: ParseResult = {\n prompts: [],\n responses: [],\n scores: [],\n };\n\n for (const item of data) {\n const prompt = await this.promptBuilder(item, { result });\n let response: PromptResponse | undefined;\n let score: PromptScore | undefined;\n\n if (prompt) {\n // Only add this Prompt object to the result if the `fullPrompt` is not produced before.\n if (!includedPromptCIDs[prompt.fullPrompt.cid]) {\n includedPromptCIDs[prompt.fullPrompt.cid] = prompt.did;\n result.prompts.push(prompt);\n }\n }\n\n if (this.responseBuilder) {\n response = await this.responseBuilder(item, { result, prompt });\n if (response) {\n // If the Prompt used in the Response object is already produced before,\n // use that object. This prevents having the same Prompt with different properties\n // within the Response objects.\n if (includedPromptCIDs[response.prompt.fullPrompt.cid]) {\n const cid = response.prompt.fullPrompt.cid;\n response.prompt = result.prompts.find(\n (p) => p.fullPrompt.cid === cid\n )!;\n }\n\n // Only add this Response object if it is not in the result array yet.\n if (!includedResponseDIDs[response.did]) {\n includedResponseDIDs[response.did] = response.did;\n result.responses.push(response);\n }\n }\n }\n\n if (this.scoreBuilder) {\n score = await this.scoreBuilder(item, { result, prompt, response });\n if (score) {\n // Same as Response object. But this time we need to also check if\n // the Score object is including some info about the Prompt\n // since they are allowed to not to include Prompt info at all.\n if (score.prompt && includedPromptCIDs[score.prompt.fullPrompt.cid]) {\n const cid = score.prompt.fullPrompt.cid;\n score.prompt = result.prompts.find(\n (p) => p.fullPrompt.cid === cid\n )!;\n }\n\n // Only add this Score object if it is not in the result array yet.\n if (!includedScoreDIDs[score.did]) {\n includedScoreDIDs[score.did] = score.did;\n result.scores.push(score);\n }\n }\n }\n }\n\n return result;\n }\n}\n\nexport type GenericArrayParserPromptBuilder = (\n data: any,\n context: {\n result: ParseResult;\n }\n) => MaybePromise<Prompt | undefined>;\nexport type GenericArrayParserResponseBuilder = (\n data: any,\n context: {\n result: ParseResult;\n\n /**\n * The generated Prompt object for the current item if there is one.\n */\n prompt?: Prompt;\n }\n) => MaybePromise<PromptResponse | undefined>;\nexport type GenericArrayParserScoreBuilder = (\n data: any,\n context: {\n result: ParseResult;\n\n /**\n * The generated Prompt object for the current item if there is one.\n */\n prompt?: Prompt;\n\n /**\n * The generated Response object for the current item if there is one.\n */\n response?: PromptResponse;\n }\n) => MaybePromise<PromptScore | undefined>;\n","import { AbstractParser, ParseResult } from \"./abstract-parser\";\nimport { Prompt, PromptTypes } from \"@/types\";\nimport { parquetReadObjects } from \"hyparquet\";\nimport { z } from \"zod\";\nimport { readFile } from \"@/utils/file\";\nimport { bufferToString } from \"@/utils/string\";\nimport { parseJSONL, tryParseJson } from \"@/utils/json\";\nimport { InvalidDataError, ParserIsNotCompatibleError } from \"@/errors/parser\";\nimport { preparePrompt } from \"@/utils/prompt\";\nimport { buildPrompt } from \"@/utils/builder\";\n\nconst MedQAPromptObjectSchema = z.object({\n question: z.string(),\n options: z.record(z.string(), z.string()),\n answer: z.string(),\n answer_idx: z.string(),\n meta_info: z.string().optional(),\n});\n\nexport class MedQAParser extends AbstractParser {\n static readonly identifier = \"medqa\";\n\n async parseFile(path: string) {\n const content = await readFile(path);\n return this.parseContent(content);\n }\n\n async parseContent(content: string | Uint8Array): Promise<ParseResult> {\n let data: unknown[] | undefined;\n\n // Try to parse as Parquet first if it's an ArrayBuffer\n if (content instanceof ArrayBuffer) {\n try {\n data = await parquetReadObjects({ file: content });\n } catch {\n // Not a valid Parquet file, continue with other formats\n }\n }\n\n // If not Parquet or parsing failed, try other formats\n if (!data) {\n // Convert ArrayBuffer to string if needed\n const contentString =\n typeof content === \"string\" ? content : bufferToString(content);\n\n // Try to parse it as JSON or JSONL\n data = tryParseJson(contentString);\n if (!data) {\n data = parseJSONL(contentString);\n }\n }\n\n if (!data || data.length == 0) {\n throw new InvalidDataError();\n }\n\n const prompts: Prompt[] = [];\n const validation = z.array(MedQAPromptObjectSchema).safeParse(data);\n\n if (!validation.success) {\n throw new ParserIsNotCompatibleError();\n }\n const validatedData = validation.data;\n\n let rowNumber = 0;\n // Parse prompts\n for (const rawPrompt of validatedData) {\n const fullPrompt = preparePrompt(rawPrompt.question, rawPrompt.options);\n prompts.push(\n await buildPrompt({\n options: rawPrompt.options,\n question: rawPrompt.question,\n type: PromptTypes.MultipleChoice,\n answer: rawPrompt.answer,\n answerKey: rawPrompt.answer_idx,\n fullPrompt,\n metadata: {\n medqaCategory: rawPrompt.meta_info,\n rowNumberInSource: rowNumber,\n },\n })\n );\n rowNumber++;\n }\n\n return {\n prompts,\n responses: [],\n scores: [],\n };\n }\n}\n","import { AbstractParser, ParseResult } from \"@/parsers/abstract-parser\";\nimport { Prompt, PromptTypes } from \"@/types\";\nimport { parquetReadObjects } from \"hyparquet\";\nimport { z } from \"zod\";\nimport { readFile } from \"@/utils/file\";\nimport { bufferToString } from \"@/utils/string\";\nimport { parseJSONL, tryParseJson } from \"@/utils/json\";\nimport { InvalidDataError, ParserIsNotCompatibleError } from \"@/errors/parser\";\nimport { preparePrompt } from \"@/utils/prompt\";\nimport { buildPrompt } from \"@/utils/builder\";\n\nconst MMLUProTaskZodSchema = z.object({\n question_id: z.coerce.number(),\n question: z.string(),\n options: z.array(z.string()),\n answer: z.string(),\n answer_index: z.coerce.number(),\n cot_content: z.string(),\n category: z.string(),\n src: z.string(),\n});\n\nexport class MMLUProParser extends AbstractParser {\n static readonly identifier = \"mmlu-pro\";\n\n async parseFile(path: string) {\n const content = await readFile(path);\n return this.parseContent(content);\n }\n\n async parseContent(content: string | Uint8Array): Promise<ParseResult> {\n let data: unknown[] | undefined;\n\n // Try to parse as Parquet first if it's an ArrayBuffer\n if (content instanceof ArrayBuffer) {\n try {\n data = await parquetReadObjects({ file: content });\n } catch {\n // Not a valid Parquet file, continue with other formats\n }\n }\n\n // If not Parquet or parsing failed, try other formats\n if (!data) {\n // Convert ArrayBuffer to string if needed\n const contentString =\n typeof content === \"string\" ? content : bufferToString(content);\n\n // Try to parse it as JSON or JSONL\n data = tryParseJson(contentString);\n if (!data) {\n data = parseJSONL(contentString);\n }\n }\n\n if (!data || data.length == 0) {\n throw new InvalidDataError();\n }\n\n const prompts: Prompt[] = [];\n const validation = z.array(MMLUProTaskZodSchema).safeParse(data);\n\n if (!validation.success) {\n throw new ParserIsNotCompatibleError();\n }\n\n const validatedData = validation.data;\n\n let rowNumber = 0;\n // Parse prompts\n for (const rawPrompt of validatedData) {\n // Convert options array to record\n const options: Record<string, string> = {};\n let answerKey = \"\";\n\n for (let i = 0; i < rawPrompt.options.length; i++) {\n const option = rawPrompt.options[i];\n const letter = String.fromCharCode(65 + i);\n options[letter] = option;\n\n // Get the answer letter\n if (i === rawPrompt.answer_index) {\n answerKey = letter;\n }\n }\n\n const fullPrompt = preparePrompt(rawPrompt.question, options);\n prompts.push(\n await buildPrompt({\n options,\n question: rawPrompt.question,\n answerKey,\n answer: rawPrompt.options[rawPrompt.answer_index],\n fullPrompt,\n type: PromptTypes.MultipleChoice,\n metadata: {\n mmluProCategory: rawPrompt.category,\n rowNumberInSource: rowNumber,\n mmluProQuestionId: rawPrompt.question_id,\n mmluProCotContent: rawPrompt.cot_content,\n mmluProSource: rawPrompt.src,\n },\n })\n );\n\n rowNumber++;\n }\n\n return {\n prompts,\n responses: [],\n scores: [],\n };\n }\n}\n","import { PromptResponseSchema, PromptSchema, PromptScoreSchema } from \"@/types\";\nimport { GenericArrayParser } from \"./generic-array\";\nimport { InvalidDataError } from \"@/errors\";\n\n/**\n * Parser for the standard PeerBench format.\n *\n * The given data must be formatted as JSON or JSONL array of objects.\n *\n * Each object can be one of the following:\n * - Prompt,\n * - Response,\n * - Score\n *\n * Prompts that are included within the Response or Score objects are counted as Prompts in the result (deduplicated).\n */\nexport class PBParser extends GenericArrayParser {\n static readonly identifier: string = \"pb\";\n\n constructor() {\n super({\n promptBuilder: (data) => {\n const promptValidation = PromptSchema.safeParse(data);\n\n // If the object is not a Prompt but a Response, then we can extract the Prompt data from it.\n if (!promptValidation.success) {\n // We only try Response object since if we are going to extract Prompt data from it,\n // we would need to full Prompt object. Score objects may not include the full Prompt data\n // but the same Response schema works for them too since Score type inherits from the Response.\n const responseValidation = PromptResponseSchema.safeParse(data);\n\n if (!responseValidation.success) {\n return;\n }\n\n return responseValidation.data.prompt;\n }\n\n return promptValidation.data;\n },\n responseBuilder: (data) => PromptResponseSchema.safeParse(data).data,\n scoreBuilder: (data, context) => {\n const validation = PromptScoreSchema.safeParse(data);\n\n if (!validation.success) {\n // If none of the objects were parsed (including Score object), that means the data wasn't in a format that we can parse\n if (!context.prompt && !context.response) {\n throw new InvalidDataError();\n }\n\n // Otherwise just ignore this item since it is not a valid Score object (but it was parsed as a Response or Prompt)\n return;\n }\n\n return validation.data;\n },\n });\n }\n}\n","import { AbstractParser } from \"./abstract-parser\";\nimport { MedQAParser } from \"./medqa\";\nimport { MMLUProParser } from \"./mmlu-pro\";\nimport { PBParser } from \"./pb\";\n\n/**\n * Parser class for automatically detect and parse the data\n * with the appropriate parser.\n */\nexport class DataParser {\n static parsers: Map<string, AbstractParser> = new Map();\n\n static {\n const medqa = new MedQAParser();\n this.parsers.set(MedQAParser.identifier, medqa);\n\n const mmluPro = new MMLUProParser();\n this.parsers.set(MMLUProParser.identifier, mmluPro);\n\n const pb = new PBParser();\n this.parsers.set(PBParser.identifier, pb);\n\n // TODO: Add more default parsers here\n }\n\n /**\n * Tries to parse data from a file path with one of the available parsers.\n * @example\n * ```typescript\n * const { result, parser } = await DataParser.parseFile(\"path/to/file.json\");\n * ```\n */\n static async parseFile(path: string) {\n if (typeof window === \"undefined\") {\n const { statSync } = await import(\"node:fs\");\n\n if (!statSync(path, { throwIfNoEntry: false })?.isFile()) {\n throw new Error(`File does not exist: ${path}`);\n }\n\n for (const parser of this.parsers.values()) {\n try {\n return {\n result: await parser.parseFile(path),\n parser,\n };\n } catch {\n continue;\n }\n }\n throw new Error(`No parser could parse the file: ${path}`);\n } else {\n throw new Error(\n \"File system operations are not supported in browser environment. Use `parseContent` instead.\"\n );\n }\n }\n\n /**\n * Tries to parse data from a string or ArrayBuffer content with one of the available parsers.\n * @example\n * ```typescript\n * // With string content\n * const { result, parser } = await DataParser.parseContent('{\"question\": \"What is...\", ...}');\n *\n * // With file upload in browser\n * const file = event.target.files[0];\n * const content = await file.arrayBuffer();\n * const { result, parser } = await DataParser.parseContent(content);\n * ```\n */\n static async parseContent(content: string | Uint8Array) {\n for (const parser of this.parsers.values()) {\n try {\n return {\n result: await parser.parseContent(content),\n parser,\n };\n } catch {\n continue;\n }\n }\n throw new Error(\"No parser could parse the content\");\n }\n}\n","export const MULTIPLE_CHOICE_SYSTEM_PROMPT = `Your explanation can't be longer than 400 tokens. The last sentence must be formatted as one of the following:\n- The answer is <answer letter>\n- The answer is **<answer letter>**\n- <answer letter>: ...\n- <answer letter>) ...\nReplace <answer letter> with the letter of your chosen answer.\n\nUse the following string as your last sentence if you are not capable of answering the question:\n<!NO ANSWER!>`;\n\nexport const SENTENCE_REORDER_SYSTEM_PROMPT =\n \"Your task is ordering the given sentences (each line is a sentence) in a correct order. Your output must be formatted as the input but with the sentences in the correct order. Markdown formatting is forbidden.\";\n\nexport const TEXT_REPLACEMENT_SYSTEM_PROMPT =\n \"Your task is placing all the entities that are provided in the ENTITIES section to the input text in a correct order. Your output only and only includes the modified text, nothing else. It is forbidden to modify anything else from the input text. Markdown formatting is forbidden too.\";\n\nexport const TYPO_SYSTEM_PROMPT =\n \"Your task is to find all the typos in the given text. Your output must include the corrected text, nothing else.\";\n\nexport const OPEN_ENDED_SYSTEM_PROMPT =\n \"You are a knowledgeable expert. Please provide a clear, accurate, short and well-reasoned answer to the following question. Be concise but comprehensive in your response. Your answer must be short and clear with less than 20 words\";\n"],"mappings":"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","names":["z","json","z","z","z","cheerio","uuidv7","uuidv7","z","z","z","z","uuidv7","uuidv7","z","uuidv7","z","uuidv7","z","uuidv7","z","json","z","z","z","axios","z","z","parquetReadObjects","z","z","parquetReadObjects"]}
1
+ {"version":3,"sources":["../src/errors/polyfill.ts","../src/errors/peerbench.ts"],"sourcesContent":["// This is an internal polyfill that is used by custom Error classes\n// to make them work in both Node.js and browser environments.\n\nexport function captureStackTrace(\n error: Error,\n // eslint-disable-next-line @typescript-eslint/no-unsafe-function-type\n constructor: Function\n) {\n if (typeof window === \"undefined\") {\n Error.captureStackTrace(error, constructor);\n } else {\n error.stack = new Error(error.message).stack;\n }\n}\n","import { captureStackTrace } from \"./polyfill\";\n\nexport class PeerbenchError extends Error {\n code: number;\n\n constructor(message?: string, options?: ErrorOptions & { code: number }) {\n super(message, options);\n this.code = options?.code ?? 0;\n captureStackTrace(this, this.constructor);\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAGO,SAAS,kBACd,OAEA,aACA;AACA,MAAI,OAAO,WAAW,aAAa;AACjC,UAAM,kBAAkB,OAAO,WAAW;AAAA,EAC5C,OAAO;AACL,UAAM,QAAQ,IAAI,MAAM,MAAM,OAAO,EAAE;AAAA,EACzC;AACF;;;ACXO,IAAM,iBAAN,cAA6B,MAAM;AAAA,EACxC;AAAA,EAEA,YAAY,SAAkB,SAA2C;AACvE,UAAM,SAAS,OAAO;AACtB,SAAK,OAAO,SAAS,QAAQ;AAC7B,sBAAkB,MAAM,KAAK,WAAW;AAAA,EAC1C;AACF;","names":[]}