syntropylabs-evalkit 0.1.17

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/LICENSE ADDED
@@ -0,0 +1,20 @@
1
+ Copyright (c) 2026 Syntropy Labs. All rights reserved.
2
+
3
+ This software and associated documentation files (the "Software") are the
4
+ proprietary and confidential property of Syntropy Labs. The Software is
5
+ licensed, not sold.
6
+
7
+ No part of the Software may be copied, reproduced, modified, merged, published,
8
+ distributed, sublicensed, reverse engineered, decompiled, disassembled, or used
9
+ to create derivative works, in whole or in part, by any means or in any form,
10
+ without the express prior written permission of Syntropy Labs.
11
+
12
+ Use of the Software is permitted solely in accordance with a separate written
13
+ agreement with Syntropy Labs and is subject to the terms of that agreement.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18
+ SYNTROPY LABS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
19
+ AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
20
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
package/README.md ADDED
@@ -0,0 +1,112 @@
1
+ # EvalKit TypeScript SDK
2
+
3
+ OpenTelemetry-based LLM observability, tracing, and evaluation for Node.js — by [Syntropy Labs](https://syntropylabs.ai).
4
+
5
+ One `init()` call auto-instruments your LLM providers (OpenAI, Anthropic, Bedrock, Cohere, Google, Vertex, LangChain), databases (Postgres, MySQL, MongoDB, Redis), and HTTP clients — then ships traces to the EvalKit platform.
6
+
7
+ > The Python SDK is published as [`syntropylabs-evalkit`](https://pypi.org/project/syntropylabs-evalkit/) on PyPI.
8
+
9
+ ## Install
10
+
11
+ ```bash
12
+ npm install syntropylabs-evalkit
13
+ ```
14
+
15
+ Provider SDKs are **optional peer dependencies** — install only what you use:
16
+
17
+ ```bash
18
+ npm install openai @anthropic-ai/sdk
19
+ ```
20
+
21
+ ## Quick start
22
+
23
+ ```ts
24
+ import evalkit from "syntropylabs-evalkit";
25
+
26
+ evalkit.init({
27
+ apiKey: process.env.EVALKIT_API_KEY,
28
+ serviceName: "my-service",
29
+ });
30
+
31
+ // That's it — any OpenAI / Anthropic / DB / HTTP call from here is traced.
32
+ ```
33
+
34
+ > Call `init()` as early as possible (top of your entrypoint, before other imports run requests) so auto-instrumentation can hook the libraries.
35
+
36
+ ## Framework middleware
37
+
38
+ Each incoming request becomes a root trace, with downstream LLM/DB/HTTP calls nested underneath.
39
+
40
+ ```ts
41
+ import express from "express";
42
+ import evalkit from "syntropylabs-evalkit";
43
+
44
+ evalkit.init({ apiKey: process.env.EVALKIT_API_KEY, serviceName: "api" });
45
+
46
+ const app = express();
47
+ app.use(evalkit.expressMiddleware());
48
+ ```
49
+
50
+ Supported adapters: `expressMiddleware()`, `fastifyPlugin()`, `koaMiddleware()`, `honoMiddleware()`, `hapiPlugin()`, and `createNestjsInterceptor()`.
51
+
52
+ ## Manual tracing helpers
53
+
54
+ ```ts
55
+ import evalkit from "syntropylabs-evalkit";
56
+
57
+ // Wrap a function — input/output captured automatically
58
+ const handler = evalkit.traceFunction("rank-results", rankResults);
59
+
60
+ // Or open a span by hand
61
+ const span = evalkit.startSpan("embed-documents", { count: 42 });
62
+ try {
63
+ await embed(docs);
64
+ span.end("OK");
65
+ } catch (e) {
66
+ span.end("ERROR");
67
+ throw e;
68
+ }
69
+
70
+ // Decorators
71
+ class Service {
72
+ @evalkit.TraceMethod()
73
+ async compute() { /* ... */ }
74
+ }
75
+
76
+ await evalkit.flush(); // force-flush before process exit
77
+ ```
78
+
79
+ ## Offline evaluation
80
+
81
+ ```ts
82
+ import { evaluate } from "syntropylabs-evalkit";
83
+
84
+ const result = await evaluate({
85
+ input: "What is the capital of France?",
86
+ output: "Paris",
87
+ metrics: ["correctness", "relevance"],
88
+ });
89
+ ```
90
+
91
+ ## Scenario generation & simulation
92
+
93
+ ```ts
94
+ import evalkit from "syntropylabs-evalkit";
95
+
96
+ const scenarios = await evalkit.generateScenarios({ /* ... */ });
97
+ const { simulationId, results } = await evalkit.simulateUser({ /* ... */ });
98
+ ```
99
+
100
+ ## Configuration
101
+
102
+ | Option | Description |
103
+ | ------------- | ------------------------------------------------------ |
104
+ | `apiKey` | EvalKit project API key (required). |
105
+ | `serviceName` | Logical service name attached to every trace. |
106
+ | `endpoint` | Override the collector endpoint (defaults to EvalKit). |
107
+
108
+ See `EvalKitOptions` (exported type) for the full set.
109
+
110
+ ## License
111
+
112
+ Proprietary — © 2026 Syntropy Labs. See [LICENSE](./LICENSE).
@@ -0,0 +1,4 @@
1
+ import {createRequire}from'module';import {context,SpanKind,trace,SpanStatusCode}from'@opentelemetry/api';var p=Object.defineProperty;var E=Object.getOwnPropertyDescriptor;var O=Object.getOwnPropertyNames;var T=Object.prototype.hasOwnProperty;var m=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,a)=>(typeof require<"u"?require:t)[a]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var y=(e,t)=>()=>(e&&(t=e(e=0)),t);var F=(e,t)=>{for(var a in t)p(e,a,{get:t[a],enumerable:true});},q=(e,t,a,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of O(t))!T.call(e,n)&&n!==a&&p(e,n,{get:()=>t[n],enumerable:!(r=E(t,n))||r.enumerable});return e};var $=e=>q(p({},"__esModule",{value:true}),e);function h(e,t,a){if(!e||!t||!w.has(e))return;let r=k.get(e)??[];r.push({name:t,args:a}),k.set(e,r);}var w,k,R=y(()=>{w=new Map,k=new Map;});function X(e){if(typeof m>"u")return null;let t=m.cache;if(!t)return null;let a=Object.keys(t).find(r=>{let n=r.split("/node_modules/");return n.length>1&&n[n.length-1].startsWith(e+"/")});return a?t[a]?.exports??null:null}function z(){return typeof m<"u"?m:createRequire(import.meta.url)}var _,S=y(()=>{_=new Function("s","return import(s)");});function u(e,t=L){let a;try{a=typeof e=="string"?e:JSON.stringify(e);}catch{a=String(e);}return a==null?"":a.length>t?a.slice(0,t)+"\u2026":a}function x(e){let t=e?.id;if(Array.isArray(t)){for(let a of ["openai","anthropic","google","vertexai","cohere","mistral","bedrock","ollama","groq"])if(t.includes(a))return a==="vertexai"?"vertex-ai":a;return t[t.length-1]}}function C(e,t){let a=t?.invocation_params??{};for(let n of ["model","model_name","modelName","model_id","deployment_name"])if(a[n])return String(a[n]);let r=e?.kwargs??{};for(let n of ["model","model_name","modelName","model_id"])if(r[n])return String(r[n]);return "unknown"}function N(e){try{let a=((Array.isArray(e?.[0])?e[0]:e)??[]).map(r=>{let n=(typeof r?._getType=="function"?r._getType():void 0)??r?.role??r?.type??"message",o=typeof r?.content=="string"?r.content:u(r?.content);return `${n}: ${o}`});return u(a.join(`
2
+ `))}catch{return u(e)}}function I(e){try{let t=[];for(let a of e?.generations??[])for(let r of a??[])r?.text?t.push(String(r.text)):r?.message?.content&&t.push(typeof r.message.content=="string"?r.message.content:u(r.message.content));return u(t.filter(Boolean).join(`
3
+ `))}catch{return ""}}function j(e){let t=0,a=0;try{let r=e?.llmOutput?.tokenUsage??e?.llmOutput?.usage??{};if(t=r.promptTokens??r.prompt_tokens??r.input_tokens??0,a=r.completionTokens??r.completion_tokens??r.output_tokens??0,!t&&!a)for(let n of e?.generations??[])for(let o of n??[]){let i=o?.message?.usage_metadata;i&&(t=i.input_tokens??t,a=i.output_tokens??a);}}catch{}return {tin:t||0,tout:a||0}}function H(e){let t=new Map;function a(n,o,i,l,s){try{let g=o?t.get(o):void 0,d=g?g.ctx:context.active(),c=e.tracer.startSpan(l,{kind:i==="llm_call"?SpanKind.CLIENT:SpanKind.INTERNAL,attributes:{"evalkit.span_type":i,"evalkit.framework":"langchain",...s}},d);t.set(n,{span:c,ctx:trace.setSpan(d,c)});}catch{}}function r(n,o,i,l){try{let s=t.get(n);if(!s)return;t.delete(n),i&&s.span.setAttributes(i),s.span.setStatus({code:o==="OK"?SpanStatusCode.OK:SpanStatusCode.ERROR,message:l}),s.span.end();}catch{}}return {handleChainStart(n,o,i,l,s,g,d,c){let f=c??n?.id?.[n.id.length-1]??"chain";a(i,l,"function_call",String(f),s?.length?{"langchain.tags":s.join(",")}:{});},handleChainEnd(n,o){r(o,"OK");},handleChainError(n,o){r(o,"ERROR",void 0,String(n?.message??n));},handleLLMStart(n,o,i,l,s){let g=C(n,s);a(i,l,"llm_call","llm.generate",{"gen_ai.request.model":g,"gen_ai.system":x(n)??"","evalkit.prompt":u((o??[]).join(`
4
+ `))});},handleChatModelStart(n,o,i,l,s){let g=C(n,s);a(i,l,"llm_call","chat.generate",{"gen_ai.request.model":g,"gen_ai.system":x(n)??"","evalkit.prompt":N(o)});},handleLLMEnd(n,o){let{tin:i,tout:l}=j(n),s=t.get(o);try{for(let g of n?.generations??[])for(let d of g??[])for(let c of d?.message?.tool_calls??[])c?.name&&s&&(s.span.addEvent("gen_ai.tool.call",{"gen_ai.tool.name":c.name,"gen_ai.tool.call.arguments":u(c.args??{})}),h(s.span.spanContext().traceId,c.name,c.args));}catch{}r(o,"OK",{"evalkit.completion":I(n),"gen_ai.usage.input_tokens":i,"gen_ai.usage.output_tokens":l,"gen_ai.usage.total_tokens":i+l});},handleLLMError(n,o){r(o,"ERROR",void 0,String(n?.message??n));},handleToolStart(n,o,i,l,s,g,d){let c=d??n?.id?.[n.id.length-1]??"tool",f=t.get(l??"");h(f?.span.spanContext().traceId,String(c)),a(i,l,"tool_call",String(c),{"tool.name":String(c),"tool.arguments":u(o)});},handleToolEnd(n,o){r(o,"OK",{"tool.result":u(n)});},handleToolError(n,o){r(o,"ERROR",void 0,String(n?.message??n));},handleRetrieverStart(n,o,i,l){let s=n?.id?.[n.id.length-1]??"retriever";a(i,l,"db_query",String(s),{"retriever.query":u(o)});},handleRetrieverEnd(n,o){let i=Array.isArray(n)?n.length:0;r(o,"OK",{"retriever.document_count":i});},handleRetrieverError(n,o){r(o,"ERROR",void 0,String(n?.message??n));}}}async function P(e){try{let a=(await _("@langchain/core/callbacks/base")).BaseCallbackHandler.fromMethods(H(e));return a.name="evalkit",a.__evalkit=!0,a}catch{return null}}async function Z(e){let t=await P(e);if(!t)return null;try{let r=(await _("@langchain/core/callbacks/manager")).CallbackManager;if(r&&typeof r.configure=="function"&&!r.__evalkitPatched){let n=r.configure.bind(r);r.configure=(...o)=>{let i=n(...o);try{i&&![...i.handlers??[],...i.inheritableHandlers??[]].some(g=>g?.__evalkit)&&typeof i.addHandler=="function"&&i.addHandler(t,!0);}catch{}return i},r.__evalkitPatched=!0;}}catch{}return t}var L,B=y(()=>{R();S();L=4096;});export{m as a,y as b,F as c,$ as d,w as e,k as f,h as g,R as h,_ as i,X as j,z as k,S as l,H as m,P as n,Z as o,B as p};
@@ -0,0 +1,351 @@
1
+ import { Tracer, Context } from '@opentelemetry/api';
2
+
3
+ /** Matches the Go trace-service TraceEnvelope exactly. */
4
+ interface TraceEnvelope {
5
+ traceId: string;
6
+ spanId: string;
7
+ parentSpanId?: string;
8
+ spanKind?: "CLIENT" | "SERVER" | "INTERNAL" | "PRODUCER" | "CONSUMER";
9
+ spanType: "llm_call" | "tool_call" | "log" | "http_call" | "function_call" | "db_query" | "eval_result";
10
+ status?: "OK" | "ERROR" | "UNSET";
11
+ statusMessage?: string;
12
+ serviceName?: string;
13
+ operation?: string;
14
+ model?: string;
15
+ provider?: string;
16
+ prompt?: string;
17
+ completion?: string;
18
+ attributes?: Record<string, string | number | boolean | string[]>;
19
+ events?: SpanEvent[];
20
+ tokensIn?: number;
21
+ tokensOut?: number;
22
+ latencyMs?: number;
23
+ startTime?: string;
24
+ endTime?: string;
25
+ createdAt: string;
26
+ environment?: string;
27
+ appVersion?: string;
28
+ userId?: string;
29
+ sessionId?: string;
30
+ deviceId?: string;
31
+ traceProjectId?: string;
32
+ sdkVersion?: string;
33
+ isSimulation?: boolean;
34
+ simulationId?: string;
35
+ scenarioId?: string;
36
+ runId?: string;
37
+ }
38
+ interface SpanEvent {
39
+ name: string;
40
+ timestamp: string;
41
+ attributes?: Record<string, string | number | boolean>;
42
+ }
43
+ interface EvalKitOptions {
44
+ subscriptionKey: string;
45
+ /**
46
+ * Base URL of the trace ingest service.
47
+ * Defaults to the hosted EvalKit service (https://ingest.evalkit.io).
48
+ * Override for self-hosted or local development (e.g. http://localhost:8085).
49
+ */
50
+ baseUrl?: string;
51
+ /** Orchestrator / control-plane base URL (scenario generation). Defaults to the hosted service. */
52
+ apiUrl?: string;
53
+ /** Service name attached to every span (default: "unknown") */
54
+ serviceName?: string;
55
+ /** Log flush details to console (default: false) */
56
+ debug?: boolean;
57
+ /** Max spans per export batch (default: 512) */
58
+ maxExportBatchSize?: number;
59
+ /** Export interval in ms (default: 5000) */
60
+ scheduledDelayMillis?: number;
61
+ /** deployment environment, e.g. "development" | "staging" | "production" */
62
+ environment?: string;
63
+ /** application version string, e.g. "1.2.3" */
64
+ appVersion?: string;
65
+ /** stable identifier for the originating client/device (e.g. browser fingerprint, machine ID) */
66
+ deviceId?: string;
67
+ }
68
+
69
+ type ResolvedOptions = Required<Omit<EvalKitOptions, "baseUrl" | "apiUrl" | "environment" | "appVersion" | "deviceId">> & {
70
+ baseUrl: string;
71
+ apiUrl: string;
72
+ environment: string;
73
+ appVersion: string;
74
+ deviceId?: string;
75
+ };
76
+ declare class EvalKitClient {
77
+ readonly options: ResolvedOptions;
78
+ private provider;
79
+ readonly tracer: Tracer;
80
+ constructor(opts: EvalKitOptions);
81
+ private metaAttributes;
82
+ startTrace(name: string, attributes?: Record<string, string>): {
83
+ traceId: string;
84
+ end: (status?: "OK" | "ERROR") => void;
85
+ ctx: Context;
86
+ };
87
+ startHttpTrace(name: string, httpCtx: {
88
+ method: string;
89
+ url: string;
90
+ headers?: Record<string, string>;
91
+ requestBody?: unknown;
92
+ }, attributes?: Record<string, string>): {
93
+ traceId: string;
94
+ end: (status?: "OK" | "ERROR", response?: {
95
+ statusCode?: number;
96
+ body?: unknown;
97
+ headers?: Record<string, string>;
98
+ }) => void;
99
+ ctx: Context;
100
+ };
101
+ startSpan(name: string, attributes?: Record<string, string | number | boolean>, parentCtx?: Context): {
102
+ end: (status?: "OK" | "ERROR", extraAttributes?: Record<string, string | number | boolean>) => void;
103
+ ctx: Context;
104
+ };
105
+ traceFunction<T extends (...args: any[]) => any>(name: string, fn: T, attributes?: Record<string, string | number | boolean>, captureIO?: boolean): T;
106
+ flush(): Promise<void>;
107
+ destroy(): Promise<void>;
108
+ }
109
+
110
+ interface SimContext {
111
+ message: string;
112
+ sessionId: string;
113
+ state: Record<string, unknown>;
114
+ turn: number;
115
+ }
116
+ interface AgentTurnResult {
117
+ text: string;
118
+ toolCalls?: {
119
+ name: string;
120
+ args?: Record<string, unknown>;
121
+ }[];
122
+ retrievedContext?: string[];
123
+ }
124
+ type SimEntrypoint = (ctx: SimContext) => string | AgentTurnResult | Promise<string | AgentTurnResult>;
125
+ interface GenerateScenariosOptions {
126
+ agentInstructions: string;
127
+ tools?: unknown[];
128
+ functionSchemas?: unknown[];
129
+ context?: unknown;
130
+ rag?: Record<string, unknown>;
131
+ count?: number;
132
+ categories?: string[];
133
+ model?: string;
134
+ provider?: string;
135
+ apiKey?: string;
136
+ temperature?: number;
137
+ apiUrl?: string;
138
+ }
139
+ interface SimulateUserOptions {
140
+ entrypoint: SimEntrypoint;
141
+ scenarios: any[];
142
+ metrics?: string[];
143
+ maxTurns?: number;
144
+ tags?: string[];
145
+ safeMode?: boolean;
146
+ model?: string;
147
+ provider?: string;
148
+ apiKey?: string;
149
+ }
150
+
151
+ interface HapiPluginOptions {
152
+ name?: string | ((request: any) => string);
153
+ }
154
+ /**
155
+ * Hapi lifecycle plugin that auto-traces every incoming request.
156
+ *
157
+ * @example
158
+ * import Hapi from '@hapi/hapi';
159
+ * import evalkit from '@evalkit/sdk';
160
+ *
161
+ * evalkit.init({ subscriptionKey: '...', serviceName: 'my-api' });
162
+ * const server = Hapi.server({ port: 3000 });
163
+ * await server.register(evalkit.hapiPlugin());
164
+ */
165
+ declare function createHapiPlugin(client: EvalKitClient, options?: HapiPluginOptions): {
166
+ name: string;
167
+ register: (server: any) => void;
168
+ };
169
+
170
+ interface HonoMiddlewareOptions {
171
+ name?: string | ((c: any) => string);
172
+ }
173
+
174
+ interface KoaMiddlewareOptions {
175
+ name?: string | ((ctx: any) => string);
176
+ }
177
+
178
+ interface FastifyPluginOptions {
179
+ name?: string | ((request: any) => string);
180
+ }
181
+ type TraceparentExtractor = (header: string | undefined) => Context;
182
+ declare function createFastifyPlugin(client: EvalKitClient, pluginOpts?: FastifyPluginOptions, extractTraceparent?: TraceparentExtractor): (fastify: any, opts: FastifyPluginOptions, pluginDone: () => void) => void;
183
+
184
+ interface ExpressMiddlewareOptions {
185
+ name?: string | ((req: any) => string);
186
+ }
187
+
188
+ type OfflineMetric = 'tool_trajectory' | 'tool_f1' | 'tool_correctness' | 'response_match' | 'constraint_compliance' | 'contextual_precision' | 'contextual_recall';
189
+ interface OfflineEvalInput {
190
+ /** The agent or model output to evaluate. Required. */
191
+ output: string;
192
+ /** The original user input / query (optional, used for context). */
193
+ input?: string;
194
+ /** Reference / expected output (optional, for response_match). */
195
+ expectedOutput?: string;
196
+ /** Actual tool calls made by the agent. */
197
+ toolCalls?: Array<{
198
+ name: string;
199
+ args?: Record<string, unknown>;
200
+ }>;
201
+ /** Expected tool names in the expected call order. */
202
+ expectedTools?: string[];
203
+ /** Retrieved context chunks (for RAG precision/recall). */
204
+ retrievedContext?: string[];
205
+ /** Expected relevant context chunks (for RAG precision/recall). */
206
+ expectedContext?: string[];
207
+ /** Structural constraints to check in the output. */
208
+ constraints?: {
209
+ /** Expected number of slides/sections in the generated spec. */
210
+ slideCount?: number;
211
+ /** Terms that must appear in the output (case-insensitive). */
212
+ requiredTerms?: string[];
213
+ /** Whether the output must contain citations/references. */
214
+ hasCitations?: boolean;
215
+ };
216
+ /** Which metrics to compute. Defaults to all applicable metrics. */
217
+ metrics?: OfflineMetric[];
218
+ }
219
+ interface OfflineEvalResult {
220
+ /** Metric scores in the range [0.0, 1.0]. Only computed metrics are present. */
221
+ scores: Partial<Record<OfflineMetric, number>>;
222
+ /** Per-metric diagnostic details. */
223
+ details: Partial<Record<OfflineMetric, Record<string, unknown>>>;
224
+ }
225
+ /**
226
+ * Compute offline evaluation metrics locally.
227
+ *
228
+ * Results are returned as numeric scores (0–1) and, if the EvalKit SDK has
229
+ * been initialised via evalkit.init(), are also pushed as an `eval_result`
230
+ * span to the trace service so they appear alongside trace data.
231
+ *
232
+ * @example
233
+ * import { evaluate } from '@evalkit/sdk';
234
+ *
235
+ * const result = evaluate({
236
+ * output: 'The answer is AWS and Azure.',
237
+ * expectedTools: ['search_tool', 'render_tool'],
238
+ * toolCalls: [{ name: 'search_tool' }, { name: 'render_tool' }],
239
+ * constraints: { requiredTerms: ['AWS', 'Azure'] },
240
+ * });
241
+ * // result.scores.tool_f1 → 1.0
242
+ * // result.scores.response_match → 1.0
243
+ */
244
+ declare function evaluate(input: OfflineEvalInput): OfflineEvalResult;
245
+
246
+ declare class EvalKitInterceptor {
247
+ private client;
248
+ constructor(client: EvalKitClient);
249
+ intercept(executionContext: any, next: any): any;
250
+ }
251
+
252
+ declare function init(opts: EvalKitOptions): EvalKitClient;
253
+ declare function patchOpenAIClient(openaiInstance: any, parentCtx?: Context): void;
254
+ declare function patchAnthropicClient(anthropicInstance: any, parentCtx?: Context): void;
255
+ declare function patchBedrockClient(bedrockRuntimeClient: any): void;
256
+ declare function patchAnthropicVertexClient(anthropicVertexInstance: any): void;
257
+ declare function patchVertexGenerativeModel(model: any): void;
258
+ declare function patchCohereClient(cohereClient: any): void;
259
+ declare function patchGoogleAIModel(model: any): void;
260
+ /** Patch the @google/genai Models prototype (new unified Google SDK). Pass the
261
+ * Models class prototype, e.g. `require("@google/genai").Models.prototype`. */
262
+ declare function patchGoogleGenAIModels(modelsProto: any): void;
263
+ /** Build a LangChain/LangGraph callback handler for the `{ callbacks: [handler] }`
264
+ * path. init() also registers one globally; this is for explicit attachment. */
265
+ declare function langchainHandler(): Promise<any | null>;
266
+ declare function patchMongooseClient(mongoose: any): void;
267
+ declare function patchRedisClient(redisInstance: any): void;
268
+ declare function patchAxiosClient(axiosInstance: any): void;
269
+ declare function patchPgClient(pgInstance: any): void;
270
+ declare function patchMysql2Client(mysqlInstance: any): void;
271
+ declare function expressMiddleware(options?: ExpressMiddlewareOptions): (req: any, res: any, next: any) => void;
272
+ declare function fastifyPlugin(options?: FastifyPluginOptions): ReturnType<typeof createFastifyPlugin>;
273
+ declare function koaMiddleware(options?: KoaMiddlewareOptions): (ctx: any, next: () => Promise<void>) => Promise<void>;
274
+ declare function honoMiddleware(options?: HonoMiddlewareOptions): (c: any, next: () => Promise<void>) => Promise<void>;
275
+ declare function hapiPlugin(options?: HapiPluginOptions): ReturnType<typeof createHapiPlugin>;
276
+ declare function createNestjsInterceptor(): EvalKitInterceptor;
277
+ declare function startTrace(name: string, attributes?: Record<string, string>): {
278
+ traceId: string;
279
+ end: (status?: "OK" | "ERROR") => void;
280
+ ctx: Context;
281
+ };
282
+ declare function flush(): Promise<void>;
283
+ declare function startHttpTrace(name: string, httpCtx: {
284
+ method: string;
285
+ url: string;
286
+ headers?: Record<string, string>;
287
+ requestBody?: unknown;
288
+ }, attributes?: Record<string, string>): {
289
+ traceId: string;
290
+ end: (status?: "OK" | "ERROR", response?: {
291
+ statusCode?: number;
292
+ body?: unknown;
293
+ headers?: Record<string, string>;
294
+ }) => void;
295
+ ctx: Context;
296
+ };
297
+ declare function startSpan(name: string, attributes?: Record<string, string | number | boolean>, parentCtx?: Context): {
298
+ end: (status?: "OK" | "ERROR", extraAttributes?: Record<string, string | number | boolean>) => void;
299
+ ctx: Context;
300
+ };
301
+ declare function traceFunction<T extends (...args: any[]) => any>(name: string, fn: T, attributes?: Record<string, string | number | boolean>, captureIO?: boolean): T;
302
+ declare function TraceMethod(name?: string): MethodDecorator;
303
+ declare function Traced(options?: {
304
+ prefix?: string;
305
+ }): ClassDecorator;
306
+ declare function withTrace<T>(ctx: Context, fn: () => Promise<T>): Promise<T>;
307
+ /** Return the trace ID of the currently active span, or undefined if no span is active. */
308
+ declare function currentTraceId(): string | undefined;
309
+ declare function generateScenarios(opts: GenerateScenariosOptions): Promise<any[]>;
310
+ declare function simulateUser(opts: SimulateUserOptions): Promise<{
311
+ simulationId: string;
312
+ runId: string;
313
+ results: any[];
314
+ }>;
315
+ declare const _default: {
316
+ init: typeof init;
317
+ evaluate: typeof evaluate;
318
+ generateScenarios: typeof generateScenarios;
319
+ simulateUser: typeof simulateUser;
320
+ patchOpenAIClient: typeof patchOpenAIClient;
321
+ patchAnthropicClient: typeof patchAnthropicClient;
322
+ patchBedrockClient: typeof patchBedrockClient;
323
+ patchAnthropicVertexClient: typeof patchAnthropicVertexClient;
324
+ patchVertexGenerativeModel: typeof patchVertexGenerativeModel;
325
+ patchCohereClient: typeof patchCohereClient;
326
+ patchGoogleAIModel: typeof patchGoogleAIModel;
327
+ patchGoogleGenAIModels: typeof patchGoogleGenAIModels;
328
+ langchainHandler: typeof langchainHandler;
329
+ patchMongooseClient: typeof patchMongooseClient;
330
+ patchRedisClient: typeof patchRedisClient;
331
+ patchAxiosClient: typeof patchAxiosClient;
332
+ patchPgClient: typeof patchPgClient;
333
+ patchMysql2Client: typeof patchMysql2Client;
334
+ expressMiddleware: typeof expressMiddleware;
335
+ fastifyPlugin: typeof fastifyPlugin;
336
+ koaMiddleware: typeof koaMiddleware;
337
+ honoMiddleware: typeof honoMiddleware;
338
+ hapiPlugin: typeof hapiPlugin;
339
+ createNestjsInterceptor: typeof createNestjsInterceptor;
340
+ startTrace: typeof startTrace;
341
+ startHttpTrace: typeof startHttpTrace;
342
+ startSpan: typeof startSpan;
343
+ traceFunction: typeof traceFunction;
344
+ TraceMethod: typeof TraceMethod;
345
+ Traced: typeof Traced;
346
+ withTrace: typeof withTrace;
347
+ currentTraceId: typeof currentTraceId;
348
+ flush: typeof flush;
349
+ };
350
+
351
+ export { type AgentTurnResult, EvalKitClient, EvalKitInterceptor, type EvalKitOptions, type ExpressMiddlewareOptions, type FastifyPluginOptions, type GenerateScenariosOptions, type HapiPluginOptions, type HonoMiddlewareOptions, type KoaMiddlewareOptions, type OfflineEvalInput, type OfflineEvalResult, type OfflineMetric, type SimContext, type SimulateUserOptions, type SpanEvent, type TraceEnvelope, TraceMethod, Traced, createNestjsInterceptor, currentTraceId, _default as default, evaluate, expressMiddleware, fastifyPlugin, flush, generateScenarios, hapiPlugin, honoMiddleware, init, koaMiddleware, langchainHandler, patchAnthropicClient, patchAnthropicVertexClient, patchAxiosClient, patchBedrockClient, patchCohereClient, patchGoogleAIModel, patchGoogleGenAIModels, patchMongooseClient, patchMysql2Client, patchOpenAIClient, patchPgClient, patchRedisClient, patchVertexGenerativeModel, simulateUser, startHttpTrace, startSpan, startTrace, traceFunction, withTrace };
@@ -0,0 +1,351 @@
1
+ import { Tracer, Context } from '@opentelemetry/api';
2
+
3
+ /** Matches the Go trace-service TraceEnvelope exactly. */
4
+ interface TraceEnvelope {
5
+ traceId: string;
6
+ spanId: string;
7
+ parentSpanId?: string;
8
+ spanKind?: "CLIENT" | "SERVER" | "INTERNAL" | "PRODUCER" | "CONSUMER";
9
+ spanType: "llm_call" | "tool_call" | "log" | "http_call" | "function_call" | "db_query" | "eval_result";
10
+ status?: "OK" | "ERROR" | "UNSET";
11
+ statusMessage?: string;
12
+ serviceName?: string;
13
+ operation?: string;
14
+ model?: string;
15
+ provider?: string;
16
+ prompt?: string;
17
+ completion?: string;
18
+ attributes?: Record<string, string | number | boolean | string[]>;
19
+ events?: SpanEvent[];
20
+ tokensIn?: number;
21
+ tokensOut?: number;
22
+ latencyMs?: number;
23
+ startTime?: string;
24
+ endTime?: string;
25
+ createdAt: string;
26
+ environment?: string;
27
+ appVersion?: string;
28
+ userId?: string;
29
+ sessionId?: string;
30
+ deviceId?: string;
31
+ traceProjectId?: string;
32
+ sdkVersion?: string;
33
+ isSimulation?: boolean;
34
+ simulationId?: string;
35
+ scenarioId?: string;
36
+ runId?: string;
37
+ }
38
+ interface SpanEvent {
39
+ name: string;
40
+ timestamp: string;
41
+ attributes?: Record<string, string | number | boolean>;
42
+ }
43
+ interface EvalKitOptions {
44
+ subscriptionKey: string;
45
+ /**
46
+ * Base URL of the trace ingest service.
47
+ * Defaults to the hosted EvalKit service (https://ingest.evalkit.io).
48
+ * Override for self-hosted or local development (e.g. http://localhost:8085).
49
+ */
50
+ baseUrl?: string;
51
+ /** Orchestrator / control-plane base URL (scenario generation). Defaults to the hosted service. */
52
+ apiUrl?: string;
53
+ /** Service name attached to every span (default: "unknown") */
54
+ serviceName?: string;
55
+ /** Log flush details to console (default: false) */
56
+ debug?: boolean;
57
+ /** Max spans per export batch (default: 512) */
58
+ maxExportBatchSize?: number;
59
+ /** Export interval in ms (default: 5000) */
60
+ scheduledDelayMillis?: number;
61
+ /** deployment environment, e.g. "development" | "staging" | "production" */
62
+ environment?: string;
63
+ /** application version string, e.g. "1.2.3" */
64
+ appVersion?: string;
65
+ /** stable identifier for the originating client/device (e.g. browser fingerprint, machine ID) */
66
+ deviceId?: string;
67
+ }
68
+
69
+ type ResolvedOptions = Required<Omit<EvalKitOptions, "baseUrl" | "apiUrl" | "environment" | "appVersion" | "deviceId">> & {
70
+ baseUrl: string;
71
+ apiUrl: string;
72
+ environment: string;
73
+ appVersion: string;
74
+ deviceId?: string;
75
+ };
76
+ declare class EvalKitClient {
77
+ readonly options: ResolvedOptions;
78
+ private provider;
79
+ readonly tracer: Tracer;
80
+ constructor(opts: EvalKitOptions);
81
+ private metaAttributes;
82
+ startTrace(name: string, attributes?: Record<string, string>): {
83
+ traceId: string;
84
+ end: (status?: "OK" | "ERROR") => void;
85
+ ctx: Context;
86
+ };
87
+ startHttpTrace(name: string, httpCtx: {
88
+ method: string;
89
+ url: string;
90
+ headers?: Record<string, string>;
91
+ requestBody?: unknown;
92
+ }, attributes?: Record<string, string>): {
93
+ traceId: string;
94
+ end: (status?: "OK" | "ERROR", response?: {
95
+ statusCode?: number;
96
+ body?: unknown;
97
+ headers?: Record<string, string>;
98
+ }) => void;
99
+ ctx: Context;
100
+ };
101
+ startSpan(name: string, attributes?: Record<string, string | number | boolean>, parentCtx?: Context): {
102
+ end: (status?: "OK" | "ERROR", extraAttributes?: Record<string, string | number | boolean>) => void;
103
+ ctx: Context;
104
+ };
105
+ traceFunction<T extends (...args: any[]) => any>(name: string, fn: T, attributes?: Record<string, string | number | boolean>, captureIO?: boolean): T;
106
+ flush(): Promise<void>;
107
+ destroy(): Promise<void>;
108
+ }
109
+
110
+ interface SimContext {
111
+ message: string;
112
+ sessionId: string;
113
+ state: Record<string, unknown>;
114
+ turn: number;
115
+ }
116
+ interface AgentTurnResult {
117
+ text: string;
118
+ toolCalls?: {
119
+ name: string;
120
+ args?: Record<string, unknown>;
121
+ }[];
122
+ retrievedContext?: string[];
123
+ }
124
+ type SimEntrypoint = (ctx: SimContext) => string | AgentTurnResult | Promise<string | AgentTurnResult>;
125
+ interface GenerateScenariosOptions {
126
+ agentInstructions: string;
127
+ tools?: unknown[];
128
+ functionSchemas?: unknown[];
129
+ context?: unknown;
130
+ rag?: Record<string, unknown>;
131
+ count?: number;
132
+ categories?: string[];
133
+ model?: string;
134
+ provider?: string;
135
+ apiKey?: string;
136
+ temperature?: number;
137
+ apiUrl?: string;
138
+ }
139
+ interface SimulateUserOptions {
140
+ entrypoint: SimEntrypoint;
141
+ scenarios: any[];
142
+ metrics?: string[];
143
+ maxTurns?: number;
144
+ tags?: string[];
145
+ safeMode?: boolean;
146
+ model?: string;
147
+ provider?: string;
148
+ apiKey?: string;
149
+ }
150
+
151
+ interface HapiPluginOptions {
152
+ name?: string | ((request: any) => string);
153
+ }
154
+ /**
155
+ * Hapi lifecycle plugin that auto-traces every incoming request.
156
+ *
157
+ * @example
158
+ * import Hapi from '@hapi/hapi';
159
+ * import evalkit from '@evalkit/sdk';
160
+ *
161
+ * evalkit.init({ subscriptionKey: '...', serviceName: 'my-api' });
162
+ * const server = Hapi.server({ port: 3000 });
163
+ * await server.register(evalkit.hapiPlugin());
164
+ */
165
+ declare function createHapiPlugin(client: EvalKitClient, options?: HapiPluginOptions): {
166
+ name: string;
167
+ register: (server: any) => void;
168
+ };
169
+
170
+ interface HonoMiddlewareOptions {
171
+ name?: string | ((c: any) => string);
172
+ }
173
+
174
+ interface KoaMiddlewareOptions {
175
+ name?: string | ((ctx: any) => string);
176
+ }
177
+
178
+ interface FastifyPluginOptions {
179
+ name?: string | ((request: any) => string);
180
+ }
181
+ type TraceparentExtractor = (header: string | undefined) => Context;
182
+ declare function createFastifyPlugin(client: EvalKitClient, pluginOpts?: FastifyPluginOptions, extractTraceparent?: TraceparentExtractor): (fastify: any, opts: FastifyPluginOptions, pluginDone: () => void) => void;
183
+
184
+ interface ExpressMiddlewareOptions {
185
+ name?: string | ((req: any) => string);
186
+ }
187
+
188
+ type OfflineMetric = 'tool_trajectory' | 'tool_f1' | 'tool_correctness' | 'response_match' | 'constraint_compliance' | 'contextual_precision' | 'contextual_recall';
189
+ interface OfflineEvalInput {
190
+ /** The agent or model output to evaluate. Required. */
191
+ output: string;
192
+ /** The original user input / query (optional, used for context). */
193
+ input?: string;
194
+ /** Reference / expected output (optional, for response_match). */
195
+ expectedOutput?: string;
196
+ /** Actual tool calls made by the agent. */
197
+ toolCalls?: Array<{
198
+ name: string;
199
+ args?: Record<string, unknown>;
200
+ }>;
201
+ /** Expected tool names in the expected call order. */
202
+ expectedTools?: string[];
203
+ /** Retrieved context chunks (for RAG precision/recall). */
204
+ retrievedContext?: string[];
205
+ /** Expected relevant context chunks (for RAG precision/recall). */
206
+ expectedContext?: string[];
207
+ /** Structural constraints to check in the output. */
208
+ constraints?: {
209
+ /** Expected number of slides/sections in the generated spec. */
210
+ slideCount?: number;
211
+ /** Terms that must appear in the output (case-insensitive). */
212
+ requiredTerms?: string[];
213
+ /** Whether the output must contain citations/references. */
214
+ hasCitations?: boolean;
215
+ };
216
+ /** Which metrics to compute. Defaults to all applicable metrics. */
217
+ metrics?: OfflineMetric[];
218
+ }
219
+ interface OfflineEvalResult {
220
+ /** Metric scores in the range [0.0, 1.0]. Only computed metrics are present. */
221
+ scores: Partial<Record<OfflineMetric, number>>;
222
+ /** Per-metric diagnostic details. */
223
+ details: Partial<Record<OfflineMetric, Record<string, unknown>>>;
224
+ }
225
+ /**
226
+ * Compute offline evaluation metrics locally.
227
+ *
228
+ * Results are returned as numeric scores (0–1) and, if the EvalKit SDK has
229
+ * been initialised via evalkit.init(), are also pushed as an `eval_result`
230
+ * span to the trace service so they appear alongside trace data.
231
+ *
232
+ * @example
233
+ * import { evaluate } from '@evalkit/sdk';
234
+ *
235
+ * const result = evaluate({
236
+ * output: 'The answer is AWS and Azure.',
237
+ * expectedTools: ['search_tool', 'render_tool'],
238
+ * toolCalls: [{ name: 'search_tool' }, { name: 'render_tool' }],
239
+ * constraints: { requiredTerms: ['AWS', 'Azure'] },
240
+ * });
241
+ * // result.scores.tool_f1 → 1.0
242
+ * // result.scores.response_match → 1.0
243
+ */
244
+ declare function evaluate(input: OfflineEvalInput): OfflineEvalResult;
245
+
246
+ declare class EvalKitInterceptor {
247
+ private client;
248
+ constructor(client: EvalKitClient);
249
+ intercept(executionContext: any, next: any): any;
250
+ }
251
+
252
+ declare function init(opts: EvalKitOptions): EvalKitClient;
253
+ declare function patchOpenAIClient(openaiInstance: any, parentCtx?: Context): void;
254
+ declare function patchAnthropicClient(anthropicInstance: any, parentCtx?: Context): void;
255
+ declare function patchBedrockClient(bedrockRuntimeClient: any): void;
256
+ declare function patchAnthropicVertexClient(anthropicVertexInstance: any): void;
257
+ declare function patchVertexGenerativeModel(model: any): void;
258
+ declare function patchCohereClient(cohereClient: any): void;
259
+ declare function patchGoogleAIModel(model: any): void;
260
+ /** Patch the @google/genai Models prototype (new unified Google SDK). Pass the
261
+ * Models class prototype, e.g. `require("@google/genai").Models.prototype`. */
262
+ declare function patchGoogleGenAIModels(modelsProto: any): void;
263
+ /** Build a LangChain/LangGraph callback handler for the `{ callbacks: [handler] }`
264
+ * path. init() also registers one globally; this is for explicit attachment. */
265
+ declare function langchainHandler(): Promise<any | null>;
266
+ declare function patchMongooseClient(mongoose: any): void;
267
+ declare function patchRedisClient(redisInstance: any): void;
268
+ declare function patchAxiosClient(axiosInstance: any): void;
269
+ declare function patchPgClient(pgInstance: any): void;
270
+ declare function patchMysql2Client(mysqlInstance: any): void;
271
+ declare function expressMiddleware(options?: ExpressMiddlewareOptions): (req: any, res: any, next: any) => void;
272
+ declare function fastifyPlugin(options?: FastifyPluginOptions): ReturnType<typeof createFastifyPlugin>;
273
+ declare function koaMiddleware(options?: KoaMiddlewareOptions): (ctx: any, next: () => Promise<void>) => Promise<void>;
274
+ declare function honoMiddleware(options?: HonoMiddlewareOptions): (c: any, next: () => Promise<void>) => Promise<void>;
275
+ declare function hapiPlugin(options?: HapiPluginOptions): ReturnType<typeof createHapiPlugin>;
276
+ declare function createNestjsInterceptor(): EvalKitInterceptor;
277
+ declare function startTrace(name: string, attributes?: Record<string, string>): {
278
+ traceId: string;
279
+ end: (status?: "OK" | "ERROR") => void;
280
+ ctx: Context;
281
+ };
282
+ declare function flush(): Promise<void>;
283
+ declare function startHttpTrace(name: string, httpCtx: {
284
+ method: string;
285
+ url: string;
286
+ headers?: Record<string, string>;
287
+ requestBody?: unknown;
288
+ }, attributes?: Record<string, string>): {
289
+ traceId: string;
290
+ end: (status?: "OK" | "ERROR", response?: {
291
+ statusCode?: number;
292
+ body?: unknown;
293
+ headers?: Record<string, string>;
294
+ }) => void;
295
+ ctx: Context;
296
+ };
297
+ declare function startSpan(name: string, attributes?: Record<string, string | number | boolean>, parentCtx?: Context): {
298
+ end: (status?: "OK" | "ERROR", extraAttributes?: Record<string, string | number | boolean>) => void;
299
+ ctx: Context;
300
+ };
301
+ declare function traceFunction<T extends (...args: any[]) => any>(name: string, fn: T, attributes?: Record<string, string | number | boolean>, captureIO?: boolean): T;
302
+ declare function TraceMethod(name?: string): MethodDecorator;
303
+ declare function Traced(options?: {
304
+ prefix?: string;
305
+ }): ClassDecorator;
306
+ declare function withTrace<T>(ctx: Context, fn: () => Promise<T>): Promise<T>;
307
+ /** Return the trace ID of the currently active span, or undefined if no span is active. */
308
+ declare function currentTraceId(): string | undefined;
309
+ declare function generateScenarios(opts: GenerateScenariosOptions): Promise<any[]>;
310
+ declare function simulateUser(opts: SimulateUserOptions): Promise<{
311
+ simulationId: string;
312
+ runId: string;
313
+ results: any[];
314
+ }>;
315
+ declare const _default: {
316
+ init: typeof init;
317
+ evaluate: typeof evaluate;
318
+ generateScenarios: typeof generateScenarios;
319
+ simulateUser: typeof simulateUser;
320
+ patchOpenAIClient: typeof patchOpenAIClient;
321
+ patchAnthropicClient: typeof patchAnthropicClient;
322
+ patchBedrockClient: typeof patchBedrockClient;
323
+ patchAnthropicVertexClient: typeof patchAnthropicVertexClient;
324
+ patchVertexGenerativeModel: typeof patchVertexGenerativeModel;
325
+ patchCohereClient: typeof patchCohereClient;
326
+ patchGoogleAIModel: typeof patchGoogleAIModel;
327
+ patchGoogleGenAIModels: typeof patchGoogleGenAIModels;
328
+ langchainHandler: typeof langchainHandler;
329
+ patchMongooseClient: typeof patchMongooseClient;
330
+ patchRedisClient: typeof patchRedisClient;
331
+ patchAxiosClient: typeof patchAxiosClient;
332
+ patchPgClient: typeof patchPgClient;
333
+ patchMysql2Client: typeof patchMysql2Client;
334
+ expressMiddleware: typeof expressMiddleware;
335
+ fastifyPlugin: typeof fastifyPlugin;
336
+ koaMiddleware: typeof koaMiddleware;
337
+ honoMiddleware: typeof honoMiddleware;
338
+ hapiPlugin: typeof hapiPlugin;
339
+ createNestjsInterceptor: typeof createNestjsInterceptor;
340
+ startTrace: typeof startTrace;
341
+ startHttpTrace: typeof startHttpTrace;
342
+ startSpan: typeof startSpan;
343
+ traceFunction: typeof traceFunction;
344
+ TraceMethod: typeof TraceMethod;
345
+ Traced: typeof Traced;
346
+ withTrace: typeof withTrace;
347
+ currentTraceId: typeof currentTraceId;
348
+ flush: typeof flush;
349
+ };
350
+
351
+ export { type AgentTurnResult, EvalKitClient, EvalKitInterceptor, type EvalKitOptions, type ExpressMiddlewareOptions, type FastifyPluginOptions, type GenerateScenariosOptions, type HapiPluginOptions, type HonoMiddlewareOptions, type KoaMiddlewareOptions, type OfflineEvalInput, type OfflineEvalResult, type OfflineMetric, type SimContext, type SimulateUserOptions, type SpanEvent, type TraceEnvelope, TraceMethod, Traced, createNestjsInterceptor, currentTraceId, _default as default, evaluate, expressMiddleware, fastifyPlugin, flush, generateScenarios, hapiPlugin, honoMiddleware, init, koaMiddleware, langchainHandler, patchAnthropicClient, patchAnthropicVertexClient, patchAxiosClient, patchBedrockClient, patchCohereClient, patchGoogleAIModel, patchGoogleGenAIModels, patchMongooseClient, patchMysql2Client, patchOpenAIClient, patchPgClient, patchRedisClient, patchVertexGenerativeModel, simulateUser, startHttpTrace, startSpan, startTrace, traceFunction, withTrace };
package/dist/index.js ADDED
@@ -0,0 +1,15 @@
1
+ 'use strict';Object.defineProperty(exports,'__esModule',{value:true});var api=require('@opentelemetry/api'),crypto=require('crypto'),sdkTraceNode=require('@opentelemetry/sdk-trace-node'),sdkTraceBase=require('@opentelemetry/sdk-trace-base'),resources=require('@opentelemetry/resources'),semanticConventions=require('@opentelemetry/semantic-conventions'),module$1=require('module');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;var Ct=Object.defineProperty;var jn=Object.getOwnPropertyDescriptor;var $n=Object.getOwnPropertyNames;var Gn=Object.prototype.hasOwnProperty;var T=(e=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(e,{get:(t,n)=>(typeof require<"u"?require:t)[n]}):e)(function(e){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+e+'" is not supported')});var _=(e,t)=>()=>(e&&(t=e(e=0)),t);var Wt=(e,t)=>{for(var n in t)Ct(e,n,{get:t[n],enumerable:true});},Hn=(e,t,n,r)=>{if(t&&typeof t=="object"||typeof t=="function")for(let o of $n(t))!Gn.call(e,o)&&o!==n&&Ct(e,o,{get:()=>t[o],enumerable:!(r=jn(t,o))||r.enumerable});return e};var Ln=e=>Hn(Ct({},"__esModule",{value:true}),e);function Un(e,t){if(t.length===0)return {score:1,lcsLength:0};let n=e.length,r=t.length,o=Array.from({length:n+1},()=>new Array(r+1).fill(0));for(let i=1;i<=n;i++)for(let c=1;c<=r;c++)e[i-1]===t[c-1]?o[i][c]=o[i-1][c-1]+1:o[i][c]=Math.max(o[i-1][c],o[i][c-1]);let s=o[n][r];return {score:s/t.length,lcsLength:s}}function Bn(e,t){if(e.length===0&&t.length===0)return {score:1,precision:1,recall:1};if(e.length===0||t.length===0)return {score:0,precision:0,recall:0};let n=new Set(e),r=new Set(t),o=new Set([...n].filter(a=>r.has(a))),s=o.size/n.size,i=o.size/r.size;return {score:s+i===0?0:2*s*i/(s+i),precision:s,recall:i}}function Vn(e,t){if(t.length===0)return {score:1,called:0,total:0};let n=new Set(e),r=t.filter(o=>n.has(o)).length;return {score:r/t.length,called:r,total:t.length}}function Fn(e,t){if(t.length===0)return {score:1,matched:[],missing:[]};let n=e.toLowerCase(),r=t.filter(s=>n.includes(s.toLowerCase())),o=t.filter(s=>!n.includes(s.toLowerCase()));return {score:r.length/t.length,matched:r,missing:o}}function Dn(e,t){let n={},r=[];if(t.requiredTerms!==void 0&&t.requiredTerms.length>0){let s=e.toLowerCase(),i=t.requiredTerms.every(c=>s.includes(c.toLowerCase()));n.requiredTerms=i,r.push(i);}if(t.hasCitations!==void 0){let s=/\[[\d]+\]|\(\w[^)]{1,80}\d{4}\)|\bhttps?:\/\//.test(e);n.hasCitations=t.hasCitations?s:!s,r.push(n.hasCitations);}if(t.slideCount!==void 0){let s=/slide\s+\d+|section\s+\d+|##\s+\d+\./gi,c=(e.match(s)??[]).length===t.slideCount;n.slideCount=c,r.push(c);}return r.length===0?{score:1,checks:n}:{score:r.filter(Boolean).length/r.length,checks:n}}function Jn(e,t){if(e.length===0)return {score:1,relevant:0,total:0};let n=new Set(t),r=e.filter(o=>n.has(o)).length;return {score:r/e.length,relevant:r,total:e.length}}function zn(e,t){if(t.length===0)return {score:1,covered:0,total:0};let n=new Set(e),r=t.filter(o=>n.has(o)).length;return {score:r/t.length,covered:r,total:t.length}}function L(e){let t=new Set(e.metrics??["tool_trajectory","tool_f1","tool_correctness","response_match","constraint_compliance","contextual_precision","contextual_recall"]),n=(e.toolCalls??[]).map(a=>a.name),r=e.expectedTools??[],o={},s={};if(t.has("tool_trajectory")&&r.length>0){let a=Un(n,r);o.tool_trajectory=a.score,s.tool_trajectory={lcsLength:a.lcsLength,expectedCount:r.length};}if(t.has("tool_f1")&&(n.length>0||r.length>0)){let a=Bn(n,r);o.tool_f1=a.score,s.tool_f1={precision:a.precision,recall:a.recall};}if(t.has("tool_correctness")&&r.length>0){let a=Vn(n,r);o.tool_correctness=a.score,s.tool_correctness={called:a.called,total:a.total};}let i=e.constraints?.requiredTerms??[];if(t.has("response_match")&&i.length>0){let a=Fn(e.output,i);o.response_match=a.score,s.response_match={matched:a.matched,missing:a.missing};}if(t.has("constraint_compliance")&&e.constraints){let a=Dn(e.output,e.constraints);o.constraint_compliance=a.score,s.constraint_compliance={checks:a.checks};}if(t.has("contextual_precision")&&e.retrievedContext!==void 0&&e.expectedContext!==void 0){let a=Jn(e.retrievedContext,e.expectedContext);o.contextual_precision=a.score,s.contextual_precision={relevant:a.relevant,total:a.total};}if(t.has("contextual_recall")&&e.retrievedContext!==void 0&&e.expectedContext!==void 0){let a=zn(e.retrievedContext,e.expectedContext);o.contextual_recall=a.score,s.contextual_recall={covered:a.covered,total:a.total};}let c={scores:o,details:s};try{let a=(Qt(),Ln(Xt)),l={"evalkit.span_type":"eval_result","evalkit.eval_type":"offline"};for(let[p,m]of Object.entries(o))l[`evalkit.metric.${p}`]=m;let{end:u}=a.startSpan("evaluation",l);u("OK");}catch{}return c}var dt=_(()=>{});function K(e,t,n){if(!e||!t||!U.has(e))return;let r=W.get(e)??[];r.push({name:t,args:n}),W.set(e,r);}var U,W,P=_(()=>{U=new Map,W=new Map;});function mt(e){return crypto.randomBytes(e).toString("hex")}function Yt(e){return typeof e=="function"?{name:e.name||"tool"}:typeof e=="string"||e&&typeof e=="object"?e:String(e)}async function Zt(e,t){let n=(t.apiUrl??process.env.EVALKIT_API_URL??e.options.apiUrl).replace(/\/$/,""),r={agentInstructions:t.agentInstructions,count:t.count??5};t.tools&&(r.tools=t.tools.map(Yt)),t.functionSchemas&&(r.functionSchemas=t.functionSchemas.map(Yt)),t.context!==void 0&&(r.context=t.context),t.rag&&(r.rag=t.rag),t.categories&&(r.categories=t.categories),t.model&&(r.model=t.model),t.provider&&(r.provider=t.provider),t.apiKey&&(r.apiKey=t.apiKey),t.temperature!==void 0&&(r.temperature=t.temperature);let o=await fetch(n+"/scenarios/generate",{method:"POST",headers:{"Content-Type":"application/json","X-Subscription-Key":e.options.subscriptionKey},body:JSON.stringify(r)});if(!o.ok){let i=await o.text().catch(()=>"");throw new Error(`generateScenarios failed ${o.status}: ${i}`)}return (await o.json()).scenarios??[]}function Qn(e){let t=e.turns??e.messages??[],n=[];for(let r of t)typeof r=="string"?n.push(r):r&&typeof r=="object"&&r.content&&(r.role??"user")==="user"&&n.push(String(r.content));return n.length===0&&e.starting_prompt&&n.push(String(e.starting_prompt)),n}function Yn(e,t,n,r){let o=Array.from(new Set([...e.constraints?.required_terms??[],...e.target_keywords??[]])),s={};o.length&&(s.requiredTerms=o),e.constraints?.has_citations!==void 0&&(s.hasCitations=e.constraints.has_citations);try{return L({output:t,toolCalls:n,expectedTools:e.expected_tools??[],constraints:s,metrics:r}).scores}catch{return {}}}async function Zn(e,t,n,r){let o=n.name??"scenario",s=n.scenario_id??"scn_"+mt(6),i="sess_"+mt(6),c=Qn(n).slice(0,r.maxTurns),a={...n.setup?.state??{},__safe_mode__:t.safeMode??true},{traceId:l,end:u,ctx:p}=e.startTrace(`scenario:${o}`,{"evalkit.session_id":i});U.set(l,{simulationId:r.simulationId,runId:r.runId,scenarioId:s});let m="OK",d,g=[],f=[],h=0,y={};try{await api.context.with(p,async()=>{for(let R=0;R<c.length;R++){let O={message:c[R],sessionId:i,state:a,turn:R+1},x=await t.entrypoint(O);x&&typeof x=="object"&&"text"in x?(g.push(x.text),x.toolCalls&&f.push(...x.toolCalls)):g.push(String(x)),h++;}let k=f.length?f:W.get(l)??[];y=Yn(n,g.join(`
2
+ `),k,t.metrics);});}catch(k){m="ERROR",d=k?.message??String(k);}finally{u(m);}let v={scenarioId:s,name:o,status:m,turns:h,scores:y};return d&&(v.error=d),{result:v,traceId:l}}async function te(e,t){let n="sim_"+mt(8),r="run_"+mt(8),o=t.maxTurns??12,s=[],i=[];for(let c of t.scenarios){let{result:a,traceId:l}=await Zn(e,t,c,{simulationId:n,runId:r,maxTurns:o});s.push(a),i.push(l);}await e.flush();for(let c of i)U.delete(c),W.delete(c);return {simulationId:n,runId:r,results:s}}var ee=_(()=>{P();dt();});var M,ne=_(()=>{(function(e){e[e.SUCCESS=0]="SUCCESS",e[e.FAILED=1]="FAILED";})(M||(M={}));});var re=_(()=>{ne();});function kt(e){return e[0]*1e3+e[1]/1e6}function tr(e){return {0:"INTERNAL",1:"SERVER",2:"CLIENT",3:"PRODUCER",4:"CONSUMER"}[e]??"INTERNAL"}function er(e){return e===1?"OK":e===2?"ERROR":"UNSET"}function nr(e){let t={};for(let[n,r]of Object.entries(e))n.startsWith("evalkit.")||n==="gen_ai.system"||r!=null&&(t[n]=r);return t}function oe(e){return new Promise(t=>setTimeout(t,e))}var gt,se=_(()=>{re();P();gt=class{constructor(t){this.url=`${t.baseUrl.replace(/\/$/,"")}/v1/ingest`,this.subscriptionKey=t.subscriptionKey,this.debug=t.debug??false;}export(t,n){let r=t.map(s=>this.toEnvelope(s)),o={events:r};this.debug&&console.log(`[evalkit] sending ${r.length} span(s) \u2192 ${this.url}`),this.fetchWithRetry(this.url,{method:"POST",headers:{"Content-Type":"application/json","X-Subscription-Key":this.subscriptionKey},body:JSON.stringify(o)}).then(async s=>{if(!s.ok){let i=await s.text().catch(()=>"(no body)");console.error(`[evalkit] export failed ${s.status}: ${i}`),n({code:M.FAILED});return}if(this.debug){let i=await s.json().catch(()=>({}));console.log(`[evalkit] exported ${r.length} span(s) \u2014 status: ${i.status}`);}n({code:M.SUCCESS});}).catch(s=>{console.error("[evalkit] export network error:",s),n({code:M.FAILED});});}async fetchWithRetry(t,n,r=3){let o=[200,600,1800],s;for(let i=0;i<=r;i++)try{let c=await fetch(t,n);if(c.ok||c.status>=400&&c.status<500)return c;if(i<r)this.debug&&console.warn(`[evalkit] HTTP ${c.status}, retry ${i+1}/${r}`),await oe(o[i]??1800);else return c}catch(c){s=c,i<r&&(this.debug&&console.warn(`[evalkit] network error, retry ${i+1}/${r}:`,c),await oe(o[i]??1800));}throw s}shutdown(){return Promise.resolve()}toEnvelope(t){let n=t.spanContext(),r=t.attributes,o=kt(t.startTime),s=kt(t.endTime),i=t.events.map(l=>({name:l.name,timestamp:new Date(kt(l.time)).toISOString(),attributes:l.attributes})),c={traceId:n.traceId,spanId:n.spanId,parentSpanId:t.parentSpanId,spanKind:tr(t.kind),spanType:r["evalkit.span_type"]??"log",status:er(t.status.code),statusMessage:t.status.message,serviceName:t.resource.attributes["service.name"],operation:t.name,model:r["gen_ai.response.model"]??r["gen_ai.request.model"],provider:r["gen_ai.system"],prompt:r["evalkit.prompt"],completion:r["evalkit.completion"],tokensIn:Math.round(r["gen_ai.usage.input_tokens"]||0)||void 0,tokensOut:Math.round(r["gen_ai.usage.output_tokens"]||0)||void 0,latencyMs:Math.round(s-o),startTime:new Date(o).toISOString(),endTime:new Date(s).toISOString(),events:i.length>0?i:void 0,attributes:nr(r),createdAt:new Date(o).toISOString(),environment:r["evalkit.environment"],appVersion:r["evalkit.app_version"],userId:r["evalkit.user_id"],sessionId:r["evalkit.session_id"],deviceId:r["evalkit.device_id"],sdkVersion:r["evalkit.sdk_version"]},a=U.get(n.traceId);return a&&(c.isSimulation=true,c.simulationId=a.simulationId,c.scenarioId=a.scenarioId,c.runId=a.runId),c}};});function St(e,t=cr){let n;try{n=JSON.stringify(e);}catch{}if(n===void 0)try{n=String(e);}catch{n="<unserializable>";}return n.length>t?n.slice(0,t)+"\u2026":n}var ir,cr;exports.EvalKitClient=void 0;var bt=_(()=>{se();ir="0.1.17",cr=4096;exports.EvalKitClient=class{constructor(t){this.options={serviceName:"unknown",debug:false,maxExportBatchSize:512,scheduledDelayMillis:5e3,baseUrl:"https://api.syntropylabs.ai",apiUrl:"https://api.syntropylabs.ai",environment:"",appVersion:"",...t};let n=new gt({baseUrl:this.options.baseUrl,subscriptionKey:this.options.subscriptionKey,debug:this.options.debug});this.provider=new sdkTraceNode.NodeTracerProvider({resource:new resources.Resource({[semanticConventions.ATTR_SERVICE_NAME]:this.options.serviceName}),spanProcessors:[new sdkTraceBase.BatchSpanProcessor(n,{maxExportBatchSize:this.options.maxExportBatchSize,scheduledDelayMillis:this.options.scheduledDelayMillis})]}),this.provider.register(),this.tracer=api.trace.getTracer("evalkit","0.1.0");}metaAttributes(){let t={"evalkit.sdk_version":ir};return this.options.environment&&(t["evalkit.environment"]=this.options.environment),this.options.appVersion&&(t["evalkit.app_version"]=this.options.appVersion),this.options.deviceId&&(t["evalkit.device_id"]=this.options.deviceId),t}startTrace(t,n){let r=this.tracer.startSpan(t,{kind:api.SpanKind.SERVER,attributes:{"evalkit.span_type":"log",...this.metaAttributes(),...n}},api.context.active()),o=api.trace.setSpan(api.context.active(),r);return {traceId:r.spanContext().traceId,ctx:o,end:(i="OK")=>{r.setStatus({code:i==="OK"?api.SpanStatusCode.OK:api.SpanStatusCode.ERROR}),r.end();}}}startHttpTrace(t,n,r){let o=this.tracer.startSpan(t,{kind:api.SpanKind.SERVER,attributes:{"evalkit.span_type":"http_call","http.method":n.method,"http.url":n.url,...n.headers?{"http.request.headers":JSON.stringify(n.headers)}:{},...n.requestBody!==void 0?{"http.request.body":JSON.stringify(n.requestBody)}:{},...this.metaAttributes(),...r}},api.context.active()),s=api.trace.setSpan(api.context.active(),o);return {traceId:o.spanContext().traceId,ctx:s,end:(c="OK",a)=>{a?.statusCode!==void 0&&o.setAttribute("http.status_code",a.statusCode),a?.body!==void 0&&o.setAttribute("http.response.body",JSON.stringify(a.body)),a?.headers&&o.setAttribute("http.response.headers",JSON.stringify(a.headers)),o.setStatus({code:c==="OK"?api.SpanStatusCode.OK:api.SpanStatusCode.ERROR}),o.end();}}}startSpan(t,n,r){let o=this.tracer.startSpan(t,{kind:api.SpanKind.INTERNAL,attributes:{"evalkit.span_type":"function_call",...this.metaAttributes(),...n}},r??api.context.active());return {ctx:api.trace.setSpan(api.context.active(),o),end:(i="OK",c)=>{c&&o.setAttributes(c),o.setStatus({code:i==="OK"?api.SpanStatusCode.OK:api.SpanStatusCode.ERROR}),o.end();}}}traceFunction(t,n,r,o=true){let s=this;return function(...i){let c={"evalkit.span_type":"function_call",...r};o&&i.length&&(c["function.args"]=St(i));let{ctx:a,end:l}=s.startSpan(t,c),u;try{u=api.context.with(a,()=>n.apply(this,i));}catch(p){throw l("ERROR",{"error.message":p?.message??String(p)}),p}return u&&typeof u.then=="function"?u.then(p=>(l("OK",o?{"function.result":St(p)}:void 0),p),p=>{throw l("ERROR",{"error.message":p?.message??String(p)}),p}):(l("OK",o?{"function.result":St(u)}:void 0),u)}}async flush(){await this.provider.forceFlush();}async destroy(){await this.provider.shutdown();}};});function A(e){if(!e)return api.context.active();let t=e.split("-");return t.length===4&&t[0]==="00"&&t[1].length===32&&t[2].length===16?api.trace.setSpanContext(api.ROOT_CONTEXT,{traceId:t[1],spanId:t[2],traceFlags:parseInt(t[3],16),isRemote:true}):api.context.active()}var F=_(()=>{});function dr(e,t){let n="",r=0,o=0,s=false;function i(c){s||(s=true,c?t.setStatus({code:api.SpanStatusCode.ERROR,message:c.message}):(t.setAttributes({"evalkit.completion":n,"gen_ai.usage.input_tokens":r,"gen_ai.usage.output_tokens":o,"gen_ai.streaming":true}),t.setStatus({code:api.SpanStatusCode.OK})),t.end());}return new Proxy(e,{get(c,a,l){if(a===Symbol.asyncIterator)return function(){let p=c[Symbol.asyncIterator]();return {async next(){try{let m=await p.next();if(!m.done&&m.value){let d=m.value,g=d.choices?.[0]?.delta?.content;g&&(n+=g),d.usage&&(r=d.usage.prompt_tokens??0,o=d.usage.completion_tokens??0);}return m.done&&i(),m}catch(m){throw i(m instanceof Error?m:new Error(String(m))),m}},return(){return i(),p.return?.()??Promise.resolve({done:true,value:void 0})},throw(m){return i(m instanceof Error?m:new Error(String(m))),p.throw?.(m)??Promise.reject(m)},[Symbol.asyncIterator](){return this}}};let u=Reflect.get(c,a,l);return typeof u=="function"?u.bind(c):u}})}function N(e,t,n,r="openai"){if(t.create.__evalkit)return;let o=t.create;t.create=async function(...s){let i=s[0],c=n??api.context.active(),a=e.tracer.startSpan("chat.completions.create",{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":r,"gen_ai.request.model":i.model??"unknown",...i.temperature!=null&&{"gen_ai.request.temperature":i.temperature},...i.max_tokens!=null&&{"gen_ai.request.max_tokens":i.max_tokens},...i.top_p!=null&&{"gen_ai.request.top_p":i.top_p},"evalkit.prompt":mr(i.messages??[])}},c),l=api.trace.setSpan(c,a);if(i?.stream){let d;try{d=await api.context.with(l,()=>o.apply(this,s));}catch(g){throw a.setStatus({code:api.SpanStatusCode.ERROR,message:g instanceof Error?g.message:String(g)}),a.end(),g}return dr(d,a)}let u;try{u=await api.context.with(l,()=>o.apply(this,s));}catch(d){throw a.setStatus({code:api.SpanStatusCode.ERROR,message:d instanceof Error?d.message:String(d)}),a.end(),d}let p=u.choices?.[0],m=p?.message.content??"";a.setAttributes({"gen_ai.response.model":u.model,"gen_ai.response.id":u.id,"gen_ai.usage.input_tokens":u.usage?.prompt_tokens??0,"gen_ai.usage.output_tokens":u.usage?.completion_tokens??0,"gen_ai.usage.total_tokens":u.usage?.total_tokens??0,"gen_ai.response.finish_reasons":p?.finish_reason?[p.finish_reason]:[],"evalkit.completion":m});for(let d of p?.message.tool_calls??[]){a.addEvent("gen_ai.tool.call",{"gen_ai.tool.call.id":d.id,"gen_ai.tool.name":d.function.name,"gen_ai.tool.call.arguments":d.function.arguments});try{let f;try{f=JSON.parse(d.function.arguments);}catch{}K(a.spanContext().traceId,d.function.name,f);}catch{}e.tracer.startSpan(d.function.name,{kind:api.SpanKind.INTERNAL,attributes:{"evalkit.span_type":"tool_call","gen_ai.tool.name":d.function.name,"gen_ai.tool.call.id":d.id,"gen_ai.tool.call.arguments":d.function.arguments}},l).end();}return a.setStatus({code:api.SpanStatusCode.OK}),a.end(),u},t.create.__evalkit=true;}function mr(e){return e.map(t=>`${t.role}: ${t.content??""}`).join(`
3
+ `)}var wt=_(()=>{P();});function fr(e,t){let n="",r=0,o=0,s=false;function i(a){let l=a?.type;if(l==="content_block_delta"){let u=a.delta;u?.type==="text_delta"&&u.text&&(n+=u.text);}else l==="message_start"?r=a.message?.usage?.input_tokens??0:l==="message_delta"&&(o=a.usage?.output_tokens??0);}function c(a){s||(s=true,a?t.setStatus({code:api.SpanStatusCode.ERROR,message:a.message}):(t.setAttributes({"evalkit.completion":n,"gen_ai.usage.input_tokens":r,"gen_ai.usage.output_tokens":o,"gen_ai.streaming":true}),t.setStatus({code:api.SpanStatusCode.OK})),t.end());}return new Proxy(e,{get(a,l,u){if(l===Symbol.asyncIterator)return function(){let m=a[Symbol.asyncIterator]();return {async next(){try{let d=await m.next();return !d.done&&d.value&&i(d.value),d.done&&c(),d}catch(d){throw c(d instanceof Error?d:new Error(String(d))),d}},return(){return c(),m.return?.()??Promise.resolve({done:true,value:void 0})},throw(d){return c(d instanceof Error?d:new Error(String(d))),m.throw?.(d)??Promise.reject(d)},[Symbol.asyncIterator](){return this}}};let p=Reflect.get(a,l,u);return typeof p=="function"?p.bind(a):p}})}function j(e,t,n){if(t.create.__evalkit)return;let r=t.create;t.create=async function(...o){let s=o[0],i=n??api.context.active(),c=yr(s.system,s.messages??[]),a=e.tracer.startSpan("messages.create",{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"anthropic","gen_ai.request.model":s.model??"unknown",...s.temperature!=null&&{"gen_ai.request.temperature":s.temperature},...s.max_tokens!=null&&{"gen_ai.request.max_tokens":s.max_tokens},...s.top_p!=null&&{"gen_ai.request.top_p":s.top_p},"evalkit.prompt":c}},i),l=api.trace.setSpan(i,a);if(s?.stream){let m;try{m=await api.context.with(l,()=>r.apply(this,o));}catch(d){throw a.setStatus({code:api.SpanStatusCode.ERROR,message:d instanceof Error?d.message:String(d)}),a.end(),d}return fr(m,a)}let u;try{u=await api.context.with(l,()=>r.apply(this,o));}catch(m){throw a.setStatus({code:api.SpanStatusCode.ERROR,message:m instanceof Error?m.message:String(m)}),a.end(),m}let p=u.content.filter(m=>m.type==="text").map(m=>m.text??"").join("");a.setAttributes({"gen_ai.response.model":u.model,"gen_ai.response.id":u.id,"gen_ai.usage.input_tokens":u.usage?.input_tokens??0,"gen_ai.usage.output_tokens":u.usage?.output_tokens??0,"gen_ai.response.finish_reasons":u.stop_reason?[u.stop_reason]:[],"evalkit.completion":p});for(let m of u.content)if(m.type==="tool_use"){let d=m;a.addEvent("gen_ai.tool.call",{"gen_ai.tool.call.id":d.id,"gen_ai.tool.name":d.name,"gen_ai.tool.call.arguments":JSON.stringify(d.input)});try{K(a.spanContext().traceId,d.name,d.input);}catch{}e.tracer.startSpan(d.name,{kind:api.SpanKind.INTERNAL,attributes:{"evalkit.span_type":"tool_call","gen_ai.tool.name":d.name,"gen_ai.tool.call.id":d.id,"gen_ai.tool.call.arguments":JSON.stringify(d.input)}},l).end();}return a.setStatus({code:api.SpanStatusCode.OK}),a.end(),u},t.create.__evalkit=true;}function yr(e,t){let n=[];return e&&n.push(`system: ${e}`),n.push(...t.map(r=>`${r.role}: ${r.content}`)),n.join(`
4
+ `)}var yt=_(()=>{P();});function ht(e,t){let n=t.Query?.prototype;if(!n||n.__evalkit)return;let r=n.exec;n.exec=async function(){if(!api.trace.getActiveSpan()?.isRecording())return r.call(this);let s=this.op??"query",i=this.model?.collection?.name??this._collection?.collectionName??"unknown",c=e.tracer.startSpan(`${s} ${i}`,{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"db_query","db.system":"mongodb","db.operation":s,"db.collection":i,"db.query":JSON.stringify(this._conditions??{})}},api.context.active());try{let a=await r.call(this);return c.setStatus({code:api.SpanStatusCode.OK}),c.end(),a}catch(a){throw c.setStatus({code:api.SpanStatusCode.ERROR,message:a.message}),c.end(),a}},n.__evalkit=true;}var Tt=_(()=>{});function Y(e,t){let r=t?.prototype&&(typeof t.prototype.sendCommand=="function"||typeof t.prototype.call=="function")?t.prototype:Object.getPrototypeOf(t);if(!r||r.__evalkit_redis)return;let o=typeof r.sendCommand=="function"?"sendCommand":typeof r.call=="function"?"call":null;if(!o)return;let s=r[o];r[o]=async function(i,...c){if(!api.trace.getActiveSpan()?.isRecording())return s.call(this,i,...c);let l=Array.isArray(i)?i[0]:i?.name??i?.args?.[0]??"cmd",u=(typeof l=="string"?l:String(l)).toUpperCase(),p=e.tracer.startSpan(`redis ${u}`,{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"db_query","db.system":"redis","db.operation":u}},api.context.active());try{let m=await s.call(this,i,...c);return p.setStatus({code:api.SpanStatusCode.OK}),p.end(),m}catch(m){throw p.setStatus({code:api.SpanStatusCode.ERROR,message:m.message}),p.end(),m}},r.__evalkit_redis=true;}var At=_(()=>{});function w(e){let t={};for(let[n,r]of Object.entries(e))Rr.test(n)||r!==void 0&&(t[n]=Array.isArray(r)?r.join(", "):String(r));return t}var Rr,It=_(()=>{Rr=/^(authorization|cookie|set-cookie|x-api-key|api-key|x-auth-token|proxy-authorization|x-secret|x-access-token|token|password)$/i;});var D,Kt=_(()=>{D=new Map;});function Z(e,t){if(!t.__evalkit_axios){if(t.__evalkit_axios=true,typeof t.create=="function"){let n=t.create.bind(t);t.create=function(...r){let o=n(...r);return Z(e,o),o};}t.interceptors.request.use(n=>{let r=(n.baseURL?n.baseURL.replace(/\/$/,""):"")+(n.url??"");if(wr.some(u=>u.test(r))||!api.trace.getActiveSpan()?.isRecording())return n;let s=n.url??"";try{s=new URL(r,n.baseURL??"http://localhost").pathname;}catch{}let i=(n.method??"get").toUpperCase(),c=w(n.headers??{}),a=e.tracer.startSpan(`${i} ${s}`,{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"http_call","http.method":i,"http.url":r,...Object.keys(c).length?{"http.request.headers":JSON.stringify(c)}:{},...n.data!==void 0?{"http.request.body":typeof n.data=="string"?n.data.slice(0,4096):JSON.stringify(n.data).slice(0,4096)}:{}}},api.context.active()),l=a.spanContext();return n.headers=n.headers??{},n.headers.traceparent=`00-${l.traceId}-${l.spanId}-01`,n.headers["x-evalkit-span-id"]=l.spanId,D.set(l.spanId,a),n.__evalkitSpan=a,n.__evalkitSpanId=l.spanId,n}),t.interceptors.response.use(n=>{let r=n.config?.__evalkitSpan;if(n.config?.__evalkitSpanId&&D.delete(n.config.__evalkitSpanId),r){let o=w(n.headers??{}),s=n.data,i;s!=null&&(i=(typeof s=="string"?s:JSON.stringify(s)).slice(0,4096)),r.setAttributes({"http.status_code":n.status,...Object.keys(o).length?{"http.response.headers":JSON.stringify(o)}:{},...i!==void 0?{"http.response.body":i}:{}}),r.setStatus({code:api.SpanStatusCode.OK}),r.end();}return n},n=>{let r=n.config?.__evalkitSpan;if(n.config?.__evalkitSpanId&&D.delete(n.config.__evalkitSpanId),r){let o=n.response?.status??0,s=w(n.response?.headers??{}),i=n.response?.data,c;i!=null&&(c=(typeof i=="string"?i:JSON.stringify(i)).slice(0,4096)),r.setAttributes({"http.status_code":o,"error.message":n.message,...Object.keys(s).length?{"http.response.headers":JSON.stringify(s)}:{},...c!==void 0?{"http.response.body":c}:{}}),r.setStatus({code:api.SpanStatusCode.ERROR,message:n.message}),r.end();}throw n});}}var wr,Pt=_(()=>{It();Kt();wr=[/\/v1\/ingest/,/\/health(z)?$/];});function tt(e,t){let n=t?.prototype??Object.getPrototypeOf(t);if(!n||n.__evalkit_pg)return;let r=n.query;typeof r=="function"&&(n.query=function(...o){if(!api.trace.getActiveSpan()?.isRecording())return r.apply(this,o);let i=typeof o[0]=="string"?o[0]:o[0]?.text??o[0]?.name??"query",c=Array.isArray(o[1])?o[1]:o[0]?.values??void 0,l=i.trim().match(/^(\w+)/)?.[1]?.toUpperCase()??"QUERY",p=i.match(/(?:FROM|INTO|UPDATE|JOIN)\s+"?(\w+)"?/i)?.[1]??"",m=p?`${l} ${p}`:`pg ${l}`,d=e.tracer.startSpan(m,{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"db_query","db.system":"postgresql","db.operation":l,"db.statement":i.slice(0,2048),...c!==void 0?{"db.params":JSON.stringify(c).slice(0,1024)}:{},...p?{"db.sql.table":p}:{}}},api.context.active()),g=o[o.length-1];if(typeof g=="function"){let h=g,y=o.slice(0,-1).concat([(v,k)=>{v?(d.setStatus({code:api.SpanStatusCode.ERROR,message:v.message}),d.setAttribute("error.message",v.message)):(d.setAttribute("db.rows_affected",k?.rowCount??0),d.setStatus({code:api.SpanStatusCode.OK})),d.end(),h(v,k);}]);return r.apply(this,y)}return r.apply(this,o).then(h=>(d.setAttribute("db.rows_affected",h?.rowCount??0),d.setStatus({code:api.SpanStatusCode.OK}),d.end(),h),h=>{throw d.setStatus({code:api.SpanStatusCode.ERROR,message:h?.message}),d.setAttribute("error.message",h?.message??String(h)),d.end(),h})},n.__evalkit_pg=true);}var Mt=_(()=>{});function et(e,t){let n=t?.prototype??Object.getPrototypeOf(t);if(!(!n||n.__evalkit_mysql2)){for(let r of ["query","execute"]){let o=n[r];typeof o=="function"&&(n[r]=function(...s){if(!api.trace.getActiveSpan()?.isRecording())return o.apply(this,s);let c=typeof s[0]=="string"?s[0]:s[0]?.sql??"query",a=Array.isArray(s[1])?s[1]:void 0,u=c.trim().match(/^(\w+)/)?.[1]?.toUpperCase()??"QUERY",m=c.match(/(?:FROM|INTO|UPDATE|JOIN)\s+`?(\w+)`?/i)?.[1]??"",d=m?`${u} ${m}`:`mysql ${u}`,g=e.tracer.startSpan(d,{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"db_query","db.system":"mysql","db.operation":u,"db.statement":c.slice(0,2048),...a!==void 0?{"db.params":JSON.stringify(a).slice(0,1024)}:{},...m?{"db.sql.table":m}:{}}},api.context.active()),f=s[s.length-1];if(typeof f=="function"){let y=f,v=s.slice(0,-1).concat([(k,R,O)=>{k?(g.setStatus({code:api.SpanStatusCode.ERROR,message:k.message}),g.setAttribute("error.message",k.message)):(g.setAttribute("db.rows_affected",Array.isArray(R)?R.length:R?.affectedRows??0),g.setStatus({code:api.SpanStatusCode.OK})),g.end(),y(k,R,O);}]);return o.apply(this,v)}let h=o.apply(this,s);return h&&typeof h.then=="function"?h.then(([y,v])=>(g.setAttribute("db.rows_affected",Array.isArray(y)?y.length:y?.affectedRows??0),g.setStatus({code:api.SpanStatusCode.OK}),g.end(),[y,v]),y=>{throw g.setStatus({code:api.SpanStatusCode.ERROR,message:y?.message}),g.setAttribute("error.message",y?.message??String(y)),g.end(),y}):(g.end(),h)});}n.__evalkit_mysql2=true;}}var qt=_(()=>{});function Nr(e){if(!e||typeof e!="object")return false;let t=e.constructor?.name??"";return t==="ConverseCommand"||t==="ConverseStreamCommand"}function nt(e,t,n){if(t.send.__evalkit)return;let r=t.send;t.send=async function(...o){let s=o[0];if(!Nr(s))return r.apply(this,o);let i=s.input,c=i?.modelId??"unknown",a=c.split(".")[0]??"bedrock",l=i?.system?.map(v=>v.text).join(`
5
+ `)??"",u=i?.messages?.map(v=>`${v.role}: ${v.content.map(k=>k.text??"").join("")}`)??[],p=[l?`system: ${l}`:"",...u].filter(Boolean).join(`
6
+ `),m=i?.inferenceConfig??{},d=api.context.active(),g=e.tracer.startSpan("converse",{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":a,"gen_ai.request.model":c,...m.temperature!=null&&{"gen_ai.request.temperature":m.temperature},...m.maxTokens!=null&&{"gen_ai.request.max_tokens":m.maxTokens},...m.topP!=null&&{"gen_ai.request.top_p":m.topP},"evalkit.prompt":p}},d),f=api.trace.setSpan(d,g),h;try{h=await api.context.with(f,()=>r.apply(this,o));}catch(v){throw g.setStatus({code:api.SpanStatusCode.ERROR,message:v instanceof Error?v.message:String(v)}),g.end(),v}let y=h.output?.message?.content?.map(v=>v.text??"").join("")??"";return g.setAttributes({"gen_ai.response.model":c,"gen_ai.usage.input_tokens":h.usage?.inputTokens??0,"gen_ai.usage.output_tokens":h.usage?.outputTokens??0,"gen_ai.usage.total_tokens":h.usage?.totalTokens??0,"gen_ai.response.finish_reasons":h.stopReason?[h.stopReason]:[],"evalkit.completion":y}),g.setStatus({code:api.SpanStatusCode.OK}),g.end(),h},t.send.__evalkit=true;}var Nt=_(()=>{});function rt(e,t,n){if(t.chat.__evalkit)return;let r=t.chat;t.chat=async function(...o){let s=o[0];if(s?.stream)return r.apply(this,o);let i=s?.chatHistory?.map(m=>`${m.role}: ${m.message??""}`)??[],c=[s?.preamble?`system: ${s.preamble}`:"",...i,`user: ${s?.message??""}`].filter(Boolean).join(`
7
+ `),a=api.context.active(),l=e.tracer.startSpan("chat",{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"cohere","gen_ai.request.model":s?.model??"unknown",...s?.temperature!=null&&{"gen_ai.request.temperature":s.temperature},...s?.maxTokens!=null&&{"gen_ai.request.max_tokens":s.maxTokens},"evalkit.prompt":c}},a),u=api.trace.setSpan(a,l),p;try{p=await api.context.with(u,()=>r.apply(this,o));}catch(m){throw l.setStatus({code:api.SpanStatusCode.ERROR,message:m instanceof Error?m.message:String(m)}),l.end(),m}return l.setAttributes({"gen_ai.response.model":s?.model??"unknown","gen_ai.response.id":p.generationId??"","gen_ai.usage.input_tokens":p.meta?.tokens?.inputTokens??0,"gen_ai.usage.output_tokens":p.meta?.tokens?.outputTokens??0,"gen_ai.response.finish_reasons":p.finishReason?[p.finishReason]:[],"evalkit.completion":p.text??""}),l.setStatus({code:api.SpanStatusCode.OK}),l.end(),p},t.chat.__evalkit=true;}var jt=_(()=>{});function ot(e,t,n){if(t.generateContent.__evalkit)return;let r=t.generateContent,o=t.model??"unknown";t.generateContent=async function(...s){let i=s[0],c="";if(typeof i=="string")c=`user: ${i}`;else {let f=i,h=f?.systemInstruction?.parts?.map(v=>v.text??"").join("")??"",y=f?.contents?.map(v=>`${v.role??"user"}: ${v.parts.map(k=>k.text??"").join("")}`)??[];c=[h?`system: ${h}`:"",...y].filter(Boolean).join(`
8
+ `);}let a=api.context.active(),l=e.tracer.startSpan("generateContent",{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"google-ai","gen_ai.request.model":o,"evalkit.prompt":c}},a),u=api.trace.setSpan(a,l),p;try{p=await api.context.with(u,()=>r.apply(this,s));}catch(f){throw l.setStatus({code:api.SpanStatusCode.ERROR,message:f instanceof Error?f.message:String(f)}),l.end(),f}let m=p?.response,d=m?.candidates?.[0],g=d?.content?.parts?.map(f=>f.text??"").join("")??"";return l.setAttributes({"gen_ai.response.model":o,"gen_ai.usage.input_tokens":m?.usageMetadata?.promptTokenCount??0,"gen_ai.usage.output_tokens":m?.usageMetadata?.candidatesTokenCount??0,"gen_ai.usage.total_tokens":m?.usageMetadata?.totalTokenCount??0,"gen_ai.response.finish_reasons":d?.finishReason?[d.finishReason]:[],"evalkit.completion":g}),l.setStatus({code:api.SpanStatusCode.OK}),l.end(),p},t.generateContent.__evalkit=true;}var $t=_(()=>{});function ve(e){return e?.text??""}function Lr(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>{if(typeof t=="string")return t;let n=t,r=n.role??"user",o=(n.parts??[]).map(ve).join("");return o?`${r}: ${o}`:""}).filter(Boolean).join(`
9
+ `);if(e&&typeof e=="object"){let t=e;if(t.parts)return (t.parts??[]).map(ve).join("")}return e!=null?String(e):""}function Ur(e){let t=e?.systemInstruction;return t?typeof t=="string"?t:Array.isArray(t?.parts)?t.parts.map(n=>n?.text??"").join(""):typeof t?.text=="string"?t.text:"":""}function _e(e){let t=Ur(e?.config),n=Lr(e?.contents);return [t?`system: ${t}`:"",n].filter(Boolean).join(`
10
+ `)}function xe(e){let t=[];for(let n of e?.candidates??[])for(let r of n.content?.parts??[])r.text&&t.push(r.text);return t.length?t.join(""):e?.text??""}function Ce(e,t,n){let r=[];if(Array.isArray(e?.functionCalls))r.push(...e.functionCalls);else for(let o of e?.candidates??[])for(let s of o.content?.parts??[])s.functionCall?.name&&r.push(s.functionCall);for(let o of r){let s=o.name??"";if(!s)continue;let i="";try{i=JSON.stringify(o.args??{});}catch{i=String(o.args);}t.addEvent("gen_ai.tool.call",{"gen_ai.tool.name":s,"gen_ai.tool.call.arguments":i,"gen_ai.tool.call.id":o.id??""});let c=Br(t);K(n,s,o.args),c&&c.end();}}function Br(e){if(!Lt)return null;let t=api.trace.setSpan(api.context.active(),e);return Lt.tracer.startSpan("tool_call",{kind:api.SpanKind.INTERNAL,attributes:{"evalkit.span_type":"tool_call"}},t)}function it(e,t,n){if(Lt=e,t.generateContent&&!t.generateContent.__evalkit){let r=t.generateContent;t.generateContent=async function(...o){let s=o[0]??{},i=s.model??"unknown",c=api.context.active(),a=e.tracer.startSpan("generateContent",{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"google-genai","gen_ai.request.model":i,"evalkit.prompt":_e(s)}},c),l=api.trace.setSpan(c,a),u;try{u=await api.context.with(l,()=>r.apply(this,o));}catch(p){throw a.setStatus({code:api.SpanStatusCode.ERROR,message:p instanceof Error?p.message:String(p)}),a.end(),p}a.setAttributes({"gen_ai.response.model":i,"gen_ai.usage.input_tokens":u?.usageMetadata?.promptTokenCount??0,"gen_ai.usage.output_tokens":u?.usageMetadata?.candidatesTokenCount??0,"gen_ai.usage.total_tokens":u?.usageMetadata?.totalTokenCount??0,"evalkit.completion":xe(u)});try{Ce(u,a,a.spanContext().traceId);}catch{}return a.setStatus({code:api.SpanStatusCode.OK}),a.end(),u},t.generateContent.__evalkit=true;}if(t.generateContentStream&&!t.generateContentStream.__evalkit){let r=t.generateContentStream;t.generateContentStream=async function(...o){let s=o[0]??{},i=s.model??"unknown",c=api.context.active(),a=e.tracer.startSpan("generateContentStream",{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"google-genai","gen_ai.request.model":i,"gen_ai.streaming":true,"evalkit.prompt":_e(s)}},c),l=api.trace.setSpan(c,a),u;try{u=await api.context.with(l,()=>r.apply(this,o));}catch(m){throw a.setStatus({code:api.SpanStatusCode.ERROR,message:m instanceof Error?m.message:String(m)}),a.end(),m}async function*p(){let m=[],d=0,g=0;try{for await(let f of u){try{let h=xe(f);h&&m.push(h),f?.usageMetadata&&(d=f.usageMetadata.promptTokenCount??d,g=f.usageMetadata.candidatesTokenCount??g),Ce(f,a,a.spanContext().traceId);}catch{}yield f;}a.setAttributes({"gen_ai.response.model":i,"gen_ai.usage.input_tokens":d,"gen_ai.usage.output_tokens":g,"evalkit.completion":m.join("")}),a.setStatus({code:api.SpanStatusCode.OK});}catch(f){throw a.setStatus({code:api.SpanStatusCode.ERROR,message:f instanceof Error?f.message:String(f)}),f}finally{a.end();}}return p()},t.generateContentStream.__evalkit=true;}}var Lt,Ut=_(()=>{P();Lt=null;});function Bt(e){if(typeof T>"u")return null;let t=T.cache;if(!t)return null;let n=Object.keys(t).find(r=>{let o=r.split("/node_modules/");return o.length>1&&o[o.length-1].startsWith(e+"/")});return n?t[n]?.exports??null:null}function E(){return typeof T<"u"?T:module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href)))}var b,Vt=_(()=>{b=new Function("s","return import(s)");});var we={};Wt(we,{langchainCallbackHandler:()=>xt,langchainHandlerMethods:()=>Ee,patchLangChain:()=>Qr});function I(e,t=Jr){let n;try{n=typeof e=="string"?e:JSON.stringify(e);}catch{n=String(e);}return n==null?"":n.length>t?n.slice(0,t)+"\u2026":n}function Se(e){let t=e?.id;if(Array.isArray(t)){for(let n of ["openai","anthropic","google","vertexai","cohere","mistral","bedrock","ollama","groq"])if(t.includes(n))return n==="vertexai"?"vertex-ai":n;return t[t.length-1]}}function be(e,t){let n=t?.invocation_params??{};for(let o of ["model","model_name","modelName","model_id","deployment_name"])if(n[o])return String(n[o]);let r=e?.kwargs??{};for(let o of ["model","model_name","modelName","model_id"])if(r[o])return String(r[o]);return "unknown"}function zr(e){try{let n=((Array.isArray(e?.[0])?e[0]:e)??[]).map(r=>{let o=(typeof r?._getType=="function"?r._getType():void 0)??r?.role??r?.type??"message",s=typeof r?.content=="string"?r.content:I(r?.content);return `${o}: ${s}`});return I(n.join(`
11
+ `))}catch{return I(e)}}function Wr(e){try{let t=[];for(let n of e?.generations??[])for(let r of n??[])r?.text?t.push(String(r.text)):r?.message?.content&&t.push(typeof r.message.content=="string"?r.message.content:I(r.message.content));return I(t.filter(Boolean).join(`
12
+ `))}catch{return ""}}function Xr(e){let t=0,n=0;try{let r=e?.llmOutput?.tokenUsage??e?.llmOutput?.usage??{};if(t=r.promptTokens??r.prompt_tokens??r.input_tokens??0,n=r.completionTokens??r.completion_tokens??r.output_tokens??0,!t&&!n)for(let o of e?.generations??[])for(let s of o??[]){let i=s?.message?.usage_metadata;i&&(t=i.input_tokens??t,n=i.output_tokens??n);}}catch{}return {tin:t||0,tout:n||0}}function Ee(e){let t=new Map;function n(o,s,i,c,a){try{let l=s?t.get(s):void 0,u=l?l.ctx:api.context.active(),p=e.tracer.startSpan(c,{kind:i==="llm_call"?api.SpanKind.CLIENT:api.SpanKind.INTERNAL,attributes:{"evalkit.span_type":i,"evalkit.framework":"langchain",...a}},u);t.set(o,{span:p,ctx:api.trace.setSpan(u,p)});}catch{}}function r(o,s,i,c){try{let a=t.get(o);if(!a)return;t.delete(o),i&&a.span.setAttributes(i),a.span.setStatus({code:s==="OK"?api.SpanStatusCode.OK:api.SpanStatusCode.ERROR,message:c}),a.span.end();}catch{}}return {handleChainStart(o,s,i,c,a,l,u,p){let m=p??o?.id?.[o.id.length-1]??"chain";n(i,c,"function_call",String(m),a?.length?{"langchain.tags":a.join(",")}:{});},handleChainEnd(o,s){r(s,"OK");},handleChainError(o,s){r(s,"ERROR",void 0,String(o?.message??o));},handleLLMStart(o,s,i,c,a){let l=be(o,a);n(i,c,"llm_call","llm.generate",{"gen_ai.request.model":l,"gen_ai.system":Se(o)??"","evalkit.prompt":I((s??[]).join(`
13
+ `))});},handleChatModelStart(o,s,i,c,a){let l=be(o,a);n(i,c,"llm_call","chat.generate",{"gen_ai.request.model":l,"gen_ai.system":Se(o)??"","evalkit.prompt":zr(s)});},handleLLMEnd(o,s){let{tin:i,tout:c}=Xr(o),a=t.get(s);try{for(let l of o?.generations??[])for(let u of l??[])for(let p of u?.message?.tool_calls??[])p?.name&&a&&(a.span.addEvent("gen_ai.tool.call",{"gen_ai.tool.name":p.name,"gen_ai.tool.call.arguments":I(p.args??{})}),K(a.span.spanContext().traceId,p.name,p.args));}catch{}r(s,"OK",{"evalkit.completion":Wr(o),"gen_ai.usage.input_tokens":i,"gen_ai.usage.output_tokens":c,"gen_ai.usage.total_tokens":i+c});},handleLLMError(o,s){r(s,"ERROR",void 0,String(o?.message??o));},handleToolStart(o,s,i,c,a,l,u){let p=u??o?.id?.[o.id.length-1]??"tool",m=t.get(c??"");K(m?.span.spanContext().traceId,String(p)),n(i,c,"tool_call",String(p),{"tool.name":String(p),"tool.arguments":I(s)});},handleToolEnd(o,s){r(s,"OK",{"tool.result":I(o)});},handleToolError(o,s){r(s,"ERROR",void 0,String(o?.message??o));},handleRetrieverStart(o,s,i,c){let a=o?.id?.[o.id.length-1]??"retriever";n(i,c,"db_query",String(a),{"retriever.query":I(s)});},handleRetrieverEnd(o,s){let i=Array.isArray(o)?o.length:0;r(s,"OK",{"retriever.document_count":i});},handleRetrieverError(o,s){r(s,"ERROR",void 0,String(o?.message??o));}}}async function xt(e){try{let n=(await b("@langchain/core/callbacks/base")).BaseCallbackHandler.fromMethods(Ee(e));return n.name="evalkit",n.__evalkit=!0,n}catch{return null}}async function Qr(e){let t=await xt(e);if(!t)return null;try{let r=(await b("@langchain/core/callbacks/manager")).CallbackManager;if(r&&typeof r.configure=="function"&&!r.__evalkitPatched){let o=r.configure.bind(r);r.configure=(...s)=>{let i=o(...s);try{i&&![...i.handlers??[],...i.inheritableHandlers??[]].some(l=>l?.__evalkit)&&typeof i.addHandler=="function"&&i.addHandler(t,!0);}catch{}return i},r.__evalkitPatched=!0;}}catch{}return t}var Jr,Ft=_(()=>{P();Vt();Jr=4096;});function ct(e,t,n){j(e,t,n);}function lt(e,t,n){if(t.generateContent.__evalkit)return;let r=t.generateContent,o=t.model??"unknown";t.generateContent=async function(...s){let i=s[0],c=i?.systemInstruction?.parts?.map(y=>y.text??"").join("")??"",a=i?.contents?.map(y=>`${y.role??"user"}: ${y.parts.map(v=>v.text??"").join("")}`)??[],l=[c?`system: ${c}`:"",...a].filter(Boolean).join(`
14
+ `),u=api.context.active(),p=e.tracer.startSpan("generateContent",{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"google-vertex","gen_ai.request.model":o,"evalkit.prompt":l}},u),m=api.trace.setSpan(u,p),d;try{d=await api.context.with(m,()=>r.apply(this,s));}catch(y){throw p.setStatus({code:api.SpanStatusCode.ERROR,message:y instanceof Error?y.message:String(y)}),p.end(),y}let g=d?.response,f=g?.candidates?.[0],h=f?.content?.parts?.map(y=>y.text??"").join("")??"";return p.setAttributes({"gen_ai.response.model":o,"gen_ai.usage.input_tokens":g?.usageMetadata?.promptTokenCount??0,"gen_ai.usage.output_tokens":g?.usageMetadata?.candidatesTokenCount??0,"gen_ai.usage.total_tokens":g?.usageMetadata?.totalTokenCount??0,"gen_ai.response.finish_reasons":f?.finishReason?[f.finishReason]:[],"evalkit.completion":h}),p.setStatus({code:api.SpanStatusCode.OK}),p.end(),d},t.generateContent.__evalkit=true;}var Dt=_(()=>{yt();});function Ae(e,t={},n){function r(o,s,i){let c={...t,...s};o.addHook("onRequest",(a,l,u)=>{let p=a.routerPath??a.routeOptions?.url??a.url??"/",m=typeof c.name=="function"?c.name(a):c.name??`${String(a.method??"GET")} ${String(p)}`,d=a.headers?.traceparent,g=n?n(d):api.context.active(),{traceId:f,end:h,ctx:y}=api.context.with(g,()=>e.startHttpTrace(m,{method:String(a.method??"GET"),url:String(a.url??"/"),headers:a.headers,requestBody:void 0}));a._evalkitCtx=y,a._evalkitTraceId=f,a._evalkitEnd=h,a._evalkitEnded=false,api.context.with(y,u);}),o.addHook("preHandler",(a,l,u)=>{if(a._evalkitCtx&&a.body!==void 0){let p=api.trace.getActiveSpan();if(p?.isRecording())try{p.setAttribute("http.request.body",typeof a.body=="string"?a.body.slice(0,4096):JSON.stringify(a.body).slice(0,4096));}catch{}}api.context.with(a._evalkitCtx??api.context.active(),u);}),o.addHook("onResponse",(a,l,u)=>{if(typeof a._evalkitEnd=="function"&&!a._evalkitEnded){a._evalkitEnded=true;let p=l.statusCode??200;a._evalkitEnd(p>=400?"ERROR":"OK",{statusCode:p});}u();}),o.addHook("onError",(a,l,u,p)=>{typeof a._evalkitEnd=="function"&&!a._evalkitEnded&&(a._evalkitEnded=true,a._evalkitEnd("ERROR",{statusCode:l.statusCode??500})),p();}),i();}return r[Symbol.for("skip-override")]=true,r}var Ie=_(()=>{});function Pe(e,t){return (n,r,o)=>{let s=typeof t?.name=="function"?t.name(n):t?.name??`${String(n.method)} ${String(n.route?.path??n.path??n.url)}`,i=A(n.headers?.traceparent),{end:c,ctx:a,traceId:l}=api.context.with(i,()=>e.startHttpTrace(s,{method:String(n.method??"GET"),url:String(n.originalUrl??n.url??"/"),headers:n.headers,requestBody:n.body}));n._evalkitCtx=a,n._evalkitTraceId=l;let u=api.trace.getSpan(a)?.spanContext().spanId??"0000000000000000";r.setHeader?.("x-trace-id",l),r.setHeader?.("traceparent",`00-${l}-${u}-01`);let p=r.end;r.end=function(...m){let d=r.statusCode??200;return c(d>=400?"ERROR":"OK",{statusCode:d,headers:r.getHeaders?r.getHeaders():void 0}),p.apply(r,m)},api.context.with(a,()=>o());}}var Me=_(()=>{F();});function Ne(e,t){return async(n,r)=>{let o=typeof t?.name=="function"?t.name(n):t?.name??`${String(n.method??"GET")} ${String(n.path??"/")}`,s=A(n.request?.headers?.traceparent),{end:i,ctx:c}=api.context.with(s,()=>e.startHttpTrace(o,{method:String(n.method??"GET"),url:String(n.href??n.url??"/"),headers:n.request?.headers,requestBody:n.request?.body}));n._evalkitCtx=c;try{await api.context.with(c,r);let a=n.status??200;i(a>=400?"ERROR":"OK",{statusCode:a});}catch(a){throw i("ERROR",{statusCode:n.status??500}),a}}}var je=_(()=>{F();});function Ge(e,t){return async(n,r)=>{let o=n.req,s=o.url??"/",i=s;try{i=new URL(s).pathname;}catch{}let c=typeof t?.name=="function"?t.name(n):t?.name??`${String(o.method??"GET")} ${i}`,a=A(o.header("traceparent")),{end:l,ctx:u}=api.context.with(a,()=>e.startHttpTrace(c,{method:String(o.method??"GET"),url:s,headers:Object.fromEntries(o.raw?.headers??[])}));try{await api.context.with(u,r);let p=n.res?.status??200;l(p>=400?"ERROR":"OK",{statusCode:p});}catch(p){throw l("ERROR",{statusCode:500}),p}}}var He=_(()=>{F();});function Le(e,t){return {name:"@evalkit/hapi",register(n){let r=new WeakMap;n.ext("onRequest",(o,s)=>{let i=typeof t?.name=="function"?t.name(o):t?.name??`${String(o.method?.toUpperCase()??"GET")} ${String(o.path??"/")}`,c=A(o.headers?.traceparent),{end:a,ctx:l}=api.context.with(c,()=>e.startHttpTrace(i,{method:String(o.method?.toUpperCase()??"GET"),url:String(o.url?.href??o.path??"/"),headers:o.headers}));return r.set(o,{end:a,ctx:l}),s.continue}),n.ext("onPreResponse",(o,s)=>{let i=r.get(o);if(i){let c=o.response?.output?.statusCode??o.response?.statusCode??200;i.end(c>=400?"ERROR":"OK",{statusCode:c}),r.delete(o);}return s.continue});}}}var Ue=_(()=>{F();});exports.EvalKitInterceptor=void 0;var Jt=_(()=>{exports.EvalKitInterceptor=class{constructor(t){this.client=t;}intercept(t,n){let r=t.switchToHttp?.();if(!r)return n.handle();let o=r.getRequest(),s=`${String(o.method??"GET")} ${String(o.route?.path??o.path??o.url??"/")}`,{ctx:i,end:c}=this.client.startHttpTrace(s,{method:String(o.method??"GET"),url:String(o.originalUrl??o.url??"/"),headers:o.headers,requestBody:o.body}),a=api.context.with(i,()=>n.handle());return {subscribe(l){return a.subscribe({next:u=>l.next?.(u),error:u=>{c("ERROR"),l.error?.(u);},complete:()=>{let u=r.getResponse().statusCode??200;c(u>=400?"ERROR":"OK",{statusCode:u}),l.complete?.();}})},pipe(...l){return a.pipe(...l)}}}};});function zt(e){return oo.some(t=>t.test(e))}function so(e,t,n){let r="",o="GET";if(typeof e=="string")r=e,o=(t?.method??"GET").toUpperCase();else if(e instanceof URL)r=e.href,o=(t?.method??"GET").toUpperCase();else {let i=e.hostname??e.host??"localhost",c=e.port?`:${e.port}`:"",a=e.path??"/";r=`${n}://${i}${c}${a}`,o=(e.method??t?.method??"GET").toUpperCase();}let s=r;try{s=new URL(r.startsWith("http")?r:`${n}://localhost${r}`).pathname;}catch{}return {url:r,method:o,pathname:s}}function Fe(e){let t,n;try{let s=typeof T<"u"?T:module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href)));t=s("http"),n=s("https");}catch{return}let r=[{mod:t,scheme:"http"},{mod:n,scheme:"https"}];for(let{mod:s,scheme:i}of r){let a=function(l,u,p){let m=typeof u=="function"?void 0:u,{url:d,method:g,pathname:f}=so(l,m,i);if(zt(d)||!api.trace.getActiveSpan()?.isRecording())return c.call(s,l,u,p);let y={...typeof l=="object"&&!(l instanceof URL)?l.headers??{}:{},...m?.headers??{}},v=y["x-evalkit-span-id"];if(v){typeof l=="object"&&!(l instanceof URL)&&l.headers&&delete l.headers["x-evalkit-span-id"],m?.headers&&delete m.headers["x-evalkit-span-id"];let S=D.get(String(v));if(S){let H=w({...y});delete H["x-evalkit-span-id"],Object.keys(H).length&&S.setAttributes({"http.request.headers":JSON.stringify(H)});}return c.call(s,l,u,p)}let k=w(y),R=e.tracer.startSpan(`${g} ${f}`,{kind:api.SpanKind.CLIENT,attributes:{"evalkit.span_type":"http_call","http.method":g,"http.url":d,...Object.keys(k).length?{"http.request.headers":JSON.stringify(k)}:{}}},api.context.active()),O=c.call(s,l,u,p),x=R.spanContext();return O.setHeader("traceparent",`00-${x.traceId}-${x.spanId}-01`),O.on("response",S=>{let H=S.statusCode??0;R.setAttributes({"http.status_code":H,...S.headers?{"http.response.headers":JSON.stringify(w(S.headers))}:{}}),R.setStatus({code:H>=400?api.SpanStatusCode.ERROR:api.SpanStatusCode.OK}),R.end();}),O.on("error",S=>{R.setAttributes({"http.status_code":0,"error.message":S.message}),R.setStatus({code:api.SpanStatusCode.ERROR,message:S.message}),R.end();}),O};let c=s.request;c.__evalkit||(a.__evalkit=true,Object.defineProperty(s,"request",{value:a,writable:true,configurable:true}));}}function De(e){let t;try{t=(typeof T<"u"?T:module$1.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.js', document.baseURI).href))))("http");}catch{return}if(t.Server.prototype.emit.__evalkit_server)return;let n=t.Server.prototype.emit;function r(o,...s){if(o!=="request")return n.call(this,o,...s);let i=s[0],c=s[1],a=i.url??"/";if(zt(a))return n.call(this,o,...s);if(api.trace.getActiveSpan()?.isRecording())return n.call(this,o,...s);let l=(i.method??"GET").toUpperCase(),u=a;try{u=new URL(a,"http://localhost").pathname;}catch{}let p=i.headers.traceparent,m=p?ao(Array.isArray(p)?p[0]:p):api.context.active(),d=e.tracer.startSpan(`${l} ${u}`,{kind:api.SpanKind.SERVER,attributes:{"evalkit.span_type":"http_call","http.method":l,"http.url":a,"http.request.headers":JSON.stringify(w(i.headers))}},m),g=api.trace.setSpan(m,d),f=d.spanContext();c.setHeader("x-trace-id",f.traceId),c.setHeader("traceparent",`00-${f.traceId}-${f.spanId}-01`);let h=8192,y=[],v=0,k=x=>{try{if(x&&typeof x!="function"&&v<h){let S=Buffer.isBuffer(x)?x:typeof x=="string"?Buffer.from(x):null;S&&S.length&&(y.push(S),v+=S.length);}}catch{}},R=c.write.bind(c),O=c.end.bind(c);return c.write=function(x,...S){return k(x),R(x,...S)},c.end=function(x,...S){return k(x),O(x,...S)},c.on("finish",()=>{d.setAttribute("http.status_code",c.statusCode);try{let x=c.getHeaders();x&&Object.keys(x).length&&d.setAttribute("http.response.headers",JSON.stringify(w(x)));}catch{}if(y.length)try{let x=Buffer.concat(y).subarray(0,h).toString("utf-8");x&&d.setAttribute("http.response.body",x);}catch{}d.setStatus({code:c.statusCode>=400?api.SpanStatusCode.ERROR:api.SpanStatusCode.OK}),d.end();}),c.on("error",x=>{d.setAttribute("error.message",x.message),d.setStatus({code:api.SpanStatusCode.ERROR,message:x.message}),d.end();}),api.context.with(g,()=>n.call(this,o,...s))}r.__evalkit_server=true,t.Server.prototype.emit=r;}function ao(e){let t=e.split("-");if(t.length<4)return api.context.active();let[,n,r,o]=t;if(!n||!r)return api.context.active();try{let s={traceId:n,spanId:r,isRemote:!0,traceFlags:parseInt(o??"01",16)};return api.trace.setSpanContext(api.context.active(),s)}catch{return api.context.active()}}function Je(){if(typeof globalThis.fetch!="function"||globalThis.fetch.__evalkit)return;let e=globalThis.fetch.bind(globalThis);globalThis.fetch=async function(n,r){let o=typeof n=="string"?n:n instanceof URL?n.href:n.url;if(zt(o))return e(n,r);let s=api.trace.getActiveSpan();if(!s?.isRecording())return e(n,r);let i=(r?.method??"GET").toUpperCase(),c=o;try{c=new URL(o).pathname;}catch{}let a={};r?.headers&&new Headers(r.headers).forEach((f,h)=>{a[h]=f;});let l=w(a),u=s.spanContext(),p=`00-${u.traceId}-${u.spanId}-01`,m=new Headers(r?.headers);m.set("traceparent",p);let d={...r,headers:m};Object.keys(l).length&&s.addEvent("http.fetch.request",{"http.method":i,"http.url":o,"http.request.headers":JSON.stringify(l)});try{let g=await e(n,d),f={};return g.headers.forEach((h,y)=>{f[y]=h;}),s.addEvent("http.fetch.response",{"http.url":o,"http.status_code":g.status,"http.response.headers":JSON.stringify(w(f))}),g}catch(g){throw s.addEvent("http.fetch.error",{"http.url":o,"error.message":g?.message??String(g),"error.stack":g?.stack??""}),g}},globalThis.fetch.__evalkit=true;}var oo,ze=_(()=>{It();Kt();oo=[/\/v1\/ingest/,/\/health(z)?$/,/169\.254\./,/metadata\.google/,/storage\.googleapis/];});function Xe(e){if(console.__evalkit)return;let t=console.log.bind(console),n=console.warn.bind(console),r=console.error.bind(console),o=i=>i.map(c=>{if(typeof c=="string")return c;if(c instanceof Error)return `${c.message}
15
+ ${c.stack??""}`;try{return JSON.stringify(c)}catch{return String(c)}}).join(" ").slice(0,2e3),s=(i,c)=>{let a=api.trace.getActiveSpan();if(a?.isRecording())a.addEvent(`log.${i}`,{"log.level":i,"log.message":c});else {let l=e.tracer.startSpan(`log.${i}`,{kind:api.SpanKind.INTERNAL,attributes:{"evalkit.span_type":"log","log.level":i,"log.message":c}},api.context.active());l.setStatus({code:i==="ERROR"?api.SpanStatusCode.ERROR:api.SpanStatusCode.OK}),l.end();}};console.log=(...i)=>{t(...i),s("INFO",o(i));},console.warn=(...i)=>{n(...i),s("WARN",o(i));},console.error=(...i)=>{r(...i),s("ERROR",o(i));},console.__evalkit=true;}var Qe=_(()=>{});function tn(){typeof process>"u"||(process.on("unhandledRejection",e=>{let t=api.trace.getActiveSpan();if(!t?.isRecording())return;let n=e instanceof Error?e.message:String(e),r=e instanceof Error?e.stack??"":"";t.addEvent("error.unhandled_rejection",{"error.message":n,"error.stack":r,"log.level":"ERROR","log.message":`UnhandledRejection: ${n}`}),t.setStatus({code:api.SpanStatusCode.ERROR,message:n});}),process.on("uncaughtException",e=>{let t=api.trace.getActiveSpan();t?.isRecording()&&(t.addEvent("error.uncaught_exception",{"error.message":e.message,"error.stack":e.stack??"","log.level":"ERROR","log.message":`UncaughtException: ${e.message}`}),t.setStatus({code:api.SpanStatusCode.ERROR,message:e.message}));}));}var en=_(()=>{});function po(e){let t=Bt("mongoose");t&&ht(e,t);}function uo(e){let t=Bt("axios");t&&Z(e,t.default??t);}async function mo(e){try{let n=E()("pg"),r=n.Client??n.default?.Client;if(r){tt(e,r);return}}catch{}try{let t=await b("pg"),n=t.Client??t.default?.Client;n&&tt(e,n);}catch{}}async function go(e){try{let t=E(),n=t("mysql2"),r=n.Connection??n.default?.Connection??t("mysql2/lib/connection");if(r){et(e,r);return}}catch{}try{let t=await b("mysql2"),n=t.Connection??t.default?.Connection;n&&et(e,n);}catch{}}async function fo(e){try{let n=E()("ioredis"),r=n.default??n.Redis??n;if(r?.prototype){Y(e,r);return}}catch{}try{let t=await b("ioredis"),n=t.default??t.Redis??t;n?.prototype&&Y(e,n);}catch{}}async function yo(e){try{let n=E()("openai"),o=(n.default??n.OpenAI??n)?.Chat?.Completions?.prototype;if(o){N(e,o);return}}catch{}try{let t=await b("openai"),r=(t.default??t.OpenAI??t)?.Chat?.Completions?.prototype;r&&N(e,r);}catch{}}async function ho(e){try{let n=E()("@anthropic-ai/sdk"),o=(n.default??n.Anthropic??n)?.Messages?.prototype;if(o){j(e,o);return}}catch{}try{let t=await b("@anthropic-ai/sdk"),r=(t.default??t.Anthropic??t)?.Messages?.prototype;r&&j(e,r);}catch{}}async function vo(e){try{let n=E()("@aws-sdk/client-bedrock-runtime"),o=(n.BedrockRuntimeClient??n.default?.BedrockRuntimeClient)?.prototype;if(o){nt(e,o);return}}catch{}try{let t=await b("@aws-sdk/client-bedrock-runtime"),r=(t.BedrockRuntimeClient??t.default?.BedrockRuntimeClient)?.prototype;r&&nt(e,r);}catch{}}async function _o(e){try{let n=E()("@anthropic-ai/sdk"),o=(n.AnthropicVertex??n.default?.AnthropicVertex)?.Messages?.prototype;if(o){ct(e,o);return}}catch{}try{let t=await b("@anthropic-ai/sdk"),r=(t.AnthropicVertex??t.default?.AnthropicVertex)?.Messages?.prototype;r&&ct(e,r);}catch{}}async function xo(e){try{let n=E()("@google-cloud/vertexai"),o=(n.GenerativeModel??n.default?.GenerativeModel)?.prototype;if(o){lt(e,o);return}}catch{}try{let t=await b("@google-cloud/vertexai"),r=(t.GenerativeModel??t.default?.GenerativeModel)?.prototype;r&&lt(e,r);}catch{}}async function Co(e){try{let n=E()("cohere-ai"),o=(n.CohereClient??n.default?.CohereClient??n.default)?.prototype;if(o){rt(e,o);return}}catch{}try{let t=await b("cohere-ai"),r=(t.CohereClient??t.default?.CohereClient??t.default)?.prototype;r&&rt(e,r);}catch{}}async function ko(e){try{let n=E()("@google/generative-ai"),o=(n.GenerativeModel??n.default?.GenerativeModel)?.prototype;if(o){ot(e,o);return}}catch{}try{let t=await b("@google/generative-ai"),r=(t.GenerativeModel??t.default?.GenerativeModel)?.prototype;r&&ot(e,r);}catch{}}async function Ro(e){try{let n=E()("@google/genai"),r=n.Models??n.default?.Models;if(r?.prototype){it(e,r.prototype);return}}catch{}try{let t=await b("@google/genai"),n=t.Models??t.default?.Models;n?.prototype&&it(e,n.prototype);}catch{}}async function So(e){try{let n=E()("groq-sdk"),o=(n.default??n.Groq??n)?.Chat?.Completions?.prototype;if(o){N(e,o,void 0,"groq");return}}catch{}try{let t=await b("groq-sdk"),r=(t.default??t.Groq??t)?.Chat?.Completions?.prototype;r&&N(e,r,void 0,"groq");}catch{}}async function bo(e){try{let{patchLangChain:t}=await Promise.resolve().then(()=>(Ft(),we));await t(e);}catch{}}function nn(e){try{De(e);}catch{}try{Fe(e);}catch{}Je(),Xe(e),tn(),po(e),uo(e),Promise.all([yo(e),ho(e),vo(e),_o(e),xo(e),Co(e),ko(e),Ro(e),So(e),bo(e),mo(e),go(e),fo(e)]).catch(()=>{});}var rn=_(()=>{Vt();wt();yt();Nt();Dt();jt();$t();Ut();Tt();Mt();qt();At();Pt();ze();Qe();en();});var Xt={};Wt(Xt,{EvalKitClient:()=>exports.EvalKitClient,EvalKitInterceptor:()=>exports.EvalKitInterceptor,TraceMethod:()=>In,Traced:()=>Kn,createNestjsInterceptor:()=>bn,currentTraceId:()=>Mn,default:()=>exports.default,evaluate:()=>L,expressMiddleware:()=>xn,fastifyPlugin:()=>Cn,flush:()=>wn,generateScenarios:()=>qn,hapiPlugin:()=>Sn,honoMiddleware:()=>Rn,init:()=>on,koaMiddleware:()=>kn,langchainHandler:()=>gn,patchAnthropicClient:()=>an,patchAnthropicVertexClient:()=>ln,patchAxiosClient:()=>hn,patchBedrockClient:()=>cn,patchCohereClient:()=>un,patchGoogleAIModel:()=>dn,patchGoogleGenAIModels:()=>mn,patchMongooseClient:()=>fn,patchMysql2Client:()=>_n,patchOpenAIClient:()=>sn,patchPgClient:()=>vn,patchRedisClient:()=>yn,patchVertexGenerativeModel:()=>pn,simulateUser:()=>Nn,startHttpTrace:()=>On,startSpan:()=>Tn,startTrace:()=>En,traceFunction:()=>An,withTrace:()=>Pn});function C(){if(!G)throw new Error("[evalkit] call evalkit.init() before using the SDK");return G}function on(e){return G&&G.destroy(),G=new exports.EvalKitClient(e),nn(G),G}function sn(e,t){N(C(),e.chat.completions,t);}function an(e,t){j(C(),e.messages,t);}function cn(e){nt(C(),e);}function ln(e){ct(C(),e.messages);}function pn(e){lt(C(),e);}function un(e){rt(C(),e);}function dn(e){ot(C(),e);}function mn(e){it(C(),e);}function gn(){return xt(C())}function fn(e){ht(C(),e);}function yn(e){Y(C(),e);}function hn(e){Z(C(),e);}function vn(e){tt(C(),e);}function _n(e){et(C(),e);}function xn(e){return Pe(C(),e)}function Cn(e){return Ae(C(),e,Oo)}function kn(e){return Ne(C(),e)}function Rn(e){return Ge(C(),e)}function Sn(e){return Le(C(),e)}function bn(){return new exports.EvalKitInterceptor(C())}function En(e,t){return C().startTrace(e,t)}async function wn(){return C().flush()}function On(e,t,n){return C().startHttpTrace(e,t,n)}function Tn(e,t,n){return C().startSpan(e,t,n)}function An(e,t,n,r=true){return C().traceFunction(e,t,n,r)}function In(e){return (t,n,r)=>{let o=r.value,s=e??`${t.constructor?.name??"unknown"}.${String(n)}`,i;return r.value=function(...c){return i||(i=C().traceFunction(s,o)),i.apply(this,c)},r}}function Kn(e){return t=>{let n=t.prototype,r=e?.prefix??t.name;for(let o of Object.getOwnPropertyNames(n)){if(o==="constructor")continue;let s=Object.getOwnPropertyDescriptor(n,o);if(!s||typeof s.value!="function")continue;let i=s.value,c=`${r}.${o}`,a=null;Object.defineProperty(n,o,{...s,value:function(...l){return a||(a=C().traceFunction(c,i)),a.apply(this,l)}});}return t}}function Pn(e,t){return api.context.with(e,t)}function Mn(){let e=api.trace.getActiveSpan();return e?.isRecording()?e.spanContext().traceId:void 0}function qn(e){return Zt(C(),e)}function Nn(e){return te(C(),e)}function Oo(e){return A(e)}var G;exports.default=void 0;var Qt=_(()=>{dt();ee();bt();F();wt();yt();Tt();At();Pt();Mt();qt();Nt();jt();$t();Ut();Ft();Dt();Ie();Me();je();He();Ue();Jt();rn();bt();Jt();dt();G=null;exports.default={init:on,evaluate:L,generateScenarios:qn,simulateUser:Nn,patchOpenAIClient:sn,patchAnthropicClient:an,patchBedrockClient:cn,patchAnthropicVertexClient:ln,patchVertexGenerativeModel:pn,patchCohereClient:un,patchGoogleAIModel:dn,patchGoogleGenAIModels:mn,langchainHandler:gn,patchMongooseClient:fn,patchRedisClient:yn,patchAxiosClient:hn,patchPgClient:vn,patchMysql2Client:_n,expressMiddleware:xn,fastifyPlugin:Cn,koaMiddleware:kn,honoMiddleware:Rn,hapiPlugin:Sn,createNestjsInterceptor:bn,startTrace:En,startHttpTrace:On,startSpan:Tn,traceFunction:An,TraceMethod:In,Traced:Kn,withTrace:Pn,currentTraceId:Mn,flush:wn};});Qt();exports.TraceMethod=In;exports.Traced=Kn;exports.createNestjsInterceptor=bn;exports.currentTraceId=Mn;exports.evaluate=L;exports.expressMiddleware=xn;exports.fastifyPlugin=Cn;exports.flush=wn;exports.generateScenarios=qn;exports.hapiPlugin=Sn;exports.honoMiddleware=Rn;exports.init=on;exports.koaMiddleware=kn;exports.langchainHandler=gn;exports.patchAnthropicClient=an;exports.patchAnthropicVertexClient=ln;exports.patchAxiosClient=hn;exports.patchBedrockClient=cn;exports.patchCohereClient=un;exports.patchGoogleAIModel=dn;exports.patchGoogleGenAIModels=mn;exports.patchMongooseClient=fn;exports.patchMysql2Client=_n;exports.patchOpenAIClient=sn;exports.patchPgClient=vn;exports.patchRedisClient=yn;exports.patchVertexGenerativeModel=pn;exports.simulateUser=Nn;exports.startHttpTrace=On;exports.startSpan=Tn;exports.startTrace=En;exports.traceFunction=An;exports.withTrace=Pn;
package/dist/index.mjs ADDED
@@ -0,0 +1,12 @@
1
+ import {b,h,l,c,n,p,d,g,e,f,a,j,k,i}from'./chunk-OVOA54JW.mjs';import {context,trace,SpanKind,SpanStatusCode,ROOT_CONTEXT}from'@opentelemetry/api';import {randomBytes}from'crypto';import {NodeTracerProvider}from'@opentelemetry/sdk-trace-node';import {BatchSpanProcessor}from'@opentelemetry/sdk-trace-base';import {Resource}from'@opentelemetry/resources';import {ATTR_SERVICE_NAME}from'@opentelemetry/semantic-conventions';import {createRequire}from'module';function An(e,t){if(t.length===0)return {score:1,lcsLength:0};let n=e.length,o=t.length,r=Array.from({length:n+1},()=>new Array(o+1).fill(0));for(let i=1;i<=n;i++)for(let c=1;c<=o;c++)e[i-1]===t[c-1]?r[i][c]=r[i-1][c-1]+1:r[i][c]=Math.max(r[i-1][c],r[i][c-1]);let s=r[n][o];return {score:s/t.length,lcsLength:s}}function In(e,t){if(e.length===0&&t.length===0)return {score:1,precision:1,recall:1};if(e.length===0||t.length===0)return {score:0,precision:0,recall:0};let n=new Set(e),o=new Set(t),r=new Set([...n].filter(a=>o.has(a))),s=r.size/n.size,i=r.size/o.size;return {score:s+i===0?0:2*s*i/(s+i),precision:s,recall:i}}function Kn(e,t){if(t.length===0)return {score:1,called:0,total:0};let n=new Set(e),o=t.filter(r=>n.has(r)).length;return {score:o/t.length,called:o,total:t.length}}function Pn(e,t){if(t.length===0)return {score:1,matched:[],missing:[]};let n=e.toLowerCase(),o=t.filter(s=>n.includes(s.toLowerCase())),r=t.filter(s=>!n.includes(s.toLowerCase()));return {score:o.length/t.length,matched:o,missing:r}}function Mn(e,t){let n={},o=[];if(t.requiredTerms!==void 0&&t.requiredTerms.length>0){let s=e.toLowerCase(),i=t.requiredTerms.every(c=>s.includes(c.toLowerCase()));n.requiredTerms=i,o.push(i);}if(t.hasCitations!==void 0){let s=/\[[\d]+\]|\(\w[^)]{1,80}\d{4}\)|\bhttps?:\/\//.test(e);n.hasCitations=t.hasCitations?s:!s,o.push(n.hasCitations);}if(t.slideCount!==void 0){let s=/slide\s+\d+|section\s+\d+|##\s+\d+\./gi,c=(e.match(s)??[]).length===t.slideCount;n.slideCount=c,o.push(c);}return o.length===0?{score:1,checks:n}:{score:o.filter(Boolean).length/o.length,checks:n}}function qn(e,t){if(e.length===0)return {score:1,relevant:0,total:0};let n=new Set(t),o=e.filter(r=>n.has(r)).length;return {score:o/e.length,relevant:o,total:e.length}}function Nn(e,t){if(t.length===0)return {score:1,covered:0,total:0};let n=new Set(e),o=t.filter(r=>n.has(r)).length;return {score:o/t.length,covered:o,total:t.length}}function $(e){let t=new Set(e.metrics??["tool_trajectory","tool_f1","tool_correctness","response_match","constraint_compliance","contextual_precision","contextual_recall"]),n=(e.toolCalls??[]).map(a=>a.name),o=e.expectedTools??[],r={},s={};if(t.has("tool_trajectory")&&o.length>0){let a=An(n,o);r.tool_trajectory=a.score,s.tool_trajectory={lcsLength:a.lcsLength,expectedCount:o.length};}if(t.has("tool_f1")&&(n.length>0||o.length>0)){let a=In(n,o);r.tool_f1=a.score,s.tool_f1={precision:a.precision,recall:a.recall};}if(t.has("tool_correctness")&&o.length>0){let a=Kn(n,o);r.tool_correctness=a.score,s.tool_correctness={called:a.called,total:a.total};}let i=e.constraints?.requiredTerms??[];if(t.has("response_match")&&i.length>0){let a=Pn(e.output,i);r.response_match=a.score,s.response_match={matched:a.matched,missing:a.missing};}if(t.has("constraint_compliance")&&e.constraints){let a=Mn(e.output,e.constraints);r.constraint_compliance=a.score,s.constraint_compliance={checks:a.checks};}if(t.has("contextual_precision")&&e.retrievedContext!==void 0&&e.expectedContext!==void 0){let a=qn(e.retrievedContext,e.expectedContext);r.contextual_precision=a.score,s.contextual_precision={relevant:a.relevant,total:a.total};}if(t.has("contextual_recall")&&e.retrievedContext!==void 0&&e.expectedContext!==void 0){let a=Nn(e.retrievedContext,e.expectedContext);r.contextual_recall=a.score,s.contextual_recall={covered:a.covered,total:a.total};}let c={scores:r,details:s};try{let a=(Dt(),d(Ft)),p={"evalkit.span_type":"eval_result","evalkit.eval_type":"offline"};for(let[m,d]of Object.entries(r))p[`evalkit.metric.${m}`]=d;let{end:u}=a.startSpan("evaluation",p);u("OK");}catch{}return c}var lt=b(()=>{});function ut(e){return randomBytes(e).toString("hex")}function Jt(e){return typeof e=="function"?{name:e.name||"tool"}:typeof e=="string"||e&&typeof e=="object"?e:String(e)}async function zt(e,t){let n=(t.apiUrl??process.env.EVALKIT_API_URL??e.options.apiUrl).replace(/\/$/,""),o={agentInstructions:t.agentInstructions,count:t.count??5};t.tools&&(o.tools=t.tools.map(Jt)),t.functionSchemas&&(o.functionSchemas=t.functionSchemas.map(Jt)),t.context!==void 0&&(o.context=t.context),t.rag&&(o.rag=t.rag),t.categories&&(o.categories=t.categories),t.model&&(o.model=t.model),t.provider&&(o.provider=t.provider),t.apiKey&&(o.apiKey=t.apiKey),t.temperature!==void 0&&(o.temperature=t.temperature);let r=await fetch(n+"/scenarios/generate",{method:"POST",headers:{"Content-Type":"application/json","X-Subscription-Key":e.options.subscriptionKey},body:JSON.stringify(o)});if(!r.ok){let i=await r.text().catch(()=>"");throw new Error(`generateScenarios failed ${r.status}: ${i}`)}return (await r.json()).scenarios??[]}function Gn(e){let t=e.turns??e.messages??[],n=[];for(let o of t)typeof o=="string"?n.push(o):o&&typeof o=="object"&&o.content&&(o.role??"user")==="user"&&n.push(String(o.content));return n.length===0&&e.starting_prompt&&n.push(String(e.starting_prompt)),n}function Un(e,t,n,o){let r=Array.from(new Set([...e.constraints?.required_terms??[],...e.target_keywords??[]])),s={};r.length&&(s.requiredTerms=r),e.constraints?.has_citations!==void 0&&(s.hasCitations=e.constraints.has_citations);try{return $({output:t,toolCalls:n,expectedTools:e.expected_tools??[],constraints:s,metrics:o}).scores}catch{return {}}}async function Hn(e$1,t,n,o){let r=n.name??"scenario",s=n.scenario_id??"scn_"+ut(6),i="sess_"+ut(6),c=Gn(n).slice(0,o.maxTurns),a={...n.setup?.state??{},__safe_mode__:t.safeMode??true},{traceId:p,end:u,ctx:m}=e$1.startTrace(`scenario:${r}`,{"evalkit.session_id":i});e.set(p,{simulationId:o.simulationId,runId:o.runId,scenarioId:s});let d="OK",l,g=[],f$1=[],h=0,y={};try{await context.with(m,async()=>{for(let R=0;R<c.length;R++){let O={message:c[R],sessionId:i,state:a,turn:R+1},_=await t.entrypoint(O);_&&typeof _=="object"&&"text"in _?(g.push(_.text),_.toolCalls&&f$1.push(..._.toolCalls)):g.push(String(_)),h++;}let k=f$1.length?f$1:f.get(p)??[];y=Un(n,g.join(`
2
+ `),k,t.metrics);});}catch(k){d="ERROR",l=k?.message??String(k);}finally{u(d);}let v={scenarioId:s,name:r,status:d,turns:h,scores:y};return l&&(v.error=l),{result:v,traceId:p}}async function Wt(e$1,t){let n="sim_"+ut(8),o="run_"+ut(8),r=t.maxTurns??12,s=[],i=[];for(let c of t.scenarios){let{result:a,traceId:p}=await Hn(e$1,t,c,{simulationId:n,runId:o,maxTurns:r});s.push(a),i.push(p);}await e$1.flush();for(let c of i)e.delete(c),f.delete(c);return {simulationId:n,runId:o,results:s}}var Qt=b(()=>{h();lt();});var A,Xt=b(()=>{(function(e){e[e.SUCCESS=0]="SUCCESS",e[e.FAILED=1]="FAILED";})(A||(A={}));});var Yt=b(()=>{Xt();});function xt(e){return e[0]*1e3+e[1]/1e6}function Ln(e){return {0:"INTERNAL",1:"SERVER",2:"CLIENT",3:"PRODUCER",4:"CONSUMER"}[e]??"INTERNAL"}function Bn(e){return e===1?"OK":e===2?"ERROR":"UNSET"}function Vn(e){let t={};for(let[n,o]of Object.entries(e))n.startsWith("evalkit.")||n==="gen_ai.system"||o!=null&&(t[n]=o);return t}function Zt(e){return new Promise(t=>setTimeout(t,e))}var dt,te=b(()=>{Yt();h();dt=class{constructor(t){this.url=`${t.baseUrl.replace(/\/$/,"")}/v1/ingest`,this.subscriptionKey=t.subscriptionKey,this.debug=t.debug??false;}export(t,n){let o=t.map(s=>this.toEnvelope(s)),r={events:o};this.debug&&console.log(`[evalkit] sending ${o.length} span(s) \u2192 ${this.url}`),this.fetchWithRetry(this.url,{method:"POST",headers:{"Content-Type":"application/json","X-Subscription-Key":this.subscriptionKey},body:JSON.stringify(r)}).then(async s=>{if(!s.ok){let i=await s.text().catch(()=>"(no body)");console.error(`[evalkit] export failed ${s.status}: ${i}`),n({code:A.FAILED});return}if(this.debug){let i=await s.json().catch(()=>({}));console.log(`[evalkit] exported ${o.length} span(s) \u2014 status: ${i.status}`);}n({code:A.SUCCESS});}).catch(s=>{console.error("[evalkit] export network error:",s),n({code:A.FAILED});});}async fetchWithRetry(t,n,o=3){let r=[200,600,1800],s;for(let i=0;i<=o;i++)try{let c=await fetch(t,n);if(c.ok||c.status>=400&&c.status<500)return c;if(i<o)this.debug&&console.warn(`[evalkit] HTTP ${c.status}, retry ${i+1}/${o}`),await Zt(r[i]??1800);else return c}catch(c){s=c,i<o&&(this.debug&&console.warn(`[evalkit] network error, retry ${i+1}/${o}:`,c),await Zt(r[i]??1800));}throw s}shutdown(){return Promise.resolve()}toEnvelope(t){let n=t.spanContext(),o=t.attributes,r=xt(t.startTime),s=xt(t.endTime),i=t.events.map(p=>({name:p.name,timestamp:new Date(xt(p.time)).toISOString(),attributes:p.attributes})),c={traceId:n.traceId,spanId:n.spanId,parentSpanId:t.parentSpanId,spanKind:Ln(t.kind),spanType:o["evalkit.span_type"]??"log",status:Bn(t.status.code),statusMessage:t.status.message,serviceName:t.resource.attributes["service.name"],operation:t.name,model:o["gen_ai.response.model"]??o["gen_ai.request.model"],provider:o["gen_ai.system"],prompt:o["evalkit.prompt"],completion:o["evalkit.completion"],tokensIn:Math.round(o["gen_ai.usage.input_tokens"]||0)||void 0,tokensOut:Math.round(o["gen_ai.usage.output_tokens"]||0)||void 0,latencyMs:Math.round(s-r),startTime:new Date(r).toISOString(),endTime:new Date(s).toISOString(),events:i.length>0?i:void 0,attributes:Vn(o),createdAt:new Date(r).toISOString(),environment:o["evalkit.environment"],appVersion:o["evalkit.app_version"],userId:o["evalkit.user_id"],sessionId:o["evalkit.session_id"],deviceId:o["evalkit.device_id"],sdkVersion:o["evalkit.sdk_version"]},a=e.get(n.traceId);return a&&(c.isSimulation=true,c.simulationId=a.simulationId,c.scenarioId=a.scenarioId,c.runId=a.runId),c}};});function kt(e,t=Qn){let n;try{n=JSON.stringify(e);}catch{}if(n===void 0)try{n=String(e);}catch{n="<unserializable>";}return n.length>t?n.slice(0,t)+"\u2026":n}var Wn,Qn,U,Rt=b(()=>{te();Wn="0.1.17",Qn=4096;U=class{constructor(t){this.options={serviceName:"unknown",debug:false,maxExportBatchSize:512,scheduledDelayMillis:5e3,baseUrl:"https://api.syntropylabs.ai",apiUrl:"https://api.syntropylabs.ai",environment:"",appVersion:"",...t};let n=new dt({baseUrl:this.options.baseUrl,subscriptionKey:this.options.subscriptionKey,debug:this.options.debug});this.provider=new NodeTracerProvider({resource:new Resource({[ATTR_SERVICE_NAME]:this.options.serviceName}),spanProcessors:[new BatchSpanProcessor(n,{maxExportBatchSize:this.options.maxExportBatchSize,scheduledDelayMillis:this.options.scheduledDelayMillis})]}),this.provider.register(),this.tracer=trace.getTracer("evalkit","0.1.0");}metaAttributes(){let t={"evalkit.sdk_version":Wn};return this.options.environment&&(t["evalkit.environment"]=this.options.environment),this.options.appVersion&&(t["evalkit.app_version"]=this.options.appVersion),this.options.deviceId&&(t["evalkit.device_id"]=this.options.deviceId),t}startTrace(t,n){let o=this.tracer.startSpan(t,{kind:SpanKind.SERVER,attributes:{"evalkit.span_type":"log",...this.metaAttributes(),...n}},context.active()),r=trace.setSpan(context.active(),o);return {traceId:o.spanContext().traceId,ctx:r,end:(i="OK")=>{o.setStatus({code:i==="OK"?SpanStatusCode.OK:SpanStatusCode.ERROR}),o.end();}}}startHttpTrace(t,n,o){let r=this.tracer.startSpan(t,{kind:SpanKind.SERVER,attributes:{"evalkit.span_type":"http_call","http.method":n.method,"http.url":n.url,...n.headers?{"http.request.headers":JSON.stringify(n.headers)}:{},...n.requestBody!==void 0?{"http.request.body":JSON.stringify(n.requestBody)}:{},...this.metaAttributes(),...o}},context.active()),s=trace.setSpan(context.active(),r);return {traceId:r.spanContext().traceId,ctx:s,end:(c="OK",a)=>{a?.statusCode!==void 0&&r.setAttribute("http.status_code",a.statusCode),a?.body!==void 0&&r.setAttribute("http.response.body",JSON.stringify(a.body)),a?.headers&&r.setAttribute("http.response.headers",JSON.stringify(a.headers)),r.setStatus({code:c==="OK"?SpanStatusCode.OK:SpanStatusCode.ERROR}),r.end();}}}startSpan(t,n,o){let r=this.tracer.startSpan(t,{kind:SpanKind.INTERNAL,attributes:{"evalkit.span_type":"function_call",...this.metaAttributes(),...n}},o??context.active());return {ctx:trace.setSpan(context.active(),r),end:(i="OK",c)=>{c&&r.setAttributes(c),r.setStatus({code:i==="OK"?SpanStatusCode.OK:SpanStatusCode.ERROR}),r.end();}}}traceFunction(t,n,o,r=true){let s=this;return function(...i){let c={"evalkit.span_type":"function_call",...o};r&&i.length&&(c["function.args"]=kt(i));let{ctx:a,end:p}=s.startSpan(t,c),u;try{u=context.with(a,()=>n.apply(this,i));}catch(m){throw p("ERROR",{"error.message":m?.message??String(m)}),m}return u&&typeof u.then=="function"?u.then(m=>(p("OK",r?{"function.result":kt(m)}:void 0),m),m=>{throw p("ERROR",{"error.message":m?.message??String(m)}),m}):(p("OK",r?{"function.result":kt(u)}:void 0),u)}}async flush(){await this.provider.forceFlush();}async destroy(){await this.provider.shutdown();}};});function T(e){if(!e)return context.active();let t=e.split("-");return t.length===4&&t[0]==="00"&&t[1].length===32&&t[2].length===16?trace.setSpanContext(ROOT_CONTEXT,{traceId:t[1],spanId:t[2],traceFlags:parseInt(t[3],16),isRemote:true}):context.active()}var H=b(()=>{});function to(e,t){let n="",o=0,r=0,s=false;function i(c){s||(s=true,c?t.setStatus({code:SpanStatusCode.ERROR,message:c.message}):(t.setAttributes({"evalkit.completion":n,"gen_ai.usage.input_tokens":o,"gen_ai.usage.output_tokens":r,"gen_ai.streaming":true}),t.setStatus({code:SpanStatusCode.OK})),t.end());}return new Proxy(e,{get(c,a,p){if(a===Symbol.asyncIterator)return function(){let m=c[Symbol.asyncIterator]();return {async next(){try{let d=await m.next();if(!d.done&&d.value){let l=d.value,g=l.choices?.[0]?.delta?.content;g&&(n+=g),l.usage&&(o=l.usage.prompt_tokens??0,r=l.usage.completion_tokens??0);}return d.done&&i(),d}catch(d){throw i(d instanceof Error?d:new Error(String(d))),d}},return(){return i(),m.return?.()??Promise.resolve({done:true,value:void 0})},throw(d){return i(d instanceof Error?d:new Error(String(d))),m.throw?.(d)??Promise.reject(d)},[Symbol.asyncIterator](){return this}}};let u=Reflect.get(c,a,p);return typeof u=="function"?u.bind(c):u}})}function K(e,t,n,o="openai"){if(t.create.__evalkit)return;let r=t.create;t.create=async function(...s){let i=s[0],c=n??context.active(),a=e.tracer.startSpan("chat.completions.create",{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":o,"gen_ai.request.model":i.model??"unknown",...i.temperature!=null&&{"gen_ai.request.temperature":i.temperature},...i.max_tokens!=null&&{"gen_ai.request.max_tokens":i.max_tokens},...i.top_p!=null&&{"gen_ai.request.top_p":i.top_p},"evalkit.prompt":eo(i.messages??[])}},c),p=trace.setSpan(c,a);if(i?.stream){let l;try{l=await context.with(p,()=>r.apply(this,s));}catch(g){throw a.setStatus({code:SpanStatusCode.ERROR,message:g instanceof Error?g.message:String(g)}),a.end(),g}return to(l,a)}let u;try{u=await context.with(p,()=>r.apply(this,s));}catch(l){throw a.setStatus({code:SpanStatusCode.ERROR,message:l instanceof Error?l.message:String(l)}),a.end(),l}let m=u.choices?.[0],d=m?.message.content??"";a.setAttributes({"gen_ai.response.model":u.model,"gen_ai.response.id":u.id,"gen_ai.usage.input_tokens":u.usage?.prompt_tokens??0,"gen_ai.usage.output_tokens":u.usage?.completion_tokens??0,"gen_ai.usage.total_tokens":u.usage?.total_tokens??0,"gen_ai.response.finish_reasons":m?.finish_reason?[m.finish_reason]:[],"evalkit.completion":d});for(let l of m?.message.tool_calls??[]){a.addEvent("gen_ai.tool.call",{"gen_ai.tool.call.id":l.id,"gen_ai.tool.name":l.function.name,"gen_ai.tool.call.arguments":l.function.arguments});try{let f;try{f=JSON.parse(l.function.arguments);}catch{}g(a.spanContext().traceId,l.function.name,f);}catch{}e.tracer.startSpan(l.function.name,{kind:SpanKind.INTERNAL,attributes:{"evalkit.span_type":"tool_call","gen_ai.tool.name":l.function.name,"gen_ai.tool.call.id":l.id,"gen_ai.tool.call.arguments":l.function.arguments}},p).end();}return a.setStatus({code:SpanStatusCode.OK}),a.end(),u},t.create.__evalkit=true;}function eo(e){return e.map(t=>`${t.role}: ${t.content??""}`).join(`
3
+ `)}var bt=b(()=>{h();});function oo(e,t){let n="",o=0,r=0,s=false;function i(a){let p=a?.type;if(p==="content_block_delta"){let u=a.delta;u?.type==="text_delta"&&u.text&&(n+=u.text);}else p==="message_start"?o=a.message?.usage?.input_tokens??0:p==="message_delta"&&(r=a.usage?.output_tokens??0);}function c(a){s||(s=true,a?t.setStatus({code:SpanStatusCode.ERROR,message:a.message}):(t.setAttributes({"evalkit.completion":n,"gen_ai.usage.input_tokens":o,"gen_ai.usage.output_tokens":r,"gen_ai.streaming":true}),t.setStatus({code:SpanStatusCode.OK})),t.end());}return new Proxy(e,{get(a,p,u){if(p===Symbol.asyncIterator)return function(){let d=a[Symbol.asyncIterator]();return {async next(){try{let l=await d.next();return !l.done&&l.value&&i(l.value),l.done&&c(),l}catch(l){throw c(l instanceof Error?l:new Error(String(l))),l}},return(){return c(),d.return?.()??Promise.resolve({done:true,value:void 0})},throw(l){return c(l instanceof Error?l:new Error(String(l))),d.throw?.(l)??Promise.reject(l)},[Symbol.asyncIterator](){return this}}};let m=Reflect.get(a,p,u);return typeof m=="function"?m.bind(a):m}})}function P(e,t,n){if(t.create.__evalkit)return;let o=t.create;t.create=async function(...r){let s=r[0],i=n??context.active(),c=ro(s.system,s.messages??[]),a=e.tracer.startSpan("messages.create",{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"anthropic","gen_ai.request.model":s.model??"unknown",...s.temperature!=null&&{"gen_ai.request.temperature":s.temperature},...s.max_tokens!=null&&{"gen_ai.request.max_tokens":s.max_tokens},...s.top_p!=null&&{"gen_ai.request.top_p":s.top_p},"evalkit.prompt":c}},i),p=trace.setSpan(i,a);if(s?.stream){let d;try{d=await context.with(p,()=>o.apply(this,r));}catch(l){throw a.setStatus({code:SpanStatusCode.ERROR,message:l instanceof Error?l.message:String(l)}),a.end(),l}return oo(d,a)}let u;try{u=await context.with(p,()=>o.apply(this,r));}catch(d){throw a.setStatus({code:SpanStatusCode.ERROR,message:d instanceof Error?d.message:String(d)}),a.end(),d}let m=u.content.filter(d=>d.type==="text").map(d=>d.text??"").join("");a.setAttributes({"gen_ai.response.model":u.model,"gen_ai.response.id":u.id,"gen_ai.usage.input_tokens":u.usage?.input_tokens??0,"gen_ai.usage.output_tokens":u.usage?.output_tokens??0,"gen_ai.response.finish_reasons":u.stop_reason?[u.stop_reason]:[],"evalkit.completion":m});for(let d of u.content)if(d.type==="tool_use"){let l=d;a.addEvent("gen_ai.tool.call",{"gen_ai.tool.call.id":l.id,"gen_ai.tool.name":l.name,"gen_ai.tool.call.arguments":JSON.stringify(l.input)});try{g(a.spanContext().traceId,l.name,l.input);}catch{}e.tracer.startSpan(l.name,{kind:SpanKind.INTERNAL,attributes:{"evalkit.span_type":"tool_call","gen_ai.tool.name":l.name,"gen_ai.tool.call.id":l.id,"gen_ai.tool.call.arguments":JSON.stringify(l.input)}},p).end();}return a.setStatus({code:SpanStatusCode.OK}),a.end(),u},t.create.__evalkit=true;}function ro(e,t){let n=[];return e&&n.push(`system: ${e}`),n.push(...t.map(o=>`${o.role}: ${o.content}`)),n.join(`
4
+ `)}var gt=b(()=>{h();});function ft(e,t){let n=t.Query?.prototype;if(!n||n.__evalkit)return;let o=n.exec;n.exec=async function(){if(!trace.getActiveSpan()?.isRecording())return o.call(this);let s=this.op??"query",i=this.model?.collection?.name??this._collection?.collectionName??"unknown",c=e.tracer.startSpan(`${s} ${i}`,{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"db_query","db.system":"mongodb","db.operation":s,"db.collection":i,"db.query":JSON.stringify(this._conditions??{})}},context.active());try{let a=await o.call(this);return c.setStatus({code:SpanStatusCode.OK}),c.end(),a}catch(a){throw c.setStatus({code:SpanStatusCode.ERROR,message:a.message}),c.end(),a}},n.__evalkit=true;}var wt=b(()=>{});function Q(e,t){let o=t?.prototype&&(typeof t.prototype.sendCommand=="function"||typeof t.prototype.call=="function")?t.prototype:Object.getPrototypeOf(t);if(!o||o.__evalkit_redis)return;let r=typeof o.sendCommand=="function"?"sendCommand":typeof o.call=="function"?"call":null;if(!r)return;let s=o[r];o[r]=async function(i,...c){if(!trace.getActiveSpan()?.isRecording())return s.call(this,i,...c);let p=Array.isArray(i)?i[0]:i?.name??i?.args?.[0]??"cmd",u=(typeof p=="string"?p:String(p)).toUpperCase(),m=e.tracer.startSpan(`redis ${u}`,{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"db_query","db.system":"redis","db.operation":u}},context.active());try{let d=await s.call(this,i,...c);return m.setStatus({code:SpanStatusCode.OK}),m.end(),d}catch(d){throw m.setStatus({code:SpanStatusCode.ERROR,message:d.message}),m.end(),d}},o.__evalkit_redis=true;}var Ot=b(()=>{});function w(e){let t={};for(let[n,o]of Object.entries(e))uo.test(n)||o!==void 0&&(t[n]=Array.isArray(o)?o.join(", "):String(o));return t}var uo,Tt=b(()=>{uo=/^(authorization|cookie|set-cookie|x-api-key|api-key|x-auth-token|proxy-authorization|x-secret|x-access-token|token|password)$/i;});var L,At=b(()=>{L=new Map;});function X(e,t){if(!t.__evalkit_axios){if(t.__evalkit_axios=true,typeof t.create=="function"){let n=t.create.bind(t);t.create=function(...o){let r=n(...o);return X(e,r),r};}t.interceptors.request.use(n=>{let o=(n.baseURL?n.baseURL.replace(/\/$/,""):"")+(n.url??"");if(yo.some(u=>u.test(o))||!trace.getActiveSpan()?.isRecording())return n;let s=n.url??"";try{s=new URL(o,n.baseURL??"http://localhost").pathname;}catch{}let i=(n.method??"get").toUpperCase(),c=w(n.headers??{}),a=e.tracer.startSpan(`${i} ${s}`,{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"http_call","http.method":i,"http.url":o,...Object.keys(c).length?{"http.request.headers":JSON.stringify(c)}:{},...n.data!==void 0?{"http.request.body":typeof n.data=="string"?n.data.slice(0,4096):JSON.stringify(n.data).slice(0,4096)}:{}}},context.active()),p=a.spanContext();return n.headers=n.headers??{},n.headers.traceparent=`00-${p.traceId}-${p.spanId}-01`,n.headers["x-evalkit-span-id"]=p.spanId,L.set(p.spanId,a),n.__evalkitSpan=a,n.__evalkitSpanId=p.spanId,n}),t.interceptors.response.use(n=>{let o=n.config?.__evalkitSpan;if(n.config?.__evalkitSpanId&&L.delete(n.config.__evalkitSpanId),o){let r=w(n.headers??{}),s=n.data,i;s!=null&&(i=(typeof s=="string"?s:JSON.stringify(s)).slice(0,4096)),o.setAttributes({"http.status_code":n.status,...Object.keys(r).length?{"http.response.headers":JSON.stringify(r)}:{},...i!==void 0?{"http.response.body":i}:{}}),o.setStatus({code:SpanStatusCode.OK}),o.end();}return n},n=>{let o=n.config?.__evalkitSpan;if(n.config?.__evalkitSpanId&&L.delete(n.config.__evalkitSpanId),o){let r=n.response?.status??0,s=w(n.response?.headers??{}),i=n.response?.data,c;i!=null&&(c=(typeof i=="string"?i:JSON.stringify(i)).slice(0,4096)),o.setAttributes({"http.status_code":r,"error.message":n.message,...Object.keys(s).length?{"http.response.headers":JSON.stringify(s)}:{},...c!==void 0?{"http.response.body":c}:{}}),o.setStatus({code:SpanStatusCode.ERROR,message:n.message}),o.end();}throw n});}}var yo,It=b(()=>{Tt();At();yo=[/\/v1\/ingest/,/\/health(z)?$/];});function Y(e,t){let n=t?.prototype??Object.getPrototypeOf(t);if(!n||n.__evalkit_pg)return;let o=n.query;typeof o=="function"&&(n.query=function(...r){if(!trace.getActiveSpan()?.isRecording())return o.apply(this,r);let i=typeof r[0]=="string"?r[0]:r[0]?.text??r[0]?.name??"query",c=Array.isArray(r[1])?r[1]:r[0]?.values??void 0,p=i.trim().match(/^(\w+)/)?.[1]?.toUpperCase()??"QUERY",m=i.match(/(?:FROM|INTO|UPDATE|JOIN)\s+"?(\w+)"?/i)?.[1]??"",d=m?`${p} ${m}`:`pg ${p}`,l=e.tracer.startSpan(d,{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"db_query","db.system":"postgresql","db.operation":p,"db.statement":i.slice(0,2048),...c!==void 0?{"db.params":JSON.stringify(c).slice(0,1024)}:{},...m?{"db.sql.table":m}:{}}},context.active()),g=r[r.length-1];if(typeof g=="function"){let h=g,y=r.slice(0,-1).concat([(v,k)=>{v?(l.setStatus({code:SpanStatusCode.ERROR,message:v.message}),l.setAttribute("error.message",v.message)):(l.setAttribute("db.rows_affected",k?.rowCount??0),l.setStatus({code:SpanStatusCode.OK})),l.end(),h(v,k);}]);return o.apply(this,y)}return o.apply(this,r).then(h=>(l.setAttribute("db.rows_affected",h?.rowCount??0),l.setStatus({code:SpanStatusCode.OK}),l.end(),h),h=>{throw l.setStatus({code:SpanStatusCode.ERROR,message:h?.message}),l.setAttribute("error.message",h?.message??String(h)),l.end(),h})},n.__evalkit_pg=true);}var Kt=b(()=>{});function Z(e,t){let n=t?.prototype??Object.getPrototypeOf(t);if(!(!n||n.__evalkit_mysql2)){for(let o of ["query","execute"]){let r=n[o];typeof r=="function"&&(n[o]=function(...s){if(!trace.getActiveSpan()?.isRecording())return r.apply(this,s);let c=typeof s[0]=="string"?s[0]:s[0]?.sql??"query",a=Array.isArray(s[1])?s[1]:void 0,u=c.trim().match(/^(\w+)/)?.[1]?.toUpperCase()??"QUERY",d=c.match(/(?:FROM|INTO|UPDATE|JOIN)\s+`?(\w+)`?/i)?.[1]??"",l=d?`${u} ${d}`:`mysql ${u}`,g=e.tracer.startSpan(l,{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"db_query","db.system":"mysql","db.operation":u,"db.statement":c.slice(0,2048),...a!==void 0?{"db.params":JSON.stringify(a).slice(0,1024)}:{},...d?{"db.sql.table":d}:{}}},context.active()),f=s[s.length-1];if(typeof f=="function"){let y=f,v=s.slice(0,-1).concat([(k,R,O)=>{k?(g.setStatus({code:SpanStatusCode.ERROR,message:k.message}),g.setAttribute("error.message",k.message)):(g.setAttribute("db.rows_affected",Array.isArray(R)?R.length:R?.affectedRows??0),g.setStatus({code:SpanStatusCode.OK})),g.end(),y(k,R,O);}]);return r.apply(this,v)}let h=r.apply(this,s);return h&&typeof h.then=="function"?h.then(([y,v])=>(g.setAttribute("db.rows_affected",Array.isArray(y)?y.length:y?.affectedRows??0),g.setStatus({code:SpanStatusCode.OK}),g.end(),[y,v]),y=>{throw g.setStatus({code:SpanStatusCode.ERROR,message:y?.message}),g.setAttribute("error.message",y?.message??String(y)),g.end(),y}):(g.end(),h)});}n.__evalkit_mysql2=true;}}var Pt=b(()=>{});function bo(e){if(!e||typeof e!="object")return false;let t=e.constructor?.name??"";return t==="ConverseCommand"||t==="ConverseStreamCommand"}function tt(e,t,n){if(t.send.__evalkit)return;let o=t.send;t.send=async function(...r){let s=r[0];if(!bo(s))return o.apply(this,r);let i=s.input,c=i?.modelId??"unknown",a=c.split(".")[0]??"bedrock",p=i?.system?.map(v=>v.text).join(`
5
+ `)??"",u=i?.messages?.map(v=>`${v.role}: ${v.content.map(k=>k.text??"").join("")}`)??[],m=[p?`system: ${p}`:"",...u].filter(Boolean).join(`
6
+ `),d=i?.inferenceConfig??{},l=context.active(),g=e.tracer.startSpan("converse",{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":a,"gen_ai.request.model":c,...d.temperature!=null&&{"gen_ai.request.temperature":d.temperature},...d.maxTokens!=null&&{"gen_ai.request.max_tokens":d.maxTokens},...d.topP!=null&&{"gen_ai.request.top_p":d.topP},"evalkit.prompt":m}},l),f=trace.setSpan(l,g),h;try{h=await context.with(f,()=>o.apply(this,r));}catch(v){throw g.setStatus({code:SpanStatusCode.ERROR,message:v instanceof Error?v.message:String(v)}),g.end(),v}let y=h.output?.message?.content?.map(v=>v.text??"").join("")??"";return g.setAttributes({"gen_ai.response.model":c,"gen_ai.usage.input_tokens":h.usage?.inputTokens??0,"gen_ai.usage.output_tokens":h.usage?.outputTokens??0,"gen_ai.usage.total_tokens":h.usage?.totalTokens??0,"gen_ai.response.finish_reasons":h.stopReason?[h.stopReason]:[],"evalkit.completion":y}),g.setStatus({code:SpanStatusCode.OK}),g.end(),h},t.send.__evalkit=true;}var Mt=b(()=>{});function et(e,t,n){if(t.chat.__evalkit)return;let o=t.chat;t.chat=async function(...r){let s=r[0];if(s?.stream)return o.apply(this,r);let i=s?.chatHistory?.map(d=>`${d.role}: ${d.message??""}`)??[],c=[s?.preamble?`system: ${s.preamble}`:"",...i,`user: ${s?.message??""}`].filter(Boolean).join(`
7
+ `),a=context.active(),p=e.tracer.startSpan("chat",{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"cohere","gen_ai.request.model":s?.model??"unknown",...s?.temperature!=null&&{"gen_ai.request.temperature":s.temperature},...s?.maxTokens!=null&&{"gen_ai.request.max_tokens":s.maxTokens},"evalkit.prompt":c}},a),u=trace.setSpan(a,p),m;try{m=await context.with(u,()=>o.apply(this,r));}catch(d){throw p.setStatus({code:SpanStatusCode.ERROR,message:d instanceof Error?d.message:String(d)}),p.end(),d}return p.setAttributes({"gen_ai.response.model":s?.model??"unknown","gen_ai.response.id":m.generationId??"","gen_ai.usage.input_tokens":m.meta?.tokens?.inputTokens??0,"gen_ai.usage.output_tokens":m.meta?.tokens?.outputTokens??0,"gen_ai.response.finish_reasons":m.finishReason?[m.finishReason]:[],"evalkit.completion":m.text??""}),p.setStatus({code:SpanStatusCode.OK}),p.end(),m},t.chat.__evalkit=true;}var qt=b(()=>{});function nt(e,t,n){if(t.generateContent.__evalkit)return;let o=t.generateContent,r=t.model??"unknown";t.generateContent=async function(...s){let i=s[0],c="";if(typeof i=="string")c=`user: ${i}`;else {let f=i,h=f?.systemInstruction?.parts?.map(v=>v.text??"").join("")??"",y=f?.contents?.map(v=>`${v.role??"user"}: ${v.parts.map(k=>k.text??"").join("")}`)??[];c=[h?`system: ${h}`:"",...y].filter(Boolean).join(`
8
+ `);}let a=context.active(),p=e.tracer.startSpan("generateContent",{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"google-ai","gen_ai.request.model":r,"evalkit.prompt":c}},a),u=trace.setSpan(a,p),m;try{m=await context.with(u,()=>o.apply(this,s));}catch(f){throw p.setStatus({code:SpanStatusCode.ERROR,message:f instanceof Error?f.message:String(f)}),p.end(),f}let d=m?.response,l=d?.candidates?.[0],g=l?.content?.parts?.map(f=>f.text??"").join("")??"";return p.setAttributes({"gen_ai.response.model":r,"gen_ai.usage.input_tokens":d?.usageMetadata?.promptTokenCount??0,"gen_ai.usage.output_tokens":d?.usageMetadata?.candidatesTokenCount??0,"gen_ai.usage.total_tokens":d?.usageMetadata?.totalTokenCount??0,"gen_ai.response.finish_reasons":l?.finishReason?[l.finishReason]:[],"evalkit.completion":g}),p.setStatus({code:SpanStatusCode.OK}),p.end(),m},t.generateContent.__evalkit=true;}var Nt=b(()=>{});function me(e){return e?.text??""}function Ao(e){if(typeof e=="string")return e;if(Array.isArray(e))return e.map(t=>{if(typeof t=="string")return t;let n=t,o=n.role??"user",r=(n.parts??[]).map(me).join("");return r?`${o}: ${r}`:""}).filter(Boolean).join(`
9
+ `);if(e&&typeof e=="object"){let t=e;if(t.parts)return (t.parts??[]).map(me).join("")}return e!=null?String(e):""}function Io(e){let t=e?.systemInstruction;return t?typeof t=="string"?t:Array.isArray(t?.parts)?t.parts.map(n=>n?.text??"").join(""):typeof t?.text=="string"?t.text:"":""}function ge(e){let t=Io(e?.config),n=Ao(e?.contents);return [t?`system: ${t}`:"",n].filter(Boolean).join(`
10
+ `)}function fe(e){let t=[];for(let n of e?.candidates??[])for(let o of n.content?.parts??[])o.text&&t.push(o.text);return t.length?t.join(""):e?.text??""}function ye(e,t,n){let o=[];if(Array.isArray(e?.functionCalls))o.push(...e.functionCalls);else for(let r of e?.candidates??[])for(let s of r.content?.parts??[])s.functionCall?.name&&o.push(s.functionCall);for(let r of o){let s=r.name??"";if(!s)continue;let i="";try{i=JSON.stringify(r.args??{});}catch{i=String(r.args);}t.addEvent("gen_ai.tool.call",{"gen_ai.tool.name":s,"gen_ai.tool.call.arguments":i,"gen_ai.tool.call.id":r.id??""});let c=Ko(t);g(n,s,r.args),c&&c.end();}}function Ko(e){if(!Gt)return null;let t=trace.setSpan(context.active(),e);return Gt.tracer.startSpan("tool_call",{kind:SpanKind.INTERNAL,attributes:{"evalkit.span_type":"tool_call"}},t)}function st(e,t,n){if(Gt=e,t.generateContent&&!t.generateContent.__evalkit){let o=t.generateContent;t.generateContent=async function(...r){let s=r[0]??{},i=s.model??"unknown",c=context.active(),a=e.tracer.startSpan("generateContent",{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"google-genai","gen_ai.request.model":i,"evalkit.prompt":ge(s)}},c),p=trace.setSpan(c,a),u;try{u=await context.with(p,()=>o.apply(this,r));}catch(m){throw a.setStatus({code:SpanStatusCode.ERROR,message:m instanceof Error?m.message:String(m)}),a.end(),m}a.setAttributes({"gen_ai.response.model":i,"gen_ai.usage.input_tokens":u?.usageMetadata?.promptTokenCount??0,"gen_ai.usage.output_tokens":u?.usageMetadata?.candidatesTokenCount??0,"gen_ai.usage.total_tokens":u?.usageMetadata?.totalTokenCount??0,"evalkit.completion":fe(u)});try{ye(u,a,a.spanContext().traceId);}catch{}return a.setStatus({code:SpanStatusCode.OK}),a.end(),u},t.generateContent.__evalkit=true;}if(t.generateContentStream&&!t.generateContentStream.__evalkit){let o=t.generateContentStream;t.generateContentStream=async function(...r){let s=r[0]??{},i=s.model??"unknown",c=context.active(),a=e.tracer.startSpan("generateContentStream",{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"google-genai","gen_ai.request.model":i,"gen_ai.streaming":true,"evalkit.prompt":ge(s)}},c),p=trace.setSpan(c,a),u;try{u=await context.with(p,()=>o.apply(this,r));}catch(d){throw a.setStatus({code:SpanStatusCode.ERROR,message:d instanceof Error?d.message:String(d)}),a.end(),d}async function*m(){let d=[],l=0,g=0;try{for await(let f of u){try{let h=fe(f);h&&d.push(h),f?.usageMetadata&&(l=f.usageMetadata.promptTokenCount??l,g=f.usageMetadata.candidatesTokenCount??g),ye(f,a,a.spanContext().traceId);}catch{}yield f;}a.setAttributes({"gen_ai.response.model":i,"gen_ai.usage.input_tokens":l,"gen_ai.usage.output_tokens":g,"evalkit.completion":d.join("")}),a.setStatus({code:SpanStatusCode.OK});}catch(f){throw a.setStatus({code:SpanStatusCode.ERROR,message:f instanceof Error?f.message:String(f)}),f}finally{a.end();}}return m()},t.generateContentStream.__evalkit=true;}}var Gt,Ut=b(()=>{h();Gt=null;});function at(e,t,n){P(e,t,n);}function it(e,t,n){if(t.generateContent.__evalkit)return;let o=t.generateContent,r=t.model??"unknown";t.generateContent=async function(...s){let i=s[0],c=i?.systemInstruction?.parts?.map(y=>y.text??"").join("")??"",a=i?.contents?.map(y=>`${y.role??"user"}: ${y.parts.map(v=>v.text??"").join("")}`)??[],p=[c?`system: ${c}`:"",...a].filter(Boolean).join(`
11
+ `),u=context.active(),m=e.tracer.startSpan("generateContent",{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"llm_call","gen_ai.system":"google-vertex","gen_ai.request.model":r,"evalkit.prompt":p}},u),d=trace.setSpan(u,m),l;try{l=await context.with(d,()=>o.apply(this,s));}catch(y){throw m.setStatus({code:SpanStatusCode.ERROR,message:y instanceof Error?y.message:String(y)}),m.end(),y}let g=l?.response,f=g?.candidates?.[0],h=f?.content?.parts?.map(y=>y.text??"").join("")??"";return m.setAttributes({"gen_ai.response.model":r,"gen_ai.usage.input_tokens":g?.usageMetadata?.promptTokenCount??0,"gen_ai.usage.output_tokens":g?.usageMetadata?.candidatesTokenCount??0,"gen_ai.usage.total_tokens":g?.usageMetadata?.totalTokenCount??0,"gen_ai.response.finish_reasons":f?.finishReason?[f.finishReason]:[],"evalkit.completion":h}),m.setStatus({code:SpanStatusCode.OK}),m.end(),l},t.generateContent.__evalkit=true;}var Ht=b(()=>{gt();});function _e(e,t={},n){function o(r,s,i){let c={...t,...s};r.addHook("onRequest",(a,p,u)=>{let m=a.routerPath??a.routeOptions?.url??a.url??"/",d=typeof c.name=="function"?c.name(a):c.name??`${String(a.method??"GET")} ${String(m)}`,l=a.headers?.traceparent,g=n?n(l):context.active(),{traceId:f,end:h,ctx:y}=context.with(g,()=>e.startHttpTrace(d,{method:String(a.method??"GET"),url:String(a.url??"/"),headers:a.headers,requestBody:void 0}));a._evalkitCtx=y,a._evalkitTraceId=f,a._evalkitEnd=h,a._evalkitEnded=false,context.with(y,u);}),r.addHook("preHandler",(a,p,u)=>{if(a._evalkitCtx&&a.body!==void 0){let m=trace.getActiveSpan();if(m?.isRecording())try{m.setAttribute("http.request.body",typeof a.body=="string"?a.body.slice(0,4096):JSON.stringify(a.body).slice(0,4096));}catch{}}context.with(a._evalkitCtx??context.active(),u);}),r.addHook("onResponse",(a,p,u)=>{if(typeof a._evalkitEnd=="function"&&!a._evalkitEnded){a._evalkitEnded=true;let m=p.statusCode??200;a._evalkitEnd(m>=400?"ERROR":"OK",{statusCode:m});}u();}),r.addHook("onError",(a,p,u,m)=>{typeof a._evalkitEnd=="function"&&!a._evalkitEnded&&(a._evalkitEnded=true,a._evalkitEnd("ERROR",{statusCode:p.statusCode??500})),m();}),i();}return o[Symbol.for("skip-override")]=true,o}var xe=b(()=>{});function ke(e,t){return (n,o,r)=>{let s=typeof t?.name=="function"?t.name(n):t?.name??`${String(n.method)} ${String(n.route?.path??n.path??n.url)}`,i=T(n.headers?.traceparent),{end:c,ctx:a,traceId:p}=context.with(i,()=>e.startHttpTrace(s,{method:String(n.method??"GET"),url:String(n.originalUrl??n.url??"/"),headers:n.headers,requestBody:n.body}));n._evalkitCtx=a,n._evalkitTraceId=p;let u=trace.getSpan(a)?.spanContext().spanId??"0000000000000000";o.setHeader?.("x-trace-id",p),o.setHeader?.("traceparent",`00-${p}-${u}-01`);let m=o.end;o.end=function(...d){let l=o.statusCode??200;return c(l>=400?"ERROR":"OK",{statusCode:l,headers:o.getHeaders?o.getHeaders():void 0}),m.apply(o,d)},context.with(a,()=>r());}}var Re=b(()=>{H();});function be(e,t){return async(n,o)=>{let r=typeof t?.name=="function"?t.name(n):t?.name??`${String(n.method??"GET")} ${String(n.path??"/")}`,s=T(n.request?.headers?.traceparent),{end:i,ctx:c}=context.with(s,()=>e.startHttpTrace(r,{method:String(n.method??"GET"),url:String(n.href??n.url??"/"),headers:n.request?.headers,requestBody:n.request?.body}));n._evalkitCtx=c;try{await context.with(c,o);let a=n.status??200;i(a>=400?"ERROR":"OK",{statusCode:a});}catch(a){throw i("ERROR",{statusCode:n.status??500}),a}}}var Ee=b(()=>{H();});function Oe(e,t){return async(n,o)=>{let r=n.req,s=r.url??"/",i=s;try{i=new URL(s).pathname;}catch{}let c=typeof t?.name=="function"?t.name(n):t?.name??`${String(r.method??"GET")} ${i}`,a=T(r.header("traceparent")),{end:p,ctx:u}=context.with(a,()=>e.startHttpTrace(c,{method:String(r.method??"GET"),url:s,headers:Object.fromEntries(r.raw?.headers??[])}));try{await context.with(u,o);let m=n.res?.status??200;p(m>=400?"ERROR":"OK",{statusCode:m});}catch(m){throw p("ERROR",{statusCode:500}),m}}}var Te=b(()=>{H();});function Ae(e,t){return {name:"@evalkit/hapi",register(n){let o=new WeakMap;n.ext("onRequest",(r,s)=>{let i=typeof t?.name=="function"?t.name(r):t?.name??`${String(r.method?.toUpperCase()??"GET")} ${String(r.path??"/")}`,c=T(r.headers?.traceparent),{end:a,ctx:p}=context.with(c,()=>e.startHttpTrace(i,{method:String(r.method?.toUpperCase()??"GET"),url:String(r.url?.href??r.path??"/"),headers:r.headers}));return o.set(r,{end:a,ctx:p}),s.continue}),n.ext("onPreResponse",(r,s)=>{let i=o.get(r);if(i){let c=r.response?.output?.statusCode??r.response?.statusCode??200;i.end(c>=400?"ERROR":"OK",{statusCode:c}),o.delete(r);}return s.continue});}}}var Ie=b(()=>{H();});var B,Lt=b(()=>{B=class{constructor(t){this.client=t;}intercept(t,n){let o=t.switchToHttp?.();if(!o)return n.handle();let r=o.getRequest(),s=`${String(r.method??"GET")} ${String(r.route?.path??r.path??r.url??"/")}`,{ctx:i,end:c}=this.client.startHttpTrace(s,{method:String(r.method??"GET"),url:String(r.originalUrl??r.url??"/"),headers:r.headers,requestBody:r.body}),a=context.with(i,()=>n.handle());return {subscribe(p){return a.subscribe({next:u=>p.next?.(u),error:u=>{c("ERROR"),p.error?.(u);},complete:()=>{let u=o.getResponse().statusCode??200;c(u>=400?"ERROR":"OK",{statusCode:u}),p.complete?.();}})},pipe(...p){return a.pipe(...p)}}}};});function Bt(e){return Go.some(t=>t.test(e))}function Uo(e,t,n){let o="",r="GET";if(typeof e=="string")o=e,r=(t?.method??"GET").toUpperCase();else if(e instanceof URL)o=e.href,r=(t?.method??"GET").toUpperCase();else {let i=e.hostname??e.host??"localhost",c=e.port?`:${e.port}`:"",a=e.path??"/";o=`${n}://${i}${c}${a}`,r=(e.method??t?.method??"GET").toUpperCase();}let s=o;try{s=new URL(o.startsWith("http")?o:`${n}://localhost${o}`).pathname;}catch{}return {url:o,method:r,pathname:s}}function Me(e){let t,n;try{let s=typeof a<"u"?a:createRequire(import.meta.url);t=s("http"),n=s("https");}catch{return}let o=[{mod:t,scheme:"http"},{mod:n,scheme:"https"}];for(let{mod:s,scheme:i}of o){let a=function(p,u,m){let d=typeof u=="function"?void 0:u,{url:l,method:g,pathname:f}=Uo(p,d,i);if(Bt(l)||!trace.getActiveSpan()?.isRecording())return c.call(s,p,u,m);let y={...typeof p=="object"&&!(p instanceof URL)?p.headers??{}:{},...d?.headers??{}},v=y["x-evalkit-span-id"];if(v){typeof p=="object"&&!(p instanceof URL)&&p.headers&&delete p.headers["x-evalkit-span-id"],d?.headers&&delete d.headers["x-evalkit-span-id"];let S=L.get(String(v));if(S){let N=w({...y});delete N["x-evalkit-span-id"],Object.keys(N).length&&S.setAttributes({"http.request.headers":JSON.stringify(N)});}return c.call(s,p,u,m)}let k=w(y),R=e.tracer.startSpan(`${g} ${f}`,{kind:SpanKind.CLIENT,attributes:{"evalkit.span_type":"http_call","http.method":g,"http.url":l,...Object.keys(k).length?{"http.request.headers":JSON.stringify(k)}:{}}},context.active()),O=c.call(s,p,u,m),_=R.spanContext();return O.setHeader("traceparent",`00-${_.traceId}-${_.spanId}-01`),O.on("response",S=>{let N=S.statusCode??0;R.setAttributes({"http.status_code":N,...S.headers?{"http.response.headers":JSON.stringify(w(S.headers))}:{}}),R.setStatus({code:N>=400?SpanStatusCode.ERROR:SpanStatusCode.OK}),R.end();}),O.on("error",S=>{R.setAttributes({"http.status_code":0,"error.message":S.message}),R.setStatus({code:SpanStatusCode.ERROR,message:S.message}),R.end();}),O};let c=s.request;c.__evalkit||(a.__evalkit=true,Object.defineProperty(s,"request",{value:a,writable:true,configurable:true}));}}function qe(e){let t;try{t=(typeof a<"u"?a:createRequire(import.meta.url))("http");}catch{return}if(t.Server.prototype.emit.__evalkit_server)return;let n=t.Server.prototype.emit;function o(r,...s){if(r!=="request")return n.call(this,r,...s);let i=s[0],c=s[1],a=i.url??"/";if(Bt(a))return n.call(this,r,...s);if(trace.getActiveSpan()?.isRecording())return n.call(this,r,...s);let p=(i.method??"GET").toUpperCase(),u=a;try{u=new URL(a,"http://localhost").pathname;}catch{}let m=i.headers.traceparent,d=m?Ho(Array.isArray(m)?m[0]:m):context.active(),l=e.tracer.startSpan(`${p} ${u}`,{kind:SpanKind.SERVER,attributes:{"evalkit.span_type":"http_call","http.method":p,"http.url":a,"http.request.headers":JSON.stringify(w(i.headers))}},d),g=trace.setSpan(d,l),f=l.spanContext();c.setHeader("x-trace-id",f.traceId),c.setHeader("traceparent",`00-${f.traceId}-${f.spanId}-01`);let h=8192,y=[],v=0,k=_=>{try{if(_&&typeof _!="function"&&v<h){let S=Buffer.isBuffer(_)?_:typeof _=="string"?Buffer.from(_):null;S&&S.length&&(y.push(S),v+=S.length);}}catch{}},R=c.write.bind(c),O=c.end.bind(c);return c.write=function(_,...S){return k(_),R(_,...S)},c.end=function(_,...S){return k(_),O(_,...S)},c.on("finish",()=>{l.setAttribute("http.status_code",c.statusCode);try{let _=c.getHeaders();_&&Object.keys(_).length&&l.setAttribute("http.response.headers",JSON.stringify(w(_)));}catch{}if(y.length)try{let _=Buffer.concat(y).subarray(0,h).toString("utf-8");_&&l.setAttribute("http.response.body",_);}catch{}l.setStatus({code:c.statusCode>=400?SpanStatusCode.ERROR:SpanStatusCode.OK}),l.end();}),c.on("error",_=>{l.setAttribute("error.message",_.message),l.setStatus({code:SpanStatusCode.ERROR,message:_.message}),l.end();}),context.with(g,()=>n.call(this,r,...s))}o.__evalkit_server=true,t.Server.prototype.emit=o;}function Ho(e){let t=e.split("-");if(t.length<4)return context.active();let[,n,o,r]=t;if(!n||!o)return context.active();try{let s={traceId:n,spanId:o,isRemote:!0,traceFlags:parseInt(r??"01",16)};return trace.setSpanContext(context.active(),s)}catch{return context.active()}}function Ne(){if(typeof globalThis.fetch!="function"||globalThis.fetch.__evalkit)return;let e=globalThis.fetch.bind(globalThis);globalThis.fetch=async function(n,o){let r=typeof n=="string"?n:n instanceof URL?n.href:n.url;if(Bt(r))return e(n,o);let s=trace.getActiveSpan();if(!s?.isRecording())return e(n,o);let i=(o?.method??"GET").toUpperCase(),c=r;try{c=new URL(r).pathname;}catch{}let a={};o?.headers&&new Headers(o.headers).forEach((f,h)=>{a[h]=f;});let p=w(a),u=s.spanContext(),m=`00-${u.traceId}-${u.spanId}-01`,d=new Headers(o?.headers);d.set("traceparent",m);let l={...o,headers:d};Object.keys(p).length&&s.addEvent("http.fetch.request",{"http.method":i,"http.url":r,"http.request.headers":JSON.stringify(p)});try{let g=await e(n,l),f={};return g.headers.forEach((h,y)=>{f[y]=h;}),s.addEvent("http.fetch.response",{"http.url":r,"http.status_code":g.status,"http.response.headers":JSON.stringify(w(f))}),g}catch(g){throw s.addEvent("http.fetch.error",{"http.url":r,"error.message":g?.message??String(g),"error.stack":g?.stack??""}),g}},globalThis.fetch.__evalkit=true;}var Go,je=b(()=>{Tt();At();Go=[/\/v1\/ingest/,/\/health(z)?$/,/169\.254\./,/metadata\.google/,/storage\.googleapis/];});function Ge(e){if(console.__evalkit)return;let t=console.log.bind(console),n=console.warn.bind(console),o=console.error.bind(console),r=i=>i.map(c=>{if(typeof c=="string")return c;if(c instanceof Error)return `${c.message}
12
+ ${c.stack??""}`;try{return JSON.stringify(c)}catch{return String(c)}}).join(" ").slice(0,2e3),s=(i,c)=>{let a=trace.getActiveSpan();if(a?.isRecording())a.addEvent(`log.${i}`,{"log.level":i,"log.message":c});else {let p=e.tracer.startSpan(`log.${i}`,{kind:SpanKind.INTERNAL,attributes:{"evalkit.span_type":"log","log.level":i,"log.message":c}},context.active());p.setStatus({code:i==="ERROR"?SpanStatusCode.ERROR:SpanStatusCode.OK}),p.end();}};console.log=(...i)=>{t(...i),s("INFO",r(i));},console.warn=(...i)=>{n(...i),s("WARN",r(i));},console.error=(...i)=>{o(...i),s("ERROR",r(i));},console.__evalkit=true;}var Ue=b(()=>{});function Be(){typeof process>"u"||(process.on("unhandledRejection",e=>{let t=trace.getActiveSpan();if(!t?.isRecording())return;let n=e instanceof Error?e.message:String(e),o=e instanceof Error?e.stack??"":"";t.addEvent("error.unhandled_rejection",{"error.message":n,"error.stack":o,"log.level":"ERROR","log.message":`UnhandledRejection: ${n}`}),t.setStatus({code:SpanStatusCode.ERROR,message:n});}),process.on("uncaughtException",e=>{let t=trace.getActiveSpan();t?.isRecording()&&(t.addEvent("error.uncaught_exception",{"error.message":e.message,"error.stack":e.stack??"","log.level":"ERROR","log.message":`UncaughtException: ${e.message}`}),t.setStatus({code:SpanStatusCode.ERROR,message:e.message}));}));}var Ve=b(()=>{});function Fo(e){let t=j("mongoose");t&&ft(e,t);}function Do(e){let t=j("axios");t&&X(e,t.default??t);}async function Jo(e){try{let n=k()("pg"),o=n.Client??n.default?.Client;if(o){Y(e,o);return}}catch{}try{let t=await i("pg"),n=t.Client??t.default?.Client;n&&Y(e,n);}catch{}}async function zo(e){try{let t=k(),n=t("mysql2"),o=n.Connection??n.default?.Connection??t("mysql2/lib/connection");if(o){Z(e,o);return}}catch{}try{let t=await i("mysql2"),n=t.Connection??t.default?.Connection;n&&Z(e,n);}catch{}}async function Wo(e){try{let n=k()("ioredis"),o=n.default??n.Redis??n;if(o?.prototype){Q(e,o);return}}catch{}try{let t=await i("ioredis"),n=t.default??t.Redis??t;n?.prototype&&Q(e,n);}catch{}}async function Qo(e){try{let n=k()("openai"),r=(n.default??n.OpenAI??n)?.Chat?.Completions?.prototype;if(r){K(e,r);return}}catch{}try{let t=await i("openai"),o=(t.default??t.OpenAI??t)?.Chat?.Completions?.prototype;o&&K(e,o);}catch{}}async function Xo(e){try{let n=k()("@anthropic-ai/sdk"),r=(n.default??n.Anthropic??n)?.Messages?.prototype;if(r){P(e,r);return}}catch{}try{let t=await i("@anthropic-ai/sdk"),o=(t.default??t.Anthropic??t)?.Messages?.prototype;o&&P(e,o);}catch{}}async function Yo(e){try{let n=k()("@aws-sdk/client-bedrock-runtime"),r=(n.BedrockRuntimeClient??n.default?.BedrockRuntimeClient)?.prototype;if(r){tt(e,r);return}}catch{}try{let t=await i("@aws-sdk/client-bedrock-runtime"),o=(t.BedrockRuntimeClient??t.default?.BedrockRuntimeClient)?.prototype;o&&tt(e,o);}catch{}}async function Zo(e){try{let n=k()("@anthropic-ai/sdk"),r=(n.AnthropicVertex??n.default?.AnthropicVertex)?.Messages?.prototype;if(r){at(e,r);return}}catch{}try{let t=await i("@anthropic-ai/sdk"),o=(t.AnthropicVertex??t.default?.AnthropicVertex)?.Messages?.prototype;o&&at(e,o);}catch{}}async function tr(e){try{let n=k()("@google-cloud/vertexai"),r=(n.GenerativeModel??n.default?.GenerativeModel)?.prototype;if(r){it(e,r);return}}catch{}try{let t=await i("@google-cloud/vertexai"),o=(t.GenerativeModel??t.default?.GenerativeModel)?.prototype;o&&it(e,o);}catch{}}async function er(e){try{let n=k()("cohere-ai"),r=(n.CohereClient??n.default?.CohereClient??n.default)?.prototype;if(r){et(e,r);return}}catch{}try{let t=await i("cohere-ai"),o=(t.CohereClient??t.default?.CohereClient??t.default)?.prototype;o&&et(e,o);}catch{}}async function nr(e){try{let n=k()("@google/generative-ai"),r=(n.GenerativeModel??n.default?.GenerativeModel)?.prototype;if(r){nt(e,r);return}}catch{}try{let t=await i("@google/generative-ai"),o=(t.GenerativeModel??t.default?.GenerativeModel)?.prototype;o&&nt(e,o);}catch{}}async function or(e){try{let n=k()("@google/genai"),o=n.Models??n.default?.Models;if(o?.prototype){st(e,o.prototype);return}}catch{}try{let t=await i("@google/genai"),n=t.Models??t.default?.Models;n?.prototype&&st(e,n.prototype);}catch{}}async function rr(e){try{let n=k()("groq-sdk"),r=(n.default??n.Groq??n)?.Chat?.Completions?.prototype;if(r){K(e,r,void 0,"groq");return}}catch{}try{let t=await i("groq-sdk"),o=(t.default??t.Groq??t)?.Chat?.Completions?.prototype;o&&K(e,o,void 0,"groq");}catch{}}async function sr(e){try{let{patchLangChain:t}=await import('./langchain-QDMKUXBO.mjs');await t(e);}catch{}}function Fe(e){try{qe(e);}catch{}try{Me(e);}catch{}Ne(),Ge(e),Be(),Fo(e),Do(e),Promise.all([Qo(e),Xo(e),Yo(e),Zo(e),tr(e),er(e),nr(e),or(e),rr(e),sr(e),Jo(e),zo(e),Wo(e)]).catch(()=>{});}var De=b(()=>{l();bt();gt();Mt();Ht();qt();Nt();Ut();wt();Kt();Pt();Ot();It();je();Ue();Ve();});var Ft={};c(Ft,{EvalKitClient:()=>U,EvalKitInterceptor:()=>B,TraceMethod:()=>xn,Traced:()=>Cn,createNestjsInterceptor:()=>gn,currentTraceId:()=>Rn,default:()=>pr,evaluate:()=>$,expressMiddleware:()=>pn,fastifyPlugin:()=>ln,flush:()=>yn,generateScenarios:()=>Sn,hapiPlugin:()=>mn,honoMiddleware:()=>dn,init:()=>Je,koaMiddleware:()=>un,langchainHandler:()=>nn,patchAnthropicClient:()=>We,patchAnthropicVertexClient:()=>Xe,patchAxiosClient:()=>sn,patchBedrockClient:()=>Qe,patchCohereClient:()=>Ze,patchGoogleAIModel:()=>tn,patchGoogleGenAIModels:()=>en,patchMongooseClient:()=>on,patchMysql2Client:()=>cn,patchOpenAIClient:()=>ze,patchPgClient:()=>an,patchRedisClient:()=>rn,patchVertexGenerativeModel:()=>Ye,simulateUser:()=>bn,startHttpTrace:()=>hn,startSpan:()=>vn,startTrace:()=>fn,traceFunction:()=>_n,withTrace:()=>kn});function C(){if(!q)throw new Error("[evalkit] call evalkit.init() before using the SDK");return q}function Je(e){return q&&q.destroy(),q=new U(e),Fe(q),q}function ze(e,t){K(C(),e.chat.completions,t);}function We(e,t){P(C(),e.messages,t);}function Qe(e){tt(C(),e);}function Xe(e){at(C(),e.messages);}function Ye(e){it(C(),e);}function Ze(e){et(C(),e);}function tn(e){nt(C(),e);}function en(e){st(C(),e);}function nn(){return n(C())}function on(e){ft(C(),e);}function rn(e){Q(C(),e);}function sn(e){X(C(),e);}function an(e){Y(C(),e);}function cn(e){Z(C(),e);}function pn(e){return ke(C(),e)}function ln(e){return _e(C(),e,cr)}function un(e){return be(C(),e)}function dn(e){return Oe(C(),e)}function mn(e){return Ae(C(),e)}function gn(){return new B(C())}function fn(e,t){return C().startTrace(e,t)}async function yn(){return C().flush()}function hn(e,t,n){return C().startHttpTrace(e,t,n)}function vn(e,t,n){return C().startSpan(e,t,n)}function _n(e,t,n,o=true){return C().traceFunction(e,t,n,o)}function xn(e){return (t,n,o)=>{let r=o.value,s=e??`${t.constructor?.name??"unknown"}.${String(n)}`,i;return o.value=function(...c){return i||(i=C().traceFunction(s,r)),i.apply(this,c)},o}}function Cn(e){return t=>{let n=t.prototype,o=e?.prefix??t.name;for(let r of Object.getOwnPropertyNames(n)){if(r==="constructor")continue;let s=Object.getOwnPropertyDescriptor(n,r);if(!s||typeof s.value!="function")continue;let i=s.value,c=`${o}.${r}`,a=null;Object.defineProperty(n,r,{...s,value:function(...p){return a||(a=C().traceFunction(c,i)),a.apply(this,p)}});}return t}}function kn(e,t){return context.with(e,t)}function Rn(){let e=trace.getActiveSpan();return e?.isRecording()?e.spanContext().traceId:void 0}function Sn(e){return zt(C(),e)}function bn(e){return Wt(C(),e)}function cr(e){return T(e)}var q,pr,Dt=b(()=>{lt();Qt();Rt();H();bt();gt();wt();Ot();It();Kt();Pt();Mt();qt();Nt();Ut();p();Ht();xe();Re();Ee();Te();Ie();Lt();De();Rt();Lt();lt();q=null;pr={init:Je,evaluate:$,generateScenarios:Sn,simulateUser:bn,patchOpenAIClient:ze,patchAnthropicClient:We,patchBedrockClient:Qe,patchAnthropicVertexClient:Xe,patchVertexGenerativeModel:Ye,patchCohereClient:Ze,patchGoogleAIModel:tn,patchGoogleGenAIModels:en,langchainHandler:nn,patchMongooseClient:on,patchRedisClient:rn,patchAxiosClient:sn,patchPgClient:an,patchMysql2Client:cn,expressMiddleware:pn,fastifyPlugin:ln,koaMiddleware:un,honoMiddleware:dn,hapiPlugin:mn,createNestjsInterceptor:gn,startTrace:fn,startHttpTrace:hn,startSpan:vn,traceFunction:_n,TraceMethod:xn,Traced:Cn,withTrace:kn,currentTraceId:Rn,flush:yn};});Dt();export{U as EvalKitClient,B as EvalKitInterceptor,xn as TraceMethod,Cn as Traced,gn as createNestjsInterceptor,Rn as currentTraceId,pr as default,$ as evaluate,pn as expressMiddleware,ln as fastifyPlugin,yn as flush,Sn as generateScenarios,mn as hapiPlugin,dn as honoMiddleware,Je as init,un as koaMiddleware,nn as langchainHandler,We as patchAnthropicClient,Xe as patchAnthropicVertexClient,sn as patchAxiosClient,Qe as patchBedrockClient,Ze as patchCohereClient,tn as patchGoogleAIModel,en as patchGoogleGenAIModels,on as patchMongooseClient,cn as patchMysql2Client,ze as patchOpenAIClient,an as patchPgClient,rn as patchRedisClient,Ye as patchVertexGenerativeModel,bn as simulateUser,hn as startHttpTrace,vn as startSpan,fn as startTrace,_n as traceFunction,kn as withTrace};
@@ -0,0 +1 @@
1
+ import {p}from'./chunk-OVOA54JW.mjs';export{n as langchainCallbackHandler,m as langchainHandlerMethods,o as patchLangChain}from'./chunk-OVOA54JW.mjs';p();
package/package.json ADDED
@@ -0,0 +1,79 @@
1
+ {
2
+ "name": "syntropylabs-evalkit",
3
+ "version": "0.1.17",
4
+ "description": "EvalKit TypeScript SDK — OpenTelemetry-based LLM observability and tracing",
5
+ "license": "LicenseRef-Proprietary",
6
+ "author": "Syntropy Labs",
7
+ "homepage": "https://syntropylabs.ai",
8
+ "repository": {
9
+ "type": "git",
10
+ "url": "git+https://github.com/Syntropylabs-ai/evalkit_sdk_ts.git"
11
+ },
12
+ "bugs": {
13
+ "url": "https://github.com/Syntropylabs-ai/evalkit_sdk_ts/issues"
14
+ },
15
+ "keywords": [
16
+ "llm",
17
+ "observability",
18
+ "tracing",
19
+ "evaluation",
20
+ "opentelemetry",
21
+ "otel",
22
+ "openai",
23
+ "anthropic",
24
+ "ai",
25
+ "agents"
26
+ ],
27
+ "main": "./dist/index.js",
28
+ "module": "./dist/index.mjs",
29
+ "types": "./dist/index.d.ts",
30
+ "exports": {
31
+ ".": {
32
+ "types": "./dist/index.d.ts",
33
+ "import": "./dist/index.mjs",
34
+ "require": "./dist/index.js"
35
+ }
36
+ },
37
+ "files": [
38
+ "dist",
39
+ "README.md",
40
+ "LICENSE"
41
+ ],
42
+ "engines": {
43
+ "node": ">=18"
44
+ },
45
+ "publishConfig": {
46
+ "access": "public"
47
+ },
48
+ "scripts": {
49
+ "build": "tsup src/index.ts --format cjs,esm --dts --clean --minify --treeshake --no-sourcemap",
50
+ "dev": "tsup src/index.ts --format cjs,esm --dts --watch",
51
+ "typecheck": "tsc --noEmit",
52
+ "prepublishOnly": "npm run build"
53
+ },
54
+ "dependencies": {
55
+ "@opentelemetry/api": "^1.9.0",
56
+ "@opentelemetry/resources": "^1.30.1",
57
+ "@opentelemetry/sdk-trace-base": "^1.30.1",
58
+ "@opentelemetry/sdk-trace-node": "^1.30.1",
59
+ "@opentelemetry/semantic-conventions": "^1.28.0"
60
+ },
61
+ "peerDependencies": {
62
+ "@anthropic-ai/sdk": ">=0.20.0",
63
+ "openai": ">=4.0.0"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "openai": {
67
+ "optional": true
68
+ },
69
+ "@anthropic-ai/sdk": {
70
+ "optional": true
71
+ }
72
+ },
73
+ "devDependencies": {
74
+ "@anthropic-ai/sdk": "^0.39.0",
75
+ "openai": "^4.98.0",
76
+ "tsup": "^8.0.0",
77
+ "typescript": "^5.4.0"
78
+ }
79
+ }