@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.
Files changed (130) hide show
  1. package/AGENTS.md +11 -9
  2. package/README.md +4 -4
  3. package/dist/_context.d.ts +12 -4
  4. package/dist/_context.d.ts.map +1 -1
  5. package/dist/_server.d.ts +7 -4
  6. package/dist/_server.d.ts.map +1 -1
  7. package/dist/_services.d.ts +13 -2
  8. package/dist/_services.d.ts.map +1 -1
  9. package/dist/_util.d.ts +1 -1
  10. package/dist/_util.d.ts.map +1 -1
  11. package/dist/_waituntil.d.ts +1 -3
  12. package/dist/_waituntil.d.ts.map +1 -1
  13. package/dist/agent.d.ts +41 -14
  14. package/dist/agent.d.ts.map +1 -1
  15. package/dist/app.d.ts +90 -8
  16. package/dist/app.d.ts.map +1 -1
  17. package/dist/eval.d.ts +79 -0
  18. package/dist/eval.d.ts.map +1 -0
  19. package/dist/index.d.ts +6 -1
  20. package/dist/index.d.ts.map +1 -1
  21. package/dist/io/email.d.ts +77 -0
  22. package/dist/io/email.d.ts.map +1 -0
  23. package/dist/logger/console.d.ts +7 -1
  24. package/dist/logger/console.d.ts.map +1 -1
  25. package/dist/logger/user.d.ts.map +1 -1
  26. package/dist/otel/config.d.ts +3 -1
  27. package/dist/otel/config.d.ts.map +1 -1
  28. package/dist/otel/console.d.ts +2 -1
  29. package/dist/otel/console.d.ts.map +1 -1
  30. package/dist/otel/exporters/index.d.ts +4 -0
  31. package/dist/otel/exporters/index.d.ts.map +1 -0
  32. package/dist/otel/exporters/jsonl-log-exporter.d.ts +36 -0
  33. package/dist/otel/exporters/jsonl-log-exporter.d.ts.map +1 -0
  34. package/dist/otel/exporters/jsonl-metric-exporter.d.ts +40 -0
  35. package/dist/otel/exporters/jsonl-metric-exporter.d.ts.map +1 -0
  36. package/dist/otel/exporters/jsonl-trace-exporter.d.ts +36 -0
  37. package/dist/otel/exporters/jsonl-trace-exporter.d.ts.map +1 -0
  38. package/dist/otel/http.d.ts.map +1 -1
  39. package/dist/otel/logger.d.ts +8 -6
  40. package/dist/otel/logger.d.ts.map +1 -1
  41. package/dist/otel/otel.d.ts +8 -2
  42. package/dist/otel/otel.d.ts.map +1 -1
  43. package/dist/router.d.ts +4 -1
  44. package/dist/router.d.ts.map +1 -1
  45. package/dist/services/evalrun/composite.d.ts +21 -0
  46. package/dist/services/evalrun/composite.d.ts.map +1 -0
  47. package/dist/services/evalrun/http.d.ts +24 -0
  48. package/dist/services/evalrun/http.d.ts.map +1 -0
  49. package/dist/services/evalrun/index.d.ts +5 -0
  50. package/dist/services/evalrun/index.d.ts.map +1 -0
  51. package/dist/services/evalrun/json.d.ts +21 -0
  52. package/dist/services/evalrun/json.d.ts.map +1 -0
  53. package/dist/services/evalrun/local.d.ts +19 -0
  54. package/dist/services/evalrun/local.d.ts.map +1 -0
  55. package/dist/services/local/_db.d.ts +4 -0
  56. package/dist/services/local/_db.d.ts.map +1 -0
  57. package/dist/services/local/_router.d.ts +3 -0
  58. package/dist/services/local/_router.d.ts.map +1 -0
  59. package/dist/services/local/_util.d.ts +18 -0
  60. package/dist/services/local/_util.d.ts.map +1 -0
  61. package/dist/services/local/index.d.ts +8 -0
  62. package/dist/services/local/index.d.ts.map +1 -0
  63. package/dist/services/local/keyvalue.d.ts +10 -0
  64. package/dist/services/local/keyvalue.d.ts.map +1 -0
  65. package/dist/services/local/objectstore.d.ts +11 -0
  66. package/dist/services/local/objectstore.d.ts.map +1 -0
  67. package/dist/services/local/stream.d.ts +10 -0
  68. package/dist/services/local/stream.d.ts.map +1 -0
  69. package/dist/services/local/vector.d.ts +13 -0
  70. package/dist/services/local/vector.d.ts.map +1 -0
  71. package/dist/services/session/composite.d.ts +21 -0
  72. package/dist/services/session/composite.d.ts.map +1 -0
  73. package/dist/services/session/http.d.ts +23 -0
  74. package/dist/services/session/http.d.ts.map +1 -0
  75. package/dist/services/session/index.d.ts +5 -0
  76. package/dist/services/session/index.d.ts.map +1 -0
  77. package/dist/services/session/json.d.ts +22 -0
  78. package/dist/services/session/json.d.ts.map +1 -0
  79. package/dist/services/session/local.d.ts +19 -0
  80. package/dist/services/session/local.d.ts.map +1 -0
  81. package/dist/session.d.ts +70 -0
  82. package/dist/session.d.ts.map +1 -0
  83. package/package.json +10 -6
  84. package/src/_config.ts +1 -1
  85. package/src/_context.ts +19 -16
  86. package/src/_server.ts +284 -42
  87. package/src/_services.ts +147 -34
  88. package/src/_util.ts +2 -3
  89. package/src/_waituntil.ts +5 -153
  90. package/src/agent.ts +667 -65
  91. package/src/app.ts +159 -13
  92. package/src/eval.ts +95 -0
  93. package/src/index.ts +6 -1
  94. package/src/io/email.ts +173 -0
  95. package/src/logger/console.ts +196 -17
  96. package/src/logger/user.ts +7 -3
  97. package/src/otel/config.ts +7 -44
  98. package/src/otel/console.ts +8 -4
  99. package/src/otel/exporters/README.md +217 -0
  100. package/src/otel/exporters/index.ts +3 -0
  101. package/src/otel/exporters/jsonl-log-exporter.ts +113 -0
  102. package/src/otel/exporters/jsonl-metric-exporter.ts +120 -0
  103. package/src/otel/exporters/jsonl-trace-exporter.ts +121 -0
  104. package/src/otel/http.ts +3 -1
  105. package/src/otel/logger.ts +87 -37
  106. package/src/otel/otel.ts +43 -22
  107. package/src/router.ts +44 -4
  108. package/src/services/evalrun/composite.ts +34 -0
  109. package/src/services/evalrun/http.ts +112 -0
  110. package/src/services/evalrun/index.ts +4 -0
  111. package/src/services/evalrun/json.ts +46 -0
  112. package/src/services/evalrun/local.ts +28 -0
  113. package/src/services/local/README.md +1576 -0
  114. package/src/services/local/_db.ts +182 -0
  115. package/src/services/local/_router.ts +86 -0
  116. package/src/services/local/_util.ts +49 -0
  117. package/src/services/local/index.ts +7 -0
  118. package/src/services/local/keyvalue.ts +118 -0
  119. package/src/services/local/objectstore.ts +152 -0
  120. package/src/services/local/stream.ts +296 -0
  121. package/src/services/local/vector.ts +264 -0
  122. package/src/services/session/composite.ts +33 -0
  123. package/src/services/session/http.ts +64 -0
  124. package/src/services/session/index.ts +4 -0
  125. package/src/services/session/json.ts +42 -0
  126. package/src/services/session/local.ts +28 -0
  127. package/src/session.ts +284 -0
  128. package/dist/_unauthenticated.d.ts +0 -26
  129. package/dist/_unauthenticated.d.ts.map +0 -1
  130. package/src/_unauthenticated.ts +0 -126
package/src/_services.ts CHANGED
@@ -11,18 +11,42 @@ import {
11
11
  type ListStreamsResponse,
12
12
  type VectorUpsertResult,
13
13
  type VectorSearchResult,
14
+ type Logger,
15
+ type SessionEventProvider,
16
+ type EvalRunEventProvider,
14
17
  } from '@agentuity/core';
15
- import { createServerFetchAdapter, getServiceUrls } from '@agentuity/server';
18
+ import { /*APIClient,*/ createServerFetchAdapter, getServiceUrls } from '@agentuity/server';
19
+ import {
20
+ CompositeSessionEventProvider,
21
+ LocalSessionEventProvider,
22
+ JSONSessionEventProvider,
23
+ // HTTPSessionEventProvider,
24
+ } from './services/session';
25
+ import {
26
+ CompositeEvalRunEventProvider,
27
+ LocalEvalRunEventProvider,
28
+ JSONEvalRunEventProvider,
29
+ // HTTPEvalRunEventProvider,
30
+ } from './services/evalrun';
16
31
  import { injectTraceContextToHeaders } from './otel/http';
17
32
  import { getLogger, getTracer } from './_server';
18
- import { getSDKVersion, isAuthenticated } from './_config';
33
+ import { getSDKVersion, isAuthenticated, isProduction } from './_config';
19
34
  import type { AppConfig } from './app';
20
35
  import {
21
- UnauthenticatedKeyValueStorage,
22
- UnauthenticatedObjectStorage,
23
- UnauthenticatedStreamStorage,
24
- UnauthenticatedVectorStorage,
25
- } from './_unauthenticated';
36
+ DefaultSessionProvider,
37
+ DefaultThreadProvider,
38
+ type ThreadProvider,
39
+ type SessionProvider,
40
+ } from './session';
41
+ import {
42
+ LocalKeyValueStorage,
43
+ LocalObjectStorage,
44
+ LocalStreamStorage,
45
+ LocalVectorStorage,
46
+ getLocalDB,
47
+ normalizeProjectPath,
48
+ createLocalStorageRouter,
49
+ } from './services/local';
26
50
 
27
51
  const userAgent = `Agentuity SDK/${getSDKVersion()}`;
28
52
  const bearerKey = `Bearer ${process.env.AGENTUITY_SDK_KEY}`;
@@ -32,6 +56,7 @@ const kvBaseUrl = serviceUrls.keyvalue;
32
56
  const streamBaseUrl = serviceUrls.stream;
33
57
  const vectorBaseUrl = serviceUrls.vector;
34
58
  const objectBaseUrl = serviceUrls.objectstore;
59
+ // const catalystBaseUrl = serviceUrls.catalyst;
35
60
 
36
61
  const adapter = createServerFetchAdapter({
37
62
  headers: {
@@ -149,45 +174,113 @@ let kv: KeyValueStorage;
149
174
  let objectStore: ObjectStorage;
150
175
  let stream: StreamStorage;
151
176
  let vector: VectorStorage;
177
+ let session: SessionProvider;
178
+ let thread: ThreadProvider;
179
+ let sessionEvent: SessionEventProvider;
180
+ let evalRunEvent: EvalRunEventProvider;
181
+
182
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
183
+ let localRouter: any | null = null;
152
184
 
153
- export function createServices(config?: AppConfig) {
185
+ export function createServices(logger: Logger, config?: AppConfig, serverUrl?: string) {
154
186
  const authenticated = isAuthenticated();
187
+ const useLocal = config?.services?.useLocal ?? false;
155
188
 
156
- if (config?.services?.keyvalue) {
157
- kv = config.services.keyvalue;
158
- } else if (authenticated) {
159
- kv = new KeyValueStorageService(kvBaseUrl, adapter);
160
- } else {
161
- kv = new UnauthenticatedKeyValueStorage();
162
- }
189
+ // Use local services if explicitly requested OR if not authenticated
190
+ const shouldUseLocal =
191
+ useLocal || !authenticated || process.env.AGENTUITY_FORCE_LOCAL_SERVICES === 'true';
163
192
 
164
- if (config?.services?.object) {
165
- objectStore = config.services.object;
166
- } else if (authenticated) {
167
- objectStore = new ObjectStorageService(objectBaseUrl, adapter);
168
- } else {
169
- objectStore = new UnauthenticatedObjectStorage();
193
+ if (shouldUseLocal) {
194
+ const db = getLocalDB();
195
+ const projectPath = normalizeProjectPath();
196
+
197
+ if (!serverUrl) {
198
+ throw new Error('serverUrl is required when using local services');
199
+ }
200
+
201
+ logger.info('Using local services (development only)');
202
+
203
+ kv = config?.services?.keyvalue || new LocalKeyValueStorage(db, projectPath);
204
+ objectStore = config?.services?.object || new LocalObjectStorage(db, projectPath, serverUrl);
205
+ stream = config?.services?.stream || new LocalStreamStorage(db, projectPath, serverUrl);
206
+ vector = config?.services?.vector || new LocalVectorStorage(db, projectPath);
207
+ session = config?.services?.session || new DefaultSessionProvider();
208
+ thread = config?.services?.thread || new DefaultThreadProvider();
209
+ sessionEvent = config?.services?.sessionEvent
210
+ ? new CompositeSessionEventProvider(
211
+ new LocalSessionEventProvider(),
212
+ config.services.sessionEvent
213
+ )
214
+ : new LocalSessionEventProvider();
215
+ evalRunEvent = config?.services?.evalRunEvent
216
+ ? new CompositeEvalRunEventProvider(
217
+ new LocalEvalRunEventProvider(),
218
+ config.services.evalRunEvent
219
+ )
220
+ : new LocalEvalRunEventProvider();
221
+
222
+ localRouter = createLocalStorageRouter(db, projectPath);
223
+
224
+ return { localRouter };
170
225
  }
171
226
 
172
- if (config?.services?.stream) {
173
- stream = config.services.stream;
174
- } else if (authenticated) {
175
- stream = new StreamStorageService(streamBaseUrl, adapter);
176
- } else {
177
- stream = new UnauthenticatedStreamStorage();
227
+ // Reset local router if not using local services
228
+ localRouter = null;
229
+
230
+ // At this point we must be authenticated (since !authenticated would trigger local services above)
231
+ kv = config?.services?.keyvalue || new KeyValueStorageService(kvBaseUrl, adapter);
232
+ objectStore = config?.services?.object || new ObjectStorageService(objectBaseUrl, adapter);
233
+ stream = config?.services?.stream || new StreamStorageService(streamBaseUrl, adapter);
234
+ vector = config?.services?.vector || new VectorStorageService(vectorBaseUrl, adapter);
235
+ session = config?.services?.session || new DefaultSessionProvider();
236
+ thread = config?.services?.thread || new DefaultThreadProvider();
237
+ sessionEvent =
238
+ isProduction() && process.env.AGENTUITY_CLOUD_EXPORT_DIR
239
+ ? new JSONSessionEventProvider(process.env.AGENTUITY_CLOUD_EXPORT_DIR)
240
+ : // FIXME: this is turned off for now for production until we have the new changes deployed
241
+
242
+ // ? new HTTPSessionEventProvider(new APIClient(catalystBaseUrl, logger))
243
+ new LocalSessionEventProvider();
244
+ if (config?.services?.sessionEvent) {
245
+ sessionEvent = new CompositeSessionEventProvider(sessionEvent, config.services.sessionEvent);
178
246
  }
247
+ evalRunEvent =
248
+ isProduction() && process.env.AGENTUITY_CLOUD_EXPORT_DIR
249
+ ? new JSONEvalRunEventProvider(process.env.AGENTUITY_CLOUD_EXPORT_DIR)
250
+ : // FIXME: this is turned off for now for production until we have the new changes deployed
179
251
 
180
- if (config?.services?.vector) {
181
- vector = config.services.vector;
182
- } else if (authenticated) {
183
- vector = new VectorStorageService(vectorBaseUrl, adapter);
184
- } else {
185
- vector = new UnauthenticatedVectorStorage();
252
+ // ? new HTTPEvalRunEventProvider(new APIClient(catalystBaseUrl, logger), logger, catalystBaseUrl)
253
+ new LocalEvalRunEventProvider();
254
+ if (config?.services?.evalRunEvent) {
255
+ evalRunEvent = new CompositeEvalRunEventProvider(evalRunEvent, config.services.evalRunEvent);
186
256
  }
257
+
258
+ return {};
259
+ }
260
+
261
+ export function getThreadProvider(): ThreadProvider {
262
+ return thread;
263
+ }
264
+
265
+ export function getSessionProvider(): SessionProvider {
266
+ return session;
267
+ }
268
+
269
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
270
+ export function getLocalRouter(): any | null {
271
+ return localRouter;
272
+ }
273
+
274
+ export function getSessionEventProvider() {
275
+ return sessionEvent;
276
+ }
277
+
278
+ export function getEvalRunEventProvider() {
279
+ return evalRunEvent;
187
280
  }
188
281
 
189
282
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
190
- export function registerServices(o: any) {
283
+ export function registerServices(o: any, includeAgents = false) {
191
284
  Object.defineProperty(o, 'kv', {
192
285
  get: () => kv,
193
286
  enumerable: false,
@@ -208,4 +301,24 @@ export function registerServices(o: any) {
208
301
  enumerable: false,
209
302
  configurable: false,
210
303
  });
304
+
305
+ // Also register agent registry if requested
306
+ if (includeAgents) {
307
+ // Cache the populated registry to avoid re-creating on every access
308
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
309
+ let cachedRegistry: any;
310
+ Object.defineProperty(o, 'agent', {
311
+ get: () => {
312
+ if (!cachedRegistry) {
313
+ // Lazy-load to avoid circular dependency
314
+ // eslint-disable-next-line @typescript-eslint/no-require-imports
315
+ const { populateAgentsRegistry } = require('./agent');
316
+ cachedRegistry = populateAgentsRegistry(o);
317
+ }
318
+ return cachedRegistry;
319
+ },
320
+ enumerable: false,
321
+ configurable: false,
322
+ });
323
+ }
211
324
  }
package/src/_util.ts CHANGED
@@ -1,7 +1,6 @@
1
1
  import type { Context } from 'hono';
2
2
 
3
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
4
- export function returnResponse(ctx: Context, result: any) {
3
+ export function returnResponse(ctx: Context, result: unknown) {
5
4
  if (result instanceof ReadableStream) return ctx.body(result);
6
5
  if (result instanceof Response) return result;
7
6
  if (typeof result === 'string') return ctx.text(result);
@@ -17,7 +16,7 @@ export function returnResponse(ctx: Context, result: any) {
17
16
  */
18
17
  export function hash(...val: string[]): string {
19
18
  const hasher = new Bun.CryptoHasher('sha256');
20
- val.forEach((val) => hasher.update(val));
19
+ val.map((val) => hasher.update(val));
21
20
  return hasher.digest().toHex();
22
21
  }
23
22
 
package/src/_waituntil.ts CHANGED
@@ -18,20 +18,16 @@ export default class WaitUntilHandler {
18
18
  private tracer: Tracer;
19
19
  private started: number | undefined;
20
20
  private hasCalledWaitUntilAll = false;
21
- private setHeader: (k: string, v: string) => void;
22
21
 
23
- public constructor(setHeader: (k: string, v: string) => void, tracer: Tracer) {
22
+ public constructor(tracer: Tracer) {
24
23
  this.tracer = tracer;
25
24
  this.promises = [];
26
- this.setHeader = setHeader;
27
- this.hasCalledWaitUntilAll = false;
28
25
  }
29
26
 
30
27
  public waitUntil(promise: Promise<void> | (() => void | Promise<void>)): void {
31
28
  if (this.hasCalledWaitUntilAll) {
32
29
  throw new Error('Cannot call waitUntil after waitUntilAll has been called');
33
30
  }
34
- this.setHeader('x-agentuity-session-pending', 'true');
35
31
  running++;
36
32
  internal.debug('wait until called, running: %d', running);
37
33
  const currentContext = context.active();
@@ -69,11 +65,6 @@ export default class WaitUntilHandler {
69
65
  return this.promises.length > 0;
70
66
  }
71
67
 
72
- private async markSessionCompleted(sessionId: string, duration: number) {
73
- // TODO:
74
- internal.debug('markSessionCompleted sessionId: %s, duration: %dms', sessionId, duration);
75
- }
76
-
77
68
  public async waitUntilAll(logger: Logger, sessionId: string): Promise<void> {
78
69
  internal.debug(`๐Ÿ” waitUntilAll() called for session ${sessionId} (count: %d)`, running);
79
70
 
@@ -93,12 +84,10 @@ export default class WaitUntilHandler {
93
84
  // Promises are already executing, just wait for them to complete
94
85
  await Promise.all(this.promises);
95
86
  const duration = Date.now() - (this.started as number);
96
- internal.debug('โœ… All promises completed, marking session completed');
97
- await this.markSessionCompleted(sessionId, duration);
98
-
99
- // // Execute evals after session completion
100
- // internal.debug('๐Ÿš€ Starting eval execution after session completion');
101
- // await this.executeEvalsForSession(logger, sessionId);
87
+ internal.debug(
88
+ 'โœ… All promises completed, marking session completed (duration %dms)',
89
+ duration
90
+ );
102
91
  } catch (ex) {
103
92
  logger.error('error sending session completed', ex);
104
93
  } finally {
@@ -106,141 +95,4 @@ export default class WaitUntilHandler {
106
95
  this.promises.length = 0;
107
96
  }
108
97
  }
109
-
110
- // /**
111
- // * Execute evals for the completed session
112
- // */
113
- // private async executeEvalsForSession(
114
- // logger: Logger,
115
- // sessionId: string
116
- // ): Promise<void> {
117
- // try {
118
- // internal.debug(`๐Ÿ” Starting eval execution for session ${sessionId}`);
119
-
120
- // // Get pending eval jobs for this session
121
- // internal.debug('๐Ÿ” Getting EvalJobScheduler instance...');
122
- // const evalJobScheduler = await EvalJobScheduler.getInstance();
123
- // internal.debug('โœ… EvalJobScheduler instance obtained');
124
-
125
- // internal.debug(`๐Ÿ” Querying jobs for session ${sessionId}...`);
126
- // const jobs = evalJobScheduler.getJobs({ sessionId });
127
-
128
- // if (jobs.length === 0) {
129
- // internal.debug(`๐Ÿ“ญ No eval jobs found for session ${sessionId}`);
130
- // return;
131
- // }
132
-
133
- // internal.debug(
134
- // `๐Ÿ“‹ Found ${jobs.length} eval jobs for session ${sessionId}`
135
- // );
136
-
137
- // // Load eval metadata map
138
- // internal.debug('๐Ÿ”ง Loading eval metadata map...');
139
- // const evalAPI = new EvalAPI();
140
- // const evalMetadataMap = await evalAPI.loadEvalMetadataMap();
141
- // internal.debug(`๐Ÿ“š Loaded ${evalMetadataMap.size} eval mappings`);
142
-
143
- // // Execute evals for each job
144
- // let totalEvalsExecuted = 0;
145
- // for (let i = 0; i < jobs.length; i++) {
146
- // const job = jobs[i];
147
- // internal.debug(
148
- // `๐ŸŽฏ Processing job ${i + 1}/${jobs.length} (spanId: ${job.spanId})`
149
- // );
150
- // const evalsInJob = await this.executeEvalsForJob(
151
- // logger,
152
- // job,
153
- // evalAPI,
154
- // evalMetadataMap
155
- // );
156
- // totalEvalsExecuted += evalsInJob;
157
- // internal.debug(
158
- // `โœ… Completed job ${i + 1}/${jobs.length}: ${evalsInJob} evals executed`
159
- // );
160
- // }
161
-
162
- // internal.debug(
163
- // `โœ… Completed eval execution for session ${sessionId}: ${totalEvalsExecuted} evals executed`
164
- // );
165
-
166
- // // Clean up completed jobs
167
- // internal.debug(`๐Ÿงน Cleaning up ${jobs.length} completed jobs...`);
168
- // for (const job of jobs) {
169
- // evalJobScheduler.removeJob(job.spanId);
170
- // }
171
- // internal.debug(`โœ… Cleaned up ${jobs.length} completed jobs`);
172
- // } catch (error) {
173
- // logger.error('โŒ Error executing evals for session:', error);
174
- // }
175
- // }
176
-
177
- // /**
178
- // * Execute evals for a specific job
179
- // */
180
- // private async executeEvalsForJob(
181
- // logger: Logger,
182
- // job: {
183
- // spanId: string;
184
- // sessionId: string;
185
- // promptMetadata: PromptAttributes[];
186
- // input?: string;
187
- // output?: string;
188
- // },
189
- // evalAPI: EvalAPI,
190
- // evalMetadataMap: Map<string, string>
191
- // ): Promise<number> {
192
- // let evalsExecuted = 0;
193
-
194
- // internal.debug(
195
- // `๐ŸŽฏ Processing job ${job.spanId} with ${job.promptMetadata.length} prompt metadata entries`
196
- // );
197
-
198
- // for (const promptMeta of job.promptMetadata || []) {
199
- // if (!promptMeta.evals || promptMeta.evals.length === 0) {
200
- // logger.debug('โญ๏ธ Skipping prompt metadata with no evals');
201
- // continue;
202
- // }
203
-
204
- // internal.debug(
205
- // `๐Ÿ“ Found ${promptMeta.evals.length} evals for prompt: ${promptMeta.evals.join(', ')}`
206
- // );
207
-
208
- // for (const evalSlug of promptMeta.evals) {
209
- // try {
210
- // internal.debug(
211
- // `๐Ÿš€ Running eval '${evalSlug}' for session ${job.sessionId}`
212
- // );
213
-
214
- // internal.debug(`๐Ÿ”‘ Template hash: ${promptMeta.templateHash}`);
215
- // internal.debug(`๐Ÿ”‘ Compiled hash: ${promptMeta.compiledHash}`);
216
-
217
- // const result = await evalAPI.runEval(
218
- // evalSlug,
219
- // job.input || '',
220
- // job.output || '',
221
- // job.sessionId,
222
- // job.spanId,
223
- // promptMeta.templateHash
224
- // );
225
-
226
- // if (result.success) {
227
- // internal.debug(`โœ… Successfully executed eval '${evalSlug}'`);
228
- // evalsExecuted++;
229
- // } else {
230
- // logger.warn(
231
- // `โš ๏ธ Eval '${evalSlug}' completed but returned error: ${result.message}`
232
- // );
233
- // }
234
- // } catch (error) {
235
- // logger.error(`โŒ Failed to execute eval '${evalSlug}':`, error);
236
- // // Continue with other evals even if one fails
237
- // }
238
- // }
239
- // }
240
-
241
- // internal.debug(
242
- // `๐Ÿ“Š Job ${job.spanId} completed: ${evalsExecuted} evals executed`
243
- // );
244
- // return evalsExecuted;
245
- // }
246
98
  }