@langchain/google-common 2.1.15 → 2.1.16
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 +19 -0
- package/dist/auth.cjs +37 -11
- package/dist/auth.cjs.map +1 -1
- package/dist/auth.d.cts +10 -0
- package/dist/auth.d.cts.map +1 -1
- package/dist/auth.d.ts +10 -0
- package/dist/auth.d.ts.map +1 -1
- package/dist/auth.js +37 -11
- package/dist/auth.js.map +1 -1
- package/dist/chat_models.cjs.map +1 -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/experimental/media.cjs.map +1 -1
- package/dist/experimental/media.d.ts.map +1 -1
- package/dist/experimental/media.js.map +1 -1
- package/dist/types.cjs.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/gemini.cjs.map +1 -1
- package/dist/utils/gemini.js.map +1 -1
- package/package.json +6 -6
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @langchain/google-common
|
|
2
2
|
|
|
3
|
+
## 2.1.16
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [#9973](https://github.com/langchain-ai/langchainjs/pull/9973) [`5681181`](https://github.com/langchain-ai/langchainjs/commit/568118119f44cc4509a2c04dff2891230e874f46) Thanks [@hntrl](https://github.com/hntrl)! - fix(google-common): surface actual API error when GAuthClient's gaxios throws for non-2xx responses
|
|
8
|
+
|
|
9
|
+
Previously, when `GAuthClient._fetch` (via `google-auth-library`/gaxios) threw a `GaxiosError` for non-2xx
|
|
10
|
+
responses, the error bypassed `_request()`'s `!res.ok` formatting and propagated with an empty/undefined
|
|
11
|
+
message. Users saw "undefined" in their traces instead of the actual Google API error. This was particularly
|
|
12
|
+
impactful for `image_url`/`fileData` content where Gemini returns descriptive errors like
|
|
13
|
+
"Cannot fetch content from the provided URL" when it can't access the image.
|
|
14
|
+
|
|
15
|
+
The fix wraps `_fetch()` in a try/catch that extracts the status and response body from the thrown error and
|
|
16
|
+
re-throws with the same well-formatted message used by the existing `!res.ok` path. Both paths now funnel
|
|
17
|
+
through a shared `_throwRequestError()` helper.
|
|
18
|
+
|
|
19
|
+
- Updated dependencies [[`71c3cba`](https://github.com/langchain-ai/langchainjs/commit/71c3cba843ab16d877299d158a1de0c7d22f3fb9)]:
|
|
20
|
+
- @langchain/core@1.1.20
|
|
21
|
+
|
|
3
22
|
## 2.1.15
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
package/dist/auth.cjs
CHANGED
|
@@ -10,6 +10,18 @@ var GoogleAbstractedFetchClient = class {
|
|
|
10
10
|
default: return res.blob();
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Build and throw a standardised Google request error.
|
|
15
|
+
* Both the `!res.ok` path (native fetch) and the catch path (gaxios)
|
|
16
|
+
* funnel through here so the caller always sees the same shape.
|
|
17
|
+
*/
|
|
18
|
+
_throwRequestError(status, body, response, context) {
|
|
19
|
+
const message = body ? `Google request failed with status code ${status}: ${body}` : `Google request failed with status code ${status}`;
|
|
20
|
+
const error = new Error(message);
|
|
21
|
+
error.response = response;
|
|
22
|
+
error.details = context;
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
13
25
|
async _request(url, opts, additionalHeaders) {
|
|
14
26
|
if (url == null) throw new Error("Missing URL");
|
|
15
27
|
const fetchOptions = {
|
|
@@ -23,18 +35,32 @@ var GoogleAbstractedFetchClient = class {
|
|
|
23
35
|
};
|
|
24
36
|
if (opts.data !== void 0) if (typeof opts.data === "string") fetchOptions.body = opts.data;
|
|
25
37
|
else fetchOptions.body = JSON.stringify(opts.data);
|
|
26
|
-
const
|
|
38
|
+
const context = {
|
|
39
|
+
url,
|
|
40
|
+
opts,
|
|
41
|
+
fetchOptions
|
|
42
|
+
};
|
|
43
|
+
let res;
|
|
44
|
+
try {
|
|
45
|
+
res = await this._fetch(url, fetchOptions);
|
|
46
|
+
} catch (fetchError) {
|
|
47
|
+
const err = fetchError;
|
|
48
|
+
const status = err?.response?.status ?? err?.status;
|
|
49
|
+
if (status != null) {
|
|
50
|
+
let body;
|
|
51
|
+
if (err?.response?.data != null) {
|
|
52
|
+
if (typeof err.response.data === "string") body = err.response.data;
|
|
53
|
+
else if (typeof err.response.data === "object") try {
|
|
54
|
+
body = JSON.stringify(err.response.data);
|
|
55
|
+
} catch {}
|
|
56
|
+
}
|
|
57
|
+
this._throwRequestError(status, body, err?.response ?? { status }, context);
|
|
58
|
+
}
|
|
59
|
+
throw fetchError;
|
|
60
|
+
}
|
|
27
61
|
if (!res.ok) {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
error.response = res;
|
|
31
|
-
error.details = {
|
|
32
|
-
url,
|
|
33
|
-
opts,
|
|
34
|
-
fetchOptions,
|
|
35
|
-
result: res
|
|
36
|
-
};
|
|
37
|
-
throw error;
|
|
62
|
+
const body = await res.text();
|
|
63
|
+
this._throwRequestError(res.status, body, res, context);
|
|
38
64
|
}
|
|
39
65
|
const data = await this._buildData(res, opts);
|
|
40
66
|
return {
|
package/dist/auth.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.cjs","names":["res: Response","opts: GoogleAbstractedClientOps","ReadableJsonStream","url: string | undefined","additionalHeaders: Record<string, string>","fetchOptions: {\n method?: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n }","apiKey: string","platform: GooglePlatformType","authOption: AuthOptions | undefined","scopeProperty: string","scopesOrPlatform: string[] | GooglePlatformType | undefined","scopes: string[]"],"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
|
|
1
|
+
{"version":3,"file":"auth.cjs","names":["res: Response","opts: GoogleAbstractedClientOps","ReadableJsonStream","status: number","body: string | undefined","response: unknown","context: {\n url: string;\n opts: GoogleAbstractedClientOps;\n fetchOptions?: Record<string, unknown>;\n }","url: string | undefined","additionalHeaders: Record<string, string>","fetchOptions: {\n method?: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n }","apiKey: string","platform: GooglePlatformType","authOption: AuthOptions | undefined","scopeProperty: string","scopesOrPlatform: string[] | GooglePlatformType | undefined","scopes: string[]"],"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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).response = response;\n // eslint-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 /* eslint-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,WAAWA,KAAeC,MAAiC;AAC/D,UAAQ,KAAK,cAAb;GACE,KAAK,OACH,QAAO,IAAI,MAAM;GACnB,KAAK,SACH,QAAO,IAAIC,kCAAmB,IAAI;GACpC,QACE,QAAO,IAAI,MAAM;EACpB;CACF;;;;;;CAOD,AAAU,mBACRC,QACAC,MACAC,UACAC,SAKO;EACP,MAAM,UAAU,OACZ,CAAC,uCAAuC,EAAE,OAAO,EAAE,EAAE,MAAM,GAC3D,CAAC,uCAAuC,EAAE,QAAQ;EACtD,MAAM,QAAQ,IAAI,MAAM;EAEvB,MAAc,WAAW;EAEzB,MAAc,UAAU;AACzB,QAAM;CACP;CAED,MAAM,SACJC,KACAN,MACAO,mBACA;AACA,MAAI,OAAO,KAAM,OAAM,IAAI,MAAM;EACjC,MAAMC,eAKF;GACF,QAAQ,KAAK;GACb,SAAS;IACP,gBAAgB;IAChB,GAAI,KAAK,WAAW,CAAE;IACtB,GAAI,qBAAqB,CAAE;GAC5B;GACD,QAAQ,KAAK;EACd;AACD,MAAI,KAAK,SAAS,OAChB,KAAI,OAAO,KAAK,SAAS,UACvB,aAAa,OAAO,KAAK;OAEzB,aAAa,OAAO,KAAK,UAAU,KAAK,KAAK;EAIjD,MAAM,UAAU;GAAE;GAAK;GAAM;EAAc;EAE3C,IAAIT;AACJ,MAAI;GACF,MAAM,MAAM,KAAK,OAAO,KAAK,aAAa;EAC3C,SAAQ,YAAY;GAMnB,MAAM,MAAM;GACZ,MAAM,SAAS,KAAK,UAAU,UAAU,KAAK;AAE7C,OAAI,UAAU,MAAM;IAClB,IAAII;AAEJ,QAAI,KAAK,UAAU,QAAQ,MACzB;SAAI,OAAO,IAAI,SAAS,SAAS,UAC/B,OAAO,IAAI,SAAS;cACX,OAAO,IAAI,SAAS,SAAS,SACtC,KAAI;MACF,OAAO,KAAK,UAAU,IAAI,SAAS,KAAK;KACzC,QAAO,CAEP;IACF;IAGH,KAAK,mBACH,QACA,MACA,KAAK,YAAY,EAAE,OAAQ,GAC3B,QACD;GACF;AAGD,SAAM;EAEP;AAED,MAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,MAAM;GAC7B,KAAK,mBAAmB,IAAI,QAAQ,MAAM,KAAK,QAAQ;EACxD;EAED,MAAM,OAAO,MAAM,KAAK,WAAW,KAAK,KAAK;AAC7C,SAAO;GACL;GACA,QAAQ,CAAE;GACV,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,SAAS,EAAE,aAAa,IAAI,IAAK;EAClC;CACF;AACF;AAED,IAAa,mBAAb,cAAsC,4BAA4B;CAChE;CAEA,YAAYM,QAAgB;EAC1B,OAAO;EACP,KAAK,SAAS;CACf;CAED,IAAI,aAAqB;AACvB,SAAO;CACR;CAED,eAAgC;AAC9B,QAAM,IAAI,MAAM;CAGjB;CAED,QAAQT,MAA0C;EAChD,MAAM,aAAa,EACjB,kBAAkB,KAAK,OACxB;AACD,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,WAAW;CACjD;AACF;AAED,SAAgB,gBAAgBU,UAAwC;AACtE,SAAQ,UAAR;EACE,KAAK,MACH,QAAO,CAAC,qDAAsD;EAChE,QACE,QAAO,CAAC,gDAAiD;CAC5D;AACF;AAED,SAAgB,uBACdC,YACAC,eACAC,kBACa;AAEb,KAAI,cAAc,OAAO,OAAO,YAAY,cAAc,CACxD,QAAO;CAIT,MAAMC,SAAmB,MAAM,QAAQ,iBAAiB,GACnD,mBACD,gBAAgB,oBAAoB,MAAM;AAC9C,QAAO;GACJ,gBAAgB;EACjB,GAAI,cAAc,CAAE;CACrB;AACF"}
|
package/dist/auth.d.cts
CHANGED
|
@@ -22,6 +22,16 @@ declare abstract class GoogleAbstractedFetchClient implements GoogleAbstractedCl
|
|
|
22
22
|
abstract request(opts: GoogleAbstractedClientOps): unknown;
|
|
23
23
|
_fetch: typeof fetch;
|
|
24
24
|
_buildData(res: Response, opts: GoogleAbstractedClientOps): Promise<any>;
|
|
25
|
+
/**
|
|
26
|
+
* Build and throw a standardised Google request error.
|
|
27
|
+
* Both the `!res.ok` path (native fetch) and the catch path (gaxios)
|
|
28
|
+
* funnel through here so the caller always sees the same shape.
|
|
29
|
+
*/
|
|
30
|
+
protected _throwRequestError(status: number, body: string | undefined, response: unknown, context: {
|
|
31
|
+
url: string;
|
|
32
|
+
opts: GoogleAbstractedClientOps;
|
|
33
|
+
fetchOptions?: Record<string, unknown>;
|
|
34
|
+
}): never;
|
|
25
35
|
_request(url: string | undefined, opts: GoogleAbstractedClientOps, additionalHeaders: Record<string, string>): Promise<{
|
|
26
36
|
data: any;
|
|
27
37
|
config: {};
|
package/dist/auth.d.cts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.cts","names":["GooglePlatformType","GoogleAbstractedClientOpsMethod","GoogleAbstractedClientOpsResponseType","GoogleAbstractedClientOps","Record","AbortSignal","GoogleAbstractedClient","Promise","GoogleAbstractedFetchClient","fetch","Response","Headers","ApiKeyGoogleAuth","aiPlatformScope","ensureAuthOptionScopes","AuthOptions"],"sources":["../src/auth.d.ts"],"sourcesContent":["import { GooglePlatformType } from \"./types.js\";\nexport type GoogleAbstractedClientOpsMethod = \"GET\" | \"POST\" | \"DELETE\";\nexport type GoogleAbstractedClientOpsResponseType = \"json\" | \"stream\" | \"blob\";\nexport type GoogleAbstractedClientOps = {\n url?: string;\n method?: GoogleAbstractedClientOpsMethod;\n headers?: Record<string, string>;\n data?: unknown;\n responseType?: GoogleAbstractedClientOpsResponseType;\n signal?: AbortSignal;\n};\nexport interface GoogleAbstractedClient {\n request: (opts: GoogleAbstractedClientOps) => unknown;\n getProjectId: () => Promise<string>;\n get clientType(): string;\n}\nexport declare abstract class GoogleAbstractedFetchClient implements GoogleAbstractedClient {\n abstract get clientType(): string;\n abstract getProjectId(): Promise<string>;\n abstract request(opts: GoogleAbstractedClientOps): unknown;\n _fetch: typeof fetch;\n _buildData(res: Response, opts: GoogleAbstractedClientOps): Promise<any>;\n _request(url: string | undefined, opts: GoogleAbstractedClientOps, additionalHeaders: Record<string, string>): Promise<{\n data: any;\n config: {};\n status: number;\n statusText: string;\n headers: Headers;\n request: {\n responseURL: string;\n };\n }>;\n}\nexport declare class ApiKeyGoogleAuth extends GoogleAbstractedFetchClient {\n apiKey: string;\n constructor(apiKey: string);\n get clientType(): string;\n getProjectId(): Promise<string>;\n request(opts: GoogleAbstractedClientOps): unknown;\n}\nexport declare function aiPlatformScope(platform: GooglePlatformType): string[];\nexport declare function ensureAuthOptionScopes<AuthOptions>(authOption: AuthOptions | undefined, scopeProperty: string, scopesOrPlatform: string[] | GooglePlatformType | undefined): AuthOptions;\n//# sourceMappingURL=auth.d.ts.map"],"mappings":";;;KACYC,+BAAAA;KACAC,qCAAAA;AADAD,KAEAE,yBAAAA,GAF+B;EAC/BD,GAAAA,CAAAA,EAAAA,MAAAA;EACAC,MAAAA,CAAAA,EAECF,+BAFwB;EAExBA,OAAAA,CAAAA,EACCG,MADDH,CAAAA,MAAAA,EAAAA,MAAAA,CAAAA;EACCG,IAAAA,CAAAA,EAAAA,OAAAA;EAEKF,YAAAA,CAAAA,EAAAA,qCAAAA;EACNG,MAAAA,CAAAA,EAAAA,WAAAA;AAAW,CAAA;AAEPC,UAAAA,sBAAAA,CAAsB;EAKTE,OAAAA,EAAAA,CAAAA,IAAAA,EAJVL,yBAIqC,EAAA,GAAA,OAAA;EAE5BI,YAAAA,EAAAA,GAAAA,GALLA,OAKKA,CAAAA,MAAAA,CAAAA;EACFJ,IAAAA,UAAAA,EAAAA,EAAAA,MAAAA;;AAEPO,uBALUF,2BAAAA,YAAuCF,sBAKjDI,CAAAA;EAAgBP,aAAAA,UAAAA,CAAAA,CAAAA,EAAAA,MAAAA;EAA4BI,SAAAA,YAAAA,CAAAA,CAAAA,EAHnCA,OAGmCA,CAAAA,MAAAA,CAAAA;
|
|
1
|
+
{"version":3,"file":"auth.d.cts","names":["GooglePlatformType","GoogleAbstractedClientOpsMethod","GoogleAbstractedClientOpsResponseType","GoogleAbstractedClientOps","Record","AbortSignal","GoogleAbstractedClient","Promise","GoogleAbstractedFetchClient","fetch","Response","Headers","ApiKeyGoogleAuth","aiPlatformScope","ensureAuthOptionScopes","AuthOptions"],"sources":["../src/auth.d.ts"],"sourcesContent":["import { GooglePlatformType } from \"./types.js\";\nexport type GoogleAbstractedClientOpsMethod = \"GET\" | \"POST\" | \"DELETE\";\nexport type GoogleAbstractedClientOpsResponseType = \"json\" | \"stream\" | \"blob\";\nexport type GoogleAbstractedClientOps = {\n url?: string;\n method?: GoogleAbstractedClientOpsMethod;\n headers?: Record<string, string>;\n data?: unknown;\n responseType?: GoogleAbstractedClientOpsResponseType;\n signal?: AbortSignal;\n};\nexport interface GoogleAbstractedClient {\n request: (opts: GoogleAbstractedClientOps) => unknown;\n getProjectId: () => Promise<string>;\n get clientType(): string;\n}\nexport declare abstract class GoogleAbstractedFetchClient implements GoogleAbstractedClient {\n abstract get clientType(): string;\n abstract getProjectId(): Promise<string>;\n abstract request(opts: GoogleAbstractedClientOps): unknown;\n _fetch: typeof fetch;\n _buildData(res: Response, opts: GoogleAbstractedClientOps): Promise<any>;\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(status: number, body: string | undefined, response: unknown, context: {\n url: string;\n opts: GoogleAbstractedClientOps;\n fetchOptions?: Record<string, unknown>;\n }): never;\n _request(url: string | undefined, opts: GoogleAbstractedClientOps, additionalHeaders: Record<string, string>): Promise<{\n data: any;\n config: {};\n status: number;\n statusText: string;\n headers: Headers;\n request: {\n responseURL: string;\n };\n }>;\n}\nexport declare class ApiKeyGoogleAuth extends GoogleAbstractedFetchClient {\n apiKey: string;\n constructor(apiKey: string);\n get clientType(): string;\n getProjectId(): Promise<string>;\n request(opts: GoogleAbstractedClientOps): unknown;\n}\nexport declare function aiPlatformScope(platform: GooglePlatformType): string[];\nexport declare function ensureAuthOptionScopes<AuthOptions>(authOption: AuthOptions | undefined, scopeProperty: string, scopesOrPlatform: string[] | GooglePlatformType | undefined): AuthOptions;\n//# sourceMappingURL=auth.d.ts.map"],"mappings":";;;KACYC,+BAAAA;KACAC,qCAAAA;AADAD,KAEAE,yBAAAA,GAF+B;EAC/BD,GAAAA,CAAAA,EAAAA,MAAAA;EACAC,MAAAA,CAAAA,EAECF,+BAFwB;EAExBA,OAAAA,CAAAA,EACCG,MADDH,CAAAA,MAAAA,EAAAA,MAAAA,CAAAA;EACCG,IAAAA,CAAAA,EAAAA,OAAAA;EAEKF,YAAAA,CAAAA,EAAAA,qCAAAA;EACNG,MAAAA,CAAAA,EAAAA,WAAAA;AAAW,CAAA;AAEPC,UAAAA,sBAAAA,CAAsB;EAKTE,OAAAA,EAAAA,CAAAA,IAAAA,EAJVL,yBAIqC,EAAA,GAAA,OAAA;EAE5BI,YAAAA,EAAAA,GAAAA,GALLA,OAKKA,CAAAA,MAAAA,CAAAA;EACFJ,IAAAA,UAAAA,EAAAA,EAAAA,MAAAA;;AAEPO,uBALUF,2BAAAA,YAAuCF,sBAKjDI,CAAAA;EAAgBP,aAAAA,UAAAA,CAAAA,CAAAA,EAAAA,MAAAA;EAA4BI,SAAAA,YAAAA,CAAAA,CAAAA,EAHnCA,OAGmCA,CAAAA,MAAAA,CAAAA;EAQlDJ,SAAAA,OAAAA,CAAAA,IAAAA,EAVaA,yBAUbA,CAAAA,EAAAA,OAAAA;EACSC,MAAAA,EAAAA,OAVJK,KAUIL;EAEqBD,UAAAA,CAAAA,GAAAA,EAXxBO,QAWwBP,EAAAA,IAAAA,EAXRA,yBAWQA,CAAAA,EAXoBI,OAWpBJ,CAAAA,GAAAA,CAAAA;EAA8CC;;;;AAhBC;EA2BtEQ,UAAAA,kBAAgB,CAAA,MAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,GAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,OAAA,EAAA;IAIjBL,GAAAA,EAAAA,MAAAA;IACFJ,IAAAA,EAnBJA,yBAmBIA;IAL4BK,YAAAA,CAAAA,EAbvBJ,MAauBI,CAAAA,MAAAA,EAAAA,OAAAA,CAAAA;EAA2B,CAAA,CAAA,EAAA,KAAA;EAOjDK,QAAAA,CAAAA,GAAAA,EAAAA,MAAe,GAAA,SAAWb,EAAAA,IAAAA,EAlBNG,yBAkBwB,EAAA,iBAAA,EAlBsBC,MAkBtB,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA,EAlB+CG,OAkB/C,CAAA;IAC5CO,IAAAA,EAAAA,GAAAA;IAAgDC,MAAAA,EAAAA,CAAAA,CAAAA;IAA6Ef,MAAAA,EAAAA,MAAAA;IAAiCe,UAAAA,EAAAA,MAAAA;IAAW,OAAA,EAdhLJ,OAcgL;;;;;;cAR5KC,gBAAAA,SAAyBJ,2BAAAA;;;;kBAI1BD;gBACFJ;;iBAEMU,eAAAA,WAA0Bb;iBAC1Bc,gDAAgDC,6EAA6Ef,iCAAiCe"}
|
package/dist/auth.d.ts
CHANGED
|
@@ -22,6 +22,16 @@ declare abstract class GoogleAbstractedFetchClient implements GoogleAbstractedCl
|
|
|
22
22
|
abstract request(opts: GoogleAbstractedClientOps): unknown;
|
|
23
23
|
_fetch: typeof fetch;
|
|
24
24
|
_buildData(res: Response, opts: GoogleAbstractedClientOps): Promise<any>;
|
|
25
|
+
/**
|
|
26
|
+
* Build and throw a standardised Google request error.
|
|
27
|
+
* Both the `!res.ok` path (native fetch) and the catch path (gaxios)
|
|
28
|
+
* funnel through here so the caller always sees the same shape.
|
|
29
|
+
*/
|
|
30
|
+
protected _throwRequestError(status: number, body: string | undefined, response: unknown, context: {
|
|
31
|
+
url: string;
|
|
32
|
+
opts: GoogleAbstractedClientOps;
|
|
33
|
+
fetchOptions?: Record<string, unknown>;
|
|
34
|
+
}): never;
|
|
25
35
|
_request(url: string | undefined, opts: GoogleAbstractedClientOps, additionalHeaders: Record<string, string>): Promise<{
|
|
26
36
|
data: any;
|
|
27
37
|
config: {};
|
package/dist/auth.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.d.ts","names":["GooglePlatformType","GoogleAbstractedClientOpsMethod","GoogleAbstractedClientOpsResponseType","GoogleAbstractedClientOps","Record","AbortSignal","GoogleAbstractedClient","Promise","GoogleAbstractedFetchClient","fetch","Response","Headers","ApiKeyGoogleAuth","aiPlatformScope","ensureAuthOptionScopes","AuthOptions"],"sources":["../src/auth.d.ts"],"sourcesContent":["import { GooglePlatformType } from \"./types.js\";\nexport type GoogleAbstractedClientOpsMethod = \"GET\" | \"POST\" | \"DELETE\";\nexport type GoogleAbstractedClientOpsResponseType = \"json\" | \"stream\" | \"blob\";\nexport type GoogleAbstractedClientOps = {\n url?: string;\n method?: GoogleAbstractedClientOpsMethod;\n headers?: Record<string, string>;\n data?: unknown;\n responseType?: GoogleAbstractedClientOpsResponseType;\n signal?: AbortSignal;\n};\nexport interface GoogleAbstractedClient {\n request: (opts: GoogleAbstractedClientOps) => unknown;\n getProjectId: () => Promise<string>;\n get clientType(): string;\n}\nexport declare abstract class GoogleAbstractedFetchClient implements GoogleAbstractedClient {\n abstract get clientType(): string;\n abstract getProjectId(): Promise<string>;\n abstract request(opts: GoogleAbstractedClientOps): unknown;\n _fetch: typeof fetch;\n _buildData(res: Response, opts: GoogleAbstractedClientOps): Promise<any>;\n _request(url: string | undefined, opts: GoogleAbstractedClientOps, additionalHeaders: Record<string, string>): Promise<{\n data: any;\n config: {};\n status: number;\n statusText: string;\n headers: Headers;\n request: {\n responseURL: string;\n };\n }>;\n}\nexport declare class ApiKeyGoogleAuth extends GoogleAbstractedFetchClient {\n apiKey: string;\n constructor(apiKey: string);\n get clientType(): string;\n getProjectId(): Promise<string>;\n request(opts: GoogleAbstractedClientOps): unknown;\n}\nexport declare function aiPlatformScope(platform: GooglePlatformType): string[];\nexport declare function ensureAuthOptionScopes<AuthOptions>(authOption: AuthOptions | undefined, scopeProperty: string, scopesOrPlatform: string[] | GooglePlatformType | undefined): AuthOptions;\n//# sourceMappingURL=auth.d.ts.map"],"mappings":";;;KACYC,+BAAAA;KACAC,qCAAAA;AADAD,KAEAE,yBAAAA,GAF+B;EAC/BD,GAAAA,CAAAA,EAAAA,MAAAA;EACAC,MAAAA,CAAAA,EAECF,+BAFwB;EAExBA,OAAAA,CAAAA,EACCG,MADDH,CAAAA,MAAAA,EAAAA,MAAAA,CAAAA;EACCG,IAAAA,CAAAA,EAAAA,OAAAA;EAEKF,YAAAA,CAAAA,EAAAA,qCAAAA;EACNG,MAAAA,CAAAA,EAAAA,WAAAA;AAAW,CAAA;AAEPC,UAAAA,sBAAAA,CAAsB;EAKTE,OAAAA,EAAAA,CAAAA,IAAAA,EAJVL,yBAIqC,EAAA,GAAA,OAAA;EAE5BI,YAAAA,EAAAA,GAAAA,GALLA,OAKKA,CAAAA,MAAAA,CAAAA;EACFJ,IAAAA,UAAAA,EAAAA,EAAAA,MAAAA;;AAEPO,uBALUF,2BAAAA,YAAuCF,sBAKjDI,CAAAA;EAAgBP,aAAAA,UAAAA,CAAAA,CAAAA,EAAAA,MAAAA;EAA4BI,SAAAA,YAAAA,CAAAA,CAAAA,EAHnCA,OAGmCA,CAAAA,MAAAA,CAAAA;
|
|
1
|
+
{"version":3,"file":"auth.d.ts","names":["GooglePlatformType","GoogleAbstractedClientOpsMethod","GoogleAbstractedClientOpsResponseType","GoogleAbstractedClientOps","Record","AbortSignal","GoogleAbstractedClient","Promise","GoogleAbstractedFetchClient","fetch","Response","Headers","ApiKeyGoogleAuth","aiPlatformScope","ensureAuthOptionScopes","AuthOptions"],"sources":["../src/auth.d.ts"],"sourcesContent":["import { GooglePlatformType } from \"./types.js\";\nexport type GoogleAbstractedClientOpsMethod = \"GET\" | \"POST\" | \"DELETE\";\nexport type GoogleAbstractedClientOpsResponseType = \"json\" | \"stream\" | \"blob\";\nexport type GoogleAbstractedClientOps = {\n url?: string;\n method?: GoogleAbstractedClientOpsMethod;\n headers?: Record<string, string>;\n data?: unknown;\n responseType?: GoogleAbstractedClientOpsResponseType;\n signal?: AbortSignal;\n};\nexport interface GoogleAbstractedClient {\n request: (opts: GoogleAbstractedClientOps) => unknown;\n getProjectId: () => Promise<string>;\n get clientType(): string;\n}\nexport declare abstract class GoogleAbstractedFetchClient implements GoogleAbstractedClient {\n abstract get clientType(): string;\n abstract getProjectId(): Promise<string>;\n abstract request(opts: GoogleAbstractedClientOps): unknown;\n _fetch: typeof fetch;\n _buildData(res: Response, opts: GoogleAbstractedClientOps): Promise<any>;\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(status: number, body: string | undefined, response: unknown, context: {\n url: string;\n opts: GoogleAbstractedClientOps;\n fetchOptions?: Record<string, unknown>;\n }): never;\n _request(url: string | undefined, opts: GoogleAbstractedClientOps, additionalHeaders: Record<string, string>): Promise<{\n data: any;\n config: {};\n status: number;\n statusText: string;\n headers: Headers;\n request: {\n responseURL: string;\n };\n }>;\n}\nexport declare class ApiKeyGoogleAuth extends GoogleAbstractedFetchClient {\n apiKey: string;\n constructor(apiKey: string);\n get clientType(): string;\n getProjectId(): Promise<string>;\n request(opts: GoogleAbstractedClientOps): unknown;\n}\nexport declare function aiPlatformScope(platform: GooglePlatformType): string[];\nexport declare function ensureAuthOptionScopes<AuthOptions>(authOption: AuthOptions | undefined, scopeProperty: string, scopesOrPlatform: string[] | GooglePlatformType | undefined): AuthOptions;\n//# sourceMappingURL=auth.d.ts.map"],"mappings":";;;KACYC,+BAAAA;KACAC,qCAAAA;AADAD,KAEAE,yBAAAA,GAF+B;EAC/BD,GAAAA,CAAAA,EAAAA,MAAAA;EACAC,MAAAA,CAAAA,EAECF,+BAFwB;EAExBA,OAAAA,CAAAA,EACCG,MADDH,CAAAA,MAAAA,EAAAA,MAAAA,CAAAA;EACCG,IAAAA,CAAAA,EAAAA,OAAAA;EAEKF,YAAAA,CAAAA,EAAAA,qCAAAA;EACNG,MAAAA,CAAAA,EAAAA,WAAAA;AAAW,CAAA;AAEPC,UAAAA,sBAAAA,CAAsB;EAKTE,OAAAA,EAAAA,CAAAA,IAAAA,EAJVL,yBAIqC,EAAA,GAAA,OAAA;EAE5BI,YAAAA,EAAAA,GAAAA,GALLA,OAKKA,CAAAA,MAAAA,CAAAA;EACFJ,IAAAA,UAAAA,EAAAA,EAAAA,MAAAA;;AAEPO,uBALUF,2BAAAA,YAAuCF,sBAKjDI,CAAAA;EAAgBP,aAAAA,UAAAA,CAAAA,CAAAA,EAAAA,MAAAA;EAA4BI,SAAAA,YAAAA,CAAAA,CAAAA,EAHnCA,OAGmCA,CAAAA,MAAAA,CAAAA;EAQlDJ,SAAAA,OAAAA,CAAAA,IAAAA,EAVaA,yBAUbA,CAAAA,EAAAA,OAAAA;EACSC,MAAAA,EAAAA,OAVJK,KAUIL;EAEqBD,UAAAA,CAAAA,GAAAA,EAXxBO,QAWwBP,EAAAA,IAAAA,EAXRA,yBAWQA,CAAAA,EAXoBI,OAWpBJ,CAAAA,GAAAA,CAAAA;EAA8CC;;;;AAhBC;EA2BtEQ,UAAAA,kBAAgB,CAAA,MAAA,EAAA,MAAA,EAAA,IAAA,EAAA,MAAA,GAAA,SAAA,EAAA,QAAA,EAAA,OAAA,EAAA,OAAA,EAAA;IAIjBL,GAAAA,EAAAA,MAAAA;IACFJ,IAAAA,EAnBJA,yBAmBIA;IAL4BK,YAAAA,CAAAA,EAbvBJ,MAauBI,CAAAA,MAAAA,EAAAA,OAAAA,CAAAA;EAA2B,CAAA,CAAA,EAAA,KAAA;EAOjDK,QAAAA,CAAAA,GAAAA,EAAAA,MAAe,GAAA,SAAWb,EAAAA,IAAAA,EAlBNG,yBAkBwB,EAAA,iBAAA,EAlBsBC,MAkBtB,CAAA,MAAA,EAAA,MAAA,CAAA,CAAA,EAlB+CG,OAkB/C,CAAA;IAC5CO,IAAAA,EAAAA,GAAAA;IAAgDC,MAAAA,EAAAA,CAAAA,CAAAA;IAA6Ef,MAAAA,EAAAA,MAAAA;IAAiCe,UAAAA,EAAAA,MAAAA;IAAW,OAAA,EAdhLJ,OAcgL;;;;;;cAR5KC,gBAAAA,SAAyBJ,2BAAAA;;;;kBAI1BD;gBACFJ;;iBAEMU,eAAAA,WAA0Bb;iBAC1Bc,gDAAgDC,6EAA6Ef,iCAAiCe"}
|
package/dist/auth.js
CHANGED
|
@@ -10,6 +10,18 @@ var GoogleAbstractedFetchClient = class {
|
|
|
10
10
|
default: return res.blob();
|
|
11
11
|
}
|
|
12
12
|
}
|
|
13
|
+
/**
|
|
14
|
+
* Build and throw a standardised Google request error.
|
|
15
|
+
* Both the `!res.ok` path (native fetch) and the catch path (gaxios)
|
|
16
|
+
* funnel through here so the caller always sees the same shape.
|
|
17
|
+
*/
|
|
18
|
+
_throwRequestError(status, body, response, context) {
|
|
19
|
+
const message = body ? `Google request failed with status code ${status}: ${body}` : `Google request failed with status code ${status}`;
|
|
20
|
+
const error = new Error(message);
|
|
21
|
+
error.response = response;
|
|
22
|
+
error.details = context;
|
|
23
|
+
throw error;
|
|
24
|
+
}
|
|
13
25
|
async _request(url, opts, additionalHeaders) {
|
|
14
26
|
if (url == null) throw new Error("Missing URL");
|
|
15
27
|
const fetchOptions = {
|
|
@@ -23,18 +35,32 @@ var GoogleAbstractedFetchClient = class {
|
|
|
23
35
|
};
|
|
24
36
|
if (opts.data !== void 0) if (typeof opts.data === "string") fetchOptions.body = opts.data;
|
|
25
37
|
else fetchOptions.body = JSON.stringify(opts.data);
|
|
26
|
-
const
|
|
38
|
+
const context = {
|
|
39
|
+
url,
|
|
40
|
+
opts,
|
|
41
|
+
fetchOptions
|
|
42
|
+
};
|
|
43
|
+
let res;
|
|
44
|
+
try {
|
|
45
|
+
res = await this._fetch(url, fetchOptions);
|
|
46
|
+
} catch (fetchError) {
|
|
47
|
+
const err = fetchError;
|
|
48
|
+
const status = err?.response?.status ?? err?.status;
|
|
49
|
+
if (status != null) {
|
|
50
|
+
let body;
|
|
51
|
+
if (err?.response?.data != null) {
|
|
52
|
+
if (typeof err.response.data === "string") body = err.response.data;
|
|
53
|
+
else if (typeof err.response.data === "object") try {
|
|
54
|
+
body = JSON.stringify(err.response.data);
|
|
55
|
+
} catch {}
|
|
56
|
+
}
|
|
57
|
+
this._throwRequestError(status, body, err?.response ?? { status }, context);
|
|
58
|
+
}
|
|
59
|
+
throw fetchError;
|
|
60
|
+
}
|
|
27
61
|
if (!res.ok) {
|
|
28
|
-
const
|
|
29
|
-
|
|
30
|
-
error.response = res;
|
|
31
|
-
error.details = {
|
|
32
|
-
url,
|
|
33
|
-
opts,
|
|
34
|
-
fetchOptions,
|
|
35
|
-
result: res
|
|
36
|
-
};
|
|
37
|
-
throw error;
|
|
62
|
+
const body = await res.text();
|
|
63
|
+
this._throwRequestError(res.status, body, res, context);
|
|
38
64
|
}
|
|
39
65
|
const data = await this._buildData(res, opts);
|
|
40
66
|
return {
|
package/dist/auth.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auth.js","names":["res: Response","opts: GoogleAbstractedClientOps","url: string | undefined","additionalHeaders: Record<string, string>","fetchOptions: {\n method?: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n }","apiKey: string","platform: GooglePlatformType","authOption: AuthOptions | undefined","scopeProperty: string","scopesOrPlatform: string[] | GooglePlatformType | undefined","scopes: string[]"],"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
|
|
1
|
+
{"version":3,"file":"auth.js","names":["res: Response","opts: GoogleAbstractedClientOps","status: number","body: string | undefined","response: unknown","context: {\n url: string;\n opts: GoogleAbstractedClientOps;\n fetchOptions?: Record<string, unknown>;\n }","url: string | undefined","additionalHeaders: Record<string, string>","fetchOptions: {\n method?: string;\n headers: Record<string, string>;\n body?: string;\n signal?: AbortSignal;\n }","apiKey: string","platform: GooglePlatformType","authOption: AuthOptions | undefined","scopeProperty: string","scopesOrPlatform: string[] | GooglePlatformType | undefined","scopes: string[]"],"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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n (error as any).response = response;\n // eslint-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 /* eslint-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,WAAWA,KAAeC,MAAiC;AAC/D,UAAQ,KAAK,cAAb;GACE,KAAK,OACH,QAAO,IAAI,MAAM;GACnB,KAAK,SACH,QAAO,IAAI,mBAAmB,IAAI;GACpC,QACE,QAAO,IAAI,MAAM;EACpB;CACF;;;;;;CAOD,AAAU,mBACRC,QACAC,MACAC,UACAC,SAKO;EACP,MAAM,UAAU,OACZ,CAAC,uCAAuC,EAAE,OAAO,EAAE,EAAE,MAAM,GAC3D,CAAC,uCAAuC,EAAE,QAAQ;EACtD,MAAM,QAAQ,IAAI,MAAM;EAEvB,MAAc,WAAW;EAEzB,MAAc,UAAU;AACzB,QAAM;CACP;CAED,MAAM,SACJC,KACAL,MACAM,mBACA;AACA,MAAI,OAAO,KAAM,OAAM,IAAI,MAAM;EACjC,MAAMC,eAKF;GACF,QAAQ,KAAK;GACb,SAAS;IACP,gBAAgB;IAChB,GAAI,KAAK,WAAW,CAAE;IACtB,GAAI,qBAAqB,CAAE;GAC5B;GACD,QAAQ,KAAK;EACd;AACD,MAAI,KAAK,SAAS,OAChB,KAAI,OAAO,KAAK,SAAS,UACvB,aAAa,OAAO,KAAK;OAEzB,aAAa,OAAO,KAAK,UAAU,KAAK,KAAK;EAIjD,MAAM,UAAU;GAAE;GAAK;GAAM;EAAc;EAE3C,IAAIR;AACJ,MAAI;GACF,MAAM,MAAM,KAAK,OAAO,KAAK,aAAa;EAC3C,SAAQ,YAAY;GAMnB,MAAM,MAAM;GACZ,MAAM,SAAS,KAAK,UAAU,UAAU,KAAK;AAE7C,OAAI,UAAU,MAAM;IAClB,IAAIG;AAEJ,QAAI,KAAK,UAAU,QAAQ,MACzB;SAAI,OAAO,IAAI,SAAS,SAAS,UAC/B,OAAO,IAAI,SAAS;cACX,OAAO,IAAI,SAAS,SAAS,SACtC,KAAI;MACF,OAAO,KAAK,UAAU,IAAI,SAAS,KAAK;KACzC,QAAO,CAEP;IACF;IAGH,KAAK,mBACH,QACA,MACA,KAAK,YAAY,EAAE,OAAQ,GAC3B,QACD;GACF;AAGD,SAAM;EAEP;AAED,MAAI,CAAC,IAAI,IAAI;GACX,MAAM,OAAO,MAAM,IAAI,MAAM;GAC7B,KAAK,mBAAmB,IAAI,QAAQ,MAAM,KAAK,QAAQ;EACxD;EAED,MAAM,OAAO,MAAM,KAAK,WAAW,KAAK,KAAK;AAC7C,SAAO;GACL;GACA,QAAQ,CAAE;GACV,QAAQ,IAAI;GACZ,YAAY,IAAI;GAChB,SAAS,IAAI;GACb,SAAS,EAAE,aAAa,IAAI,IAAK;EAClC;CACF;AACF;AAED,IAAa,mBAAb,cAAsC,4BAA4B;CAChE;CAEA,YAAYM,QAAgB;EAC1B,OAAO;EACP,KAAK,SAAS;CACf;CAED,IAAI,aAAqB;AACvB,SAAO;CACR;CAED,eAAgC;AAC9B,QAAM,IAAI,MAAM;CAGjB;CAED,QAAQR,MAA0C;EAChD,MAAM,aAAa,EACjB,kBAAkB,KAAK,OACxB;AACD,SAAO,KAAK,SAAS,KAAK,KAAK,MAAM,WAAW;CACjD;AACF;AAED,SAAgB,gBAAgBS,UAAwC;AACtE,SAAQ,UAAR;EACE,KAAK,MACH,QAAO,CAAC,qDAAsD;EAChE,QACE,QAAO,CAAC,gDAAiD;CAC5D;AACF;AAED,SAAgB,uBACdC,YACAC,eACAC,kBACa;AAEb,KAAI,cAAc,OAAO,OAAO,YAAY,cAAc,CACxD,QAAO;CAIT,MAAMC,SAAmB,MAAM,QAAQ,iBAAiB,GACnD,mBACD,gBAAgB,oBAAoB,MAAM;AAC9C,QAAO;GACJ,gBAAgB;EACjB,GAAI,cAAc,CAAE;CACrB;AACF"}
|
package/dist/chat_models.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_models.cjs","names":["AbstractGoogleLLMConnection","fields: GoogleAIBaseLLMInput<AuthOptions> | undefined","caller: AsyncCaller","client: GoogleAbstractedClient","streaming: boolean","apiConfig: GeminiAPIConfig","geminiConfig: GeminiAPIConfig","getGeminiAPI","BaseChatModel","fields?: ChatGoogleBaseInput<AuthOptions>","ensureParams","copyAndValidateModelParamsInto","DefaultGeminiSafetyHandler","options: this[\"ParsedCallOptions\"]","apiKey: string","ApiKeyGoogleAuth","fields?: GoogleAIBaseLLMInput<AuthOptions>","fields: GoogleBaseLLMInput<AuthOptions>","tools: GoogleAIToolType[]","kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>","convertToGeminiTools","options?: this[\"ParsedCallOptions\"]","copyAIModelParams","messages: BaseMessage[]","runManager: CallbackManagerForLLMRun | undefined","finalChunk: ChatGenerationChunk | null","chunk","_messages: BaseMessage[]","runManager?: CallbackManagerForLLMRun","usageMetadata: UsageMetadata | undefined","ChatGenerationChunk","AIMessageChunk","PROFILES","outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","config?: StructuredOutputMethodOptions<boolean>","schema: InteropZodType<RunOutput> | Record<string, any>","outputParser: BaseLLMOutputParser<RunOutput>","tools: GeminiTool[]","schemaToGeminiParameters","JsonOutputKeyToolsParser","geminiFunctionDefinition: GeminiFunctionDeclaration","parameters: GeminiJsonSchema","removeAdditionalProperties","JsonOutputParser","RunnablePassthrough","input: any","config","RunnableSequence"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { UsageMetadata, type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\n\nimport {\n BaseChatModel,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport {\n Runnable,\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { JsonOutputKeyToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\nimport {\n BaseLLMOutputParser,\n JsonOutputParser,\n} from \"@langchain/core/output_parsers\";\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\";\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 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\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 // Replace\n _llmType() {\n return \"chat_integration\";\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return copyAIModelParams(this, options);\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager: CallbackManagerForLLMRun | undefined\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const parameters = this.invocationParams(options);\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (!finalChunk) {\n throw new Error(\"No chunks were returned from the stream.\");\n }\n return {\n generations: [finalChunk],\n };\n }\n\n const response = await this.connection.request(\n messages,\n parameters,\n options,\n runManager\n );\n const ret = this.connection.api.responseToChatResult(response);\n const chunk = ret?.generations?.[0];\n if (chunk) {\n await runManager?.handleLLMNewToken(chunk.text || \"\");\n }\n return ret;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n // Make the call as a streaming request\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n _messages,\n parameters,\n options,\n runManager\n );\n\n // Get the streaming parser of the response\n const stream = response.data as JsonStream;\n let usageMetadata: UsageMetadata | undefined;\n // Loop until the end of the stream\n // During the loop, yield each time we get a chunk from the streaming parser\n // that is either available or added to the queue\n while (!stream.streamDone) {\n if (options.signal?.aborted) {\n return;\n }\n const output = await stream.nextChunk();\n await runManager?.handleCustomEvent(\n `google-chunk-${this.constructor.name}`,\n {\n output,\n }\n );\n if (\n output &&\n output.usageMetadata &&\n this.streamUsage !== false &&\n options.streamUsage !== false\n ) {\n usageMetadata = {\n input_tokens: output.usageMetadata.promptTokenCount,\n output_tokens: output.usageMetadata.candidatesTokenCount,\n total_tokens: output.usageMetadata.totalTokenCount,\n };\n }\n const chunk =\n output !== null\n ? this.connection.api.responseToChatGeneration({ data: output })\n : new ChatGenerationChunk({\n text: \"\",\n generationInfo: { finishReason: \"stop\" },\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: usageMetadata,\n }),\n });\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const schema: InteropZodType<RunOutput> | Record<string, any> =\n outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n if (method === \"jsonMode\") {\n throw new Error(\n `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n );\n }\n\n let llm;\n let outputParser: BaseLLMOutputParser<RunOutput>;\n if (method === \"functionCalling\") {\n let functionName = name ?? \"extract\";\n let tools: GeminiTool[];\n if (isInteropZodSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n tools = [\n {\n functionDeclarations: [\n {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n parameters: jsonSchema as GeminiFunctionSchema,\n },\n ],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let geminiFunctionDefinition: GeminiFunctionDeclaration;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDefinition = schema as GeminiFunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters, probably\n const parameters: GeminiJsonSchema =\n removeAdditionalProperties(schema);\n geminiFunctionDefinition = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters,\n };\n }\n tools = [\n {\n functionDeclarations: [geminiFunctionDefinition],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n llm = this.bindTools(tools).withConfig({ tool_choice: 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 = new JsonOutputParser();\n }\n\n if (!includeRaw) {\n return llm.pipe(outputParser).withConfig({\n runName: \"ChatGoogleStructuredOutput\",\n }) as Runnable<BaseLanguageModelInput, RunOutput>;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]).withConfig({\n runName: \"StructuredOutputRunnable\",\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat_models.cjs","names":["AbstractGoogleLLMConnection","fields: GoogleAIBaseLLMInput<AuthOptions> | undefined","caller: AsyncCaller","client: GoogleAbstractedClient","streaming: boolean","apiConfig: GeminiAPIConfig","geminiConfig: GeminiAPIConfig","getGeminiAPI","BaseChatModel","fields?: ChatGoogleBaseInput<AuthOptions>","ensureParams","copyAndValidateModelParamsInto","DefaultGeminiSafetyHandler","options: this[\"ParsedCallOptions\"]","apiKey: string","ApiKeyGoogleAuth","fields?: GoogleAIBaseLLMInput<AuthOptions>","fields: GoogleBaseLLMInput<AuthOptions>","tools: GoogleAIToolType[]","kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>","convertToGeminiTools","options?: this[\"ParsedCallOptions\"]","copyAIModelParams","messages: BaseMessage[]","runManager: CallbackManagerForLLMRun | undefined","finalChunk: ChatGenerationChunk | null","chunk","_messages: BaseMessage[]","runManager?: CallbackManagerForLLMRun","usageMetadata: UsageMetadata | undefined","ChatGenerationChunk","AIMessageChunk","PROFILES","outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","config?: StructuredOutputMethodOptions<boolean>","schema: InteropZodType<RunOutput> | Record<string, any>","outputParser: BaseLLMOutputParser<RunOutput>","tools: GeminiTool[]","schemaToGeminiParameters","JsonOutputKeyToolsParser","geminiFunctionDefinition: GeminiFunctionDeclaration","parameters: GeminiJsonSchema","removeAdditionalProperties","JsonOutputParser","RunnablePassthrough","input: any","config","RunnableSequence"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { UsageMetadata, type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\n\nimport {\n BaseChatModel,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport {\n Runnable,\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { JsonOutputKeyToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\nimport {\n BaseLLMOutputParser,\n JsonOutputParser,\n} from \"@langchain/core/output_parsers\";\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\";\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\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 // Replace\n _llmType() {\n return \"chat_integration\";\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return copyAIModelParams(this, options);\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager: CallbackManagerForLLMRun | undefined\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const parameters = this.invocationParams(options);\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (!finalChunk) {\n throw new Error(\"No chunks were returned from the stream.\");\n }\n return {\n generations: [finalChunk],\n };\n }\n\n const response = await this.connection.request(\n messages,\n parameters,\n options,\n runManager\n );\n const ret = this.connection.api.responseToChatResult(response);\n const chunk = ret?.generations?.[0];\n if (chunk) {\n await runManager?.handleLLMNewToken(chunk.text || \"\");\n }\n return ret;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n // Make the call as a streaming request\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n _messages,\n parameters,\n options,\n runManager\n );\n\n // Get the streaming parser of the response\n const stream = response.data as JsonStream;\n let usageMetadata: UsageMetadata | undefined;\n // Loop until the end of the stream\n // During the loop, yield each time we get a chunk from the streaming parser\n // that is either available or added to the queue\n while (!stream.streamDone) {\n if (options.signal?.aborted) {\n return;\n }\n const output = await stream.nextChunk();\n await runManager?.handleCustomEvent(\n `google-chunk-${this.constructor.name}`,\n {\n output,\n }\n );\n if (\n output &&\n output.usageMetadata &&\n this.streamUsage !== false &&\n options.streamUsage !== false\n ) {\n usageMetadata = {\n input_tokens: output.usageMetadata.promptTokenCount,\n output_tokens: output.usageMetadata.candidatesTokenCount,\n total_tokens: output.usageMetadata.totalTokenCount,\n };\n }\n const chunk =\n output !== null\n ? this.connection.api.responseToChatGeneration({ data: output })\n : new ChatGenerationChunk({\n text: \"\",\n generationInfo: { finishReason: \"stop\" },\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: usageMetadata,\n }),\n });\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const schema: InteropZodType<RunOutput> | Record<string, any> =\n outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n if (method === \"jsonMode\") {\n throw new Error(\n `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n );\n }\n\n let llm;\n let outputParser: BaseLLMOutputParser<RunOutput>;\n if (method === \"functionCalling\") {\n let functionName = name ?? \"extract\";\n let tools: GeminiTool[];\n if (isInteropZodSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n tools = [\n {\n functionDeclarations: [\n {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n parameters: jsonSchema as GeminiFunctionSchema,\n },\n ],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let geminiFunctionDefinition: GeminiFunctionDeclaration;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDefinition = schema as GeminiFunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters, probably\n const parameters: GeminiJsonSchema =\n removeAdditionalProperties(schema);\n geminiFunctionDefinition = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters,\n };\n }\n tools = [\n {\n functionDeclarations: [geminiFunctionDefinition],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n llm = this.bindTools(tools).withConfig({ tool_choice: 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 = new JsonOutputParser();\n }\n\n if (!includeRaw) {\n return llm.pipe(outputParser).withConfig({\n runName: \"ChatGoogleStructuredOutput\",\n }) as Runnable<BaseLanguageModelInput, RunOutput>;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]).withConfig({\n runName: \"StructuredOutputRunnable\",\n });\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAwEA,IAAa,iBAAb,cAAiDA,+CAG/C;CACA;CAEA,YACEC,QACAC,QACAC,QACAC,WACA;EACA,MAAM,QAAQ,QAAQ,QAAQ,UAAU;EACxC,KAAK,qCACH,QAAQ;CACX;CAED,IAAI,uBAAgC;AAClC,SAAO,OAAO,KAAK,uCAAuC,YACtD,CAAC,KAAK,qCACN,KAAK;CACV;CAED,IAAI,8BAAuC;AAIzC,MAAI,KAAK,gBAAgB,OACvB,QAAO;WACE,KAAK,cAAc,qBAC5B,QAAO;WACE,KAAK,UAAU,WAAW,oBAAoB,CACvD,QAAO;WACE,KAAK,UAAU,WAAW,wBAAwB,CAC3D,QAAO;WACE,KAAK,cAAc,gBAAgB,KAAK,aAAa,MAE9D,QAAO;WACE,KAAK,gBAAgB,QAG9B,QAAO;AAET,SAAO;CACR;CAED,6CAGE;AACA,MAAI,KAAK,UAAU,WAAW,aAAa,CACzC,QAAO;WACE,KAAK,UAAU,WAAW,aAAa,CAChD,QAAO;MAEP,QAAO;CAEV;CAED,kCACEC,WACwC;EACxC,MAAM,MAAM,UAAU;AACtB,MAAI,QAAQ,UAAa,QAAQ,KAC/B,QAAO,KAAK,4CAA4C;MAExD,QAAO;CAEV;CAED,iBAA8B;EAC5B,MAAMA,YACH,KAAK,aAAiC,CAAE;EAC3C,MAAM,6BACJ,KAAK,kCAAkC,UAAU;EACnD,MAAMC,eAAgC;GACpC,sBAAsB,KAAK;GAC3B;GACA,GAAG;EACJ;AACD,SAAOC,4BAAa,aAAa;CAClC;CAED,IAAI,MAAmB;AACrB,UAAQ,KAAK,SAAb;GACE,KAAK,SACH,QAAO,KAAK,gBAAgB;GAC9B,QACE,QAAO,MAAM;EAChB;CACF;AACF;;;;AAiBD,IAAsB,iBAAtB,cACUC,2DAEV;CAEE,OAAO,UAAU;AACf,SAAO;CACR;CAED,IAAI,aAAoD;AACtD,SAAO,EACL,aAAa,sBACd;CACF;CAED,kBAAkB;CAGlB;CAEA,YAAY;CAEZ;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA;CAEA,gBAA0B,CAAE;CAE5B;CAEA,cAAsB;CAEtB,iBAA0C,CAAE;CAE5C;CAGA;CAEA;CAEA;CAEA,cAAc;CAEd,YAAY;CAEZ;CAEA,AAAU;CAEV,AAAU;CAEV,YAAYC,QAA2C;EACrD,MAAMC,oCAAa,OAAO,CAAC;EAE3BC,8CAA+B,QAAQ,KAAK;EAC5C,KAAK,gBACH,QAAQ,iBAAiB,IAAIC;EAC/B,KAAK,cAAc,QAAQ,eAAe,KAAK;EAC/C,MAAM,SAAS,KAAK,YAAY,OAAO;EACvC,KAAK,gBAAgB,UAAU,CAAE,GAAE,OAAO;CAC3C;CAED,YAAYC,SAAqD;EAC/D,MAAM,SAAS,KAAK,iBAAiB,QAAQ;AAC7C,SAAO;GACL,aAAa;GACb,eAAe,KAAK;GACpB,eAAe;GACf,gBAAgB,OAAO,eAAe;GACtC,eAAe,OAAO,mBAAmB;GACzC,SAAS,QAAQ;EAClB;CACF;CAMD,kBAAkBC,QAAwC;AACxD,SAAO,IAAIC,8BAAiB;CAC7B;CAED,YAAYC,QAAgE;AAC1E,SAAO,QAAQ,iEAAiC,iBAAiB;CAClE;CAED,YACEA,QACwB;EACxB,MAAM,SAAS,KAAK,YAAY,OAAO;AACvC,MAAI,OACF,QAAO,KAAK,kBAAkB,OAAO;MAErC,QAAO,KAAK,sBAAsB,OAAO;CAE5C;CAED,gBACEC,QACAd,QACA;EACA,KAAK,aAAa,IAAI,eACpB;GAAE,GAAG;GAAQ,GAAG;EAAM,GACtB,KAAK,QACL,QACA;EAGF,KAAK,qBAAqB,IAAI,eAC5B;GAAE,GAAG;GAAQ,GAAG;EAAM,GACtB,KAAK,QACL,QACA;CAEH;CAED,IAAI,WAA+B;AACjC,SAAO,KAAK,WAAW;CACxB;CAED,AAAS,UACPe,OACAC,QAKA;AACA,SAAO,KAAK,WAAW;GAAE,OAAOC,oCAAqB,MAAM;GAAE,GAAG;EAAQ,EAAC;CAC1E;CAGD,WAAW;AACT,SAAO;CACR;;;;CAKD,AAAS,iBAAiBC,SAAqC;AAC7D,SAAOC,iCAAkB,MAAM,QAAQ;CACxC;CAED,MAAM,UACJC,UACAV,SACAW,YACqB;EACrB,QAAQ,QAAQ,gBAAgB;EAChC,MAAM,aAAa,KAAK,iBAAiB,QAAQ;AACjD,MAAI,KAAK,WAAW;GAClB,MAAM,SAAS,KAAK,sBAAsB,UAAU,SAAS,WAAW;GACxE,IAAIC,aAAyC;AAC7C,cAAW,MAAMC,WAAS,QACxB,aAAa,CAAC,aAAaA,oDAAe,YAAYA,QAAM;AAE9D,OAAI,CAAC,WACH,OAAM,IAAI,MAAM;AAElB,UAAO,EACL,aAAa,CAAC,UAAW,EAC1B;EACF;EAED,MAAM,WAAW,MAAM,KAAK,WAAW,QACrC,UACA,YACA,SACA,WACD;EACD,MAAM,MAAM,KAAK,WAAW,IAAI,qBAAqB,SAAS;EAC9D,MAAM,QAAQ,KAAK,cAAc;AACjC,MAAI,OACF,MAAM,YAAY,kBAAkB,MAAM,QAAQ,GAAG;AAEvD,SAAO;CACR;CAED,OAAO,sBACLC,WACAd,SACAe,YACqC;EAErC,MAAM,aAAa,KAAK,iBAAiB,QAAQ;EACjD,MAAM,WAAW,MAAM,KAAK,mBAAmB,QAC7C,WACA,YACA,SACA,WACD;EAGD,MAAM,SAAS,SAAS;EACxB,IAAIC;AAIJ,SAAO,CAAC,OAAO,YAAY;AACzB,OAAI,QAAQ,QAAQ,QAClB;GAEF,MAAM,SAAS,MAAM,OAAO,WAAW;GACvC,MAAM,YAAY,kBAChB,CAAC,aAAa,EAAE,KAAK,YAAY,MAAM,EACvC,EACE,OACD,EACF;AACD,OACE,UACA,OAAO,iBACP,KAAK,gBAAgB,SACrB,QAAQ,gBAAgB,OAExB,gBAAgB;IACd,cAAc,OAAO,cAAc;IACnC,eAAe,OAAO,cAAc;IACpC,cAAc,OAAO,cAAc;GACpC;GAEH,MAAM,QACJ,WAAW,OACP,KAAK,WAAW,IAAI,yBAAyB,EAAE,MAAM,OAAQ,EAAC,GAC9D,IAAIC,6CAAoB;IACtB,MAAM;IACN,gBAAgB,EAAE,cAAc,OAAQ;IACxC,SAAS,IAAIC,yCAAe;KAC1B,SAAS;KACT,gBAAgB;IACjB;GACF;AACP,OAAI,OAAO;IACT,MAAM;IACN,MAAM,YAAY,kBAChB,MAAM,QAAQ,IACd,QACA,QACA,QACA,QACA,EAAE,MAAO,EACV;GACF;EACF;CACF;;CAGD,oBAAoB;AAClB,SAAO,CAAE;CACV;;;;;;;;;;CAWD,IAAI,UAAwB;AAC1B,SAAOC,yBAAS,KAAK,UAAU,CAAE;CAClC;CAwBD,qBAIEC,cAIAC,QAMI;EAEJ,MAAMC,SACJ;EACF,MAAM,OAAO,QAAQ;EACrB,MAAM,SAAS,QAAQ;EACvB,MAAM,aAAa,QAAQ;AAC3B,MAAI,WAAW,WACb,OAAM,IAAI,MACR,CAAC,mEAAmE,CAAC;EAIzE,IAAI;EACJ,IAAIC;AACJ,MAAI,WAAW,mBAAmB;GAChC,IAAI,eAAe,QAAQ;GAC3B,IAAIC;AACJ,4DAAuB,OAAO,EAAE;IAC9B,MAAM,aAAaC,0DAAyB,OAAO;IACnD,QAAQ,CACN,EACE,sBAAsB,CACpB;KACE,MAAM;KACN,aACE,WAAW,eAAe;KAC5B,YAAY;IACb,CACF,EACF,CACF;IACD,eAAe,IAAIC,sEAAyB;KAC1C,cAAc;KACd,SAAS;KACT,WAAW;IACZ;GACF,OAAM;IACL,IAAIC;AACJ,QACE,OAAO,OAAO,SAAS,YACvB,OAAO,OAAO,eAAe,YAC7B,OAAO,cAAc,MACrB;KACA,2BAA2B;KAC3B,eAAe,OAAO;IACvB,OAAM;KAEL,MAAMC,aACJC,4DAA2B,OAAO;KACpC,2BAA2B;MACzB,MAAM;MACN,aAAa,OAAO,eAAe;MACnC;KACD;IACF;IACD,QAAQ,CACN,EACE,sBAAsB,CAAC,wBAAyB,EACjD,CACF;IACD,eAAe,IAAIH,sEAAoC;KACrD,cAAc;KACd,SAAS;IACV;GACF;GACD,MAAM,KAAK,UAAU,MAAM,CAAC,WAAW,EAAE,aAAa,aAAc,EAAC;EACtE,OAAM;GAEL,MAAM,aAAaD,0DAAyB,OAAO;GACnD,MAAM,KAAK,WAAW,EACpB,gBAAgB,WACjB,EAAC;GACF,eAAe,IAAIK;EACpB;AAED,MAAI,CAAC,WACH,QAAO,IAAI,KAAK,aAAa,CAAC,WAAW,EACvC,SAAS,6BACV,EAAC;EAGJ,MAAM,eAAeC,+CAAoB,OAAO,EAE9C,QAAQ,CAACC,OAAYC,aAAW,aAAa,OAAO,MAAM,KAAKA,SAAO,CACvE,EAAC;EACF,MAAM,aAAaF,+CAAoB,OAAO,EAC5C,QAAQ,MAAM,KACf,EAAC;EACF,MAAM,qBAAqB,aAAa,cAAc,EACpD,WAAW,CAAC,UAAW,EACxB,EAAC;AACF,SAAOG,4CAAiB,KAGtB,CACA,EACE,KAAK,IACN,GACD,kBACD,EAAC,CAAC,WAAW,EACZ,SAAS,2BACV,EAAC;CACH;AACF"}
|
package/dist/chat_models.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chat_models.js","names":["fields: GoogleAIBaseLLMInput<AuthOptions> | undefined","caller: AsyncCaller","client: GoogleAbstractedClient","streaming: boolean","apiConfig: GeminiAPIConfig","geminiConfig: GeminiAPIConfig","fields?: ChatGoogleBaseInput<AuthOptions>","options: this[\"ParsedCallOptions\"]","apiKey: string","fields?: GoogleAIBaseLLMInput<AuthOptions>","fields: GoogleBaseLLMInput<AuthOptions>","tools: GoogleAIToolType[]","kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>","options?: this[\"ParsedCallOptions\"]","messages: BaseMessage[]","runManager: CallbackManagerForLLMRun | undefined","finalChunk: ChatGenerationChunk | null","chunk","_messages: BaseMessage[]","runManager?: CallbackManagerForLLMRun","usageMetadata: UsageMetadata | undefined","PROFILES","outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","config?: StructuredOutputMethodOptions<boolean>","schema: InteropZodType<RunOutput> | Record<string, any>","outputParser: BaseLLMOutputParser<RunOutput>","tools: GeminiTool[]","geminiFunctionDefinition: GeminiFunctionDeclaration","parameters: GeminiJsonSchema","input: any","config"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { UsageMetadata, type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\n\nimport {\n BaseChatModel,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport {\n Runnable,\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { JsonOutputKeyToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\nimport {\n BaseLLMOutputParser,\n JsonOutputParser,\n} from \"@langchain/core/output_parsers\";\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\";\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 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\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 // Replace\n _llmType() {\n return \"chat_integration\";\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return copyAIModelParams(this, options);\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager: CallbackManagerForLLMRun | undefined\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const parameters = this.invocationParams(options);\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (!finalChunk) {\n throw new Error(\"No chunks were returned from the stream.\");\n }\n return {\n generations: [finalChunk],\n };\n }\n\n const response = await this.connection.request(\n messages,\n parameters,\n options,\n runManager\n );\n const ret = this.connection.api.responseToChatResult(response);\n const chunk = ret?.generations?.[0];\n if (chunk) {\n await runManager?.handleLLMNewToken(chunk.text || \"\");\n }\n return ret;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n // Make the call as a streaming request\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n _messages,\n parameters,\n options,\n runManager\n );\n\n // Get the streaming parser of the response\n const stream = response.data as JsonStream;\n let usageMetadata: UsageMetadata | undefined;\n // Loop until the end of the stream\n // During the loop, yield each time we get a chunk from the streaming parser\n // that is either available or added to the queue\n while (!stream.streamDone) {\n if (options.signal?.aborted) {\n return;\n }\n const output = await stream.nextChunk();\n await runManager?.handleCustomEvent(\n `google-chunk-${this.constructor.name}`,\n {\n output,\n }\n );\n if (\n output &&\n output.usageMetadata &&\n this.streamUsage !== false &&\n options.streamUsage !== false\n ) {\n usageMetadata = {\n input_tokens: output.usageMetadata.promptTokenCount,\n output_tokens: output.usageMetadata.candidatesTokenCount,\n total_tokens: output.usageMetadata.totalTokenCount,\n };\n }\n const chunk =\n output !== null\n ? this.connection.api.responseToChatGeneration({ data: output })\n : new ChatGenerationChunk({\n text: \"\",\n generationInfo: { finishReason: \"stop\" },\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: usageMetadata,\n }),\n });\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const schema: InteropZodType<RunOutput> | Record<string, any> =\n outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n if (method === \"jsonMode\") {\n throw new Error(\n `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n );\n }\n\n let llm;\n let outputParser: BaseLLMOutputParser<RunOutput>;\n if (method === \"functionCalling\") {\n let functionName = name ?? \"extract\";\n let tools: GeminiTool[];\n if (isInteropZodSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n tools = [\n {\n functionDeclarations: [\n {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n parameters: jsonSchema as GeminiFunctionSchema,\n },\n ],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let geminiFunctionDefinition: GeminiFunctionDeclaration;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDefinition = schema as GeminiFunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters, probably\n const parameters: GeminiJsonSchema =\n removeAdditionalProperties(schema);\n geminiFunctionDefinition = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters,\n };\n }\n tools = [\n {\n functionDeclarations: [geminiFunctionDefinition],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n llm = this.bindTools(tools).withConfig({ tool_choice: 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 = new JsonOutputParser();\n }\n\n if (!includeRaw) {\n return llm.pipe(outputParser).withConfig({\n runName: \"ChatGoogleStructuredOutput\",\n }) as Runnable<BaseLanguageModelInput, RunOutput>;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]).withConfig({\n runName: \"StructuredOutputRunnable\",\n });\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"chat_models.js","names":["fields: GoogleAIBaseLLMInput<AuthOptions> | undefined","caller: AsyncCaller","client: GoogleAbstractedClient","streaming: boolean","apiConfig: GeminiAPIConfig","geminiConfig: GeminiAPIConfig","fields?: ChatGoogleBaseInput<AuthOptions>","options: this[\"ParsedCallOptions\"]","apiKey: string","fields?: GoogleAIBaseLLMInput<AuthOptions>","fields: GoogleBaseLLMInput<AuthOptions>","tools: GoogleAIToolType[]","kwargs?: Partial<GoogleAIBaseLanguageModelCallOptions>","options?: this[\"ParsedCallOptions\"]","messages: BaseMessage[]","runManager: CallbackManagerForLLMRun | undefined","finalChunk: ChatGenerationChunk | null","chunk","_messages: BaseMessage[]","runManager?: CallbackManagerForLLMRun","usageMetadata: UsageMetadata | undefined","PROFILES","outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>","config?: StructuredOutputMethodOptions<boolean>","schema: InteropZodType<RunOutput> | Record<string, any>","outputParser: BaseLLMOutputParser<RunOutput>","tools: GeminiTool[]","geminiFunctionDefinition: GeminiFunctionDeclaration","parameters: GeminiJsonSchema","input: any","config"],"sources":["../src/chat_models.ts"],"sourcesContent":["import { getEnvironmentVariable } from \"@langchain/core/utils/env\";\nimport { UsageMetadata, type BaseMessage } from \"@langchain/core/messages\";\nimport { CallbackManagerForLLMRun } from \"@langchain/core/callbacks/manager\";\n\nimport {\n BaseChatModel,\n LangSmithParams,\n type BaseChatModelParams,\n} from \"@langchain/core/language_models/chat_models\";\nimport { ChatGenerationChunk, ChatResult } from \"@langchain/core/outputs\";\nimport { AIMessageChunk } from \"@langchain/core/messages\";\nimport {\n BaseLanguageModelInput,\n StructuredOutputMethodOptions,\n} from \"@langchain/core/language_models/base\";\nimport { type ModelProfile } from \"@langchain/core/language_models/profile\";\nimport {\n Runnable,\n RunnablePassthrough,\n RunnableSequence,\n} from \"@langchain/core/runnables\";\nimport { JsonOutputKeyToolsParser } from \"@langchain/core/output_parsers/openai_tools\";\nimport {\n BaseLLMOutputParser,\n JsonOutputParser,\n} from \"@langchain/core/output_parsers\";\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\";\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\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 // Replace\n _llmType() {\n return \"chat_integration\";\n }\n\n /**\n * Get the parameters used to invoke the model\n */\n override invocationParams(options?: this[\"ParsedCallOptions\"]) {\n return copyAIModelParams(this, options);\n }\n\n async _generate(\n messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager: CallbackManagerForLLMRun | undefined\n ): Promise<ChatResult> {\n options.signal?.throwIfAborted();\n const parameters = this.invocationParams(options);\n if (this.streaming) {\n const stream = this._streamResponseChunks(messages, options, runManager);\n let finalChunk: ChatGenerationChunk | null = null;\n for await (const chunk of stream) {\n finalChunk = !finalChunk ? chunk : concat(finalChunk, chunk);\n }\n if (!finalChunk) {\n throw new Error(\"No chunks were returned from the stream.\");\n }\n return {\n generations: [finalChunk],\n };\n }\n\n const response = await this.connection.request(\n messages,\n parameters,\n options,\n runManager\n );\n const ret = this.connection.api.responseToChatResult(response);\n const chunk = ret?.generations?.[0];\n if (chunk) {\n await runManager?.handleLLMNewToken(chunk.text || \"\");\n }\n return ret;\n }\n\n async *_streamResponseChunks(\n _messages: BaseMessage[],\n options: this[\"ParsedCallOptions\"],\n runManager?: CallbackManagerForLLMRun\n ): AsyncGenerator<ChatGenerationChunk> {\n // Make the call as a streaming request\n const parameters = this.invocationParams(options);\n const response = await this.streamedConnection.request(\n _messages,\n parameters,\n options,\n runManager\n );\n\n // Get the streaming parser of the response\n const stream = response.data as JsonStream;\n let usageMetadata: UsageMetadata | undefined;\n // Loop until the end of the stream\n // During the loop, yield each time we get a chunk from the streaming parser\n // that is either available or added to the queue\n while (!stream.streamDone) {\n if (options.signal?.aborted) {\n return;\n }\n const output = await stream.nextChunk();\n await runManager?.handleCustomEvent(\n `google-chunk-${this.constructor.name}`,\n {\n output,\n }\n );\n if (\n output &&\n output.usageMetadata &&\n this.streamUsage !== false &&\n options.streamUsage !== false\n ) {\n usageMetadata = {\n input_tokens: output.usageMetadata.promptTokenCount,\n output_tokens: output.usageMetadata.candidatesTokenCount,\n total_tokens: output.usageMetadata.totalTokenCount,\n };\n }\n const chunk =\n output !== null\n ? this.connection.api.responseToChatGeneration({ data: output })\n : new ChatGenerationChunk({\n text: \"\",\n generationInfo: { finishReason: \"stop\" },\n message: new AIMessageChunk({\n content: \"\",\n usage_metadata: usageMetadata,\n }),\n });\n if (chunk) {\n yield chunk;\n await runManager?.handleLLMNewToken(\n chunk.text ?? \"\",\n undefined,\n undefined,\n undefined,\n undefined,\n { chunk }\n );\n }\n }\n }\n\n /** @ignore */\n _combineLLMOutput() {\n return [];\n }\n\n /**\n * Return profiling information for the model.\n *\n * Provides information about the model's capabilities and constraints,\n * including token limits, multimodal support, and advanced features like\n * tool calling and structured output.\n *\n * @returns {ModelProfile} An object describing the model's capabilities and constraints\n */\n get profile(): ModelProfile {\n return PROFILES[this.model] ?? {};\n }\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n | Record<string, any>,\n config?: StructuredOutputMethodOptions<false>\n ): Runnable<BaseLanguageModelInput, RunOutput>;\n\n withStructuredOutput<\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n RunOutput extends Record<string, any> = Record<string, any>,\n >(\n outputSchema:\n | InteropZodType<RunOutput>\n // eslint-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 // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const schema: InteropZodType<RunOutput> | Record<string, any> =\n outputSchema;\n const name = config?.name;\n const method = config?.method;\n const includeRaw = config?.includeRaw;\n if (method === \"jsonMode\") {\n throw new Error(\n `Google only supports \"jsonSchema\" or \"functionCalling\" as a method.`\n );\n }\n\n let llm;\n let outputParser: BaseLLMOutputParser<RunOutput>;\n if (method === \"functionCalling\") {\n let functionName = name ?? \"extract\";\n let tools: GeminiTool[];\n if (isInteropZodSchema(schema)) {\n const jsonSchema = schemaToGeminiParameters(schema);\n tools = [\n {\n functionDeclarations: [\n {\n name: functionName,\n description:\n jsonSchema.description ?? \"A function available to call.\",\n parameters: jsonSchema as GeminiFunctionSchema,\n },\n ],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser({\n returnSingle: true,\n keyName: functionName,\n zodSchema: schema,\n });\n } else {\n let geminiFunctionDefinition: GeminiFunctionDeclaration;\n if (\n typeof schema.name === \"string\" &&\n typeof schema.parameters === \"object\" &&\n schema.parameters != null\n ) {\n geminiFunctionDefinition = schema as GeminiFunctionDeclaration;\n functionName = schema.name;\n } else {\n // We are providing the schema for *just* the parameters, probably\n const parameters: GeminiJsonSchema =\n removeAdditionalProperties(schema);\n geminiFunctionDefinition = {\n name: functionName,\n description: schema.description ?? \"\",\n parameters,\n };\n }\n tools = [\n {\n functionDeclarations: [geminiFunctionDefinition],\n },\n ];\n outputParser = new JsonOutputKeyToolsParser<RunOutput>({\n returnSingle: true,\n keyName: functionName,\n });\n }\n llm = this.bindTools(tools).withConfig({ tool_choice: 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 = new JsonOutputParser();\n }\n\n if (!includeRaw) {\n return llm.pipe(outputParser).withConfig({\n runName: \"ChatGoogleStructuredOutput\",\n }) as Runnable<BaseLanguageModelInput, RunOutput>;\n }\n\n const parserAssign = RunnablePassthrough.assign({\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n parsed: (input: any, config) => outputParser.invoke(input.raw, config),\n });\n const parserNone = RunnablePassthrough.assign({\n parsed: () => null,\n });\n const parsedWithFallback = parserAssign.withFallbacks({\n fallbacks: [parserNone],\n });\n return RunnableSequence.from<\n BaseLanguageModelInput,\n { raw: BaseMessage; parsed: RunOutput }\n >([\n {\n raw: llm,\n },\n parsedWithFallback,\n ]).withConfig({\n runName: \"StructuredOutputRunnable\",\n });\n }\n}\n"],"mappings":"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"}
|