@langchain/core 0.2.17 → 0.2.18
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/callbacks/manager.cjs +71 -23
- package/dist/callbacks/manager.js +71 -23
- package/dist/callbacks/tests/callbacks.test.js +3 -0
- package/dist/runnables/base.cjs +2 -2
- package/dist/runnables/base.d.ts +49 -3
- package/dist/runnables/base.js +2 -2
- package/dist/runnables/config.cjs +4 -7
- package/dist/runnables/config.d.ts +3 -17
- package/dist/runnables/config.js +5 -8
- package/dist/runnables/graph.d.ts +1 -1
- package/dist/runnables/iter.cjs +2 -4
- package/dist/runnables/iter.js +2 -4
- package/dist/runnables/tests/runnable_stream_events_v2.test.js +52 -48
- package/dist/runnables/types.d.ts +14 -1
- package/dist/singletons/index.cjs +35 -5
- package/dist/singletons/index.d.ts +2 -0
- package/dist/singletons/index.js +34 -4
- package/dist/singletons/tests/async_local_storage.test.js +2 -3
- package/dist/tracers/base.cjs +67 -13
- package/dist/tracers/base.d.ts +176 -1
- package/dist/tracers/base.js +65 -12
- package/dist/tracers/event_stream.cjs +15 -2
- package/dist/tracers/event_stream.js +15 -2
- package/dist/tracers/tests/langsmith_interop.test.d.ts +1 -0
- package/dist/tracers/tests/langsmith_interop.test.js +551 -0
- package/dist/tracers/tracer_langchain.cjs +73 -31
- package/dist/tracers/tracer_langchain.d.ts +3 -1
- package/dist/tracers/tracer_langchain.js +73 -31
- package/dist/utils/stream.cjs +8 -9
- package/dist/utils/stream.js +8 -9
- package/package.json +2 -2
|
@@ -57,6 +57,58 @@ test("Runnable streamEvents method", async () => {
|
|
|
57
57
|
},
|
|
58
58
|
]);
|
|
59
59
|
});
|
|
60
|
+
test("Runnable streamEvents method on a chat model", async () => {
|
|
61
|
+
const model = new FakeListChatModel({
|
|
62
|
+
responses: ["abc"],
|
|
63
|
+
});
|
|
64
|
+
const events = [];
|
|
65
|
+
const eventStream = await model.streamEvents("hello", { version: "v2" });
|
|
66
|
+
for await (const event of eventStream) {
|
|
67
|
+
events.push(event);
|
|
68
|
+
}
|
|
69
|
+
expect(events).toMatchObject([
|
|
70
|
+
{
|
|
71
|
+
data: { input: "hello" },
|
|
72
|
+
event: "on_chat_model_start",
|
|
73
|
+
name: "FakeListChatModel",
|
|
74
|
+
metadata: expect.any(Object),
|
|
75
|
+
run_id: expect.any(String),
|
|
76
|
+
tags: [],
|
|
77
|
+
},
|
|
78
|
+
{
|
|
79
|
+
data: { chunk: new AIMessageChunk({ content: "a" }) },
|
|
80
|
+
event: "on_chat_model_stream",
|
|
81
|
+
name: "FakeListChatModel",
|
|
82
|
+
metadata: expect.any(Object),
|
|
83
|
+
run_id: expect.any(String),
|
|
84
|
+
tags: [],
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
data: { chunk: new AIMessageChunk({ content: "b" }) },
|
|
88
|
+
event: "on_chat_model_stream",
|
|
89
|
+
name: "FakeListChatModel",
|
|
90
|
+
metadata: expect.any(Object),
|
|
91
|
+
run_id: expect.any(String),
|
|
92
|
+
tags: [],
|
|
93
|
+
},
|
|
94
|
+
{
|
|
95
|
+
data: { chunk: new AIMessageChunk({ content: "c" }) },
|
|
96
|
+
event: "on_chat_model_stream",
|
|
97
|
+
name: "FakeListChatModel",
|
|
98
|
+
metadata: expect.any(Object),
|
|
99
|
+
run_id: expect.any(String),
|
|
100
|
+
tags: [],
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
data: { output: new AIMessageChunk({ content: "abc" }) },
|
|
104
|
+
event: "on_chat_model_end",
|
|
105
|
+
name: "FakeListChatModel",
|
|
106
|
+
metadata: expect.any(Object),
|
|
107
|
+
run_id: expect.any(String),
|
|
108
|
+
tags: [],
|
|
109
|
+
},
|
|
110
|
+
]);
|
|
111
|
+
});
|
|
60
112
|
test("Runnable streamEvents method with three runnables", async () => {
|
|
61
113
|
const r = RunnableLambda.from(reverse);
|
|
62
114
|
const chain = r
|
|
@@ -556,18 +608,6 @@ test("Runnable streamEvents method with llm", async () => {
|
|
|
556
608
|
a: "b",
|
|
557
609
|
},
|
|
558
610
|
},
|
|
559
|
-
{
|
|
560
|
-
event: "on_llm_stream",
|
|
561
|
-
run_id: expect.any(String),
|
|
562
|
-
name: "my_model",
|
|
563
|
-
tags: ["my_model"],
|
|
564
|
-
metadata: {
|
|
565
|
-
a: "b",
|
|
566
|
-
},
|
|
567
|
-
data: {
|
|
568
|
-
chunk: "h",
|
|
569
|
-
},
|
|
570
|
-
},
|
|
571
611
|
{
|
|
572
612
|
event: "on_llm_stream",
|
|
573
613
|
data: {
|
|
@@ -582,18 +622,6 @@ test("Runnable streamEvents method with llm", async () => {
|
|
|
582
622
|
a: "b",
|
|
583
623
|
},
|
|
584
624
|
},
|
|
585
|
-
{
|
|
586
|
-
event: "on_llm_stream",
|
|
587
|
-
run_id: expect.any(String),
|
|
588
|
-
name: "my_model",
|
|
589
|
-
tags: ["my_model"],
|
|
590
|
-
metadata: {
|
|
591
|
-
a: "b",
|
|
592
|
-
},
|
|
593
|
-
data: {
|
|
594
|
-
chunk: "e",
|
|
595
|
-
},
|
|
596
|
-
},
|
|
597
625
|
{
|
|
598
626
|
event: "on_llm_stream",
|
|
599
627
|
data: {
|
|
@@ -608,18 +636,6 @@ test("Runnable streamEvents method with llm", async () => {
|
|
|
608
636
|
a: "b",
|
|
609
637
|
},
|
|
610
638
|
},
|
|
611
|
-
{
|
|
612
|
-
event: "on_llm_stream",
|
|
613
|
-
run_id: expect.any(String),
|
|
614
|
-
name: "my_model",
|
|
615
|
-
tags: ["my_model"],
|
|
616
|
-
metadata: {
|
|
617
|
-
a: "b",
|
|
618
|
-
},
|
|
619
|
-
data: {
|
|
620
|
-
chunk: "y",
|
|
621
|
-
},
|
|
622
|
-
},
|
|
623
639
|
{
|
|
624
640
|
event: "on_llm_stream",
|
|
625
641
|
data: {
|
|
@@ -634,18 +650,6 @@ test("Runnable streamEvents method with llm", async () => {
|
|
|
634
650
|
a: "b",
|
|
635
651
|
},
|
|
636
652
|
},
|
|
637
|
-
{
|
|
638
|
-
event: "on_llm_stream",
|
|
639
|
-
run_id: expect.any(String),
|
|
640
|
-
name: "my_model",
|
|
641
|
-
tags: ["my_model"],
|
|
642
|
-
metadata: {
|
|
643
|
-
a: "b",
|
|
644
|
-
},
|
|
645
|
-
data: {
|
|
646
|
-
chunk: "!",
|
|
647
|
-
},
|
|
648
|
-
},
|
|
649
653
|
{
|
|
650
654
|
event: "on_llm_end",
|
|
651
655
|
data: {
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { z } from "zod";
|
|
2
|
-
import type { RunnableConfig } from "./config.js";
|
|
3
2
|
import type { IterableReadableStreamInterface } from "../utils/stream.js";
|
|
4
3
|
import type { SerializableInterface } from "../load/serializable.js";
|
|
4
|
+
import type { BaseCallbackConfig } from "../callbacks/manager.js";
|
|
5
5
|
export type RunnableBatchOptions = {
|
|
6
6
|
/** @deprecated Pass in via the standard runnable config object instead */
|
|
7
7
|
maxConcurrency?: number;
|
|
@@ -41,3 +41,16 @@ export interface Node {
|
|
|
41
41
|
id: string;
|
|
42
42
|
data: RunnableIOSchema | RunnableInterface;
|
|
43
43
|
}
|
|
44
|
+
export interface RunnableConfig extends BaseCallbackConfig {
|
|
45
|
+
/**
|
|
46
|
+
* Runtime values for attributes previously made configurable on this Runnable,
|
|
47
|
+
* or sub-Runnables.
|
|
48
|
+
*/
|
|
49
|
+
configurable?: Record<string, any>;
|
|
50
|
+
/**
|
|
51
|
+
* Maximum number of times a call can recurse. If not provided, defaults to 25.
|
|
52
|
+
*/
|
|
53
|
+
recursionLimit?: number;
|
|
54
|
+
/** Maximum number of parallel calls to make. */
|
|
55
|
+
maxConcurrency?: number;
|
|
56
|
+
}
|
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
3
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
4
3
|
exports.AsyncLocalStorageProviderSingleton = exports.MockAsyncLocalStorage = void 0;
|
|
4
|
+
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
5
|
+
const langsmith_1 = require("langsmith");
|
|
6
|
+
const manager_js_1 = require("../callbacks/manager.cjs");
|
|
5
7
|
class MockAsyncLocalStorage {
|
|
6
8
|
getStore() {
|
|
7
9
|
return undefined;
|
|
@@ -12,14 +14,42 @@ class MockAsyncLocalStorage {
|
|
|
12
14
|
}
|
|
13
15
|
exports.MockAsyncLocalStorage = MockAsyncLocalStorage;
|
|
14
16
|
const mockAsyncLocalStorage = new MockAsyncLocalStorage();
|
|
17
|
+
const TRACING_ALS_KEY = Symbol.for("ls:tracing_async_local_storage");
|
|
18
|
+
const LC_CHILD_KEY = Symbol.for("lc:child_config");
|
|
15
19
|
class AsyncLocalStorageProvider {
|
|
16
20
|
getInstance() {
|
|
17
|
-
return
|
|
18
|
-
|
|
21
|
+
return globalThis[TRACING_ALS_KEY] ?? mockAsyncLocalStorage;
|
|
22
|
+
}
|
|
23
|
+
getRunnableConfig() {
|
|
24
|
+
const storage = this.getInstance();
|
|
25
|
+
// this has the runnable config
|
|
26
|
+
// which means that we should also have an instance of a LangChainTracer
|
|
27
|
+
// with the run map prepopulated
|
|
28
|
+
return storage.getStore()?.extra?.[LC_CHILD_KEY];
|
|
29
|
+
}
|
|
30
|
+
runWithConfig(config, callback, avoidCreatingRootRunTree) {
|
|
31
|
+
const callbackManager = manager_js_1.CallbackManager._configureSync(config?.callbacks, undefined, config?.tags, undefined, config?.metadata);
|
|
32
|
+
const storage = this.getInstance();
|
|
33
|
+
const parentRunId = callbackManager?.getParentRunId();
|
|
34
|
+
const langChainTracer = callbackManager?.handlers?.find((handler) => handler?.name === "langchain_tracer");
|
|
35
|
+
let runTree;
|
|
36
|
+
if (langChainTracer && parentRunId) {
|
|
37
|
+
runTree = langChainTracer.convertToRunTree(parentRunId);
|
|
38
|
+
}
|
|
39
|
+
else if (!avoidCreatingRootRunTree) {
|
|
40
|
+
runTree = new langsmith_1.RunTree({
|
|
41
|
+
name: "<runnable_lambda>",
|
|
42
|
+
tracingEnabled: false,
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
if (runTree) {
|
|
46
|
+
runTree.extra = { ...runTree.extra, [LC_CHILD_KEY]: config };
|
|
47
|
+
}
|
|
48
|
+
return storage.run(runTree, callback);
|
|
19
49
|
}
|
|
20
50
|
initializeGlobalInstance(instance) {
|
|
21
|
-
if (globalThis
|
|
22
|
-
globalThis
|
|
51
|
+
if (globalThis[TRACING_ALS_KEY] === undefined) {
|
|
52
|
+
globalThis[TRACING_ALS_KEY] = instance;
|
|
23
53
|
}
|
|
24
54
|
}
|
|
25
55
|
}
|
|
@@ -8,6 +8,8 @@ export declare class MockAsyncLocalStorage implements AsyncLocalStorageInterface
|
|
|
8
8
|
}
|
|
9
9
|
declare class AsyncLocalStorageProvider {
|
|
10
10
|
getInstance(): AsyncLocalStorageInterface;
|
|
11
|
+
getRunnableConfig(): any;
|
|
12
|
+
runWithConfig<T>(config: any, callback: () => T, avoidCreatingRootRunTree?: boolean): T;
|
|
11
13
|
initializeGlobalInstance(instance: AsyncLocalStorageInterface): void;
|
|
12
14
|
}
|
|
13
15
|
declare const AsyncLocalStorageProviderSingleton: AsyncLocalStorageProvider;
|
package/dist/singletons/index.js
CHANGED
|
@@ -1,4 +1,6 @@
|
|
|
1
1
|
/* eslint-disable @typescript-eslint/no-explicit-any */
|
|
2
|
+
import { RunTree } from "langsmith";
|
|
3
|
+
import { CallbackManager } from "../callbacks/manager.js";
|
|
2
4
|
export class MockAsyncLocalStorage {
|
|
3
5
|
getStore() {
|
|
4
6
|
return undefined;
|
|
@@ -8,14 +10,42 @@ export class MockAsyncLocalStorage {
|
|
|
8
10
|
}
|
|
9
11
|
}
|
|
10
12
|
const mockAsyncLocalStorage = new MockAsyncLocalStorage();
|
|
13
|
+
const TRACING_ALS_KEY = Symbol.for("ls:tracing_async_local_storage");
|
|
14
|
+
const LC_CHILD_KEY = Symbol.for("lc:child_config");
|
|
11
15
|
class AsyncLocalStorageProvider {
|
|
12
16
|
getInstance() {
|
|
13
|
-
return
|
|
14
|
-
|
|
17
|
+
return globalThis[TRACING_ALS_KEY] ?? mockAsyncLocalStorage;
|
|
18
|
+
}
|
|
19
|
+
getRunnableConfig() {
|
|
20
|
+
const storage = this.getInstance();
|
|
21
|
+
// this has the runnable config
|
|
22
|
+
// which means that we should also have an instance of a LangChainTracer
|
|
23
|
+
// with the run map prepopulated
|
|
24
|
+
return storage.getStore()?.extra?.[LC_CHILD_KEY];
|
|
25
|
+
}
|
|
26
|
+
runWithConfig(config, callback, avoidCreatingRootRunTree) {
|
|
27
|
+
const callbackManager = CallbackManager._configureSync(config?.callbacks, undefined, config?.tags, undefined, config?.metadata);
|
|
28
|
+
const storage = this.getInstance();
|
|
29
|
+
const parentRunId = callbackManager?.getParentRunId();
|
|
30
|
+
const langChainTracer = callbackManager?.handlers?.find((handler) => handler?.name === "langchain_tracer");
|
|
31
|
+
let runTree;
|
|
32
|
+
if (langChainTracer && parentRunId) {
|
|
33
|
+
runTree = langChainTracer.convertToRunTree(parentRunId);
|
|
34
|
+
}
|
|
35
|
+
else if (!avoidCreatingRootRunTree) {
|
|
36
|
+
runTree = new RunTree({
|
|
37
|
+
name: "<runnable_lambda>",
|
|
38
|
+
tracingEnabled: false,
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
if (runTree) {
|
|
42
|
+
runTree.extra = { ...runTree.extra, [LC_CHILD_KEY]: config };
|
|
43
|
+
}
|
|
44
|
+
return storage.run(runTree, callback);
|
|
15
45
|
}
|
|
16
46
|
initializeGlobalInstance(instance) {
|
|
17
|
-
if (globalThis
|
|
18
|
-
globalThis
|
|
47
|
+
if (globalThis[TRACING_ALS_KEY] === undefined) {
|
|
48
|
+
globalThis[TRACING_ALS_KEY] = instance;
|
|
19
49
|
}
|
|
20
50
|
}
|
|
21
51
|
}
|
|
@@ -108,7 +108,6 @@ test("Config should be automatically populated after setting global async local
|
|
|
108
108
|
});
|
|
109
109
|
test("Runnable streamEvents method with streaming nested in a RunnableLambda", async () => {
|
|
110
110
|
AsyncLocalStorageProviderSingleton.initializeGlobalInstance(new AsyncLocalStorage());
|
|
111
|
-
const asyncLocalStorage = AsyncLocalStorageProviderSingleton.getInstance();
|
|
112
111
|
const chat = new FakeListChatModel({
|
|
113
112
|
responses: ["Hello"],
|
|
114
113
|
});
|
|
@@ -117,7 +116,7 @@ test("Runnable streamEvents method with streaming nested in a RunnableLambda", a
|
|
|
117
116
|
const innerRunId2 = v4();
|
|
118
117
|
const dummyHandler = new FakeCallbackHandler();
|
|
119
118
|
const myFunc = async (input) => {
|
|
120
|
-
const outerCallbackManager = await getCallbackManagerForConfig(
|
|
119
|
+
const outerCallbackManager = await getCallbackManagerForConfig(AsyncLocalStorageProviderSingleton.getRunnableConfig());
|
|
121
120
|
expect(outerCallbackManager?.getParentRunId()).toEqual(outerRunId);
|
|
122
121
|
const nestedLambdaWithOverriddenCallbacks = RunnableLambda.from(async (_, config) => {
|
|
123
122
|
expect(config?.callbacks?.handlers).toEqual([]);
|
|
@@ -127,7 +126,7 @@ test("Runnable streamEvents method with streaming nested in a RunnableLambda", a
|
|
|
127
126
|
callbacks: [],
|
|
128
127
|
});
|
|
129
128
|
const nestedLambdaWithoutOverriddenCallbacks = RunnableLambda.from(async (_, config) => {
|
|
130
|
-
const innerCallbackManager = await getCallbackManagerForConfig(
|
|
129
|
+
const innerCallbackManager = await getCallbackManagerForConfig(AsyncLocalStorageProviderSingleton.getRunnableConfig());
|
|
131
130
|
expect(innerCallbackManager?.getParentRunId()).toEqual(innerRunId2);
|
|
132
131
|
expect(config?.callbacks?.handlers).toContain(dummyHandler);
|
|
133
132
|
});
|
package/dist/tracers/base.cjs
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.BaseTracer = void 0;
|
|
3
|
+
exports.BaseTracer = exports.isBaseTracer = void 0;
|
|
4
4
|
const base_js_1 = require("../callbacks/base.cjs");
|
|
5
5
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
6
6
|
function _coerceToDict(value, defaultKey) {
|
|
@@ -15,6 +15,10 @@ function convertToDottedOrderFormat(epoch, runId, executionOrder) {
|
|
|
15
15
|
const paddedOrder = executionOrder.toFixed(0).slice(0, 3).padStart(3, "0");
|
|
16
16
|
return (stripNonAlphanumeric(`${new Date(epoch).toISOString().slice(0, -1)}${paddedOrder}Z`) + runId);
|
|
17
17
|
}
|
|
18
|
+
function isBaseTracer(x) {
|
|
19
|
+
return typeof x._addRunToRunMap === "function";
|
|
20
|
+
}
|
|
21
|
+
exports.isBaseTracer = isBaseTracer;
|
|
18
22
|
class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
19
23
|
constructor(_fields) {
|
|
20
24
|
super(...arguments);
|
|
@@ -41,7 +45,7 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
41
45
|
_addChildRun(parentRun, childRun) {
|
|
42
46
|
parentRun.child_runs.push(childRun);
|
|
43
47
|
}
|
|
44
|
-
|
|
48
|
+
_addRunToRunMap(run) {
|
|
45
49
|
const currentDottedOrder = convertToDottedOrderFormat(run.start_time, run.id, run.execution_order);
|
|
46
50
|
const storedRun = { ...run };
|
|
47
51
|
if (storedRun.parent_run_id !== undefined) {
|
|
@@ -73,7 +77,7 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
73
77
|
storedRun.dotted_order = currentDottedOrder;
|
|
74
78
|
}
|
|
75
79
|
this.runMap.set(storedRun.id, storedRun);
|
|
76
|
-
|
|
80
|
+
return storedRun;
|
|
77
81
|
}
|
|
78
82
|
async _endTrace(run) {
|
|
79
83
|
const parentRun = run.parent_run_id !== undefined && this.runMap.get(run.parent_run_id);
|
|
@@ -94,7 +98,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
94
98
|
}
|
|
95
99
|
return parentRun.child_execution_order + 1;
|
|
96
100
|
}
|
|
97
|
-
|
|
101
|
+
/**
|
|
102
|
+
* Create and add a run to the run map for LLM start events.
|
|
103
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
104
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
105
|
+
*/
|
|
106
|
+
_createRunForLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata, name) {
|
|
98
107
|
const execution_order = this._getExecutionOrder(parentRunId);
|
|
99
108
|
const start_time = Date.now();
|
|
100
109
|
const finalExtraParams = metadata
|
|
@@ -120,11 +129,21 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
120
129
|
extra: finalExtraParams ?? {},
|
|
121
130
|
tags: tags || [],
|
|
122
131
|
};
|
|
123
|
-
|
|
132
|
+
return this._addRunToRunMap(run);
|
|
133
|
+
}
|
|
134
|
+
async handleLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata, name) {
|
|
135
|
+
const run = this.runMap.get(runId) ??
|
|
136
|
+
this._createRunForLLMStart(llm, prompts, runId, parentRunId, extraParams, tags, metadata, name);
|
|
137
|
+
await this.onRunCreate?.(run);
|
|
124
138
|
await this.onLLMStart?.(run);
|
|
125
139
|
return run;
|
|
126
140
|
}
|
|
127
|
-
|
|
141
|
+
/**
|
|
142
|
+
* Create and add a run to the run map for chat model start events.
|
|
143
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
144
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
145
|
+
*/
|
|
146
|
+
_createRunForChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, name) {
|
|
128
147
|
const execution_order = this._getExecutionOrder(parentRunId);
|
|
129
148
|
const start_time = Date.now();
|
|
130
149
|
const finalExtraParams = metadata
|
|
@@ -150,7 +169,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
150
169
|
extra: finalExtraParams ?? {},
|
|
151
170
|
tags: tags || [],
|
|
152
171
|
};
|
|
153
|
-
|
|
172
|
+
return this._addRunToRunMap(run);
|
|
173
|
+
}
|
|
174
|
+
async handleChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, name) {
|
|
175
|
+
const run = this.runMap.get(runId) ??
|
|
176
|
+
this._createRunForChatModelStart(llm, messages, runId, parentRunId, extraParams, tags, metadata, name);
|
|
177
|
+
await this.onRunCreate?.(run);
|
|
154
178
|
await this.onLLMStart?.(run);
|
|
155
179
|
return run;
|
|
156
180
|
}
|
|
@@ -184,7 +208,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
184
208
|
await this._endTrace(run);
|
|
185
209
|
return run;
|
|
186
210
|
}
|
|
187
|
-
|
|
211
|
+
/**
|
|
212
|
+
* Create and add a run to the run map for chain start events.
|
|
213
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
214
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
215
|
+
*/
|
|
216
|
+
_createRunForChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, name) {
|
|
188
217
|
const execution_order = this._getExecutionOrder(parentRunId);
|
|
189
218
|
const start_time = Date.now();
|
|
190
219
|
const run = {
|
|
@@ -207,7 +236,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
207
236
|
extra: metadata ? { metadata } : {},
|
|
208
237
|
tags: tags || [],
|
|
209
238
|
};
|
|
210
|
-
|
|
239
|
+
return this._addRunToRunMap(run);
|
|
240
|
+
}
|
|
241
|
+
async handleChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, name) {
|
|
242
|
+
const run = this.runMap.get(runId) ??
|
|
243
|
+
this._createRunForChainStart(chain, inputs, runId, parentRunId, tags, metadata, runType, name);
|
|
244
|
+
await this.onRunCreate?.(run);
|
|
211
245
|
await this.onChainStart?.(run);
|
|
212
246
|
return run;
|
|
213
247
|
}
|
|
@@ -247,7 +281,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
247
281
|
await this._endTrace(run);
|
|
248
282
|
return run;
|
|
249
283
|
}
|
|
250
|
-
|
|
284
|
+
/**
|
|
285
|
+
* Create and add a run to the run map for tool start events.
|
|
286
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
287
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
288
|
+
*/
|
|
289
|
+
_createRunForToolStart(tool, input, runId, parentRunId, tags, metadata, name) {
|
|
251
290
|
const execution_order = this._getExecutionOrder(parentRunId);
|
|
252
291
|
const start_time = Date.now();
|
|
253
292
|
const run = {
|
|
@@ -270,7 +309,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
270
309
|
extra: metadata ? { metadata } : {},
|
|
271
310
|
tags: tags || [],
|
|
272
311
|
};
|
|
273
|
-
|
|
312
|
+
return this._addRunToRunMap(run);
|
|
313
|
+
}
|
|
314
|
+
async handleToolStart(tool, input, runId, parentRunId, tags, metadata, name) {
|
|
315
|
+
const run = this.runMap.get(runId) ??
|
|
316
|
+
this._createRunForToolStart(tool, input, runId, parentRunId, tags, metadata, name);
|
|
317
|
+
await this.onRunCreate?.(run);
|
|
274
318
|
await this.onToolStart?.(run);
|
|
275
319
|
return run;
|
|
276
320
|
}
|
|
@@ -332,7 +376,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
332
376
|
});
|
|
333
377
|
await this.onAgentEnd?.(run);
|
|
334
378
|
}
|
|
335
|
-
|
|
379
|
+
/**
|
|
380
|
+
* Create and add a run to the run map for retriever start events.
|
|
381
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
382
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
383
|
+
*/
|
|
384
|
+
_createRunForRetrieverStart(retriever, query, runId, parentRunId, tags, metadata, name) {
|
|
336
385
|
const execution_order = this._getExecutionOrder(parentRunId);
|
|
337
386
|
const start_time = Date.now();
|
|
338
387
|
const run = {
|
|
@@ -355,7 +404,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
|
|
|
355
404
|
extra: metadata ? { metadata } : {},
|
|
356
405
|
tags: tags || [],
|
|
357
406
|
};
|
|
358
|
-
|
|
407
|
+
return this._addRunToRunMap(run);
|
|
408
|
+
}
|
|
409
|
+
async handleRetrieverStart(retriever, query, runId, parentRunId, tags, metadata, name) {
|
|
410
|
+
const run = this.runMap.get(runId) ??
|
|
411
|
+
this._createRunForRetrieverStart(retriever, query, runId, parentRunId, tags, metadata, name);
|
|
412
|
+
await this.onRunCreate?.(run);
|
|
359
413
|
await this.onRetrieverStart?.(run);
|
|
360
414
|
return run;
|
|
361
415
|
}
|
package/dist/tracers/base.d.ts
CHANGED
|
@@ -24,6 +24,7 @@ export interface Run extends BaseRun {
|
|
|
24
24
|
export interface AgentRun extends Run {
|
|
25
25
|
actions: AgentAction[];
|
|
26
26
|
}
|
|
27
|
+
export declare function isBaseTracer(x: BaseCallbackHandler): x is BaseTracer;
|
|
27
28
|
export declare abstract class BaseTracer extends BaseCallbackHandler {
|
|
28
29
|
protected runMap: Map<string, Run>;
|
|
29
30
|
constructor(_fields?: BaseCallbackHandlerInput);
|
|
@@ -31,13 +32,127 @@ export declare abstract class BaseTracer extends BaseCallbackHandler {
|
|
|
31
32
|
protected stringifyError(error: unknown): string;
|
|
32
33
|
protected abstract persistRun(run: Run): Promise<void>;
|
|
33
34
|
protected _addChildRun(parentRun: Run, childRun: Run): void;
|
|
34
|
-
|
|
35
|
+
_addRunToRunMap(run: Run): {
|
|
36
|
+
id: string;
|
|
37
|
+
start_time: number;
|
|
38
|
+
execution_order: number;
|
|
39
|
+
child_runs: Run[];
|
|
40
|
+
child_execution_order: number;
|
|
41
|
+
events: {
|
|
42
|
+
name: string;
|
|
43
|
+
time: string;
|
|
44
|
+
kwargs?: Record<string, unknown> | undefined;
|
|
45
|
+
}[];
|
|
46
|
+
trace_id?: string | undefined;
|
|
47
|
+
dotted_order?: string | undefined;
|
|
48
|
+
name: string;
|
|
49
|
+
run_type: string;
|
|
50
|
+
end_time?: number | undefined;
|
|
51
|
+
extra?: KVMap | undefined;
|
|
52
|
+
error?: string | undefined;
|
|
53
|
+
serialized?: object | undefined;
|
|
54
|
+
inputs: KVMap;
|
|
55
|
+
outputs?: KVMap | undefined;
|
|
56
|
+
reference_example_id?: string | undefined;
|
|
57
|
+
parent_run_id?: string | undefined;
|
|
58
|
+
tags?: string[] | undefined;
|
|
59
|
+
};
|
|
35
60
|
protected _endTrace(run: Run): Promise<void>;
|
|
36
61
|
protected _getExecutionOrder(parentRunId: string | undefined): number;
|
|
62
|
+
/**
|
|
63
|
+
* Create and add a run to the run map for LLM start events.
|
|
64
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
65
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
66
|
+
*/
|
|
67
|
+
_createRunForLLMStart(llm: Serialized, prompts: string[], runId: string, parentRunId?: string, extraParams?: KVMap, tags?: string[], metadata?: KVMap, name?: string): {
|
|
68
|
+
id: string;
|
|
69
|
+
start_time: number;
|
|
70
|
+
execution_order: number;
|
|
71
|
+
child_runs: Run[];
|
|
72
|
+
child_execution_order: number;
|
|
73
|
+
events: {
|
|
74
|
+
name: string;
|
|
75
|
+
time: string;
|
|
76
|
+
kwargs?: Record<string, unknown> | undefined;
|
|
77
|
+
}[];
|
|
78
|
+
trace_id?: string | undefined;
|
|
79
|
+
dotted_order?: string | undefined;
|
|
80
|
+
name: string;
|
|
81
|
+
run_type: string;
|
|
82
|
+
end_time?: number | undefined;
|
|
83
|
+
extra?: KVMap | undefined;
|
|
84
|
+
error?: string | undefined;
|
|
85
|
+
serialized?: object | undefined;
|
|
86
|
+
inputs: KVMap;
|
|
87
|
+
outputs?: KVMap | undefined;
|
|
88
|
+
reference_example_id?: string | undefined;
|
|
89
|
+
parent_run_id?: string | undefined;
|
|
90
|
+
tags?: string[] | undefined;
|
|
91
|
+
};
|
|
37
92
|
handleLLMStart(llm: Serialized, prompts: string[], runId: string, parentRunId?: string, extraParams?: KVMap, tags?: string[], metadata?: KVMap, name?: string): Promise<Run>;
|
|
93
|
+
/**
|
|
94
|
+
* Create and add a run to the run map for chat model start events.
|
|
95
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
96
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
97
|
+
*/
|
|
98
|
+
_createRunForChatModelStart(llm: Serialized, messages: BaseMessage[][], runId: string, parentRunId?: string, extraParams?: KVMap, tags?: string[], metadata?: KVMap, name?: string): {
|
|
99
|
+
id: string;
|
|
100
|
+
start_time: number;
|
|
101
|
+
execution_order: number;
|
|
102
|
+
child_runs: Run[];
|
|
103
|
+
child_execution_order: number;
|
|
104
|
+
events: {
|
|
105
|
+
name: string;
|
|
106
|
+
time: string;
|
|
107
|
+
kwargs?: Record<string, unknown> | undefined;
|
|
108
|
+
}[];
|
|
109
|
+
trace_id?: string | undefined;
|
|
110
|
+
dotted_order?: string | undefined;
|
|
111
|
+
name: string;
|
|
112
|
+
run_type: string;
|
|
113
|
+
end_time?: number | undefined;
|
|
114
|
+
extra?: KVMap | undefined;
|
|
115
|
+
error?: string | undefined;
|
|
116
|
+
serialized?: object | undefined;
|
|
117
|
+
inputs: KVMap;
|
|
118
|
+
outputs?: KVMap | undefined;
|
|
119
|
+
reference_example_id?: string | undefined;
|
|
120
|
+
parent_run_id?: string | undefined;
|
|
121
|
+
tags?: string[] | undefined;
|
|
122
|
+
};
|
|
38
123
|
handleChatModelStart(llm: Serialized, messages: BaseMessage[][], runId: string, parentRunId?: string, extraParams?: KVMap, tags?: string[], metadata?: KVMap, name?: string): Promise<Run>;
|
|
39
124
|
handleLLMEnd(output: LLMResult, runId: string): Promise<Run>;
|
|
40
125
|
handleLLMError(error: unknown, runId: string): Promise<Run>;
|
|
126
|
+
/**
|
|
127
|
+
* Create and add a run to the run map for chain start events.
|
|
128
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
129
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
130
|
+
*/
|
|
131
|
+
_createRunForChainStart(chain: Serialized, inputs: ChainValues, runId: string, parentRunId?: string, tags?: string[], metadata?: KVMap, runType?: string, name?: string): {
|
|
132
|
+
id: string;
|
|
133
|
+
start_time: number;
|
|
134
|
+
execution_order: number;
|
|
135
|
+
child_runs: Run[];
|
|
136
|
+
child_execution_order: number;
|
|
137
|
+
events: {
|
|
138
|
+
name: string;
|
|
139
|
+
time: string;
|
|
140
|
+
kwargs?: Record<string, unknown> | undefined;
|
|
141
|
+
}[];
|
|
142
|
+
trace_id?: string | undefined;
|
|
143
|
+
dotted_order?: string | undefined;
|
|
144
|
+
name: string;
|
|
145
|
+
run_type: string;
|
|
146
|
+
end_time?: number | undefined;
|
|
147
|
+
extra?: KVMap | undefined;
|
|
148
|
+
error?: string | undefined;
|
|
149
|
+
serialized?: object | undefined;
|
|
150
|
+
inputs: KVMap;
|
|
151
|
+
outputs?: KVMap | undefined;
|
|
152
|
+
reference_example_id?: string | undefined;
|
|
153
|
+
parent_run_id?: string | undefined;
|
|
154
|
+
tags?: string[] | undefined;
|
|
155
|
+
};
|
|
41
156
|
handleChainStart(chain: Serialized, inputs: ChainValues, runId: string, parentRunId?: string, tags?: string[], metadata?: KVMap, runType?: string, name?: string): Promise<Run>;
|
|
42
157
|
handleChainEnd(outputs: ChainValues, runId: string, _parentRunId?: string, _tags?: string[], kwargs?: {
|
|
43
158
|
inputs?: Record<string, unknown>;
|
|
@@ -45,11 +160,71 @@ export declare abstract class BaseTracer extends BaseCallbackHandler {
|
|
|
45
160
|
handleChainError(error: unknown, runId: string, _parentRunId?: string, _tags?: string[], kwargs?: {
|
|
46
161
|
inputs?: Record<string, unknown>;
|
|
47
162
|
}): Promise<Run>;
|
|
163
|
+
/**
|
|
164
|
+
* Create and add a run to the run map for tool start events.
|
|
165
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
166
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
167
|
+
*/
|
|
168
|
+
_createRunForToolStart(tool: Serialized, input: string, runId: string, parentRunId?: string, tags?: string[], metadata?: KVMap, name?: string): {
|
|
169
|
+
id: string;
|
|
170
|
+
start_time: number;
|
|
171
|
+
execution_order: number;
|
|
172
|
+
child_runs: Run[];
|
|
173
|
+
child_execution_order: number;
|
|
174
|
+
events: {
|
|
175
|
+
name: string;
|
|
176
|
+
time: string;
|
|
177
|
+
kwargs?: Record<string, unknown> | undefined;
|
|
178
|
+
}[];
|
|
179
|
+
trace_id?: string | undefined;
|
|
180
|
+
dotted_order?: string | undefined;
|
|
181
|
+
name: string;
|
|
182
|
+
run_type: string;
|
|
183
|
+
end_time?: number | undefined;
|
|
184
|
+
extra?: KVMap | undefined;
|
|
185
|
+
error?: string | undefined;
|
|
186
|
+
serialized?: object | undefined;
|
|
187
|
+
inputs: KVMap;
|
|
188
|
+
outputs?: KVMap | undefined;
|
|
189
|
+
reference_example_id?: string | undefined;
|
|
190
|
+
parent_run_id?: string | undefined;
|
|
191
|
+
tags?: string[] | undefined;
|
|
192
|
+
};
|
|
48
193
|
handleToolStart(tool: Serialized, input: string, runId: string, parentRunId?: string, tags?: string[], metadata?: KVMap, name?: string): Promise<Run>;
|
|
49
194
|
handleToolEnd(output: any, runId: string): Promise<Run>;
|
|
50
195
|
handleToolError(error: unknown, runId: string): Promise<Run>;
|
|
51
196
|
handleAgentAction(action: AgentAction, runId: string): Promise<void>;
|
|
52
197
|
handleAgentEnd(action: AgentFinish, runId: string): Promise<void>;
|
|
198
|
+
/**
|
|
199
|
+
* Create and add a run to the run map for retriever start events.
|
|
200
|
+
* This must sometimes be done synchronously to avoid race conditions
|
|
201
|
+
* when callbacks are backgrounded, so we expose it as a separate method here.
|
|
202
|
+
*/
|
|
203
|
+
_createRunForRetrieverStart(retriever: Serialized, query: string, runId: string, parentRunId?: string, tags?: string[], metadata?: KVMap, name?: string): {
|
|
204
|
+
id: string;
|
|
205
|
+
start_time: number;
|
|
206
|
+
execution_order: number;
|
|
207
|
+
child_runs: Run[];
|
|
208
|
+
child_execution_order: number;
|
|
209
|
+
events: {
|
|
210
|
+
name: string;
|
|
211
|
+
time: string;
|
|
212
|
+
kwargs?: Record<string, unknown> | undefined;
|
|
213
|
+
}[];
|
|
214
|
+
trace_id?: string | undefined;
|
|
215
|
+
dotted_order?: string | undefined;
|
|
216
|
+
name: string;
|
|
217
|
+
run_type: string;
|
|
218
|
+
end_time?: number | undefined;
|
|
219
|
+
extra?: KVMap | undefined;
|
|
220
|
+
error?: string | undefined;
|
|
221
|
+
serialized?: object | undefined;
|
|
222
|
+
inputs: KVMap;
|
|
223
|
+
outputs?: KVMap | undefined;
|
|
224
|
+
reference_example_id?: string | undefined;
|
|
225
|
+
parent_run_id?: string | undefined;
|
|
226
|
+
tags?: string[] | undefined;
|
|
227
|
+
};
|
|
53
228
|
handleRetrieverStart(retriever: Serialized, query: string, runId: string, parentRunId?: string, tags?: string[], metadata?: KVMap, name?: string): Promise<Run>;
|
|
54
229
|
handleRetrieverEnd(documents: Document<Record<string, unknown>>[], runId: string): Promise<Run>;
|
|
55
230
|
handleRetrieverError(error: unknown, runId: string): Promise<Run>;
|