@agentuity/runtime 0.0.51 → 0.0.52
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/dist/_config.js +99 -0
- package/dist/_config.js.map +1 -0
- package/dist/_context.js +82 -0
- package/dist/_context.js.map +1 -0
- package/dist/_idle.js +24 -0
- package/dist/_idle.js.map +1 -0
- package/dist/_server.js +489 -0
- package/dist/_server.js.map +1 -0
- package/dist/_services.js +258 -0
- package/dist/_services.js.map +1 -0
- package/dist/_tokens.js +98 -0
- package/dist/_tokens.js.map +1 -0
- package/dist/_util.js +54 -0
- package/dist/_util.js.map +1 -0
- package/dist/_waituntil.js +87 -0
- package/dist/_waituntil.js.map +1 -0
- package/dist/agent.js +507 -0
- package/dist/agent.js.map +1 -0
- package/dist/app.d.ts +6 -1
- package/dist/app.d.ts.map +1 -1
- package/dist/app.js +72 -0
- package/dist/app.js.map +1 -0
- package/dist/eval.js +2 -0
- package/dist/eval.js.map +1 -0
- package/dist/index.js +11 -0
- package/dist/index.js.map +1 -0
- package/dist/io/email.js +154 -0
- package/dist/io/email.js.map +1 -0
- package/dist/logger/console.js +274 -0
- package/dist/logger/console.js.map +1 -0
- package/dist/logger/index.js +3 -0
- package/dist/logger/index.js.map +1 -0
- package/dist/logger/internal.js +133 -0
- package/dist/logger/internal.js.map +1 -0
- package/dist/logger/logger.js +2 -0
- package/dist/logger/logger.js.map +1 -0
- package/dist/logger/user.js +7 -0
- package/dist/logger/user.js.map +1 -0
- package/dist/logger/util.js +77 -0
- package/dist/logger/util.js.map +1 -0
- package/dist/otel/config.js +23 -0
- package/dist/otel/config.js.map +1 -0
- package/dist/otel/console.js +52 -0
- package/dist/otel/console.js.map +1 -0
- package/dist/otel/exporters/index.js +4 -0
- package/dist/otel/exporters/index.js.map +1 -0
- package/dist/otel/exporters/jsonl-log-exporter.js +103 -0
- package/dist/otel/exporters/jsonl-log-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js +104 -0
- package/dist/otel/exporters/jsonl-metric-exporter.js.map +1 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js +111 -0
- package/dist/otel/exporters/jsonl-trace-exporter.js.map +1 -0
- package/dist/otel/fetch.js +81 -0
- package/dist/otel/fetch.js.map +1 -0
- package/dist/otel/http.js +44 -0
- package/dist/otel/http.js.map +1 -0
- package/dist/otel/logger.js +278 -0
- package/dist/otel/logger.js.map +1 -0
- package/dist/otel/otel.js +233 -0
- package/dist/otel/otel.js.map +1 -0
- package/dist/router.js +350 -0
- package/dist/router.js.map +1 -0
- package/dist/services/evalrun/composite.js +26 -0
- package/dist/services/evalrun/composite.js.map +1 -0
- package/dist/services/evalrun/http.js +74 -0
- package/dist/services/evalrun/http.js.map +1 -0
- package/dist/services/evalrun/index.js +5 -0
- package/dist/services/evalrun/index.js.map +1 -0
- package/dist/services/evalrun/json.js +38 -0
- package/dist/services/evalrun/json.js.map +1 -0
- package/dist/services/evalrun/local.js +22 -0
- package/dist/services/evalrun/local.js.map +1 -0
- package/dist/services/local/_db.js +144 -0
- package/dist/services/local/_db.js.map +1 -0
- package/dist/services/local/_router.js +60 -0
- package/dist/services/local/_router.js.map +1 -0
- package/dist/services/local/_util.js +42 -0
- package/dist/services/local/_util.js.map +1 -0
- package/dist/services/local/index.js +8 -0
- package/dist/services/local/index.js.map +1 -0
- package/dist/services/local/keyvalue.js +114 -0
- package/dist/services/local/keyvalue.js.map +1 -0
- package/dist/services/local/objectstore.js +117 -0
- package/dist/services/local/objectstore.js.map +1 -0
- package/dist/services/local/stream.js +218 -0
- package/dist/services/local/stream.js.map +1 -0
- package/dist/services/local/vector.js +183 -0
- package/dist/services/local/vector.js.map +1 -0
- package/dist/services/session/composite.js +26 -0
- package/dist/services/session/composite.js.map +1 -0
- package/dist/services/session/http.js +42 -0
- package/dist/services/session/http.js.map +1 -0
- package/dist/services/session/index.js +5 -0
- package/dist/services/session/index.js.map +1 -0
- package/dist/services/session/json.js +35 -0
- package/dist/services/session/json.js.map +1 -0
- package/dist/services/session/local.js +22 -0
- package/dist/services/session/local.js.map +1 -0
- package/dist/session.js +199 -0
- package/dist/session.js.map +1 -0
- package/dist/workbench.js +38 -0
- package/dist/workbench.js.map +1 -0
- package/package.json +5 -5
- package/src/app.ts +6 -1
|
@@ -0,0 +1,258 @@
|
|
|
1
|
+
import { context, SpanKind, SpanStatusCode, trace } from '@opentelemetry/api';
|
|
2
|
+
import { KeyValueStorageService, ObjectStorageService, StreamStorageService, VectorStorageService, } from '@agentuity/core';
|
|
3
|
+
import { APIClient, createServerFetchAdapter, getServiceUrls } from '@agentuity/server';
|
|
4
|
+
import { CompositeSessionEventProvider, LocalSessionEventProvider, JSONSessionEventProvider, HTTPSessionEventProvider, } from './services/session';
|
|
5
|
+
import { CompositeEvalRunEventProvider, LocalEvalRunEventProvider, JSONEvalRunEventProvider, HTTPEvalRunEventProvider, } from './services/evalrun';
|
|
6
|
+
import { injectTraceContextToHeaders } from './otel/http';
|
|
7
|
+
import { getTracer } from './_server';
|
|
8
|
+
import { getSDKVersion, isAuthenticated, isProduction } from './_config';
|
|
9
|
+
import { DefaultSessionProvider, DefaultThreadProvider, } from './session';
|
|
10
|
+
import { LocalKeyValueStorage, LocalObjectStorage, LocalStreamStorage, LocalVectorStorage, getLocalDB, normalizeProjectPath, createLocalStorageRouter, } from './services/local';
|
|
11
|
+
const userAgent = `Agentuity SDK/${getSDKVersion()}`;
|
|
12
|
+
const bearerKey = `Bearer ${process.env.AGENTUITY_SDK_KEY}`;
|
|
13
|
+
const serviceUrls = getServiceUrls();
|
|
14
|
+
const kvBaseUrl = serviceUrls.keyvalue;
|
|
15
|
+
const streamBaseUrl = serviceUrls.stream;
|
|
16
|
+
const vectorBaseUrl = serviceUrls.vector;
|
|
17
|
+
const objectBaseUrl = serviceUrls.objectstore;
|
|
18
|
+
const catalystBaseUrl = serviceUrls.catalyst;
|
|
19
|
+
let adapter;
|
|
20
|
+
const createFetchAdapter = (logger) => createServerFetchAdapter({
|
|
21
|
+
headers: {
|
|
22
|
+
Authorization: bearerKey,
|
|
23
|
+
'User-Agent': userAgent,
|
|
24
|
+
},
|
|
25
|
+
onBefore: async (url, options, callback) => {
|
|
26
|
+
logger.debug('before request: %s with options: %s', url, options);
|
|
27
|
+
if (!options.telemetry) {
|
|
28
|
+
return callback();
|
|
29
|
+
}
|
|
30
|
+
options.headers = { ...options.headers, ...injectTraceContextToHeaders() };
|
|
31
|
+
const tracer = getTracer() ?? trace.getTracer('agentuity');
|
|
32
|
+
const currentContext = context.active();
|
|
33
|
+
const span = tracer.startSpan(options.telemetry.name, { attributes: options.telemetry.attributes, kind: SpanKind.CLIENT }, currentContext);
|
|
34
|
+
const spanContext = trace.setSpan(currentContext, span);
|
|
35
|
+
try {
|
|
36
|
+
await context.with(spanContext, callback);
|
|
37
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
38
|
+
}
|
|
39
|
+
catch (err) {
|
|
40
|
+
const e = err;
|
|
41
|
+
span.recordException(e);
|
|
42
|
+
span.setStatus({ code: SpanStatusCode.ERROR, message: e?.message ?? String(err) });
|
|
43
|
+
throw err;
|
|
44
|
+
}
|
|
45
|
+
finally {
|
|
46
|
+
span.end();
|
|
47
|
+
}
|
|
48
|
+
},
|
|
49
|
+
onAfter: async (url, options, result, err) => {
|
|
50
|
+
logger.debug('after request: %s (%d) => %s', url, result.response.status, err);
|
|
51
|
+
if (err) {
|
|
52
|
+
return;
|
|
53
|
+
}
|
|
54
|
+
const span = trace.getSpan(context.active());
|
|
55
|
+
switch (options.telemetry?.name) {
|
|
56
|
+
case 'agentuity.keyvalue.get': {
|
|
57
|
+
if (result.response.status === 404) {
|
|
58
|
+
span?.addEvent('miss');
|
|
59
|
+
}
|
|
60
|
+
else if (result.response.ok) {
|
|
61
|
+
span?.addEvent('hit');
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
}
|
|
65
|
+
case 'agentuity.stream.create': {
|
|
66
|
+
if (result.response.ok) {
|
|
67
|
+
const res = result.data;
|
|
68
|
+
span?.setAttributes({
|
|
69
|
+
'stream.id': res.id,
|
|
70
|
+
'stream.url': `${streamBaseUrl}/${res.id}`,
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
break;
|
|
74
|
+
}
|
|
75
|
+
case 'agentuity.stream.list': {
|
|
76
|
+
const response = result.data;
|
|
77
|
+
if (response && span) {
|
|
78
|
+
span.setAttributes({
|
|
79
|
+
'stream.count': response.streams.length,
|
|
80
|
+
'stream.total': response.total,
|
|
81
|
+
});
|
|
82
|
+
}
|
|
83
|
+
break;
|
|
84
|
+
}
|
|
85
|
+
case 'agentuity.vector.upsert': {
|
|
86
|
+
if (result.response.ok) {
|
|
87
|
+
const data = result.data;
|
|
88
|
+
span?.setAttributes({
|
|
89
|
+
'vector.count': data.length,
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
break;
|
|
93
|
+
}
|
|
94
|
+
case 'agentuity.vector.search': {
|
|
95
|
+
if (result.response.ok) {
|
|
96
|
+
const data = result.data;
|
|
97
|
+
span?.setAttributes({
|
|
98
|
+
'vector.results': data.length,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
case 'agentuity.vector.get': {
|
|
104
|
+
if (result.response.status === 404) {
|
|
105
|
+
span?.addEvent('miss');
|
|
106
|
+
}
|
|
107
|
+
else if (result.response.ok) {
|
|
108
|
+
span?.addEvent('hit');
|
|
109
|
+
}
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
case 'agentuity.objectstore.get': {
|
|
113
|
+
if (result.response.status === 404) {
|
|
114
|
+
span?.addEvent('miss');
|
|
115
|
+
}
|
|
116
|
+
else if (result.response.ok) {
|
|
117
|
+
span?.addEvent('hit');
|
|
118
|
+
}
|
|
119
|
+
break;
|
|
120
|
+
}
|
|
121
|
+
case 'agentuity.objectstore.delete': {
|
|
122
|
+
if (result.response.status === 404) {
|
|
123
|
+
span?.addEvent('not_found', { deleted: false });
|
|
124
|
+
}
|
|
125
|
+
else if (result.response.ok) {
|
|
126
|
+
span?.addEvent('deleted', { deleted: true });
|
|
127
|
+
}
|
|
128
|
+
break;
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
},
|
|
132
|
+
}, logger);
|
|
133
|
+
let kv;
|
|
134
|
+
let objectStore;
|
|
135
|
+
let stream;
|
|
136
|
+
let vector;
|
|
137
|
+
let session;
|
|
138
|
+
let thread;
|
|
139
|
+
let sessionEvent;
|
|
140
|
+
let evalRunEvent;
|
|
141
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
142
|
+
let localRouter = null;
|
|
143
|
+
export function createServices(logger, config, serverUrl) {
|
|
144
|
+
const authenticated = isAuthenticated();
|
|
145
|
+
const useLocal = config?.services?.useLocal ?? false;
|
|
146
|
+
adapter = createFetchAdapter(logger);
|
|
147
|
+
// Use local services if explicitly requested OR if not authenticated
|
|
148
|
+
const shouldUseLocal = useLocal || !authenticated || process.env.AGENTUITY_FORCE_LOCAL_SERVICES === 'true';
|
|
149
|
+
if (shouldUseLocal) {
|
|
150
|
+
const db = getLocalDB();
|
|
151
|
+
const projectPath = normalizeProjectPath();
|
|
152
|
+
if (!serverUrl) {
|
|
153
|
+
throw new Error('serverUrl is required when using local services');
|
|
154
|
+
}
|
|
155
|
+
logger.info('Using local services (development only)');
|
|
156
|
+
kv = config?.services?.keyvalue || new LocalKeyValueStorage(db, projectPath);
|
|
157
|
+
objectStore = config?.services?.object || new LocalObjectStorage(db, projectPath, serverUrl);
|
|
158
|
+
stream = config?.services?.stream || new LocalStreamStorage(db, projectPath, serverUrl);
|
|
159
|
+
vector = config?.services?.vector || new LocalVectorStorage(db, projectPath);
|
|
160
|
+
session = config?.services?.session || new DefaultSessionProvider();
|
|
161
|
+
thread = config?.services?.thread || new DefaultThreadProvider();
|
|
162
|
+
sessionEvent = config?.services?.sessionEvent
|
|
163
|
+
? new CompositeSessionEventProvider(new LocalSessionEventProvider(), config.services.sessionEvent)
|
|
164
|
+
: new LocalSessionEventProvider();
|
|
165
|
+
evalRunEvent = config?.services?.evalRunEvent
|
|
166
|
+
? new CompositeEvalRunEventProvider(new LocalEvalRunEventProvider(), config.services.evalRunEvent)
|
|
167
|
+
: new LocalEvalRunEventProvider();
|
|
168
|
+
localRouter = createLocalStorageRouter(db, projectPath);
|
|
169
|
+
return { localRouter };
|
|
170
|
+
}
|
|
171
|
+
// Reset local router if not using local services
|
|
172
|
+
localRouter = null;
|
|
173
|
+
// At this point we must be authenticated (since !authenticated would trigger local services above)
|
|
174
|
+
kv = config?.services?.keyvalue || new KeyValueStorageService(kvBaseUrl, adapter);
|
|
175
|
+
objectStore = config?.services?.object || new ObjectStorageService(objectBaseUrl, adapter);
|
|
176
|
+
stream = config?.services?.stream || new StreamStorageService(streamBaseUrl, adapter);
|
|
177
|
+
vector = config?.services?.vector || new VectorStorageService(vectorBaseUrl, adapter);
|
|
178
|
+
session = config?.services?.session || new DefaultSessionProvider();
|
|
179
|
+
thread = config?.services?.thread || new DefaultThreadProvider();
|
|
180
|
+
// FIXME: this is turned off for now for production until we have the new changes deployed
|
|
181
|
+
sessionEvent =
|
|
182
|
+
isProduction() && process.env.AGENTUITY_CLOUD_EXPORT_DIR
|
|
183
|
+
? new JSONSessionEventProvider(process.env.AGENTUITY_CLOUD_EXPORT_DIR)
|
|
184
|
+
: new HTTPSessionEventProvider(new APIClient(catalystBaseUrl, logger), logger);
|
|
185
|
+
new LocalSessionEventProvider();
|
|
186
|
+
if (config?.services?.sessionEvent) {
|
|
187
|
+
sessionEvent = new CompositeSessionEventProvider(sessionEvent, config.services.sessionEvent);
|
|
188
|
+
}
|
|
189
|
+
// FIXME: this is turned off for now for production until we have the new changes deployed
|
|
190
|
+
evalRunEvent =
|
|
191
|
+
isProduction() && process.env.AGENTUITY_CLOUD_EXPORT_DIR
|
|
192
|
+
? new JSONEvalRunEventProvider(process.env.AGENTUITY_CLOUD_EXPORT_DIR)
|
|
193
|
+
: new HTTPEvalRunEventProvider(new APIClient(catalystBaseUrl, logger), logger, catalystBaseUrl);
|
|
194
|
+
new LocalEvalRunEventProvider();
|
|
195
|
+
if (config?.services?.evalRunEvent) {
|
|
196
|
+
evalRunEvent = new CompositeEvalRunEventProvider(evalRunEvent, config.services.evalRunEvent);
|
|
197
|
+
}
|
|
198
|
+
return {};
|
|
199
|
+
}
|
|
200
|
+
export function getThreadProvider() {
|
|
201
|
+
return thread;
|
|
202
|
+
}
|
|
203
|
+
export function getSessionProvider() {
|
|
204
|
+
return session;
|
|
205
|
+
}
|
|
206
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
207
|
+
export function getLocalRouter() {
|
|
208
|
+
return localRouter;
|
|
209
|
+
}
|
|
210
|
+
export function getSessionEventProvider() {
|
|
211
|
+
return sessionEvent;
|
|
212
|
+
}
|
|
213
|
+
export function getEvalRunEventProvider() {
|
|
214
|
+
return evalRunEvent;
|
|
215
|
+
}
|
|
216
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
217
|
+
export function registerServices(o, includeAgents = false) {
|
|
218
|
+
Object.defineProperty(o, 'kv', {
|
|
219
|
+
get: () => kv,
|
|
220
|
+
enumerable: false,
|
|
221
|
+
configurable: false,
|
|
222
|
+
});
|
|
223
|
+
Object.defineProperty(o, 'objectstore', {
|
|
224
|
+
get: () => objectStore,
|
|
225
|
+
enumerable: false,
|
|
226
|
+
configurable: false,
|
|
227
|
+
});
|
|
228
|
+
Object.defineProperty(o, 'stream', {
|
|
229
|
+
get: () => stream,
|
|
230
|
+
enumerable: false,
|
|
231
|
+
configurable: false,
|
|
232
|
+
});
|
|
233
|
+
Object.defineProperty(o, 'vector', {
|
|
234
|
+
get: () => vector,
|
|
235
|
+
enumerable: false,
|
|
236
|
+
configurable: false,
|
|
237
|
+
});
|
|
238
|
+
// Also register agent registry if requested
|
|
239
|
+
if (includeAgents) {
|
|
240
|
+
// Cache the populated registry to avoid re-creating on every access
|
|
241
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
242
|
+
let cachedRegistry;
|
|
243
|
+
Object.defineProperty(o, 'agent', {
|
|
244
|
+
get: () => {
|
|
245
|
+
if (!cachedRegistry) {
|
|
246
|
+
// Lazy-load to avoid circular dependency
|
|
247
|
+
// eslint-disable-next-line @typescript-eslint/no-require-imports
|
|
248
|
+
const { populateAgentsRegistry } = require('./agent');
|
|
249
|
+
cachedRegistry = populateAgentsRegistry(o);
|
|
250
|
+
}
|
|
251
|
+
return cachedRegistry;
|
|
252
|
+
},
|
|
253
|
+
enumerable: false,
|
|
254
|
+
configurable: false,
|
|
255
|
+
});
|
|
256
|
+
}
|
|
257
|
+
}
|
|
258
|
+
//# sourceMappingURL=_services.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_services.js","sourceRoot":"","sources":["../src/_services.ts"],"names":[],"mappings":"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"}
|
package/dist/_tokens.js
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import { inAgentContext, inHTTPContext, getHTTPContext } from './_context';
|
|
2
|
+
import { SpanAttributes } from '@traceloop/ai-semantic-conventions';
|
|
3
|
+
import { addSpanProcessor } from './_server';
|
|
4
|
+
export const TOKENS_HEADER = 'x-agentuity-tokens';
|
|
5
|
+
const AI_SDK_SPAN_NAME = 'ai.generateText';
|
|
6
|
+
const AI_SDK_MODEL_NAME = 'ai.model.id';
|
|
7
|
+
const AI_SDK_USAGE_PROMPT_TOKENS = 'ai.usage.promptTokens';
|
|
8
|
+
const AI_SDK_USAGE_COMPLETION_TOKENS = 'ai.usage.completionTokens';
|
|
9
|
+
const parseTokenHeader = (val) => {
|
|
10
|
+
const kv = new Map();
|
|
11
|
+
if (val) {
|
|
12
|
+
// format is: [model]:[count] [model:count]
|
|
13
|
+
const tok = val.split(' ');
|
|
14
|
+
for (const entry of tok) {
|
|
15
|
+
const [name, count] = entry.split(':');
|
|
16
|
+
if (name) {
|
|
17
|
+
kv.set(name, parseInt(count ?? '0') ?? 0);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
return kv;
|
|
22
|
+
};
|
|
23
|
+
const serializeTokenHeader = (kv) => {
|
|
24
|
+
const lines = [];
|
|
25
|
+
for (const [k, v] of kv) {
|
|
26
|
+
lines.push(`${k}:${v}`);
|
|
27
|
+
}
|
|
28
|
+
return lines.join(' ');
|
|
29
|
+
};
|
|
30
|
+
const getTokenValue = (val) => {
|
|
31
|
+
if (val) {
|
|
32
|
+
const v = val.valueOf();
|
|
33
|
+
switch (typeof v) {
|
|
34
|
+
case 'number':
|
|
35
|
+
return v;
|
|
36
|
+
case 'string':
|
|
37
|
+
return parseInt(v, 10);
|
|
38
|
+
default:
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
return 0;
|
|
42
|
+
};
|
|
43
|
+
class TokenSpanProcessor {
|
|
44
|
+
onStart(_span, _context) {
|
|
45
|
+
return;
|
|
46
|
+
}
|
|
47
|
+
onEnd(span) {
|
|
48
|
+
if (inAgentContext() && inHTTPContext()) {
|
|
49
|
+
const ctx = getHTTPContext();
|
|
50
|
+
const tokenLine = ctx.res.headers.get(TOKENS_HEADER) ?? undefined;
|
|
51
|
+
const tokens = parseTokenHeader(tokenLine);
|
|
52
|
+
let mutated = false;
|
|
53
|
+
// this is AI SDK which doesn't seem to use the semantic attribute names
|
|
54
|
+
if (span.name === AI_SDK_SPAN_NAME && AI_SDK_MODEL_NAME in span.attributes) {
|
|
55
|
+
const model = span.attributes[AI_SDK_MODEL_NAME].toString();
|
|
56
|
+
let totalTokens = tokens.get(model) ?? 0;
|
|
57
|
+
if (AI_SDK_USAGE_PROMPT_TOKENS in span.attributes) {
|
|
58
|
+
totalTokens += getTokenValue(span.attributes[AI_SDK_USAGE_PROMPT_TOKENS]);
|
|
59
|
+
}
|
|
60
|
+
if (AI_SDK_USAGE_COMPLETION_TOKENS in span.attributes) {
|
|
61
|
+
totalTokens += getTokenValue(span.attributes[AI_SDK_USAGE_COMPLETION_TOKENS]);
|
|
62
|
+
}
|
|
63
|
+
if (totalTokens > 0) {
|
|
64
|
+
tokens.set(model, totalTokens);
|
|
65
|
+
mutated = true;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
else if (SpanAttributes.LLM_SYSTEM in span.attributes &&
|
|
69
|
+
SpanAttributes.LLM_RESPONSE_MODEL in span.attributes) {
|
|
70
|
+
const model = span.attributes[SpanAttributes.LLM_RESPONSE_MODEL].toString();
|
|
71
|
+
let totalTokens = tokens.get(model) ?? 0;
|
|
72
|
+
if (SpanAttributes.LLM_USAGE_PROMPT_TOKENS in span.attributes) {
|
|
73
|
+
totalTokens += getTokenValue(span.attributes[SpanAttributes.LLM_USAGE_PROMPT_TOKENS]);
|
|
74
|
+
}
|
|
75
|
+
if (SpanAttributes.LLM_USAGE_COMPLETION_TOKENS in span.attributes) {
|
|
76
|
+
totalTokens += getTokenValue(span.attributes[SpanAttributes.LLM_USAGE_COMPLETION_TOKENS]);
|
|
77
|
+
}
|
|
78
|
+
if (totalTokens > 0) {
|
|
79
|
+
tokens.set(model, totalTokens);
|
|
80
|
+
mutated = true;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
if (mutated) {
|
|
84
|
+
ctx.header(TOKENS_HEADER, serializeTokenHeader(tokens));
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
forceFlush() {
|
|
89
|
+
return Promise.resolve();
|
|
90
|
+
}
|
|
91
|
+
shutdown() {
|
|
92
|
+
return Promise.resolve();
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
export default function register() {
|
|
96
|
+
addSpanProcessor(new TokenSpanProcessor());
|
|
97
|
+
}
|
|
98
|
+
//# sourceMappingURL=_tokens.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_tokens.js","sourceRoot":"","sources":["../src/_tokens.ts"],"names":[],"mappings":"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"}
|
package/dist/_util.js
ADDED
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
export function returnResponse(ctx, result) {
|
|
2
|
+
if (result instanceof ReadableStream)
|
|
3
|
+
return ctx.body(result);
|
|
4
|
+
if (result instanceof Response)
|
|
5
|
+
return result;
|
|
6
|
+
if (typeof result === 'string')
|
|
7
|
+
return ctx.text(result);
|
|
8
|
+
if (typeof result === 'number' || typeof result === 'boolean')
|
|
9
|
+
return ctx.text(String(result));
|
|
10
|
+
return ctx.json(result);
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* SHA256 hash of the given values
|
|
14
|
+
*
|
|
15
|
+
* @param val one or more strings to hash
|
|
16
|
+
* @returns hash string in hex format
|
|
17
|
+
*/
|
|
18
|
+
export function hash(...val) {
|
|
19
|
+
const hasher = new Bun.CryptoHasher('sha256');
|
|
20
|
+
val.map((val) => hasher.update(val));
|
|
21
|
+
return hasher.digest().toHex();
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Safely stringify an object to JSON, handling circular references
|
|
25
|
+
* @param obj - The object to stringify
|
|
26
|
+
* @returns JSON string representation
|
|
27
|
+
*/
|
|
28
|
+
export function safeStringify(obj) {
|
|
29
|
+
const stack = [];
|
|
30
|
+
function replacer(_key, value) {
|
|
31
|
+
if (typeof value === 'bigint') {
|
|
32
|
+
return value.toString();
|
|
33
|
+
}
|
|
34
|
+
if (typeof value === 'object' && value !== null) {
|
|
35
|
+
// Check if this object is already in our ancestor chain
|
|
36
|
+
if (stack.includes(value)) {
|
|
37
|
+
return '[Circular]';
|
|
38
|
+
}
|
|
39
|
+
// Add to stack before processing
|
|
40
|
+
stack.push(value);
|
|
41
|
+
// Process the object
|
|
42
|
+
const result = Array.isArray(value) ? [] : {};
|
|
43
|
+
for (const [k, v] of Object.entries(value)) {
|
|
44
|
+
result[k] = replacer(k, v);
|
|
45
|
+
}
|
|
46
|
+
// Remove from stack after processing
|
|
47
|
+
stack.pop();
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
return value;
|
|
51
|
+
}
|
|
52
|
+
return JSON.stringify(replacer('', obj));
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=_util.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_util.js","sourceRoot":"","sources":["../src/_util.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,cAAc,CAAC,GAAY,EAAE,MAAe;IAC3D,IAAI,MAAM,YAAY,cAAc;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9D,IAAI,MAAM,YAAY,QAAQ;QAAE,OAAO,MAAM,CAAC;IAC9C,IAAI,OAAO,MAAM,KAAK,QAAQ;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxD,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,OAAO,MAAM,KAAK,SAAS;QAAE,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC;IAC/F,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AACzB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,IAAI,CAAC,GAAG,GAAa;IACpC,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC,CAAC;IAC9C,GAAG,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE,CAAC;AAChC,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,aAAa,CAAC,GAAY;IACzC,MAAM,KAAK,GAAc,EAAE,CAAC;IAE5B,SAAS,QAAQ,CAAC,IAAY,EAAE,KAAc;QAC7C,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,OAAO,KAAK,CAAC,QAAQ,EAAE,CAAC;QACzB,CAAC;QAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;YACjD,wDAAwD;YACxD,IAAI,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3B,OAAO,YAAY,CAAC;YACrB,CAAC;YAED,iCAAiC;YACjC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAElB,qBAAqB;YACrB,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YAE9C,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC3C,MAAkC,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YACzD,CAAC;YAED,qCAAqC;YACrC,KAAK,CAAC,GAAG,EAAE,CAAC;YAEZ,OAAO,MAAM,CAAC;QACf,CAAC;QAED,OAAO,KAAK,CAAC;IACd,CAAC;IAED,OAAO,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1C,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { context, SpanStatusCode, trace } from '@opentelemetry/api';
|
|
2
|
+
import { internal } from './logger/internal';
|
|
3
|
+
let running = 0;
|
|
4
|
+
/**
|
|
5
|
+
* returns true if wait until is pending
|
|
6
|
+
* @returns boolean
|
|
7
|
+
*/
|
|
8
|
+
export function hasWaitUntilPending() {
|
|
9
|
+
internal.debug('hasWaitUntilPending called: %d', running);
|
|
10
|
+
return running > 0;
|
|
11
|
+
}
|
|
12
|
+
export default class WaitUntilHandler {
|
|
13
|
+
promises;
|
|
14
|
+
tracer;
|
|
15
|
+
started;
|
|
16
|
+
hasCalledWaitUntilAll = false;
|
|
17
|
+
constructor(tracer) {
|
|
18
|
+
this.tracer = tracer;
|
|
19
|
+
this.promises = [];
|
|
20
|
+
}
|
|
21
|
+
waitUntil(promise) {
|
|
22
|
+
if (this.hasCalledWaitUntilAll) {
|
|
23
|
+
throw new Error('Cannot call waitUntil after waitUntilAll has been called');
|
|
24
|
+
}
|
|
25
|
+
running++;
|
|
26
|
+
internal.debug('wait until called, running: %d', running);
|
|
27
|
+
const currentContext = context.active();
|
|
28
|
+
// Start execution immediately, don't defer it
|
|
29
|
+
const executingPromise = (async () => {
|
|
30
|
+
if (this.started === undefined) {
|
|
31
|
+
this.started = Date.now(); /// this first execution marks the start time
|
|
32
|
+
}
|
|
33
|
+
const span = this.tracer.startSpan('waitUntil', {}, currentContext);
|
|
34
|
+
const spanContext = trace.setSpan(currentContext, span);
|
|
35
|
+
try {
|
|
36
|
+
internal.debug('starting waituntil');
|
|
37
|
+
await context.with(spanContext, async () => {
|
|
38
|
+
const resolvedPromise = typeof promise === 'function' ? promise() : promise;
|
|
39
|
+
return await Promise.resolve(resolvedPromise);
|
|
40
|
+
});
|
|
41
|
+
internal.debug('completed waituntil');
|
|
42
|
+
span.setStatus({ code: SpanStatusCode.OK });
|
|
43
|
+
}
|
|
44
|
+
catch (ex) {
|
|
45
|
+
span.recordException(ex);
|
|
46
|
+
span.setStatus({ code: SpanStatusCode.ERROR });
|
|
47
|
+
throw ex;
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
span.end();
|
|
51
|
+
}
|
|
52
|
+
// NOTE: we only decrement when the promise is removed from the array in waitUntilAll
|
|
53
|
+
})();
|
|
54
|
+
// Store the executing promise for cleanup tracking
|
|
55
|
+
this.promises.push(executingPromise);
|
|
56
|
+
}
|
|
57
|
+
hasPending() {
|
|
58
|
+
return this.promises.length > 0;
|
|
59
|
+
}
|
|
60
|
+
async waitUntilAll(logger, sessionId) {
|
|
61
|
+
internal.debug(`🔍 waitUntilAll() called for session ${sessionId} (count: %d)`, running);
|
|
62
|
+
if (this.hasCalledWaitUntilAll) {
|
|
63
|
+
throw new Error('waitUntilAll can only be called once per instance');
|
|
64
|
+
}
|
|
65
|
+
this.hasCalledWaitUntilAll = true;
|
|
66
|
+
if (this.promises.length === 0) {
|
|
67
|
+
internal.debug('No promises to wait for, executing evals directly');
|
|
68
|
+
// await this.executeEvalsForSession(logger, sessionId);
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
internal.debug(`⏳ Waiting for ${this.promises.length} promises to complete...`);
|
|
72
|
+
try {
|
|
73
|
+
// Promises are already executing, just wait for them to complete
|
|
74
|
+
await Promise.all(this.promises);
|
|
75
|
+
const duration = Date.now() - this.started;
|
|
76
|
+
internal.debug('✅ All promises completed, marking session completed (duration %dms)', duration);
|
|
77
|
+
}
|
|
78
|
+
catch (ex) {
|
|
79
|
+
logger.error('error sending session completed', ex);
|
|
80
|
+
}
|
|
81
|
+
finally {
|
|
82
|
+
running -= this.promises.length;
|
|
83
|
+
this.promises.length = 0;
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=_waituntil.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"_waituntil.js","sourceRoot":"","sources":["../src/_waituntil.ts"],"names":[],"mappings":"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"}
|