@agentuity/runtime 0.0.43 → 0.0.45
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/AGENTS.md +11 -9
- package/README.md +4 -4
- package/dist/_context.d.ts +12 -4
- package/dist/_context.d.ts.map +1 -1
- package/dist/_server.d.ts +7 -4
- package/dist/_server.d.ts.map +1 -1
- package/dist/_services.d.ts +13 -2
- package/dist/_services.d.ts.map +1 -1
- package/dist/_util.d.ts +1 -1
- package/dist/_util.d.ts.map +1 -1
- package/dist/_waituntil.d.ts +1 -3
- package/dist/_waituntil.d.ts.map +1 -1
- package/dist/agent.d.ts +41 -14
- package/dist/agent.d.ts.map +1 -1
- package/dist/app.d.ts +90 -8
- package/dist/app.d.ts.map +1 -1
- package/dist/eval.d.ts +79 -0
- package/dist/eval.d.ts.map +1 -0
- package/dist/index.d.ts +6 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/io/email.d.ts +77 -0
- package/dist/io/email.d.ts.map +1 -0
- package/dist/logger/console.d.ts +7 -1
- package/dist/logger/console.d.ts.map +1 -1
- package/dist/logger/user.d.ts.map +1 -1
- package/dist/otel/config.d.ts +3 -1
- package/dist/otel/config.d.ts.map +1 -1
- package/dist/otel/console.d.ts +2 -1
- package/dist/otel/console.d.ts.map +1 -1
- package/dist/otel/exporters/index.d.ts +4 -0
- package/dist/otel/exporters/index.d.ts.map +1 -0
- package/dist/otel/exporters/jsonl-log-exporter.d.ts +36 -0
- package/dist/otel/exporters/jsonl-log-exporter.d.ts.map +1 -0
- package/dist/otel/exporters/jsonl-metric-exporter.d.ts +40 -0
- package/dist/otel/exporters/jsonl-metric-exporter.d.ts.map +1 -0
- package/dist/otel/exporters/jsonl-trace-exporter.d.ts +36 -0
- package/dist/otel/exporters/jsonl-trace-exporter.d.ts.map +1 -0
- package/dist/otel/http.d.ts.map +1 -1
- package/dist/otel/logger.d.ts +8 -6
- package/dist/otel/logger.d.ts.map +1 -1
- package/dist/otel/otel.d.ts +8 -2
- package/dist/otel/otel.d.ts.map +1 -1
- package/dist/router.d.ts +4 -1
- package/dist/router.d.ts.map +1 -1
- package/dist/services/evalrun/composite.d.ts +21 -0
- package/dist/services/evalrun/composite.d.ts.map +1 -0
- package/dist/services/evalrun/http.d.ts +24 -0
- package/dist/services/evalrun/http.d.ts.map +1 -0
- package/dist/services/evalrun/index.d.ts +5 -0
- package/dist/services/evalrun/index.d.ts.map +1 -0
- package/dist/services/evalrun/json.d.ts +21 -0
- package/dist/services/evalrun/json.d.ts.map +1 -0
- package/dist/services/evalrun/local.d.ts +19 -0
- package/dist/services/evalrun/local.d.ts.map +1 -0
- package/dist/services/local/_db.d.ts +4 -0
- package/dist/services/local/_db.d.ts.map +1 -0
- package/dist/services/local/_router.d.ts +3 -0
- package/dist/services/local/_router.d.ts.map +1 -0
- package/dist/services/local/_util.d.ts +18 -0
- package/dist/services/local/_util.d.ts.map +1 -0
- package/dist/services/local/index.d.ts +8 -0
- package/dist/services/local/index.d.ts.map +1 -0
- package/dist/services/local/keyvalue.d.ts +10 -0
- package/dist/services/local/keyvalue.d.ts.map +1 -0
- package/dist/services/local/objectstore.d.ts +11 -0
- package/dist/services/local/objectstore.d.ts.map +1 -0
- package/dist/services/local/stream.d.ts +10 -0
- package/dist/services/local/stream.d.ts.map +1 -0
- package/dist/services/local/vector.d.ts +13 -0
- package/dist/services/local/vector.d.ts.map +1 -0
- package/dist/services/session/composite.d.ts +21 -0
- package/dist/services/session/composite.d.ts.map +1 -0
- package/dist/services/session/http.d.ts +23 -0
- package/dist/services/session/http.d.ts.map +1 -0
- package/dist/services/session/index.d.ts +5 -0
- package/dist/services/session/index.d.ts.map +1 -0
- package/dist/services/session/json.d.ts +22 -0
- package/dist/services/session/json.d.ts.map +1 -0
- package/dist/services/session/local.d.ts +19 -0
- package/dist/services/session/local.d.ts.map +1 -0
- package/dist/session.d.ts +70 -0
- package/dist/session.d.ts.map +1 -0
- package/package.json +10 -6
- package/src/_config.ts +1 -1
- package/src/_context.ts +19 -16
- package/src/_server.ts +284 -42
- package/src/_services.ts +147 -34
- package/src/_util.ts +2 -3
- package/src/_waituntil.ts +5 -153
- package/src/agent.ts +667 -65
- package/src/app.ts +159 -13
- package/src/eval.ts +95 -0
- package/src/index.ts +6 -1
- package/src/io/email.ts +173 -0
- package/src/logger/console.ts +196 -17
- package/src/logger/user.ts +7 -3
- package/src/otel/config.ts +7 -44
- package/src/otel/console.ts +8 -4
- package/src/otel/exporters/README.md +217 -0
- package/src/otel/exporters/index.ts +3 -0
- package/src/otel/exporters/jsonl-log-exporter.ts +113 -0
- package/src/otel/exporters/jsonl-metric-exporter.ts +120 -0
- package/src/otel/exporters/jsonl-trace-exporter.ts +121 -0
- package/src/otel/http.ts +3 -1
- package/src/otel/logger.ts +87 -37
- package/src/otel/otel.ts +43 -22
- package/src/router.ts +44 -4
- package/src/services/evalrun/composite.ts +34 -0
- package/src/services/evalrun/http.ts +112 -0
- package/src/services/evalrun/index.ts +4 -0
- package/src/services/evalrun/json.ts +46 -0
- package/src/services/evalrun/local.ts +28 -0
- package/src/services/local/README.md +1576 -0
- package/src/services/local/_db.ts +182 -0
- package/src/services/local/_router.ts +86 -0
- package/src/services/local/_util.ts +49 -0
- package/src/services/local/index.ts +7 -0
- package/src/services/local/keyvalue.ts +118 -0
- package/src/services/local/objectstore.ts +152 -0
- package/src/services/local/stream.ts +296 -0
- package/src/services/local/vector.ts +264 -0
- package/src/services/session/composite.ts +33 -0
- package/src/services/session/http.ts +64 -0
- package/src/services/session/index.ts +4 -0
- package/src/services/session/json.ts +42 -0
- package/src/services/session/local.ts +28 -0
- package/src/session.ts +284 -0
- package/dist/_unauthenticated.d.ts +0 -26
- package/dist/_unauthenticated.d.ts.map +0 -1
- package/src/_unauthenticated.ts +0 -126
package/src/otel/otel.ts
CHANGED
|
@@ -28,7 +28,9 @@ import type { Logger } from '../logger';
|
|
|
28
28
|
import { ConsoleLogRecordExporter } from './console';
|
|
29
29
|
import { instrumentFetch } from './fetch';
|
|
30
30
|
import { createLogger, patchConsole } from './logger';
|
|
31
|
-
import { getSDKVersion } from '../_config';
|
|
31
|
+
import { getSDKVersion, isAuthenticated } from '../_config';
|
|
32
|
+
import type { LogLevel } from '@agentuity/core';
|
|
33
|
+
import { JSONLLogExporter, JSONLTraceExporter, JSONLMetricExporter } from './exporters';
|
|
32
34
|
|
|
33
35
|
/**
|
|
34
36
|
* Configuration for OpenTelemetry initialization
|
|
@@ -45,6 +47,8 @@ export interface OtelConfig {
|
|
|
45
47
|
cliVersion?: string;
|
|
46
48
|
devmode?: boolean;
|
|
47
49
|
spanProcessors?: Array<SpanProcessor>;
|
|
50
|
+
logLevel?: LogLevel;
|
|
51
|
+
jsonlBasePath?: string;
|
|
48
52
|
}
|
|
49
53
|
|
|
50
54
|
/**
|
|
@@ -83,24 +87,33 @@ export const createAgentuityLoggerProvider = ({
|
|
|
83
87
|
url,
|
|
84
88
|
headers,
|
|
85
89
|
resource,
|
|
90
|
+
logLevel,
|
|
91
|
+
jsonlBasePath,
|
|
86
92
|
}: {
|
|
87
93
|
url?: string;
|
|
88
94
|
headers?: Record<string, string>;
|
|
89
95
|
resource: Resource;
|
|
96
|
+
logLevel: LogLevel;
|
|
97
|
+
jsonlBasePath?: string;
|
|
90
98
|
}) => {
|
|
91
99
|
let processor: LogRecordProcessor;
|
|
92
|
-
let exporter: OTLPLogExporter | undefined;
|
|
100
|
+
let exporter: OTLPLogExporter | JSONLLogExporter | undefined;
|
|
93
101
|
|
|
94
|
-
if (
|
|
95
|
-
exporter = new
|
|
102
|
+
if (jsonlBasePath) {
|
|
103
|
+
exporter = new JSONLLogExporter(jsonlBasePath);
|
|
104
|
+
processor = new BatchLogRecordProcessor(exporter);
|
|
105
|
+
} else if (url) {
|
|
106
|
+
// Original OTLP export behavior
|
|
107
|
+
const otlpExporter = new OTLPLogExporter({
|
|
96
108
|
url: `${url}/v1/logs`,
|
|
97
109
|
headers,
|
|
98
110
|
compression: CompressionAlgorithm.GZIP,
|
|
99
111
|
timeoutMillis: 10_000,
|
|
100
112
|
});
|
|
101
|
-
|
|
113
|
+
exporter = otlpExporter;
|
|
114
|
+
processor = new BatchLogRecordProcessor(otlpExporter);
|
|
102
115
|
} else {
|
|
103
|
-
processor = new SimpleLogRecordProcessor(new ConsoleLogRecordExporter());
|
|
116
|
+
processor = new SimpleLogRecordProcessor(new ConsoleLogRecordExporter(logLevel));
|
|
104
117
|
}
|
|
105
118
|
const provider = new LoggerProvider({
|
|
106
119
|
resource,
|
|
@@ -159,6 +172,8 @@ export function registerOtel(config: OtelConfig): OtelResponse {
|
|
|
159
172
|
projectId,
|
|
160
173
|
deploymentId,
|
|
161
174
|
devmode = false,
|
|
175
|
+
logLevel = 'warn',
|
|
176
|
+
jsonlBasePath = undefined,
|
|
162
177
|
} = config;
|
|
163
178
|
|
|
164
179
|
let headers: Record<string, string> | undefined;
|
|
@@ -173,6 +188,8 @@ export function registerOtel(config: OtelConfig): OtelResponse {
|
|
|
173
188
|
url,
|
|
174
189
|
headers,
|
|
175
190
|
resource,
|
|
191
|
+
logLevel,
|
|
192
|
+
jsonlBasePath,
|
|
176
193
|
});
|
|
177
194
|
const attrs = {
|
|
178
195
|
'@agentuity/orgId': orgId ?? 'unknown',
|
|
@@ -182,25 +199,29 @@ export function registerOtel(config: OtelConfig): OtelResponse {
|
|
|
182
199
|
'@agentuity/devmode': devmode,
|
|
183
200
|
'@agentuity/language': 'javascript',
|
|
184
201
|
};
|
|
185
|
-
const logger = createLogger(!!url, attrs);
|
|
202
|
+
const logger = createLogger(!!url, attrs, logLevel);
|
|
186
203
|
|
|
187
204
|
// must do this after we have created the logger
|
|
188
|
-
patchConsole(!!url, attrs);
|
|
205
|
+
patchConsole(!!url, attrs, logLevel);
|
|
189
206
|
|
|
190
207
|
const traceExporter = url
|
|
191
|
-
?
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
208
|
+
? jsonlBasePath
|
|
209
|
+
? new JSONLTraceExporter(jsonlBasePath)
|
|
210
|
+
: new OTLPTraceExporter({
|
|
211
|
+
url: `${url}/v1/traces`,
|
|
212
|
+
headers,
|
|
213
|
+
keepAlive: true,
|
|
214
|
+
})
|
|
196
215
|
: undefined;
|
|
197
216
|
|
|
198
217
|
const metricExporter = url
|
|
199
|
-
?
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
218
|
+
? jsonlBasePath
|
|
219
|
+
? new JSONLMetricExporter(jsonlBasePath)
|
|
220
|
+
: new OTLPMetricExporter({
|
|
221
|
+
url: `${url}/v1/metrics`,
|
|
222
|
+
headers,
|
|
223
|
+
keepAlive: true,
|
|
224
|
+
})
|
|
204
225
|
: undefined;
|
|
205
226
|
|
|
206
227
|
// Create a separate metric reader for the NodeSDK
|
|
@@ -260,8 +281,8 @@ export function registerOtel(config: OtelConfig): OtelResponse {
|
|
|
260
281
|
|
|
261
282
|
try {
|
|
262
283
|
const projectName = config.projectId || '';
|
|
263
|
-
const
|
|
264
|
-
const appName = `${
|
|
284
|
+
const orgId = config.orgId || '';
|
|
285
|
+
const appName = `${orgId}:${projectName}`;
|
|
265
286
|
|
|
266
287
|
const traceloopHeaders: Record<string, string> = {};
|
|
267
288
|
if (bearerToken) {
|
|
@@ -278,7 +299,7 @@ export function registerOtel(config: OtelConfig): OtelResponse {
|
|
|
278
299
|
// Note: JavaScript SDK doesn't support resourceAttributes like Python
|
|
279
300
|
});
|
|
280
301
|
logger.debug(`Telemetry initialized with app_name: ${appName}`);
|
|
281
|
-
logger.
|
|
302
|
+
logger.debug('Telemetry configured successfully');
|
|
282
303
|
} catch (error) {
|
|
283
304
|
logger.warn('Telemetry not available, skipping automatic instrumentation', {
|
|
284
305
|
error: error instanceof Error ? error.message : String(error),
|
|
@@ -309,7 +330,7 @@ export function registerOtel(config: OtelConfig): OtelResponse {
|
|
|
309
330
|
}
|
|
310
331
|
};
|
|
311
332
|
|
|
312
|
-
if (url) {
|
|
333
|
+
if (url && isAuthenticated()) {
|
|
313
334
|
logger.debug('connected to Agentuity Agent Cloud');
|
|
314
335
|
}
|
|
315
336
|
|
package/src/router.ts
CHANGED
|
@@ -6,11 +6,17 @@ import { upgradeWebSocket as honoUpgradeWebSocket } from 'hono/bun';
|
|
|
6
6
|
import { hash, returnResponse } from './_util';
|
|
7
7
|
import type { Env } from './app';
|
|
8
8
|
import { getAsyncLocalStorage } from './_context';
|
|
9
|
+
import { parseEmail, type Email } from './io/email';
|
|
9
10
|
|
|
10
11
|
type AgentHandler<E extends Env = Env, P extends string = string, I extends Input = {}> = (
|
|
11
12
|
c: Context<E, P, I>
|
|
12
13
|
) => any | Promise<any>;
|
|
13
14
|
|
|
15
|
+
type EmailHandler<E extends Env = Env, P extends string = string, I extends Input = {}> = (
|
|
16
|
+
email: Email,
|
|
17
|
+
c: Context<E, P, I>
|
|
18
|
+
) => any | Promise<any>;
|
|
19
|
+
|
|
14
20
|
type StreamHandler<E extends Env = Env, P extends string = string, I extends Input = {}> = (
|
|
15
21
|
c: Context<E, P, I>
|
|
16
22
|
) => ReadableStream<any> | Promise<ReadableStream<any>>;
|
|
@@ -48,7 +54,12 @@ type ExtendedHono<E extends Env = Env, S extends Schema = {}> = {
|
|
|
48
54
|
): Hono<E, S>;
|
|
49
55
|
};
|
|
50
56
|
} & {
|
|
51
|
-
email(address: string, handler:
|
|
57
|
+
email(address: string, handler: EmailHandler): Hono<E, S>;
|
|
58
|
+
email<I extends Input = {}>(
|
|
59
|
+
address: string,
|
|
60
|
+
middleware: MiddlewareHandler<E, string, I>,
|
|
61
|
+
handler: EmailHandler<E, string, I>
|
|
62
|
+
): Hono<E, S>;
|
|
52
63
|
sms(params: { number: string }, handler: AgentHandler): Hono<E, S>;
|
|
53
64
|
cron(schedule: string, handler: AgentHandler): Hono<E, S>;
|
|
54
65
|
stream<P extends string = string>(path: P, handler: StreamHandler<E, P>): Hono<E, S>;
|
|
@@ -119,16 +130,45 @@ export const createRouter = <E extends Env = Env, S extends Schema = Schema>():
|
|
|
119
130
|
}
|
|
120
131
|
|
|
121
132
|
// shim in special routes
|
|
122
|
-
_router.email = (address: string,
|
|
133
|
+
_router.email = (address: string, ...args: any[]) => {
|
|
134
|
+
let middleware: MiddlewareHandler | undefined;
|
|
135
|
+
let handler: EmailHandler;
|
|
136
|
+
|
|
137
|
+
if (args.length === 1) {
|
|
138
|
+
handler = args[0];
|
|
139
|
+
} else {
|
|
140
|
+
middleware = args[0];
|
|
141
|
+
handler = args[1];
|
|
142
|
+
}
|
|
143
|
+
|
|
123
144
|
const id = hash(address);
|
|
124
145
|
const path = `/${id}`;
|
|
125
146
|
// registerEmailHandler(address)
|
|
126
147
|
const wrapper = async (c: Context): Promise<Response> => {
|
|
127
|
-
|
|
148
|
+
const contentType = (c.req.header('content-type') || '').trim().toLowerCase();
|
|
149
|
+
if (!contentType.includes('message/rfc822')) {
|
|
150
|
+
return c.text('Bad Request: Content-Type must be message/rfc822', 400);
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
const arrayBuffer = await c.req.arrayBuffer();
|
|
154
|
+
const buffer = Buffer.from(arrayBuffer);
|
|
155
|
+
|
|
156
|
+
const email = await parseEmail(buffer);
|
|
157
|
+
|
|
158
|
+
let result = handler(email, c);
|
|
128
159
|
if (result instanceof Promise) result = await result;
|
|
160
|
+
|
|
161
|
+
if (result === undefined) {
|
|
162
|
+
return c.text('OK', 200);
|
|
163
|
+
}
|
|
129
164
|
return returnResponse(c, result);
|
|
130
165
|
};
|
|
131
|
-
|
|
166
|
+
|
|
167
|
+
if (middleware) {
|
|
168
|
+
return router.post(path, middleware, wrapper);
|
|
169
|
+
} else {
|
|
170
|
+
return router.post(path, wrapper);
|
|
171
|
+
}
|
|
132
172
|
};
|
|
133
173
|
|
|
134
174
|
_router.sms = ({ number }: { number: string }, handler: AgentHandler) => {
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type EvalRunEventProvider,
|
|
3
|
+
type EvalRunStartEvent,
|
|
4
|
+
type EvalRunCompleteEvent,
|
|
5
|
+
} from '@agentuity/core';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* An implementation of the EvalRunEventProvider which wraps multiple providers
|
|
9
|
+
*/
|
|
10
|
+
export class CompositeEvalRunEventProvider implements EvalRunEventProvider {
|
|
11
|
+
private providers: EvalRunEventProvider[];
|
|
12
|
+
|
|
13
|
+
constructor(...providers: EvalRunEventProvider[]) {
|
|
14
|
+
this.providers = providers;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* called when the eval run starts
|
|
19
|
+
*
|
|
20
|
+
* @param event EvalRunStartEvent
|
|
21
|
+
*/
|
|
22
|
+
async start(event: EvalRunStartEvent): Promise<void> {
|
|
23
|
+
await Promise.allSettled(this.providers.map((provider) => provider.start(event)));
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* called when the eval run completes
|
|
28
|
+
*
|
|
29
|
+
* @param event EvalRunCompleteEvent
|
|
30
|
+
*/
|
|
31
|
+
async complete(event: EvalRunCompleteEvent): Promise<void> {
|
|
32
|
+
await Promise.allSettled(this.providers.map((provider) => provider.complete(event)));
|
|
33
|
+
}
|
|
34
|
+
}
|
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import { APIClient, APIResponseSchemaNoData, ValidationError } from '@agentuity/server';
|
|
2
|
+
import {
|
|
3
|
+
type EvalRunEventProvider,
|
|
4
|
+
type EvalRunStartEvent,
|
|
5
|
+
EvalRunStartEventDelayedSchema,
|
|
6
|
+
EvalRunCompleteEventDelayedSchema,
|
|
7
|
+
type EvalRunCompleteEvent,
|
|
8
|
+
type Logger,
|
|
9
|
+
} from '@agentuity/core';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* An implementation of the EvalRunEventProvider which uses HTTP for delivery
|
|
13
|
+
*/
|
|
14
|
+
export class HTTPEvalRunEventProvider implements EvalRunEventProvider {
|
|
15
|
+
private apiClient: APIClient;
|
|
16
|
+
private logger: Logger;
|
|
17
|
+
private baseUrl: string;
|
|
18
|
+
|
|
19
|
+
constructor(client: APIClient, logger: Logger, baseUrl: string) {
|
|
20
|
+
this.apiClient = client;
|
|
21
|
+
this.logger = logger;
|
|
22
|
+
this.baseUrl = baseUrl;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* called when the eval run starts
|
|
27
|
+
*
|
|
28
|
+
* @param event EvalRunStartEvent
|
|
29
|
+
*/
|
|
30
|
+
async start(event: EvalRunStartEvent): Promise<void> {
|
|
31
|
+
const endpoint = '/evalrun/2025-03-17';
|
|
32
|
+
const fullUrl = `${this.baseUrl}${endpoint}`;
|
|
33
|
+
this.logger.debug('[EVALRUN HTTP] Sending eval run start event: %s', event.id);
|
|
34
|
+
this.logger.debug('[EVALRUN HTTP] URL: %s %s', 'POST', fullUrl);
|
|
35
|
+
this.logger.debug('[EVALRUN HTTP] Base URL: %s', this.baseUrl);
|
|
36
|
+
|
|
37
|
+
const payload = { ...event, timestamp: Date.now() };
|
|
38
|
+
this.logger.debug('[EVALRUN HTTP] Start event payload: %s', JSON.stringify(payload, null, 2));
|
|
39
|
+
|
|
40
|
+
try {
|
|
41
|
+
const resp = await this.apiClient.request(
|
|
42
|
+
'POST',
|
|
43
|
+
endpoint,
|
|
44
|
+
APIResponseSchemaNoData(),
|
|
45
|
+
payload,
|
|
46
|
+
EvalRunStartEventDelayedSchema
|
|
47
|
+
);
|
|
48
|
+
if (resp.success) {
|
|
49
|
+
this.logger.debug('[EVALRUN HTTP] Start event sent successfully: %s', event.id);
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const errorMsg = resp.message || 'Unknown error';
|
|
53
|
+
this.logger.error('[EVALRUN HTTP] Start event failed: %s, error: %s', event.id, errorMsg);
|
|
54
|
+
throw new Error(errorMsg);
|
|
55
|
+
} catch (error) {
|
|
56
|
+
this.logger.error(
|
|
57
|
+
'[EVALRUN HTTP] Start event exception: %s, error: %s',
|
|
58
|
+
event.id,
|
|
59
|
+
error instanceof Error ? error.message : String(error)
|
|
60
|
+
);
|
|
61
|
+
// Log validation errors if available
|
|
62
|
+
if (error instanceof ValidationError) {
|
|
63
|
+
this.logger.error(
|
|
64
|
+
'[EVALRUN HTTP] Validation issues: %s',
|
|
65
|
+
JSON.stringify(error.issues, null, 2)
|
|
66
|
+
);
|
|
67
|
+
}
|
|
68
|
+
throw error;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* called when the eval run completes
|
|
74
|
+
*
|
|
75
|
+
* @param event EvalRunCompleteEvent
|
|
76
|
+
*/
|
|
77
|
+
async complete(event: EvalRunCompleteEvent): Promise<void> {
|
|
78
|
+
const endpoint = '/evalrun/2025-03-17';
|
|
79
|
+
const fullUrl = `${this.baseUrl}${endpoint}`;
|
|
80
|
+
this.logger.debug('[EVALRUN HTTP] Sending eval run complete event: %s', event.id);
|
|
81
|
+
this.logger.debug('[EVALRUN HTTP] URL: %s %s', 'PUT', fullUrl);
|
|
82
|
+
this.logger.debug('[EVALRUN HTTP] Base URL: %s', this.baseUrl);
|
|
83
|
+
|
|
84
|
+
try {
|
|
85
|
+
const resp = await this.apiClient.request(
|
|
86
|
+
'PUT',
|
|
87
|
+
endpoint,
|
|
88
|
+
APIResponseSchemaNoData(),
|
|
89
|
+
{ ...event, timestamp: Date.now() },
|
|
90
|
+
EvalRunCompleteEventDelayedSchema
|
|
91
|
+
);
|
|
92
|
+
if (resp.success) {
|
|
93
|
+
this.logger.debug('[EVALRUN HTTP] Complete event sent successfully: %s', event.id);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
const errorMsg = resp.message || 'Unknown error';
|
|
97
|
+
this.logger.error(
|
|
98
|
+
'[EVALRUN HTTP] Complete event failed: %s, error: %s',
|
|
99
|
+
event.id,
|
|
100
|
+
errorMsg
|
|
101
|
+
);
|
|
102
|
+
throw new Error(errorMsg);
|
|
103
|
+
} catch (error) {
|
|
104
|
+
this.logger.error(
|
|
105
|
+
'[EVALRUN HTTP] Complete event exception: %s, error: %s',
|
|
106
|
+
event.id,
|
|
107
|
+
error instanceof Error ? error.message : String(error)
|
|
108
|
+
);
|
|
109
|
+
throw error;
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type EvalRunEventProvider,
|
|
3
|
+
type EvalRunStartEvent,
|
|
4
|
+
type EvalRunCompleteEvent,
|
|
5
|
+
} from '@agentuity/core';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* An implementation of the EvalRunEventProvider which writes to JSON files
|
|
9
|
+
*/
|
|
10
|
+
export class JSONEvalRunEventProvider implements EvalRunEventProvider {
|
|
11
|
+
private exportDir: string;
|
|
12
|
+
|
|
13
|
+
constructor(exportDir: string) {
|
|
14
|
+
this.exportDir = exportDir;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* called when the eval run starts
|
|
19
|
+
*
|
|
20
|
+
* @param event EvalRunStartEvent
|
|
21
|
+
*/
|
|
22
|
+
async start(event: EvalRunStartEvent): Promise<void> {
|
|
23
|
+
const data = {
|
|
24
|
+
type: 'evalrun_start',
|
|
25
|
+
timestamp: Date.now(),
|
|
26
|
+
...event,
|
|
27
|
+
};
|
|
28
|
+
const filename = `${this.exportDir}/evalrun-${event.id}-start.json`;
|
|
29
|
+
await Bun.write(filename, JSON.stringify(data, null, 2));
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* called when the eval run completes
|
|
34
|
+
*
|
|
35
|
+
* @param event EvalRunCompleteEvent
|
|
36
|
+
*/
|
|
37
|
+
async complete(event: EvalRunCompleteEvent): Promise<void> {
|
|
38
|
+
const data = {
|
|
39
|
+
type: 'evalrun_complete',
|
|
40
|
+
timestamp: Date.now(),
|
|
41
|
+
...event,
|
|
42
|
+
};
|
|
43
|
+
const filename = `${this.exportDir}/evalrun-${event.id}-complete.json`;
|
|
44
|
+
await Bun.write(filename, JSON.stringify(data, null, 2));
|
|
45
|
+
}
|
|
46
|
+
}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import {
|
|
2
|
+
type EvalRunEventProvider,
|
|
3
|
+
type EvalRunStartEvent,
|
|
4
|
+
type EvalRunCompleteEvent,
|
|
5
|
+
} from '@agentuity/core';
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* An implementation of the EvalRunEventProvider which just logs locally
|
|
9
|
+
*/
|
|
10
|
+
export class LocalEvalRunEventProvider implements EvalRunEventProvider {
|
|
11
|
+
/**
|
|
12
|
+
* called when the eval run starts
|
|
13
|
+
*
|
|
14
|
+
* @param event EvalRunStartEvent
|
|
15
|
+
*/
|
|
16
|
+
async start(event: EvalRunStartEvent): Promise<void> {
|
|
17
|
+
console.log('EvalRun started:', event);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* called when the eval run completes
|
|
22
|
+
*
|
|
23
|
+
* @param event EvalRunCompleteEvent
|
|
24
|
+
*/
|
|
25
|
+
async complete(event: EvalRunCompleteEvent): Promise<void> {
|
|
26
|
+
console.log('EvalRun completed:', event);
|
|
27
|
+
}
|
|
28
|
+
}
|