@langchain/google-common 2.1.31 → 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.
- package/CHANGELOG.md +12 -0
- package/README.md +2 -7
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.js.map +1 -1
- package/dist/chat_models.cjs +15 -1
- package/dist/chat_models.cjs.map +1 -1
- package/dist/chat_models.d.cts +2 -0
- package/dist/chat_models.d.cts.map +1 -1
- package/dist/chat_models.d.ts +2 -0
- package/dist/chat_models.d.ts.map +1 -1
- package/dist/chat_models.js +15 -1
- package/dist/chat_models.js.map +1 -1
- package/dist/connection.cjs.map +1 -1
- package/dist/connection.js.map +1 -1
- package/dist/embeddings.cjs.map +1 -1
- package/dist/embeddings.js.map +1 -1
- package/dist/experimental/media.cjs.map +1 -1
- package/dist/experimental/media.js.map +1 -1
- package/dist/experimental/utils/media_core.cjs.map +1 -1
- package/dist/experimental/utils/media_core.js.map +1 -1
- package/dist/index.cjs +2 -0
- package/dist/index.d.cts +2 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.js +2 -1
- package/dist/llms.cjs +1 -1
- package/dist/llms.cjs.map +1 -1
- package/dist/llms.js +1 -1
- package/dist/llms.js.map +1 -1
- package/dist/output_parsers.cjs.map +1 -1
- package/dist/output_parsers.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.d.cts +9 -2
- package/dist/types.d.cts.map +1 -1
- package/dist/types.d.ts +9 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/anthropic.cjs.map +1 -1
- package/dist/utils/anthropic.js.map +1 -1
- package/dist/utils/common.cjs.map +1 -1
- package/dist/utils/common.js.map +1 -1
- package/dist/utils/gemini.cjs +31 -8
- package/dist/utils/gemini.cjs.map +1 -1
- package/dist/utils/gemini.d.cts.map +1 -1
- package/dist/utils/gemini.d.ts.map +1 -1
- package/dist/utils/gemini.js +31 -8
- package/dist/utils/gemini.js.map +1 -1
- package/dist/utils/stream.cjs.map +1 -1
- package/dist/utils/stream.js.map +1 -1
- package/dist/utils/stream_events.cjs +173 -0
- package/dist/utils/stream_events.cjs.map +1 -0
- package/dist/utils/stream_events.d.cts +11 -0
- package/dist/utils/stream_events.d.cts.map +1 -0
- package/dist/utils/stream_events.d.ts +11 -0
- package/dist/utils/stream_events.d.ts.map +1 -0
- package/dist/utils/stream_events.js +173 -0
- package/dist/utils/stream_events.js.map +1 -0
- package/dist/utils/zod_to_gemini_parameters.cjs.map +1 -1
- package/dist/utils/zod_to_gemini_parameters.js.map +1 -1
- package/package.json +5 -5
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
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
|
+
|
|
3
15
|
## 2.1.31
|
|
4
16
|
|
|
5
17
|
### 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
|
-
##
|
|
45
|
+
## Planned Features
|
|
46
46
|
|
|
47
|
-
Tasks and services
|
|
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,
|
|
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,
|
|
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"}
|
package/dist/chat_models.cjs
CHANGED
|
@@ -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.
|
|
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,6 +168,19 @@ 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;
|
package/dist/chat_models.cjs.map
CHANGED
|
@@ -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 { 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 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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"}
|
|
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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"}
|
package/dist/chat_models.d.cts
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"chat_models.d.cts","names":[],"sources":["../src/chat_models.ts"],"mappings":"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"}
|
package/dist/chat_models.d.ts
CHANGED
|
@@ -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":"
|
|
1
|
+
{"version":3,"file":"chat_models.d.ts","names":[],"sources":["../src/chat_models.ts"],"mappings":"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"}
|
package/dist/chat_models.js
CHANGED
|
@@ -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.
|
|
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,6 +168,19 @@ 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;
|
package/dist/chat_models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
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\";\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 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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"}
|
|
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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"}
|