braintrust 3.21.0 → 3.23.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 +47 -0
- package/dev/dist/index.d.mts +1030 -1
- package/dev/dist/index.d.ts +1030 -1
- package/dev/dist/index.js +1429 -663
- package/dev/dist/index.mjs +811 -45
- package/dist/apply-auto-instrumentation.js +222 -186
- package/dist/apply-auto-instrumentation.mjs +37 -1
- package/dist/auto-instrumentations/bundler/esbuild.cjs +53 -1
- package/dist/auto-instrumentations/bundler/esbuild.mjs +2 -2
- package/dist/auto-instrumentations/bundler/next.cjs +53 -1
- package/dist/auto-instrumentations/bundler/next.mjs +3 -3
- package/dist/auto-instrumentations/bundler/rollup.cjs +53 -1
- package/dist/auto-instrumentations/bundler/rollup.mjs +2 -2
- package/dist/auto-instrumentations/bundler/vite.cjs +53 -1
- package/dist/auto-instrumentations/bundler/vite.mjs +2 -2
- package/dist/auto-instrumentations/bundler/webpack-loader.cjs +53 -1
- package/dist/auto-instrumentations/bundler/webpack.cjs +53 -1
- package/dist/auto-instrumentations/bundler/webpack.mjs +3 -3
- package/dist/auto-instrumentations/{chunk-TKRPRPGD.mjs → chunk-EXY7QCJD.mjs} +5 -2
- package/dist/auto-instrumentations/{chunk-T6J4C7LX.mjs → chunk-KIMLYPRW.mjs} +1 -1
- package/dist/auto-instrumentations/{chunk-BRQX23KL.mjs → chunk-YXLNSAMJ.mjs} +51 -0
- package/dist/auto-instrumentations/hook.mjs +224 -31
- package/dist/auto-instrumentations/index.cjs +52 -0
- package/dist/auto-instrumentations/index.d.mts +3 -1
- package/dist/auto-instrumentations/index.d.ts +3 -1
- package/dist/auto-instrumentations/index.mjs +3 -1
- package/dist/browser.d.mts +3273 -93
- package/dist/browser.d.ts +3273 -93
- package/dist/browser.js +2495 -63
- package/dist/browser.mjs +2495 -63
- package/dist/{chunk-KMGUTPB7.mjs → chunk-36IPYKMG.mjs} +20 -1
- package/dist/{chunk-BFGIH2ZJ.js → chunk-CDIKAHDZ.js} +21 -2
- package/dist/{chunk-FY7DAKA5.js → chunk-FZWPFCVE.js} +1590 -832
- package/dist/{chunk-O2P765XK.mjs → chunk-IXL4PMY4.mjs} +802 -44
- package/dist/cli.js +816 -47
- package/dist/edge-light.d.mts +1 -1
- package/dist/edge-light.d.ts +1 -1
- package/dist/edge-light.js +2495 -63
- package/dist/edge-light.mjs +2495 -63
- package/dist/index.d.mts +3273 -93
- package/dist/index.d.ts +3273 -93
- package/dist/index.js +2078 -416
- package/dist/index.mjs +1664 -2
- package/dist/instrumentation/index.d.mts +912 -2
- package/dist/instrumentation/index.d.ts +912 -2
- package/dist/instrumentation/index.js +2202 -42
- package/dist/instrumentation/index.mjs +2200 -42
- package/dist/vitest-evals-reporter.js +16 -16
- package/dist/vitest-evals-reporter.mjs +2 -2
- package/dist/workerd.d.mts +1 -1
- package/dist/workerd.d.ts +1 -1
- package/dist/workerd.js +2495 -63
- package/dist/workerd.mjs +2495 -63
- package/package.json +5 -2
package/dist/index.mjs
CHANGED
|
@@ -27,6 +27,7 @@ import {
|
|
|
27
27
|
JSONAttachment,
|
|
28
28
|
LEGACY_CACHED_HEADER,
|
|
29
29
|
LOGS3_OVERFLOW_REFERENCE_TYPE,
|
|
30
|
+
LRUCache,
|
|
30
31
|
LazyValue,
|
|
31
32
|
Logger,
|
|
32
33
|
LoginInvalidOrgError,
|
|
@@ -55,6 +56,7 @@ import {
|
|
|
55
56
|
_exportsForTestingOnly,
|
|
56
57
|
_internalGetGlobalState,
|
|
57
58
|
_internalSetInitialState,
|
|
59
|
+
_internalStartSpanWithInitialMerge,
|
|
58
60
|
addAzureBlobHeaders,
|
|
59
61
|
braintrustAISDKTelemetry,
|
|
60
62
|
braintrustFlueInstrumentation,
|
|
@@ -137,7 +139,7 @@ import {
|
|
|
137
139
|
wrapMastraAgent,
|
|
138
140
|
wrapTraced,
|
|
139
141
|
zodToJsonSchema
|
|
140
|
-
} from "./chunk-
|
|
142
|
+
} from "./chunk-IXL4PMY4.mjs";
|
|
141
143
|
import {
|
|
142
144
|
__export,
|
|
143
145
|
aiSDKChannels,
|
|
@@ -153,6 +155,7 @@ import {
|
|
|
153
155
|
groqChannels,
|
|
154
156
|
huggingFaceChannels,
|
|
155
157
|
isomorph_default,
|
|
158
|
+
langSmithChannels,
|
|
156
159
|
mistralChannels,
|
|
157
160
|
openAIChannels,
|
|
158
161
|
openAICodexChannels,
|
|
@@ -160,7 +163,7 @@ import {
|
|
|
160
163
|
openRouterChannels,
|
|
161
164
|
piCodingAgentChannels,
|
|
162
165
|
strandsAgentSDKChannels
|
|
163
|
-
} from "./chunk-
|
|
166
|
+
} from "./chunk-36IPYKMG.mjs";
|
|
164
167
|
|
|
165
168
|
// src/exports.ts
|
|
166
169
|
var exports_exports = {};
|
|
@@ -228,6 +231,8 @@ __export(exports_exports, {
|
|
|
228
231
|
addAzureBlobHeaders: () => addAzureBlobHeaders,
|
|
229
232
|
agentAssertionScorer: () => agentAssertionScorer,
|
|
230
233
|
braintrustAISDKTelemetry: () => braintrustAISDKTelemetry,
|
|
234
|
+
braintrustEveHook: () => braintrustEveHook,
|
|
235
|
+
braintrustEveInstrumentation: () => braintrustEveInstrumentation,
|
|
231
236
|
braintrustFlueInstrumentation: () => braintrustFlueInstrumentation,
|
|
232
237
|
braintrustFlueObserver: () => braintrustFlueObserver,
|
|
233
238
|
braintrustStreamChunkSchema: () => braintrustStreamChunkSchema,
|
|
@@ -317,6 +322,9 @@ __export(exports_exports, {
|
|
|
317
322
|
wrapGoogleGenAI: () => wrapGoogleGenAI,
|
|
318
323
|
wrapGroq: () => wrapGroq,
|
|
319
324
|
wrapHuggingFace: () => wrapHuggingFace,
|
|
325
|
+
wrapLangSmithClient: () => wrapLangSmithClient,
|
|
326
|
+
wrapLangSmithRunTrees: () => wrapLangSmithRunTrees,
|
|
327
|
+
wrapLangSmithTraceable: () => wrapLangSmithTraceable,
|
|
320
328
|
wrapMastraAgent: () => wrapMastraAgent,
|
|
321
329
|
wrapMistral: () => wrapMistral,
|
|
322
330
|
wrapOpenAI: () => wrapOpenAI,
|
|
@@ -1728,6 +1736,1390 @@ function BraintrustMiddleware(config = {}) {
|
|
|
1728
1736
|
};
|
|
1729
1737
|
}
|
|
1730
1738
|
|
|
1739
|
+
// src/instrumentation/plugins/eve-plugin.ts
|
|
1740
|
+
var EVE_TRACE_STATE_KEY = "braintrust.eve.tracing";
|
|
1741
|
+
var MAX_EVE_CACHE_ENTRIES = 1e4;
|
|
1742
|
+
var MAX_STORED_LLM_INPUTS = 100;
|
|
1743
|
+
var MAX_STORED_SPAN_REFERENCES = 1e4;
|
|
1744
|
+
var MAX_STORED_STEP_STARTS = 1e4;
|
|
1745
|
+
function braintrustEveHook(options) {
|
|
1746
|
+
const state = options.defineState(EVE_TRACE_STATE_KEY, emptyEveTraceState);
|
|
1747
|
+
const bridge = new EveBridge(state);
|
|
1748
|
+
return {
|
|
1749
|
+
events: {
|
|
1750
|
+
"*": async (event, ctx) => {
|
|
1751
|
+
await bridge.handle(event, ctx, options.metadata);
|
|
1752
|
+
}
|
|
1753
|
+
}
|
|
1754
|
+
};
|
|
1755
|
+
}
|
|
1756
|
+
function braintrustEveInstrumentation(options) {
|
|
1757
|
+
const state = options.defineState(EVE_TRACE_STATE_KEY, emptyEveTraceState);
|
|
1758
|
+
return {
|
|
1759
|
+
events: {
|
|
1760
|
+
"step.started": (input) => {
|
|
1761
|
+
try {
|
|
1762
|
+
captureEveModelInput(state, input);
|
|
1763
|
+
} catch (error) {
|
|
1764
|
+
debugLogger.warn("Error in Eve LLM input capture:", error);
|
|
1765
|
+
}
|
|
1766
|
+
}
|
|
1767
|
+
},
|
|
1768
|
+
recordInputs: false,
|
|
1769
|
+
recordOutputs: false,
|
|
1770
|
+
setup: options.setup
|
|
1771
|
+
};
|
|
1772
|
+
}
|
|
1773
|
+
function isEveHandleMessageStreamEvent(event) {
|
|
1774
|
+
return isObject(event) && typeof event["type"] === "string";
|
|
1775
|
+
}
|
|
1776
|
+
var ResumedEveSpan = class {
|
|
1777
|
+
constructor(reference) {
|
|
1778
|
+
this.reference = reference;
|
|
1779
|
+
this.endTime = reference.endTime;
|
|
1780
|
+
}
|
|
1781
|
+
endTime;
|
|
1782
|
+
get rootSpanId() {
|
|
1783
|
+
return this.reference.rootSpanId;
|
|
1784
|
+
}
|
|
1785
|
+
get spanId() {
|
|
1786
|
+
return this.reference.spanId;
|
|
1787
|
+
}
|
|
1788
|
+
log(event) {
|
|
1789
|
+
const metrics = {
|
|
1790
|
+
...this.reference.startEvent?.metrics,
|
|
1791
|
+
...this.endTime === void 0 ? {} : { end: this.endTime },
|
|
1792
|
+
...event.metrics
|
|
1793
|
+
};
|
|
1794
|
+
updateSpan({
|
|
1795
|
+
exported: this.reference.exported,
|
|
1796
|
+
...this.reference.startEvent,
|
|
1797
|
+
...event,
|
|
1798
|
+
...Object.keys(metrics).length > 0 ? { metrics } : {}
|
|
1799
|
+
});
|
|
1800
|
+
}
|
|
1801
|
+
end(args) {
|
|
1802
|
+
if (this.endTime === void 0) {
|
|
1803
|
+
this.endTime = args?.endTime ?? getCurrentUnixTimestamp();
|
|
1804
|
+
this.log({ metrics: { end: this.endTime } });
|
|
1805
|
+
}
|
|
1806
|
+
return this.endTime;
|
|
1807
|
+
}
|
|
1808
|
+
};
|
|
1809
|
+
var EveBridge = class {
|
|
1810
|
+
constructor(state) {
|
|
1811
|
+
this.state = state;
|
|
1812
|
+
}
|
|
1813
|
+
eventQueuesBySession = /* @__PURE__ */ new Map();
|
|
1814
|
+
completedToolKeys = new LRUCache({
|
|
1815
|
+
max: MAX_EVE_CACHE_ENTRIES
|
|
1816
|
+
});
|
|
1817
|
+
toolsByCallKey = new LRUCache({
|
|
1818
|
+
max: MAX_EVE_CACHE_ENTRIES
|
|
1819
|
+
});
|
|
1820
|
+
turnsByKey = new LRUCache({
|
|
1821
|
+
max: MAX_EVE_CACHE_ENTRIES
|
|
1822
|
+
});
|
|
1823
|
+
async startEveSpan(args) {
|
|
1824
|
+
const rowId = args?.event?.id;
|
|
1825
|
+
const reference = typeof rowId === "string" && readEveTraceState(this.state).spanReferences.find(
|
|
1826
|
+
(candidate) => candidate.rowId === rowId
|
|
1827
|
+
);
|
|
1828
|
+
if (reference) {
|
|
1829
|
+
return new ResumedEveSpan(reference);
|
|
1830
|
+
}
|
|
1831
|
+
const startTime = args?.startTime ?? getCurrentUnixTimestamp();
|
|
1832
|
+
const parentSpanIds = args?.parentSpanIds;
|
|
1833
|
+
const startEvent = {
|
|
1834
|
+
created: (/* @__PURE__ */ new Date()).toISOString(),
|
|
1835
|
+
metrics: { start: startTime },
|
|
1836
|
+
span_attributes: {
|
|
1837
|
+
...args?.name ? { name: args.name } : {},
|
|
1838
|
+
...args?.type ? { type: args.type } : {},
|
|
1839
|
+
...args?.spanAttributes
|
|
1840
|
+
},
|
|
1841
|
+
span_parents: parentSpanIds ? "spanId" in parentSpanIds ? [parentSpanIds.spanId] : parentSpanIds.parentSpanIds : []
|
|
1842
|
+
};
|
|
1843
|
+
const span = withCurrent(
|
|
1844
|
+
NOOP_SPAN,
|
|
1845
|
+
() => _internalStartSpanWithInitialMerge({ ...args, startTime })
|
|
1846
|
+
);
|
|
1847
|
+
if (typeof rowId !== "string") {
|
|
1848
|
+
return span;
|
|
1849
|
+
}
|
|
1850
|
+
try {
|
|
1851
|
+
const exported = await span.export();
|
|
1852
|
+
const reference2 = {
|
|
1853
|
+
exported,
|
|
1854
|
+
rootSpanId: span.rootSpanId,
|
|
1855
|
+
rowId,
|
|
1856
|
+
spanId: span.spanId,
|
|
1857
|
+
startEvent
|
|
1858
|
+
};
|
|
1859
|
+
this.state.update((current) => {
|
|
1860
|
+
const normalized = normalizeEveTraceState(current);
|
|
1861
|
+
return normalized.spanReferences.some(
|
|
1862
|
+
(candidate) => candidate.rowId === rowId
|
|
1863
|
+
) ? normalized : {
|
|
1864
|
+
...normalized,
|
|
1865
|
+
spanReferences: [...normalized.spanReferences, reference2].slice(
|
|
1866
|
+
-MAX_STORED_SPAN_REFERENCES
|
|
1867
|
+
)
|
|
1868
|
+
};
|
|
1869
|
+
});
|
|
1870
|
+
} catch (error) {
|
|
1871
|
+
debugLogger.warn("Error exporting Eve span for resumption:", error);
|
|
1872
|
+
}
|
|
1873
|
+
return span;
|
|
1874
|
+
}
|
|
1875
|
+
async startEveChildSpan(parent, args) {
|
|
1876
|
+
return await this.startEveSpan({
|
|
1877
|
+
...args,
|
|
1878
|
+
parentSpanIds: {
|
|
1879
|
+
rootSpanId: parent.rootSpanId,
|
|
1880
|
+
spanId: parent.spanId
|
|
1881
|
+
}
|
|
1882
|
+
});
|
|
1883
|
+
}
|
|
1884
|
+
stepOrdinal(event) {
|
|
1885
|
+
let ordinal = 0;
|
|
1886
|
+
this.state.update((current) => {
|
|
1887
|
+
const state = normalizeEveTraceState(current);
|
|
1888
|
+
const previous = state.stepStarts.filter(
|
|
1889
|
+
(entry) => entry.turnId === event.data.turnId && entry.stepIndex === event.data.stepIndex
|
|
1890
|
+
).at(-1);
|
|
1891
|
+
if (previous?.open) {
|
|
1892
|
+
ordinal = previous.ordinal;
|
|
1893
|
+
return state;
|
|
1894
|
+
}
|
|
1895
|
+
ordinal = state.stepStarts.filter(
|
|
1896
|
+
(entry) => entry.turnId === event.data.turnId
|
|
1897
|
+
).length;
|
|
1898
|
+
return {
|
|
1899
|
+
...state,
|
|
1900
|
+
stepStarts: [
|
|
1901
|
+
...state.stepStarts,
|
|
1902
|
+
{
|
|
1903
|
+
open: true,
|
|
1904
|
+
ordinal,
|
|
1905
|
+
stepIndex: event.data.stepIndex,
|
|
1906
|
+
turnId: event.data.turnId
|
|
1907
|
+
}
|
|
1908
|
+
].slice(-MAX_STORED_STEP_STARTS)
|
|
1909
|
+
};
|
|
1910
|
+
});
|
|
1911
|
+
return ordinal;
|
|
1912
|
+
}
|
|
1913
|
+
markStepEnded(turnId, stepIndex) {
|
|
1914
|
+
this.state.update((current) => {
|
|
1915
|
+
const state = normalizeEveTraceState(current);
|
|
1916
|
+
let index = -1;
|
|
1917
|
+
for (let i = state.stepStarts.length - 1; i >= 0; i--) {
|
|
1918
|
+
const entry = state.stepStarts[i];
|
|
1919
|
+
if (entry?.turnId === turnId && entry.stepIndex === stepIndex) {
|
|
1920
|
+
index = i;
|
|
1921
|
+
break;
|
|
1922
|
+
}
|
|
1923
|
+
}
|
|
1924
|
+
if (index < 0 || !state.stepStarts[index]?.open) {
|
|
1925
|
+
return state;
|
|
1926
|
+
}
|
|
1927
|
+
return {
|
|
1928
|
+
...state,
|
|
1929
|
+
stepStarts: state.stepStarts.map(
|
|
1930
|
+
(entry, entryIndex) => entryIndex === index ? { ...entry, open: false } : entry
|
|
1931
|
+
)
|
|
1932
|
+
};
|
|
1933
|
+
});
|
|
1934
|
+
}
|
|
1935
|
+
async handle(event, ctx, hookMetadata) {
|
|
1936
|
+
if (!isEveHandleMessageStreamEvent(event)) {
|
|
1937
|
+
return;
|
|
1938
|
+
}
|
|
1939
|
+
const run = async () => {
|
|
1940
|
+
try {
|
|
1941
|
+
if (!await this.handleEvent(event, ctx, hookMetadata)) {
|
|
1942
|
+
return;
|
|
1943
|
+
}
|
|
1944
|
+
if (event.type === "session.failed") {
|
|
1945
|
+
const sessionId2 = event.data.sessionId || sessionIdFromContext(ctx);
|
|
1946
|
+
await this.flushInstrumentation();
|
|
1947
|
+
if (sessionId2) {
|
|
1948
|
+
this.cleanupSession(sessionId2);
|
|
1949
|
+
}
|
|
1950
|
+
} else if (event.type === "session.completed") {
|
|
1951
|
+
const sessionId2 = sessionIdFromContext(ctx);
|
|
1952
|
+
await this.flushInstrumentation();
|
|
1953
|
+
if (sessionId2) {
|
|
1954
|
+
this.cleanupSession(sessionId2);
|
|
1955
|
+
}
|
|
1956
|
+
}
|
|
1957
|
+
} catch (error) {
|
|
1958
|
+
debugLogger.warn("Error in Eve hook instrumentation:", error);
|
|
1959
|
+
}
|
|
1960
|
+
};
|
|
1961
|
+
const sessionId = event.type === "session.failed" ? event.data.sessionId || sessionIdFromContext(ctx) : sessionIdFromContext(ctx);
|
|
1962
|
+
if (!sessionId) {
|
|
1963
|
+
await run();
|
|
1964
|
+
return;
|
|
1965
|
+
}
|
|
1966
|
+
const previous = this.eventQueuesBySession.get(sessionId);
|
|
1967
|
+
const queued = previous ? previous.then(run) : run();
|
|
1968
|
+
this.eventQueuesBySession.set(sessionId, queued);
|
|
1969
|
+
try {
|
|
1970
|
+
await queued;
|
|
1971
|
+
} finally {
|
|
1972
|
+
if (this.eventQueuesBySession.get(sessionId) === queued) {
|
|
1973
|
+
this.eventQueuesBySession.delete(sessionId);
|
|
1974
|
+
}
|
|
1975
|
+
}
|
|
1976
|
+
}
|
|
1977
|
+
async handleEvent(event, ctx, hookMetadata) {
|
|
1978
|
+
switch (event.type) {
|
|
1979
|
+
case "session.started":
|
|
1980
|
+
this.handleSessionStarted(event, ctx, hookMetadata);
|
|
1981
|
+
return true;
|
|
1982
|
+
case "turn.started":
|
|
1983
|
+
await this.handleTurnStarted(event, ctx, hookMetadata);
|
|
1984
|
+
return true;
|
|
1985
|
+
case "message.received":
|
|
1986
|
+
await this.handleMessageReceived(event, ctx, hookMetadata);
|
|
1987
|
+
return true;
|
|
1988
|
+
case "step.started":
|
|
1989
|
+
await this.handleStepStarted(event, ctx, hookMetadata);
|
|
1990
|
+
return true;
|
|
1991
|
+
case "message.completed":
|
|
1992
|
+
this.handleMessageCompleted(event, ctx);
|
|
1993
|
+
return true;
|
|
1994
|
+
case "result.completed":
|
|
1995
|
+
this.handleResultCompleted(event, ctx);
|
|
1996
|
+
return true;
|
|
1997
|
+
case "actions.requested":
|
|
1998
|
+
await this.handleActionsRequested(event, ctx, hookMetadata);
|
|
1999
|
+
return true;
|
|
2000
|
+
case "action.result":
|
|
2001
|
+
await this.handleActionResult(event, ctx, hookMetadata);
|
|
2002
|
+
return true;
|
|
2003
|
+
case "subagent.called":
|
|
2004
|
+
await this.handleSubagentCalled(event, ctx, hookMetadata);
|
|
2005
|
+
return true;
|
|
2006
|
+
case "subagent.completed":
|
|
2007
|
+
await this.handleSubagentCompleted(event, ctx, hookMetadata);
|
|
2008
|
+
return true;
|
|
2009
|
+
case "step.completed":
|
|
2010
|
+
this.handleStepCompleted(event, ctx);
|
|
2011
|
+
return true;
|
|
2012
|
+
case "step.failed":
|
|
2013
|
+
this.handleStepFailed(event, ctx);
|
|
2014
|
+
return true;
|
|
2015
|
+
case "turn.completed":
|
|
2016
|
+
this.handleTurnCompleted(event, ctx);
|
|
2017
|
+
return true;
|
|
2018
|
+
case "turn.failed":
|
|
2019
|
+
this.handleTurnFailed(event, ctx);
|
|
2020
|
+
return true;
|
|
2021
|
+
case "session.failed":
|
|
2022
|
+
this.handleSessionFailed(event, ctx);
|
|
2023
|
+
return true;
|
|
2024
|
+
case "session.completed":
|
|
2025
|
+
this.handleSessionCompleted(event, ctx);
|
|
2026
|
+
return true;
|
|
2027
|
+
default:
|
|
2028
|
+
return false;
|
|
2029
|
+
}
|
|
2030
|
+
}
|
|
2031
|
+
handleSessionStarted(event, ctx, hookMetadata) {
|
|
2032
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2033
|
+
if (!sessionId) {
|
|
2034
|
+
return;
|
|
2035
|
+
}
|
|
2036
|
+
const metadata = {
|
|
2037
|
+
...hookMetadata ?? {},
|
|
2038
|
+
...modelMetadataFromRuntime(event.data.runtime)
|
|
2039
|
+
};
|
|
2040
|
+
this.state.update((current) => {
|
|
2041
|
+
const normalized = normalizeEveTraceState(current);
|
|
2042
|
+
return {
|
|
2043
|
+
...normalized,
|
|
2044
|
+
metadata: { ...normalized.metadata, ...metadata }
|
|
2045
|
+
};
|
|
2046
|
+
});
|
|
2047
|
+
for (const [key, turn] of this.turnsByKey) {
|
|
2048
|
+
if (!key.startsWith(`${sessionId}:`)) {
|
|
2049
|
+
continue;
|
|
2050
|
+
}
|
|
2051
|
+
turn.metadata = { ...turn.metadata, ...metadata };
|
|
2052
|
+
turn.span.log({ metadata: turn.metadata });
|
|
2053
|
+
for (const step of turn.stepsByIndex.values()) {
|
|
2054
|
+
step.metadata = { ...step.metadata, ...metadata };
|
|
2055
|
+
step.span.log({ metadata: step.metadata });
|
|
2056
|
+
}
|
|
2057
|
+
}
|
|
2058
|
+
}
|
|
2059
|
+
async handleTurnStarted(event, ctx, hookMetadata) {
|
|
2060
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2061
|
+
if (!sessionId) {
|
|
2062
|
+
return;
|
|
2063
|
+
}
|
|
2064
|
+
const key = turnKey(sessionId, event.data.turnId);
|
|
2065
|
+
const metadata = {
|
|
2066
|
+
...readEveTraceState(this.state).metadata,
|
|
2067
|
+
...hookMetadata ?? {},
|
|
2068
|
+
"eve.session_id": sessionId
|
|
2069
|
+
};
|
|
2070
|
+
const existing = this.turnsByKey.get(key);
|
|
2071
|
+
if (existing) {
|
|
2072
|
+
existing.metadata = { ...existing.metadata, ...metadata };
|
|
2073
|
+
existing.span.log({ metadata: existing.metadata });
|
|
2074
|
+
return;
|
|
2075
|
+
}
|
|
2076
|
+
const span = await this.startTurnSpan(sessionId, event, ctx, metadata);
|
|
2077
|
+
span.log({ metadata });
|
|
2078
|
+
this.turnsByKey.set(key, {
|
|
2079
|
+
key,
|
|
2080
|
+
metadata,
|
|
2081
|
+
metrics: {},
|
|
2082
|
+
span,
|
|
2083
|
+
stepsByIndex: /* @__PURE__ */ new Map(),
|
|
2084
|
+
turnId: event.data.turnId
|
|
2085
|
+
});
|
|
2086
|
+
}
|
|
2087
|
+
async handleMessageReceived(event, ctx, hookMetadata) {
|
|
2088
|
+
const turn = await this.ensureTurn(event, ctx, hookMetadata);
|
|
2089
|
+
if (!turn) {
|
|
2090
|
+
return;
|
|
2091
|
+
}
|
|
2092
|
+
const input = [{ content: event.data.message, role: "user" }];
|
|
2093
|
+
turn.span.log({ input });
|
|
2094
|
+
}
|
|
2095
|
+
async handleStepStarted(event, ctx, hookMetadata) {
|
|
2096
|
+
const turn = await this.ensureTurn(event, ctx, hookMetadata);
|
|
2097
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2098
|
+
if (!turn || !sessionId) {
|
|
2099
|
+
return;
|
|
2100
|
+
}
|
|
2101
|
+
const existing = turn.stepsByIndex.get(event.data.stepIndex);
|
|
2102
|
+
if (existing) {
|
|
2103
|
+
existing.span.log({
|
|
2104
|
+
...existing.input !== void 0 ? { input: existing.input } : {},
|
|
2105
|
+
metadata: existing.metadata,
|
|
2106
|
+
metrics: existing.metrics,
|
|
2107
|
+
output: existing.output
|
|
2108
|
+
});
|
|
2109
|
+
const endTime = eventTime(event);
|
|
2110
|
+
existing.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2111
|
+
this.markStepEnded(event.data.turnId, event.data.stepIndex);
|
|
2112
|
+
}
|
|
2113
|
+
const stepOrdinal = this.stepOrdinal(event);
|
|
2114
|
+
const metadata = { ...turn.metadata };
|
|
2115
|
+
const input = consumeCapturedEveModelInput(
|
|
2116
|
+
this.state,
|
|
2117
|
+
sessionId,
|
|
2118
|
+
event.data.turnId,
|
|
2119
|
+
event.data.stepIndex
|
|
2120
|
+
);
|
|
2121
|
+
const { rowId: eventId, spanId } = await generateEveIds(
|
|
2122
|
+
"step",
|
|
2123
|
+
sessionId,
|
|
2124
|
+
event.data.turnId,
|
|
2125
|
+
String(stepOrdinal)
|
|
2126
|
+
);
|
|
2127
|
+
const span = await this.startEveChildSpan(turn.span, {
|
|
2128
|
+
event: {
|
|
2129
|
+
id: eventId,
|
|
2130
|
+
...input !== void 0 ? { input } : {},
|
|
2131
|
+
metadata
|
|
2132
|
+
},
|
|
2133
|
+
name: "eve.step",
|
|
2134
|
+
spanAttributes: { type: "llm" /* LLM */ },
|
|
2135
|
+
spanId,
|
|
2136
|
+
startTime: eventTime(event)
|
|
2137
|
+
});
|
|
2138
|
+
span.log({ ...input !== void 0 ? { input } : {}, metadata });
|
|
2139
|
+
turn.stepsByIndex.set(event.data.stepIndex, {
|
|
2140
|
+
...input !== void 0 ? { input } : {},
|
|
2141
|
+
metadata,
|
|
2142
|
+
metrics: {},
|
|
2143
|
+
span
|
|
2144
|
+
});
|
|
2145
|
+
}
|
|
2146
|
+
handleMessageCompleted(event, ctx) {
|
|
2147
|
+
const step = this.stepForEvent(event, ctx);
|
|
2148
|
+
if (!step) {
|
|
2149
|
+
return;
|
|
2150
|
+
}
|
|
2151
|
+
const existingMessage = Array.isArray(step.output) && isObject(step.output[0]) ? step.output[0].message : void 0;
|
|
2152
|
+
const existingToolCalls = isObject(existingMessage) ? existingMessage.tool_calls : void 0;
|
|
2153
|
+
step.output = [
|
|
2154
|
+
{
|
|
2155
|
+
finish_reason: normalizedFinishReason(event.data.finishReason),
|
|
2156
|
+
index: 0,
|
|
2157
|
+
message: {
|
|
2158
|
+
content: event.data.message,
|
|
2159
|
+
role: "assistant",
|
|
2160
|
+
...Array.isArray(existingToolCalls) ? { tool_calls: existingToolCalls } : {}
|
|
2161
|
+
}
|
|
2162
|
+
}
|
|
2163
|
+
];
|
|
2164
|
+
const turn = this.turnForEvent(event, ctx);
|
|
2165
|
+
if (turn && event.data.finishReason !== "tool-calls") {
|
|
2166
|
+
turn.output = event.data.message;
|
|
2167
|
+
}
|
|
2168
|
+
}
|
|
2169
|
+
handleResultCompleted(event, ctx) {
|
|
2170
|
+
const step = this.stepForEvent(event, ctx);
|
|
2171
|
+
if (step) {
|
|
2172
|
+
step.output = [
|
|
2173
|
+
{
|
|
2174
|
+
finish_reason: "stop",
|
|
2175
|
+
index: 0,
|
|
2176
|
+
message: {
|
|
2177
|
+
content: event.data.result,
|
|
2178
|
+
role: "assistant"
|
|
2179
|
+
}
|
|
2180
|
+
}
|
|
2181
|
+
];
|
|
2182
|
+
}
|
|
2183
|
+
const turn = this.turnForEvent(event, ctx);
|
|
2184
|
+
if (turn) {
|
|
2185
|
+
turn.output = event.data.result;
|
|
2186
|
+
}
|
|
2187
|
+
}
|
|
2188
|
+
async handleActionsRequested(event, ctx, hookMetadata) {
|
|
2189
|
+
const turn = await this.ensureTurn(event, ctx, hookMetadata);
|
|
2190
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2191
|
+
if (!turn || !sessionId) {
|
|
2192
|
+
return;
|
|
2193
|
+
}
|
|
2194
|
+
const traceActions = event.data.actions.filter(isTraceableActionRequest);
|
|
2195
|
+
if (traceActions.length === 0) {
|
|
2196
|
+
return;
|
|
2197
|
+
}
|
|
2198
|
+
for (const action of traceActions) {
|
|
2199
|
+
if (isToolCallAction(action)) {
|
|
2200
|
+
await this.startRequestedTool(event, turn, sessionId, action);
|
|
2201
|
+
} else if (isLocalSubagentCallAction(action)) {
|
|
2202
|
+
await this.startRequestedSubagent(event, turn, sessionId, action);
|
|
2203
|
+
}
|
|
2204
|
+
}
|
|
2205
|
+
const step = turn.stepsByIndex.get(event.data.stepIndex);
|
|
2206
|
+
if (!step) {
|
|
2207
|
+
return;
|
|
2208
|
+
}
|
|
2209
|
+
const toolCallsById = /* @__PURE__ */ new Map();
|
|
2210
|
+
if (Array.isArray(step.output) && isObject(step.output[0])) {
|
|
2211
|
+
const message = step.output[0]["message"];
|
|
2212
|
+
if (isObject(message) && Array.isArray(message["tool_calls"])) {
|
|
2213
|
+
for (const toolCall of message["tool_calls"]) {
|
|
2214
|
+
if (isObject(toolCall) && typeof toolCall["id"] === "string") {
|
|
2215
|
+
toolCallsById.set(toolCall["id"], toolCall);
|
|
2216
|
+
}
|
|
2217
|
+
}
|
|
2218
|
+
}
|
|
2219
|
+
}
|
|
2220
|
+
for (const action of traceActions) {
|
|
2221
|
+
const name = action.kind === "tool-call" ? action.toolName : action.subagentName ?? action.name ?? "agent";
|
|
2222
|
+
toolCallsById.set(action.callId, {
|
|
2223
|
+
function: {
|
|
2224
|
+
arguments: JSON.stringify(action.input),
|
|
2225
|
+
name
|
|
2226
|
+
},
|
|
2227
|
+
id: action.callId,
|
|
2228
|
+
type: "function"
|
|
2229
|
+
});
|
|
2230
|
+
}
|
|
2231
|
+
step.output = [
|
|
2232
|
+
{
|
|
2233
|
+
finish_reason: "tool_calls",
|
|
2234
|
+
index: 0,
|
|
2235
|
+
message: {
|
|
2236
|
+
content: null,
|
|
2237
|
+
role: "assistant",
|
|
2238
|
+
tool_calls: [...toolCallsById.values()]
|
|
2239
|
+
}
|
|
2240
|
+
}
|
|
2241
|
+
];
|
|
2242
|
+
step.span.log({ metadata: step.metadata, output: step.output });
|
|
2243
|
+
}
|
|
2244
|
+
async handleActionResult(event, ctx, hookMetadata) {
|
|
2245
|
+
if (isToolResult(event.data.result)) {
|
|
2246
|
+
await this.handleToolResult(event, ctx, event.data.result, hookMetadata);
|
|
2247
|
+
return;
|
|
2248
|
+
}
|
|
2249
|
+
if (isSubagentResult(event.data.result)) {
|
|
2250
|
+
await this.handleSubagentResult(
|
|
2251
|
+
event,
|
|
2252
|
+
ctx,
|
|
2253
|
+
event.data.result,
|
|
2254
|
+
hookMetadata
|
|
2255
|
+
);
|
|
2256
|
+
}
|
|
2257
|
+
}
|
|
2258
|
+
async handleToolResult(event, ctx, result, hookMetadata) {
|
|
2259
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2260
|
+
if (!sessionId) {
|
|
2261
|
+
return;
|
|
2262
|
+
}
|
|
2263
|
+
const key = toolKey(sessionId, result.callId);
|
|
2264
|
+
if (this.completedToolKeys.has(key)) {
|
|
2265
|
+
return;
|
|
2266
|
+
}
|
|
2267
|
+
const tool = this.toolsByCallKey.get(key) ?? await this.startSyntheticTool(event, ctx, result, hookMetadata);
|
|
2268
|
+
if (!tool) {
|
|
2269
|
+
return;
|
|
2270
|
+
}
|
|
2271
|
+
const failed = event.data.status === "failed" || result.isError === true || event.data.error !== void 0;
|
|
2272
|
+
tool.span.log({
|
|
2273
|
+
...failed ? {
|
|
2274
|
+
error: actionResultError(event.data.error, result.output)
|
|
2275
|
+
} : {},
|
|
2276
|
+
metadata: tool.metadata,
|
|
2277
|
+
output: result.output
|
|
2278
|
+
});
|
|
2279
|
+
const endTime = eventTime(event);
|
|
2280
|
+
tool.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2281
|
+
this.toolsByCallKey.delete(key);
|
|
2282
|
+
this.completedToolKeys.set(key, true);
|
|
2283
|
+
}
|
|
2284
|
+
async handleSubagentCalled(event, ctx, hookMetadata) {
|
|
2285
|
+
if (event.data.remote?.url) {
|
|
2286
|
+
return;
|
|
2287
|
+
}
|
|
2288
|
+
const turn = await this.ensureTurn(event, ctx, hookMetadata);
|
|
2289
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2290
|
+
if (!turn || !sessionId) {
|
|
2291
|
+
return;
|
|
2292
|
+
}
|
|
2293
|
+
const key = toolKey(sessionId, event.data.callId);
|
|
2294
|
+
const metadata = toolMetadataFromTurn(turn);
|
|
2295
|
+
const existing = this.toolsByCallKey.get(key);
|
|
2296
|
+
if (existing) {
|
|
2297
|
+
existing.metadata = { ...existing.metadata, ...metadata };
|
|
2298
|
+
existing.span.log({ metadata: existing.metadata });
|
|
2299
|
+
return;
|
|
2300
|
+
}
|
|
2301
|
+
if (this.completedToolKeys.has(key)) {
|
|
2302
|
+
return;
|
|
2303
|
+
}
|
|
2304
|
+
const { rowId: eventId, spanId } = await generateEveIds(
|
|
2305
|
+
"subagent",
|
|
2306
|
+
sessionId,
|
|
2307
|
+
event.data.callId
|
|
2308
|
+
);
|
|
2309
|
+
const pending = this.toolsByCallKey.get(key);
|
|
2310
|
+
if (pending || this.completedToolKeys.has(key)) {
|
|
2311
|
+
if (pending) {
|
|
2312
|
+
pending.metadata = { ...pending.metadata, ...metadata };
|
|
2313
|
+
pending.span.log({ metadata: pending.metadata });
|
|
2314
|
+
}
|
|
2315
|
+
return;
|
|
2316
|
+
}
|
|
2317
|
+
const span = await this.startEveChildSpan(turn.span, {
|
|
2318
|
+
event: {
|
|
2319
|
+
id: eventId,
|
|
2320
|
+
metadata
|
|
2321
|
+
},
|
|
2322
|
+
name: event.data.toolName ?? event.data.name,
|
|
2323
|
+
spanAttributes: { type: "tool" /* TOOL */ },
|
|
2324
|
+
spanId,
|
|
2325
|
+
startTime: eventTime(event)
|
|
2326
|
+
});
|
|
2327
|
+
span.log({ metadata });
|
|
2328
|
+
this.toolsByCallKey.set(key, {
|
|
2329
|
+
metadata,
|
|
2330
|
+
span,
|
|
2331
|
+
turnKey: turnKey(sessionId, event.data.turnId)
|
|
2332
|
+
});
|
|
2333
|
+
}
|
|
2334
|
+
async handleSubagentCompleted(event, ctx, hookMetadata) {
|
|
2335
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2336
|
+
if (!sessionId) {
|
|
2337
|
+
return;
|
|
2338
|
+
}
|
|
2339
|
+
const key = toolKey(sessionId, event.data.callId);
|
|
2340
|
+
if (this.completedToolKeys.has(key)) {
|
|
2341
|
+
return;
|
|
2342
|
+
}
|
|
2343
|
+
const subagent = this.toolsByCallKey.get(key) ?? await this.startSyntheticSubagent(event, ctx, hookMetadata);
|
|
2344
|
+
if (!subagent) {
|
|
2345
|
+
return;
|
|
2346
|
+
}
|
|
2347
|
+
subagent.span.log({
|
|
2348
|
+
...event.data.status === "failed" ? {
|
|
2349
|
+
error: actionResultError(event.data.error, event.data.output)
|
|
2350
|
+
} : {},
|
|
2351
|
+
metadata: subagent.metadata,
|
|
2352
|
+
...event.data.output !== void 0 ? { output: event.data.output } : {}
|
|
2353
|
+
});
|
|
2354
|
+
const endTime = eventTime(event);
|
|
2355
|
+
const recordedEndTime = subagent.span.end(
|
|
2356
|
+
endTime === void 0 ? void 0 : { endTime }
|
|
2357
|
+
);
|
|
2358
|
+
this.state.update((current) => {
|
|
2359
|
+
const normalized = normalizeEveTraceState(current);
|
|
2360
|
+
return {
|
|
2361
|
+
...normalized,
|
|
2362
|
+
spanReferences: normalized.spanReferences.map(
|
|
2363
|
+
(reference) => reference.spanId === subagent.span.spanId ? { ...reference, endTime: recordedEndTime } : reference
|
|
2364
|
+
)
|
|
2365
|
+
};
|
|
2366
|
+
});
|
|
2367
|
+
}
|
|
2368
|
+
async handleSubagentResult(event, ctx, result, hookMetadata) {
|
|
2369
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2370
|
+
if (!sessionId) {
|
|
2371
|
+
return;
|
|
2372
|
+
}
|
|
2373
|
+
const key = toolKey(sessionId, result.callId);
|
|
2374
|
+
if (this.completedToolKeys.has(key)) {
|
|
2375
|
+
return;
|
|
2376
|
+
}
|
|
2377
|
+
const subagent = this.toolsByCallKey.get(key) ?? await this.startSyntheticSubagentResult(
|
|
2378
|
+
event,
|
|
2379
|
+
ctx,
|
|
2380
|
+
result,
|
|
2381
|
+
hookMetadata
|
|
2382
|
+
);
|
|
2383
|
+
if (!subagent) {
|
|
2384
|
+
return;
|
|
2385
|
+
}
|
|
2386
|
+
const isError = event.data.status === "failed" || result.isError === true || event.data.error !== void 0;
|
|
2387
|
+
subagent.span.log({
|
|
2388
|
+
...isError ? {
|
|
2389
|
+
error: actionResultError(event.data.error, result.output)
|
|
2390
|
+
} : {},
|
|
2391
|
+
metadata: subagent.metadata,
|
|
2392
|
+
output: result.output
|
|
2393
|
+
});
|
|
2394
|
+
const endTime = eventTime(event);
|
|
2395
|
+
subagent.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2396
|
+
this.toolsByCallKey.delete(key);
|
|
2397
|
+
this.completedToolKeys.set(key, true);
|
|
2398
|
+
}
|
|
2399
|
+
handleStepCompleted(event, ctx) {
|
|
2400
|
+
const step = this.stepForEvent(event, ctx);
|
|
2401
|
+
if (!step) {
|
|
2402
|
+
return;
|
|
2403
|
+
}
|
|
2404
|
+
const usage = event.data.usage;
|
|
2405
|
+
const inputTokens = typeof usage?.inputTokens === "number" && Number.isFinite(usage.inputTokens) && usage.inputTokens >= 0 ? usage.inputTokens : void 0;
|
|
2406
|
+
const outputTokens = typeof usage?.outputTokens === "number" && Number.isFinite(usage.outputTokens) && usage.outputTokens >= 0 ? usage.outputTokens : void 0;
|
|
2407
|
+
const cacheReadTokens = typeof usage?.cacheReadTokens === "number" && Number.isFinite(usage.cacheReadTokens) && usage.cacheReadTokens >= 0 ? usage.cacheReadTokens : void 0;
|
|
2408
|
+
const cacheWriteTokens = typeof usage?.cacheWriteTokens === "number" && Number.isFinite(usage.cacheWriteTokens) && usage.cacheWriteTokens >= 0 ? usage.cacheWriteTokens : void 0;
|
|
2409
|
+
const costUsd = typeof usage?.costUsd === "number" && Number.isFinite(usage.costUsd) && usage.costUsd >= 0 ? usage.costUsd : void 0;
|
|
2410
|
+
const total = inputTokens !== void 0 && outputTokens !== void 0 ? inputTokens + outputTokens : void 0;
|
|
2411
|
+
const metrics = {
|
|
2412
|
+
...inputTokens !== void 0 ? { prompt_tokens: inputTokens } : {},
|
|
2413
|
+
...outputTokens !== void 0 ? { completion_tokens: outputTokens } : {},
|
|
2414
|
+
...total !== void 0 ? { tokens: total } : {},
|
|
2415
|
+
...cacheReadTokens !== void 0 ? { prompt_cached_tokens: cacheReadTokens } : {},
|
|
2416
|
+
...cacheWriteTokens !== void 0 ? { prompt_cache_creation_tokens: cacheWriteTokens } : {},
|
|
2417
|
+
...costUsd !== void 0 ? { estimated_cost: costUsd } : {}
|
|
2418
|
+
};
|
|
2419
|
+
step.metrics = { ...step.metrics, ...metrics };
|
|
2420
|
+
if (Array.isArray(step.output) && isObject(step.output[0])) {
|
|
2421
|
+
const finishReason = step.output[0].finish_reason;
|
|
2422
|
+
if (typeof finishReason !== "string") {
|
|
2423
|
+
step.output[0].finish_reason = normalizedFinishReason(
|
|
2424
|
+
event.data.finishReason
|
|
2425
|
+
);
|
|
2426
|
+
}
|
|
2427
|
+
}
|
|
2428
|
+
step.span.log({
|
|
2429
|
+
...step.input !== void 0 ? { input: step.input } : {},
|
|
2430
|
+
metadata: step.metadata,
|
|
2431
|
+
metrics,
|
|
2432
|
+
output: step.output
|
|
2433
|
+
});
|
|
2434
|
+
const endTime = eventTime(event);
|
|
2435
|
+
step.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2436
|
+
const turn = this.turnForEvent(event, ctx);
|
|
2437
|
+
if (turn) {
|
|
2438
|
+
for (const [key, value] of Object.entries(metrics)) {
|
|
2439
|
+
turn.metrics[key] = (turn.metrics[key] ?? 0) + value;
|
|
2440
|
+
}
|
|
2441
|
+
turn.stepsByIndex.delete(event.data.stepIndex);
|
|
2442
|
+
}
|
|
2443
|
+
this.markStepEnded(event.data.turnId, event.data.stepIndex);
|
|
2444
|
+
}
|
|
2445
|
+
handleStepFailed(event, ctx) {
|
|
2446
|
+
const step = this.stepForEvent(event, ctx);
|
|
2447
|
+
if (step) {
|
|
2448
|
+
step.span.log({
|
|
2449
|
+
error: errorFromMessage(
|
|
2450
|
+
event.data.message,
|
|
2451
|
+
event.data.code,
|
|
2452
|
+
event.data.details
|
|
2453
|
+
)
|
|
2454
|
+
});
|
|
2455
|
+
const endTime = eventTime(event);
|
|
2456
|
+
step.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2457
|
+
}
|
|
2458
|
+
const turn = this.turnForEvent(event, ctx);
|
|
2459
|
+
turn?.stepsByIndex.delete(event.data.stepIndex);
|
|
2460
|
+
this.markStepEnded(event.data.turnId, event.data.stepIndex);
|
|
2461
|
+
}
|
|
2462
|
+
handleTurnCompleted(event, ctx) {
|
|
2463
|
+
const turn = this.turnForEvent(event, ctx);
|
|
2464
|
+
if (!turn) {
|
|
2465
|
+
return;
|
|
2466
|
+
}
|
|
2467
|
+
this.finalizeTurn(turn, {
|
|
2468
|
+
endTime: eventTime(event)
|
|
2469
|
+
});
|
|
2470
|
+
}
|
|
2471
|
+
handleTurnFailed(event, ctx) {
|
|
2472
|
+
const turn = this.turnForEvent(event, ctx);
|
|
2473
|
+
if (!turn) {
|
|
2474
|
+
return;
|
|
2475
|
+
}
|
|
2476
|
+
this.finalizeTurn(turn, {
|
|
2477
|
+
endTime: eventTime(event),
|
|
2478
|
+
error: errorFromMessage(
|
|
2479
|
+
event.data.message,
|
|
2480
|
+
event.data.code,
|
|
2481
|
+
event.data.details
|
|
2482
|
+
)
|
|
2483
|
+
});
|
|
2484
|
+
}
|
|
2485
|
+
handleSessionFailed(event, ctx) {
|
|
2486
|
+
const sessionId = event.data.sessionId || sessionIdFromContext(ctx);
|
|
2487
|
+
if (!sessionId) {
|
|
2488
|
+
return;
|
|
2489
|
+
}
|
|
2490
|
+
const error = errorFromMessage(
|
|
2491
|
+
event.data.message,
|
|
2492
|
+
event.data.code,
|
|
2493
|
+
event.data.details
|
|
2494
|
+
);
|
|
2495
|
+
for (const [key, turn] of this.turnsByKey) {
|
|
2496
|
+
if (!key.startsWith(`${sessionId}:`)) {
|
|
2497
|
+
continue;
|
|
2498
|
+
}
|
|
2499
|
+
this.finalizeTurn(turn, {
|
|
2500
|
+
endTime: eventTime(event),
|
|
2501
|
+
error
|
|
2502
|
+
});
|
|
2503
|
+
}
|
|
2504
|
+
for (const [key, tool] of this.toolsByCallKey) {
|
|
2505
|
+
if (key.startsWith(`${sessionId}:`)) {
|
|
2506
|
+
const endTime = eventTime(event);
|
|
2507
|
+
if (!tool.endedByTurn) {
|
|
2508
|
+
tool.span.log({ metadata: tool.metadata });
|
|
2509
|
+
tool.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2510
|
+
tool.endedByTurn = true;
|
|
2511
|
+
}
|
|
2512
|
+
}
|
|
2513
|
+
}
|
|
2514
|
+
}
|
|
2515
|
+
handleSessionCompleted(event, ctx) {
|
|
2516
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2517
|
+
if (!sessionId) {
|
|
2518
|
+
return;
|
|
2519
|
+
}
|
|
2520
|
+
for (const [key, turn] of this.turnsByKey) {
|
|
2521
|
+
if (!key.startsWith(`${sessionId}:`)) {
|
|
2522
|
+
continue;
|
|
2523
|
+
}
|
|
2524
|
+
this.finalizeTurn(turn, {
|
|
2525
|
+
endTime: eventTime(event)
|
|
2526
|
+
});
|
|
2527
|
+
}
|
|
2528
|
+
for (const [key, tool] of this.toolsByCallKey) {
|
|
2529
|
+
if (key.startsWith(`${sessionId}:`) && !tool.endedByTurn) {
|
|
2530
|
+
const endTime = eventTime(event);
|
|
2531
|
+
tool.span.log({ metadata: tool.metadata });
|
|
2532
|
+
tool.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2533
|
+
tool.endedByTurn = true;
|
|
2534
|
+
}
|
|
2535
|
+
}
|
|
2536
|
+
}
|
|
2537
|
+
async ensureTurn(event, ctx, hookMetadata) {
|
|
2538
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2539
|
+
if (!sessionId) {
|
|
2540
|
+
return void 0;
|
|
2541
|
+
}
|
|
2542
|
+
const key = turnKey(sessionId, event.data.turnId);
|
|
2543
|
+
const existing = this.turnsByKey.get(key);
|
|
2544
|
+
if (existing) {
|
|
2545
|
+
return existing;
|
|
2546
|
+
}
|
|
2547
|
+
const metadata = {
|
|
2548
|
+
...readEveTraceState(this.state).metadata,
|
|
2549
|
+
...hookMetadata ?? {},
|
|
2550
|
+
"eve.session_id": sessionId
|
|
2551
|
+
};
|
|
2552
|
+
const span = await this.startTurnSpan(sessionId, event, ctx, metadata);
|
|
2553
|
+
span.log({ metadata });
|
|
2554
|
+
const state = {
|
|
2555
|
+
key,
|
|
2556
|
+
metadata,
|
|
2557
|
+
metrics: {},
|
|
2558
|
+
span,
|
|
2559
|
+
stepsByIndex: /* @__PURE__ */ new Map(),
|
|
2560
|
+
turnId: event.data.turnId
|
|
2561
|
+
};
|
|
2562
|
+
this.turnsByKey.set(key, state);
|
|
2563
|
+
return state;
|
|
2564
|
+
}
|
|
2565
|
+
async startRequestedTool(event, turn, sessionId, action) {
|
|
2566
|
+
const key = toolKey(sessionId, action.callId);
|
|
2567
|
+
if (this.toolsByCallKey.has(key) || this.completedToolKeys.has(key)) {
|
|
2568
|
+
return;
|
|
2569
|
+
}
|
|
2570
|
+
const metadata = toolMetadataFromTurn(turn);
|
|
2571
|
+
const { rowId: eventId, spanId } = await generateEveIds(
|
|
2572
|
+
"tool",
|
|
2573
|
+
sessionId,
|
|
2574
|
+
event.data.turnId,
|
|
2575
|
+
action.callId
|
|
2576
|
+
);
|
|
2577
|
+
if (this.toolsByCallKey.has(key) || this.completedToolKeys.has(key)) {
|
|
2578
|
+
return;
|
|
2579
|
+
}
|
|
2580
|
+
const span = await this.startEveChildSpan(turn.span, {
|
|
2581
|
+
event: {
|
|
2582
|
+
id: eventId,
|
|
2583
|
+
input: action.input,
|
|
2584
|
+
metadata
|
|
2585
|
+
},
|
|
2586
|
+
name: action.toolName,
|
|
2587
|
+
spanAttributes: { type: "tool" /* TOOL */ },
|
|
2588
|
+
spanId,
|
|
2589
|
+
startTime: eventTime(event)
|
|
2590
|
+
});
|
|
2591
|
+
span.log({ input: action.input, metadata });
|
|
2592
|
+
this.toolsByCallKey.set(key, {
|
|
2593
|
+
metadata,
|
|
2594
|
+
span,
|
|
2595
|
+
turnKey: turnKey(sessionId, event.data.turnId)
|
|
2596
|
+
});
|
|
2597
|
+
}
|
|
2598
|
+
async startRequestedSubagent(event, turn, sessionId, action) {
|
|
2599
|
+
const key = toolKey(sessionId, action.callId);
|
|
2600
|
+
if (this.toolsByCallKey.has(key) || this.completedToolKeys.has(key)) {
|
|
2601
|
+
return;
|
|
2602
|
+
}
|
|
2603
|
+
const name = action.subagentName ?? action.name ?? "agent";
|
|
2604
|
+
const metadata = toolMetadataFromTurn(turn);
|
|
2605
|
+
const { rowId: eventId, spanId } = await generateEveIds(
|
|
2606
|
+
"subagent",
|
|
2607
|
+
sessionId,
|
|
2608
|
+
action.callId
|
|
2609
|
+
);
|
|
2610
|
+
if (this.toolsByCallKey.has(key) || this.completedToolKeys.has(key)) {
|
|
2611
|
+
return;
|
|
2612
|
+
}
|
|
2613
|
+
const span = await this.startEveChildSpan(turn.span, {
|
|
2614
|
+
event: {
|
|
2615
|
+
id: eventId,
|
|
2616
|
+
input: action.input,
|
|
2617
|
+
metadata
|
|
2618
|
+
},
|
|
2619
|
+
name,
|
|
2620
|
+
spanAttributes: { type: "tool" /* TOOL */ },
|
|
2621
|
+
spanId,
|
|
2622
|
+
startTime: eventTime(event)
|
|
2623
|
+
});
|
|
2624
|
+
span.log({ input: action.input, metadata });
|
|
2625
|
+
this.toolsByCallKey.set(key, {
|
|
2626
|
+
metadata,
|
|
2627
|
+
span,
|
|
2628
|
+
turnKey: turnKey(sessionId, event.data.turnId)
|
|
2629
|
+
});
|
|
2630
|
+
}
|
|
2631
|
+
async startSyntheticTool(event, ctx, result, hookMetadata) {
|
|
2632
|
+
const turn = await this.ensureTurn(event, ctx, hookMetadata);
|
|
2633
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2634
|
+
if (!turn || !sessionId) {
|
|
2635
|
+
return void 0;
|
|
2636
|
+
}
|
|
2637
|
+
const metadata = toolMetadataFromTurn(turn);
|
|
2638
|
+
const { rowId: eventId, spanId } = await generateEveIds(
|
|
2639
|
+
"tool",
|
|
2640
|
+
sessionId,
|
|
2641
|
+
event.data.turnId,
|
|
2642
|
+
result.callId
|
|
2643
|
+
);
|
|
2644
|
+
const existing = this.toolsByCallKey.get(toolKey(sessionId, result.callId));
|
|
2645
|
+
if (existing) {
|
|
2646
|
+
return existing;
|
|
2647
|
+
}
|
|
2648
|
+
const span = await this.startEveChildSpan(turn.span, {
|
|
2649
|
+
event: {
|
|
2650
|
+
id: eventId,
|
|
2651
|
+
metadata
|
|
2652
|
+
},
|
|
2653
|
+
name: result.toolName,
|
|
2654
|
+
spanAttributes: { type: "tool" /* TOOL */ },
|
|
2655
|
+
spanId,
|
|
2656
|
+
startTime: eventTime(event)
|
|
2657
|
+
});
|
|
2658
|
+
span.log({ metadata });
|
|
2659
|
+
const state = {
|
|
2660
|
+
metadata,
|
|
2661
|
+
span,
|
|
2662
|
+
turnKey: turnKey(sessionId, event.data.turnId)
|
|
2663
|
+
};
|
|
2664
|
+
this.toolsByCallKey.set(toolKey(sessionId, result.callId), state);
|
|
2665
|
+
return state;
|
|
2666
|
+
}
|
|
2667
|
+
async startSyntheticSubagent(event, ctx, hookMetadata) {
|
|
2668
|
+
const turn = await this.ensureTurn(event, ctx, hookMetadata);
|
|
2669
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2670
|
+
if (!turn || !sessionId) {
|
|
2671
|
+
return void 0;
|
|
2672
|
+
}
|
|
2673
|
+
const metadata = toolMetadataFromTurn(turn);
|
|
2674
|
+
const { rowId: eventId, spanId } = await generateEveIds(
|
|
2675
|
+
"subagent",
|
|
2676
|
+
sessionId,
|
|
2677
|
+
event.data.callId
|
|
2678
|
+
);
|
|
2679
|
+
const existing = this.toolsByCallKey.get(
|
|
2680
|
+
toolKey(sessionId, event.data.callId)
|
|
2681
|
+
);
|
|
2682
|
+
if (existing) {
|
|
2683
|
+
return existing;
|
|
2684
|
+
}
|
|
2685
|
+
const span = await this.startEveChildSpan(turn.span, {
|
|
2686
|
+
event: {
|
|
2687
|
+
id: eventId,
|
|
2688
|
+
metadata
|
|
2689
|
+
},
|
|
2690
|
+
name: event.data.subagentName,
|
|
2691
|
+
spanAttributes: { type: "tool" /* TOOL */ },
|
|
2692
|
+
spanId,
|
|
2693
|
+
startTime: eventTime(event)
|
|
2694
|
+
});
|
|
2695
|
+
span.log({ metadata });
|
|
2696
|
+
const state = {
|
|
2697
|
+
metadata,
|
|
2698
|
+
span,
|
|
2699
|
+
turnKey: turnKey(sessionId, event.data.turnId)
|
|
2700
|
+
};
|
|
2701
|
+
this.toolsByCallKey.set(toolKey(sessionId, event.data.callId), state);
|
|
2702
|
+
return state;
|
|
2703
|
+
}
|
|
2704
|
+
async startSyntheticSubagentResult(event, ctx, result, hookMetadata) {
|
|
2705
|
+
const turn = await this.ensureTurn(event, ctx, hookMetadata);
|
|
2706
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2707
|
+
if (!turn || !sessionId) {
|
|
2708
|
+
return void 0;
|
|
2709
|
+
}
|
|
2710
|
+
const metadata = toolMetadataFromTurn(turn);
|
|
2711
|
+
const { rowId: eventId, spanId } = await generateEveIds(
|
|
2712
|
+
"subagent",
|
|
2713
|
+
sessionId,
|
|
2714
|
+
result.callId
|
|
2715
|
+
);
|
|
2716
|
+
const existing = this.toolsByCallKey.get(toolKey(sessionId, result.callId));
|
|
2717
|
+
if (existing) {
|
|
2718
|
+
return existing;
|
|
2719
|
+
}
|
|
2720
|
+
const span = await this.startEveChildSpan(turn.span, {
|
|
2721
|
+
event: {
|
|
2722
|
+
id: eventId,
|
|
2723
|
+
metadata
|
|
2724
|
+
},
|
|
2725
|
+
name: result.subagentName,
|
|
2726
|
+
spanAttributes: { type: "tool" /* TOOL */ },
|
|
2727
|
+
spanId,
|
|
2728
|
+
startTime: eventTime(event)
|
|
2729
|
+
});
|
|
2730
|
+
span.log({ metadata });
|
|
2731
|
+
const state = {
|
|
2732
|
+
metadata,
|
|
2733
|
+
span,
|
|
2734
|
+
turnKey: turnKey(sessionId, event.data.turnId)
|
|
2735
|
+
};
|
|
2736
|
+
this.toolsByCallKey.set(toolKey(sessionId, result.callId), state);
|
|
2737
|
+
return state;
|
|
2738
|
+
}
|
|
2739
|
+
async startTurnSpan(sessionId, event, ctx, metadata) {
|
|
2740
|
+
const session = isObject(ctx) ? ctx["session"] : void 0;
|
|
2741
|
+
const parent = isObject(session) ? session["parent"] : void 0;
|
|
2742
|
+
const parentTurn = isObject(parent) ? parent["turn"] : void 0;
|
|
2743
|
+
const parentLineage = isObject(parent) && typeof parent["callId"] === "string" && typeof parent["sessionId"] === "string" && isObject(parentTurn) && typeof parentTurn["id"] === "string" ? {
|
|
2744
|
+
callId: parent["callId"],
|
|
2745
|
+
sessionId: parent["sessionId"],
|
|
2746
|
+
turnId: parentTurn["id"]
|
|
2747
|
+
} : void 0;
|
|
2748
|
+
const [{ rowId: eventId, spanId }, rootSpanId, parentSpanId] = await Promise.all([
|
|
2749
|
+
generateEveIds("turn", sessionId, event.data.turnId),
|
|
2750
|
+
deterministicEveId(
|
|
2751
|
+
"eve:root",
|
|
2752
|
+
parentLineage?.sessionId ?? sessionId,
|
|
2753
|
+
parentLineage?.turnId ?? event.data.turnId
|
|
2754
|
+
),
|
|
2755
|
+
parentLineage ? deterministicEveId(
|
|
2756
|
+
"eve:subagent",
|
|
2757
|
+
parentLineage.sessionId,
|
|
2758
|
+
parentLineage.callId
|
|
2759
|
+
) : Promise.resolve(void 0)
|
|
2760
|
+
]);
|
|
2761
|
+
return await this.startEveSpan({
|
|
2762
|
+
event: {
|
|
2763
|
+
id: eventId,
|
|
2764
|
+
metadata
|
|
2765
|
+
},
|
|
2766
|
+
name: "eve.turn",
|
|
2767
|
+
parentSpanIds: parentSpanId ? { rootSpanId, spanId: parentSpanId } : { parentSpanIds: [], rootSpanId },
|
|
2768
|
+
spanAttributes: { type: "task" /* TASK */ },
|
|
2769
|
+
spanId,
|
|
2770
|
+
startTime: eventTime(event)
|
|
2771
|
+
});
|
|
2772
|
+
}
|
|
2773
|
+
turnForEvent(event, ctx) {
|
|
2774
|
+
const sessionId = sessionIdFromContext(ctx);
|
|
2775
|
+
return sessionId ? this.turnsByKey.get(turnKey(sessionId, event.data.turnId)) : void 0;
|
|
2776
|
+
}
|
|
2777
|
+
stepForEvent(event, ctx) {
|
|
2778
|
+
return this.turnForEvent(event, ctx)?.stepsByIndex.get(
|
|
2779
|
+
event.data.stepIndex
|
|
2780
|
+
);
|
|
2781
|
+
}
|
|
2782
|
+
finalizeTurn(turn, args) {
|
|
2783
|
+
const { endTime } = args;
|
|
2784
|
+
for (const step of turn.stepsByIndex.values()) {
|
|
2785
|
+
step.span.log({
|
|
2786
|
+
...step.input !== void 0 ? { input: step.input } : {},
|
|
2787
|
+
metadata: step.metadata,
|
|
2788
|
+
metrics: step.metrics,
|
|
2789
|
+
output: step.output
|
|
2790
|
+
});
|
|
2791
|
+
step.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2792
|
+
}
|
|
2793
|
+
turn.stepsByIndex.clear();
|
|
2794
|
+
for (const tool of this.toolsByCallKey.values()) {
|
|
2795
|
+
if (tool.turnKey !== turn.key) {
|
|
2796
|
+
continue;
|
|
2797
|
+
}
|
|
2798
|
+
if (tool.endedByTurn) {
|
|
2799
|
+
continue;
|
|
2800
|
+
}
|
|
2801
|
+
tool.span.log({ metadata: tool.metadata });
|
|
2802
|
+
tool.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2803
|
+
tool.endedByTurn = true;
|
|
2804
|
+
}
|
|
2805
|
+
if (args.error) {
|
|
2806
|
+
turn.span.log({ error: args.error });
|
|
2807
|
+
} else {
|
|
2808
|
+
turn.span.log({
|
|
2809
|
+
metadata: turn.metadata,
|
|
2810
|
+
metrics: turn.metrics,
|
|
2811
|
+
output: turn.output
|
|
2812
|
+
});
|
|
2813
|
+
}
|
|
2814
|
+
turn.span.end(endTime === void 0 ? void 0 : { endTime });
|
|
2815
|
+
this.turnsByKey.delete(turn.key);
|
|
2816
|
+
this.state.update((current) => {
|
|
2817
|
+
const normalized = normalizeEveTraceState(current);
|
|
2818
|
+
return {
|
|
2819
|
+
...normalized,
|
|
2820
|
+
stepStarts: normalized.stepStarts.filter(
|
|
2821
|
+
(entry) => entry.turnId !== turn.turnId
|
|
2822
|
+
)
|
|
2823
|
+
};
|
|
2824
|
+
});
|
|
2825
|
+
}
|
|
2826
|
+
cleanupSession(sessionId) {
|
|
2827
|
+
const keyPrefix = `${sessionId}:`;
|
|
2828
|
+
for (const key of this.turnsByKey.keys()) {
|
|
2829
|
+
if (key.startsWith(keyPrefix)) {
|
|
2830
|
+
this.turnsByKey.delete(key);
|
|
2831
|
+
}
|
|
2832
|
+
}
|
|
2833
|
+
for (const key of this.toolsByCallKey.keys()) {
|
|
2834
|
+
if (key.startsWith(keyPrefix)) {
|
|
2835
|
+
this.toolsByCallKey.delete(key);
|
|
2836
|
+
}
|
|
2837
|
+
}
|
|
2838
|
+
for (const key of this.completedToolKeys.keys()) {
|
|
2839
|
+
if (key.startsWith(keyPrefix)) {
|
|
2840
|
+
this.completedToolKeys.delete(key);
|
|
2841
|
+
}
|
|
2842
|
+
}
|
|
2843
|
+
this.state.update(() => emptyEveTraceState());
|
|
2844
|
+
}
|
|
2845
|
+
async flushInstrumentation() {
|
|
2846
|
+
try {
|
|
2847
|
+
await flush();
|
|
2848
|
+
return true;
|
|
2849
|
+
} catch (error) {
|
|
2850
|
+
debugLogger.warn("Error in Eve flush instrumentation:", error);
|
|
2851
|
+
return false;
|
|
2852
|
+
}
|
|
2853
|
+
}
|
|
2854
|
+
};
|
|
2855
|
+
function emptyEveTraceState() {
|
|
2856
|
+
return {
|
|
2857
|
+
llmInputs: [],
|
|
2858
|
+
metadata: {},
|
|
2859
|
+
spanReferences: [],
|
|
2860
|
+
stepStarts: []
|
|
2861
|
+
};
|
|
2862
|
+
}
|
|
2863
|
+
function normalizeEveTraceState(state) {
|
|
2864
|
+
if (!isObject(state)) {
|
|
2865
|
+
return emptyEveTraceState();
|
|
2866
|
+
}
|
|
2867
|
+
const metadata = isObject(state["metadata"]) ? state["metadata"] : {};
|
|
2868
|
+
const spanReferences = Array.isArray(state["spanReferences"]) ? state["spanReferences"].flatMap((entry) => {
|
|
2869
|
+
if (!isObject(entry)) {
|
|
2870
|
+
return [];
|
|
2871
|
+
}
|
|
2872
|
+
const exported = entry["exported"];
|
|
2873
|
+
const endTime = entry["endTime"];
|
|
2874
|
+
const rootSpanId = entry["rootSpanId"];
|
|
2875
|
+
const rowId = entry["rowId"];
|
|
2876
|
+
const spanId = entry["spanId"];
|
|
2877
|
+
const startEvent = entry["startEvent"];
|
|
2878
|
+
const startEventCreated = isObject(startEvent) ? startEvent["created"] : void 0;
|
|
2879
|
+
const startEventMetrics = isObject(startEvent) ? startEvent["metrics"] : void 0;
|
|
2880
|
+
const startEventSpanAttributes = isObject(startEvent) ? startEvent["span_attributes"] : void 0;
|
|
2881
|
+
const startEventSpanParents = isObject(startEvent) ? startEvent["span_parents"] : void 0;
|
|
2882
|
+
const normalizedStartEvent = typeof startEventCreated === "string" && isObject(startEventMetrics) && typeof startEventMetrics["start"] === "number" && Number.isFinite(startEventMetrics["start"]) && isObject(startEventSpanAttributes) && Array.isArray(startEventSpanParents) && startEventSpanParents.every(
|
|
2883
|
+
(parent) => typeof parent === "string"
|
|
2884
|
+
) ? {
|
|
2885
|
+
created: startEventCreated,
|
|
2886
|
+
metrics: { start: startEventMetrics["start"] },
|
|
2887
|
+
span_attributes: { ...startEventSpanAttributes },
|
|
2888
|
+
span_parents: [...startEventSpanParents]
|
|
2889
|
+
} : void 0;
|
|
2890
|
+
return typeof exported === "string" && typeof rootSpanId === "string" && typeof rowId === "string" && typeof spanId === "string" ? [
|
|
2891
|
+
{
|
|
2892
|
+
...typeof endTime === "number" && Number.isFinite(endTime) ? { endTime } : {},
|
|
2893
|
+
exported,
|
|
2894
|
+
rootSpanId,
|
|
2895
|
+
rowId,
|
|
2896
|
+
spanId,
|
|
2897
|
+
...normalizedStartEvent ? { startEvent: normalizedStartEvent } : {}
|
|
2898
|
+
}
|
|
2899
|
+
] : [];
|
|
2900
|
+
}).slice(-MAX_STORED_SPAN_REFERENCES) : [];
|
|
2901
|
+
const llmInputs = Array.isArray(state["llmInputs"]) ? state["llmInputs"].flatMap((entry) => {
|
|
2902
|
+
if (!isObject(entry)) {
|
|
2903
|
+
return [];
|
|
2904
|
+
}
|
|
2905
|
+
const key = entry["key"];
|
|
2906
|
+
const input = entry["input"];
|
|
2907
|
+
return typeof key === "string" && isCapturedModelInput(input) ? [{ input, key }] : [];
|
|
2908
|
+
}).slice(-MAX_STORED_LLM_INPUTS) : [];
|
|
2909
|
+
const stepStarts = Array.isArray(state["stepStarts"]) ? state["stepStarts"].flatMap((entry) => {
|
|
2910
|
+
if (!isObject(entry)) {
|
|
2911
|
+
return [];
|
|
2912
|
+
}
|
|
2913
|
+
const ordinal = entry["ordinal"];
|
|
2914
|
+
const open = entry["open"];
|
|
2915
|
+
const stepIndex = entry["stepIndex"];
|
|
2916
|
+
const turnId = entry["turnId"];
|
|
2917
|
+
return typeof ordinal === "number" && Number.isInteger(ordinal) && ordinal >= 0 && typeof open === "boolean" && typeof stepIndex === "number" && Number.isInteger(stepIndex) && typeof turnId === "string" ? [{ open, ordinal, stepIndex, turnId }] : [];
|
|
2918
|
+
}).slice(-MAX_STORED_STEP_STARTS) : [];
|
|
2919
|
+
return { llmInputs, metadata: { ...metadata }, spanReferences, stepStarts };
|
|
2920
|
+
}
|
|
2921
|
+
function readEveTraceState(state) {
|
|
2922
|
+
try {
|
|
2923
|
+
return normalizeEveTraceState(state.get());
|
|
2924
|
+
} catch {
|
|
2925
|
+
return emptyEveTraceState();
|
|
2926
|
+
}
|
|
2927
|
+
}
|
|
2928
|
+
function captureEveModelInput(state, input) {
|
|
2929
|
+
if (!isObject(input)) {
|
|
2930
|
+
return;
|
|
2931
|
+
}
|
|
2932
|
+
const session = input["session"];
|
|
2933
|
+
const turn = input["turn"];
|
|
2934
|
+
const step = input["step"];
|
|
2935
|
+
if (!isObject(session) || !isObject(turn) || !isObject(step)) {
|
|
2936
|
+
return;
|
|
2937
|
+
}
|
|
2938
|
+
const sessionId = session["id"];
|
|
2939
|
+
const turnId = turn["id"];
|
|
2940
|
+
const stepIndex = step["index"];
|
|
2941
|
+
if (typeof sessionId !== "string" || typeof turnId !== "string" || typeof stepIndex !== "number" || !Number.isInteger(stepIndex)) {
|
|
2942
|
+
return;
|
|
2943
|
+
}
|
|
2944
|
+
const captured = capturedModelInput(input["modelInput"]);
|
|
2945
|
+
if (!captured) {
|
|
2946
|
+
return;
|
|
2947
|
+
}
|
|
2948
|
+
const key = llmInputKey(sessionId, turnId, stepIndex);
|
|
2949
|
+
state.update((current) => {
|
|
2950
|
+
const normalized = normalizeEveTraceState(current);
|
|
2951
|
+
const llmInputs = [...normalized.llmInputs, { input: captured, key }];
|
|
2952
|
+
return {
|
|
2953
|
+
...normalized,
|
|
2954
|
+
llmInputs: llmInputs.slice(-MAX_STORED_LLM_INPUTS)
|
|
2955
|
+
};
|
|
2956
|
+
});
|
|
2957
|
+
}
|
|
2958
|
+
function consumeCapturedEveModelInput(state, sessionId, turnId, stepIndex) {
|
|
2959
|
+
try {
|
|
2960
|
+
const key = llmInputKey(sessionId, turnId, stepIndex);
|
|
2961
|
+
let input;
|
|
2962
|
+
state.update((current) => {
|
|
2963
|
+
const normalized = normalizeEveTraceState(current);
|
|
2964
|
+
const index = normalized.llmInputs.findIndex(
|
|
2965
|
+
(candidate) => candidate.key === key
|
|
2966
|
+
);
|
|
2967
|
+
if (index < 0) {
|
|
2968
|
+
return normalized;
|
|
2969
|
+
}
|
|
2970
|
+
input = normalized.llmInputs[index]?.input;
|
|
2971
|
+
return {
|
|
2972
|
+
...normalized,
|
|
2973
|
+
llmInputs: normalized.llmInputs.filter(
|
|
2974
|
+
(_, candidateIndex) => candidateIndex !== index
|
|
2975
|
+
)
|
|
2976
|
+
};
|
|
2977
|
+
});
|
|
2978
|
+
return input;
|
|
2979
|
+
} catch (error) {
|
|
2980
|
+
debugLogger.warn("Error in Eve LLM input consumption:", error);
|
|
2981
|
+
return void 0;
|
|
2982
|
+
}
|
|
2983
|
+
}
|
|
2984
|
+
function capturedModelInput(modelInput) {
|
|
2985
|
+
if (!isObject(modelInput)) {
|
|
2986
|
+
return void 0;
|
|
2987
|
+
}
|
|
2988
|
+
const messages = modelInput["messages"];
|
|
2989
|
+
if (!Array.isArray(messages)) {
|
|
2990
|
+
return void 0;
|
|
2991
|
+
}
|
|
2992
|
+
const instructions = modelInput["instructions"];
|
|
2993
|
+
const value = [
|
|
2994
|
+
...instructions !== void 0 ? [{ content: instructions, role: "system" }] : [],
|
|
2995
|
+
...messages
|
|
2996
|
+
];
|
|
2997
|
+
try {
|
|
2998
|
+
const cloned = JSON.parse(JSON.stringify(value));
|
|
2999
|
+
if (!Array.isArray(cloned)) {
|
|
3000
|
+
return void 0;
|
|
3001
|
+
}
|
|
3002
|
+
return cloned;
|
|
3003
|
+
} catch {
|
|
3004
|
+
return void 0;
|
|
3005
|
+
}
|
|
3006
|
+
}
|
|
3007
|
+
function isCapturedModelInput(input) {
|
|
3008
|
+
return Array.isArray(input);
|
|
3009
|
+
}
|
|
3010
|
+
function llmInputKey(sessionId, turnId, stepIndex) {
|
|
3011
|
+
return `${sessionId}\0${turnId}\0${stepIndex}`;
|
|
3012
|
+
}
|
|
3013
|
+
function modelMetadataFromRuntime(runtime) {
|
|
3014
|
+
if (!isObject(runtime)) {
|
|
3015
|
+
return {};
|
|
3016
|
+
}
|
|
3017
|
+
const modelId = runtime["modelId"];
|
|
3018
|
+
return typeof modelId === "string" && !modelId.trim().startsWith("dynamic:") ? modelMetadataFromModelId(modelId) : {};
|
|
3019
|
+
}
|
|
3020
|
+
function modelMetadataFromModelId(modelId) {
|
|
3021
|
+
const normalized = modelId.trim();
|
|
3022
|
+
if (!normalized) {
|
|
3023
|
+
return {};
|
|
3024
|
+
}
|
|
3025
|
+
const slashIndex = normalized.indexOf("/");
|
|
3026
|
+
if (slashIndex > 0 && slashIndex < normalized.length - 1) {
|
|
3027
|
+
return {
|
|
3028
|
+
model: normalized.slice(slashIndex + 1),
|
|
3029
|
+
provider: normalized.slice(0, slashIndex)
|
|
3030
|
+
};
|
|
3031
|
+
}
|
|
3032
|
+
return {
|
|
3033
|
+
model: normalized
|
|
3034
|
+
};
|
|
3035
|
+
}
|
|
3036
|
+
function sessionIdFromContext(ctx) {
|
|
3037
|
+
if (!isObject(ctx)) {
|
|
3038
|
+
return void 0;
|
|
3039
|
+
}
|
|
3040
|
+
const session = ctx["session"];
|
|
3041
|
+
if (!isObject(session)) {
|
|
3042
|
+
return void 0;
|
|
3043
|
+
}
|
|
3044
|
+
const id = session["id"];
|
|
3045
|
+
return typeof id === "string" ? id : void 0;
|
|
3046
|
+
}
|
|
3047
|
+
function toolMetadataFromTurn(turn) {
|
|
3048
|
+
const { model: _model, provider: _provider, ...metadata } = turn.metadata;
|
|
3049
|
+
return metadata;
|
|
3050
|
+
}
|
|
3051
|
+
function isToolCallAction(action) {
|
|
3052
|
+
return isObject(action) && action["kind"] === "tool-call" && typeof action["callId"] === "string" && typeof action["toolName"] === "string" && isObject(action["input"]);
|
|
3053
|
+
}
|
|
3054
|
+
function isLocalSubagentCallAction(action) {
|
|
3055
|
+
return isObject(action) && action["kind"] === "subagent-call" && typeof action["callId"] === "string" && isObject(action["input"]);
|
|
3056
|
+
}
|
|
3057
|
+
function isTraceableActionRequest(action) {
|
|
3058
|
+
return isToolCallAction(action) || isLocalSubagentCallAction(action);
|
|
3059
|
+
}
|
|
3060
|
+
function isToolResult(result) {
|
|
3061
|
+
return isObject(result) && result["kind"] === "tool-result" && typeof result["callId"] === "string" && typeof result["toolName"] === "string";
|
|
3062
|
+
}
|
|
3063
|
+
function isSubagentResult(result) {
|
|
3064
|
+
return isObject(result) && result["kind"] === "subagent-result" && typeof result["callId"] === "string" && typeof result["subagentName"] === "string";
|
|
3065
|
+
}
|
|
3066
|
+
function normalizedFinishReason(finishReason) {
|
|
3067
|
+
switch (finishReason) {
|
|
3068
|
+
case "content-filter":
|
|
3069
|
+
return "content_filter";
|
|
3070
|
+
case "tool-calls":
|
|
3071
|
+
return "tool_calls";
|
|
3072
|
+
default:
|
|
3073
|
+
return finishReason;
|
|
3074
|
+
}
|
|
3075
|
+
}
|
|
3076
|
+
function errorFromMessage(message, code, details) {
|
|
3077
|
+
const error = new Error(`${code}: ${message}`);
|
|
3078
|
+
if (details !== void 0) {
|
|
3079
|
+
error.cause = details;
|
|
3080
|
+
}
|
|
3081
|
+
return error;
|
|
3082
|
+
}
|
|
3083
|
+
function actionResultError(error, output) {
|
|
3084
|
+
if (error) {
|
|
3085
|
+
return errorFromMessage(error.message, error.code);
|
|
3086
|
+
}
|
|
3087
|
+
const result = new Error("Eve action failed");
|
|
3088
|
+
if (output !== void 0) {
|
|
3089
|
+
result.cause = output;
|
|
3090
|
+
}
|
|
3091
|
+
return result;
|
|
3092
|
+
}
|
|
3093
|
+
function eventTime(event) {
|
|
3094
|
+
if (!event.meta?.at) {
|
|
3095
|
+
return void 0;
|
|
3096
|
+
}
|
|
3097
|
+
const timestamp = Date.parse(event.meta.at);
|
|
3098
|
+
return Number.isFinite(timestamp) ? timestamp / 1e3 : void 0;
|
|
3099
|
+
}
|
|
3100
|
+
function turnKey(sessionId, turnId) {
|
|
3101
|
+
return `${sessionId}:${turnId}`;
|
|
3102
|
+
}
|
|
3103
|
+
function toolKey(sessionId, callId) {
|
|
3104
|
+
return `${sessionId}:${callId}`;
|
|
3105
|
+
}
|
|
3106
|
+
async function generateEveIds(kind, ...parts) {
|
|
3107
|
+
const [rowId, spanId] = await Promise.all([
|
|
3108
|
+
deterministicEveId(`eve:row:${kind}`, ...parts),
|
|
3109
|
+
deterministicEveId(`eve:${kind}`, ...parts)
|
|
3110
|
+
]);
|
|
3111
|
+
return { rowId, spanId };
|
|
3112
|
+
}
|
|
3113
|
+
async function deterministicEveId(...parts) {
|
|
3114
|
+
const data = new TextEncoder().encode(
|
|
3115
|
+
parts.map((part) => `${part.length}:${part}`).join("\0")
|
|
3116
|
+
);
|
|
3117
|
+
const digest = await globalThis.crypto.subtle.digest("SHA-256", data);
|
|
3118
|
+
const bytes = Array.from(new Uint8Array(digest, 0, 16));
|
|
3119
|
+
const hex = bytes.map((byte) => byte.toString(16).padStart(2, "0")).join("");
|
|
3120
|
+
return `${hex.slice(0, 8)}-${hex.slice(8, 12)}-${hex.slice(12, 16)}-${hex.slice(16, 20)}-${hex.slice(20)}`;
|
|
3121
|
+
}
|
|
3122
|
+
|
|
1731
3123
|
// src/typed-instrumentation-helpers.ts
|
|
1732
3124
|
var TypedApplyProxy = Proxy;
|
|
1733
3125
|
|
|
@@ -3738,6 +5130,271 @@ function wrappedResumeSession(client) {
|
|
|
3738
5130
|
);
|
|
3739
5131
|
}
|
|
3740
5132
|
|
|
5133
|
+
// src/wrappers/langsmith.ts
|
|
5134
|
+
var WRAPPED_CLIENT_CLASS = /* @__PURE__ */ Symbol.for(
|
|
5135
|
+
"braintrust.langsmith.wrapped-client-class"
|
|
5136
|
+
);
|
|
5137
|
+
var WRAPPED_CLIENT_INSTANCE = /* @__PURE__ */ Symbol.for(
|
|
5138
|
+
"braintrust.langsmith.wrapped-client-instance"
|
|
5139
|
+
);
|
|
5140
|
+
var WRAPPED_CLIENT_NAMESPACE = /* @__PURE__ */ Symbol.for(
|
|
5141
|
+
"braintrust.langsmith.wrapped-client-namespace"
|
|
5142
|
+
);
|
|
5143
|
+
var WRAPPED_RUN_TREE_CLASS = /* @__PURE__ */ Symbol.for(
|
|
5144
|
+
"braintrust.langsmith.wrapped-run-tree-class"
|
|
5145
|
+
);
|
|
5146
|
+
var WRAPPED_RUN_TREE_INSTANCE = /* @__PURE__ */ Symbol.for(
|
|
5147
|
+
"braintrust.langsmith.wrapped-run-tree-instance"
|
|
5148
|
+
);
|
|
5149
|
+
var WRAPPED_RUN_TREES_NAMESPACE = /* @__PURE__ */ Symbol.for(
|
|
5150
|
+
"braintrust.langsmith.wrapped-run-trees-namespace"
|
|
5151
|
+
);
|
|
5152
|
+
var WRAPPED_TRACEABLE = /* @__PURE__ */ Symbol.for("braintrust.langsmith.wrapped-traceable");
|
|
5153
|
+
var WRAPPED_TRACEABLE_NAMESPACE = /* @__PURE__ */ Symbol.for(
|
|
5154
|
+
"braintrust.langsmith.wrapped-traceable-namespace"
|
|
5155
|
+
);
|
|
5156
|
+
function wrapLangSmithTraceable(namespace) {
|
|
5157
|
+
return wrapNamespaceExport(
|
|
5158
|
+
namespace,
|
|
5159
|
+
"traceable",
|
|
5160
|
+
WRAPPED_TRACEABLE_NAMESPACE,
|
|
5161
|
+
(value) => wrapTraceable(value)
|
|
5162
|
+
);
|
|
5163
|
+
}
|
|
5164
|
+
function wrapLangSmithRunTrees(namespace) {
|
|
5165
|
+
return wrapNamespaceExport(
|
|
5166
|
+
namespace,
|
|
5167
|
+
"RunTree",
|
|
5168
|
+
WRAPPED_RUN_TREES_NAMESPACE,
|
|
5169
|
+
(value) => wrapRunTreeClass(value)
|
|
5170
|
+
);
|
|
5171
|
+
}
|
|
5172
|
+
function wrapLangSmithClient(namespace) {
|
|
5173
|
+
return wrapNamespaceExport(
|
|
5174
|
+
namespace,
|
|
5175
|
+
"Client",
|
|
5176
|
+
WRAPPED_CLIENT_NAMESPACE,
|
|
5177
|
+
(value) => wrapClientClass(value)
|
|
5178
|
+
);
|
|
5179
|
+
}
|
|
5180
|
+
function wrapNamespaceExport(namespace, exportName, marker, wrap2) {
|
|
5181
|
+
if (!namespace || typeof namespace !== "object") {
|
|
5182
|
+
return namespace;
|
|
5183
|
+
}
|
|
5184
|
+
const candidate = namespace;
|
|
5185
|
+
if (candidate[marker] === true) {
|
|
5186
|
+
return namespace;
|
|
5187
|
+
}
|
|
5188
|
+
if (typeof candidate[exportName] !== "function") {
|
|
5189
|
+
console.warn(
|
|
5190
|
+
`Unsupported LangSmith ${exportName} namespace. Not wrapping.`
|
|
5191
|
+
);
|
|
5192
|
+
return namespace;
|
|
5193
|
+
}
|
|
5194
|
+
const target = isModuleNamespace5(namespace) ? Object.setPrototypeOf({}, namespace) : candidate;
|
|
5195
|
+
const moduleNamespace = target !== candidate;
|
|
5196
|
+
let wrappedExport;
|
|
5197
|
+
return new Proxy(target, {
|
|
5198
|
+
get(target2, prop, receiver) {
|
|
5199
|
+
if (prop === marker) {
|
|
5200
|
+
return true;
|
|
5201
|
+
}
|
|
5202
|
+
const value = Reflect.get(target2, prop, receiver);
|
|
5203
|
+
if (prop !== exportName || typeof value !== "function") {
|
|
5204
|
+
return value;
|
|
5205
|
+
}
|
|
5206
|
+
wrappedExport ??= wrap2(value);
|
|
5207
|
+
return wrappedExport;
|
|
5208
|
+
},
|
|
5209
|
+
getOwnPropertyDescriptor(target2, prop) {
|
|
5210
|
+
const descriptor = Reflect.getOwnPropertyDescriptor(target2, prop);
|
|
5211
|
+
if (descriptor || !moduleNamespace) {
|
|
5212
|
+
return descriptor;
|
|
5213
|
+
}
|
|
5214
|
+
const namespaceDescriptor = Reflect.getOwnPropertyDescriptor(
|
|
5215
|
+
candidate,
|
|
5216
|
+
prop
|
|
5217
|
+
);
|
|
5218
|
+
return namespaceDescriptor ? { ...namespaceDescriptor, configurable: true } : void 0;
|
|
5219
|
+
},
|
|
5220
|
+
has(target2, prop) {
|
|
5221
|
+
return Reflect.has(target2, prop) || moduleNamespace && prop in candidate;
|
|
5222
|
+
},
|
|
5223
|
+
ownKeys(target2) {
|
|
5224
|
+
return moduleNamespace ? Reflect.ownKeys(candidate) : Reflect.ownKeys(target2);
|
|
5225
|
+
}
|
|
5226
|
+
});
|
|
5227
|
+
}
|
|
5228
|
+
function isModuleNamespace5(value) {
|
|
5229
|
+
if (!value || typeof value !== "object") {
|
|
5230
|
+
return false;
|
|
5231
|
+
}
|
|
5232
|
+
if (value.constructor?.name === "Module") {
|
|
5233
|
+
return true;
|
|
5234
|
+
}
|
|
5235
|
+
const firstKey = Object.keys(value)[0];
|
|
5236
|
+
if (!firstKey) {
|
|
5237
|
+
return false;
|
|
5238
|
+
}
|
|
5239
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, firstKey);
|
|
5240
|
+
return descriptor ? !descriptor.configurable && !descriptor.writable : false;
|
|
5241
|
+
}
|
|
5242
|
+
function wrapTraceable(traceable2) {
|
|
5243
|
+
if (traceable2[WRAPPED_TRACEABLE]) {
|
|
5244
|
+
return traceable2;
|
|
5245
|
+
}
|
|
5246
|
+
return new Proxy(traceable2, {
|
|
5247
|
+
get(target, prop, receiver) {
|
|
5248
|
+
if (prop === WRAPPED_TRACEABLE) {
|
|
5249
|
+
return true;
|
|
5250
|
+
}
|
|
5251
|
+
return Reflect.get(target, prop, receiver);
|
|
5252
|
+
},
|
|
5253
|
+
apply(target, thisArg, argArray) {
|
|
5254
|
+
const [fn, rawConfig] = argArray;
|
|
5255
|
+
const config = rawConfig && typeof rawConfig === "object" ? rawConfig : void 0;
|
|
5256
|
+
const originalOnEnd = config?.on_end;
|
|
5257
|
+
const wrappedConfig = {
|
|
5258
|
+
...config,
|
|
5259
|
+
on_end(runTree) {
|
|
5260
|
+
publishRunUpdate(runTree);
|
|
5261
|
+
if (originalOnEnd) {
|
|
5262
|
+
Reflect.apply(originalOnEnd, config, [runTree]);
|
|
5263
|
+
}
|
|
5264
|
+
}
|
|
5265
|
+
};
|
|
5266
|
+
return Reflect.apply(target, thisArg, [fn, wrappedConfig]);
|
|
5267
|
+
}
|
|
5268
|
+
});
|
|
5269
|
+
}
|
|
5270
|
+
function wrapRunTreeClass(RunTree) {
|
|
5271
|
+
if (RunTree[WRAPPED_RUN_TREE_CLASS]) {
|
|
5272
|
+
return RunTree;
|
|
5273
|
+
}
|
|
5274
|
+
return new Proxy(RunTree, {
|
|
5275
|
+
get(target, prop, receiver) {
|
|
5276
|
+
if (prop === WRAPPED_RUN_TREE_CLASS) {
|
|
5277
|
+
return true;
|
|
5278
|
+
}
|
|
5279
|
+
const value = Reflect.get(target, prop, receiver);
|
|
5280
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
5281
|
+
},
|
|
5282
|
+
construct(target, args, newTarget) {
|
|
5283
|
+
return wrapRunTreeInstance(Reflect.construct(target, args, newTarget));
|
|
5284
|
+
}
|
|
5285
|
+
});
|
|
5286
|
+
}
|
|
5287
|
+
function wrapRunTreeInstance(runTree) {
|
|
5288
|
+
if (runTree[WRAPPED_RUN_TREE_INSTANCE]) {
|
|
5289
|
+
return runTree;
|
|
5290
|
+
}
|
|
5291
|
+
return new Proxy(runTree, {
|
|
5292
|
+
get(target, prop, receiver) {
|
|
5293
|
+
if (prop === WRAPPED_RUN_TREE_INSTANCE) {
|
|
5294
|
+
return true;
|
|
5295
|
+
}
|
|
5296
|
+
const value = Reflect.get(target, prop, receiver);
|
|
5297
|
+
if (typeof value !== "function") {
|
|
5298
|
+
return value;
|
|
5299
|
+
}
|
|
5300
|
+
let wrapped;
|
|
5301
|
+
if (prop === "createChild") {
|
|
5302
|
+
wrapped = (...args) => wrapRunTreeInstance(Reflect.apply(value, target, args));
|
|
5303
|
+
} else if (prop === "postRun") {
|
|
5304
|
+
const method = value;
|
|
5305
|
+
wrapped = (...args) => langSmithChannels.createRun.tracePromise(
|
|
5306
|
+
() => Reflect.apply(method, target, args),
|
|
5307
|
+
{ arguments: [target] }
|
|
5308
|
+
);
|
|
5309
|
+
} else if (prop === "patchRun") {
|
|
5310
|
+
const method = value;
|
|
5311
|
+
wrapped = (...args) => langSmithChannels.updateRun.tracePromise(
|
|
5312
|
+
() => Reflect.apply(method, target, args),
|
|
5313
|
+
{
|
|
5314
|
+
arguments: [
|
|
5315
|
+
typeof target.id === "string" ? target.id : "",
|
|
5316
|
+
target
|
|
5317
|
+
]
|
|
5318
|
+
}
|
|
5319
|
+
);
|
|
5320
|
+
} else {
|
|
5321
|
+
wrapped = value.bind(target);
|
|
5322
|
+
}
|
|
5323
|
+
return wrapped;
|
|
5324
|
+
}
|
|
5325
|
+
});
|
|
5326
|
+
}
|
|
5327
|
+
function wrapClientClass(Client) {
|
|
5328
|
+
if (Client[WRAPPED_CLIENT_CLASS]) {
|
|
5329
|
+
return Client;
|
|
5330
|
+
}
|
|
5331
|
+
return new Proxy(Client, {
|
|
5332
|
+
get(target, prop, receiver) {
|
|
5333
|
+
if (prop === WRAPPED_CLIENT_CLASS) {
|
|
5334
|
+
return true;
|
|
5335
|
+
}
|
|
5336
|
+
const value = Reflect.get(target, prop, receiver);
|
|
5337
|
+
return typeof value === "function" ? value.bind(target) : value;
|
|
5338
|
+
},
|
|
5339
|
+
construct(target, args, newTarget) {
|
|
5340
|
+
return wrapClientInstance(Reflect.construct(target, args, newTarget));
|
|
5341
|
+
}
|
|
5342
|
+
});
|
|
5343
|
+
}
|
|
5344
|
+
function wrapClientInstance(client) {
|
|
5345
|
+
if (client[WRAPPED_CLIENT_INSTANCE]) {
|
|
5346
|
+
return client;
|
|
5347
|
+
}
|
|
5348
|
+
return new Proxy(client, {
|
|
5349
|
+
get(target, prop, receiver) {
|
|
5350
|
+
if (prop === WRAPPED_CLIENT_INSTANCE) {
|
|
5351
|
+
return true;
|
|
5352
|
+
}
|
|
5353
|
+
const value = Reflect.get(target, prop, receiver);
|
|
5354
|
+
if (typeof value !== "function") {
|
|
5355
|
+
return value;
|
|
5356
|
+
}
|
|
5357
|
+
let wrapped;
|
|
5358
|
+
if (prop === "createRun") {
|
|
5359
|
+
const method = value;
|
|
5360
|
+
wrapped = (...args) => langSmithChannels.createRun.tracePromise(
|
|
5361
|
+
() => Reflect.apply(method, target, args),
|
|
5362
|
+
{ arguments: args }
|
|
5363
|
+
);
|
|
5364
|
+
} else if (prop === "updateRun") {
|
|
5365
|
+
const method = value;
|
|
5366
|
+
wrapped = (...args) => langSmithChannels.updateRun.tracePromise(
|
|
5367
|
+
() => Reflect.apply(method, target, args),
|
|
5368
|
+
{ arguments: args }
|
|
5369
|
+
);
|
|
5370
|
+
} else if (prop === "batchIngestRuns") {
|
|
5371
|
+
const method = value;
|
|
5372
|
+
wrapped = (...args) => langSmithChannels.batchIngestRuns.tracePromise(
|
|
5373
|
+
() => Reflect.apply(method, target, args),
|
|
5374
|
+
{ arguments: args }
|
|
5375
|
+
);
|
|
5376
|
+
} else {
|
|
5377
|
+
wrapped = value.bind(target);
|
|
5378
|
+
}
|
|
5379
|
+
return wrapped;
|
|
5380
|
+
}
|
|
5381
|
+
});
|
|
5382
|
+
}
|
|
5383
|
+
function publishRunUpdate(runTree) {
|
|
5384
|
+
if (!runTree || typeof runTree.id !== "string" || !runTree.id) {
|
|
5385
|
+
return;
|
|
5386
|
+
}
|
|
5387
|
+
try {
|
|
5388
|
+
void langSmithChannels.updateRun.tracePromise(() => Promise.resolve(void 0), {
|
|
5389
|
+
arguments: [runTree.id, runTree]
|
|
5390
|
+
}).catch((error) => {
|
|
5391
|
+
debugLogger.error("LangSmith traceable instrumentation failed:", error);
|
|
5392
|
+
});
|
|
5393
|
+
} catch (error) {
|
|
5394
|
+
debugLogger.error("LangSmith traceable instrumentation failed:", error);
|
|
5395
|
+
}
|
|
5396
|
+
}
|
|
5397
|
+
|
|
3741
5398
|
// src/wrappers/vitest/context-manager.ts
|
|
3742
5399
|
var VitestContextManager = class {
|
|
3743
5400
|
/**
|
|
@@ -8058,6 +9715,8 @@ export {
|
|
|
8058
9715
|
addAzureBlobHeaders,
|
|
8059
9716
|
agentAssertionScorer,
|
|
8060
9717
|
braintrustAISDKTelemetry,
|
|
9718
|
+
braintrustEveHook,
|
|
9719
|
+
braintrustEveInstrumentation,
|
|
8061
9720
|
braintrustFlueInstrumentation,
|
|
8062
9721
|
braintrustFlueObserver,
|
|
8063
9722
|
braintrustStreamChunkSchema,
|
|
@@ -8148,6 +9807,9 @@ export {
|
|
|
8148
9807
|
wrapGoogleGenAI,
|
|
8149
9808
|
wrapGroq,
|
|
8150
9809
|
wrapHuggingFace,
|
|
9810
|
+
wrapLangSmithClient,
|
|
9811
|
+
wrapLangSmithRunTrees,
|
|
9812
|
+
wrapLangSmithTraceable,
|
|
8151
9813
|
wrapMastraAgent,
|
|
8152
9814
|
wrapMistral,
|
|
8153
9815
|
wrapOpenAI,
|