@execlave/sdk 1.0.2 → 1.1.0
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/README.md +14 -7
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -1
- package/dist/client.js.map +1 -1
- package/dist/errors.d.ts +17 -0
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +24 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/instrumentation/events.d.ts +35 -0
- package/dist/instrumentation/events.d.ts.map +1 -0
- package/dist/instrumentation/events.js +137 -0
- package/dist/instrumentation/events.js.map +1 -0
- package/dist/instrumentation/index.d.ts +11 -0
- package/dist/instrumentation/index.d.ts.map +1 -0
- package/dist/instrumentation/index.js +28 -0
- package/dist/instrumentation/index.js.map +1 -0
- package/dist/instrumentation/spans.d.ts +72 -0
- package/dist/instrumentation/spans.d.ts.map +1 -0
- package/dist/instrumentation/spans.js +136 -0
- package/dist/instrumentation/spans.js.map +1 -0
- package/dist/integrations/index.d.ts +12 -0
- package/dist/integrations/index.d.ts.map +1 -0
- package/dist/integrations/index.js +15 -0
- package/dist/integrations/index.js.map +1 -0
- package/dist/integrations/langchain.d.ts +90 -0
- package/dist/integrations/langchain.d.ts.map +1 -0
- package/dist/integrations/langchain.js +240 -0
- package/dist/integrations/langchain.js.map +1 -0
- package/package.json +38 -5
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Nested span primitives. Each `Span` wraps the SDK's `Trace` and
|
|
3
|
+
* carries parent/child identity through the trace metadata so the
|
|
4
|
+
* backend can reconstruct the execution tree.
|
|
5
|
+
*
|
|
6
|
+
* Concurrency model: Node.js is single-threaded, but async tasks can
|
|
7
|
+
* interleave. We expose `withSpan(span, fn)` so async framework
|
|
8
|
+
* adapters can scope the "current span" to a specific async operation
|
|
9
|
+
* without relying on AsyncLocalStorage (keeps footprint zero-dep).
|
|
10
|
+
* The default stack is process-wide; framework adapters can pass
|
|
11
|
+
* `parent` explicitly to avoid relying on the implicit stack.
|
|
12
|
+
*/
|
|
13
|
+
import { Trace } from '../trace';
|
|
14
|
+
import type { Execlave } from '../client';
|
|
15
|
+
export declare const SPAN_KIND_AGENT = "agent";
|
|
16
|
+
export declare const SPAN_KIND_CHAIN = "chain";
|
|
17
|
+
export declare const SPAN_KIND_LLM = "llm";
|
|
18
|
+
export declare const SPAN_KIND_TOOL = "tool";
|
|
19
|
+
export declare const SPAN_KIND_RETRIEVER = "retriever";
|
|
20
|
+
export declare const SPAN_KIND_GUARDRAIL = "guardrail";
|
|
21
|
+
export declare const SPAN_KIND_HANDOFF = "handoff";
|
|
22
|
+
export type SpanKind = typeof SPAN_KIND_AGENT | typeof SPAN_KIND_CHAIN | typeof SPAN_KIND_LLM | typeof SPAN_KIND_TOOL | typeof SPAN_KIND_RETRIEVER | typeof SPAN_KIND_GUARDRAIL | typeof SPAN_KIND_HANDOFF;
|
|
23
|
+
export interface StartSpanOptions {
|
|
24
|
+
kind: SpanKind;
|
|
25
|
+
name: string;
|
|
26
|
+
parent?: Span | null;
|
|
27
|
+
agentId?: string;
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
userId?: string;
|
|
30
|
+
metadata?: Record<string, unknown>;
|
|
31
|
+
}
|
|
32
|
+
export declare class Span {
|
|
33
|
+
readonly spanId: string;
|
|
34
|
+
readonly parentSpanId: string | null;
|
|
35
|
+
readonly kind: SpanKind;
|
|
36
|
+
readonly name: string;
|
|
37
|
+
private _trace;
|
|
38
|
+
private _tree;
|
|
39
|
+
private _finished;
|
|
40
|
+
constructor(trace: Trace, opts: {
|
|
41
|
+
spanId: string;
|
|
42
|
+
parentSpanId: string | null;
|
|
43
|
+
kind: SpanKind;
|
|
44
|
+
name: string;
|
|
45
|
+
tree: SpanTree;
|
|
46
|
+
});
|
|
47
|
+
/** Internal: exposed for nested spans to inherit trace id. */
|
|
48
|
+
get _innerTrace(): Trace;
|
|
49
|
+
/** Trace id that this span's metadata is attached to. */
|
|
50
|
+
get traceId(): string;
|
|
51
|
+
setInput(value: unknown): this;
|
|
52
|
+
setOutput(value: unknown): this;
|
|
53
|
+
setModel(model: string): this;
|
|
54
|
+
setTokens(prompt: number, completion: number): this;
|
|
55
|
+
setCost(costUsd: number): this;
|
|
56
|
+
addMetadata(meta: Record<string, unknown>): this;
|
|
57
|
+
child(opts: {
|
|
58
|
+
kind: SpanKind;
|
|
59
|
+
name: string;
|
|
60
|
+
}): Span;
|
|
61
|
+
finish(status?: 'success' | 'error' | 'timeout', errorMessage?: string, errorType?: string): void;
|
|
62
|
+
}
|
|
63
|
+
export declare class SpanTree {
|
|
64
|
+
private _exe;
|
|
65
|
+
private _stack;
|
|
66
|
+
constructor(_exe: Execlave);
|
|
67
|
+
current(): Span | null;
|
|
68
|
+
start(opts: StartSpanOptions): Span;
|
|
69
|
+
_pop(span: Span): void;
|
|
70
|
+
}
|
|
71
|
+
export declare function getSpanTree(exe: Execlave): SpanTree;
|
|
72
|
+
//# sourceMappingURL=spans.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.d.ts","sourceRoot":"","sources":["../../src/instrumentation/spans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Nested span primitives. Each `Span` wraps the SDK's `Trace` and
|
|
4
|
+
* carries parent/child identity through the trace metadata so the
|
|
5
|
+
* backend can reconstruct the execution tree.
|
|
6
|
+
*
|
|
7
|
+
* Concurrency model: Node.js is single-threaded, but async tasks can
|
|
8
|
+
* interleave. We expose `withSpan(span, fn)` so async framework
|
|
9
|
+
* adapters can scope the "current span" to a specific async operation
|
|
10
|
+
* without relying on AsyncLocalStorage (keeps footprint zero-dep).
|
|
11
|
+
* The default stack is process-wide; framework adapters can pass
|
|
12
|
+
* `parent` explicitly to avoid relying on the implicit stack.
|
|
13
|
+
*/
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.SpanTree = exports.Span = exports.SPAN_KIND_HANDOFF = exports.SPAN_KIND_GUARDRAIL = exports.SPAN_KIND_RETRIEVER = exports.SPAN_KIND_TOOL = exports.SPAN_KIND_LLM = exports.SPAN_KIND_CHAIN = exports.SPAN_KIND_AGENT = void 0;
|
|
16
|
+
exports.getSpanTree = getSpanTree;
|
|
17
|
+
const crypto_1 = require("crypto");
|
|
18
|
+
exports.SPAN_KIND_AGENT = 'agent';
|
|
19
|
+
exports.SPAN_KIND_CHAIN = 'chain';
|
|
20
|
+
exports.SPAN_KIND_LLM = 'llm';
|
|
21
|
+
exports.SPAN_KIND_TOOL = 'tool';
|
|
22
|
+
exports.SPAN_KIND_RETRIEVER = 'retriever';
|
|
23
|
+
exports.SPAN_KIND_GUARDRAIL = 'guardrail';
|
|
24
|
+
exports.SPAN_KIND_HANDOFF = 'handoff';
|
|
25
|
+
class Span {
|
|
26
|
+
constructor(trace, opts) {
|
|
27
|
+
this._finished = false;
|
|
28
|
+
this._trace = trace;
|
|
29
|
+
this.spanId = opts.spanId;
|
|
30
|
+
this.parentSpanId = opts.parentSpanId;
|
|
31
|
+
this.kind = opts.kind;
|
|
32
|
+
this.name = opts.name;
|
|
33
|
+
this._tree = opts.tree;
|
|
34
|
+
trace.addMetadata({
|
|
35
|
+
spanId: this.spanId,
|
|
36
|
+
parentSpanId: this.parentSpanId,
|
|
37
|
+
spanKind: this.kind,
|
|
38
|
+
spanName: this.name,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
/** Internal: exposed for nested spans to inherit trace id. */
|
|
42
|
+
get _innerTrace() {
|
|
43
|
+
return this._trace;
|
|
44
|
+
}
|
|
45
|
+
/** Trace id that this span's metadata is attached to. */
|
|
46
|
+
get traceId() {
|
|
47
|
+
return this._trace.traceId;
|
|
48
|
+
}
|
|
49
|
+
setInput(value) {
|
|
50
|
+
this._trace.setInput(value);
|
|
51
|
+
return this;
|
|
52
|
+
}
|
|
53
|
+
setOutput(value) {
|
|
54
|
+
this._trace.setOutput(value);
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
setModel(model) {
|
|
58
|
+
this._trace.setModel(model);
|
|
59
|
+
return this;
|
|
60
|
+
}
|
|
61
|
+
setTokens(prompt, completion) {
|
|
62
|
+
this._trace.setTokens(prompt, completion);
|
|
63
|
+
return this;
|
|
64
|
+
}
|
|
65
|
+
setCost(costUsd) {
|
|
66
|
+
this._trace.setCost(costUsd);
|
|
67
|
+
return this;
|
|
68
|
+
}
|
|
69
|
+
addMetadata(meta) {
|
|
70
|
+
this._trace.addMetadata(meta);
|
|
71
|
+
return this;
|
|
72
|
+
}
|
|
73
|
+
child(opts) {
|
|
74
|
+
return this._tree.start({ ...opts, parent: this });
|
|
75
|
+
}
|
|
76
|
+
finish(status = 'success', errorMessage, errorType) {
|
|
77
|
+
if (this._finished)
|
|
78
|
+
return;
|
|
79
|
+
this._finished = true;
|
|
80
|
+
this._tree._pop(this);
|
|
81
|
+
try {
|
|
82
|
+
this._trace.finish(status, errorMessage, errorType);
|
|
83
|
+
}
|
|
84
|
+
catch {
|
|
85
|
+
// transport/buffer errors are never fatal for the host app.
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
exports.Span = Span;
|
|
90
|
+
class SpanTree {
|
|
91
|
+
constructor(_exe) {
|
|
92
|
+
this._exe = _exe;
|
|
93
|
+
this._stack = [];
|
|
94
|
+
}
|
|
95
|
+
current() {
|
|
96
|
+
return this._stack.length > 0 ? this._stack[this._stack.length - 1] : null;
|
|
97
|
+
}
|
|
98
|
+
start(opts) {
|
|
99
|
+
const parent = opts.parent ?? this.current();
|
|
100
|
+
const parentId = parent ? parent.spanId : null;
|
|
101
|
+
const inherited = parent ? parent._innerTrace : null;
|
|
102
|
+
const trace = this._exe.startTrace({
|
|
103
|
+
traceId: inherited ? inherited.traceId : undefined,
|
|
104
|
+
agentId: opts.agentId ?? inherited?.agentId,
|
|
105
|
+
sessionId: opts.sessionId ?? inherited?.sessionId,
|
|
106
|
+
userId: opts.userId ?? inherited?.userId,
|
|
107
|
+
metadata: opts.metadata,
|
|
108
|
+
});
|
|
109
|
+
const spanId = `sp_${(0, crypto_1.randomBytes)(8).toString('hex')}`;
|
|
110
|
+
const span = new Span(trace, {
|
|
111
|
+
spanId,
|
|
112
|
+
parentSpanId: parentId,
|
|
113
|
+
kind: opts.kind,
|
|
114
|
+
name: opts.name,
|
|
115
|
+
tree: this,
|
|
116
|
+
});
|
|
117
|
+
this._stack.push(span);
|
|
118
|
+
return span;
|
|
119
|
+
}
|
|
120
|
+
_pop(span) {
|
|
121
|
+
const idx = this._stack.lastIndexOf(span);
|
|
122
|
+
if (idx >= 0)
|
|
123
|
+
this._stack.splice(idx, 1);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
exports.SpanTree = SpanTree;
|
|
127
|
+
const _treeCache = new WeakMap();
|
|
128
|
+
function getSpanTree(exe) {
|
|
129
|
+
let tree = _treeCache.get(exe);
|
|
130
|
+
if (!tree) {
|
|
131
|
+
tree = new SpanTree(exe);
|
|
132
|
+
_treeCache.set(exe, tree);
|
|
133
|
+
}
|
|
134
|
+
return tree;
|
|
135
|
+
}
|
|
136
|
+
//# sourceMappingURL=spans.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spans.js","sourceRoot":"","sources":["../../src/instrumentation/spans.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Framework adapters for @execlave/sdk.
|
|
3
|
+
*
|
|
4
|
+
* Each integration is intentionally not re-exported from the SDK root
|
|
5
|
+
* so installing `@execlave/sdk` does not pull framework peerDeps.
|
|
6
|
+
* Import directly:
|
|
7
|
+
*
|
|
8
|
+
* import { ExeclaveCallbackHandler } from '@execlave/sdk/integrations/langchain';
|
|
9
|
+
*/
|
|
10
|
+
export { ExeclaveCallbackHandler } from './langchain';
|
|
11
|
+
export type { ExeclaveCallbackHandlerOptions } from './langchain';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAC;AACtD,YAAY,EAAE,8BAA8B,EAAE,MAAM,aAAa,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Framework adapters for @execlave/sdk.
|
|
4
|
+
*
|
|
5
|
+
* Each integration is intentionally not re-exported from the SDK root
|
|
6
|
+
* so installing `@execlave/sdk` does not pull framework peerDeps.
|
|
7
|
+
* Import directly:
|
|
8
|
+
*
|
|
9
|
+
* import { ExeclaveCallbackHandler } from '@execlave/sdk/integrations/langchain';
|
|
10
|
+
*/
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.ExeclaveCallbackHandler = void 0;
|
|
13
|
+
var langchain_1 = require("./langchain");
|
|
14
|
+
Object.defineProperty(exports, "ExeclaveCallbackHandler", { enumerable: true, get: function () { return langchain_1.ExeclaveCallbackHandler; } });
|
|
15
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/integrations/index.ts"],"names":[],"mappings":";AAAA;;;;;;;;GAQG;;;AAEH,yCAAsD;AAA7C,oHAAA,uBAAuB,OAAA"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* LangChain JS auto-instrumentation.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
*
|
|
6
|
+
* ```ts
|
|
7
|
+
* import { Execlave } from '@execlave/sdk';
|
|
8
|
+
* import { ExeclaveCallbackHandler } from '@execlave/sdk/integrations/langchain';
|
|
9
|
+
*
|
|
10
|
+
* const exe = new Execlave({ apiKey: '...' });
|
|
11
|
+
* const handler = new ExeclaveCallbackHandler(exe, { agentId: 'my-bot' });
|
|
12
|
+
* await chain.invoke({ q }, { callbacks: [handler] });
|
|
13
|
+
* ```
|
|
14
|
+
*
|
|
15
|
+
* Uses LangChain's `BaseCallbackHandler` (soft-imported so
|
|
16
|
+
* `@execlave/sdk` has no compile-time dependency on langchain).
|
|
17
|
+
* Consumers must install `@langchain/core` >= 0.3 themselves.
|
|
18
|
+
*
|
|
19
|
+
* Only TypeScript types are duck-typed here; at runtime the handler
|
|
20
|
+
* implements the method names LangChain expects.
|
|
21
|
+
*/
|
|
22
|
+
import type { Execlave } from '../client';
|
|
23
|
+
export interface ExeclaveCallbackHandlerOptions {
|
|
24
|
+
/** Agent id registered with Execlave. Required for enforcement. */
|
|
25
|
+
agentId: string;
|
|
26
|
+
/** Run `enforcePolicy` on chain/tool starts. Default true. */
|
|
27
|
+
enforce?: boolean;
|
|
28
|
+
sessionId?: string;
|
|
29
|
+
userId?: string;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* LangChain callback handler that streams into Execlave.
|
|
33
|
+
*
|
|
34
|
+
* This class does not `extends BaseCallbackHandler` at compile time —
|
|
35
|
+
* we duck-type the interface so the SDK package does not require
|
|
36
|
+
* `@langchain/core` to be installed. When registered with
|
|
37
|
+
* `config.callbacks`, LangChain invokes matching methods by name.
|
|
38
|
+
*/
|
|
39
|
+
export declare class ExeclaveCallbackHandler {
|
|
40
|
+
readonly name = "ExeclaveCallbackHandler";
|
|
41
|
+
readonly raiseError = true;
|
|
42
|
+
readonly awaitHandlers = true;
|
|
43
|
+
private _exe;
|
|
44
|
+
private _agentId;
|
|
45
|
+
private _enforce;
|
|
46
|
+
private _sessionId?;
|
|
47
|
+
private _userId?;
|
|
48
|
+
private _tree;
|
|
49
|
+
private _spans;
|
|
50
|
+
constructor(exe: Execlave, opts: ExeclaveCallbackHandlerOptions);
|
|
51
|
+
private _open;
|
|
52
|
+
private _close;
|
|
53
|
+
private _enforceCall;
|
|
54
|
+
handleChainStart(chain: {
|
|
55
|
+
name?: string;
|
|
56
|
+
id?: string[];
|
|
57
|
+
} | undefined, inputs: Record<string, unknown>, runId: string, parentRunId?: string): Promise<void>;
|
|
58
|
+
handleChainEnd(outputs: unknown, runId: string): Promise<void>;
|
|
59
|
+
handleChainError(error: Error, runId: string): Promise<void>;
|
|
60
|
+
handleLLMStart(llm: {
|
|
61
|
+
name?: string;
|
|
62
|
+
id?: string[];
|
|
63
|
+
} | undefined, prompts: string[], runId: string, parentRunId?: string, extraParams?: Record<string, unknown>): Promise<void>;
|
|
64
|
+
handleChatModelStart(llm: {
|
|
65
|
+
name?: string;
|
|
66
|
+
id?: string[];
|
|
67
|
+
} | undefined, messages: unknown[], runId: string, parentRunId?: string, extraParams?: Record<string, unknown>): Promise<void>;
|
|
68
|
+
handleLLMEnd(output: any, runId: string): Promise<void>;
|
|
69
|
+
handleLLMError(error: Error, runId: string): Promise<void>;
|
|
70
|
+
handleToolStart(tool: {
|
|
71
|
+
name?: string;
|
|
72
|
+
id?: string[];
|
|
73
|
+
} | undefined, input: string, runId: string, parentRunId?: string): Promise<void>;
|
|
74
|
+
handleToolEnd(output: unknown, runId: string): Promise<void>;
|
|
75
|
+
handleToolError(error: Error, runId: string): Promise<void>;
|
|
76
|
+
handleAgentAction(action: {
|
|
77
|
+
tool?: string;
|
|
78
|
+
toolInput?: unknown;
|
|
79
|
+
}, runId: string, parentRunId?: string): Promise<void>;
|
|
80
|
+
handleAgentEnd(action: {
|
|
81
|
+
returnValues?: unknown;
|
|
82
|
+
log?: unknown;
|
|
83
|
+
}, runId: string): Promise<void>;
|
|
84
|
+
handleRetrieverStart(retriever: {
|
|
85
|
+
name?: string;
|
|
86
|
+
} | undefined, query: string, runId: string, parentRunId?: string): Promise<void>;
|
|
87
|
+
handleRetrieverEnd(documents: any[], runId: string): Promise<void>;
|
|
88
|
+
handleRetrieverError(error: Error, runId: string): Promise<void>;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=langchain.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langchain.d.ts","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* LangChain JS auto-instrumentation.
|
|
4
|
+
*
|
|
5
|
+
* Usage:
|
|
6
|
+
*
|
|
7
|
+
* ```ts
|
|
8
|
+
* import { Execlave } from '@execlave/sdk';
|
|
9
|
+
* import { ExeclaveCallbackHandler } from '@execlave/sdk/integrations/langchain';
|
|
10
|
+
*
|
|
11
|
+
* const exe = new Execlave({ apiKey: '...' });
|
|
12
|
+
* const handler = new ExeclaveCallbackHandler(exe, { agentId: 'my-bot' });
|
|
13
|
+
* await chain.invoke({ q }, { callbacks: [handler] });
|
|
14
|
+
* ```
|
|
15
|
+
*
|
|
16
|
+
* Uses LangChain's `BaseCallbackHandler` (soft-imported so
|
|
17
|
+
* `@execlave/sdk` has no compile-time dependency on langchain).
|
|
18
|
+
* Consumers must install `@langchain/core` >= 0.3 themselves.
|
|
19
|
+
*
|
|
20
|
+
* Only TypeScript types are duck-typed here; at runtime the handler
|
|
21
|
+
* implements the method names LangChain expects.
|
|
22
|
+
*/
|
|
23
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
24
|
+
exports.ExeclaveCallbackHandler = void 0;
|
|
25
|
+
const errors_1 = require("../errors");
|
|
26
|
+
const spans_1 = require("../instrumentation/spans");
|
|
27
|
+
function isEnforcementError(err) {
|
|
28
|
+
return (err instanceof errors_1.PolicyBlockedError ||
|
|
29
|
+
err instanceof errors_1.PolicyDeniedError ||
|
|
30
|
+
err instanceof errors_1.ApprovalTimeoutError ||
|
|
31
|
+
err instanceof errors_1.EnforcementUnavailableError ||
|
|
32
|
+
err instanceof errors_1.AgentPausedError);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* LangChain callback handler that streams into Execlave.
|
|
36
|
+
*
|
|
37
|
+
* This class does not `extends BaseCallbackHandler` at compile time —
|
|
38
|
+
* we duck-type the interface so the SDK package does not require
|
|
39
|
+
* `@langchain/core` to be installed. When registered with
|
|
40
|
+
* `config.callbacks`, LangChain invokes matching methods by name.
|
|
41
|
+
*/
|
|
42
|
+
class ExeclaveCallbackHandler {
|
|
43
|
+
constructor(exe, opts) {
|
|
44
|
+
// LangChain inspects these. `name` is used for trace metadata.
|
|
45
|
+
this.name = 'ExeclaveCallbackHandler';
|
|
46
|
+
this.raiseError = true;
|
|
47
|
+
this.awaitHandlers = true;
|
|
48
|
+
this._spans = new Map();
|
|
49
|
+
if (!exe)
|
|
50
|
+
throw new Error('ExeclaveCallbackHandler requires an Execlave client');
|
|
51
|
+
if (!opts?.agentId)
|
|
52
|
+
throw new Error('ExeclaveCallbackHandler requires agentId');
|
|
53
|
+
this._exe = exe;
|
|
54
|
+
this._agentId = opts.agentId;
|
|
55
|
+
this._enforce = opts.enforce !== false;
|
|
56
|
+
this._sessionId = opts.sessionId;
|
|
57
|
+
this._userId = opts.userId;
|
|
58
|
+
this._tree = (0, spans_1.getSpanTree)(exe);
|
|
59
|
+
}
|
|
60
|
+
// --------------------------------------------------------------
|
|
61
|
+
// Helpers
|
|
62
|
+
// --------------------------------------------------------------
|
|
63
|
+
_open(runId, parentRunId, kind, name, input, metadata) {
|
|
64
|
+
const parent = parentRunId ? this._spans.get(parentRunId) : null;
|
|
65
|
+
const span = this._tree.start({
|
|
66
|
+
kind,
|
|
67
|
+
name,
|
|
68
|
+
parent,
|
|
69
|
+
agentId: this._agentId,
|
|
70
|
+
sessionId: this._sessionId,
|
|
71
|
+
userId: this._userId,
|
|
72
|
+
metadata,
|
|
73
|
+
});
|
|
74
|
+
if (input !== undefined)
|
|
75
|
+
span.setInput(input);
|
|
76
|
+
this._spans.set(runId, span);
|
|
77
|
+
return span;
|
|
78
|
+
}
|
|
79
|
+
_close(runId, output, status = 'success', errorMessage, errorType) {
|
|
80
|
+
const span = this._spans.get(runId);
|
|
81
|
+
if (!span)
|
|
82
|
+
return;
|
|
83
|
+
this._spans.delete(runId);
|
|
84
|
+
if (output !== undefined) {
|
|
85
|
+
try {
|
|
86
|
+
span.setOutput(output);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
/* noop */
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
span.finish(status, errorMessage, errorType);
|
|
93
|
+
}
|
|
94
|
+
async _enforceCall(input, tools) {
|
|
95
|
+
if (!this._enforce)
|
|
96
|
+
return;
|
|
97
|
+
try {
|
|
98
|
+
await this._exe.enforcePolicy({
|
|
99
|
+
agentId: this._agentId,
|
|
100
|
+
input,
|
|
101
|
+
tools,
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
catch (err) {
|
|
105
|
+
if (isEnforcementError(err))
|
|
106
|
+
throw err;
|
|
107
|
+
// eslint-disable-next-line no-console
|
|
108
|
+
console.warn('[execlave] enforcePolicy failed (non-fatal):', err);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
// --------------------------------------------------------------
|
|
112
|
+
// Chain callbacks
|
|
113
|
+
// --------------------------------------------------------------
|
|
114
|
+
async handleChainStart(chain, inputs, runId, parentRunId) {
|
|
115
|
+
const name = chain?.name ?? chain?.id?.[chain.id.length - 1] ?? 'chain';
|
|
116
|
+
if (!parentRunId) {
|
|
117
|
+
const inputText = extractInputText(inputs);
|
|
118
|
+
if (inputText)
|
|
119
|
+
await this._enforceCall(inputText);
|
|
120
|
+
}
|
|
121
|
+
this._open(runId, parentRunId, spans_1.SPAN_KIND_CHAIN, name, inputs);
|
|
122
|
+
}
|
|
123
|
+
async handleChainEnd(outputs, runId) {
|
|
124
|
+
this._close(runId, outputs, 'success');
|
|
125
|
+
}
|
|
126
|
+
async handleChainError(error, runId) {
|
|
127
|
+
this._close(runId, undefined, 'error', error?.message, error?.name);
|
|
128
|
+
}
|
|
129
|
+
// --------------------------------------------------------------
|
|
130
|
+
// LLM callbacks
|
|
131
|
+
// --------------------------------------------------------------
|
|
132
|
+
async handleLLMStart(llm, prompts, runId, parentRunId, extraParams) {
|
|
133
|
+
const name = llm?.name ?? llm?.id?.[llm.id.length - 1] ?? 'llm';
|
|
134
|
+
const span = this._open(runId, parentRunId, spans_1.SPAN_KIND_LLM, name, prompts);
|
|
135
|
+
const invocation = (extraParams?.invocation_params ?? {});
|
|
136
|
+
const model = (invocation.model ?? invocation.model_name);
|
|
137
|
+
if (model)
|
|
138
|
+
span.setModel(model);
|
|
139
|
+
}
|
|
140
|
+
async handleChatModelStart(llm, messages, runId, parentRunId, extraParams) {
|
|
141
|
+
const name = llm?.name ?? llm?.id?.[llm.id.length - 1] ?? 'chat_model';
|
|
142
|
+
const span = this._open(runId, parentRunId, spans_1.SPAN_KIND_LLM, name, messages);
|
|
143
|
+
const invocation = (extraParams?.invocation_params ?? {});
|
|
144
|
+
const model = (invocation.model ?? invocation.model_name);
|
|
145
|
+
if (model)
|
|
146
|
+
span.setModel(model);
|
|
147
|
+
}
|
|
148
|
+
async handleLLMEnd(output, runId) {
|
|
149
|
+
const span = this._spans.get(runId);
|
|
150
|
+
if (span) {
|
|
151
|
+
const usage = output?.llmOutput?.tokenUsage ?? output?.llmOutput?.usage;
|
|
152
|
+
if (usage) {
|
|
153
|
+
const p = usage.promptTokens ?? usage.prompt_tokens ?? usage.input_tokens;
|
|
154
|
+
const c = usage.completionTokens ?? usage.completion_tokens ?? usage.output_tokens;
|
|
155
|
+
if (typeof p === 'number' && typeof c === 'number')
|
|
156
|
+
span.setTokens(p, c);
|
|
157
|
+
}
|
|
158
|
+
const texts = [];
|
|
159
|
+
for (const batch of output?.generations ?? []) {
|
|
160
|
+
for (const gen of batch ?? []) {
|
|
161
|
+
if (typeof gen.text === 'string')
|
|
162
|
+
texts.push(gen.text);
|
|
163
|
+
else if (gen.message?.content)
|
|
164
|
+
texts.push(String(gen.message.content));
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (texts.length)
|
|
168
|
+
span.setOutput(texts.length === 1 ? texts[0] : texts);
|
|
169
|
+
}
|
|
170
|
+
this._close(runId, undefined, 'success');
|
|
171
|
+
}
|
|
172
|
+
async handleLLMError(error, runId) {
|
|
173
|
+
this._close(runId, undefined, 'error', error?.message, error?.name);
|
|
174
|
+
}
|
|
175
|
+
// --------------------------------------------------------------
|
|
176
|
+
// Tool callbacks
|
|
177
|
+
// --------------------------------------------------------------
|
|
178
|
+
async handleToolStart(tool, input, runId, parentRunId) {
|
|
179
|
+
const toolName = tool?.name ?? tool?.id?.[tool.id.length - 1] ?? 'tool';
|
|
180
|
+
await this._enforceCall(input ?? `tool:${toolName}`, [toolName]);
|
|
181
|
+
this._open(runId, parentRunId, spans_1.SPAN_KIND_TOOL, toolName, input, { toolName });
|
|
182
|
+
}
|
|
183
|
+
async handleToolEnd(output, runId) {
|
|
184
|
+
this._close(runId, output, 'success');
|
|
185
|
+
}
|
|
186
|
+
async handleToolError(error, runId) {
|
|
187
|
+
this._close(runId, undefined, 'error', error?.message, error?.name);
|
|
188
|
+
}
|
|
189
|
+
// --------------------------------------------------------------
|
|
190
|
+
// Agent callbacks
|
|
191
|
+
// --------------------------------------------------------------
|
|
192
|
+
async handleAgentAction(action, runId, parentRunId) {
|
|
193
|
+
this._open(runId, parentRunId, spans_1.SPAN_KIND_AGENT, String(action?.tool ?? 'agent_action'), action?.toolInput, { agentAction: String(action?.tool ?? 'agent_action') });
|
|
194
|
+
}
|
|
195
|
+
async handleAgentEnd(action, runId) {
|
|
196
|
+
this._close(runId, action?.returnValues ?? action?.log, 'success');
|
|
197
|
+
}
|
|
198
|
+
// --------------------------------------------------------------
|
|
199
|
+
// Retriever callbacks
|
|
200
|
+
// --------------------------------------------------------------
|
|
201
|
+
async handleRetrieverStart(retriever, query, runId, parentRunId) {
|
|
202
|
+
const name = retriever?.name ?? 'retriever';
|
|
203
|
+
this._open(runId, parentRunId, spans_1.SPAN_KIND_RETRIEVER, name, query);
|
|
204
|
+
}
|
|
205
|
+
async handleRetrieverEnd(documents, runId) {
|
|
206
|
+
const span = this._spans.get(runId);
|
|
207
|
+
if (span && Array.isArray(documents)) {
|
|
208
|
+
span.addMetadata({
|
|
209
|
+
retrievedDocs: documents.map((d) => ({
|
|
210
|
+
id: d?.metadata?.id ?? d?.metadata?.source,
|
|
211
|
+
length: typeof d?.pageContent === 'string' ? d.pageContent.length : 0,
|
|
212
|
+
})),
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
this._close(runId, undefined, 'success');
|
|
216
|
+
}
|
|
217
|
+
async handleRetrieverError(error, runId) {
|
|
218
|
+
this._close(runId, undefined, 'error', error?.message, error?.name);
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
exports.ExeclaveCallbackHandler = ExeclaveCallbackHandler;
|
|
222
|
+
// ------------------------------------------------------------------
|
|
223
|
+
// Helpers
|
|
224
|
+
// ------------------------------------------------------------------
|
|
225
|
+
function extractInputText(inputs) {
|
|
226
|
+
if (!inputs || typeof inputs !== 'object')
|
|
227
|
+
return null;
|
|
228
|
+
for (const key of ['input', 'question', 'query', 'q', 'prompt', 'text']) {
|
|
229
|
+
const v = inputs[key];
|
|
230
|
+
if (typeof v === 'string' && v)
|
|
231
|
+
return v;
|
|
232
|
+
}
|
|
233
|
+
const parts = [];
|
|
234
|
+
for (const v of Object.values(inputs)) {
|
|
235
|
+
if (typeof v === 'string')
|
|
236
|
+
parts.push(v);
|
|
237
|
+
}
|
|
238
|
+
return parts.length ? parts.join(' ') : null;
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=langchain.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"langchain.js","sourceRoot":"","sources":["../../src/integrations/langchain.ts"],"names":[],"mappings":"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"}
|