langchain 0.0.75 → 0.0.76

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.
Files changed (114) hide show
  1. package/dist/base_language/count_tokens.cjs +5 -21
  2. package/dist/base_language/count_tokens.d.ts +1 -6
  3. package/dist/base_language/count_tokens.js +4 -19
  4. package/dist/base_language/index.cjs +10 -24
  5. package/dist/base_language/index.d.ts +3 -2
  6. package/dist/base_language/index.js +11 -25
  7. package/dist/cache/redis.d.ts +3 -1
  8. package/dist/callbacks/base.d.ts +4 -4
  9. package/dist/callbacks/handlers/initialize.cjs +2 -9
  10. package/dist/callbacks/handlers/initialize.d.ts +1 -1
  11. package/dist/callbacks/handlers/initialize.js +2 -9
  12. package/dist/callbacks/handlers/tracer.cjs +11 -22
  13. package/dist/callbacks/handlers/tracer.d.ts +2 -2
  14. package/dist/callbacks/handlers/tracer.js +11 -22
  15. package/dist/callbacks/handlers/tracer_langchain.cjs +52 -91
  16. package/dist/callbacks/handlers/tracer_langchain.d.ts +12 -9
  17. package/dist/callbacks/handlers/tracer_langchain.js +52 -68
  18. package/dist/callbacks/handlers/tracer_langchain_v1.cjs +5 -1
  19. package/dist/callbacks/handlers/tracer_langchain_v1.js +5 -1
  20. package/dist/callbacks/manager.cjs +10 -10
  21. package/dist/callbacks/manager.d.ts +2 -2
  22. package/dist/callbacks/manager.js +10 -10
  23. package/dist/chains/question_answering/map_reduce_prompts.cjs +5 -5
  24. package/dist/chains/question_answering/map_reduce_prompts.d.ts +1 -1
  25. package/dist/chains/question_answering/map_reduce_prompts.js +1 -1
  26. package/dist/chains/question_answering/refine_prompts.cjs +5 -5
  27. package/dist/chains/question_answering/refine_prompts.d.ts +1 -1
  28. package/dist/chains/question_answering/refine_prompts.js +1 -1
  29. package/dist/chains/question_answering/stuff_prompts.cjs +2 -2
  30. package/dist/chains/question_answering/stuff_prompts.d.ts +1 -1
  31. package/dist/chains/question_answering/stuff_prompts.js +1 -1
  32. package/dist/chains/sequential_chain.cjs +2 -2
  33. package/dist/chains/sequential_chain.d.ts +2 -2
  34. package/dist/chains/sequential_chain.js +2 -2
  35. package/dist/chains/sql_db/sql_db_prompt.cjs +20 -1
  36. package/dist/chains/sql_db/sql_db_prompt.d.ts +1 -0
  37. package/dist/chains/sql_db/sql_db_prompt.js +19 -0
  38. package/dist/chat_models/base.cjs +17 -1
  39. package/dist/chat_models/base.d.ts +6 -0
  40. package/dist/chat_models/base.js +18 -2
  41. package/dist/chat_models/openai.cjs +2 -2
  42. package/dist/chat_models/openai.js +2 -2
  43. package/dist/client/langchainplus.cjs +90 -29
  44. package/dist/client/langchainplus.d.ts +7 -5
  45. package/dist/client/langchainplus.js +90 -29
  46. package/dist/document_loaders/fs/unstructured.cjs +8 -0
  47. package/dist/document_loaders/fs/unstructured.d.ts +3 -0
  48. package/dist/document_loaders/fs/unstructured.js +8 -0
  49. package/dist/document_loaders/web/apify_dataset.cjs +64 -0
  50. package/dist/document_loaders/web/apify_dataset.d.ts +28 -0
  51. package/dist/document_loaders/web/apify_dataset.js +60 -0
  52. package/dist/embeddings/openai.cjs +2 -2
  53. package/dist/embeddings/openai.js +2 -2
  54. package/dist/llms/base.cjs +18 -1
  55. package/dist/llms/base.d.ts +7 -1
  56. package/dist/llms/base.js +19 -2
  57. package/dist/llms/openai-chat.cjs +2 -2
  58. package/dist/llms/openai-chat.js +2 -2
  59. package/dist/llms/openai.cjs +2 -2
  60. package/dist/llms/openai.js +2 -2
  61. package/dist/memory/base.cjs +9 -1
  62. package/dist/memory/base.d.ts +1 -0
  63. package/dist/memory/base.js +7 -0
  64. package/dist/memory/entity_memory.cjs +151 -0
  65. package/dist/memory/entity_memory.d.ts +35 -0
  66. package/dist/memory/entity_memory.js +147 -0
  67. package/dist/memory/index.cjs +5 -1
  68. package/dist/memory/index.d.ts +2 -0
  69. package/dist/memory/index.js +2 -0
  70. package/dist/memory/prompt.cjs +84 -1
  71. package/dist/memory/prompt.d.ts +6 -0
  72. package/dist/memory/prompt.js +83 -0
  73. package/dist/memory/stores/entity/in_memory.cjs +32 -0
  74. package/dist/memory/stores/entity/in_memory.d.ts +10 -0
  75. package/dist/memory/stores/entity/in_memory.js +28 -0
  76. package/dist/prompts/index.cjs +6 -1
  77. package/dist/prompts/index.d.ts +1 -0
  78. package/dist/prompts/index.js +1 -0
  79. package/dist/{chains/prompt_selector.d.ts → prompts/selectors/conditional.d.ts} +4 -4
  80. package/dist/schema/index.cjs +13 -1
  81. package/dist/schema/index.d.ts +17 -0
  82. package/dist/schema/index.js +11 -0
  83. package/dist/stores/message/dynamodb.cjs +8 -6
  84. package/dist/stores/message/dynamodb.js +8 -6
  85. package/dist/stores/message/redis.cjs +5 -3
  86. package/dist/stores/message/redis.js +5 -3
  87. package/dist/stores/message/utils.cjs +30 -15
  88. package/dist/stores/message/utils.d.ts +4 -2
  89. package/dist/stores/message/utils.js +28 -14
  90. package/dist/text_splitter.cjs +3 -23
  91. package/dist/text_splitter.d.ts +1 -3
  92. package/dist/text_splitter.js +3 -23
  93. package/dist/tools/webbrowser.cjs +5 -7
  94. package/dist/tools/webbrowser.js +3 -5
  95. package/dist/util/env.cjs +39 -7
  96. package/dist/util/env.d.ts +19 -0
  97. package/dist/util/env.js +32 -6
  98. package/dist/util/sql_utils.cjs +18 -0
  99. package/dist/util/sql_utils.js +19 -1
  100. package/dist/util/tiktoken.cjs +26 -0
  101. package/dist/util/tiktoken.d.ts +9 -0
  102. package/dist/util/tiktoken.js +21 -0
  103. package/dist/vectorstores/redis.cjs +236 -0
  104. package/dist/vectorstores/redis.d.ts +80 -0
  105. package/dist/vectorstores/redis.js +232 -0
  106. package/document_loaders/web/apify_dataset.cjs +1 -0
  107. package/document_loaders/web/apify_dataset.d.ts +1 -0
  108. package/document_loaders/web/apify_dataset.js +1 -0
  109. package/package.json +25 -5
  110. package/vectorstores/redis.cjs +1 -0
  111. package/vectorstores/redis.d.ts +1 -0
  112. package/vectorstores/redis.js +1 -0
  113. /package/dist/{chains/prompt_selector.cjs → prompts/selectors/conditional.cjs} +0 -0
  114. /package/dist/{chains/prompt_selector.js → prompts/selectors/conditional.js} +0 -0
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.calculateMaxTokens = exports.importTiktoken = exports.getModelContextSize = exports.getEmbeddingContextSize = exports.getModelNameForTiktoken = void 0;
4
- // https://www.npmjs.com/package/@dqbd/tiktoken
3
+ exports.calculateMaxTokens = exports.getModelContextSize = exports.getEmbeddingContextSize = exports.getModelNameForTiktoken = void 0;
4
+ const tiktoken_js_1 = require("../util/tiktoken.cjs");
5
+ // https://www.npmjs.com/package/js-tiktoken
5
6
  const getModelNameForTiktoken = (modelName) => {
6
7
  if (modelName.startsWith("gpt-3.5-turbo-")) {
7
8
  return "gpt-3.5-turbo";
@@ -49,31 +50,14 @@ const getModelContextSize = (modelName) => {
49
50
  }
50
51
  };
51
52
  exports.getModelContextSize = getModelContextSize;
52
- const importTiktoken = async () => {
53
- try {
54
- const { encoding_for_model } = await import("@dqbd/tiktoken");
55
- return { encoding_for_model };
56
- }
57
- catch (error) {
58
- console.log(error);
59
- return { encoding_for_model: null };
60
- }
61
- };
62
- exports.importTiktoken = importTiktoken;
63
53
  const calculateMaxTokens = async ({ prompt, modelName, }) => {
64
- const { encoding_for_model } = await (0, exports.importTiktoken)();
65
54
  // fallback to approximate calculation if tiktoken is not available
66
55
  let numTokens = Math.ceil(prompt.length / 4);
67
56
  try {
68
- if (encoding_for_model) {
69
- const encoding = encoding_for_model((0, exports.getModelNameForTiktoken)(modelName));
70
- const tokenized = encoding.encode(prompt);
71
- numTokens = tokenized.length;
72
- encoding.free();
73
- }
57
+ numTokens = (await (0, tiktoken_js_1.encodingForModel)(modelName)).encode(prompt).length;
74
58
  }
75
59
  catch (error) {
76
- console.warn("Failed to calculate number of tokens with tiktoken, falling back to approximate count", error);
60
+ console.warn("Failed to calculate number of tokens, falling back to approximate count");
77
61
  }
78
62
  const maxTokens = (0, exports.getModelContextSize)(modelName);
79
63
  return maxTokens - numTokens;
@@ -1,4 +1,4 @@
1
- import type { TiktokenModel } from "@dqbd/tiktoken";
1
+ import { type TiktokenModel } from "js-tiktoken/lite";
2
2
  export declare const getModelNameForTiktoken: (modelName: string) => TiktokenModel;
3
3
  export declare const getEmbeddingContextSize: (modelName?: string) => number;
4
4
  export declare const getModelContextSize: (modelName: string) => number;
@@ -6,10 +6,5 @@ interface CalculateMaxTokenProps {
6
6
  prompt: string;
7
7
  modelName: TiktokenModel;
8
8
  }
9
- export declare const importTiktoken: () => Promise<{
10
- encoding_for_model: typeof import("@dqbd/tiktoken").encoding_for_model;
11
- } | {
12
- encoding_for_model: null;
13
- }>;
14
9
  export declare const calculateMaxTokens: ({ prompt, modelName, }: CalculateMaxTokenProps) => Promise<number>;
15
10
  export {};
@@ -1,4 +1,5 @@
1
- // https://www.npmjs.com/package/@dqbd/tiktoken
1
+ import { encodingForModel } from "../util/tiktoken.js";
2
+ // https://www.npmjs.com/package/js-tiktoken
2
3
  export const getModelNameForTiktoken = (modelName) => {
3
4
  if (modelName.startsWith("gpt-3.5-turbo-")) {
4
5
  return "gpt-3.5-turbo";
@@ -43,30 +44,14 @@ export const getModelContextSize = (modelName) => {
43
44
  return 4097;
44
45
  }
45
46
  };
46
- export const importTiktoken = async () => {
47
- try {
48
- const { encoding_for_model } = await import("@dqbd/tiktoken");
49
- return { encoding_for_model };
50
- }
51
- catch (error) {
52
- console.log(error);
53
- return { encoding_for_model: null };
54
- }
55
- };
56
47
  export const calculateMaxTokens = async ({ prompt, modelName, }) => {
57
- const { encoding_for_model } = await importTiktoken();
58
48
  // fallback to approximate calculation if tiktoken is not available
59
49
  let numTokens = Math.ceil(prompt.length / 4);
60
50
  try {
61
- if (encoding_for_model) {
62
- const encoding = encoding_for_model(getModelNameForTiktoken(modelName));
63
- const tokenized = encoding.encode(prompt);
64
- numTokens = tokenized.length;
65
- encoding.free();
66
- }
51
+ numTokens = (await encodingForModel(modelName)).encode(prompt).length;
67
52
  }
68
53
  catch (error) {
69
- console.warn("Failed to calculate number of tokens with tiktoken, falling back to approximate count", error);
54
+ console.warn("Failed to calculate number of tokens, falling back to approximate count");
70
55
  }
71
56
  const maxTokens = getModelContextSize(modelName);
72
57
  return maxTokens - numTokens;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.BaseLanguageModel = exports.BaseLangChain = void 0;
4
4
  const async_caller_js_1 = require("../util/async_caller.cjs");
5
5
  const count_tokens_js_1 = require("./count_tokens.cjs");
6
+ const tiktoken_js_1 = require("../util/tiktoken.cjs");
6
7
  const getVerbosity = () => false;
7
8
  /**
8
9
  * Base class for language models, chains, tools.
@@ -60,38 +61,23 @@ class BaseLanguageModel extends BaseLangChain {
60
61
  writable: true,
61
62
  value: void 0
62
63
  });
63
- Object.defineProperty(this, "_registry", {
64
- enumerable: true,
65
- configurable: true,
66
- writable: true,
67
- value: void 0
68
- });
69
64
  this.caller = new async_caller_js_1.AsyncCaller(params ?? {});
70
65
  }
71
66
  async getNumTokens(text) {
72
67
  // fallback to approximate calculation if tiktoken is not available
73
68
  let numTokens = Math.ceil(text.length / 4);
74
- try {
75
- if (!this._encoding) {
76
- const { encoding_for_model } = await (0, count_tokens_js_1.importTiktoken)();
77
- // modelName only exists in openai subclasses, but tiktoken only supports
78
- // openai tokenisers anyway, so for other subclasses we default to gpt2
79
- if (encoding_for_model) {
80
- this._encoding = encoding_for_model("modelName" in this
81
- ? (0, count_tokens_js_1.getModelNameForTiktoken)(this.modelName)
82
- : "gpt2");
83
- // We need to register a finalizer to free the tokenizer when the
84
- // model is garbage collected.
85
- this._registry = new FinalizationRegistry((t) => t.free());
86
- this._registry.register(this, this._encoding);
87
- }
69
+ if (!this._encoding) {
70
+ try {
71
+ this._encoding = await (0, tiktoken_js_1.encodingForModel)("modelName" in this
72
+ ? (0, count_tokens_js_1.getModelNameForTiktoken)(this.modelName)
73
+ : "gpt2");
88
74
  }
89
- if (this._encoding) {
90
- numTokens = this._encoding.encode(text).length;
75
+ catch (error) {
76
+ console.warn("Failed to calculate number of tokens, falling back to approximate count", error);
91
77
  }
92
78
  }
93
- catch (error) {
94
- console.warn("Failed to calculate number of tokens with tiktoken, falling back to approximate count", error);
79
+ if (this._encoding) {
80
+ numTokens = this._encoding.encode(text).length;
95
81
  }
96
82
  return numTokens;
97
83
  }
@@ -1,4 +1,4 @@
1
- import { BasePromptValue, LLMResult } from "../schema/index.js";
1
+ import { BaseChatMessage, BasePromptValue, LLMResult } from "../schema/index.js";
2
2
  import { CallbackManager, Callbacks } from "../callbacks/manager.js";
3
3
  import { AsyncCaller, AsyncCallerParams } from "../util/async_caller.js";
4
4
  export type SerializedLLM = {
@@ -63,10 +63,11 @@ export declare abstract class BaseLanguageModel extends BaseLangChain implements
63
63
  caller: AsyncCaller;
64
64
  constructor(params: BaseLanguageModelParams);
65
65
  abstract generatePrompt(promptValues: BasePromptValue[], options?: string[] | this["CallOptions"], callbacks?: Callbacks): Promise<LLMResult>;
66
+ abstract predict(text: string, options?: string[] | this["CallOptions"], callbacks?: Callbacks): Promise<string>;
67
+ abstract predictMessages(messages: BaseChatMessage[], options?: string[] | this["CallOptions"], callbacks?: Callbacks): Promise<BaseChatMessage>;
66
68
  abstract _modelType(): string;
67
69
  abstract _llmType(): string;
68
70
  private _encoding?;
69
- private _registry?;
70
71
  getNumTokens(text: string): Promise<number>;
71
72
  /**
72
73
  * Get the identifying parameters of the LLM.
@@ -1,5 +1,6 @@
1
1
  import { AsyncCaller } from "../util/async_caller.js";
2
- import { getModelNameForTiktoken, importTiktoken } from "./count_tokens.js";
2
+ import { getModelNameForTiktoken } from "./count_tokens.js";
3
+ import { encodingForModel } from "../util/tiktoken.js";
3
4
  const getVerbosity = () => false;
4
5
  /**
5
6
  * Base class for language models, chains, tools.
@@ -56,38 +57,23 @@ export class BaseLanguageModel extends BaseLangChain {
56
57
  writable: true,
57
58
  value: void 0
58
59
  });
59
- Object.defineProperty(this, "_registry", {
60
- enumerable: true,
61
- configurable: true,
62
- writable: true,
63
- value: void 0
64
- });
65
60
  this.caller = new AsyncCaller(params ?? {});
66
61
  }
67
62
  async getNumTokens(text) {
68
63
  // fallback to approximate calculation if tiktoken is not available
69
64
  let numTokens = Math.ceil(text.length / 4);
70
- try {
71
- if (!this._encoding) {
72
- const { encoding_for_model } = await importTiktoken();
73
- // modelName only exists in openai subclasses, but tiktoken only supports
74
- // openai tokenisers anyway, so for other subclasses we default to gpt2
75
- if (encoding_for_model) {
76
- this._encoding = encoding_for_model("modelName" in this
77
- ? getModelNameForTiktoken(this.modelName)
78
- : "gpt2");
79
- // We need to register a finalizer to free the tokenizer when the
80
- // model is garbage collected.
81
- this._registry = new FinalizationRegistry((t) => t.free());
82
- this._registry.register(this, this._encoding);
83
- }
65
+ if (!this._encoding) {
66
+ try {
67
+ this._encoding = await encodingForModel("modelName" in this
68
+ ? getModelNameForTiktoken(this.modelName)
69
+ : "gpt2");
84
70
  }
85
- if (this._encoding) {
86
- numTokens = this._encoding.encode(text).length;
71
+ catch (error) {
72
+ console.warn("Failed to calculate number of tokens, falling back to approximate count", error);
87
73
  }
88
74
  }
89
- catch (error) {
90
- console.warn("Failed to calculate number of tokens with tiktoken, falling back to approximate count", error);
75
+ if (this._encoding) {
76
+ numTokens = this._encoding.encode(text).length;
91
77
  }
92
78
  return numTokens;
93
79
  }
@@ -1,8 +1,10 @@
1
- import type { RedisClientType } from "redis";
1
+ import type { createCluster, createClient } from "redis";
2
2
  import { BaseCache, Generation } from "../schema/index.js";
3
+ type RedisClientType = ReturnType<typeof createClient> | ReturnType<typeof createCluster>;
3
4
  export declare class RedisCache extends BaseCache {
4
5
  private redisClient;
5
6
  constructor(redisClient: RedisClientType);
6
7
  lookup(prompt: string, llmKey: string): Promise<Generation[] | null>;
7
8
  update(prompt: string, llmKey: string, value: Generation[]): Promise<void>;
8
9
  }
10
+ export {};
@@ -12,7 +12,7 @@ declare abstract class BaseCallbackHandlerMethodsClass {
12
12
  */
13
13
  handleLLMStart?(llm: {
14
14
  name: string;
15
- }, prompts: string[], runId: string, parentRunId?: string): Promise<void> | void;
15
+ }, prompts: string[], runId: string, parentRunId?: string, extraParams?: Record<string, unknown>): Promise<void> | void;
16
16
  /**
17
17
  * Called when an LLM/ChatModel in `streaming` mode produces a new token
18
18
  */
@@ -31,7 +31,7 @@ declare abstract class BaseCallbackHandlerMethodsClass {
31
31
  */
32
32
  handleChatModelStart?(llm: {
33
33
  name: string;
34
- }, messages: BaseChatMessage[][], runId: string, parentRunId?: string): Promise<void> | void;
34
+ }, messages: BaseChatMessage[][], runId: string, parentRunId?: string, extraParams?: Record<string, unknown>): Promise<void> | void;
35
35
  /**
36
36
  * Called at the start of a Chain run, with the chain name and inputs
37
37
  * and the run ID.
@@ -103,7 +103,7 @@ export declare abstract class BaseCallbackHandler extends BaseCallbackHandlerMet
103
103
  */
104
104
  handleLLMStart?(llm: {
105
105
  name: string;
106
- }, prompts: string[], runId: string, parentRunId?: string | undefined): void | Promise<void>;
106
+ }, prompts: string[], runId: string, parentRunId?: string | undefined, extraParams?: Record<string, unknown> | undefined): void | Promise<void>;
107
107
  /**
108
108
  * Called when an LLM/ChatModel in `streaming` mode produces a new token
109
109
  */
@@ -122,7 +122,7 @@ export declare abstract class BaseCallbackHandler extends BaseCallbackHandlerMet
122
122
  */
123
123
  handleChatModelStart?(llm: {
124
124
  name: string;
125
- }, messages: BaseChatMessage[][], runId: string, parentRunId?: string | undefined): void | Promise<void>;
125
+ }, messages: BaseChatMessage[][], runId: string, parentRunId?: string | undefined, extraParams?: Record<string, unknown> | undefined): void | Promise<void>;
126
126
  /**
127
127
  * Called at the start of a Chain run, with the chain name and inputs
128
128
  * and the run ID.
@@ -14,14 +14,7 @@ async function getTracingCallbackHandler(session) {
14
14
  return tracer;
15
15
  }
16
16
  exports.getTracingCallbackHandler = getTracingCallbackHandler;
17
- async function getTracingV2CallbackHandler(session) {
18
- const tracer = new tracer_langchain_js_1.LangChainTracer();
19
- if (session) {
20
- await tracer.loadSession(session);
21
- }
22
- else {
23
- await tracer.loadDefaultSession();
24
- }
25
- return tracer;
17
+ async function getTracingV2CallbackHandler() {
18
+ return new tracer_langchain_js_1.LangChainTracer();
26
19
  }
27
20
  exports.getTracingV2CallbackHandler = getTracingV2CallbackHandler;
@@ -1,4 +1,4 @@
1
1
  import { LangChainTracer } from "./tracer_langchain.js";
2
2
  import { LangChainTracerV1 } from "./tracer_langchain_v1.js";
3
3
  export declare function getTracingCallbackHandler(session?: string): Promise<LangChainTracerV1>;
4
- export declare function getTracingV2CallbackHandler(session?: string): Promise<LangChainTracer>;
4
+ export declare function getTracingV2CallbackHandler(): Promise<LangChainTracer>;
@@ -10,13 +10,6 @@ export async function getTracingCallbackHandler(session) {
10
10
  }
11
11
  return tracer;
12
12
  }
13
- export async function getTracingV2CallbackHandler(session) {
14
- const tracer = new LangChainTracer();
15
- if (session) {
16
- await tracer.loadSession(session);
17
- }
18
- else {
19
- await tracer.loadDefaultSession();
20
- }
21
- return tracer;
13
+ export async function getTracingV2CallbackHandler() {
14
+ return new LangChainTracer();
22
15
  }
@@ -24,37 +24,28 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
24
24
  if (parentRun) {
25
25
  this._addChildRun(parentRun, run);
26
26
  }
27
- else {
28
- throw new Error(`Caller run ${run.parent_run_id} not found`);
29
- }
30
27
  }
31
28
  this.runMap.set(run.id, run);
32
29
  }
33
30
  async _endTrace(run) {
34
- if (!run.parent_run_id) {
35
- await this.persistRun(run);
31
+ const parentRun = run.parent_run_id !== undefined && this.runMap.get(run.parent_run_id);
32
+ if (parentRun) {
33
+ parentRun.child_execution_order = Math.max(parentRun.child_execution_order, run.child_execution_order);
36
34
  }
37
35
  else {
38
- const parentRun = this.runMap.get(run.parent_run_id);
39
- if (parentRun === undefined) {
40
- throw new Error(`Parent run ${run.parent_run_id} not found`);
41
- }
42
- parentRun.child_execution_order = Math.max(parentRun.child_execution_order, run.child_execution_order);
36
+ await this.persistRun(run);
43
37
  }
44
38
  this.runMap.delete(run.id);
45
39
  }
46
40
  _getExecutionOrder(parentRunId) {
41
+ const parentRun = parentRunId !== undefined && this.runMap.get(parentRunId);
47
42
  // If a run has no parent then execution order is 1
48
- if (parentRunId === undefined) {
43
+ if (!parentRun) {
49
44
  return 1;
50
45
  }
51
- const parentRun = this.runMap.get(parentRunId);
52
- if (parentRun === undefined) {
53
- throw new Error(`Parent run ${parentRunId} not found`);
54
- }
55
46
  return parentRun.child_execution_order + 1;
56
47
  }
57
- async handleLLMStart(llm, prompts, runId, parentRunId) {
48
+ async handleLLMStart(llm, prompts, runId, parentRunId, extraParams) {
58
49
  const execution_order = this._getExecutionOrder(parentRunId);
59
50
  const run = {
60
51
  id: runId,
@@ -68,16 +59,13 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
68
59
  child_runs: [],
69
60
  child_execution_order: execution_order,
70
61
  run_type: "llm",
62
+ extra: extraParams,
71
63
  };
72
64
  this._startTrace(run);
73
65
  await this.onLLMStart?.(run);
74
66
  }
75
- async handleChatModelStart(llm, messages, runId, parentRunId) {
67
+ async handleChatModelStart(llm, messages, runId, parentRunId, extraParams) {
76
68
  const execution_order = this._getExecutionOrder(parentRunId);
77
- const convertedMessages = messages.map((batch) => batch.map((message) => ({
78
- _type: message._getType(),
79
- content: message.text, // TODO: Unify serialization btwn languages
80
- })));
81
69
  const run = {
82
70
  id: runId,
83
71
  name: llm.name,
@@ -85,11 +73,12 @@ class BaseTracer extends base_js_1.BaseCallbackHandler {
85
73
  start_time: Date.now(),
86
74
  end_time: 0,
87
75
  serialized: llm,
88
- inputs: { messages: convertedMessages },
76
+ inputs: { messages },
89
77
  execution_order,
90
78
  child_runs: [],
91
79
  child_execution_order: execution_order,
92
80
  run_type: "llm",
81
+ extra: extraParams,
93
82
  };
94
83
  this._startTrace(run);
95
84
  await this.onLLMStart?.(run);
@@ -35,10 +35,10 @@ export declare abstract class BaseTracer extends BaseCallbackHandler {
35
35
  protected _getExecutionOrder(parentRunId: string | undefined): number;
36
36
  handleLLMStart(llm: {
37
37
  name: string;
38
- }, prompts: string[], runId: string, parentRunId?: string): Promise<void>;
38
+ }, prompts: string[], runId: string, parentRunId?: string, extraParams?: Record<string, unknown>): Promise<void>;
39
39
  handleChatModelStart(llm: {
40
40
  name: string;
41
- }, messages: BaseChatMessage[][], runId: string, parentRunId?: string): Promise<void>;
41
+ }, messages: BaseChatMessage[][], runId: string, parentRunId?: string, extraParams?: Record<string, unknown>): Promise<void>;
42
42
  handleLLMEnd(output: LLMResult, runId: string): Promise<void>;
43
43
  handleLLMError(error: Error, runId: string): Promise<void>;
44
44
  handleChainStart(chain: {
@@ -21,37 +21,28 @@ export class BaseTracer extends BaseCallbackHandler {
21
21
  if (parentRun) {
22
22
  this._addChildRun(parentRun, run);
23
23
  }
24
- else {
25
- throw new Error(`Caller run ${run.parent_run_id} not found`);
26
- }
27
24
  }
28
25
  this.runMap.set(run.id, run);
29
26
  }
30
27
  async _endTrace(run) {
31
- if (!run.parent_run_id) {
32
- await this.persistRun(run);
28
+ const parentRun = run.parent_run_id !== undefined && this.runMap.get(run.parent_run_id);
29
+ if (parentRun) {
30
+ parentRun.child_execution_order = Math.max(parentRun.child_execution_order, run.child_execution_order);
33
31
  }
34
32
  else {
35
- const parentRun = this.runMap.get(run.parent_run_id);
36
- if (parentRun === undefined) {
37
- throw new Error(`Parent run ${run.parent_run_id} not found`);
38
- }
39
- parentRun.child_execution_order = Math.max(parentRun.child_execution_order, run.child_execution_order);
33
+ await this.persistRun(run);
40
34
  }
41
35
  this.runMap.delete(run.id);
42
36
  }
43
37
  _getExecutionOrder(parentRunId) {
38
+ const parentRun = parentRunId !== undefined && this.runMap.get(parentRunId);
44
39
  // If a run has no parent then execution order is 1
45
- if (parentRunId === undefined) {
40
+ if (!parentRun) {
46
41
  return 1;
47
42
  }
48
- const parentRun = this.runMap.get(parentRunId);
49
- if (parentRun === undefined) {
50
- throw new Error(`Parent run ${parentRunId} not found`);
51
- }
52
43
  return parentRun.child_execution_order + 1;
53
44
  }
54
- async handleLLMStart(llm, prompts, runId, parentRunId) {
45
+ async handleLLMStart(llm, prompts, runId, parentRunId, extraParams) {
55
46
  const execution_order = this._getExecutionOrder(parentRunId);
56
47
  const run = {
57
48
  id: runId,
@@ -65,16 +56,13 @@ export class BaseTracer extends BaseCallbackHandler {
65
56
  child_runs: [],
66
57
  child_execution_order: execution_order,
67
58
  run_type: "llm",
59
+ extra: extraParams,
68
60
  };
69
61
  this._startTrace(run);
70
62
  await this.onLLMStart?.(run);
71
63
  }
72
- async handleChatModelStart(llm, messages, runId, parentRunId) {
64
+ async handleChatModelStart(llm, messages, runId, parentRunId, extraParams) {
73
65
  const execution_order = this._getExecutionOrder(parentRunId);
74
- const convertedMessages = messages.map((batch) => batch.map((message) => ({
75
- _type: message._getType(),
76
- content: message.text, // TODO: Unify serialization btwn languages
77
- })));
78
66
  const run = {
79
67
  id: runId,
80
68
  name: llm.name,
@@ -82,11 +70,12 @@ export class BaseTracer extends BaseCallbackHandler {
82
70
  start_time: Date.now(),
83
71
  end_time: 0,
84
72
  serialized: llm,
85
- inputs: { messages: convertedMessages },
73
+ inputs: { messages },
86
74
  execution_order,
87
75
  child_runs: [],
88
76
  child_execution_order: execution_order,
89
77
  run_type: "llm",
78
+ extra: extraParams,
90
79
  };
91
80
  this._startTrace(run);
92
81
  await this.onLLMStart?.(run);