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.
- package/README.md +71 -58
- package/dist/benchmarks/examples/echo-basic/runner.d.ts +11 -254
- package/dist/benchmarks/examples/echo-basic/schema-sets/echo.v1.d.ts +16 -16
- package/dist/benchmarks/examples/exact-match-scorer/runner.d.ts +38 -386
- package/dist/benchmarks/examples/exact-match-scorer/schema-sets/exact-match.v1.d.ts +16 -16
- package/dist/benchmarks/examples/text-transform/runner.d.ts +32 -480
- package/dist/benchmarks/examples/text-transform/schema-sets/echo.v1.d.ts +16 -16
- package/dist/benchmarks/examples/text-transform/schema-sets/reverse.v1.d.ts +16 -16
- package/dist/benchmarks/index.js +179 -247
- package/dist/benchmarks/index.js.map +1 -1
- package/dist/benchmarks/peerbench/index.d.ts +2 -1
- package/dist/benchmarks/peerbench/mcq-runner.d.ts +78 -0
- package/dist/benchmarks/peerbench/qa-runner.d.ts +77 -0
- package/dist/benchmarks/peerbench/schema-sets/mcq.v1.d.ts +16 -16
- package/dist/benchmarks/peerbench/schema-sets/multi-turn.v1.d.ts +16 -16
- package/dist/benchmarks/peerbench/schema-sets/qa.v1.d.ts +16 -16
- package/dist/chunk-6WDCU5BP.js +9 -0
- package/dist/chunk-6WDCU5BP.js.map +1 -0
- package/dist/{chunk-YY33MNMV.js → chunk-7KMGLEYP.js} +2 -2
- package/dist/{chunk-HMQYGCKI.js → chunk-ZJWSK4VO.js} +1 -1
- package/dist/chunk-ZJWSK4VO.js.map +1 -0
- package/dist/helpers/define-runner.d.ts +2 -45
- package/dist/index.js +2 -2
- package/dist/providers/callables/callable.d.ts +4 -0
- package/dist/providers/callables/llm.d.ts +38 -0
- package/dist/providers/example/echo.d.ts +12 -11
- package/dist/providers/example/restapi.d.ts +11 -18
- package/dist/providers/index.d.ts +3 -2
- package/dist/providers/index.js +264 -9
- package/dist/providers/index.js.map +1 -1
- package/dist/providers/mastra.d.ts +16 -21
- package/dist/providers/openai.d.ts +25 -10
- package/dist/providers/openrouter.d.ts +6 -8
- package/dist/schemas/index.js +2 -2
- package/dist/schemas/llm/index.js +36 -7
- package/dist/schemas/llm/index.js.map +1 -1
- package/dist/scorers/abstract.d.ts +1 -1
- package/dist/scorers/index.js +377 -7
- package/dist/scorers/index.js.map +1 -1
- package/dist/scorers/llm-judge.d.ts +6 -6
- package/dist/types/index.d.ts +0 -5
- package/dist/types/runner.d.ts +13 -17
- package/package.json +6 -7
- package/dist/benchmarks/peerbench/runner.d.ts +0 -754
- package/dist/chunk-3JHDJEY3.js +0 -374
- package/dist/chunk-3JHDJEY3.js.map +0 -1
- package/dist/chunk-HMQYGCKI.js.map +0 -1
- package/dist/chunk-Q6GSOHOP.js +0 -44
- package/dist/chunk-Q6GSOHOP.js.map +0 -1
- package/dist/chunk-RTEAK4II.js +0 -37
- package/dist/chunk-RTEAK4II.js.map +0 -1
- package/dist/chunk-SMLNDQFX.js +0 -244
- package/dist/chunk-SMLNDQFX.js.map +0 -1
- package/dist/providers/abstract/llm.d.ts +0 -20
- /package/dist/{chunk-YY33MNMV.js.map → chunk-7KMGLEYP.js.map} +0 -0
- /package/dist/providers/{abstract/provider.d.ts → abstract.d.ts} +0 -0
|
@@ -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-
|
|
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-
|
|
65
|
+
//# sourceMappingURL=chunk-7KMGLEYP.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 {
|
|
2
|
-
|
|
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
|
@@ -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 {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
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 {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
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
|
-
|
|
13
|
+
model(config?: {
|
|
14
|
+
model?: string;
|
|
15
|
+
}): CallableLLM<ExampleRestApiLLMAgentProvider>;
|
|
23
16
|
}
|
|
24
17
|
type ExampleRestApiAgentProviderConfig = {
|
|
25
18
|
/**
|
package/dist/providers/index.js
CHANGED
|
@@ -1,15 +1,270 @@
|
|
|
1
1
|
import {
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
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 {
|
|
2
|
-
import {
|
|
3
|
-
|
|
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
|
-
|
|
22
|
+
requestContext?: RequestContext;
|
|
28
23
|
}): Promise<GetAgentResponse>;
|
|
29
|
-
getAgents(
|
|
30
|
-
|
|
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 {
|
|
3
|
-
import {
|
|
4
|
-
|
|
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
|
-
|
|
22
|
-
messages: ChatCompletionMessageParam[];
|
|
40
|
+
model(config: {
|
|
23
41
|
model: string;
|
|
24
|
-
|
|
25
|
-
temperature?: number;
|
|
26
|
-
responseFormat?: ResponseFormatText | ResponseFormatJSONSchema | ResponseFormatJSONObject;
|
|
27
|
-
}): Promise<ChatResponse>;
|
|
42
|
+
}): CallableLLM<OpenAIProvider>;
|
|
28
43
|
}
|
|
29
44
|
export {};
|