@langchain/google 0.2.0 → 0.2.2

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 (74) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/chat_models/base.cjs +39 -21
  3. package/dist/chat_models/base.cjs.map +1 -1
  4. package/dist/chat_models/base.d.cts +1 -3
  5. package/dist/chat_models/base.d.ts +1 -3
  6. package/dist/chat_models/base.js +39 -22
  7. package/dist/chat_models/base.js.map +1 -1
  8. package/dist/chat_models/index.cjs.map +1 -1
  9. package/dist/chat_models/index.d.cts +0 -1
  10. package/dist/chat_models/index.d.ts +0 -1
  11. package/dist/chat_models/index.js.map +1 -1
  12. package/dist/chat_models/node.cjs +1 -1
  13. package/dist/chat_models/node.cjs.map +1 -1
  14. package/dist/chat_models/node.d.cts +1 -2
  15. package/dist/chat_models/node.d.ts +1 -2
  16. package/dist/chat_models/node.js +1 -1
  17. package/dist/chat_models/node.js.map +1 -1
  18. package/dist/chat_models/profiles.cjs.map +1 -1
  19. package/dist/chat_models/profiles.js.map +1 -1
  20. package/dist/chat_models/types.cjs.map +1 -1
  21. package/dist/chat_models/types.d.cts +1 -2
  22. package/dist/chat_models/types.d.ts +1 -2
  23. package/dist/chat_models/types.js.map +1 -1
  24. package/dist/clients/index.cjs +1 -0
  25. package/dist/clients/index.cjs.map +1 -1
  26. package/dist/clients/index.js +1 -0
  27. package/dist/clients/index.js.map +1 -1
  28. package/dist/clients/node.cjs +1 -0
  29. package/dist/clients/node.cjs.map +1 -1
  30. package/dist/clients/node.d.cts +0 -1
  31. package/dist/clients/node.d.ts +0 -1
  32. package/dist/clients/node.js +1 -0
  33. package/dist/clients/node.js.map +1 -1
  34. package/dist/const.cjs.map +1 -1
  35. package/dist/const.js.map +1 -1
  36. package/dist/converters/messages.cjs +2 -0
  37. package/dist/converters/messages.cjs.map +1 -1
  38. package/dist/converters/messages.js +1 -1
  39. package/dist/converters/messages.js.map +1 -1
  40. package/dist/converters/params.cjs +5 -0
  41. package/dist/converters/params.cjs.map +1 -1
  42. package/dist/converters/params.js +1 -1
  43. package/dist/converters/params.js.map +1 -1
  44. package/dist/converters/tools.cjs +1 -0
  45. package/dist/converters/tools.cjs.map +1 -1
  46. package/dist/converters/tools.js +1 -1
  47. package/dist/converters/tools.js.map +1 -1
  48. package/dist/node.cjs +1 -1
  49. package/dist/node.d.cts +2 -2
  50. package/dist/node.d.ts +2 -2
  51. package/dist/node.js +1 -1
  52. package/dist/utils/errors.cjs +27 -10
  53. package/dist/utils/errors.cjs.map +1 -1
  54. package/dist/utils/errors.js +28 -12
  55. package/dist/utils/errors.js.map +1 -1
  56. package/dist/utils/gcp-auth.cjs +2 -0
  57. package/dist/utils/gcp-auth.cjs.map +1 -1
  58. package/dist/utils/gcp-auth.js +1 -1
  59. package/dist/utils/gcp-auth.js.map +1 -1
  60. package/dist/utils/handler.cjs.map +1 -1
  61. package/dist/utils/handler.d.cts +0 -1
  62. package/dist/utils/handler.d.ts +0 -1
  63. package/dist/utils/handler.js.map +1 -1
  64. package/dist/utils/metadata.cjs.map +1 -1
  65. package/dist/utils/metadata.js.map +1 -1
  66. package/dist/utils/misc.cjs.map +1 -1
  67. package/dist/utils/misc.d.cts +1 -1
  68. package/dist/utils/misc.d.ts +1 -1
  69. package/dist/utils/misc.js.map +1 -1
  70. package/dist/utils/stream.cjs.map +1 -1
  71. package/dist/utils/stream.js.map +1 -1
  72. package/dist/utils/stream_events.cjs.map +1 -1
  73. package/dist/utils/stream_events.js.map +1 -1
  74. package/package.json +6 -6
@@ -1 +1 @@
1
- {"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;AACf,KAAI,CAAC,QAAS,QAAO,KAAA;AACrB,KAAI,CAAC,SAAU,QAAO;CACtB,MAAM,SAAS,EAAE;AACjB,MAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAiB;EACrD,MAAM,MAAM,QAAQ;EACpB,MAAM,OAAO,SAAS;AACtB,MAAI,QAAQ,KAAA,EACV,QAAO,OAAiB,OAAO,QAAQ;;AAG3C,QAAO;;;;;;;;;;;;;;;;;;;AAoBT,SAAgB,sBACd,SACA,UACe;AACf,KAAI,CAAC,SAAU,QAAO;AACtB,QAAO;EACL,cAAc,QAAQ,eAAe,SAAS;EAC9C,eAAe,QAAQ,gBAAgB,SAAS;EAChD,cAAc,QAAQ,eAAe,SAAS;EAC9C,qBAAqB,qBACnB,QAAQ,qBACR,SAAS,oBACV;EACD,sBAAsB,qBACpB,QAAQ,sBACR,SAAS,qBACV;EACF"}
1
+ {"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"metadata.js","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;AACf,KAAI,CAAC,QAAS,QAAO,KAAA;AACrB,KAAI,CAAC,SAAU,QAAO;CACtB,MAAM,SAAS,EAAE;AACjB,MAAK,MAAM,OAAO,OAAO,KAAK,QAAQ,EAAiB;EACrD,MAAM,MAAM,QAAQ;EACpB,MAAM,OAAO,SAAS;AACtB,MAAI,QAAQ,KAAA,EACV,QAAO,OAAiB,OAAO,QAAQ;;AAG3C,QAAO;;;;;;;;;;;;;;;;;;;AAoBT,SAAgB,sBACd,SACA,UACe;AACf,KAAI,CAAC,SAAU,QAAO;AACtB,QAAO;EACL,cAAc,QAAQ,eAAe,SAAS;EAC9C,eAAe,QAAQ,gBAAgB,SAAS;EAChD,cAAc,QAAQ,eAAe,SAAS;EAC9C,qBAAqB,qBACnB,QAAQ,qBACR,SAAS,oBACV;EACD,sBAAsB,qBACpB,QAAQ,sBACR,SAAS,qBACV;EACF"}
1
+ {"version":3,"file":"metadata.js","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"}
@@ -1 +1 @@
1
- {"version":3,"file":"misc.cjs","names":[],"sources":["../../src/utils/misc.ts"],"sourcesContent":["/**\n * Immediately invokes the provided function and returns its result.\n */\nexport const iife = <T>(fn: () => T): T => fn();\n\n/**\n * Type utility that recursively resolves object shape, removing type aliases,\n * intersections, and unions for easier type introspection and error output.\n *\n * Usage:\n * type Input = { a: string } & { b: number };\n * type Output = Prettify<Input>; // { a: string; b: number }\n */\nexport type Prettify<T> = T extends object\n ? { [K in keyof T]: Prettify<T[K]> }\n : T;\n\n/**\n * Distributes over a string union and applies Lowercase only to\n * string-literal members, filtering out wide `string` / `string & {}`.\n */\nexport type LowercaseLiteral<T> = T extends string\n ? string extends T\n ? never\n : Lowercase<T>\n : never;\n"],"mappings":";;;;AAGA,MAAa,QAAW,OAAmB,IAAI"}
1
+ {"version":3,"file":"misc.cjs","names":[],"sources":["../../src/utils/misc.ts"],"sourcesContent":["/**\n * Immediately invokes the provided function and returns its result.\n */\nexport const iife = <T>(fn: () => T): T => fn();\n\n/**\n * Type utility that recursively resolves object shape, removing type aliases,\n * intersections, and unions for easier type introspection and error output.\n *\n * Usage:\n * type Input = { a: string } & { b: number };\n * type Output = Prettify<Input>; // { a: string; b: number }\n */\nexport type Prettify<T> = T extends object\n ? { [K in keyof T]: Prettify<T[K]> }\n : T;\n\n/**\n * Distributes over a string union and applies Lowercase only to\n * string-literal members, filtering out wide `string` / `string & {}`.\n */\nexport type LowercaseLiteral<T> = T extends string\n ? string extends T\n ? never\n : Lowercase<T>\n : never;\n"],"mappings":";;;;AAGA,MAAa,QAAW,OAAmB,GAAG"}
@@ -7,7 +7,7 @@
7
7
  * type Input = { a: string } & { b: number };
8
8
  * type Output = Prettify<Input>; // { a: string; b: number }
9
9
  */
10
- type Prettify<T> = T extends object ? { [K in keyof T]: Prettify<T[K]> } : T;
10
+ type Prettify<T> = T extends object ? { [K in keyof T]: Prettify<T[K]>; } : T;
11
11
  /**
12
12
  * Distributes over a string union and applies Lowercase only to
13
13
  * string-literal members, filtering out wide `string` / `string & {}`.
@@ -7,7 +7,7 @@
7
7
  * type Input = { a: string } & { b: number };
8
8
  * type Output = Prettify<Input>; // { a: string; b: number }
9
9
  */
10
- type Prettify<T> = T extends object ? { [K in keyof T]: Prettify<T[K]> } : T;
10
+ type Prettify<T> = T extends object ? { [K in keyof T]: Prettify<T[K]>; } : T;
11
11
  /**
12
12
  * Distributes over a string union and applies Lowercase only to
13
13
  * string-literal members, filtering out wide `string` / `string & {}`.
@@ -1 +1 @@
1
- {"version":3,"file":"misc.js","names":[],"sources":["../../src/utils/misc.ts"],"sourcesContent":["/**\n * Immediately invokes the provided function and returns its result.\n */\nexport const iife = <T>(fn: () => T): T => fn();\n\n/**\n * Type utility that recursively resolves object shape, removing type aliases,\n * intersections, and unions for easier type introspection and error output.\n *\n * Usage:\n * type Input = { a: string } & { b: number };\n * type Output = Prettify<Input>; // { a: string; b: number }\n */\nexport type Prettify<T> = T extends object\n ? { [K in keyof T]: Prettify<T[K]> }\n : T;\n\n/**\n * Distributes over a string union and applies Lowercase only to\n * string-literal members, filtering out wide `string` / `string & {}`.\n */\nexport type LowercaseLiteral<T> = T extends string\n ? string extends T\n ? never\n : Lowercase<T>\n : never;\n"],"mappings":";;;;AAGA,MAAa,QAAW,OAAmB,IAAI"}
1
+ {"version":3,"file":"misc.js","names":[],"sources":["../../src/utils/misc.ts"],"sourcesContent":["/**\n * Immediately invokes the provided function and returns its result.\n */\nexport const iife = <T>(fn: () => T): T => fn();\n\n/**\n * Type utility that recursively resolves object shape, removing type aliases,\n * intersections, and unions for easier type introspection and error output.\n *\n * Usage:\n * type Input = { a: string } & { b: number };\n * type Output = Prettify<Input>; // { a: string; b: number }\n */\nexport type Prettify<T> = T extends object\n ? { [K in keyof T]: Prettify<T[K]> }\n : T;\n\n/**\n * Distributes over a string union and applies Lowercase only to\n * string-literal members, filtering out wide `string` / `string & {}`.\n */\nexport type LowercaseLiteral<T> = T extends string\n ? string extends T\n ? never\n : Lowercase<T>\n : never;\n"],"mappings":";;;;AAGA,MAAa,QAAW,OAAmB,GAAG"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream.cjs","names":[],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { EventSourceMessage } from \"eventsource-parser/stream\";\n\n/**\n * A transform stream that safely parses JSON from EventSource messages.\n *\n * This stream takes EventSourceMessage objects and attempts to parse the `data`\n * field as JSON. If parsing fails, it passes through the original message.\n */\nexport class SafeJsonEventParserStream<T> extends TransformStream<\n EventSourceMessage,\n T | null\n> {\n constructor() {\n super({\n transform(chunk, controller) {\n try {\n if (chunk.data) {\n const parsed = JSON.parse(chunk.data);\n controller.enqueue(parsed);\n } else {\n controller.enqueue(null);\n }\n } catch {\n // If parsing fails, enqueue null to indicate invalid JSON\n controller.enqueue(null);\n }\n },\n });\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,4BAAb,cAAkD,gBAGhD;CACA,cAAc;AACZ,QAAM,EACJ,UAAU,OAAO,YAAY;AAC3B,OAAI;AACF,QAAI,MAAM,MAAM;KACd,MAAM,SAAS,KAAK,MAAM,MAAM,KAAK;AACrC,gBAAW,QAAQ,OAAO;UAE1B,YAAW,QAAQ,KAAK;WAEpB;AAEN,eAAW,QAAQ,KAAK;;KAG7B,CAAC"}
1
+ {"version":3,"file":"stream.cjs","names":[],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { EventSourceMessage } from \"eventsource-parser/stream\";\n\n/**\n * A transform stream that safely parses JSON from EventSource messages.\n *\n * This stream takes EventSourceMessage objects and attempts to parse the `data`\n * field as JSON. If parsing fails, it passes through the original message.\n */\nexport class SafeJsonEventParserStream<T> extends TransformStream<\n EventSourceMessage,\n T | null\n> {\n constructor() {\n super({\n transform(chunk, controller) {\n try {\n if (chunk.data) {\n const parsed = JSON.parse(chunk.data);\n controller.enqueue(parsed);\n } else {\n controller.enqueue(null);\n }\n } catch {\n // If parsing fails, enqueue null to indicate invalid JSON\n controller.enqueue(null);\n }\n },\n });\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,4BAAb,cAAkD,gBAGhD;CACA,cAAc;EACZ,MAAM,EACJ,UAAU,OAAO,YAAY;GAC3B,IAAI;IACF,IAAI,MAAM,MAAM;KACd,MAAM,SAAS,KAAK,MAAM,MAAM,IAAI;KACpC,WAAW,QAAQ,MAAM;IAC3B,OACE,WAAW,QAAQ,IAAI;GAE3B,QAAQ;IAEN,WAAW,QAAQ,IAAI;GACzB;EACF,EACF,CAAC;CACH;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream.js","names":[],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { EventSourceMessage } from \"eventsource-parser/stream\";\n\n/**\n * A transform stream that safely parses JSON from EventSource messages.\n *\n * This stream takes EventSourceMessage objects and attempts to parse the `data`\n * field as JSON. If parsing fails, it passes through the original message.\n */\nexport class SafeJsonEventParserStream<T> extends TransformStream<\n EventSourceMessage,\n T | null\n> {\n constructor() {\n super({\n transform(chunk, controller) {\n try {\n if (chunk.data) {\n const parsed = JSON.parse(chunk.data);\n controller.enqueue(parsed);\n } else {\n controller.enqueue(null);\n }\n } catch {\n // If parsing fails, enqueue null to indicate invalid JSON\n controller.enqueue(null);\n }\n },\n });\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,4BAAb,cAAkD,gBAGhD;CACA,cAAc;AACZ,QAAM,EACJ,UAAU,OAAO,YAAY;AAC3B,OAAI;AACF,QAAI,MAAM,MAAM;KACd,MAAM,SAAS,KAAK,MAAM,MAAM,KAAK;AACrC,gBAAW,QAAQ,OAAO;UAE1B,YAAW,QAAQ,KAAK;WAEpB;AAEN,eAAW,QAAQ,KAAK;;KAG7B,CAAC"}
1
+ {"version":3,"file":"stream.js","names":[],"sources":["../../src/utils/stream.ts"],"sourcesContent":["import { EventSourceMessage } from \"eventsource-parser/stream\";\n\n/**\n * A transform stream that safely parses JSON from EventSource messages.\n *\n * This stream takes EventSourceMessage objects and attempts to parse the `data`\n * field as JSON. If parsing fails, it passes through the original message.\n */\nexport class SafeJsonEventParserStream<T> extends TransformStream<\n EventSourceMessage,\n T | null\n> {\n constructor() {\n super({\n transform(chunk, controller) {\n try {\n if (chunk.data) {\n const parsed = JSON.parse(chunk.data);\n controller.enqueue(parsed);\n } else {\n controller.enqueue(null);\n }\n } catch {\n // If parsing fails, enqueue null to indicate invalid JSON\n controller.enqueue(null);\n }\n },\n });\n }\n}\n"],"mappings":";;;;;;;AAQA,IAAa,4BAAb,cAAkD,gBAGhD;CACA,cAAc;EACZ,MAAM,EACJ,UAAU,OAAO,YAAY;GAC3B,IAAI;IACF,IAAI,MAAM,MAAM;KACd,MAAM,SAAS,KAAK,MAAM,MAAM,IAAI;KACpC,WAAW,QAAQ,MAAM;IAC3B,OACE,WAAW,QAAQ,IAAI;GAE3B,QAAQ;IAEN,WAAW,QAAQ,IAAI;GACzB;EACF,EACF,CAAC;CACH;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream_events.cjs","names":[],"sources":["../../src/utils/stream_events.ts"],"sourcesContent":["/**\n * Converts Gemini stream responses into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport type { Gemini } from \"../chat_models/api-types.js\";\n\nexport type GeminiStreamResponse = Gemini.GenerateContentResponse;\n\nexport interface ConvertGoogleGeminiStreamOptions {\n streamUsage?: boolean;\n}\n\ntype BlockKey = \"text\" | \"reasoning\" | `tool:${number}`;\n\nexport async function* convertGoogleGeminiStream(\n source: AsyncIterable<GeminiStreamResponse>,\n options: ConvertGoogleGeminiStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason = \"stop\";\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n for await (const response of source) {\n if (!messageStarted) {\n messageStarted = true;\n yield { event: \"message-start\" as const };\n }\n\n const usageMetadata = response.usageMetadata ?? response.usage_metadata;\n if (shouldStreamUsage && usageMetadata) {\n const input = usageMetadata.promptTokenCount ?? 0;\n const output = usageMetadata.candidatesTokenCount ?? 0;\n usageSnapshot = {\n input_tokens: input,\n output_tokens: output,\n total_tokens: usageMetadata.totalTokenCount ?? input + output,\n };\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n\n const candidate = response.candidates?.[0];\n if (candidate?.finishReason) {\n finishReason = mapGeminiFinishReason(candidate.finishReason);\n }\n\n const parts = candidate?.content?.parts;\n if (!parts) continue;\n\n let toolIdx = 0;\n for (const part of parts) {\n if (part.text) {\n if (part.thought) {\n const key: BlockKey = \"reasoning\";\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + part.text;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: part.text },\n };\n } else {\n const key: BlockKey = \"text\";\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + part.text;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: part.text },\n };\n }\n } else if (part.functionCall) {\n const key: BlockKey = `tool:${toolIdx}`;\n const args = JSON.stringify(part.functionCall.args ?? {});\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n name: part.functionCall.name,\n args: \"\",\n index: toolIdx,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n name: part.functionCall.name,\n args: \"\",\n index: toolIdx,\n } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n name: acc.name,\n args: acc.args,\n },\n },\n };\n toolIdx += 1;\n }\n }\n }\n\n for (const [index, acc] of blockAccumulators) {\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n responseMetadata: { model_provider: \"google\" },\n };\n}\n\nfunction mapGeminiFinishReason(reason: string): FinishReason {\n switch (reason.toLowerCase()) {\n case \"max_tokens\":\n case \"max-token\":\n case \"max_token\":\n return \"length\";\n case \"safety\":\n case \"recitation\":\n case \"language\":\n case \"blocklist\":\n case \"prohibited_content\":\n case \"prohibited-content\":\n case \"spii\":\n case \"image_safety\":\n case \"image-safety\":\n case \"image_prohibited_content\":\n case \"image-prohibited-content\":\n case \"image_recitation\":\n case \"image-recitation\":\n return \"content_filter\";\n default:\n return \"stop\";\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stream_events.cjs","names":[],"sources":["../../src/utils/stream_events.ts"],"sourcesContent":["/**\n * Converts Gemini stream responses into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport type { Gemini } from \"../chat_models/api-types.js\";\n\nexport type GeminiStreamResponse = Gemini.GenerateContentResponse;\n\nexport interface ConvertGoogleGeminiStreamOptions {\n streamUsage?: boolean;\n}\n\ntype BlockKey = \"text\" | \"reasoning\" | `tool:${number}`;\n\nexport async function* convertGoogleGeminiStream(\n source: AsyncIterable<GeminiStreamResponse>,\n options: ConvertGoogleGeminiStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason = \"stop\";\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n for await (const response of source) {\n if (!messageStarted) {\n messageStarted = true;\n yield { event: \"message-start\" as const };\n }\n\n const usageMetadata = response.usageMetadata ?? response.usage_metadata;\n if (shouldStreamUsage && usageMetadata) {\n const input = usageMetadata.promptTokenCount ?? 0;\n const output = usageMetadata.candidatesTokenCount ?? 0;\n usageSnapshot = {\n input_tokens: input,\n output_tokens: output,\n total_tokens: usageMetadata.totalTokenCount ?? input + output,\n };\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n\n const candidate = response.candidates?.[0];\n if (candidate?.finishReason) {\n finishReason = mapGeminiFinishReason(candidate.finishReason);\n }\n\n const parts = candidate?.content?.parts;\n if (!parts) continue;\n\n let toolIdx = 0;\n for (const part of parts) {\n if (part.text) {\n if (part.thought) {\n const key: BlockKey = \"reasoning\";\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + part.text;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: part.text },\n };\n } else {\n const key: BlockKey = \"text\";\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + part.text;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: part.text },\n };\n }\n } else if (part.functionCall) {\n const key: BlockKey = `tool:${toolIdx}`;\n const args = JSON.stringify(part.functionCall.args ?? {});\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n name: part.functionCall.name,\n args: \"\",\n index: toolIdx,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n name: part.functionCall.name,\n args: \"\",\n index: toolIdx,\n } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n name: acc.name,\n args: acc.args,\n },\n },\n };\n toolIdx += 1;\n }\n }\n }\n\n for (const [index, acc] of blockAccumulators) {\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n responseMetadata: { model_provider: \"google\" },\n };\n}\n\nfunction mapGeminiFinishReason(reason: string): FinishReason {\n switch (reason.toLowerCase()) {\n case \"max_tokens\":\n case \"max-token\":\n case \"max_token\":\n return \"length\";\n case \"safety\":\n case \"recitation\":\n case \"language\":\n case \"blocklist\":\n case \"prohibited_content\":\n case \"prohibited-content\":\n case \"spii\":\n case \"image_safety\":\n case \"image-safety\":\n case \"image_prohibited_content\":\n case \"image-prohibited-content\":\n case \"image_recitation\":\n case \"image-recitation\":\n return \"content_filter\";\n default:\n return \"stop\";\n }\n}\n"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"stream_events.js","names":[],"sources":["../../src/utils/stream_events.ts"],"sourcesContent":["/**\n * Converts Gemini stream responses into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport type { Gemini } from \"../chat_models/api-types.js\";\n\nexport type GeminiStreamResponse = Gemini.GenerateContentResponse;\n\nexport interface ConvertGoogleGeminiStreamOptions {\n streamUsage?: boolean;\n}\n\ntype BlockKey = \"text\" | \"reasoning\" | `tool:${number}`;\n\nexport async function* convertGoogleGeminiStream(\n source: AsyncIterable<GeminiStreamResponse>,\n options: ConvertGoogleGeminiStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason = \"stop\";\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n for await (const response of source) {\n if (!messageStarted) {\n messageStarted = true;\n yield { event: \"message-start\" as const };\n }\n\n const usageMetadata = response.usageMetadata ?? response.usage_metadata;\n if (shouldStreamUsage && usageMetadata) {\n const input = usageMetadata.promptTokenCount ?? 0;\n const output = usageMetadata.candidatesTokenCount ?? 0;\n usageSnapshot = {\n input_tokens: input,\n output_tokens: output,\n total_tokens: usageMetadata.totalTokenCount ?? input + output,\n };\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n\n const candidate = response.candidates?.[0];\n if (candidate?.finishReason) {\n finishReason = mapGeminiFinishReason(candidate.finishReason);\n }\n\n const parts = candidate?.content?.parts;\n if (!parts) continue;\n\n let toolIdx = 0;\n for (const part of parts) {\n if (part.text) {\n if (part.thought) {\n const key: BlockKey = \"reasoning\";\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + part.text;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: part.text },\n };\n } else {\n const key: BlockKey = \"text\";\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + part.text;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: part.text },\n };\n }\n } else if (part.functionCall) {\n const key: BlockKey = `tool:${toolIdx}`;\n const args = JSON.stringify(part.functionCall.args ?? {});\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n name: part.functionCall.name,\n args: \"\",\n index: toolIdx,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n name: part.functionCall.name,\n args: \"\",\n index: toolIdx,\n } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n name: acc.name,\n args: acc.args,\n },\n },\n };\n toolIdx += 1;\n }\n }\n }\n\n for (const [index, acc] of blockAccumulators) {\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n responseMetadata: { model_provider: \"google\" },\n };\n}\n\nfunction mapGeminiFinishReason(reason: string): FinishReason {\n switch (reason.toLowerCase()) {\n case \"max_tokens\":\n case \"max-token\":\n case \"max_token\":\n return \"length\";\n case \"safety\":\n case \"recitation\":\n case \"language\":\n case \"blocklist\":\n case \"prohibited_content\":\n case \"prohibited-content\":\n case \"spii\":\n case \"image_safety\":\n case \"image-safety\":\n case \"image_prohibited_content\":\n case \"image-prohibited-content\":\n case \"image_recitation\":\n case \"image-recitation\":\n return \"content_filter\";\n default:\n return \"stop\";\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"stream_events.js","names":[],"sources":["../../src/utils/stream_events.ts"],"sourcesContent":["/**\n * Converts Gemini stream responses into LangChain ChatModelStreamEvents.\n *\n * @module\n */\n\nimport { finalizeContentBlock } from \"@langchain/core/language_models/compat\";\nimport type {\n ChatModelStreamEvent,\n FinishReason,\n} from \"@langchain/core/language_models/event\";\nimport type { ContentBlock, UsageMetadata } from \"@langchain/core/messages\";\nimport type { Gemini } from \"../chat_models/api-types.js\";\n\nexport type GeminiStreamResponse = Gemini.GenerateContentResponse;\n\nexport interface ConvertGoogleGeminiStreamOptions {\n streamUsage?: boolean;\n}\n\ntype BlockKey = \"text\" | \"reasoning\" | `tool:${number}`;\n\nexport async function* convertGoogleGeminiStream(\n source: AsyncIterable<GeminiStreamResponse>,\n options: ConvertGoogleGeminiStreamOptions = {}\n): AsyncGenerator<ChatModelStreamEvent> {\n const shouldStreamUsage = options.streamUsage ?? true;\n const blockAccumulators = new Map<\n number,\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n Record<string, any>\n >();\n const blockKeyToIndex = new Map<BlockKey, number>();\n let nextBlockIndex = 0;\n let messageStarted = false;\n let usageSnapshot: UsageMetadata | undefined;\n let finishReason: FinishReason = \"stop\";\n\n const getOrCreateBlockIndex = (\n key: BlockKey,\n initial: Record<string, unknown>\n ): { index: number; isNew: boolean } => {\n const existing = blockKeyToIndex.get(key);\n if (existing !== undefined) {\n return { index: existing, isNew: false };\n }\n const index = nextBlockIndex++;\n blockKeyToIndex.set(key, index);\n blockAccumulators.set(index, { ...initial });\n return { index, isNew: true };\n };\n\n for await (const response of source) {\n if (!messageStarted) {\n messageStarted = true;\n yield { event: \"message-start\" as const };\n }\n\n const usageMetadata = response.usageMetadata ?? response.usage_metadata;\n if (shouldStreamUsage && usageMetadata) {\n const input = usageMetadata.promptTokenCount ?? 0;\n const output = usageMetadata.candidatesTokenCount ?? 0;\n usageSnapshot = {\n input_tokens: input,\n output_tokens: output,\n total_tokens: usageMetadata.totalTokenCount ?? input + output,\n };\n yield { event: \"usage\" as const, usage: usageSnapshot };\n }\n\n const candidate = response.candidates?.[0];\n if (candidate?.finishReason) {\n finishReason = mapGeminiFinishReason(candidate.finishReason);\n }\n\n const parts = candidate?.content?.parts;\n if (!parts) continue;\n\n let toolIdx = 0;\n for (const part of parts) {\n if (part.text) {\n if (part.thought) {\n const key: BlockKey = \"reasoning\";\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"reasoning\",\n reasoning: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"reasoning\", reasoning: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.reasoning = (acc.reasoning ?? \"\") + part.text;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"reasoning-delta\" as const, reasoning: part.text },\n };\n } else {\n const key: BlockKey = \"text\";\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"text\",\n text: \"\",\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: { type: \"text\", text: \"\" } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.text = (acc.text ?? \"\") + part.text;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: { type: \"text-delta\" as const, text: part.text },\n };\n }\n } else if (part.functionCall) {\n const key: BlockKey = `tool:${toolIdx}`;\n const args = JSON.stringify(part.functionCall.args ?? {});\n const { index, isNew } = getOrCreateBlockIndex(key, {\n type: \"tool_call_chunk\",\n name: part.functionCall.name,\n args: \"\",\n index: toolIdx,\n });\n if (isNew) {\n yield {\n event: \"content-block-start\" as const,\n index,\n content: {\n type: \"tool_call_chunk\",\n name: part.functionCall.name,\n args: \"\",\n index: toolIdx,\n } as ContentBlock,\n };\n }\n const acc = blockAccumulators.get(index)!;\n acc.args = args;\n yield {\n event: \"content-block-delta\" as const,\n index,\n delta: {\n type: \"block-delta\" as const,\n fields: {\n type: \"tool_call_chunk\",\n name: acc.name,\n args: acc.args,\n },\n },\n };\n toolIdx += 1;\n }\n }\n }\n\n for (const [index, acc] of blockAccumulators) {\n yield {\n event: \"content-block-finish\" as const,\n index,\n content: finalizeContentBlock(acc as ContentBlock),\n };\n }\n\n yield {\n event: \"message-finish\" as const,\n reason: finishReason,\n ...(usageSnapshot ? { usage: usageSnapshot } : {}),\n responseMetadata: { model_provider: \"google\" },\n };\n}\n\nfunction mapGeminiFinishReason(reason: string): FinishReason {\n switch (reason.toLowerCase()) {\n case \"max_tokens\":\n case \"max-token\":\n case \"max_token\":\n return \"length\";\n case \"safety\":\n case \"recitation\":\n case \"language\":\n case \"blocklist\":\n case \"prohibited_content\":\n case \"prohibited-content\":\n case \"spii\":\n case \"image_safety\":\n case \"image-safety\":\n case \"image_prohibited_content\":\n case \"image-prohibited-content\":\n case \"image_recitation\":\n case \"image-recitation\":\n return \"content_filter\";\n default:\n return \"stop\";\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@langchain/google",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Google integrations for LangChain.js",
5
5
  "author": "LangChain",
6
6
  "license": "MIT",
@@ -15,21 +15,21 @@
15
15
  },
16
16
  "dependencies": {
17
17
  "eventsource-parser": "^3.1.0",
18
- "google-auth-library": "^10.6.2",
19
- "jose": "^6.2.3"
18
+ "google-auth-library": "^10.9.1",
19
+ "jose": "^6.2.4"
20
20
  },
21
21
  "peerDependencies": {
22
- "@langchain/core": "^1.0.0"
22
+ "@langchain/core": "^1.2.8"
23
23
  },
24
24
  "devDependencies": {
25
25
  "@tsconfig/recommended": "^1.0.10",
26
26
  "dpdm": "^3.14.0",
27
27
  "sparktype": "^0.1.3",
28
- "typescript": "~6.0.3",
28
+ "typescript": "~7.0.2",
29
29
  "vitest": "^4.1.8",
30
30
  "zod": "^3.25.76 || ^4",
31
31
  "zod-to-json-schema": "^3.25.2",
32
- "@langchain/core": "^1.2.0",
32
+ "@langchain/core": "^1.2.8",
33
33
  "@langchain/standard-tests": "0.0.23"
34
34
  },
35
35
  "publishConfig": {