{"version":3,"file":"metadata.cjs","names":[],"sources":["../../src/utils/metadata.ts"],"sourcesContent":["import type {\n  UsageMetadata,\n  InputTokenDetails,\n  OutputTokenDetails,\n} from \"@langchain/core/messages\";\n\n/**\n * Computes the delta between two token detail objects by subtracting\n * each field in `previous` from the corresponding field in `current`.\n *\n * This is used to convert cumulative token detail counts (as reported\n * by the Gemini streaming API) into per-chunk deltas that can be\n * correctly summed by {@link mergeUsageMetadata} during chunk\n * concatenation.\n *\n * @param current - The cumulative token details from the current chunk.\n * @param previous - The cumulative token details from the previous chunk.\n * @returns The per-chunk delta, or `undefined` if `current` is undefined.\n */\nfunction subtractTokenDetails<T extends InputTokenDetails | OutputTokenDetails>(\n  current?: T,\n  previous?: T\n): T | undefined {\n  if (!current) return undefined;\n  if (!previous) return current;\n  const result = {} as Record<string, number>;\n  for (const key of Object.keys(current) as (keyof T)[]) {\n    const cur = current[key] as number | undefined;\n    const prev = previous[key] as number | undefined;\n    if (cur !== undefined) {\n      result[key as string] = cur - (prev ?? 0);\n    }\n  }\n  return result as T;\n}\n\n/**\n * Computes the delta between two {@link UsageMetadata} objects by\n * subtracting each field in `previous` from the corresponding field in\n * `current`.\n *\n * The Gemini streaming API reports **cumulative** token counts on every\n * SSE chunk, but `@langchain/core`'s `mergeUsageMetadata` combines\n * values via addition. Emitting raw cumulative values on each\n * `AIMessageChunk` would therefore inflate the totals when chunks are\n * concatenated. This function converts cumulative values into per-chunk\n * deltas so that additive merging produces the correct final totals.\n *\n * @param current - The cumulative usage metadata from the current chunk.\n * @param previous - The cumulative usage metadata from the previous\n *   chunk, or `undefined` for the first chunk in the stream.\n * @returns The per-chunk delta usage metadata.\n */\nexport function subtractUsageMetadata(\n  current: UsageMetadata,\n  previous?: UsageMetadata\n): UsageMetadata {\n  if (!previous) return current;\n  return {\n    input_tokens: current.input_tokens - previous.input_tokens,\n    output_tokens: current.output_tokens - previous.output_tokens,\n    total_tokens: current.total_tokens - previous.total_tokens,\n    input_token_details: subtractTokenDetails(\n      current.input_token_details,\n      previous.input_token_details\n    ),\n    output_token_details: subtractTokenDetails(\n      current.output_token_details,\n      previous.output_token_details\n    ),\n  };\n}\n"],"mappings":";;;;;;;;;;;;;;AAmBA,SAAS,qBACP,SACA,UACe;CACf,IAAI,CAAC,SAAS,OAAO,KAAA;CACrB,IAAI,CAAC,UAAU,OAAO;CACtB,MAAM,SAAS,CAAC;CAChB,KAAK,MAAM,OAAO,OAAO,KAAK,OAAO,GAAkB;EACrD,MAAM,MAAM,QAAQ;EACpB,MAAM,OAAO,SAAS;EACtB,IAAI,QAAQ,KAAA,GACV,OAAO,OAAiB,OAAO,QAAQ;CAE3C;CACA,OAAO;AACT;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,sBACd,SACA,UACe;CACf,IAAI,CAAC,UAAU,OAAO;CACtB,OAAO;EACL,cAAc,QAAQ,eAAe,SAAS;EAC9C,eAAe,QAAQ,gBAAgB,SAAS;EAChD,cAAc,QAAQ,eAAe,SAAS;EAC9C,qBAAqB,qBACnB,QAAQ,qBACR,SAAS,mBACX;EACA,sBAAsB,qBACpB,QAAQ,sBACR,SAAS,oBACX;CACF;AACF"}