peerbench 0.0.9 → 0.0.11

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 (56) 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 +16 -16
  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 +16 -16
  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 +16 -16
  8. package/dist/benchmarks/examples/text-transform/schema-sets/reverse.v1.d.ts +16 -16
  9. package/dist/benchmarks/index.js +179 -247
  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 +16 -16
  15. package/dist/benchmarks/peerbench/schema-sets/multi-turn.v1.d.ts +16 -16
  16. package/dist/benchmarks/peerbench/schema-sets/qa.v1.d.ts +16 -16
  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-HMQYGCKI.js → chunk-ZJWSK4VO.js} +1 -1
  21. package/dist/chunk-ZJWSK4VO.js.map +1 -0
  22. package/dist/helpers/define-runner.d.ts +2 -45
  23. package/dist/index.js +2 -2
  24. package/dist/providers/callables/callable.d.ts +4 -0
  25. package/dist/providers/callables/llm.d.ts +38 -0
  26. package/dist/providers/example/echo.d.ts +12 -11
  27. package/dist/providers/example/restapi.d.ts +11 -18
  28. package/dist/providers/index.d.ts +3 -2
  29. package/dist/providers/index.js +264 -9
  30. package/dist/providers/index.js.map +1 -1
  31. package/dist/providers/mastra.d.ts +16 -21
  32. package/dist/providers/openai.d.ts +25 -10
  33. package/dist/providers/openrouter.d.ts +6 -8
  34. package/dist/schemas/index.js +2 -2
  35. package/dist/schemas/llm/index.js +36 -7
  36. package/dist/schemas/llm/index.js.map +1 -1
  37. package/dist/scorers/abstract.d.ts +1 -1
  38. package/dist/scorers/index.js +377 -7
  39. package/dist/scorers/index.js.map +1 -1
  40. package/dist/scorers/llm-judge.d.ts +6 -6
  41. package/dist/types/index.d.ts +0 -5
  42. package/dist/types/runner.d.ts +13 -17
  43. package/package.json +6 -7
  44. package/dist/benchmarks/peerbench/runner.d.ts +0 -754
  45. package/dist/chunk-3JHDJEY3.js +0 -374
  46. package/dist/chunk-3JHDJEY3.js.map +0 -1
  47. package/dist/chunk-HMQYGCKI.js.map +0 -1
  48. package/dist/chunk-Q6GSOHOP.js +0 -44
  49. package/dist/chunk-Q6GSOHOP.js.map +0 -1
  50. package/dist/chunk-RTEAK4II.js +0 -37
  51. package/dist/chunk-RTEAK4II.js.map +0 -1
  52. package/dist/chunk-SMLNDQFX.js +0 -244
  53. package/dist/chunk-SMLNDQFX.js.map +0 -1
  54. package/dist/providers/abstract/llm.d.ts +0 -20
  55. /package/dist/{chunk-YY33MNMV.js.map → chunk-7KMGLEYP.js.map} +0 -0
  56. /package/dist/providers/{abstract/provider.d.ts → abstract.d.ts} +0 -0
@@ -0,0 +1,9 @@
1
+ // src/helpers/define-runner.ts
2
+ function defineRunner(fn) {
3
+ return fn;
4
+ }
5
+
6
+ export {
7
+ defineRunner
8
+ };
9
+ //# sourceMappingURL=chunk-6WDCU5BP.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/helpers/define-runner.ts"],"sourcesContent":["import { RunnerParams, RunnerResult } from \"@/types\";\n\nexport function defineRunner<TParams extends RunnerParams, TResult extends RunnerResult>(\n fn: (params: TParams) => Promise<TResult>\n) {\n return fn;\n}\n"],"mappings":";AAEO,SAAS,aACd,IACA;AACA,SAAO;AACT;","names":[]}
@@ -3,7 +3,7 @@ import {
3
3
  } from "./chunk-OQE6TQXZ.js";
4
4
  import {
5
5
  ScoringMethod
6
- } from "./chunk-HMQYGCKI.js";
6
+ } from "./chunk-ZJWSK4VO.js";
7
7
  import {
8
8
  IdSchema
9
9
  } from "./chunk-NUEOE3K5.js";
@@ -62,4 +62,4 @@ export {
62
62
  BaseScoreSchemaV1,
63
63
  defineScoreSchema
64
64
  };
65
- //# sourceMappingURL=chunk-YY33MNMV.js.map
65
+ //# sourceMappingURL=chunk-7KMGLEYP.js.map
@@ -8,4 +8,4 @@ var ScoringMethod = {
8
8
  export {
9
9
  ScoringMethod
10
10
  };
11
- //# sourceMappingURL=chunk-HMQYGCKI.js.map
11
+ //# sourceMappingURL=chunk-ZJWSK4VO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/types/index.ts"],"sourcesContent":["export * from \"./runner\";\n\nimport { IdSchema } from \"@/schemas/id\";\nimport z from \"zod\";\n\nexport type Id = z.infer<typeof IdSchema>;\n\nexport type IdGenerator<TInput = unknown> = (input: TInput) => MaybePromise<Id>;\n\nexport type MaybePromise<T> = T | Promise<T>;\n\nexport const ScoringMethod = {\n ai: \"ai\",\n human: \"human\",\n algo: \"algo\",\n} as const;\nexport type ScoringMethod = (typeof ScoringMethod)[keyof typeof ScoringMethod];\n"],"mappings":";AAWO,IAAM,gBAAgB;AAAA,EAC3B,IAAI;AAAA,EACJ,OAAO;AAAA,EACP,MAAM;AACR;","names":[]}
@@ -1,45 +1,2 @@
1
- import { IdGenerator, InferRunConfig, ProviderCtor, Runner, ScorerCtor } from "../types";
2
- import z from "zod";
3
- export declare function defineRunner<const TProviders extends ProviderCtor[], const TScorers extends ScorerCtor[], const TSchemaSets extends SchemaSetDefinition[], const TRunConfigSchema extends z.ZodRawShape = {}>(config: {
4
- schemaSets: TSchemaSets;
5
- providers: TProviders;
6
- scorers: TScorers;
7
- runConfigSchema?: TRunConfigSchema;
8
- /**
9
- * @default true
10
- */
11
- parseRunConfig?: boolean;
12
- defaults?: {
13
- scorer?: InstanceType<TScorers[number]>;
14
- responseIdGenerator?: IdGenerator;
15
- scoreIdGenerator?: IdGenerator;
16
- };
17
- }, fn: Runner<TSchemaSets[number]["testCase"], TSchemaSets[number]["response"], TSchemaSets[number]["score"], InstanceType<TProviders[number]>, InstanceType<TScorers[number]>, InferRunConfig<TRunConfigSchema>>): ((params: Parameters<typeof fn>[0]) => Promise<{
18
- response: z.core.output<TSchemaSets[number]["response"]>;
19
- score?: z.core.output<TSchemaSets[number]["score"]> | undefined;
20
- }>) & {
21
- /**
22
- * The configuration that was used to define the runner.
23
- */
24
- config: {
25
- runConfigSchema: z.ZodObject<{ -readonly [P in keyof TRunConfigSchema]: TRunConfigSchema[P]; }, z.core.$strip>;
26
- schemaSets: TSchemaSets;
27
- providers: TProviders;
28
- scorers: TScorers;
29
- /**
30
- * @default true
31
- */
32
- parseRunConfig?: boolean;
33
- defaults?: {
34
- scorer?: InstanceType<TScorers[number]>;
35
- responseIdGenerator?: IdGenerator;
36
- scoreIdGenerator?: IdGenerator;
37
- };
38
- };
39
- };
40
- type SchemaSetDefinition<TTestCase extends z.ZodObject = z.ZodObject, TResponse extends z.ZodObject = z.ZodObject, TScore extends z.ZodObject = z.ZodObject> = {
41
- testCase: TTestCase;
42
- response: TResponse;
43
- score: TScore;
44
- };
45
- export {};
1
+ import { RunnerParams, RunnerResult } from "../types";
2
+ export declare function defineRunner<TParams extends RunnerParams, TResult extends RunnerResult>(fn: (params: TParams) => Promise<TResult>): (params: TParams) => Promise<TResult>;
package/dist/index.js CHANGED
@@ -1,9 +1,9 @@
1
1
  import {
2
2
  defineRunner
3
- } from "./chunk-RTEAK4II.js";
3
+ } from "./chunk-6WDCU5BP.js";
4
4
  import {
5
5
  ScoringMethod
6
- } from "./chunk-HMQYGCKI.js";
6
+ } from "./chunk-ZJWSK4VO.js";
7
7
  import {
8
8
  CATEGORIES,
9
9
  PEERBENCH_NAMESPACE
@@ -0,0 +1,4 @@
1
+ import { AbstractProvider } from "../abstract";
2
+ export interface Callable<TProvider = AbstractProvider> {
3
+ readonly provider: TProvider;
4
+ }
@@ -0,0 +1,38 @@
1
+ import { ChatCompletionMessageParam } from "openai/resources/chat/completions";
2
+ import { ResponseFormatJSONObject, ResponseFormatJSONSchema, ResponseFormatText } from "openai/resources/shared";
3
+ import { AbstractProvider, ProviderResponse } from "../abstract";
4
+ import { Callable } from "./callable";
5
+ export interface CallableLLM<TProvider extends AbstractProvider = AbstractProvider> extends Callable<TProvider> {
6
+ slug: string;
7
+ forward(args: CallableLLMForwardArgs): Promise<LLMResponse>;
8
+ }
9
+ export type CallableLLMForwardArgs = {
10
+ messages: ChatCompletionMessageParam[];
11
+ abortSignal?: AbortSignal;
12
+ maxTokens?: number;
13
+ temperature?: number;
14
+ responseFormat?: ResponseFormatText | ResponseFormatJSONSchema | ResponseFormatJSONObject;
15
+ };
16
+ export type LLMResponse = ProviderResponse<string> & {
17
+ /**
18
+ * Number of input tokens used.
19
+ */
20
+ inputTokensUsed?: number;
21
+ /**
22
+ * Number of output tokens used.
23
+ */
24
+ outputTokensUsed?: number;
25
+ /**
26
+ * Cost of the input tokens.
27
+ */
28
+ inputCost?: string;
29
+ /**
30
+ * Cost of the output tokens.
31
+ */
32
+ outputCost?: string;
33
+ /**
34
+ * Time taken to receive the first token.
35
+ */
36
+ timeToFirstToken?: number;
37
+ metadata?: Record<string, unknown>;
38
+ };
@@ -1,12 +1,13 @@
1
- import { AbstractLLMProvider, ChatResponse, LLMProviderForwardArgs } from "../abstract/llm";
2
- /**
3
- * Example provider implementation for local testing and as a reference.
4
- *
5
- * - Extends `AbstractLLMProvider`
6
- * - Implements `forward({ messages, model, ... })`
7
- * - Does not perform any network calls
8
- */
9
- export declare class ExampleEchoLLMProvider extends AbstractLLMProvider {
10
- readonly kind = "example.echo";
11
- forward(args: LLMProviderForwardArgs): Promise<ChatResponse>;
1
+ import { AbstractProvider } from "../abstract";
2
+ import { type CallableLLM } from "../callables/llm";
3
+ declare const ExampleEchoLLMProvider_base: (new () => AbstractProvider & {
4
+ readonly kind: "example.echo";
5
+ }) & {
6
+ readonly kind: "example.echo";
7
+ };
8
+ export declare class ExampleEchoLLMProvider extends ExampleEchoLLMProvider_base {
9
+ model(config?: {
10
+ model?: string;
11
+ }): CallableLLM<ExampleEchoLLMProvider>;
12
12
  }
13
+ export {};
@@ -1,25 +1,18 @@
1
- import { AbstractLLMProvider, ChatResponse, LLMProviderForwardArgs } from "../abstract/llm";
2
- /**
3
- * Example "custom REST API LLM agent provider".
4
- *
5
- * Sometimes you don't call a model API directly. You call your own REST API, and *it* talks to the model.
6
- * That REST API can hide secrets, run tools, do retrieval, apply guardrails, and whatever else your
7
- * product needs.
8
- *
9
- * In the SDK we still want a clean abstraction, so we model that REST API as an `AbstractLLMProvider`.
10
- * The runner (or host app) still passes `messages + model`, and the provider still returns one final string.
11
- *
12
- * If you’re implementing your own provider, this is the only part that matters: translate
13
- * `LLMProviderForwardArgs` into your HTTP request, then translate your HTTP response back into
14
- * `ChatResponse`.
15
- */
16
- export declare class ExampleRestApiLLMAgentProvider extends AbstractLLMProvider {
17
- readonly kind = "example.restapi.agent";
1
+ import { AbstractProvider } from "../abstract";
2
+ import { type CallableLLM } from "../callables/llm";
3
+ declare const ExampleRestApiLLMAgentProvider_base: (new () => AbstractProvider & {
4
+ readonly kind: "example.rest-api.agent";
5
+ }) & {
6
+ readonly kind: "example.rest-api.agent";
7
+ };
8
+ export declare class ExampleRestApiLLMAgentProvider extends ExampleRestApiLLMAgentProvider_base {
18
9
  private readonly baseUrl;
19
10
  private readonly apiKey?;
20
11
  private readonly headers?;
21
12
  constructor(config: ExampleRestApiAgentProviderConfig);
22
- forward(args: LLMProviderForwardArgs): Promise<ChatResponse>;
13
+ model(config?: {
14
+ model?: string;
15
+ }): CallableLLM<ExampleRestApiLLMAgentProvider>;
23
16
  }
24
17
  type ExampleRestApiAgentProviderConfig = {
25
18
  /**
@@ -1,5 +1,6 @@
1
- export * from "./abstract/llm";
2
- export * from "./abstract/provider";
1
+ export * from "./callables/callable";
2
+ export * from "./callables/llm";
3
+ export * from "./abstract";
3
4
  export * from "./mastra";
4
5
  export * from "./openai";
5
6
  export * from "./openrouter";
@@ -1,15 +1,270 @@
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
+ };
11
267
  export {
12
- AbstractLLMProvider,
13
268
  AbstractProvider,
14
269
  MastraProvider,
15
270
  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"],"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"],"mappings":"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","names":[]}
@@ -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 {};