@langchain/core 0.3.9-rc.0 → 0.3.9

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.
@@ -137,6 +137,9 @@ class AIMessageChunk extends base_js_1.BaseMessageChunk {
137
137
  tool_calls: fields.tool_calls ?? [],
138
138
  invalid_tool_calls: [],
139
139
  tool_call_chunks: [],
140
+ usage_metadata: fields.usage_metadata !== undefined
141
+ ? fields.usage_metadata
142
+ : undefined,
140
143
  };
141
144
  }
142
145
  else {
@@ -172,6 +175,9 @@ class AIMessageChunk extends base_js_1.BaseMessageChunk {
172
175
  ...fields,
173
176
  tool_calls: toolCalls,
174
177
  invalid_tool_calls: invalidToolCalls,
178
+ usage_metadata: fields.usage_metadata !== undefined
179
+ ? fields.usage_metadata
180
+ : undefined,
175
181
  };
176
182
  }
177
183
  // Sadly, TypeScript only allows super() calls at root if the class has
@@ -255,6 +261,41 @@ class AIMessageChunk extends base_js_1.BaseMessageChunk {
255
261
  }
256
262
  if (this.usage_metadata !== undefined ||
257
263
  chunk.usage_metadata !== undefined) {
264
+ const inputTokenDetails = {
265
+ ...((this.usage_metadata?.input_token_details?.audio !== undefined ||
266
+ chunk.usage_metadata?.input_token_details?.audio !== undefined) && {
267
+ audio: (this.usage_metadata?.input_token_details?.audio ?? 0) +
268
+ (chunk.usage_metadata?.input_token_details?.audio ?? 0),
269
+ }),
270
+ ...((this.usage_metadata?.input_token_details?.cache_read !==
271
+ undefined ||
272
+ chunk.usage_metadata?.input_token_details?.cache_read !==
273
+ undefined) && {
274
+ cache_read: (this.usage_metadata?.input_token_details?.cache_read ?? 0) +
275
+ (chunk.usage_metadata?.input_token_details?.cache_read ?? 0),
276
+ }),
277
+ ...((this.usage_metadata?.input_token_details?.cache_creation !==
278
+ undefined ||
279
+ chunk.usage_metadata?.input_token_details?.cache_creation !==
280
+ undefined) && {
281
+ cache_creation: (this.usage_metadata?.input_token_details?.cache_creation ?? 0) +
282
+ (chunk.usage_metadata?.input_token_details?.cache_creation ?? 0),
283
+ }),
284
+ };
285
+ const outputTokenDetails = {
286
+ ...((this.usage_metadata?.output_token_details?.audio !== undefined ||
287
+ chunk.usage_metadata?.output_token_details?.audio !== undefined) && {
288
+ audio: (this.usage_metadata?.output_token_details?.audio ?? 0) +
289
+ (chunk.usage_metadata?.output_token_details?.audio ?? 0),
290
+ }),
291
+ ...((this.usage_metadata?.output_token_details?.reasoning !==
292
+ undefined ||
293
+ chunk.usage_metadata?.output_token_details?.reasoning !==
294
+ undefined) && {
295
+ reasoning: (this.usage_metadata?.output_token_details?.reasoning ?? 0) +
296
+ (chunk.usage_metadata?.output_token_details?.reasoning ?? 0),
297
+ }),
298
+ };
258
299
  const left = this.usage_metadata ?? {
259
300
  input_tokens: 0,
260
301
  output_tokens: 0,
@@ -269,6 +310,14 @@ class AIMessageChunk extends base_js_1.BaseMessageChunk {
269
310
  input_tokens: left.input_tokens + right.input_tokens,
270
311
  output_tokens: left.output_tokens + right.output_tokens,
271
312
  total_tokens: left.total_tokens + right.total_tokens,
313
+ // Do not include `input_token_details` / `output_token_details` keys in combined fields
314
+ // unless their values are defined.
315
+ ...(Object.keys(inputTokenDetails).length > 0 && {
316
+ input_token_details: inputTokenDetails,
317
+ }),
318
+ ...(Object.keys(outputTokenDetails).length > 0 && {
319
+ output_token_details: outputTokenDetails,
320
+ }),
272
321
  };
273
322
  combinedFields.usage_metadata = usage_metadata;
274
323
  }
@@ -5,22 +5,76 @@ export type AIMessageFields = BaseMessageFields & {
5
5
  invalid_tool_calls?: InvalidToolCall[];
6
6
  usage_metadata?: UsageMetadata;
7
7
  };
8
+ /**
9
+ * Breakdown of input token counts.
10
+ *
11
+ * Does not *need* to sum to full input token count. Does *not* need to have all keys.
12
+ */
13
+ export type InputTokenDetails = {
14
+ /**
15
+ * Audio input tokens.
16
+ */
17
+ audio?: number;
18
+ /**
19
+ * Input tokens that were cached and there was a cache hit.
20
+ *
21
+ * Since there was a cache hit, the tokens were read from the cache.
22
+ * More precisely, the model state given these tokens was read from the cache.
23
+ */
24
+ cache_read?: number;
25
+ /**
26
+ * Input tokens that were cached and there was a cache miss.
27
+ *
28
+ * Since there was a cache miss, the cache was created from these tokens.
29
+ */
30
+ cache_creation?: number;
31
+ };
32
+ /**
33
+ * Breakdown of output token counts.
34
+ *
35
+ * Does *not* need to sum to full output token count. Does *not* need to have all keys.
36
+ */
37
+ export type OutputTokenDetails = {
38
+ /**
39
+ * Audio output tokens
40
+ */
41
+ audio?: number;
42
+ /**
43
+ * Reasoning output tokens.
44
+ *
45
+ * Tokens generated by the model in a chain of thought process (i.e. by
46
+ * OpenAI's o1 models) that are not returned as part of model output.
47
+ */
48
+ reasoning?: number;
49
+ };
8
50
  /**
9
51
  * Usage metadata for a message, such as token counts.
10
52
  */
11
53
  export type UsageMetadata = {
12
54
  /**
13
- * The count of input (or prompt) tokens.
55
+ * Count of input (or prompt) tokens. Sum of all input token types.
14
56
  */
15
57
  input_tokens: number;
16
58
  /**
17
- * The count of output (or completion) tokens
59
+ * Count of output (or completion) tokens. Sum of all output token types.
18
60
  */
19
61
  output_tokens: number;
20
62
  /**
21
- * The total token count
63
+ * Total token count. Sum of input_tokens + output_tokens.
22
64
  */
23
65
  total_tokens: number;
66
+ /**
67
+ * Breakdown of input token counts.
68
+ *
69
+ * Does *not* need to sum to full input token count. Does *not* need to have all keys.
70
+ */
71
+ input_token_details?: InputTokenDetails;
72
+ /**
73
+ * Breakdown of output token counts.
74
+ *
75
+ * Does *not* need to sum to full output token count. Does *not* need to have all keys.
76
+ */
77
+ output_token_details?: OutputTokenDetails;
24
78
  };
25
79
  /**
26
80
  * Represents an AI message in a conversation.
@@ -131,6 +131,9 @@ export class AIMessageChunk extends BaseMessageChunk {
131
131
  tool_calls: fields.tool_calls ?? [],
132
132
  invalid_tool_calls: [],
133
133
  tool_call_chunks: [],
134
+ usage_metadata: fields.usage_metadata !== undefined
135
+ ? fields.usage_metadata
136
+ : undefined,
134
137
  };
135
138
  }
136
139
  else {
@@ -166,6 +169,9 @@ export class AIMessageChunk extends BaseMessageChunk {
166
169
  ...fields,
167
170
  tool_calls: toolCalls,
168
171
  invalid_tool_calls: invalidToolCalls,
172
+ usage_metadata: fields.usage_metadata !== undefined
173
+ ? fields.usage_metadata
174
+ : undefined,
169
175
  };
170
176
  }
171
177
  // Sadly, TypeScript only allows super() calls at root if the class has
@@ -249,6 +255,41 @@ export class AIMessageChunk extends BaseMessageChunk {
249
255
  }
250
256
  if (this.usage_metadata !== undefined ||
251
257
  chunk.usage_metadata !== undefined) {
258
+ const inputTokenDetails = {
259
+ ...((this.usage_metadata?.input_token_details?.audio !== undefined ||
260
+ chunk.usage_metadata?.input_token_details?.audio !== undefined) && {
261
+ audio: (this.usage_metadata?.input_token_details?.audio ?? 0) +
262
+ (chunk.usage_metadata?.input_token_details?.audio ?? 0),
263
+ }),
264
+ ...((this.usage_metadata?.input_token_details?.cache_read !==
265
+ undefined ||
266
+ chunk.usage_metadata?.input_token_details?.cache_read !==
267
+ undefined) && {
268
+ cache_read: (this.usage_metadata?.input_token_details?.cache_read ?? 0) +
269
+ (chunk.usage_metadata?.input_token_details?.cache_read ?? 0),
270
+ }),
271
+ ...((this.usage_metadata?.input_token_details?.cache_creation !==
272
+ undefined ||
273
+ chunk.usage_metadata?.input_token_details?.cache_creation !==
274
+ undefined) && {
275
+ cache_creation: (this.usage_metadata?.input_token_details?.cache_creation ?? 0) +
276
+ (chunk.usage_metadata?.input_token_details?.cache_creation ?? 0),
277
+ }),
278
+ };
279
+ const outputTokenDetails = {
280
+ ...((this.usage_metadata?.output_token_details?.audio !== undefined ||
281
+ chunk.usage_metadata?.output_token_details?.audio !== undefined) && {
282
+ audio: (this.usage_metadata?.output_token_details?.audio ?? 0) +
283
+ (chunk.usage_metadata?.output_token_details?.audio ?? 0),
284
+ }),
285
+ ...((this.usage_metadata?.output_token_details?.reasoning !==
286
+ undefined ||
287
+ chunk.usage_metadata?.output_token_details?.reasoning !==
288
+ undefined) && {
289
+ reasoning: (this.usage_metadata?.output_token_details?.reasoning ?? 0) +
290
+ (chunk.usage_metadata?.output_token_details?.reasoning ?? 0),
291
+ }),
292
+ };
252
293
  const left = this.usage_metadata ?? {
253
294
  input_tokens: 0,
254
295
  output_tokens: 0,
@@ -263,6 +304,14 @@ export class AIMessageChunk extends BaseMessageChunk {
263
304
  input_tokens: left.input_tokens + right.input_tokens,
264
305
  output_tokens: left.output_tokens + right.output_tokens,
265
306
  total_tokens: left.total_tokens + right.total_tokens,
307
+ // Do not include `input_token_details` / `output_token_details` keys in combined fields
308
+ // unless their values are defined.
309
+ ...(Object.keys(inputTokenDetails).length > 0 && {
310
+ input_token_details: inputTokenDetails,
311
+ }),
312
+ ...(Object.keys(outputTokenDetails).length > 0 && {
313
+ output_token_details: outputTokenDetails,
314
+ }),
266
315
  };
267
316
  combinedFields.usage_metadata = usage_metadata;
268
317
  }
@@ -117,7 +117,7 @@ export declare abstract class Runnable<RunInput = any, RunOutput = any, CallOpti
117
117
  * Output values, with callbacks.
118
118
  * Use this to implement `stream()` or `transform()` in Runnable subclasses.
119
119
  */
120
- protected _transformStreamWithConfig<I extends RunInput, O extends RunOutput>(inputGenerator: AsyncGenerator<I>, transformer: (generator: AsyncGenerator<I>, runManager?: CallbackManagerForChainRun, options?: Partial<CallOptions>) => AsyncGenerator<O>, options?: CallOptions & {
120
+ protected _transformStreamWithConfig<I extends RunInput, O extends RunOutput>(inputGenerator: AsyncGenerator<I>, transformer: (generator: AsyncGenerator<I>, runManager?: CallbackManagerForChainRun, options?: Partial<CallOptions>) => AsyncGenerator<O>, options?: Partial<CallOptions> & {
121
121
  runType?: string;
122
122
  }): AsyncGenerator<O>;
123
123
  getGraph(_?: RunnableConfig): Graph;
@@ -547,20 +547,20 @@ export declare class RunnableTraceable<RunInput, RunOutput> extends Runnable<Run
547
547
  /**
548
548
  * A runnable that runs a callable.
549
549
  */
550
- export declare class RunnableLambda<RunInput, RunOutput> extends Runnable<RunInput, RunOutput> {
550
+ export declare class RunnableLambda<RunInput, RunOutput, CallOptions extends RunnableConfig = RunnableConfig> extends Runnable<RunInput, RunOutput, CallOptions> {
551
551
  static lc_name(): string;
552
552
  lc_namespace: string[];
553
- protected func: RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput>>;
553
+ protected func: RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput, CallOptions>, CallOptions>;
554
554
  constructor(fields: {
555
- func: RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput>> | TraceableFunction<RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput>>>;
555
+ func: RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput, CallOptions>, CallOptions> | TraceableFunction<RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput, CallOptions>, CallOptions>>;
556
556
  });
557
- static from<RunInput, RunOutput>(func: RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput>>): RunnableLambda<RunInput, RunOutput>;
558
- static from<RunInput, RunOutput>(func: TraceableFunction<RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput>>>): RunnableLambda<RunInput, RunOutput>;
559
- _invoke(input: RunInput, config?: Partial<RunnableConfig>, runManager?: CallbackManagerForChainRun): Promise<RunOutput>;
560
- invoke(input: RunInput, options?: Partial<RunnableConfig>): Promise<RunOutput>;
561
- _transform(generator: AsyncGenerator<RunInput>, runManager?: CallbackManagerForChainRun, config?: Partial<RunnableConfig>): AsyncGenerator<RunOutput>;
562
- transform(generator: AsyncGenerator<RunInput>, options?: Partial<RunnableConfig>): AsyncGenerator<RunOutput>;
563
- stream(input: RunInput, options?: Partial<RunnableConfig>): Promise<IterableReadableStream<RunOutput>>;
557
+ static from<RunInput, RunOutput, CallOptions extends RunnableConfig = RunnableConfig>(func: RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput, CallOptions>, CallOptions>): RunnableLambda<RunInput, RunOutput, CallOptions>;
558
+ static from<RunInput, RunOutput, CallOptions extends RunnableConfig = RunnableConfig>(func: TraceableFunction<RunnableFunc<RunInput, RunOutput | Runnable<RunInput, RunOutput, CallOptions>, CallOptions>>): RunnableLambda<RunInput, RunOutput, CallOptions>;
559
+ _invoke(input: RunInput, config?: Partial<CallOptions>, runManager?: CallbackManagerForChainRun): Promise<RunOutput>;
560
+ invoke(input: RunInput, options?: Partial<CallOptions>): Promise<RunOutput>;
561
+ _transform(generator: AsyncGenerator<RunInput>, runManager?: CallbackManagerForChainRun, config?: Partial<CallOptions>): AsyncGenerator<RunOutput>;
562
+ transform(generator: AsyncGenerator<RunInput>, options?: Partial<CallOptions>): AsyncGenerator<RunOutput>;
563
+ stream(input: RunInput, options?: Partial<CallOptions>): Promise<IterableReadableStream<RunOutput>>;
564
564
  }
565
565
  export declare class RunnableParallel<RunInput> extends RunnableMap<RunInput> {
566
566
  }
@@ -604,7 +604,7 @@ export declare class RunnableWithFallbacks<RunInput, RunOutput> extends Runnable
604
604
  }): Promise<(RunOutput | Error)[]>;
605
605
  batch(inputs: RunInput[], options?: Partial<RunnableConfig> | Partial<RunnableConfig>[], batchOptions?: RunnableBatchOptions): Promise<(RunOutput | Error)[]>;
606
606
  }
607
- export declare function _coerceToRunnable<RunInput, RunOutput>(coerceable: RunnableLike<RunInput, RunOutput>): Runnable<RunInput, Exclude<RunOutput, Error>>;
607
+ export declare function _coerceToRunnable<RunInput, RunOutput, CallOptions extends RunnableConfig = RunnableConfig>(coerceable: RunnableLike<RunInput, RunOutput, CallOptions>): Runnable<RunInput, Exclude<RunOutput, Error>, CallOptions>;
608
608
  export interface RunnableAssignFields<RunInput> {
609
609
  mapper: RunnableMap<RunInput>;
610
610
  }
@@ -70,9 +70,7 @@ const passthrough_js_1 = require("./passthrough.cjs");
70
70
  */
71
71
  class RunnableWithMessageHistory extends base_js_1.RunnableBinding {
72
72
  constructor(fields) {
73
- let historyChain = new base_js_1.RunnableLambda({
74
- func: (input, options) => this._enterHistory(input, options ?? {}),
75
- }).withConfig({ runName: "loadHistory" });
73
+ let historyChain = base_js_1.RunnableLambda.from((input, options) => this._enterHistory(input, options ?? {})).withConfig({ runName: "loadHistory" });
76
74
  const messagesKey = fields.historyMessagesKey ?? fields.inputMessagesKey;
77
75
  if (messagesKey) {
78
76
  historyChain = passthrough_js_1.RunnablePassthrough.assign({
@@ -67,9 +67,7 @@ import { RunnablePassthrough } from "./passthrough.js";
67
67
  */
68
68
  export class RunnableWithMessageHistory extends RunnableBinding {
69
69
  constructor(fields) {
70
- let historyChain = new RunnableLambda({
71
- func: (input, options) => this._enterHistory(input, options ?? {}),
72
- }).withConfig({ runName: "loadHistory" });
70
+ let historyChain = RunnableLambda.from((input, options) => this._enterHistory(input, options ?? {})).withConfig({ runName: "loadHistory" });
73
71
  const messagesKey = fields.historyMessagesKey ?? fields.inputMessagesKey;
74
72
  if (messagesKey) {
75
73
  historyChain = RunnablePassthrough.assign({
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/core",
3
- "version": "0.3.9-rc.0",
3
+ "version": "0.3.9",
4
4
  "description": "Core LangChain.js abstractions and schemas",
5
5
  "type": "module",
6
6
  "engines": {