lightrace 0.1.2 → 0.1.3
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/client.d.ts +27 -4
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +100 -34
- package/dist/client.js.map +1 -1
- package/dist/context.d.ts +35 -0
- package/dist/context.d.ts.map +1 -0
- package/dist/context.js +67 -0
- package/dist/context.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/integrations/langchain.d.ts +5 -4
- package/dist/integrations/langchain.d.ts.map +1 -1
- package/dist/integrations/langchain.js +93 -80
- package/dist/integrations/langchain.js.map +1 -1
- package/dist/observation.d.ts +6 -4
- package/dist/observation.d.ts.map +1 -1
- package/dist/observation.js +27 -36
- package/dist/observation.js.map +1 -1
- package/dist/otel-exporter.d.ts +39 -0
- package/dist/otel-exporter.d.ts.map +1 -0
- package/dist/otel-exporter.js +70 -0
- package/dist/otel-exporter.js.map +1 -0
- package/dist/tool-client.d.ts +14 -0
- package/dist/tool-client.d.ts.map +1 -1
- package/dist/tool-client.js +76 -25
- package/dist/tool-client.js.map +1 -1
- package/dist/trace.d.ts +10 -12
- package/dist/trace.d.ts.map +1 -1
- package/dist/trace.js +135 -103
- package/dist/trace.js.map +1 -1
- package/dist/types.d.ts +1 -0
- package/dist/types.d.ts.map +1 -1
- package/package.json +4 -1
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
import { BasicTracerProvider, BatchSpanProcessor } from "@opentelemetry/sdk-trace-base";
|
|
2
|
+
import { OTLPTraceExporter } from "@opentelemetry/exporter-trace-otlp-http";
|
|
3
|
+
// Lightrace OTel span attribute keys — trace-level
|
|
4
|
+
export const TRACE_NAME = "lightrace.trace.name";
|
|
5
|
+
export const TRACE_USER_ID = "lightrace.trace.user_id";
|
|
6
|
+
export const TRACE_SESSION_ID = "lightrace.trace.session_id";
|
|
7
|
+
export const TRACE_TAGS = "lightrace.trace.tags";
|
|
8
|
+
export const TRACE_PUBLIC = "lightrace.trace.public";
|
|
9
|
+
export const TRACE_METADATA = "lightrace.trace.metadata";
|
|
10
|
+
export const TRACE_INPUT = "lightrace.trace.input";
|
|
11
|
+
export const TRACE_OUTPUT = "lightrace.trace.output";
|
|
12
|
+
// Lightrace OTel span attribute keys — observation-level
|
|
13
|
+
export const OBSERVATION_TYPE = "lightrace.observation.type";
|
|
14
|
+
export const OBSERVATION_METADATA = "lightrace.observation.metadata";
|
|
15
|
+
export const OBSERVATION_LEVEL = "lightrace.observation.level";
|
|
16
|
+
export const OBSERVATION_STATUS_MESSAGE = "lightrace.observation.status_message";
|
|
17
|
+
export const OBSERVATION_INPUT = "lightrace.observation.input";
|
|
18
|
+
export const OBSERVATION_OUTPUT = "lightrace.observation.output";
|
|
19
|
+
export const OBSERVATION_COMPLETION_START_TIME = "lightrace.observation.completion_start_time";
|
|
20
|
+
export const OBSERVATION_MODEL = "lightrace.observation.model";
|
|
21
|
+
export const OBSERVATION_MODEL_PARAMETERS = "lightrace.observation.model_parameters";
|
|
22
|
+
export const OBSERVATION_USAGE_DETAILS = "lightrace.observation.usage_details";
|
|
23
|
+
export const OBSERVATION_COST_DETAILS = "lightrace.observation.cost_details";
|
|
24
|
+
// Internal / meta
|
|
25
|
+
export const RELEASE = "lightrace.release";
|
|
26
|
+
export const VERSION = "lightrace.version";
|
|
27
|
+
export const AS_ROOT = "lightrace.internal.as_root";
|
|
28
|
+
export function safeJson(value) {
|
|
29
|
+
if (value === null || value === undefined)
|
|
30
|
+
return "";
|
|
31
|
+
if (typeof value === "string")
|
|
32
|
+
return value;
|
|
33
|
+
try {
|
|
34
|
+
return JSON.stringify(value);
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return String(value);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
export class LightraceOtelExporter {
|
|
41
|
+
provider;
|
|
42
|
+
_tracer;
|
|
43
|
+
constructor(options) {
|
|
44
|
+
const host = options.host.replace(/\/$/, "");
|
|
45
|
+
const auth = Buffer.from(`${options.publicKey}:${options.secretKey}`).toString("base64");
|
|
46
|
+
const exporter = new OTLPTraceExporter({
|
|
47
|
+
url: `${host}/api/public/otel/v1/traces`,
|
|
48
|
+
headers: { Authorization: `Basic ${auth}` },
|
|
49
|
+
});
|
|
50
|
+
this.provider = new BasicTracerProvider({
|
|
51
|
+
spanProcessors: [
|
|
52
|
+
new BatchSpanProcessor(exporter, {
|
|
53
|
+
scheduledDelayMillis: options.flushIntervalMs ?? 5000,
|
|
54
|
+
maxExportBatchSize: options.maxExportBatchSize ?? 50,
|
|
55
|
+
}),
|
|
56
|
+
],
|
|
57
|
+
});
|
|
58
|
+
this._tracer = this.provider.getTracer("lightrace-js", "0.2.0");
|
|
59
|
+
}
|
|
60
|
+
get tracer() {
|
|
61
|
+
return this._tracer;
|
|
62
|
+
}
|
|
63
|
+
flush() {
|
|
64
|
+
this.provider.forceFlush();
|
|
65
|
+
}
|
|
66
|
+
async shutdown() {
|
|
67
|
+
await this.provider.shutdown();
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=otel-exporter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"otel-exporter.js","sourceRoot":"","sources":["../src/otel-exporter.ts"],"names":[],"mappings":"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"}
|
package/dist/tool-client.d.ts
CHANGED
|
@@ -1,3 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Get the state passed with the current tool invocation.
|
|
3
|
+
* Returns undefined if not in an invocation context or no state was provided.
|
|
4
|
+
*/
|
|
5
|
+
export declare function getInvokeState(): unknown;
|
|
1
6
|
export declare class ToolClient {
|
|
2
7
|
private host;
|
|
3
8
|
private publicKey;
|
|
@@ -27,6 +32,15 @@ export declare class ToolClient {
|
|
|
27
32
|
private handleMessage;
|
|
28
33
|
private registerTools;
|
|
29
34
|
private startHeartbeat;
|
|
35
|
+
/**
|
|
36
|
+
* Handle an invoke message. Validates signature and nonce, then fires off
|
|
37
|
+
* isolated execution without blocking the WS message handler.
|
|
38
|
+
*/
|
|
30
39
|
private handleInvoke;
|
|
40
|
+
/**
|
|
41
|
+
* Execute a tool invocation in isolation with a timeout.
|
|
42
|
+
* Runs outside the WS message handler so heartbeats continue flowing.
|
|
43
|
+
*/
|
|
44
|
+
private executeToolIsolated;
|
|
31
45
|
}
|
|
32
46
|
//# sourceMappingURL=tool-client.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-client.d.ts","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tool-client.d.ts","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"AAkBA;;;GAGG;AACH,wBAAgB,cAAc,IAAI,OAAO,CAExC;AAED,qBAAa,UAAU;IACrB,OAAO,CAAC,IAAI,CAAS;IACrB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,aAAa,CAAS;IAC9B,OAAO,CAAC,iBAAiB,CAAS;IAClC,OAAO,CAAC,iBAAiB,CAAS;IAElC,OAAO,CAAC,YAAY,CAAuB;IAC3C,OAAO,CAAC,YAAY,CAAwB;IAC5C,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,EAAE,CAA0B;IACpC,OAAO,CAAC,cAAc,CAA8C;IACpE,OAAO,CAAC,cAAc,CAA+C;gBAEzD,OAAO,EAAE;QACnB,IAAI,EAAE,MAAM,CAAC;QACb,SAAS,EAAE,MAAM,CAAC;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,iBAAiB,CAAC,EAAE,MAAM,CAAC;QAC3B,iBAAiB,CAAC,EAAE,MAAM,CAAC;KAC5B;IASD,OAAO,KAAK,KAAK,GAIhB;IAED,KAAK,IAAI,IAAI;IAQb,IAAI,IAAI,IAAI;IAUZ,OAAO,CAAC,OAAO;IAmCf,OAAO,CAAC,OAAO;IASf,OAAO,CAAC,aAAa;IAyBrB,OAAO,CAAC,aAAa;IAgBrB,OAAO,CAAC,cAAc;IAQtB;;;OAGG;IACH,OAAO,CAAC,YAAY;IAwCpB;;;OAGG;YACW,mBAAmB;CAyElC"}
|
package/dist/tool-client.js
CHANGED
|
@@ -1,11 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* WebSocket client for remote tool invocation.
|
|
3
|
+
*
|
|
4
|
+
* Tool execution is isolated: handleInvoke fires-and-forgets so the WS
|
|
5
|
+
* message handler is never blocked, allowing heartbeats to continue.
|
|
3
6
|
*/
|
|
7
|
+
import { AsyncLocalStorage } from "node:async_hooks";
|
|
4
8
|
import WebSocket from "ws";
|
|
5
9
|
import { _getToolRegistry } from "./trace.js";
|
|
6
10
|
import { generateId } from "./utils.js";
|
|
11
|
+
import { restoreContext } from "./context.js";
|
|
7
12
|
import { sign, verify, NonceTracker } from "./security.js";
|
|
8
13
|
import { jsonSerializable } from "./utils.js";
|
|
14
|
+
/** AsyncLocalStorage for invoke state -- tools can access via getInvokeState(). */
|
|
15
|
+
const invokeStateStorage = new AsyncLocalStorage();
|
|
16
|
+
/**
|
|
17
|
+
* Get the state passed with the current tool invocation.
|
|
18
|
+
* Returns undefined if not in an invocation context or no state was provided.
|
|
19
|
+
*/
|
|
20
|
+
export function getInvokeState() {
|
|
21
|
+
return invokeStateStorage.getStore();
|
|
22
|
+
}
|
|
9
23
|
export class ToolClient {
|
|
10
24
|
host;
|
|
11
25
|
publicKey;
|
|
@@ -125,8 +139,12 @@ export class ToolClient {
|
|
|
125
139
|
}
|
|
126
140
|
}, this.heartbeatInterval);
|
|
127
141
|
}
|
|
128
|
-
|
|
129
|
-
|
|
142
|
+
/**
|
|
143
|
+
* Handle an invoke message. Validates signature and nonce, then fires off
|
|
144
|
+
* isolated execution without blocking the WS message handler.
|
|
145
|
+
*/
|
|
146
|
+
handleInvoke(ws, msg) {
|
|
147
|
+
const { nonce, tool, input, state, signature: sig } = msg;
|
|
130
148
|
// Verify HMAC
|
|
131
149
|
if (!this.sessionToken || !verify(this.sessionToken, nonce, tool, input, sig)) {
|
|
132
150
|
ws.send(JSON.stringify({ type: "error", message: "Invalid signature" }));
|
|
@@ -150,36 +168,69 @@ export class ToolClient {
|
|
|
150
168
|
}));
|
|
151
169
|
return;
|
|
152
170
|
}
|
|
171
|
+
// Fire and forget -- don't block the WS message handler
|
|
172
|
+
this.executeToolIsolated(ws, nonce, tool, input, state, entry).catch((err) => console.error("[lightrace] Tool execution error:", err));
|
|
173
|
+
}
|
|
174
|
+
/**
|
|
175
|
+
* Execute a tool invocation in isolation with a timeout.
|
|
176
|
+
* Runs outside the WS message handler so heartbeats continue flowing.
|
|
177
|
+
*/
|
|
178
|
+
async executeToolIsolated(ws, nonce, tool, input, state, entry) {
|
|
179
|
+
// Restore registered context variables from __lightrace_context
|
|
180
|
+
const contextData = state &&
|
|
181
|
+
typeof state === "object" &&
|
|
182
|
+
"__lightrace_context" in state
|
|
183
|
+
? state.__lightrace_context
|
|
184
|
+
: {};
|
|
185
|
+
if (contextData && typeof contextData === "object") {
|
|
186
|
+
restoreContext(contextData);
|
|
187
|
+
}
|
|
153
188
|
const start = performance.now();
|
|
189
|
+
const timeoutMs = 30_000;
|
|
190
|
+
let timeoutId;
|
|
154
191
|
try {
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
192
|
+
const output = await Promise.race([
|
|
193
|
+
invokeStateStorage.run(state ?? null, async () => {
|
|
194
|
+
let result;
|
|
195
|
+
if (input && typeof input === "object" && !Array.isArray(input)) {
|
|
196
|
+
result = await entry.fn(input);
|
|
197
|
+
}
|
|
198
|
+
else {
|
|
199
|
+
result =
|
|
200
|
+
input !== null && input !== undefined ? await entry.fn(input) : await entry.fn();
|
|
201
|
+
}
|
|
202
|
+
return jsonSerializable(result);
|
|
203
|
+
}),
|
|
204
|
+
new Promise((_, reject) => {
|
|
205
|
+
timeoutId = setTimeout(() => reject(new Error("Tool execution timed out")), timeoutMs);
|
|
206
|
+
}),
|
|
207
|
+
]);
|
|
208
|
+
clearTimeout(timeoutId);
|
|
162
209
|
const durationMs = Math.round(performance.now() - start);
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
210
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
211
|
+
ws.send(JSON.stringify({
|
|
212
|
+
type: "result",
|
|
213
|
+
nonce,
|
|
214
|
+
output,
|
|
215
|
+
durationMs,
|
|
216
|
+
signature: sign(this.sessionToken, nonce, tool, output),
|
|
217
|
+
}));
|
|
218
|
+
}
|
|
171
219
|
}
|
|
172
220
|
catch (err) {
|
|
221
|
+
clearTimeout(timeoutId);
|
|
173
222
|
const durationMs = Math.round(performance.now() - start);
|
|
174
223
|
const error = err instanceof Error ? err.message : String(err);
|
|
175
|
-
ws.
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
224
|
+
if (ws.readyState === WebSocket.OPEN) {
|
|
225
|
+
ws.send(JSON.stringify({
|
|
226
|
+
type: "result",
|
|
227
|
+
nonce,
|
|
228
|
+
output: null,
|
|
229
|
+
error,
|
|
230
|
+
durationMs,
|
|
231
|
+
signature: sign(this.sessionToken, nonce, tool, null),
|
|
232
|
+
}));
|
|
233
|
+
}
|
|
183
234
|
}
|
|
184
235
|
}
|
|
185
236
|
}
|
package/dist/tool-client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tool-client.js","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"tool-client.js","sourceRoot":"","sources":["../src/tool-client.ts"],"names":[],"mappings":"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"}
|
package/dist/trace.d.ts
CHANGED
|
@@ -1,25 +1,23 @@
|
|
|
1
|
+
import type { LightraceOtelExporter } from "./otel-exporter.js";
|
|
1
2
|
import type { TraceOptions, ToolRegistryEntry } from "./types.js";
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
interface TraceContext {
|
|
5
|
-
traceId: string;
|
|
6
|
-
observationId: string | null;
|
|
7
|
-
}
|
|
8
|
-
export declare function _setExporter(exporter: BatchExporter | null): void;
|
|
3
|
+
export declare function _setOtelExporter(exporter: LightraceOtelExporter | null): void;
|
|
4
|
+
export declare function _getOtelExporter(): LightraceOtelExporter | null;
|
|
9
5
|
export declare function _setClientDefaults(defaults: {
|
|
10
6
|
userId?: string;
|
|
11
7
|
sessionId?: string;
|
|
12
8
|
}): void;
|
|
13
|
-
/** Get the current trace context
|
|
14
|
-
export declare function _getTraceContext():
|
|
9
|
+
/** Get the current trace context from OTel's active span. */
|
|
10
|
+
export declare function _getTraceContext(): {
|
|
11
|
+
traceId: string;
|
|
12
|
+
observationId: string | null;
|
|
13
|
+
} | undefined;
|
|
15
14
|
export declare function _getToolRegistry(): Map<string, ToolRegistryEntry>;
|
|
16
15
|
/**
|
|
17
16
|
* Unified trace wrapper.
|
|
18
17
|
*
|
|
19
18
|
* Signatures:
|
|
20
|
-
* trace(name, fn)
|
|
21
|
-
* trace(name, options, fn)
|
|
19
|
+
* trace(name, fn) -- root trace (no options)
|
|
20
|
+
* trace(name, options, fn) -- with options
|
|
22
21
|
*/
|
|
23
22
|
export declare function trace<T extends (...args: any[]) => any>(name: string, fnOrOptions: T | TraceOptions, maybeFn?: T): T;
|
|
24
|
-
export {};
|
|
25
23
|
//# sourceMappingURL=trace.d.ts.map
|
package/dist/trace.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"trace.d.ts","sourceRoot":"","sources":["../src/trace.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,oBAAoB,CAAC;AAEhE,OAAO,KAAK,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAalE,wBAAgB,gBAAgB,CAAC,QAAQ,EAAE,qBAAqB,GAAG,IAAI,GAAG,IAAI,CAE7E;AAED,wBAAgB,gBAAgB,IAAI,qBAAqB,GAAG,IAAI,CAE/D;AAED,wBAAgB,kBAAkB,CAAC,QAAQ,EAAE;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,SAAS,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,IAAI,CAE1F;AAED,6DAA6D;AAC7D,wBAAgB,gBAAgB,IAAI;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAA;CAAE,GAAG,SAAS,CAQhG;AAED,wBAAgB,gBAAgB,IAAI,GAAG,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAEjE;AAiDD;;;;;;GAMG;AACH,wBAAgB,KAAK,CAAC,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,GAAG,EACrD,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,CAAC,GAAG,YAAY,EAC7B,OAAO,CAAC,EAAE,CAAC,GACV,CAAC,CAkIH"}
|
package/dist/trace.js
CHANGED
|
@@ -1,35 +1,77 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Unified trace() wrapper for all observation types.
|
|
3
|
+
*
|
|
4
|
+
* Uses OpenTelemetry for trace/span context propagation and export.
|
|
3
5
|
*/
|
|
4
|
-
import {
|
|
5
|
-
import
|
|
6
|
-
import {
|
|
7
|
-
|
|
8
|
-
/** Global exporter reference (set by Client). */
|
|
9
|
-
let
|
|
6
|
+
import { trace as otelTrace } from "@opentelemetry/api";
|
|
7
|
+
import * as attrs from "./otel-exporter.js";
|
|
8
|
+
import { OBSERVATION_TYPE_ENUM } from "./types.js";
|
|
9
|
+
import { jsonSerializable, zodToJsonSchema } from "./utils.js";
|
|
10
|
+
/** Global OTel exporter reference (set by Client). */
|
|
11
|
+
let _otelExporter = null;
|
|
10
12
|
/** Client-level defaults (set by Client to avoid circular imports). */
|
|
11
13
|
let _clientDefaults = {};
|
|
12
14
|
/** Global tool registry for invocable tools. */
|
|
13
15
|
const _toolRegistry = new Map();
|
|
14
|
-
export function
|
|
15
|
-
|
|
16
|
+
export function _setOtelExporter(exporter) {
|
|
17
|
+
_otelExporter = exporter;
|
|
18
|
+
}
|
|
19
|
+
export function _getOtelExporter() {
|
|
20
|
+
return _otelExporter;
|
|
16
21
|
}
|
|
17
22
|
export function _setClientDefaults(defaults) {
|
|
18
23
|
_clientDefaults = defaults;
|
|
19
24
|
}
|
|
20
|
-
/** Get the current trace context
|
|
25
|
+
/** Get the current trace context from OTel's active span. */
|
|
21
26
|
export function _getTraceContext() {
|
|
22
|
-
|
|
27
|
+
const span = otelTrace.getActiveSpan();
|
|
28
|
+
if (!span)
|
|
29
|
+
return undefined;
|
|
30
|
+
const ctx = span.spanContext();
|
|
31
|
+
return {
|
|
32
|
+
traceId: ctx.traceId,
|
|
33
|
+
observationId: ctx.spanId,
|
|
34
|
+
};
|
|
23
35
|
}
|
|
24
36
|
export function _getToolRegistry() {
|
|
25
37
|
return _toolRegistry;
|
|
26
38
|
}
|
|
39
|
+
/** Helper to set span attributes for a root trace or child observation. */
|
|
40
|
+
function setSpanAttributes(span, opts) {
|
|
41
|
+
if (opts.isRoot) {
|
|
42
|
+
span.setAttribute(attrs.AS_ROOT, "true");
|
|
43
|
+
span.setAttribute(attrs.TRACE_NAME, opts.obsName);
|
|
44
|
+
span.setAttribute(attrs.TRACE_INPUT, attrs.safeJson(opts.input));
|
|
45
|
+
span.setAttribute(attrs.TRACE_OUTPUT, attrs.safeJson(opts.output));
|
|
46
|
+
if (opts.metadata)
|
|
47
|
+
span.setAttribute(attrs.TRACE_METADATA, attrs.safeJson(opts.metadata));
|
|
48
|
+
if (opts.userId)
|
|
49
|
+
span.setAttribute(attrs.TRACE_USER_ID, opts.userId);
|
|
50
|
+
if (opts.sessionId)
|
|
51
|
+
span.setAttribute(attrs.TRACE_SESSION_ID, opts.sessionId);
|
|
52
|
+
}
|
|
53
|
+
else {
|
|
54
|
+
span.setAttribute(attrs.OBSERVATION_TYPE, OBSERVATION_TYPE_ENUM[opts.obsType] ?? opts.obsType ?? "SPAN");
|
|
55
|
+
span.setAttribute(attrs.OBSERVATION_INPUT, attrs.safeJson(opts.input));
|
|
56
|
+
span.setAttribute(attrs.OBSERVATION_OUTPUT, attrs.safeJson(opts.output));
|
|
57
|
+
if (opts.metadata)
|
|
58
|
+
span.setAttribute(attrs.OBSERVATION_METADATA, attrs.safeJson(opts.metadata));
|
|
59
|
+
if (opts.model)
|
|
60
|
+
span.setAttribute(attrs.OBSERVATION_MODEL, opts.model);
|
|
61
|
+
span.setAttribute(attrs.OBSERVATION_LEVEL, opts.level);
|
|
62
|
+
if (opts.statusMessage)
|
|
63
|
+
span.setAttribute(attrs.OBSERVATION_STATUS_MESSAGE, opts.statusMessage);
|
|
64
|
+
if (opts.usage) {
|
|
65
|
+
span.setAttribute(attrs.OBSERVATION_USAGE_DETAILS, attrs.safeJson(opts.usage));
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
}
|
|
27
69
|
/**
|
|
28
70
|
* Unified trace wrapper.
|
|
29
71
|
*
|
|
30
72
|
* Signatures:
|
|
31
|
-
* trace(name, fn)
|
|
32
|
-
* trace(name, options, fn)
|
|
73
|
+
* trace(name, fn) -- root trace (no options)
|
|
74
|
+
* trace(name, options, fn) -- with options
|
|
33
75
|
*/
|
|
34
76
|
export function trace(name, fnOrOptions, maybeFn) {
|
|
35
77
|
let options;
|
|
@@ -60,101 +102,91 @@ export function trace(name, fnOrOptions, maybeFn) {
|
|
|
60
102
|
});
|
|
61
103
|
}
|
|
62
104
|
const wrapped = ((...args) => {
|
|
105
|
+
const tracer = _otelExporter?.tracer;
|
|
106
|
+
if (!tracer)
|
|
107
|
+
return fn(...args);
|
|
63
108
|
const isRoot = obsType === null;
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
if (usage.totalTokens !== undefined)
|
|
123
|
-
body.totalTokens = usage.totalTokens;
|
|
109
|
+
return tracer.startActiveSpan(obsName, (span) => {
|
|
110
|
+
const execute = () => {
|
|
111
|
+
try {
|
|
112
|
+
const capturedInput = jsonSerializable(args.length === 1 ? args[0] : args);
|
|
113
|
+
const result = fn(...args);
|
|
114
|
+
// Handle async functions
|
|
115
|
+
if (result && typeof result === "object" && typeof result.then === "function") {
|
|
116
|
+
return result.then((resolved) => {
|
|
117
|
+
setSpanAttributes(span, {
|
|
118
|
+
isRoot,
|
|
119
|
+
obsType,
|
|
120
|
+
obsName,
|
|
121
|
+
input: capturedInput,
|
|
122
|
+
output: jsonSerializable(resolved),
|
|
123
|
+
model,
|
|
124
|
+
metadata: staticMetadata,
|
|
125
|
+
level: "DEFAULT",
|
|
126
|
+
userId,
|
|
127
|
+
sessionId,
|
|
128
|
+
usage,
|
|
129
|
+
});
|
|
130
|
+
span.end();
|
|
131
|
+
return resolved;
|
|
132
|
+
}, (err) => {
|
|
133
|
+
setSpanAttributes(span, {
|
|
134
|
+
isRoot,
|
|
135
|
+
obsType,
|
|
136
|
+
obsName,
|
|
137
|
+
input: capturedInput,
|
|
138
|
+
output: null,
|
|
139
|
+
model,
|
|
140
|
+
metadata: staticMetadata,
|
|
141
|
+
level: "ERROR",
|
|
142
|
+
statusMessage: err.message,
|
|
143
|
+
userId,
|
|
144
|
+
sessionId,
|
|
145
|
+
usage,
|
|
146
|
+
});
|
|
147
|
+
span.end();
|
|
148
|
+
throw err;
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
// Sync result
|
|
152
|
+
setSpanAttributes(span, {
|
|
153
|
+
isRoot,
|
|
154
|
+
obsType,
|
|
155
|
+
obsName,
|
|
156
|
+
input: capturedInput,
|
|
157
|
+
output: jsonSerializable(result),
|
|
158
|
+
model,
|
|
159
|
+
metadata: staticMetadata,
|
|
160
|
+
level: "DEFAULT",
|
|
161
|
+
userId,
|
|
162
|
+
sessionId,
|
|
163
|
+
usage,
|
|
164
|
+
});
|
|
165
|
+
span.end();
|
|
166
|
+
return result;
|
|
124
167
|
}
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
emitEvent(resolved, "DEFAULT", null);
|
|
141
|
-
return resolved;
|
|
142
|
-
}, (err) => {
|
|
143
|
-
emitEvent(null, "ERROR", err.message ?? String(err));
|
|
144
|
-
throw err;
|
|
168
|
+
catch (err) {
|
|
169
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
170
|
+
setSpanAttributes(span, {
|
|
171
|
+
isRoot,
|
|
172
|
+
obsType,
|
|
173
|
+
obsName,
|
|
174
|
+
input: jsonSerializable(args.length === 1 ? args[0] : args),
|
|
175
|
+
output: null,
|
|
176
|
+
model,
|
|
177
|
+
metadata: staticMetadata,
|
|
178
|
+
level: "ERROR",
|
|
179
|
+
statusMessage: message,
|
|
180
|
+
userId,
|
|
181
|
+
sessionId,
|
|
182
|
+
usage,
|
|
145
183
|
});
|
|
184
|
+
span.end();
|
|
185
|
+
throw err;
|
|
146
186
|
}
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
}
|
|
151
|
-
catch (err) {
|
|
152
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
153
|
-
emitEvent(null, "ERROR", message);
|
|
154
|
-
throw err;
|
|
155
|
-
}
|
|
156
|
-
};
|
|
157
|
-
return asyncStorage.run(childCtx, execute);
|
|
187
|
+
};
|
|
188
|
+
return execute();
|
|
189
|
+
});
|
|
158
190
|
});
|
|
159
191
|
// Preserve function name
|
|
160
192
|
Object.defineProperty(wrapped, "name", { value: fn.name || name });
|