peerbench 0.0.10 → 0.0.12

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 (69) hide show
  1. package/README.md +71 -58
  2. package/dist/benchmarks/examples/echo-basic/runner.d.ts +11 -254
  3. package/dist/benchmarks/examples/echo-basic/schema-sets/echo.v1.d.ts +25 -25
  4. package/dist/benchmarks/examples/exact-match-scorer/runner.d.ts +38 -386
  5. package/dist/benchmarks/examples/exact-match-scorer/schema-sets/exact-match.v1.d.ts +25 -25
  6. package/dist/benchmarks/examples/text-transform/runner.d.ts +32 -480
  7. package/dist/benchmarks/examples/text-transform/schema-sets/echo.v1.d.ts +25 -25
  8. package/dist/benchmarks/examples/text-transform/schema-sets/reverse.v1.d.ts +25 -25
  9. package/dist/benchmarks/index.js +180 -248
  10. package/dist/benchmarks/index.js.map +1 -1
  11. package/dist/benchmarks/peerbench/index.d.ts +2 -1
  12. package/dist/benchmarks/peerbench/mcq-runner.d.ts +78 -0
  13. package/dist/benchmarks/peerbench/qa-runner.d.ts +77 -0
  14. package/dist/benchmarks/peerbench/schema-sets/mcq.v1.d.ts +25 -25
  15. package/dist/benchmarks/peerbench/schema-sets/multi-turn.v1.d.ts +25 -25
  16. package/dist/benchmarks/peerbench/schema-sets/qa.v1.d.ts +25 -25
  17. package/dist/chunk-6WDCU5BP.js +9 -0
  18. package/dist/chunk-6WDCU5BP.js.map +1 -0
  19. package/dist/{chunk-YY33MNMV.js → chunk-7KMGLEYP.js} +2 -2
  20. package/dist/{chunk-TRNCF2BG.js → chunk-HBGC6BDW.js} +1 -1
  21. package/dist/chunk-HBGC6BDW.js.map +1 -0
  22. package/dist/{chunk-HMQYGCKI.js → chunk-ZJWSK4VO.js} +1 -1
  23. package/dist/chunk-ZJWSK4VO.js.map +1 -0
  24. package/dist/dev.d.ts +22 -0
  25. package/dist/helpers/define-runner.d.ts +2 -45
  26. package/dist/index.js +2 -2
  27. package/dist/providers/ai-sdk.d.ts +24 -0
  28. package/dist/providers/callables/callable.d.ts +4 -0
  29. package/dist/providers/callables/llm.d.ts +41 -0
  30. package/dist/providers/example/echo.d.ts +12 -11
  31. package/dist/providers/example/restapi.d.ts +11 -18
  32. package/dist/providers/index.d.ts +4 -2
  33. package/dist/providers/index.js +380 -9
  34. package/dist/providers/index.js.map +1 -1
  35. package/dist/providers/mastra.d.ts +16 -21
  36. package/dist/providers/openai.d.ts +25 -10
  37. package/dist/providers/openrouter.d.ts +6 -8
  38. package/dist/schemas/extensions/index.js +1 -1
  39. package/dist/schemas/extensions/response/llm.d.ts +17 -0
  40. package/dist/schemas/index.js +2 -2
  41. package/dist/schemas/llm/index.js +36 -7
  42. package/dist/schemas/llm/index.js.map +1 -1
  43. package/dist/schemas/llm/simple-system-prompt.d.ts +3 -3
  44. package/dist/schemas/llm/system-prompt.d.ts +7 -7
  45. package/dist/schemas/response.d.ts +7 -7
  46. package/dist/schemas/schema-definer.d.ts +5 -5
  47. package/dist/schemas/score.d.ts +7 -7
  48. package/dist/schemas/test-case.d.ts +7 -7
  49. package/dist/scorers/abstract.d.ts +1 -1
  50. package/dist/scorers/index.js +377 -7
  51. package/dist/scorers/index.js.map +1 -1
  52. package/dist/scorers/llm-judge.d.ts +6 -6
  53. package/dist/types/index.d.ts +0 -5
  54. package/dist/types/runner.d.ts +13 -17
  55. package/package.json +8 -7
  56. package/dist/benchmarks/peerbench/runner.d.ts +0 -754
  57. package/dist/chunk-3JHDJEY3.js +0 -374
  58. package/dist/chunk-3JHDJEY3.js.map +0 -1
  59. package/dist/chunk-HMQYGCKI.js.map +0 -1
  60. package/dist/chunk-Q6GSOHOP.js +0 -44
  61. package/dist/chunk-Q6GSOHOP.js.map +0 -1
  62. package/dist/chunk-RTEAK4II.js +0 -37
  63. package/dist/chunk-RTEAK4II.js.map +0 -1
  64. package/dist/chunk-SMLNDQFX.js +0 -244
  65. package/dist/chunk-SMLNDQFX.js.map +0 -1
  66. package/dist/chunk-TRNCF2BG.js.map +0 -1
  67. package/dist/providers/abstract/llm.d.ts +0 -20
  68. /package/dist/{chunk-YY33MNMV.js.map → chunk-7KMGLEYP.js.map} +0 -0
  69. /package/dist/providers/{abstract/provider.d.ts → abstract.d.ts} +0 -0
@@ -1,15 +1,386 @@
1
1
  import {
2
- AbstractLLMProvider,
3
- AbstractProvider,
4
- MastraProvider,
5
- OpenAIProvider,
6
- OpenRouterProvider
7
- } from "../chunk-SMLNDQFX.js";
8
- import "../chunk-UHHHSYVE.js";
9
- import "../chunk-4UBK6452.js";
2
+ PEERBENCH_NAMESPACE
3
+ } from "../chunk-UHHHSYVE.js";
4
+ import {
5
+ RateLimiter
6
+ } from "../chunk-4UBK6452.js";
10
7
  import "../chunk-PZ5AY32C.js";
8
+
9
+ // src/providers/abstract.ts
10
+ var AbstractProvider = class {
11
+ kind;
12
+ constructor() {
13
+ this.kind = this.constructor.kind;
14
+ if (!this.kind)
15
+ throw new Error(
16
+ `${this.constructor.name} must define "static readonly kind" as a constant property.`
17
+ );
18
+ }
19
+ static withKind(kind) {
20
+ const base = this;
21
+ const derived = class extends base {
22
+ static kind = kind;
23
+ };
24
+ return derived;
25
+ }
26
+ };
27
+
28
+ // src/providers/mastra.ts
29
+ import { MastraClient } from "@mastra/client-js";
30
+ var MastraProvider = class extends AbstractProvider.withKind(
31
+ `${PEERBENCH_NAMESPACE}/llm/mastra`
32
+ ) {
33
+ endpoint;
34
+ authToken;
35
+ client;
36
+ constructor(params) {
37
+ super();
38
+ this.endpoint = params.endpoint;
39
+ this.authToken = params.authToken;
40
+ this.client = new MastraClient({
41
+ baseUrl: this.endpoint,
42
+ headers: this.authToken ? {
43
+ Authorization: `Bearer ${this.authToken}`
44
+ } : void 0
45
+ });
46
+ }
47
+ async getAgentInfo(args) {
48
+ return await this.client.getAgent(args.agentId).details(args.requestContext);
49
+ }
50
+ async getAgents(params) {
51
+ return this.client.listAgents(params?.requestContext, params?.partial);
52
+ }
53
+ agent(config) {
54
+ return {
55
+ slug: config.agentId,
56
+ provider: this,
57
+ forward: async (args) => {
58
+ const apiMessages = args.messages.filter((m) => m.role === "user" || m.role === "assistant").map((m) => ({
59
+ role: m.role,
60
+ content: String(m.content ?? "")
61
+ }));
62
+ const agent = this.client.getAgent(config.agentId);
63
+ const startedAt = Date.now();
64
+ const response = await agent.stream(
65
+ apiMessages,
66
+ {
67
+ providerOptions: config.providerOptions,
68
+ memory: config.memory,
69
+ requestContext: config.requestContext
70
+ }
71
+ );
72
+ let text = "";
73
+ let firstTokenAt;
74
+ let inputTokensUsed;
75
+ let outputTokensUsed;
76
+ const metadata = {};
77
+ await response.processDataStream({
78
+ onChunk: async (chunk) => {
79
+ if (chunk.type === "text-delta") {
80
+ if (firstTokenAt === void 0) {
81
+ firstTokenAt = Date.now();
82
+ }
83
+ const payload = chunk.payload;
84
+ text += payload.text ?? "";
85
+ }
86
+ if (chunk.type === "finish") {
87
+ const payload = chunk.payload;
88
+ inputTokensUsed = payload.output?.usage?.inputTokens;
89
+ outputTokensUsed = payload.output?.usage?.outputTokens;
90
+ }
91
+ }
92
+ });
93
+ return {
94
+ data: text,
95
+ startedAt,
96
+ completedAt: Date.now(),
97
+ inputTokensUsed,
98
+ outputTokensUsed,
99
+ timeToFirstToken: firstTokenAt !== void 0 ? firstTokenAt - startedAt : void 0,
100
+ metadata: Object.keys(metadata).length > 0 ? metadata : void 0
101
+ };
102
+ }
103
+ };
104
+ }
105
+ };
106
+
107
+ // src/providers/openai.ts
108
+ import OpenAI, { APIError } from "openai";
109
+ var OpenAIProvider = class extends AbstractProvider.withKind(
110
+ `${PEERBENCH_NAMESPACE}/llm/openai`
111
+ ) {
112
+ client;
113
+ rateLimiter;
114
+ maxRetries;
115
+ constructor(config) {
116
+ super();
117
+ this.maxRetries = config.maxRetries ?? 3;
118
+ this.rateLimiter = config.rateLimiter ?? new RateLimiter({
119
+ maxWeight: 20,
120
+ timeWindow: 3e3
121
+ });
122
+ this.client = new OpenAI({
123
+ baseURL: config.baseURL,
124
+ apiKey: config.apiKey,
125
+ timeout: config.timeout,
126
+ dangerouslyAllowBrowser: true
127
+ });
128
+ }
129
+ model(config) {
130
+ return {
131
+ slug: config.model,
132
+ provider: this,
133
+ forward: async (args) => {
134
+ let retryCount = this.maxRetries;
135
+ while (retryCount > 0) {
136
+ let startedAt = /* @__PURE__ */ new Date();
137
+ try {
138
+ const response = await this.rateLimiter.execute(
139
+ async () => {
140
+ startedAt = /* @__PURE__ */ new Date();
141
+ return await this.client.chat.completions.create(
142
+ {
143
+ model: config.model,
144
+ messages: args.messages,
145
+ temperature: args.temperature,
146
+ response_format: args.responseFormat
147
+ },
148
+ { signal: args.abortSignal }
149
+ );
150
+ },
151
+ { signal: args.abortSignal }
152
+ );
153
+ if ("error" in response) {
154
+ const err = response.error;
155
+ throw new Error(
156
+ `${err.message} - Code ${err.code} - ${JSON.stringify(err)}`
157
+ );
158
+ }
159
+ if (!response?.choices?.[0]?.message?.content) {
160
+ throw new Error("No content returned from the model");
161
+ }
162
+ return {
163
+ data: response.choices[0].message.content,
164
+ inputTokensUsed: response?.usage?.prompt_tokens,
165
+ outputTokensUsed: response?.usage?.completion_tokens,
166
+ startedAt: startedAt.getTime(),
167
+ completedAt: Date.now()
168
+ };
169
+ } catch (err) {
170
+ if (err instanceof APIError && err.status === 401) {
171
+ throw new Error(`Invalid credentials provided`, { cause: err });
172
+ }
173
+ retryCount--;
174
+ if (err instanceof SyntaxError) {
175
+ console.debug(err);
176
+ continue;
177
+ }
178
+ if (retryCount !== 0) {
179
+ continue;
180
+ }
181
+ throw new Error(
182
+ `Failed to forward prompt to the model: ${err instanceof Error ? err.message : err}`,
183
+ { cause: err }
184
+ );
185
+ }
186
+ }
187
+ throw new Error(
188
+ `Failed to forward prompt to the model: Max retries reached`,
189
+ { cause: new Error("Max retries reached") }
190
+ );
191
+ }
192
+ };
193
+ }
194
+ };
195
+
196
+ // src/providers/openrouter.ts
197
+ import Decimal from "decimal.js";
198
+ import axios from "axios";
199
+ var baseURL = "https://openrouter.ai/api/v1";
200
+ var MODELS_CACHE_TTL = 1e3 * 60 * 60 * 24;
201
+ var OpenRouterProvider = class extends AbstractProvider.withKind(
202
+ `${PEERBENCH_NAMESPACE}/llm/openrouter.ai`
203
+ ) {
204
+ models = void 0;
205
+ modelsCachePromise = Promise.resolve(void 0);
206
+ modelsUpdatedAt = 0;
207
+ openAIProvider;
208
+ constructor(config) {
209
+ super();
210
+ this.openAIProvider = new OpenAIProvider({
211
+ baseURL,
212
+ apiKey: config.apiKey,
213
+ maxRetries: config.maxRetries,
214
+ timeout: config.timeout,
215
+ rateLimiter: config.rateLimiter
216
+ });
217
+ }
218
+ model(config) {
219
+ const openAICallable = this.openAIProvider.model({ model: config.model });
220
+ this.updateModelsCache().catch(() => {
221
+ });
222
+ return {
223
+ slug: config.model,
224
+ provider: this,
225
+ forward: async (args) => {
226
+ const response = await openAICallable.forward(args);
227
+ const modelInfo = this.models?.data.find(
228
+ (m) => m.id === config.model
229
+ );
230
+ let inputCost = void 0;
231
+ let outputCost = void 0;
232
+ if (modelInfo !== void 0) {
233
+ if (response.inputTokensUsed !== void 0) {
234
+ inputCost = new Decimal(modelInfo.pricing.prompt).mul(response.inputTokensUsed).toFixed(10);
235
+ }
236
+ if (response.outputTokensUsed !== void 0) {
237
+ outputCost = new Decimal(modelInfo.pricing.completion).mul(response.outputTokensUsed).toFixed(10);
238
+ }
239
+ }
240
+ return { ...response, inputCost, outputCost };
241
+ }
242
+ };
243
+ }
244
+ async updateModelsCache() {
245
+ this.modelsCachePromise = this.modelsCachePromise.then(async () => {
246
+ if (this.models !== void 0 && Date.now() - this.modelsUpdatedAt < MODELS_CACHE_TTL) {
247
+ return this.models;
248
+ }
249
+ return axios.get(`${baseURL}/models`).then((res) => res.data).then((data) => {
250
+ data = {
251
+ data: data.data.filter(
252
+ (m) => m.architecture.input_modalities.includes("text") && m.architecture.output_modalities.includes("text") && ![
253
+ "morph/morph-v3-large",
254
+ "morph/morph-v3-fast",
255
+ "relace/relace-apply-3"
256
+ ].includes(m.id)
257
+ )
258
+ };
259
+ this.models = data;
260
+ this.modelsUpdatedAt = Date.now();
261
+ return data;
262
+ });
263
+ }).catch(() => void 0);
264
+ await this.modelsCachePromise;
265
+ }
266
+ };
267
+
268
+ // src/providers/ai-sdk.ts
269
+ import { generateText, streamText } from "ai";
270
+ function toModelMessages(messages) {
271
+ return messages.filter(
272
+ (m) => m.role === "system" || m.role === "user" || m.role === "assistant"
273
+ ).map((m) => ({
274
+ role: m.role,
275
+ content: typeof m.content === "string" ? m.content : JSON.stringify(m.content ?? "")
276
+ }));
277
+ }
278
+ var aiModuleCache = null;
279
+ async function buildOutputOption(responseFormat) {
280
+ if (!responseFormat || responseFormat.type === "text") {
281
+ return void 0;
282
+ }
283
+ if (!aiModuleCache) {
284
+ aiModuleCache = await import("ai");
285
+ }
286
+ const Output = aiModuleCache["Output"];
287
+ const jsonSchema = aiModuleCache["jsonSchema"];
288
+ if (!Output || !jsonSchema) {
289
+ return void 0;
290
+ }
291
+ if (responseFormat.type === "json_schema") {
292
+ return Output.object({
293
+ schema: jsonSchema(responseFormat.json_schema.schema)
294
+ });
295
+ }
296
+ if (responseFormat.type === "json_object") {
297
+ return Output.json();
298
+ }
299
+ return void 0;
300
+ }
301
+ var AISdkProvider = class extends AbstractProvider.withKind(
302
+ `${PEERBENCH_NAMESPACE}/llm/ai-sdk`
303
+ ) {
304
+ rateLimiter;
305
+ maxRetries;
306
+ constructor(config) {
307
+ super();
308
+ this.maxRetries = config?.maxRetries ?? 2;
309
+ this.rateLimiter = config?.rateLimiter ?? new RateLimiter({
310
+ maxWeight: 20,
311
+ timeWindow: 3e3
312
+ });
313
+ }
314
+ model(config) {
315
+ const slug = `${config.aiSdkModel.provider}/${config.aiSdkModel.modelId}`;
316
+ return {
317
+ slug,
318
+ provider: this,
319
+ forward: async (args) => {
320
+ const messages = toModelMessages(args.messages);
321
+ const output = await buildOutputOption(args.responseFormat);
322
+ const baseOptions = {
323
+ model: config.aiSdkModel,
324
+ messages,
325
+ temperature: args.temperature,
326
+ maxOutputTokens: args.maxTokens,
327
+ abortSignal: args.abortSignal,
328
+ maxRetries: this.maxRetries
329
+ };
330
+ if (config.stream) {
331
+ let startedAt2;
332
+ const result2 = await this.rateLimiter.execute(
333
+ async () => {
334
+ startedAt2 = Date.now();
335
+ return streamText({
336
+ ...baseOptions,
337
+ ...output !== void 0 ? { output } : {}
338
+ });
339
+ },
340
+ { signal: args.abortSignal }
341
+ );
342
+ let text = "";
343
+ let firstTokenAt;
344
+ for await (const chunk of result2.textStream) {
345
+ if (firstTokenAt === void 0) {
346
+ firstTokenAt = Date.now();
347
+ }
348
+ text += chunk;
349
+ }
350
+ const usage = await result2.usage;
351
+ return {
352
+ data: text,
353
+ startedAt: startedAt2,
354
+ completedAt: Date.now(),
355
+ inputTokensUsed: usage.inputTokens,
356
+ outputTokensUsed: usage.outputTokens,
357
+ timeToFirstToken: firstTokenAt !== void 0 ? firstTokenAt - startedAt2 : void 0
358
+ };
359
+ }
360
+ let startedAt;
361
+ const result = await this.rateLimiter.execute(
362
+ async () => {
363
+ startedAt = Date.now();
364
+ return generateText({
365
+ ...baseOptions,
366
+ ...output !== void 0 ? { output } : {}
367
+ });
368
+ },
369
+ { signal: args.abortSignal }
370
+ );
371
+ return {
372
+ data: result.text,
373
+ startedAt,
374
+ completedAt: Date.now(),
375
+ inputTokensUsed: result.usage.inputTokens,
376
+ outputTokensUsed: result.usage.outputTokens
377
+ };
378
+ }
379
+ };
380
+ }
381
+ };
11
382
  export {
12
- AbstractLLMProvider,
383
+ AISdkProvider,
13
384
  AbstractProvider,
14
385
  MastraProvider,
15
386
  OpenAIProvider,
@@ -1 +1 @@
1
- {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
1
+ {"version":3,"sources":["../../src/providers/abstract.ts","../../src/providers/mastra.ts","../../src/providers/openai.ts","../../src/providers/openrouter.ts","../../src/providers/ai-sdk.ts"],"sourcesContent":["export abstract class AbstractProvider {\n readonly kind: string;\n\n constructor() {\n this.kind = (this.constructor as any).kind;\n if (!this.kind)\n throw new Error(\n `${this.constructor.name} must define \"static readonly kind\" as a constant property.`\n );\n }\n static withKind<\n TKind extends string,\n TThis extends abstract new (...args: any[]) => AbstractProvider,\n >(this: TThis, kind: TKind) {\n const base = this as unknown as new (...args: any[]) => any;\n const derived = class extends base {\n static readonly kind: TKind = kind;\n declare readonly kind: TKind;\n };\n\n return derived as unknown as (new () => InstanceType<TThis> & {\n readonly kind: TKind;\n }) & {\n readonly kind: TKind;\n };\n }\n}\n\nexport type ProviderResponse<TData = unknown> = {\n startedAt: number;\n completedAt: number;\n data: TData;\n};\n","import { PEERBENCH_NAMESPACE } from \"@/constants\";\nimport { AbstractProvider } from \"./abstract\";\nimport {\n type CallableLLM,\n type LLMResponse,\n type CallableLLMForwardArgs,\n} from \"./callables/llm\";\nimport { MastraClient, type GetAgentResponse } from \"@mastra/client-js\";\nimport type { RequestContext } from \"@mastra/core/request-context\";\nimport { AgentMemoryOption } from \"@mastra/core/agent\";\nimport { ProviderOptions } from \"@mastra/core/dist/llm/model/provider-options\";\nimport { CoreMessage } from \"@mastra/core/llm\";\n\nexport class MastraProvider extends AbstractProvider.withKind(\n `${PEERBENCH_NAMESPACE}/llm/mastra`\n) {\n private readonly endpoint: string;\n private readonly authToken?: string;\n private client: MastraClient;\n\n constructor(params: { endpoint: string; authToken?: string }) {\n super();\n this.endpoint = params.endpoint;\n this.authToken = params.authToken;\n this.client = new MastraClient({\n baseUrl: this.endpoint,\n headers: this.authToken\n ? {\n Authorization: `Bearer ${this.authToken}`,\n }\n : undefined,\n });\n }\n\n async getAgentInfo(args: {\n agentId: string;\n requestContext?: RequestContext;\n }) {\n return await this.client\n .getAgent(args.agentId)\n .details(args.requestContext);\n }\n\n async getAgents(params?: {\n requestContext?: RequestContext;\n partial?: boolean;\n }): Promise<Record<string, GetAgentResponse>> {\n return this.client.listAgents(params?.requestContext, params?.partial);\n }\n\n agent(config: {\n agentId: string;\n memory?: AgentMemoryOption;\n requestContext?: RequestContext;\n providerOptions?: ProviderOptions;\n }): CallableLLM<MastraProvider> {\n return {\n slug: config.agentId,\n provider: this,\n forward: async (\n args: CallableLLMForwardArgs\n ): Promise<LLMResponse> => {\n const apiMessages = args.messages\n .filter((m) => m.role === \"user\" || m.role === \"assistant\")\n .map<CoreMessage>((m) => ({\n role: m.role,\n content: String(m.content ?? \"\"),\n }));\n\n const agent = this.client.getAgent(config.agentId);\n const startedAt = Date.now();\n\n const response = await agent.stream(\n apiMessages,\n {\n providerOptions: config.providerOptions,\n memory: config.memory,\n requestContext: config.requestContext,\n }\n );\n\n let text = \"\";\n let firstTokenAt: number | undefined;\n let inputTokensUsed: number | undefined;\n let outputTokensUsed: number | undefined;\n const metadata: Record<string, unknown> = {};\n\n await response.processDataStream({\n onChunk: async (chunk) => {\n if (chunk.type === \"text-delta\") {\n if (firstTokenAt === undefined) {\n firstTokenAt = Date.now();\n }\n const payload = chunk.payload as { text?: string };\n text += payload.text ?? \"\";\n }\n\n if (chunk.type === \"finish\") {\n const payload = chunk.payload as {\n output?: {\n usage?: {\n inputTokens?: number;\n outputTokens?: number;\n };\n };\n };\n inputTokensUsed = payload.output?.usage?.inputTokens;\n outputTokensUsed = payload.output?.usage?.outputTokens;\n }\n },\n });\n\n return {\n data: text,\n startedAt,\n completedAt: Date.now(),\n inputTokensUsed,\n outputTokensUsed,\n timeToFirstToken:\n firstTokenAt !== undefined ? firstTokenAt - startedAt : undefined,\n metadata:\n Object.keys(metadata).length > 0 ? metadata : undefined,\n };\n },\n };\n }\n}\n","import { RateLimiter } from \"@/utils\";\nimport OpenAI, { APIError } from \"openai\";\nimport { AbstractProvider } from \"./abstract\";\nimport { PEERBENCH_NAMESPACE } from \"@/constants\";\nimport {\n type CallableLLM,\n type LLMResponse,\n type CallableLLMForwardArgs,\n} from \"./callables/llm\";\n\n/**\n * Provider implementation that uses OpenAI SDK. It can be used with\n * any OpenAI compatible API.\n *\n * @example\n * ```ts\n * const provider = new OpenAIProvider({\n * apiKey: \"sk-1234567890\",\n * baseURL: \"https://openrouter.ai/api/v1\",\n * });\n * \n * const model = provider.model({ model: \"gpt-4o\" });\n * \n * const response = await model.forward({\n * messages: [{ role: \"user\", content: \"Hello, how are you?\" }],\n * });\n * \n * console.log(response.data);\n * ```\n */\nexport class OpenAIProvider extends AbstractProvider.withKind(\n `${PEERBENCH_NAMESPACE}/llm/openai`\n) {\n private client: OpenAI;\n private rateLimiter: RateLimiter;\n private maxRetries: number;\n\n constructor(config: {\n apiKey: string;\n baseURL: string;\n maxRetries?: number;\n timeout?: number;\n rateLimiter?: RateLimiter;\n }) {\n super();\n this.maxRetries = config.maxRetries ?? 3;\n this.rateLimiter =\n config.rateLimiter ??\n new RateLimiter({\n maxWeight: 20,\n timeWindow: 3_000,\n });\n\n this.client = new OpenAI({\n baseURL: config.baseURL,\n apiKey: config.apiKey,\n timeout: config.timeout,\n dangerouslyAllowBrowser: true,\n });\n }\n\n model(config: { model: string }): CallableLLM<OpenAIProvider> {\n return {\n slug: config.model,\n provider: this,\n forward: async (args: CallableLLMForwardArgs): Promise<LLMResponse> => {\n let retryCount = this.maxRetries;\n while (retryCount > 0) {\n let startedAt: Date = new Date();\n\n try {\n const response = await this.rateLimiter.execute(\n async () => {\n startedAt = new Date();\n return await this.client.chat.completions.create(\n {\n model: config.model,\n messages: args.messages,\n temperature: args.temperature,\n response_format: args.responseFormat,\n },\n { signal: args.abortSignal }\n );\n },\n { signal: args.abortSignal }\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 if (!response?.choices?.[0]?.message?.content) {\n throw new Error(\"No content returned from the model\");\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: startedAt.getTime(),\n completedAt: Date.now(),\n };\n } catch (err) {\n if (err instanceof APIError && err.status === 401) {\n throw new Error(`Invalid credentials provided`, { cause: err });\n }\n\n retryCount--;\n\n if (err instanceof SyntaxError) {\n console.debug(err);\n continue;\n }\n\n if (retryCount !== 0) {\n continue;\n }\n\n throw new Error(\n `Failed to forward prompt to the model: ${err instanceof Error ? err.message : err}`,\n { cause: err }\n );\n }\n }\n\n throw new Error(\n `Failed to forward prompt to the model: Max retries reached`,\n { cause: new Error(\"Max retries reached\") }\n );\n },\n };\n }\n}\n","import { AbstractProvider } from \"./abstract\";\nimport {\n type CallableLLM,\n type LLMResponse,\n type CallableLLMForwardArgs,\n} from \"./callables/llm\";\nimport { RateLimiter } from \"@/utils\";\nimport { OpenAIProvider } from \"./openai\";\nimport { PEERBENCH_NAMESPACE } from \"@/constants\";\nimport Decimal from \"decimal.js\";\nimport axios from \"axios\";\n\nconst baseURL = \"https://openrouter.ai/api/v1\";\nconst MODELS_CACHE_TTL = 1000 * 60 * 60 * 24; // 24 hours\n\nexport class OpenRouterProvider extends AbstractProvider.withKind(\n `${PEERBENCH_NAMESPACE}/llm/openrouter.ai`\n) {\n private models: ModelsResponse | undefined = undefined;\n private modelsCachePromise: Promise<ModelsResponse | undefined> =\n Promise.resolve(undefined);\n private modelsUpdatedAt = 0;\n private openAIProvider: OpenAIProvider;\n\n constructor(config: {\n apiKey: string;\n maxRetries?: number;\n timeout?: number;\n rateLimiter?: RateLimiter;\n }) {\n super();\n this.openAIProvider = new OpenAIProvider({\n baseURL,\n apiKey: config.apiKey,\n maxRetries: config.maxRetries,\n timeout: config.timeout,\n rateLimiter: config.rateLimiter,\n });\n }\n\n model(config: { model: string }): CallableLLM<OpenRouterProvider> {\n const openAICallable = this.openAIProvider.model({ model: config.model });\n this.updateModelsCache().catch(() => { });\n\n return {\n slug: config.model,\n provider: this,\n forward: async (\n args: CallableLLMForwardArgs\n ): Promise<LLMResponse> => {\n const response = await openAICallable.forward(args);\n\n const modelInfo = this.models?.data.find(\n (m) => m.id === config.model\n );\n let inputCost: string | undefined = undefined;\n let outputCost: string | undefined = undefined;\n\n if (modelInfo !== undefined) {\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 { ...response, inputCost, outputCost };\n },\n };\n }\n\n private async updateModelsCache() {\n this.modelsCachePromise = this.modelsCachePromise\n .then(async () => {\n if (\n this.models !== undefined &&\n Date.now() - this.modelsUpdatedAt < MODELS_CACHE_TTL\n ) {\n return this.models;\n }\n\n return axios\n .get<ModelsResponse>(`${baseURL}/models`)\n .then((res) => res.data)\n .then((data) => {\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 \"morph/morph-v3-large\",\n \"morph/morph-v3-fast\",\n \"relace/relace-apply-3\",\n ].includes(m.id)\n ),\n };\n\n this.models = data;\n this.modelsUpdatedAt = Date.now();\n\n return data;\n });\n })\n .catch(() => undefined);\n\n await this.modelsCachePromise;\n }\n}\n\ntype PutModality = \"text\" | \"image\" | \"file\" | \"audio\";\ntype Modality = \"text->text\" | \"text+image->text\" | \"text+image->text+image\";\n\ntype ModelInfo = {\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\ntype ModelsResponse = {\n data: ModelInfo[];\n};\n","import type { LanguageModelV3 } from \"@ai-sdk/provider\";\nimport { generateText, streamText } from \"ai\";\nimport { RateLimiter } from \"@/utils\";\nimport { AbstractProvider } from \"./abstract\";\nimport { PEERBENCH_NAMESPACE } from \"@/constants\";\nimport {\n type CallableLLM,\n type LLMResponse,\n type CallableLLMForwardArgs,\n} from \"./callables/llm\";\n\nfunction toModelMessages(messages: CallableLLMForwardArgs[\"messages\"]) {\n return messages\n .filter(\n (m) => m.role === \"system\" || m.role === \"user\" || m.role === \"assistant\"\n )\n .map((m) => ({\n role: m.role as \"system\" | \"user\" | \"assistant\",\n content:\n typeof m.content === \"string\"\n ? m.content\n : JSON.stringify(m.content ?? \"\"),\n }));\n}\n\nlet aiModuleCache: Record<string, unknown> | null = null;\n\nasync function buildOutputOption(\n responseFormat: CallableLLMForwardArgs[\"responseFormat\"]\n): Promise<unknown> {\n if (!responseFormat || responseFormat.type === \"text\") {\n return undefined;\n }\n\n if (!aiModuleCache) {\n aiModuleCache = (await import(\"ai\")) as unknown as Record<string, unknown>;\n }\n\n const Output = aiModuleCache[\"Output\"] as\n | {\n object: (opts: { schema: unknown }) => unknown;\n json: () => unknown;\n }\n | undefined;\n const jsonSchema = aiModuleCache[\"jsonSchema\"] as\n | ((schema: unknown) => unknown)\n | undefined;\n\n if (!Output || !jsonSchema) {\n return undefined;\n }\n\n if (responseFormat.type === \"json_schema\") {\n return Output.object({\n schema: jsonSchema(responseFormat.json_schema.schema),\n });\n }\n\n if (responseFormat.type === \"json_object\") {\n return Output.json();\n }\n\n return undefined;\n}\n\nexport class AISdkProvider extends AbstractProvider.withKind(\n `${PEERBENCH_NAMESPACE}/llm/ai-sdk`\n) {\n private rateLimiter: RateLimiter;\n private maxRetries: number;\n\n constructor(config?: AISdkProviderConfig) {\n super();\n this.maxRetries = config?.maxRetries ?? 2;\n this.rateLimiter =\n config?.rateLimiter ??\n new RateLimiter({\n maxWeight: 20,\n timeWindow: 3_000,\n });\n }\n\n model(config: AISdkModelConfig): CallableLLM<AISdkProvider> {\n const slug = `${config.aiSdkModel.provider}/${config.aiSdkModel.modelId}`;\n\n return {\n slug,\n provider: this,\n forward: async (args: CallableLLMForwardArgs): Promise<LLMResponse> => {\n const messages = toModelMessages(args.messages);\n const output = await buildOutputOption(args.responseFormat);\n\n const baseOptions = {\n model: config.aiSdkModel,\n messages,\n temperature: args.temperature,\n maxOutputTokens: args.maxTokens,\n abortSignal: args.abortSignal,\n maxRetries: this.maxRetries,\n };\n\n if (config.stream) {\n let startedAt!: number;\n const result = await this.rateLimiter.execute(\n async () => {\n startedAt = Date.now();\n return streamText({\n ...baseOptions,\n ...(output !== undefined ? { output } : {}),\n } as any);\n },\n { signal: args.abortSignal }\n );\n\n let text = \"\";\n let firstTokenAt: number | undefined;\n\n for await (const chunk of result.textStream) {\n if (firstTokenAt === undefined) {\n firstTokenAt = Date.now();\n }\n text += chunk;\n }\n\n const usage = await result.usage;\n\n return {\n data: text,\n startedAt,\n completedAt: Date.now(),\n inputTokensUsed: usage.inputTokens,\n outputTokensUsed: usage.outputTokens,\n timeToFirstToken:\n firstTokenAt !== undefined ? firstTokenAt - startedAt : undefined,\n };\n }\n\n let startedAt!: number;\n const result = await this.rateLimiter.execute(\n async () => {\n startedAt = Date.now();\n return generateText({\n ...baseOptions,\n ...(output !== undefined ? { output } : {}),\n } as any);\n },\n { signal: args.abortSignal }\n );\n\n return {\n data: result.text,\n startedAt,\n completedAt: Date.now(),\n inputTokensUsed: result.usage.inputTokens,\n outputTokensUsed: result.usage.outputTokens,\n };\n },\n };\n }\n}\n\ntype AISdkProviderConfig = {\n rateLimiter?: RateLimiter;\n maxRetries?: number;\n};\n\ntype AISdkModelConfig = {\n aiSdkModel: LanguageModelV3;\n stream?: boolean;\n};\n"],"mappings":"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","names":["startedAt","result"]}
@@ -1,6 +1,10 @@
1
- import { AbstractLLMProvider, type ChatResponse, type LLMProviderForwardArgs } from "./abstract/llm";
2
- import { MastraClient, type GetAgentResponse } from "@mastra/client-js";
3
- declare const MastraProvider_base: (new () => AbstractLLMProvider & {
1
+ import { AbstractProvider } from "./abstract";
2
+ import { type CallableLLM } from "./callables/llm";
3
+ import { type GetAgentResponse } from "@mastra/client-js";
4
+ import type { RequestContext } from "@mastra/core/request-context";
5
+ import { AgentMemoryOption } from "@mastra/core/agent";
6
+ import { ProviderOptions } from "@mastra/core/dist/llm/model/provider-options";
7
+ declare const MastraProvider_base: (new () => AbstractProvider & {
4
8
  readonly kind: "peerbench.ai/llm/mastra";
5
9
  }) & {
6
10
  readonly kind: "peerbench.ai/llm/mastra";
@@ -9,32 +13,23 @@ export declare class MastraProvider extends MastraProvider_base {
9
13
  private readonly endpoint;
10
14
  private readonly authToken?;
11
15
  private client;
12
- private memory?;
13
16
  constructor(params: {
14
17
  endpoint: string;
15
18
  authToken?: string;
16
- memory?: AgentMemoryOption;
17
19
  });
18
- forward(args: LLMProviderForwardArgs & {
19
- memory?: AgentMemoryOption;
20
- /**
21
- * The model that will be used as the brain for the agent.
22
- */
23
- modelName?: string;
24
- }): Promise<ChatResponse>;
25
20
  getAgentInfo(args: {
26
21
  agentId: string;
27
- runtimeContext?: MastraRuntimeContext;
22
+ requestContext?: RequestContext;
28
23
  }): Promise<GetAgentResponse>;
29
- getAgents(args?: {
30
- runtimeContext?: MastraRuntimeContext;
24
+ getAgents(params?: {
25
+ requestContext?: RequestContext;
31
26
  partial?: boolean;
32
27
  }): Promise<Record<string, GetAgentResponse>>;
28
+ agent(config: {
29
+ agentId: string;
30
+ memory?: AgentMemoryOption;
31
+ requestContext?: RequestContext;
32
+ providerOptions?: ProviderOptions;
33
+ }): CallableLLM<MastraProvider>;
33
34
  }
34
- export type AgentMemoryOption = Parameters<Parameters<MastraClient["getAgent"]>["0"] extends string ? ReturnType<MastraClient["getAgent"]>["generate"] : never>[0] extends {
35
- memory?: infer M;
36
- } ? M : never;
37
- type MastraRuntimeContext = Parameters<Parameters<MastraClient["getAgent"]>["0"] extends string ? ReturnType<MastraClient["getAgent"]>["generate"] : never>[0] extends {
38
- runtimeContext?: infer R;
39
- } ? R : never;
40
35
  export {};
@@ -1,12 +1,31 @@
1
1
  import { RateLimiter } from "../utils";
2
- import { ChatCompletionMessageParam } from "openai/resources/chat/completions";
3
- import { ResponseFormatJSONObject, ResponseFormatJSONSchema, ResponseFormatText } from "openai/resources/shared";
4
- import { AbstractLLMProvider, ChatResponse } from "./abstract/llm";
5
- declare const OpenAIProvider_base: (new () => AbstractLLMProvider & {
2
+ import { AbstractProvider } from "./abstract";
3
+ import { type CallableLLM } from "./callables/llm";
4
+ declare const OpenAIProvider_base: (new () => AbstractProvider & {
6
5
  readonly kind: "peerbench.ai/llm/openai";
7
6
  }) & {
8
7
  readonly kind: "peerbench.ai/llm/openai";
9
8
  };
9
+ /**
10
+ * Provider implementation that uses OpenAI SDK. It can be used with
11
+ * any OpenAI compatible API.
12
+ *
13
+ * @example
14
+ * ```ts
15
+ * const provider = new OpenAIProvider({
16
+ * apiKey: "sk-1234567890",
17
+ * baseURL: "https://openrouter.ai/api/v1",
18
+ * });
19
+ *
20
+ * const model = provider.model({ model: "gpt-4o" });
21
+ *
22
+ * const response = await model.forward({
23
+ * messages: [{ role: "user", content: "Hello, how are you?" }],
24
+ * });
25
+ *
26
+ * console.log(response.data);
27
+ * ```
28
+ */
10
29
  export declare class OpenAIProvider extends OpenAIProvider_base {
11
30
  private client;
12
31
  private rateLimiter;
@@ -18,12 +37,8 @@ export declare class OpenAIProvider extends OpenAIProvider_base {
18
37
  timeout?: number;
19
38
  rateLimiter?: RateLimiter;
20
39
  });
21
- forward(args: {
22
- messages: ChatCompletionMessageParam[];
40
+ model(config: {
23
41
  model: string;
24
- abortSignal?: AbortSignal;
25
- temperature?: number;
26
- responseFormat?: ResponseFormatText | ResponseFormatJSONSchema | ResponseFormatJSONObject;
27
- }): Promise<ChatResponse>;
42
+ }): CallableLLM<OpenAIProvider>;
28
43
  }
29
44
  export {};
@@ -1,6 +1,7 @@
1
- import { AbstractLLMProvider, ChatResponse, LLMProviderForwardArgs } from "./abstract/llm";
1
+ import { AbstractProvider } from "./abstract";
2
+ import { type CallableLLM } from "./callables/llm";
2
3
  import { RateLimiter } from "../utils";
3
- declare const OpenRouterProvider_base: (new () => AbstractLLMProvider & {
4
+ declare const OpenRouterProvider_base: (new () => AbstractProvider & {
4
5
  readonly kind: "peerbench.ai/llm/openrouter.ai";
5
6
  }) & {
6
7
  readonly kind: "peerbench.ai/llm/openrouter.ai";
@@ -16,12 +17,9 @@ export declare class OpenRouterProvider extends OpenRouterProvider_base {
16
17
  timeout?: number;
17
18
  rateLimiter?: RateLimiter;
18
19
  });
19
- forward(args: LLMProviderForwardArgs): Promise<ChatResponse>;
20
- /**
21
- * Updates the cache that holds information about OpenRouter models
22
- * including pricing information. It will be valid for 24 hours as
23
- * long as the instance of this Provider object is alive.
24
- */
20
+ model(config: {
21
+ model: string;
22
+ }): CallableLLM<OpenRouterProvider>;
25
23
  private updateModelsCache;
26
24
  }
27
25
  export {};
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  ExtensionLLMAsAJudgeScoreFieldsV1,
3
3
  ExtensionLLMResponseFieldsV1
4
- } from "../../chunk-TRNCF2BG.js";
4
+ } from "../../chunk-HBGC6BDW.js";
5
5
  import "../../chunk-NUEOE3K5.js";
6
6
  import "../../chunk-PZ5AY32C.js";
7
7
 
@@ -12,3 +12,20 @@ export declare const ExtensionLLMResponseFieldsV1: {
12
12
  inputCost: z.ZodOptional<z.ZodString>;
13
13
  outputCost: z.ZodOptional<z.ZodString>;
14
14
  };
15
+ export declare function LLMResponseFieldsV1<TRawDataField extends boolean = false>(params?: {
16
+ /**
17
+ * If `true` then the `data` field (which is a `z.string()`)
18
+ * will be included in the returned fields
19
+ */
20
+ withRawDataField?: TRawDataField;
21
+ }): {
22
+ modelSlug: z.ZodString;
23
+ provider: z.ZodString;
24
+ systemPromptId: z.ZodOptional<z.ZodString>;
25
+ inputTokensUsed: z.ZodOptional<z.ZodNumber>;
26
+ outputTokensUsed: z.ZodOptional<z.ZodNumber>;
27
+ inputCost: z.ZodOptional<z.ZodString>;
28
+ outputCost: z.ZodOptional<z.ZodString>;
29
+ } & (TRawDataField extends true ? {
30
+ data: z.ZodString;
31
+ } : {});
@@ -5,9 +5,9 @@ import {
5
5
  defineResponseSchema,
6
6
  defineScoreSchema,
7
7
  defineTestCaseSchema
8
- } from "../chunk-YY33MNMV.js";
8
+ } from "../chunk-7KMGLEYP.js";
9
9
  import "../chunk-OQE6TQXZ.js";
10
- import "../chunk-HMQYGCKI.js";
10
+ import "../chunk-ZJWSK4VO.js";
11
11
  import {
12
12
  IdSchema
13
13
  } from "../chunk-NUEOE3K5.js";