@langchain/google-common 2.1.30 → 2.2.0

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 (59) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/README.md +2 -7
  3. package/dist/auth.cjs.map +1 -1
  4. package/dist/auth.js.map +1 -1
  5. package/dist/chat_models.cjs +21 -11
  6. package/dist/chat_models.cjs.map +1 -1
  7. package/dist/chat_models.d.cts +2 -0
  8. package/dist/chat_models.d.cts.map +1 -1
  9. package/dist/chat_models.d.ts +2 -0
  10. package/dist/chat_models.d.ts.map +1 -1
  11. package/dist/chat_models.js +21 -11
  12. package/dist/chat_models.js.map +1 -1
  13. package/dist/connection.cjs.map +1 -1
  14. package/dist/connection.js.map +1 -1
  15. package/dist/embeddings.cjs.map +1 -1
  16. package/dist/embeddings.js.map +1 -1
  17. package/dist/experimental/media.cjs.map +1 -1
  18. package/dist/experimental/media.js.map +1 -1
  19. package/dist/experimental/utils/media_core.cjs.map +1 -1
  20. package/dist/experimental/utils/media_core.js.map +1 -1
  21. package/dist/index.cjs +2 -0
  22. package/dist/index.d.cts +2 -1
  23. package/dist/index.d.ts +2 -1
  24. package/dist/index.js +2 -1
  25. package/dist/llms.cjs +1 -1
  26. package/dist/llms.cjs.map +1 -1
  27. package/dist/llms.js +1 -1
  28. package/dist/llms.js.map +1 -1
  29. package/dist/output_parsers.cjs.map +1 -1
  30. package/dist/output_parsers.js.map +1 -1
  31. package/dist/types.cjs.map +1 -1
  32. package/dist/types.d.cts +9 -2
  33. package/dist/types.d.cts.map +1 -1
  34. package/dist/types.d.ts +9 -2
  35. package/dist/types.d.ts.map +1 -1
  36. package/dist/types.js.map +1 -1
  37. package/dist/utils/anthropic.cjs.map +1 -1
  38. package/dist/utils/anthropic.js.map +1 -1
  39. package/dist/utils/common.cjs.map +1 -1
  40. package/dist/utils/common.js.map +1 -1
  41. package/dist/utils/gemini.cjs +31 -8
  42. package/dist/utils/gemini.cjs.map +1 -1
  43. package/dist/utils/gemini.d.cts.map +1 -1
  44. package/dist/utils/gemini.d.ts.map +1 -1
  45. package/dist/utils/gemini.js +31 -8
  46. package/dist/utils/gemini.js.map +1 -1
  47. package/dist/utils/stream.cjs.map +1 -1
  48. package/dist/utils/stream.js.map +1 -1
  49. package/dist/utils/stream_events.cjs +173 -0
  50. package/dist/utils/stream_events.cjs.map +1 -0
  51. package/dist/utils/stream_events.d.cts +11 -0
  52. package/dist/utils/stream_events.d.cts.map +1 -0
  53. package/dist/utils/stream_events.d.ts +11 -0
  54. package/dist/utils/stream_events.d.ts.map +1 -0
  55. package/dist/utils/stream_events.js +173 -0
  56. package/dist/utils/stream_events.js.map +1 -0
  57. package/dist/utils/zod_to_gemini_parameters.cjs.map +1 -1
  58. package/dist/utils/zod_to_gemini_parameters.js.map +1 -1
  59. package/package.json +5 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,27 @@
1
1
  # @langchain/google-common
2
2
 
3
+ ## 2.2.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#10924](https://github.com/langchain-ai/langchainjs/pull/10924) [`2e28115`](https://github.com/langchain-ai/langchainjs/commit/2e2811509d75af94f57cedcc3842f178f4c020d1) Thanks [@christian-bromann](https://github.com/christian-bromann)! - feat(google-common): add native Gemini streamEvents event conversion
8
+
9
+ ### Patch Changes
10
+
11
+ - [#10676](https://github.com/langchain-ai/langchainjs/pull/10676) [`de0958c`](https://github.com/langchain-ai/langchainjs/commit/de0958cdb1b2e31868b038ce48e149ebe7151ba7) Thanks [@jackjin1997](https://github.com/jackjin1997)! - Auto-set `toolConfig.includeServerSideToolInvocations` when a Gemini request mixes server-side built-in tools (e.g. `googleSearch`, `codeExecution`) with function declarations. The Gemini API requires this flag in that case and returns HTTP 400 without it.
12
+
13
+ - [#10547](https://github.com/langchain-ai/langchainjs/pull/10547) [`3aff161`](https://github.com/langchain-ai/langchainjs/commit/3aff161e1ca9cc7e92277ad071e372e5b55a0c6e) Thanks [@alex-levkivskiy](https://github.com/alex-levkivskiy)! - fix(google-common): add Array.isArray guard in toolMessageToContent to prevent crash on plain object ToolMessage content
14
+
15
+ ## 2.1.31
16
+
17
+ ### Patch Changes
18
+
19
+ - [#10872](https://github.com/langchain-ai/langchainjs/pull/10872) [`a640079`](https://github.com/langchain-ai/langchainjs/commit/a64007997a4940f51bba3c1c83dae89d1ccfb692) Thanks [@hntrl](https://github.com/hntrl)! - chore(deps): remove redundant @types/uuid declarations
20
+
21
+ Remove `@types/uuid` from package manifests that rely on `@langchain/core/utils/uuid` or do not require uuid type stubs directly, and refresh the lockfile entries accordingly.
22
+
23
+ - [#9912](https://github.com/langchain-ai/langchainjs/pull/9912) [`7be1da4`](https://github.com/langchain-ai/langchainjs/commit/7be1da46ee1a2920b08212aeeed34dec57590d62) Thanks [@yukukotani](https://github.com/yukukotani)! - fix missing stream usage metadata on Gemini
24
+
3
25
  ## 2.1.30
4
26
 
5
27
  ### Patch Changes
package/README.md CHANGED
@@ -42,14 +42,10 @@ When using tools or functions with Gemini models, the following Zod schema featu
42
42
 
43
43
  For detailed examples and workarounds, see the Tool Schema Limitations section in the @langchain/google-vertexai or @langchain/google-genai package documentation.
44
44
 
45
- ## TODO
45
+ ## Planned Features
46
46
 
47
- Tasks and services still to be implemented:
47
+ Tasks and services that may be implemented in the future:
48
48
 
49
- - PaLM Vertex AI support and backwards compatibility
50
- - PaLM MakerSuite support and backwards compatibility
51
- - Semantic Retrieval / AQA model
52
- - PaLM embeddings
53
49
  - Gemini embeddings
54
50
  - Multimodal embeddings
55
51
  - Vertex AI Search
@@ -59,5 +55,4 @@ Tasks and services still to be implemented:
59
55
  - Google managed models
60
56
  - Claude
61
57
  - AI Studio Tuned Models
62
- - MakerSuite / Google Drive Hub
63
58
  - Google Cloud Vector Store
package/dist/auth.cjs.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.cjs","names":["ReadableJsonStream"],"sources":["../src/auth.ts"],"sourcesContent":["import { ReadableJsonStream } from \"./utils/stream.js\";\nimport { GooglePlatformType } from \"./types.js\";\n\nexport type GoogleAbstractedClientOpsMethod = \"GET\" | \"POST\" | \"DELETE\";\n\nexport type GoogleAbstractedClientOpsResponseType = \"json\" | \"stream\" | \"blob\";\n\nexport type GoogleAbstractedClientOps = {\n url?: string;\n method?: GoogleAbstractedClientOpsMethod;\n headers?: Record<string, string>;\n data?: unknown;\n responseType?: GoogleAbstractedClientOpsResponseType;\n signal?: AbortSignal;\n};\n\nexport interface GoogleAbstractedClient {\n request: (opts: GoogleAbstractedClientOps) => unknown;\n getProjectId: () => Promise<string>;\n get clientType(): string;\n}\n\nexport abstract class GoogleAbstractedFetchClient implements GoogleAbstractedClient {\n abstract get clientType(): string;\n\n abstract getProjectId(): Promise<string>;\n\n abstract request(opts: GoogleAbstractedClientOps): unknown;\n\n _fetch: typeof fetch = fetch;\n\n async _buildData(res: Response, opts: GoogleAbstractedClientOps) {\n switch (opts.responseType) {\n case \"json\":\n return res.json();\n case \"stream\":\n return new ReadableJsonStream(res.body);\n default:\n return res.blob();\n }\n }\n\n /**\n * Build and throw a standardised Google request error.\n * Both the `!res.ok` path (native fetch) and the catch path (gaxios)\n * funnel through here so the caller always sees the same shape.\n */\n protected _throwRequestError(\n status: number,\n body: string | undefined,\n response: unknown,\n context: {\n url: string;\n opts: GoogleAbstractedClientOps;\n fetchOptions?: Record<string, unknown>;\n }\n ): never {\n const message = body\n ? `Google request failed with status code ${status}: ${body}`\n : `Google request failed with status code ${status}`;\n const error = new Error(message);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).response = response;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).details = context;\n throw error;\n }\n\n async _request(\n url: string | undefined,\n opts: GoogleAbstractedClientOps,\n additionalHeaders: Record<string, string>\n ) {\n if (url == null) throw new Error(\"Missing URL\");\n const fetchOptions: {\n method?: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n } = {\n method: opts.method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(opts.headers ?? {}),\n ...(additionalHeaders ?? {}),\n },\n signal: opts.signal,\n };\n if (opts.data !== undefined) {\n if (typeof opts.data === \"string\") {\n fetchOptions.body = opts.data;\n } else {\n fetchOptions.body = JSON.stringify(opts.data);\n }\n }\n\n const context = { url, opts, fetchOptions };\n\n let res: Response;\n try {\n res = await this._fetch(url, fetchOptions);\n } catch (fetchError) {\n // The _fetch implementation (e.g. GAuthClient using google-auth-library)\n // may throw its own error (e.g. GaxiosError) for non-2xx responses\n // before we can handle them here. Extract what we can from the error\n // and re-throw with a useful, formatted message.\n /* oxlint-disable @typescript-eslint/no-explicit-any */\n const err = fetchError as any;\n const status = err?.response?.status ?? err?.status;\n\n if (status != null) {\n let body: string | undefined;\n\n if (err?.response?.data != null) {\n if (typeof err.response.data === \"string\") {\n body = err.response.data;\n } else if (typeof err.response.data === \"object\") {\n try {\n body = JSON.stringify(err.response.data);\n } catch {\n // best effort\n }\n }\n }\n\n this._throwRequestError(\n status,\n body,\n err?.response ?? { status },\n context\n );\n }\n\n // No status info available — re-throw the original error as-is\n throw fetchError;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n\n if (!res.ok) {\n const body = await res.text();\n this._throwRequestError(res.status, body, res, context);\n }\n\n const data = await this._buildData(res, opts);\n return {\n data,\n config: {},\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n request: { responseURL: res.url },\n };\n }\n}\n\nexport class ApiKeyGoogleAuth extends GoogleAbstractedFetchClient {\n apiKey: string;\n\n constructor(apiKey: string) {\n super();\n this.apiKey = apiKey;\n }\n\n get clientType(): string {\n return \"apiKey\";\n }\n\n getProjectId(): Promise<string> {\n throw new Error(\"APIs that require a project ID cannot use an API key\");\n // Perhaps we could implement this if needed:\n // https://cloud.google.com/docs/authentication/api-keys#get-info\n }\n\n request(opts: GoogleAbstractedClientOps): unknown {\n const authHeader = {\n \"X-Goog-Api-Key\": this.apiKey,\n };\n return this._request(opts.url, opts, authHeader);\n }\n}\n\nexport function aiPlatformScope(platform: GooglePlatformType): string[] {\n switch (platform) {\n case \"gai\":\n return [\"https://www.googleapis.com/auth/generative-language\"];\n default:\n return [\"https://www.googleapis.com/auth/cloud-platform\"];\n }\n}\n\nexport function ensureAuthOptionScopes<AuthOptions>(\n authOption: AuthOptions | undefined,\n scopeProperty: string,\n scopesOrPlatform: string[] | GooglePlatformType | undefined\n): AuthOptions {\n // If the property is already set, return it\n if (authOption && Object.hasOwn(authOption, scopeProperty)) {\n return authOption;\n }\n\n // Otherwise add it\n const scopes: string[] = Array.isArray(scopesOrPlatform)\n ? (scopesOrPlatform as string[])\n : aiPlatformScope(scopesOrPlatform ?? \"gcp\");\n return {\n [scopeProperty]: scopes,\n ...(authOption ?? {}),\n } as AuthOptions;\n}\n"],"mappings":";;AAsBA,IAAsB,8BAAtB,MAAoF;CAOlF,SAAuB;CAEvB,MAAM,WAAW,KAAe,MAAiC;AAC/D,UAAQ,KAAK,cAAb;GACE,KAAK,OACH,QAAO,IAAI,MAAM;GACnB,KAAK,SACH,QAAO,IAAIA,eAAAA,mBAAmB,IAAI,KAAK;GACzC,QACE,QAAO,IAAI,MAAM;;;;;;;;CASvB,mBACE,QACA,MACA,UACA,SAKO;EACP,MAAM,UAAU,OACZ,0CAA0C,OAAO,IAAI,SACrD,0CAA0C;EAC9C,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAE/B,QAAc,WAAW;AAEzB,QAAc,UAAU;AACzB,QAAM;;CAGR,MAAM,SACJ,KACA,MACA,mBACA;AACA,MAAI,OAAO,KAAM,OAAM,IAAI,MAAM,cAAc;EAC/C,MAAM,eAKF;GACF,QAAQ,KAAK;GACb,SAAS;IACP,gBAAgB;IAChB,GAAI,KAAK,WAAW,EAAE;IACtB,GAAI,qBAAqB,EAAE;IAC5B;GACD,QAAQ,KAAK;GACd;AACD,MAAI,KAAK,SAAS,KAAA,EAChB,KAAI,OAAO,KAAK,SAAS,SACvB,cAAa,OAAO,KAAK;MAEzB,cAAa,OAAO,KAAK,UAAU,KAAK,KAAK;EAIjD,MAAM,UAAU;GAAE;GAAK;GAAM;GAAc;EAE3C,IAAI;AACJ,MAAI;AACF,SAAM,MAAM,KAAK,OAAO,KAAK,aAAa;WACnC,YAAY;GAMnB,MAAM,MAAM;GACZ,MAAM,SAAS,KAAK,UAAU,UAAU,KAAK;AAE7C,OAAI,UAAU,MAAM;IAClB,IAAI;AAEJ,QAAI,KAAK,UAAU,QAAQ;SACrB,OAAO,IAAI,SAAS,SAAS,SAC/B,QAAO,IAAI,SAAS;cACX,OAAO,IAAI,SAAS,SAAS,SACtC,KAAI;AACF,aAAO,KAAK,UAAU,IAAI,SAAS,KAAK;aAClC;;AAMZ,SAAK,mBACH,QACA,MACA,KAAK,YAAY,EAAE,QAAQ,EAC3B,QACD;;AAIH,SAAM;;AAIR,MAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,MAAM;AAC7B,QAAK,mBAAmB,IAAI,QAAQ,MAAM,KAAK,QAAQ;;AAIzD,SAAO;GACL,MAFW,MAAM,KAAK,WAAW,KAAK,KAAK;GAG3C,QAAQ,EAAE;GACV,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,SAAS,EAAE,aAAa,IAAI,KAAK;GAClC;;;AAIL,IAAa,mBAAb,cAAsC,4BAA4B;CAChE;CAEA,YAAY,QAAgB;AAC1B,SAAO;AACP,OAAK,SAAS;;CAGhB,IAAI,aAAqB;AACvB,SAAO;;CAGT,eAAgC;AAC9B,QAAM,IAAI,MAAM,uDAAuD;;CAKzE,QAAQ,MAA0C;EAChD,MAAM,aAAa,EACjB,kBAAkB,KAAK,QACxB;AACD,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,WAAW;;;AAIpD,SAAgB,gBAAgB,UAAwC;AACtE,SAAQ,UAAR;EACE,KAAK,MACH,QAAO,CAAC,sDAAsD;EAChE,QACE,QAAO,CAAC,iDAAiD;;;AAI/D,SAAgB,uBACd,YACA,eACA,kBACa;AAEb,KAAI,cAAc,OAAO,OAAO,YAAY,cAAc,CACxD,QAAO;CAIT,MAAM,SAAmB,MAAM,QAAQ,iBAAiB,GACnD,mBACD,gBAAgB,oBAAoB,MAAM;AAC9C,QAAO;GACJ,gBAAgB;EACjB,GAAI,cAAc,EAAE;EACrB"}
1
+ {"version":3,"file":"auth.cjs","names":["ReadableJsonStream"],"sources":["../src/auth.ts"],"sourcesContent":["import { ReadableJsonStream } from \"./utils/stream.js\";\nimport { GooglePlatformType } from \"./types.js\";\n\nexport type GoogleAbstractedClientOpsMethod = \"GET\" | \"POST\" | \"DELETE\";\n\nexport type GoogleAbstractedClientOpsResponseType = \"json\" | \"stream\" | \"blob\";\n\nexport type GoogleAbstractedClientOps = {\n url?: string;\n method?: GoogleAbstractedClientOpsMethod;\n headers?: Record<string, string>;\n data?: unknown;\n responseType?: GoogleAbstractedClientOpsResponseType;\n signal?: AbortSignal;\n};\n\nexport interface GoogleAbstractedClient {\n request: (opts: GoogleAbstractedClientOps) => unknown;\n getProjectId: () => Promise<string>;\n get clientType(): string;\n}\n\nexport abstract class GoogleAbstractedFetchClient implements GoogleAbstractedClient {\n abstract get clientType(): string;\n\n abstract getProjectId(): Promise<string>;\n\n abstract request(opts: GoogleAbstractedClientOps): unknown;\n\n _fetch: typeof fetch = fetch;\n\n async _buildData(res: Response, opts: GoogleAbstractedClientOps) {\n switch (opts.responseType) {\n case \"json\":\n return res.json();\n case \"stream\":\n return new ReadableJsonStream(res.body);\n default:\n return res.blob();\n }\n }\n\n /**\n * Build and throw a standardised Google request error.\n * Both the `!res.ok` path (native fetch) and the catch path (gaxios)\n * funnel through here so the caller always sees the same shape.\n */\n protected _throwRequestError(\n status: number,\n body: string | undefined,\n response: unknown,\n context: {\n url: string;\n opts: GoogleAbstractedClientOps;\n fetchOptions?: Record<string, unknown>;\n }\n ): never {\n const message = body\n ? `Google request failed with status code ${status}: ${body}`\n : `Google request failed with status code ${status}`;\n const error = new Error(message);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).response = response;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).details = context;\n throw error;\n }\n\n async _request(\n url: string | undefined,\n opts: GoogleAbstractedClientOps,\n additionalHeaders: Record<string, string>\n ) {\n if (url == null) throw new Error(\"Missing URL\");\n const fetchOptions: {\n method?: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n } = {\n method: opts.method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(opts.headers ?? {}),\n ...(additionalHeaders ?? {}),\n },\n signal: opts.signal,\n };\n if (opts.data !== undefined) {\n if (typeof opts.data === \"string\") {\n fetchOptions.body = opts.data;\n } else {\n fetchOptions.body = JSON.stringify(opts.data);\n }\n }\n\n const context = { url, opts, fetchOptions };\n\n let res: Response;\n try {\n res = await this._fetch(url, fetchOptions);\n } catch (fetchError) {\n // The _fetch implementation (e.g. GAuthClient using google-auth-library)\n // may throw its own error (e.g. GaxiosError) for non-2xx responses\n // before we can handle them here. Extract what we can from the error\n // and re-throw with a useful, formatted message.\n /* oxlint-disable @typescript-eslint/no-explicit-any */\n const err = fetchError as any;\n const status = err?.response?.status ?? err?.status;\n\n if (status != null) {\n let body: string | undefined;\n\n if (err?.response?.data != null) {\n if (typeof err.response.data === \"string\") {\n body = err.response.data;\n } else if (typeof err.response.data === \"object\") {\n try {\n body = JSON.stringify(err.response.data);\n } catch {\n // best effort\n }\n }\n }\n\n this._throwRequestError(\n status,\n body,\n err?.response ?? { status },\n context\n );\n }\n\n // No status info available — re-throw the original error as-is\n throw fetchError;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n\n if (!res.ok) {\n const body = await res.text();\n this._throwRequestError(res.status, body, res, context);\n }\n\n const data = await this._buildData(res, opts);\n return {\n data,\n config: {},\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n request: { responseURL: res.url },\n };\n }\n}\n\nexport class ApiKeyGoogleAuth extends GoogleAbstractedFetchClient {\n apiKey: string;\n\n constructor(apiKey: string) {\n super();\n this.apiKey = apiKey;\n }\n\n get clientType(): string {\n return \"apiKey\";\n }\n\n getProjectId(): Promise<string> {\n throw new Error(\"APIs that require a project ID cannot use an API key\");\n // Perhaps we could implement this if needed:\n // https://cloud.google.com/docs/authentication/api-keys#get-info\n }\n\n request(opts: GoogleAbstractedClientOps): unknown {\n const authHeader = {\n \"X-Goog-Api-Key\": this.apiKey,\n };\n return this._request(opts.url, opts, authHeader);\n }\n}\n\nexport function aiPlatformScope(platform: GooglePlatformType): string[] {\n switch (platform) {\n case \"gai\":\n return [\"https://www.googleapis.com/auth/generative-language\"];\n default:\n return [\"https://www.googleapis.com/auth/cloud-platform\"];\n }\n}\n\nexport function ensureAuthOptionScopes<AuthOptions>(\n authOption: AuthOptions | undefined,\n scopeProperty: string,\n scopesOrPlatform: string[] | GooglePlatformType | undefined\n): AuthOptions {\n // If the property is already set, return it\n if (authOption && Object.hasOwn(authOption, scopeProperty)) {\n return authOption;\n }\n\n // Otherwise add it\n const scopes: string[] = Array.isArray(scopesOrPlatform)\n ? (scopesOrPlatform as string[])\n : aiPlatformScope(scopesOrPlatform ?? \"gcp\");\n return {\n [scopeProperty]: scopes,\n ...(authOption ?? {}),\n } as AuthOptions;\n}\n"],"mappings":";;AAsBA,IAAsB,8BAAtB,MAAoF;CAOlF,SAAuB;CAEvB,MAAM,WAAW,KAAe,MAAiC;AAC/D,UAAQ,KAAK,cAAb;GACE,KAAK,OACH,QAAO,IAAI,MAAM;GACnB,KAAK,SACH,QAAO,IAAIA,eAAAA,mBAAmB,IAAI,KAAK;GACzC,QACE,QAAO,IAAI,MAAM;;;;;;;;CASvB,mBACE,QACA,MACA,UACA,SAKO;EACP,MAAM,UAAU,OACZ,0CAA0C,OAAO,IAAI,SACrD,0CAA0C;EAC9C,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAE/B,QAAc,WAAW;AAEzB,QAAc,UAAU;AACzB,QAAM;;CAGR,MAAM,SACJ,KACA,MACA,mBACA;AACA,MAAI,OAAO,KAAM,OAAM,IAAI,MAAM,cAAc;EAC/C,MAAM,eAKF;GACF,QAAQ,KAAK;GACb,SAAS;IACP,gBAAgB;IAChB,GAAI,KAAK,WAAW,EAAE;IACtB,GAAI,qBAAqB,EAAE;IAC5B;GACD,QAAQ,KAAK;GACd;AACD,MAAI,KAAK,SAAS,KAAA,EAChB,KAAI,OAAO,KAAK,SAAS,SACvB,cAAa,OAAO,KAAK;MAEzB,cAAa,OAAO,KAAK,UAAU,KAAK,KAAK;EAIjD,MAAM,UAAU;GAAE;GAAK;GAAM;GAAc;EAE3C,IAAI;AACJ,MAAI;AACF,SAAM,MAAM,KAAK,OAAO,KAAK,aAAa;WACnC,YAAY;GAMnB,MAAM,MAAM;GACZ,MAAM,SAAS,KAAK,UAAU,UAAU,KAAK;AAE7C,OAAI,UAAU,MAAM;IAClB,IAAI;AAEJ,QAAI,KAAK,UAAU,QAAQ;SACrB,OAAO,IAAI,SAAS,SAAS,SAC/B,QAAO,IAAI,SAAS;cACX,OAAO,IAAI,SAAS,SAAS,SACtC,KAAI;AACF,aAAO,KAAK,UAAU,IAAI,SAAS,KAAK;aAClC;;AAMZ,SAAK,mBACH,QACA,MACA,KAAK,YAAY,EAAE,QAAQ,EAC3B,QACD;;AAIH,SAAM;;AAIR,MAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,MAAM;AAC7B,QAAK,mBAAmB,IAAI,QAAQ,MAAM,KAAK,QAAQ;;AAIzD,SAAO;GACL,MAAA,MAFiB,KAAK,WAAW,KAAK,KAAK;GAG3C,QAAQ,EAAE;GACV,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,SAAS,EAAE,aAAa,IAAI,KAAK;GAClC;;;AAIL,IAAa,mBAAb,cAAsC,4BAA4B;CAChE;CAEA,YAAY,QAAgB;AAC1B,SAAO;AACP,OAAK,SAAS;;CAGhB,IAAI,aAAqB;AACvB,SAAO;;CAGT,eAAgC;AAC9B,QAAM,IAAI,MAAM,uDAAuD;;CAKzE,QAAQ,MAA0C;EAChD,MAAM,aAAa,EACjB,kBAAkB,KAAK,QACxB;AACD,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,WAAW;;;AAIpD,SAAgB,gBAAgB,UAAwC;AACtE,SAAQ,UAAR;EACE,KAAK,MACH,QAAO,CAAC,sDAAsD;EAChE,QACE,QAAO,CAAC,iDAAiD;;;AAI/D,SAAgB,uBACd,YACA,eACA,kBACa;AAEb,KAAI,cAAc,OAAO,OAAO,YAAY,cAAc,CACxD,QAAO;CAIT,MAAM,SAAmB,MAAM,QAAQ,iBAAiB,GACnD,mBACD,gBAAgB,oBAAoB,MAAM;AAC9C,QAAO;GACJ,gBAAgB;EACjB,GAAI,cAAc,EAAE;EACrB"}
package/dist/auth.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"auth.js","names":[],"sources":["../src/auth.ts"],"sourcesContent":["import { ReadableJsonStream } from \"./utils/stream.js\";\nimport { GooglePlatformType } from \"./types.js\";\n\nexport type GoogleAbstractedClientOpsMethod = \"GET\" | \"POST\" | \"DELETE\";\n\nexport type GoogleAbstractedClientOpsResponseType = \"json\" | \"stream\" | \"blob\";\n\nexport type GoogleAbstractedClientOps = {\n url?: string;\n method?: GoogleAbstractedClientOpsMethod;\n headers?: Record<string, string>;\n data?: unknown;\n responseType?: GoogleAbstractedClientOpsResponseType;\n signal?: AbortSignal;\n};\n\nexport interface GoogleAbstractedClient {\n request: (opts: GoogleAbstractedClientOps) => unknown;\n getProjectId: () => Promise<string>;\n get clientType(): string;\n}\n\nexport abstract class GoogleAbstractedFetchClient implements GoogleAbstractedClient {\n abstract get clientType(): string;\n\n abstract getProjectId(): Promise<string>;\n\n abstract request(opts: GoogleAbstractedClientOps): unknown;\n\n _fetch: typeof fetch = fetch;\n\n async _buildData(res: Response, opts: GoogleAbstractedClientOps) {\n switch (opts.responseType) {\n case \"json\":\n return res.json();\n case \"stream\":\n return new ReadableJsonStream(res.body);\n default:\n return res.blob();\n }\n }\n\n /**\n * Build and throw a standardised Google request error.\n * Both the `!res.ok` path (native fetch) and the catch path (gaxios)\n * funnel through here so the caller always sees the same shape.\n */\n protected _throwRequestError(\n status: number,\n body: string | undefined,\n response: unknown,\n context: {\n url: string;\n opts: GoogleAbstractedClientOps;\n fetchOptions?: Record<string, unknown>;\n }\n ): never {\n const message = body\n ? `Google request failed with status code ${status}: ${body}`\n : `Google request failed with status code ${status}`;\n const error = new Error(message);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).response = response;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).details = context;\n throw error;\n }\n\n async _request(\n url: string | undefined,\n opts: GoogleAbstractedClientOps,\n additionalHeaders: Record<string, string>\n ) {\n if (url == null) throw new Error(\"Missing URL\");\n const fetchOptions: {\n method?: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n } = {\n method: opts.method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(opts.headers ?? {}),\n ...(additionalHeaders ?? {}),\n },\n signal: opts.signal,\n };\n if (opts.data !== undefined) {\n if (typeof opts.data === \"string\") {\n fetchOptions.body = opts.data;\n } else {\n fetchOptions.body = JSON.stringify(opts.data);\n }\n }\n\n const context = { url, opts, fetchOptions };\n\n let res: Response;\n try {\n res = await this._fetch(url, fetchOptions);\n } catch (fetchError) {\n // The _fetch implementation (e.g. GAuthClient using google-auth-library)\n // may throw its own error (e.g. GaxiosError) for non-2xx responses\n // before we can handle them here. Extract what we can from the error\n // and re-throw with a useful, formatted message.\n /* oxlint-disable @typescript-eslint/no-explicit-any */\n const err = fetchError as any;\n const status = err?.response?.status ?? err?.status;\n\n if (status != null) {\n let body: string | undefined;\n\n if (err?.response?.data != null) {\n if (typeof err.response.data === \"string\") {\n body = err.response.data;\n } else if (typeof err.response.data === \"object\") {\n try {\n body = JSON.stringify(err.response.data);\n } catch {\n // best effort\n }\n }\n }\n\n this._throwRequestError(\n status,\n body,\n err?.response ?? { status },\n context\n );\n }\n\n // No status info available — re-throw the original error as-is\n throw fetchError;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n\n if (!res.ok) {\n const body = await res.text();\n this._throwRequestError(res.status, body, res, context);\n }\n\n const data = await this._buildData(res, opts);\n return {\n data,\n config: {},\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n request: { responseURL: res.url },\n };\n }\n}\n\nexport class ApiKeyGoogleAuth extends GoogleAbstractedFetchClient {\n apiKey: string;\n\n constructor(apiKey: string) {\n super();\n this.apiKey = apiKey;\n }\n\n get clientType(): string {\n return \"apiKey\";\n }\n\n getProjectId(): Promise<string> {\n throw new Error(\"APIs that require a project ID cannot use an API key\");\n // Perhaps we could implement this if needed:\n // https://cloud.google.com/docs/authentication/api-keys#get-info\n }\n\n request(opts: GoogleAbstractedClientOps): unknown {\n const authHeader = {\n \"X-Goog-Api-Key\": this.apiKey,\n };\n return this._request(opts.url, opts, authHeader);\n }\n}\n\nexport function aiPlatformScope(platform: GooglePlatformType): string[] {\n switch (platform) {\n case \"gai\":\n return [\"https://www.googleapis.com/auth/generative-language\"];\n default:\n return [\"https://www.googleapis.com/auth/cloud-platform\"];\n }\n}\n\nexport function ensureAuthOptionScopes<AuthOptions>(\n authOption: AuthOptions | undefined,\n scopeProperty: string,\n scopesOrPlatform: string[] | GooglePlatformType | undefined\n): AuthOptions {\n // If the property is already set, return it\n if (authOption && Object.hasOwn(authOption, scopeProperty)) {\n return authOption;\n }\n\n // Otherwise add it\n const scopes: string[] = Array.isArray(scopesOrPlatform)\n ? (scopesOrPlatform as string[])\n : aiPlatformScope(scopesOrPlatform ?? \"gcp\");\n return {\n [scopeProperty]: scopes,\n ...(authOption ?? {}),\n } as AuthOptions;\n}\n"],"mappings":";;AAsBA,IAAsB,8BAAtB,MAAoF;CAOlF,SAAuB;CAEvB,MAAM,WAAW,KAAe,MAAiC;AAC/D,UAAQ,KAAK,cAAb;GACE,KAAK,OACH,QAAO,IAAI,MAAM;GACnB,KAAK,SACH,QAAO,IAAI,mBAAmB,IAAI,KAAK;GACzC,QACE,QAAO,IAAI,MAAM;;;;;;;;CASvB,mBACE,QACA,MACA,UACA,SAKO;EACP,MAAM,UAAU,OACZ,0CAA0C,OAAO,IAAI,SACrD,0CAA0C;EAC9C,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAE/B,QAAc,WAAW;AAEzB,QAAc,UAAU;AACzB,QAAM;;CAGR,MAAM,SACJ,KACA,MACA,mBACA;AACA,MAAI,OAAO,KAAM,OAAM,IAAI,MAAM,cAAc;EAC/C,MAAM,eAKF;GACF,QAAQ,KAAK;GACb,SAAS;IACP,gBAAgB;IAChB,GAAI,KAAK,WAAW,EAAE;IACtB,GAAI,qBAAqB,EAAE;IAC5B;GACD,QAAQ,KAAK;GACd;AACD,MAAI,KAAK,SAAS,KAAA,EAChB,KAAI,OAAO,KAAK,SAAS,SACvB,cAAa,OAAO,KAAK;MAEzB,cAAa,OAAO,KAAK,UAAU,KAAK,KAAK;EAIjD,MAAM,UAAU;GAAE;GAAK;GAAM;GAAc;EAE3C,IAAI;AACJ,MAAI;AACF,SAAM,MAAM,KAAK,OAAO,KAAK,aAAa;WACnC,YAAY;GAMnB,MAAM,MAAM;GACZ,MAAM,SAAS,KAAK,UAAU,UAAU,KAAK;AAE7C,OAAI,UAAU,MAAM;IAClB,IAAI;AAEJ,QAAI,KAAK,UAAU,QAAQ;SACrB,OAAO,IAAI,SAAS,SAAS,SAC/B,QAAO,IAAI,SAAS;cACX,OAAO,IAAI,SAAS,SAAS,SACtC,KAAI;AACF,aAAO,KAAK,UAAU,IAAI,SAAS,KAAK;aAClC;;AAMZ,SAAK,mBACH,QACA,MACA,KAAK,YAAY,EAAE,QAAQ,EAC3B,QACD;;AAIH,SAAM;;AAIR,MAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,MAAM;AAC7B,QAAK,mBAAmB,IAAI,QAAQ,MAAM,KAAK,QAAQ;;AAIzD,SAAO;GACL,MAFW,MAAM,KAAK,WAAW,KAAK,KAAK;GAG3C,QAAQ,EAAE;GACV,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,SAAS,EAAE,aAAa,IAAI,KAAK;GAClC;;;AAIL,IAAa,mBAAb,cAAsC,4BAA4B;CAChE;CAEA,YAAY,QAAgB;AAC1B,SAAO;AACP,OAAK,SAAS;;CAGhB,IAAI,aAAqB;AACvB,SAAO;;CAGT,eAAgC;AAC9B,QAAM,IAAI,MAAM,uDAAuD;;CAKzE,QAAQ,MAA0C;EAChD,MAAM,aAAa,EACjB,kBAAkB,KAAK,QACxB;AACD,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,WAAW;;;AAIpD,SAAgB,gBAAgB,UAAwC;AACtE,SAAQ,UAAR;EACE,KAAK,MACH,QAAO,CAAC,sDAAsD;EAChE,QACE,QAAO,CAAC,iDAAiD;;;AAI/D,SAAgB,uBACd,YACA,eACA,kBACa;AAEb,KAAI,cAAc,OAAO,OAAO,YAAY,cAAc,CACxD,QAAO;CAIT,MAAM,SAAmB,MAAM,QAAQ,iBAAiB,GACnD,mBACD,gBAAgB,oBAAoB,MAAM;AAC9C,QAAO;GACJ,gBAAgB;EACjB,GAAI,cAAc,EAAE;EACrB"}
1
+ {"version":3,"file":"auth.js","names":[],"sources":["../src/auth.ts"],"sourcesContent":["import { ReadableJsonStream } from \"./utils/stream.js\";\nimport { GooglePlatformType } from \"./types.js\";\n\nexport type GoogleAbstractedClientOpsMethod = \"GET\" | \"POST\" | \"DELETE\";\n\nexport type GoogleAbstractedClientOpsResponseType = \"json\" | \"stream\" | \"blob\";\n\nexport type GoogleAbstractedClientOps = {\n url?: string;\n method?: GoogleAbstractedClientOpsMethod;\n headers?: Record<string, string>;\n data?: unknown;\n responseType?: GoogleAbstractedClientOpsResponseType;\n signal?: AbortSignal;\n};\n\nexport interface GoogleAbstractedClient {\n request: (opts: GoogleAbstractedClientOps) => unknown;\n getProjectId: () => Promise<string>;\n get clientType(): string;\n}\n\nexport abstract class GoogleAbstractedFetchClient implements GoogleAbstractedClient {\n abstract get clientType(): string;\n\n abstract getProjectId(): Promise<string>;\n\n abstract request(opts: GoogleAbstractedClientOps): unknown;\n\n _fetch: typeof fetch = fetch;\n\n async _buildData(res: Response, opts: GoogleAbstractedClientOps) {\n switch (opts.responseType) {\n case \"json\":\n return res.json();\n case \"stream\":\n return new ReadableJsonStream(res.body);\n default:\n return res.blob();\n }\n }\n\n /**\n * Build and throw a standardised Google request error.\n * Both the `!res.ok` path (native fetch) and the catch path (gaxios)\n * funnel through here so the caller always sees the same shape.\n */\n protected _throwRequestError(\n status: number,\n body: string | undefined,\n response: unknown,\n context: {\n url: string;\n opts: GoogleAbstractedClientOps;\n fetchOptions?: Record<string, unknown>;\n }\n ): never {\n const message = body\n ? `Google request failed with status code ${status}: ${body}`\n : `Google request failed with status code ${status}`;\n const error = new Error(message);\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).response = response;\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).details = context;\n throw error;\n }\n\n async _request(\n url: string | undefined,\n opts: GoogleAbstractedClientOps,\n additionalHeaders: Record<string, string>\n ) {\n if (url == null) throw new Error(\"Missing URL\");\n const fetchOptions: {\n method?: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n } = {\n method: opts.method,\n headers: {\n \"Content-Type\": \"application/json\",\n ...(opts.headers ?? {}),\n ...(additionalHeaders ?? {}),\n },\n signal: opts.signal,\n };\n if (opts.data !== undefined) {\n if (typeof opts.data === \"string\") {\n fetchOptions.body = opts.data;\n } else {\n fetchOptions.body = JSON.stringify(opts.data);\n }\n }\n\n const context = { url, opts, fetchOptions };\n\n let res: Response;\n try {\n res = await this._fetch(url, fetchOptions);\n } catch (fetchError) {\n // The _fetch implementation (e.g. GAuthClient using google-auth-library)\n // may throw its own error (e.g. GaxiosError) for non-2xx responses\n // before we can handle them here. Extract what we can from the error\n // and re-throw with a useful, formatted message.\n /* oxlint-disable @typescript-eslint/no-explicit-any */\n const err = fetchError as any;\n const status = err?.response?.status ?? err?.status;\n\n if (status != null) {\n let body: string | undefined;\n\n if (err?.response?.data != null) {\n if (typeof err.response.data === \"string\") {\n body = err.response.data;\n } else if (typeof err.response.data === \"object\") {\n try {\n body = JSON.stringify(err.response.data);\n } catch {\n // best effort\n }\n }\n }\n\n this._throwRequestError(\n status,\n body,\n err?.response ?? { status },\n context\n );\n }\n\n // No status info available — re-throw the original error as-is\n throw fetchError;\n /* eslint-enable @typescript-eslint/no-explicit-any */\n }\n\n if (!res.ok) {\n const body = await res.text();\n this._throwRequestError(res.status, body, res, context);\n }\n\n const data = await this._buildData(res, opts);\n return {\n data,\n config: {},\n status: res.status,\n statusText: res.statusText,\n headers: res.headers,\n request: { responseURL: res.url },\n };\n }\n}\n\nexport class ApiKeyGoogleAuth extends GoogleAbstractedFetchClient {\n apiKey: string;\n\n constructor(apiKey: string) {\n super();\n this.apiKey = apiKey;\n }\n\n get clientType(): string {\n return \"apiKey\";\n }\n\n getProjectId(): Promise<string> {\n throw new Error(\"APIs that require a project ID cannot use an API key\");\n // Perhaps we could implement this if needed:\n // https://cloud.google.com/docs/authentication/api-keys#get-info\n }\n\n request(opts: GoogleAbstractedClientOps): unknown {\n const authHeader = {\n \"X-Goog-Api-Key\": this.apiKey,\n };\n return this._request(opts.url, opts, authHeader);\n }\n}\n\nexport function aiPlatformScope(platform: GooglePlatformType): string[] {\n switch (platform) {\n case \"gai\":\n return [\"https://www.googleapis.com/auth/generative-language\"];\n default:\n return [\"https://www.googleapis.com/auth/cloud-platform\"];\n }\n}\n\nexport function ensureAuthOptionScopes<AuthOptions>(\n authOption: AuthOptions | undefined,\n scopeProperty: string,\n scopesOrPlatform: string[] | GooglePlatformType | undefined\n): AuthOptions {\n // If the property is already set, return it\n if (authOption && Object.hasOwn(authOption, scopeProperty)) {\n return authOption;\n }\n\n // Otherwise add it\n const scopes: string[] = Array.isArray(scopesOrPlatform)\n ? (scopesOrPlatform as string[])\n : aiPlatformScope(scopesOrPlatform ?? \"gcp\");\n return {\n [scopeProperty]: scopes,\n ...(authOption ?? {}),\n } as AuthOptions;\n}\n"],"mappings":";;AAsBA,IAAsB,8BAAtB,MAAoF;CAOlF,SAAuB;CAEvB,MAAM,WAAW,KAAe,MAAiC;AAC/D,UAAQ,KAAK,cAAb;GACE,KAAK,OACH,QAAO,IAAI,MAAM;GACnB,KAAK,SACH,QAAO,IAAI,mBAAmB,IAAI,KAAK;GACzC,QACE,QAAO,IAAI,MAAM;;;;;;;;CASvB,mBACE,QACA,MACA,UACA,SAKO;EACP,MAAM,UAAU,OACZ,0CAA0C,OAAO,IAAI,SACrD,0CAA0C;EAC9C,MAAM,QAAQ,IAAI,MAAM,QAAQ;AAE/B,QAAc,WAAW;AAEzB,QAAc,UAAU;AACzB,QAAM;;CAGR,MAAM,SACJ,KACA,MACA,mBACA;AACA,MAAI,OAAO,KAAM,OAAM,IAAI,MAAM,cAAc;EAC/C,MAAM,eAKF;GACF,QAAQ,KAAK;GACb,SAAS;IACP,gBAAgB;IAChB,GAAI,KAAK,WAAW,EAAE;IACtB,GAAI,qBAAqB,EAAE;IAC5B;GACD,QAAQ,KAAK;GACd;AACD,MAAI,KAAK,SAAS,KAAA,EAChB,KAAI,OAAO,KAAK,SAAS,SACvB,cAAa,OAAO,KAAK;MAEzB,cAAa,OAAO,KAAK,UAAU,KAAK,KAAK;EAIjD,MAAM,UAAU;GAAE;GAAK;GAAM;GAAc;EAE3C,IAAI;AACJ,MAAI;AACF,SAAM,MAAM,KAAK,OAAO,KAAK,aAAa;WACnC,YAAY;GAMnB,MAAM,MAAM;GACZ,MAAM,SAAS,KAAK,UAAU,UAAU,KAAK;AAE7C,OAAI,UAAU,MAAM;IAClB,IAAI;AAEJ,QAAI,KAAK,UAAU,QAAQ;SACrB,OAAO,IAAI,SAAS,SAAS,SAC/B,QAAO,IAAI,SAAS;cACX,OAAO,IAAI,SAAS,SAAS,SACtC,KAAI;AACF,aAAO,KAAK,UAAU,IAAI,SAAS,KAAK;aAClC;;AAMZ,SAAK,mBACH,QACA,MACA,KAAK,YAAY,EAAE,QAAQ,EAC3B,QACD;;AAIH,SAAM;;AAIR,MAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,MAAM;AAC7B,QAAK,mBAAmB,IAAI,QAAQ,MAAM,KAAK,QAAQ;;AAIzD,SAAO;GACL,MAAA,MAFiB,KAAK,WAAW,KAAK,KAAK;GAG3C,QAAQ,EAAE;GACV,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,SAAS,EAAE,aAAa,IAAI,KAAK;GAClC;;;AAIL,IAAa,mBAAb,cAAsC,4BAA4B;CAChE;CAEA,YAAY,QAAgB;AAC1B,SAAO;AACP,OAAK,SAAS;;CAGhB,IAAI,aAAqB;AACvB,SAAO;;CAGT,eAAgC;AAC9B,QAAM,IAAI,MAAM,uDAAuD;;CAKzE,QAAQ,MAA0C;EAChD,MAAM,aAAa,EACjB,kBAAkB,KAAK,QACxB;AACD,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,WAAW;;;AAIpD,SAAgB,gBAAgB,UAAwC;AACtE,SAAQ,UAAR;EACE,KAAK,MACH,QAAO,CAAC,sDAAsD;EAChE,QACE,QAAO,CAAC,iDAAiD;;;AAI/D,SAAgB,uBACd,YACA,eACA,kBACa;AAEb,KAAI,cAAc,OAAO,OAAO,YAAY,cAAc,CACxD,QAAO;CAIT,MAAM,SAAmB,MAAM,QAAQ,iBAAiB,GACnD,mBACD,gBAAgB,oBAAoB,MAAM;AAC9C,QAAO;GACJ,gBAAgB;EACjB,GAAI,cAAc,EAAE;EACrB"}
@@ -1,3 +1,4 @@
1
+ const require_stream_events = require("./utils/stream_events.cjs");
1
2
  const require_zod_to_gemini_parameters = require("./utils/zod_to_gemini_parameters.cjs");
2
3
  const require_gemini = require("./utils/gemini.cjs");
3
4
  const require_common = require("./utils/common.cjs");
@@ -94,7 +95,7 @@ var ChatGoogleBase = class extends _langchain_core_language_models_chat_models.B
94
95
  streamedConnection;
95
96
  constructor(fields) {
96
97
  super(require_failed_handler.ensureParams(fields));
97
- this._addVersion("@langchain/google-common", "2.1.30");
98
+ this._addVersion("@langchain/google-common", "2.2.0");
98
99
  require_common.copyAndValidateModelParamsInto(fields, this);
99
100
  this.safetyHandler = fields?.safetyHandler ?? new require_gemini.DefaultGeminiSafetyHandler();
100
101
  this.streamUsage = fields?.streamUsage ?? this.streamUsage;
@@ -167,26 +168,35 @@ var ChatGoogleBase = class extends _langchain_core_language_models_chat_models.B
167
168
  if (chunk) await runManager?.handleLLMNewToken(chunk.text || "");
168
169
  return ret;
169
170
  }
171
+ async *_streamChatModelEvents(messages, options, _runManager) {
172
+ const parameters = this.invocationParams(options);
173
+ const stream = (await this.streamedConnection.request(messages, parameters, options, _runManager)).data;
174
+ const shouldStreamUsage = this.streamUsage !== false && options.streamUsage !== false;
175
+ async function* geminiChunks(jsonStream, signal) {
176
+ while (!jsonStream.streamDone) {
177
+ if (signal?.aborted) return;
178
+ const output = await jsonStream.nextChunk();
179
+ if (output !== null) yield output;
180
+ }
181
+ }
182
+ yield* require_stream_events.convertGoogleGeminiStream(geminiChunks(stream, options.signal), { streamUsage: shouldStreamUsage });
183
+ }
170
184
  async *_streamResponseChunks(_messages, options, runManager) {
171
185
  const parameters = this.invocationParams(options);
172
186
  const stream = (await this.streamedConnection.request(_messages, parameters, options, runManager)).data;
173
- let usageMetadata;
187
+ const shouldStreamUsage = this.streamUsage !== false && options.streamUsage !== false;
174
188
  while (!stream.streamDone) {
175
189
  if (options.signal?.aborted) return;
176
190
  const output = await stream.nextChunk();
177
191
  await runManager?.handleCustomEvent(`google-chunk-${this.constructor.name}`, { output });
178
- if (output && output.usageMetadata && this.streamUsage !== false && options.streamUsage !== false) usageMetadata = {
179
- input_tokens: output.usageMetadata.promptTokenCount,
180
- output_tokens: output.usageMetadata.candidatesTokenCount,
181
- total_tokens: output.usageMetadata.totalTokenCount
182
- };
183
192
  const chunk = output !== null ? this.connection.api.responseToChatGeneration({ data: output }) : new _langchain_core_outputs.ChatGenerationChunk({
184
193
  text: "",
185
194
  generationInfo: { finishReason: "stop" },
186
- message: new _langchain_core_messages.AIMessageChunk({
187
- content: "",
188
- usage_metadata: usageMetadata
189
- })
195
+ message: new _langchain_core_messages.AIMessageChunk({ content: "" })
196
+ });
197
+ if (shouldStreamUsage && chunk) chunk.message = new _langchain_core_messages.AIMessageChunk({
198
+ ...chunk.message,
199
+ usage_metadata: chunk.generationInfo?.usage_metadata
190
200
  });
191
201
  if (chunk) {
192
202
  yield chunk;
@@ -1 +1 @@
1
- {"version":3,"file":"chat_models.cjs","names":["AbstractGoogleLLMConnection","getGeminiAPI","BaseChatModel","ensureParams","DefaultGeminiSafetyHandler","ApiKeyGoogleAuth","convertToGeminiTools","copyAIModelParams","ChatGenerationChunk","AIMessageChunk","PROFILES","schemaToGeminiParameters","removeAdditionalProperties"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { UsageMetadata, type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\n\nimport {\n BaseChatModel,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { AsyncCaller } from \"@langchain/core/utils/async_caller\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport {\n GoogleAIBaseLLMInput,\n GoogleAIModelParams,\n GoogleAISafetySetting,\n GoogleConnectionParams,\n GooglePlatformType,\n GeminiTool,\n GoogleAIBaseLanguageModelCallOptions,\n GoogleAIAPI,\n GoogleAIAPIParams,\n GoogleSearchToolSetting,\n GoogleSpeechConfig,\n GeminiJsonSchema,\n} from \"./types.js\";\nimport {\n convertToGeminiTools,\n copyAIModelParams,\n copyAndValidateModelParamsInto,\n} from \"./utils/common.js\";\nimport { AbstractGoogleLLMConnection } from \"./connection.js\";\nimport { DefaultGeminiSafetyHandler, getGeminiAPI } from \"./utils/gemini.js\";\nimport { ApiKeyGoogleAuth, GoogleAbstractedClient } from \"./auth.js\";\nimport { JsonStream } from \"./utils/stream.js\";\nimport { ensureParams } from \"./utils/failed_handler.js\";\nimport type {\n GoogleBaseLLMInput,\n GoogleAISafetyHandler,\n GoogleAISafetyParams,\n GeminiFunctionDeclaration,\n GeminiFunctionSchema,\n GoogleAIToolType,\n GeminiAPIConfig,\n GoogleAIModelModality,\n} from \"./types.js\";\nimport {\n removeAdditionalProperties,\n schemaToGeminiParameters,\n} from \"./utils/zod_to_gemini_parameters.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\nexport class ChatConnection<AuthOptions> extends AbstractGoogleLLMConnection<\n BaseMessage[],\n AuthOptions\n> {\n convertSystemMessageToHumanContent: boolean | undefined;\n\n constructor(\n fields: GoogleAIBaseLLMInput<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming: boolean\n ) {\n super(fields, caller, client, streaming);\n this.convertSystemMessageToHumanContent =\n fields?.convertSystemMessageToHumanContent;\n }\n\n get useSystemInstruction(): boolean {\n return typeof this.convertSystemMessageToHumanContent === \"boolean\"\n ? !this.convertSystemMessageToHumanContent\n : this.computeUseSystemInstruction;\n }\n\n get computeUseSystemInstruction(): boolean {\n // This works on models from April 2024 and later\n // Vertex AI: gemini-1.5-pro and gemini-1.0-002 and later\n // AI Studio: gemini-1.5-pro-latest\n if (this.modelFamily === \"palm\") {\n return false;\n } else if (this.modelName === \"gemini-1.0-pro-001\") {\n return false;\n } else if (this.modelName.startsWith(\"gemini-pro-vision\")) {\n return false;\n } else if (this.modelName.startsWith(\"gemini-1.0-pro-vision\")) {\n return false;\n } else if (this.modelName === \"gemini-pro\" && this.platform === \"gai\") {\n // on AI Studio gemini-pro is still pointing at gemini-1.0-pro-001\n return false;\n } else if (this.modelFamily === \"gemma\") {\n // At least as of 12 Mar 2025 gemma 3 on AIS, trying to use system instructions yields an error:\n // \"Developer instruction is not enabled for models/gemma-3-27b-it\"\n return false;\n }\n return true;\n }\n\n computeGoogleSearchToolAdjustmentFromModel(): Exclude<\n GoogleSearchToolSetting,\n boolean\n > {\n if (this.modelName.startsWith(\"gemini-1.0\")) {\n return \"googleSearchRetrieval\";\n } else if (this.modelName.startsWith(\"gemini-1.5\")) {\n return \"googleSearchRetrieval\";\n } else {\n return \"googleSearch\";\n }\n }\n\n computeGoogleSearchToolAdjustment(\n apiConfig: GeminiAPIConfig\n ): Exclude<GoogleSearchToolSetting, true> {\n const adj = apiConfig.googleSearchToolAdjustment;\n if (adj === undefined || adj === true) {\n return this.computeGoogleSearchToolAdjustmentFromModel();\n } else {\n return adj;\n }\n }\n\n buildGeminiAPI(): GoogleAIAPI {\n const apiConfig: GeminiAPIConfig =\n (this.apiConfig as GeminiAPIConfig) ?? {};\n const googleSearchToolAdjustment =\n this.computeGoogleSearchToolAdjustment(apiConfig);\n const geminiConfig: GeminiAPIConfig = {\n useSystemInstruction: this.useSystemInstruction,\n googleSearchToolAdjustment,\n ...apiConfig,\n };\n return getGeminiAPI(geminiConfig);\n }\n\n get api(): GoogleAIAPI {\n switch (this.apiName) {\n case \"google\":\n return this.buildGeminiAPI();\n default:\n return super.api;\n }\n }\n}\n\n/**\n * Input to chat model class.\n */\nexport interface ChatGoogleBaseInput<AuthOptions>\n extends\n BaseChatModelParams,\n GoogleConnectionParams<AuthOptions>,\n GoogleAIModelParams,\n GoogleAISafetyParams,\n GoogleAIAPIParams,\n Pick<GoogleAIBaseLanguageModelCallOptions, \"streamUsage\"> {}\n\n/**\n * Integration with a Google chat model.\n */\nexport abstract class ChatGoogleBase<AuthOptions>\n extends BaseChatModel<GoogleAIBaseLanguageModelCallOptions, AIMessageChunk>\n implements ChatGoogleBaseInput<AuthOptions>\n{\n // Used for tracing, replace with the same name as your class\n static lc_name() {\n return \"ChatGoogle\";\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n authOptions: \"GOOGLE_AUTH_OPTIONS\",\n };\n }\n\n lc_serializable = true;\n\n // Set based on modelName\n model: string;\n\n modelName = \"gemini-pro\";\n\n temperature: number;\n\n maxOutputTokens: number;\n\n maxReasoningTokens: number;\n\n topP: number;\n\n topK: number;\n\n seed: number;\n\n presencePenalty: number;\n\n frequencyPenalty: number;\n\n stopSequences: string[] = [];\n\n logprobs: boolean;\n\n topLogprobs: number = 0;\n\n safetySettings: GoogleAISafetySetting[] = [];\n\n responseModalities?: GoogleAIModelModality[];\n\n // May intentionally be undefined, meaning to compute this.\n convertSystemMessageToHumanContent: boolean | undefined;\n\n safetyHandler: GoogleAISafetyHandler;\n\n speechConfig: GoogleSpeechConfig;\n\n streamUsage = true;\n\n streaming = false;\n\n labels?: Record<string, string>;\n\n protected connection: ChatConnection<AuthOptions>;\n\n protected streamedConnection: ChatConnection<AuthOptions>;\n\n constructor(fields?: ChatGoogleBaseInput<AuthOptions>) {\n super(ensureParams(fields));\n this._addVersion(\"@langchain/google-common\", __PKG_VERSION__);\n\n copyAndValidateModelParamsInto(fields, this);\n this.safetyHandler =\n fields?.safetyHandler ?? new DefaultGeminiSafetyHandler();\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n const client = this.buildClient(fields);\n this.buildConnection(fields ?? {}, client);\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"google_vertexai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.maxOutputTokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n abstract buildAbstractedClient(\n fields?: GoogleAIBaseLLMInput<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: GoogleAIBaseLLMInput<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: GoogleAIBaseLLMInput<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n return this.buildAbstractedClient(fields);\n }\n }\n\n buildConnection(\n fields: GoogleBaseLLMInput<AuthOptions>,\n client: GoogleAbstractedClient\n ) {\n this.connection = new ChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n false\n );\n\n this.streamedConnection = new ChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n true\n );\n }\n\n get platform(): GooglePlatformType {\n return this.connection.platform;\n }\n\n override bindTools(\n tools: GoogleAIToolType[],\n kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>\n ): Runnable<\n BaseLanguageModelInput,\n AIMessageChunk,\n GoogleAIBaseLanguageModelCallOptions\n > {\n return this.withConfig({ tools: convertToGeminiTools(tools), ...kwargs });\n }\n\n _llmType() {\n return \"google\";\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return copyAIModelParams(this, options);\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager: CallbackManagerForLLMRun | undefined\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const parameters = this.invocationParams(options);\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (!finalChunk) {\n throw new Error(\"No chunks were returned from the stream.\");\n }\n return {\n generations: [finalChunk],\n };\n }\n\n const response = await this.connection.request(\n messages,\n parameters,\n options,\n runManager\n );\n const ret = this.connection.api.responseToChatResult(response);\n const chunk = ret?.generations?.[0];\n if (chunk) {\n await runManager?.handleLLMNewToken(chunk.text || \"\");\n }\n return ret;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n // Make the call as a streaming request\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n _messages,\n parameters,\n options,\n runManager\n );\n\n // Get the streaming parser of the response\n const stream = response.data as JsonStream;\n let usageMetadata: UsageMetadata | undefined;\n // Loop until the end of the stream\n // During the loop, yield each time we get a chunk from the streaming parser\n // that is either available or added to the queue\n while (!stream.streamDone) {\n if (options.signal?.aborted) {\n return;\n }\n const output = await stream.nextChunk();\n await runManager?.handleCustomEvent(\n `google-chunk-${this.constructor.name}`,\n {\n output,\n }\n );\n if (\n output &&\n output.usageMetadata &&\n this.streamUsage !== false &&\n options.streamUsage !== false\n ) {\n usageMetadata = {\n input_tokens: output.usageMetadata.promptTokenCount,\n output_tokens: output.usageMetadata.candidatesTokenCount,\n total_tokens: output.usageMetadata.totalTokenCount,\n };\n }\n const chunk =\n output !== null\n ? this.connection.api.responseToChatGeneration({ data: output })\n : new ChatGenerationChunk({\n text: \"\",\n generationInfo: { finishReason: \"stop\" },\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: usageMetadata,\n }),\n });\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n const schema = outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n\n if (method === \"jsonMode\") {\n throw new Error(\n `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n );\n }\n\n let llm: Runnable<BaseLanguageModelInput>;\n let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n if (method === \"functionCalling\") {\n let functionName = name ?? \"extract\";\n let geminiFunctionDeclaration: GeminiFunctionDeclaration;\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n parameters: jsonSchema as GeminiFunctionSchema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDeclaration = schema as GeminiFunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters, probably\n const parameters: GeminiJsonSchema = removeAdditionalProperties(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters,\n };\n }\n\n const tools: GeminiTool[] = [\n { functionDeclarations: [geminiFunctionDeclaration] },\n ];\n llm = this.bindTools(tools).withConfig({ tool_choice: functionName });\n\n outputParser = createFunctionCallingParser(schema, functionName);\n } else {\n // Default to jsonSchema method\n const jsonSchema = schemaToGeminiParameters(schema);\n llm = this.withConfig({\n responseSchema: jsonSchema as GeminiJsonSchema,\n });\n outputParser = createContentParser(schema);\n }\n\n return assembleStructuredOutputPipeline(\n llm,\n outputParser,\n includeRaw,\n includeRaw ? \"StructuredOutputRunnable\" : \"ChatGoogleStructuredOutput\"\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat_models.cjs","names":["AbstractGoogleLLMConnection","getGeminiAPI","BaseChatModel","ensureParams","DefaultGeminiSafetyHandler","ApiKeyGoogleAuth","convertToGeminiTools","copyAIModelParams","convertGoogleGeminiStream","ChatGenerationChunk","AIMessageChunk","PROFILES","schemaToGeminiParameters","removeAdditionalProperties"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { convertGoogleGeminiStream } from \"./utils/stream_events.js\";\nimport { JsonStream } from \"./utils/stream.js\";\n\nimport {\n BaseChatModel,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { AsyncCaller } from \"@langchain/core/utils/async_caller\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport {\n GoogleAIBaseLLMInput,\n GoogleAIModelParams,\n GoogleAISafetySetting,\n GoogleConnectionParams,\n GooglePlatformType,\n GeminiTool,\n GoogleAIBaseLanguageModelCallOptions,\n GoogleAIAPI,\n GoogleAIAPIParams,\n GoogleSearchToolSetting,\n GoogleSpeechConfig,\n GeminiJsonSchema,\n} from \"./types.js\";\nimport {\n convertToGeminiTools,\n copyAIModelParams,\n copyAndValidateModelParamsInto,\n} from \"./utils/common.js\";\nimport { AbstractGoogleLLMConnection } from \"./connection.js\";\nimport { DefaultGeminiSafetyHandler, getGeminiAPI } from \"./utils/gemini.js\";\nimport { ApiKeyGoogleAuth, GoogleAbstractedClient } from \"./auth.js\";\nimport { ensureParams } from \"./utils/failed_handler.js\";\nimport type {\n GoogleBaseLLMInput,\n GoogleAISafetyHandler,\n GoogleAISafetyParams,\n GeminiFunctionDeclaration,\n GeminiFunctionSchema,\n GoogleAIToolType,\n GeminiAPIConfig,\n GoogleAIModelModality,\n} from \"./types.js\";\nimport {\n removeAdditionalProperties,\n schemaToGeminiParameters,\n} from \"./utils/zod_to_gemini_parameters.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\nexport class ChatConnection<AuthOptions> extends AbstractGoogleLLMConnection<\n BaseMessage[],\n AuthOptions\n> {\n convertSystemMessageToHumanContent: boolean | undefined;\n\n constructor(\n fields: GoogleAIBaseLLMInput<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming: boolean\n ) {\n super(fields, caller, client, streaming);\n this.convertSystemMessageToHumanContent =\n fields?.convertSystemMessageToHumanContent;\n }\n\n get useSystemInstruction(): boolean {\n return typeof this.convertSystemMessageToHumanContent === \"boolean\"\n ? !this.convertSystemMessageToHumanContent\n : this.computeUseSystemInstruction;\n }\n\n get computeUseSystemInstruction(): boolean {\n // This works on models from April 2024 and later\n // Vertex AI: gemini-1.5-pro and gemini-1.0-002 and later\n // AI Studio: gemini-1.5-pro-latest\n if (this.modelFamily === \"palm\") {\n return false;\n } else if (this.modelName === \"gemini-1.0-pro-001\") {\n return false;\n } else if (this.modelName.startsWith(\"gemini-pro-vision\")) {\n return false;\n } else if (this.modelName.startsWith(\"gemini-1.0-pro-vision\")) {\n return false;\n } else if (this.modelName === \"gemini-pro\" && this.platform === \"gai\") {\n // on AI Studio gemini-pro is still pointing at gemini-1.0-pro-001\n return false;\n } else if (this.modelFamily === \"gemma\") {\n // At least as of 12 Mar 2025 gemma 3 on AIS, trying to use system instructions yields an error:\n // \"Developer instruction is not enabled for models/gemma-3-27b-it\"\n return false;\n }\n return true;\n }\n\n computeGoogleSearchToolAdjustmentFromModel(): Exclude<\n GoogleSearchToolSetting,\n boolean\n > {\n if (this.modelName.startsWith(\"gemini-1.0\")) {\n return \"googleSearchRetrieval\";\n } else if (this.modelName.startsWith(\"gemini-1.5\")) {\n return \"googleSearchRetrieval\";\n } else {\n return \"googleSearch\";\n }\n }\n\n computeGoogleSearchToolAdjustment(\n apiConfig: GeminiAPIConfig\n ): Exclude<GoogleSearchToolSetting, true> {\n const adj = apiConfig.googleSearchToolAdjustment;\n if (adj === undefined || adj === true) {\n return this.computeGoogleSearchToolAdjustmentFromModel();\n } else {\n return adj;\n }\n }\n\n buildGeminiAPI(): GoogleAIAPI {\n const apiConfig: GeminiAPIConfig =\n (this.apiConfig as GeminiAPIConfig) ?? {};\n const googleSearchToolAdjustment =\n this.computeGoogleSearchToolAdjustment(apiConfig);\n const geminiConfig: GeminiAPIConfig = {\n useSystemInstruction: this.useSystemInstruction,\n googleSearchToolAdjustment,\n ...apiConfig,\n };\n return getGeminiAPI(geminiConfig);\n }\n\n get api(): GoogleAIAPI {\n switch (this.apiName) {\n case \"google\":\n return this.buildGeminiAPI();\n default:\n return super.api;\n }\n }\n}\n\n/**\n * Input to chat model class.\n */\nexport interface ChatGoogleBaseInput<AuthOptions>\n extends\n BaseChatModelParams,\n GoogleConnectionParams<AuthOptions>,\n GoogleAIModelParams,\n GoogleAISafetyParams,\n GoogleAIAPIParams,\n Pick<GoogleAIBaseLanguageModelCallOptions, \"streamUsage\"> {}\n\n/**\n * Integration with a Google chat model.\n */\nexport abstract class ChatGoogleBase<AuthOptions>\n extends BaseChatModel<GoogleAIBaseLanguageModelCallOptions, AIMessageChunk>\n implements ChatGoogleBaseInput<AuthOptions>\n{\n // Used for tracing, replace with the same name as your class\n static lc_name() {\n return \"ChatGoogle\";\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n authOptions: \"GOOGLE_AUTH_OPTIONS\",\n };\n }\n\n lc_serializable = true;\n\n // Set based on modelName\n model: string;\n\n modelName = \"gemini-pro\";\n\n temperature: number;\n\n maxOutputTokens: number;\n\n maxReasoningTokens: number;\n\n topP: number;\n\n topK: number;\n\n seed: number;\n\n presencePenalty: number;\n\n frequencyPenalty: number;\n\n stopSequences: string[] = [];\n\n logprobs: boolean;\n\n topLogprobs: number = 0;\n\n safetySettings: GoogleAISafetySetting[] = [];\n\n responseModalities?: GoogleAIModelModality[];\n\n // May intentionally be undefined, meaning to compute this.\n convertSystemMessageToHumanContent: boolean | undefined;\n\n safetyHandler: GoogleAISafetyHandler;\n\n speechConfig: GoogleSpeechConfig;\n\n streamUsage = true;\n\n streaming = false;\n\n labels?: Record<string, string>;\n\n protected connection: ChatConnection<AuthOptions>;\n\n protected streamedConnection: ChatConnection<AuthOptions>;\n\n constructor(fields?: ChatGoogleBaseInput<AuthOptions>) {\n super(ensureParams(fields));\n this._addVersion(\"@langchain/google-common\", __PKG_VERSION__);\n\n copyAndValidateModelParamsInto(fields, this);\n this.safetyHandler =\n fields?.safetyHandler ?? new DefaultGeminiSafetyHandler();\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n const client = this.buildClient(fields);\n this.buildConnection(fields ?? {}, client);\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"google_vertexai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.maxOutputTokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n abstract buildAbstractedClient(\n fields?: GoogleAIBaseLLMInput<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: GoogleAIBaseLLMInput<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: GoogleAIBaseLLMInput<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n return this.buildAbstractedClient(fields);\n }\n }\n\n buildConnection(\n fields: GoogleBaseLLMInput<AuthOptions>,\n client: GoogleAbstractedClient\n ) {\n this.connection = new ChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n false\n );\n\n this.streamedConnection = new ChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n true\n );\n }\n\n get platform(): GooglePlatformType {\n return this.connection.platform;\n }\n\n override bindTools(\n tools: GoogleAIToolType[],\n kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>\n ): Runnable<\n BaseLanguageModelInput,\n AIMessageChunk,\n GoogleAIBaseLanguageModelCallOptions\n > {\n return this.withConfig({ tools: convertToGeminiTools(tools), ...kwargs });\n }\n\n _llmType() {\n return \"google\";\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return copyAIModelParams(this, options);\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager: CallbackManagerForLLMRun | undefined\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const parameters = this.invocationParams(options);\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (!finalChunk) {\n throw new Error(\"No chunks were returned from the stream.\");\n }\n return {\n generations: [finalChunk],\n };\n }\n\n const response = await this.connection.request(\n messages,\n parameters,\n options,\n runManager\n );\n const ret = this.connection.api.responseToChatResult(response);\n const chunk = ret?.generations?.[0];\n if (chunk) {\n await runManager?.handleLLMNewToken(chunk.text || \"\");\n }\n return ret;\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n messages,\n parameters,\n options,\n _runManager\n );\n const stream = response.data as JsonStream;\n const shouldStreamUsage =\n this.streamUsage !== false && options.streamUsage !== false;\n async function* geminiChunks(jsonStream: JsonStream, signal?: AbortSignal) {\n while (!jsonStream.streamDone) {\n if (signal?.aborted) {\n return;\n }\n const output = await jsonStream.nextChunk();\n if (output !== null) {\n yield output;\n }\n }\n }\n yield* convertGoogleGeminiStream(geminiChunks(stream, options.signal), {\n streamUsage: shouldStreamUsage,\n });\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n // Make the call as a streaming request\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n _messages,\n parameters,\n options,\n runManager\n );\n\n // Get the streaming parser of the response\n const stream = response.data as JsonStream;\n const shouldStreamUsage =\n this.streamUsage !== false && options.streamUsage !== false;\n // Loop until the end of the stream\n // During the loop, yield each time we get a chunk from the streaming parser\n // that is either available or added to the queue\n while (!stream.streamDone) {\n if (options.signal?.aborted) {\n return;\n }\n const output = await stream.nextChunk();\n await runManager?.handleCustomEvent(\n `google-chunk-${this.constructor.name}`,\n {\n output,\n }\n );\n\n const chunk =\n output !== null\n ? this.connection.api.responseToChatGeneration({ data: output })\n : new ChatGenerationChunk({\n text: \"\",\n generationInfo: { finishReason: \"stop\" },\n message: new AIMessageChunk({\n content: \"\",\n }),\n });\n\n if (shouldStreamUsage && chunk) {\n chunk.message = new AIMessageChunk({\n ...chunk.message,\n usage_metadata: chunk.generationInfo?.usage_metadata,\n });\n }\n\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n const schema = outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n\n if (method === \"jsonMode\") {\n throw new Error(\n `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n );\n }\n\n let llm: Runnable<BaseLanguageModelInput>;\n let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n if (method === \"functionCalling\") {\n let functionName = name ?? \"extract\";\n let geminiFunctionDeclaration: GeminiFunctionDeclaration;\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n parameters: jsonSchema as GeminiFunctionSchema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDeclaration = schema as GeminiFunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters, probably\n const parameters: GeminiJsonSchema = removeAdditionalProperties(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters,\n };\n }\n\n const tools: GeminiTool[] = [\n { functionDeclarations: [geminiFunctionDeclaration] },\n ];\n llm = this.bindTools(tools).withConfig({ tool_choice: functionName });\n\n outputParser = createFunctionCallingParser(schema, functionName);\n } else {\n // Default to jsonSchema method\n const jsonSchema = schemaToGeminiParameters(schema);\n llm = this.withConfig({\n responseSchema: jsonSchema as GeminiJsonSchema,\n });\n outputParser = createContentParser(schema);\n }\n\n return assembleStructuredOutputPipeline(\n llm,\n outputParser,\n includeRaw,\n includeRaw ? \"StructuredOutputRunnable\" : \"ChatGoogleStructuredOutput\"\n );\n }\n}\n"],"mappings":"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"}
@@ -7,6 +7,7 @@ import { AIMessageChunk, BaseMessage } from "@langchain/core/messages";
7
7
  import { ChatGenerationChunk, ChatResult } from "@langchain/core/outputs";
8
8
  import { BaseLanguageModelInput, StructuredOutputMethodOptions } from "@langchain/core/language_models/base";
9
9
  import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
10
+ import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
10
11
  import { ModelProfile } from "@langchain/core/language_models/profile";
11
12
  import { Runnable } from "@langchain/core/runnables";
12
13
  import { InteropZodType } from "@langchain/core/utils/types";
@@ -74,6 +75,7 @@ declare abstract class ChatGoogleBase<AuthOptions> extends BaseChatModel<GoogleA
74
75
  */
75
76
  invocationParams(options?: this["ParsedCallOptions"]): GoogleAIModelRequestParams;
76
77
  _generate(messages: BaseMessage[], options: this["ParsedCallOptions"], runManager: CallbackManagerForLLMRun | undefined): Promise<ChatResult>;
78
+ _streamChatModelEvents(messages: BaseMessage[], options: this["ParsedCallOptions"], _runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatModelStreamEvent>;
77
79
  _streamResponseChunks(_messages: BaseMessage[], options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
78
80
  /** @ignore */
79
81
  _combineLLMOutput(): never[];
@@ -1 +1 @@
1
- {"version":3,"file":"chat_models.d.cts","names":[],"sources":["../src/chat_models.ts"],"mappings":"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"}
1
+ {"version":3,"file":"chat_models.d.cts","names":[],"sources":["../src/chat_models.ts"],"mappings":"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"}
@@ -9,6 +9,7 @@ import { BaseLanguageModelInput, StructuredOutputMethodOptions } from "@langchai
9
9
  import { SerializableSchema } from "@langchain/core/utils/standard_schema";
10
10
  import { CallbackManagerForLLMRun } from "@langchain/core/callbacks/manager";
11
11
  import { AsyncCaller } from "@langchain/core/utils/async_caller";
12
+ import { ChatModelStreamEvent } from "@langchain/core/language_models/event";
12
13
  import { ModelProfile } from "@langchain/core/language_models/profile";
13
14
  import { Runnable } from "@langchain/core/runnables";
14
15
 
@@ -74,6 +75,7 @@ declare abstract class ChatGoogleBase<AuthOptions> extends BaseChatModel<GoogleA
74
75
  */
75
76
  invocationParams(options?: this["ParsedCallOptions"]): GoogleAIModelRequestParams;
76
77
  _generate(messages: BaseMessage[], options: this["ParsedCallOptions"], runManager: CallbackManagerForLLMRun | undefined): Promise<ChatResult>;
78
+ _streamChatModelEvents(messages: BaseMessage[], options: this["ParsedCallOptions"], _runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatModelStreamEvent>;
77
79
  _streamResponseChunks(_messages: BaseMessage[], options: this["ParsedCallOptions"], runManager?: CallbackManagerForLLMRun): AsyncGenerator<ChatGenerationChunk>;
78
80
  /** @ignore */
79
81
  _combineLLMOutput(): never[];
@@ -1 +1 @@
1
- {"version":3,"file":"chat_models.d.ts","names":[],"sources":["../src/chat_models.ts"],"mappings":"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"}
1
+ {"version":3,"file":"chat_models.d.ts","names":[],"sources":["../src/chat_models.ts"],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { convertGoogleGeminiStream } from "./utils/stream_events.js";
1
2
  import { removeAdditionalProperties, schemaToGeminiParameters } from "./utils/zod_to_gemini_parameters.js";
2
3
  import { DefaultGeminiSafetyHandler, getGeminiAPI } from "./utils/gemini.js";
3
4
  import { convertToGeminiTools, copyAIModelParams, copyAndValidateModelParamsInto } from "./utils/common.js";
@@ -94,7 +95,7 @@ var ChatGoogleBase = class extends BaseChatModel {
94
95
  streamedConnection;
95
96
  constructor(fields) {
96
97
  super(ensureParams(fields));
97
- this._addVersion("@langchain/google-common", "2.1.30");
98
+ this._addVersion("@langchain/google-common", "2.2.0");
98
99
  copyAndValidateModelParamsInto(fields, this);
99
100
  this.safetyHandler = fields?.safetyHandler ?? new DefaultGeminiSafetyHandler();
100
101
  this.streamUsage = fields?.streamUsage ?? this.streamUsage;
@@ -167,26 +168,35 @@ var ChatGoogleBase = class extends BaseChatModel {
167
168
  if (chunk) await runManager?.handleLLMNewToken(chunk.text || "");
168
169
  return ret;
169
170
  }
171
+ async *_streamChatModelEvents(messages, options, _runManager) {
172
+ const parameters = this.invocationParams(options);
173
+ const stream = (await this.streamedConnection.request(messages, parameters, options, _runManager)).data;
174
+ const shouldStreamUsage = this.streamUsage !== false && options.streamUsage !== false;
175
+ async function* geminiChunks(jsonStream, signal) {
176
+ while (!jsonStream.streamDone) {
177
+ if (signal?.aborted) return;
178
+ const output = await jsonStream.nextChunk();
179
+ if (output !== null) yield output;
180
+ }
181
+ }
182
+ yield* convertGoogleGeminiStream(geminiChunks(stream, options.signal), { streamUsage: shouldStreamUsage });
183
+ }
170
184
  async *_streamResponseChunks(_messages, options, runManager) {
171
185
  const parameters = this.invocationParams(options);
172
186
  const stream = (await this.streamedConnection.request(_messages, parameters, options, runManager)).data;
173
- let usageMetadata;
187
+ const shouldStreamUsage = this.streamUsage !== false && options.streamUsage !== false;
174
188
  while (!stream.streamDone) {
175
189
  if (options.signal?.aborted) return;
176
190
  const output = await stream.nextChunk();
177
191
  await runManager?.handleCustomEvent(`google-chunk-${this.constructor.name}`, { output });
178
- if (output && output.usageMetadata && this.streamUsage !== false && options.streamUsage !== false) usageMetadata = {
179
- input_tokens: output.usageMetadata.promptTokenCount,
180
- output_tokens: output.usageMetadata.candidatesTokenCount,
181
- total_tokens: output.usageMetadata.totalTokenCount
182
- };
183
192
  const chunk = output !== null ? this.connection.api.responseToChatGeneration({ data: output }) : new ChatGenerationChunk({
184
193
  text: "",
185
194
  generationInfo: { finishReason: "stop" },
186
- message: new AIMessageChunk({
187
- content: "",
188
- usage_metadata: usageMetadata
189
- })
195
+ message: new AIMessageChunk({ content: "" })
196
+ });
197
+ if (shouldStreamUsage && chunk) chunk.message = new AIMessageChunk({
198
+ ...chunk.message,
199
+ usage_metadata: chunk.generationInfo?.usage_metadata
190
200
  });
191
201
  if (chunk) {
192
202
  yield chunk;
@@ -1 +1 @@
1
- {"version":3,"file":"chat_models.js","names":[],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { UsageMetadata, type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\n\nimport {\n BaseChatModel,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { AsyncCaller } from \"@langchain/core/utils/async_caller\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport {\n GoogleAIBaseLLMInput,\n GoogleAIModelParams,\n GoogleAISafetySetting,\n GoogleConnectionParams,\n GooglePlatformType,\n GeminiTool,\n GoogleAIBaseLanguageModelCallOptions,\n GoogleAIAPI,\n GoogleAIAPIParams,\n GoogleSearchToolSetting,\n GoogleSpeechConfig,\n GeminiJsonSchema,\n} from \"./types.js\";\nimport {\n convertToGeminiTools,\n copyAIModelParams,\n copyAndValidateModelParamsInto,\n} from \"./utils/common.js\";\nimport { AbstractGoogleLLMConnection } from \"./connection.js\";\nimport { DefaultGeminiSafetyHandler, getGeminiAPI } from \"./utils/gemini.js\";\nimport { ApiKeyGoogleAuth, GoogleAbstractedClient } from \"./auth.js\";\nimport { JsonStream } from \"./utils/stream.js\";\nimport { ensureParams } from \"./utils/failed_handler.js\";\nimport type {\n GoogleBaseLLMInput,\n GoogleAISafetyHandler,\n GoogleAISafetyParams,\n GeminiFunctionDeclaration,\n GeminiFunctionSchema,\n GoogleAIToolType,\n GeminiAPIConfig,\n GoogleAIModelModality,\n} from \"./types.js\";\nimport {\n removeAdditionalProperties,\n schemaToGeminiParameters,\n} from \"./utils/zod_to_gemini_parameters.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\nexport class ChatConnection<AuthOptions> extends AbstractGoogleLLMConnection<\n BaseMessage[],\n AuthOptions\n> {\n convertSystemMessageToHumanContent: boolean | undefined;\n\n constructor(\n fields: GoogleAIBaseLLMInput<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming: boolean\n ) {\n super(fields, caller, client, streaming);\n this.convertSystemMessageToHumanContent =\n fields?.convertSystemMessageToHumanContent;\n }\n\n get useSystemInstruction(): boolean {\n return typeof this.convertSystemMessageToHumanContent === \"boolean\"\n ? !this.convertSystemMessageToHumanContent\n : this.computeUseSystemInstruction;\n }\n\n get computeUseSystemInstruction(): boolean {\n // This works on models from April 2024 and later\n // Vertex AI: gemini-1.5-pro and gemini-1.0-002 and later\n // AI Studio: gemini-1.5-pro-latest\n if (this.modelFamily === \"palm\") {\n return false;\n } else if (this.modelName === \"gemini-1.0-pro-001\") {\n return false;\n } else if (this.modelName.startsWith(\"gemini-pro-vision\")) {\n return false;\n } else if (this.modelName.startsWith(\"gemini-1.0-pro-vision\")) {\n return false;\n } else if (this.modelName === \"gemini-pro\" && this.platform === \"gai\") {\n // on AI Studio gemini-pro is still pointing at gemini-1.0-pro-001\n return false;\n } else if (this.modelFamily === \"gemma\") {\n // At least as of 12 Mar 2025 gemma 3 on AIS, trying to use system instructions yields an error:\n // \"Developer instruction is not enabled for models/gemma-3-27b-it\"\n return false;\n }\n return true;\n }\n\n computeGoogleSearchToolAdjustmentFromModel(): Exclude<\n GoogleSearchToolSetting,\n boolean\n > {\n if (this.modelName.startsWith(\"gemini-1.0\")) {\n return \"googleSearchRetrieval\";\n } else if (this.modelName.startsWith(\"gemini-1.5\")) {\n return \"googleSearchRetrieval\";\n } else {\n return \"googleSearch\";\n }\n }\n\n computeGoogleSearchToolAdjustment(\n apiConfig: GeminiAPIConfig\n ): Exclude<GoogleSearchToolSetting, true> {\n const adj = apiConfig.googleSearchToolAdjustment;\n if (adj === undefined || adj === true) {\n return this.computeGoogleSearchToolAdjustmentFromModel();\n } else {\n return adj;\n }\n }\n\n buildGeminiAPI(): GoogleAIAPI {\n const apiConfig: GeminiAPIConfig =\n (this.apiConfig as GeminiAPIConfig) ?? {};\n const googleSearchToolAdjustment =\n this.computeGoogleSearchToolAdjustment(apiConfig);\n const geminiConfig: GeminiAPIConfig = {\n useSystemInstruction: this.useSystemInstruction,\n googleSearchToolAdjustment,\n ...apiConfig,\n };\n return getGeminiAPI(geminiConfig);\n }\n\n get api(): GoogleAIAPI {\n switch (this.apiName) {\n case \"google\":\n return this.buildGeminiAPI();\n default:\n return super.api;\n }\n }\n}\n\n/**\n * Input to chat model class.\n */\nexport interface ChatGoogleBaseInput<AuthOptions>\n extends\n BaseChatModelParams,\n GoogleConnectionParams<AuthOptions>,\n GoogleAIModelParams,\n GoogleAISafetyParams,\n GoogleAIAPIParams,\n Pick<GoogleAIBaseLanguageModelCallOptions, \"streamUsage\"> {}\n\n/**\n * Integration with a Google chat model.\n */\nexport abstract class ChatGoogleBase<AuthOptions>\n extends BaseChatModel<GoogleAIBaseLanguageModelCallOptions, AIMessageChunk>\n implements ChatGoogleBaseInput<AuthOptions>\n{\n // Used for tracing, replace with the same name as your class\n static lc_name() {\n return \"ChatGoogle\";\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n authOptions: \"GOOGLE_AUTH_OPTIONS\",\n };\n }\n\n lc_serializable = true;\n\n // Set based on modelName\n model: string;\n\n modelName = \"gemini-pro\";\n\n temperature: number;\n\n maxOutputTokens: number;\n\n maxReasoningTokens: number;\n\n topP: number;\n\n topK: number;\n\n seed: number;\n\n presencePenalty: number;\n\n frequencyPenalty: number;\n\n stopSequences: string[] = [];\n\n logprobs: boolean;\n\n topLogprobs: number = 0;\n\n safetySettings: GoogleAISafetySetting[] = [];\n\n responseModalities?: GoogleAIModelModality[];\n\n // May intentionally be undefined, meaning to compute this.\n convertSystemMessageToHumanContent: boolean | undefined;\n\n safetyHandler: GoogleAISafetyHandler;\n\n speechConfig: GoogleSpeechConfig;\n\n streamUsage = true;\n\n streaming = false;\n\n labels?: Record<string, string>;\n\n protected connection: ChatConnection<AuthOptions>;\n\n protected streamedConnection: ChatConnection<AuthOptions>;\n\n constructor(fields?: ChatGoogleBaseInput<AuthOptions>) {\n super(ensureParams(fields));\n this._addVersion(\"@langchain/google-common\", __PKG_VERSION__);\n\n copyAndValidateModelParamsInto(fields, this);\n this.safetyHandler =\n fields?.safetyHandler ?? new DefaultGeminiSafetyHandler();\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n const client = this.buildClient(fields);\n this.buildConnection(fields ?? {}, client);\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"google_vertexai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.maxOutputTokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n abstract buildAbstractedClient(\n fields?: GoogleAIBaseLLMInput<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: GoogleAIBaseLLMInput<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: GoogleAIBaseLLMInput<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n return this.buildAbstractedClient(fields);\n }\n }\n\n buildConnection(\n fields: GoogleBaseLLMInput<AuthOptions>,\n client: GoogleAbstractedClient\n ) {\n this.connection = new ChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n false\n );\n\n this.streamedConnection = new ChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n true\n );\n }\n\n get platform(): GooglePlatformType {\n return this.connection.platform;\n }\n\n override bindTools(\n tools: GoogleAIToolType[],\n kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>\n ): Runnable<\n BaseLanguageModelInput,\n AIMessageChunk,\n GoogleAIBaseLanguageModelCallOptions\n > {\n return this.withConfig({ tools: convertToGeminiTools(tools), ...kwargs });\n }\n\n _llmType() {\n return \"google\";\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return copyAIModelParams(this, options);\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager: CallbackManagerForLLMRun | undefined\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const parameters = this.invocationParams(options);\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (!finalChunk) {\n throw new Error(\"No chunks were returned from the stream.\");\n }\n return {\n generations: [finalChunk],\n };\n }\n\n const response = await this.connection.request(\n messages,\n parameters,\n options,\n runManager\n );\n const ret = this.connection.api.responseToChatResult(response);\n const chunk = ret?.generations?.[0];\n if (chunk) {\n await runManager?.handleLLMNewToken(chunk.text || \"\");\n }\n return ret;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n // Make the call as a streaming request\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n _messages,\n parameters,\n options,\n runManager\n );\n\n // Get the streaming parser of the response\n const stream = response.data as JsonStream;\n let usageMetadata: UsageMetadata | undefined;\n // Loop until the end of the stream\n // During the loop, yield each time we get a chunk from the streaming parser\n // that is either available or added to the queue\n while (!stream.streamDone) {\n if (options.signal?.aborted) {\n return;\n }\n const output = await stream.nextChunk();\n await runManager?.handleCustomEvent(\n `google-chunk-${this.constructor.name}`,\n {\n output,\n }\n );\n if (\n output &&\n output.usageMetadata &&\n this.streamUsage !== false &&\n options.streamUsage !== false\n ) {\n usageMetadata = {\n input_tokens: output.usageMetadata.promptTokenCount,\n output_tokens: output.usageMetadata.candidatesTokenCount,\n total_tokens: output.usageMetadata.totalTokenCount,\n };\n }\n const chunk =\n output !== null\n ? this.connection.api.responseToChatGeneration({ data: output })\n : new ChatGenerationChunk({\n text: \"\",\n generationInfo: { finishReason: \"stop\" },\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: usageMetadata,\n }),\n });\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n const schema = outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n\n if (method === \"jsonMode\") {\n throw new Error(\n `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n );\n }\n\n let llm: Runnable<BaseLanguageModelInput>;\n let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n if (method === \"functionCalling\") {\n let functionName = name ?? \"extract\";\n let geminiFunctionDeclaration: GeminiFunctionDeclaration;\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n parameters: jsonSchema as GeminiFunctionSchema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDeclaration = schema as GeminiFunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters, probably\n const parameters: GeminiJsonSchema = removeAdditionalProperties(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters,\n };\n }\n\n const tools: GeminiTool[] = [\n { functionDeclarations: [geminiFunctionDeclaration] },\n ];\n llm = this.bindTools(tools).withConfig({ tool_choice: functionName });\n\n outputParser = createFunctionCallingParser(schema, functionName);\n } else {\n // Default to jsonSchema method\n const jsonSchema = schemaToGeminiParameters(schema);\n llm = this.withConfig({\n responseSchema: jsonSchema as GeminiJsonSchema,\n });\n outputParser = createContentParser(schema);\n }\n\n return assembleStructuredOutputPipeline(\n llm,\n outputParser,\n includeRaw,\n includeRaw ? \"StructuredOutputRunnable\" : \"ChatGoogleStructuredOutput\"\n );\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"chat_models.js","names":[],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\nimport type { ChatModelStreamEvent } from \"@langchain/core/language_models/event\";\nimport { convertGoogleGeminiStream } from \"./utils/stream_events.js\";\nimport { JsonStream } from \"./utils/stream.js\";\n\nimport {\n BaseChatModel,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport { Runnable } from \"@langchain/core/runnables\";\nimport { AsyncCaller } from \"@langchain/core/utils/async_caller\";\nimport { concat } from \"@langchain/core/utils/stream\";\nimport {\n InteropZodType,\n isInteropZodSchema,\n} from \"@langchain/core/utils/types\";\nimport {\n GoogleAIBaseLLMInput,\n GoogleAIModelParams,\n GoogleAISafetySetting,\n GoogleConnectionParams,\n GooglePlatformType,\n GeminiTool,\n GoogleAIBaseLanguageModelCallOptions,\n GoogleAIAPI,\n GoogleAIAPIParams,\n GoogleSearchToolSetting,\n GoogleSpeechConfig,\n GeminiJsonSchema,\n} from \"./types.js\";\nimport {\n convertToGeminiTools,\n copyAIModelParams,\n copyAndValidateModelParamsInto,\n} from \"./utils/common.js\";\nimport { AbstractGoogleLLMConnection } from \"./connection.js\";\nimport { DefaultGeminiSafetyHandler, getGeminiAPI } from \"./utils/gemini.js\";\nimport { ApiKeyGoogleAuth, GoogleAbstractedClient } from \"./auth.js\";\nimport { ensureParams } from \"./utils/failed_handler.js\";\nimport type {\n GoogleBaseLLMInput,\n GoogleAISafetyHandler,\n GoogleAISafetyParams,\n GeminiFunctionDeclaration,\n GeminiFunctionSchema,\n GoogleAIToolType,\n GeminiAPIConfig,\n GoogleAIModelModality,\n} from \"./types.js\";\nimport {\n removeAdditionalProperties,\n schemaToGeminiParameters,\n} from \"./utils/zod_to_gemini_parameters.js\";\nimport PROFILES from \"./profiles.js\";\nimport {\n isSerializableSchema,\n SerializableSchema,\n} from \"@langchain/core/utils/standard_schema\";\nimport {\n assembleStructuredOutputPipeline,\n createContentParser,\n createFunctionCallingParser,\n} from \"@langchain/core/language_models/structured_output\";\n\nexport class ChatConnection<AuthOptions> extends AbstractGoogleLLMConnection<\n BaseMessage[],\n AuthOptions\n> {\n convertSystemMessageToHumanContent: boolean | undefined;\n\n constructor(\n fields: GoogleAIBaseLLMInput<AuthOptions> | undefined,\n caller: AsyncCaller,\n client: GoogleAbstractedClient,\n streaming: boolean\n ) {\n super(fields, caller, client, streaming);\n this.convertSystemMessageToHumanContent =\n fields?.convertSystemMessageToHumanContent;\n }\n\n get useSystemInstruction(): boolean {\n return typeof this.convertSystemMessageToHumanContent === \"boolean\"\n ? !this.convertSystemMessageToHumanContent\n : this.computeUseSystemInstruction;\n }\n\n get computeUseSystemInstruction(): boolean {\n // This works on models from April 2024 and later\n // Vertex AI: gemini-1.5-pro and gemini-1.0-002 and later\n // AI Studio: gemini-1.5-pro-latest\n if (this.modelFamily === \"palm\") {\n return false;\n } else if (this.modelName === \"gemini-1.0-pro-001\") {\n return false;\n } else if (this.modelName.startsWith(\"gemini-pro-vision\")) {\n return false;\n } else if (this.modelName.startsWith(\"gemini-1.0-pro-vision\")) {\n return false;\n } else if (this.modelName === \"gemini-pro\" && this.platform === \"gai\") {\n // on AI Studio gemini-pro is still pointing at gemini-1.0-pro-001\n return false;\n } else if (this.modelFamily === \"gemma\") {\n // At least as of 12 Mar 2025 gemma 3 on AIS, trying to use system instructions yields an error:\n // \"Developer instruction is not enabled for models/gemma-3-27b-it\"\n return false;\n }\n return true;\n }\n\n computeGoogleSearchToolAdjustmentFromModel(): Exclude<\n GoogleSearchToolSetting,\n boolean\n > {\n if (this.modelName.startsWith(\"gemini-1.0\")) {\n return \"googleSearchRetrieval\";\n } else if (this.modelName.startsWith(\"gemini-1.5\")) {\n return \"googleSearchRetrieval\";\n } else {\n return \"googleSearch\";\n }\n }\n\n computeGoogleSearchToolAdjustment(\n apiConfig: GeminiAPIConfig\n ): Exclude<GoogleSearchToolSetting, true> {\n const adj = apiConfig.googleSearchToolAdjustment;\n if (adj === undefined || adj === true) {\n return this.computeGoogleSearchToolAdjustmentFromModel();\n } else {\n return adj;\n }\n }\n\n buildGeminiAPI(): GoogleAIAPI {\n const apiConfig: GeminiAPIConfig =\n (this.apiConfig as GeminiAPIConfig) ?? {};\n const googleSearchToolAdjustment =\n this.computeGoogleSearchToolAdjustment(apiConfig);\n const geminiConfig: GeminiAPIConfig = {\n useSystemInstruction: this.useSystemInstruction,\n googleSearchToolAdjustment,\n ...apiConfig,\n };\n return getGeminiAPI(geminiConfig);\n }\n\n get api(): GoogleAIAPI {\n switch (this.apiName) {\n case \"google\":\n return this.buildGeminiAPI();\n default:\n return super.api;\n }\n }\n}\n\n/**\n * Input to chat model class.\n */\nexport interface ChatGoogleBaseInput<AuthOptions>\n extends\n BaseChatModelParams,\n GoogleConnectionParams<AuthOptions>,\n GoogleAIModelParams,\n GoogleAISafetyParams,\n GoogleAIAPIParams,\n Pick<GoogleAIBaseLanguageModelCallOptions, \"streamUsage\"> {}\n\n/**\n * Integration with a Google chat model.\n */\nexport abstract class ChatGoogleBase<AuthOptions>\n extends BaseChatModel<GoogleAIBaseLanguageModelCallOptions, AIMessageChunk>\n implements ChatGoogleBaseInput<AuthOptions>\n{\n // Used for tracing, replace with the same name as your class\n static lc_name() {\n return \"ChatGoogle\";\n }\n\n get lc_secrets(): { [key: string]: string } | undefined {\n return {\n authOptions: \"GOOGLE_AUTH_OPTIONS\",\n };\n }\n\n lc_serializable = true;\n\n // Set based on modelName\n model: string;\n\n modelName = \"gemini-pro\";\n\n temperature: number;\n\n maxOutputTokens: number;\n\n maxReasoningTokens: number;\n\n topP: number;\n\n topK: number;\n\n seed: number;\n\n presencePenalty: number;\n\n frequencyPenalty: number;\n\n stopSequences: string[] = [];\n\n logprobs: boolean;\n\n topLogprobs: number = 0;\n\n safetySettings: GoogleAISafetySetting[] = [];\n\n responseModalities?: GoogleAIModelModality[];\n\n // May intentionally be undefined, meaning to compute this.\n convertSystemMessageToHumanContent: boolean | undefined;\n\n safetyHandler: GoogleAISafetyHandler;\n\n speechConfig: GoogleSpeechConfig;\n\n streamUsage = true;\n\n streaming = false;\n\n labels?: Record<string, string>;\n\n protected connection: ChatConnection<AuthOptions>;\n\n protected streamedConnection: ChatConnection<AuthOptions>;\n\n constructor(fields?: ChatGoogleBaseInput<AuthOptions>) {\n super(ensureParams(fields));\n this._addVersion(\"@langchain/google-common\", __PKG_VERSION__);\n\n copyAndValidateModelParamsInto(fields, this);\n this.safetyHandler =\n fields?.safetyHandler ?? new DefaultGeminiSafetyHandler();\n this.streamUsage = fields?.streamUsage ?? this.streamUsage;\n const client = this.buildClient(fields);\n this.buildConnection(fields ?? {}, client);\n }\n\n getLsParams(options: this[\"ParsedCallOptions\"]): LangSmithParams {\n const params = this.invocationParams(options);\n return {\n ls_provider: \"google_vertexai\",\n ls_model_name: this.model,\n ls_model_type: \"chat\",\n ls_temperature: params.temperature ?? undefined,\n ls_max_tokens: params.maxOutputTokens ?? undefined,\n ls_stop: options.stop,\n };\n }\n\n abstract buildAbstractedClient(\n fields?: GoogleAIBaseLLMInput<AuthOptions>\n ): GoogleAbstractedClient;\n\n buildApiKeyClient(apiKey: string): GoogleAbstractedClient {\n return new ApiKeyGoogleAuth(apiKey);\n }\n\n buildApiKey(fields?: GoogleAIBaseLLMInput<AuthOptions>): string | undefined {\n return fields?.apiKey ?? getEnvironmentVariable(\"GOOGLE_API_KEY\");\n }\n\n buildClient(\n fields?: GoogleAIBaseLLMInput<AuthOptions>\n ): GoogleAbstractedClient {\n const apiKey = this.buildApiKey(fields);\n if (apiKey) {\n return this.buildApiKeyClient(apiKey);\n } else {\n return this.buildAbstractedClient(fields);\n }\n }\n\n buildConnection(\n fields: GoogleBaseLLMInput<AuthOptions>,\n client: GoogleAbstractedClient\n ) {\n this.connection = new ChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n false\n );\n\n this.streamedConnection = new ChatConnection(\n { ...fields, ...this },\n this.caller,\n client,\n true\n );\n }\n\n get platform(): GooglePlatformType {\n return this.connection.platform;\n }\n\n override bindTools(\n tools: GoogleAIToolType[],\n kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>\n ): Runnable<\n BaseLanguageModelInput,\n AIMessageChunk,\n GoogleAIBaseLanguageModelCallOptions\n > {\n return this.withConfig({ tools: convertToGeminiTools(tools), ...kwargs });\n }\n\n _llmType() {\n return \"google\";\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return copyAIModelParams(this, options);\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager: CallbackManagerForLLMRun | undefined\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const parameters = this.invocationParams(options);\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (!finalChunk) {\n throw new Error(\"No chunks were returned from the stream.\");\n }\n return {\n generations: [finalChunk],\n };\n }\n\n const response = await this.connection.request(\n messages,\n parameters,\n options,\n runManager\n );\n const ret = this.connection.api.responseToChatResult(response);\n const chunk = ret?.generations?.[0];\n if (chunk) {\n await runManager?.handleLLMNewToken(chunk.text || \"\");\n }\n return ret;\n }\n\n async *_streamChatModelEvents(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n _runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatModelStreamEvent> {\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n messages,\n parameters,\n options,\n _runManager\n );\n const stream = response.data as JsonStream;\n const shouldStreamUsage =\n this.streamUsage !== false && options.streamUsage !== false;\n async function* geminiChunks(jsonStream: JsonStream, signal?: AbortSignal) {\n while (!jsonStream.streamDone) {\n if (signal?.aborted) {\n return;\n }\n const output = await jsonStream.nextChunk();\n if (output !== null) {\n yield output;\n }\n }\n }\n yield* convertGoogleGeminiStream(geminiChunks(stream, options.signal), {\n streamUsage: shouldStreamUsage,\n });\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n // Make the call as a streaming request\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n _messages,\n parameters,\n options,\n runManager\n );\n\n // Get the streaming parser of the response\n const stream = response.data as JsonStream;\n const shouldStreamUsage =\n this.streamUsage !== false && options.streamUsage !== false;\n // Loop until the end of the stream\n // During the loop, yield each time we get a chunk from the streaming parser\n // that is either available or added to the queue\n while (!stream.streamDone) {\n if (options.signal?.aborted) {\n return;\n }\n const output = await stream.nextChunk();\n await runManager?.handleCustomEvent(\n `google-chunk-${this.constructor.name}`,\n {\n output,\n }\n );\n\n const chunk =\n output !== null\n ? this.connection.api.responseToChatGeneration({ data: output })\n : new ChatGenerationChunk({\n text: \"\",\n generationInfo: { finishReason: \"stop\" },\n message: new AIMessageChunk({\n content: \"\",\n }),\n });\n\n if (shouldStreamUsage && chunk) {\n chunk.message = new AIMessageChunk({\n ...chunk.message,\n usage_metadata: chunk.generationInfo?.usage_metadata,\n });\n }\n\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<true>\n ): Runnable<BaseLanguageModelInput, { raw: BaseMessage; parsed: RunOutput }>;\n\n withStructuredOutput<\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n | SerializableSchema<RunOutput>\n // oxlint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<boolean>\n ):\n | Runnable<BaseLanguageModelInput, RunOutput>\n | Runnable<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n > {\n const schema = outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n\n if (method === \"jsonMode\") {\n throw new Error(\n `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n );\n }\n\n let llm: Runnable<BaseLanguageModelInput>;\n let outputParser: Runnable<AIMessageChunk, RunOutput>;\n\n if (method === \"functionCalling\") {\n let functionName = name ?? \"extract\";\n let geminiFunctionDeclaration: GeminiFunctionDeclaration;\n if (isInteropZodSchema(schema) || isSerializableSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n parameters: jsonSchema as GeminiFunctionSchema,\n };\n } else if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDeclaration = schema as GeminiFunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters, probably\n const parameters: GeminiJsonSchema = removeAdditionalProperties(schema);\n geminiFunctionDeclaration = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters,\n };\n }\n\n const tools: GeminiTool[] = [\n { functionDeclarations: [geminiFunctionDeclaration] },\n ];\n llm = this.bindTools(tools).withConfig({ tool_choice: functionName });\n\n outputParser = createFunctionCallingParser(schema, functionName);\n } else {\n // Default to jsonSchema method\n const jsonSchema = schemaToGeminiParameters(schema);\n llm = this.withConfig({\n responseSchema: jsonSchema as GeminiJsonSchema,\n });\n outputParser = createContentParser(schema);\n }\n\n return assembleStructuredOutputPipeline(\n llm,\n outputParser,\n includeRaw,\n includeRaw ? \"StructuredOutputRunnable\" : \"ChatGoogleStructuredOutput\"\n );\n }\n}\n"],"mappings":"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"}