@ai-sdk/google-vertex 5.0.97 → 5.0.99
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 +24 -0
- package/dist/anthropic/edge/index.d.ts +84 -80
- package/dist/anthropic/edge/index.d.ts.map +1 -0
- package/dist/anthropic/edge/index.js +232 -272
- package/dist/anthropic/edge/index.js.map +1 -1
- package/dist/anthropic/index.d.ts +69 -66
- package/dist/anthropic/index.d.ts.map +1 -0
- package/dist/anthropic/index.js +166 -177
- package/dist/anthropic/index.js.map +1 -1
- package/dist/edge/index.d.ts +206 -194
- package/dist/edge/index.d.ts.map +1 -0
- package/dist/edge/index.js +1408 -1846
- package/dist/edge/index.js.map +1 -1
- package/dist/index.d.ts +265 -252
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1349 -1761
- package/dist/index.js.map +1 -1
- package/dist/maas/edge/index.d.ts +62 -59
- package/dist/maas/edge/index.d.ts.map +1 -0
- package/dist/maas/edge/index.js +166 -196
- package/dist/maas/edge/index.js.map +1 -1
- package/dist/maas/index.d.ts +47 -45
- package/dist/maas/index.d.ts.map +1 -0
- package/dist/maas/index.js +101 -102
- package/dist/maas/index.js.map +1 -1
- package/dist/xai/edge/index.d.ts +77 -73
- package/dist/xai/edge/index.d.ts.map +1 -0
- package/dist/xai/edge/index.js +203 -235
- package/dist/xai/edge/index.js.map +1 -1
- package/dist/xai/index.d.ts +62 -59
- package/dist/xai/index.d.ts.map +1 -0
- package/dist/xai/index.js +138 -141
- package/dist/xai/index.js.map +1 -1
- package/docs/16-google-vertex.mdx +3 -3
- package/package.json +11 -11
- package/src/edge/google-vertex-auth-edge.ts +1 -1
- package/src/google-vertex-provider-base.ts +1 -1
|
@@ -1,64 +1,66 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
|
|
1
|
+
import { FetchFunction, Resolvable } from "@ai-sdk/provider-utils";
|
|
2
|
+
import { OpenAICompatibleProvider } from "@ai-sdk/openai-compatible";
|
|
3
|
+
//#region src/edge/google-vertex-auth-edge.d.ts
|
|
4
4
|
interface GoogleCredentials {
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
5
|
+
/**
|
|
6
|
+
* The client email for the Google Cloud service account. Defaults to the
|
|
7
|
+
* value of the `GOOGLE_CLIENT_EMAIL` environment variable.
|
|
8
|
+
*/
|
|
9
|
+
clientEmail: string;
|
|
10
|
+
/**
|
|
11
|
+
* The private key for the Google Cloud service account. Defaults to the
|
|
12
|
+
* value of the `GOOGLE_PRIVATE_KEY` environment variable.
|
|
13
|
+
*/
|
|
14
|
+
privateKey: string;
|
|
15
|
+
/**
|
|
16
|
+
* Optional. The private key ID for the Google Cloud service account. Defaults
|
|
17
|
+
* to the value of the `GOOGLE_PRIVATE_KEY_ID` environment variable.
|
|
18
|
+
*/
|
|
19
|
+
privateKeyId?: string;
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
//#endregion
|
|
22
|
+
//#region src/maas/google-vertex-maas-options.d.ts
|
|
22
23
|
type GoogleVertexMaasModelId = 'deepseek-ai/deepseek-r1-0528-maas' | 'deepseek-ai/deepseek-v3.1-maas' | 'deepseek-ai/deepseek-v3.2-maas' | 'openai/gpt-oss-120b-maas' | 'openai/gpt-oss-20b-maas' | 'meta/llama-4-maverick-17b-128e-instruct-maas' | 'meta/llama-4-scout-17b-16e-instruct-maas' | 'minimax/minimax-m2-maas' | 'qwen/qwen3-coder-480b-a35b-instruct-maas' | 'qwen/qwen3-next-80b-a3b-instruct-maas' | 'qwen/qwen3-next-80b-a3b-thinking-maas' | 'moonshotai/kimi-k2-thinking-maas' | (string & {});
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
24
|
+
//#endregion
|
|
25
|
+
//#region src/maas/google-vertex-maas-provider.d.ts
|
|
26
|
+
interface GoogleVertexMaasProvider extends OpenAICompatibleProvider<GoogleVertexMaasModelId, string, string, string> {}
|
|
26
27
|
interface GoogleVertexMaasProviderSettings$1 {
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
28
|
+
/**
|
|
29
|
+
* Google Cloud project ID. Defaults to the value of the `GOOGLE_VERTEX_PROJECT` environment variable.
|
|
30
|
+
*/
|
|
31
|
+
project?: string;
|
|
32
|
+
/**
|
|
33
|
+
* Google Cloud location/region. Defaults to the value of the `GOOGLE_VERTEX_LOCATION` environment variable.
|
|
34
|
+
* Use 'global' for the global endpoint.
|
|
35
|
+
*/
|
|
36
|
+
location?: string;
|
|
37
|
+
/**
|
|
38
|
+
* Base URL for the API calls. If not provided, will be constructed from project and location.
|
|
39
|
+
*/
|
|
40
|
+
baseURL?: string;
|
|
41
|
+
/**
|
|
42
|
+
* Headers to use for requests. Can be:
|
|
43
|
+
* - A headers object
|
|
44
|
+
* - A Promise that resolves to a headers object
|
|
45
|
+
* - A function that returns a headers object
|
|
46
|
+
* - A function that returns a Promise of a headers object
|
|
47
|
+
*/
|
|
48
|
+
headers?: Resolvable<Record<string, string | undefined>>;
|
|
49
|
+
/**
|
|
50
|
+
* Custom fetch implementation. You can use it as a middleware to intercept requests,
|
|
51
|
+
* or to provide a custom fetch implementation for e.g. testing.
|
|
52
|
+
*/
|
|
53
|
+
fetch?: FetchFunction;
|
|
53
54
|
}
|
|
54
|
-
|
|
55
|
+
//#endregion
|
|
56
|
+
//#region src/maas/edge/google-vertex-maas-provider-edge.d.ts
|
|
55
57
|
interface GoogleVertexMaasProviderSettings extends GoogleVertexMaasProviderSettings$1 {
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
58
|
+
/**
|
|
59
|
+
* Optional. The Google credentials for the Google Cloud service account. If
|
|
60
|
+
* not provided, the Google Vertex provider will use environment variables to
|
|
61
|
+
* load the credentials.
|
|
62
|
+
*/
|
|
63
|
+
googleCredentials?: GoogleCredentials;
|
|
62
64
|
}
|
|
63
65
|
/**
|
|
64
66
|
* Create a Google Vertex AI MaaS (Model as a Service) provider instance for Edge runtimes.
|
|
@@ -67,10 +69,11 @@ interface GoogleVertexMaasProviderSettings extends GoogleVertexMaasProviderSetti
|
|
|
67
69
|
*
|
|
68
70
|
* @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models
|
|
69
71
|
*/
|
|
70
|
-
declare function createGoogleVertexMaas(options?: GoogleVertexMaasProviderSettings): GoogleVertexMaasProvider;
|
|
72
|
+
export declare function createGoogleVertexMaas(options?: GoogleVertexMaasProviderSettings): GoogleVertexMaasProvider;
|
|
71
73
|
/**
|
|
72
74
|
* Default Google Vertex AI MaaS provider instance for Edge runtimes.
|
|
73
75
|
*/
|
|
74
|
-
declare const googleVertexMaas: GoogleVertexMaasProvider;
|
|
75
|
-
|
|
76
|
-
export { type GoogleVertexMaasModelId, type GoogleVertexMaasProvider, type GoogleVertexMaasProviderSettings, createGoogleVertexMaas
|
|
76
|
+
export declare const googleVertexMaas: GoogleVertexMaasProvider;
|
|
77
|
+
//#endregion
|
|
78
|
+
export { type GoogleVertexMaasModelId, type GoogleVertexMaasProvider, type GoogleVertexMaasProviderSettings, createGoogleVertexMaas as createVertexMaas, googleVertexMaas as vertexMaas };
|
|
79
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","names":["GoogleVertexMaasProviderSettings","GoogleVertexMaasProviderSettingsOriginal"],"sources":["../../../src/edge/google-vertex-auth-edge.ts","../../../src/maas/google-vertex-maas-options.ts","../../../src/maas/google-vertex-maas-provider.ts","../../../src/maas/edge/google-vertex-maas-provider-edge.ts"],"mappings":";;;UAQiB;;;;;EAKf;;;;;EAMA;;;;;EAMA;;;;KCxBU;;;UCyBK,iCAAiC,yBAChD;UAMeA;;;;EAIf;;;;;EAMA;;;;EAKA;;;;;;;;EASA,UAAU,WAAW;;;;;EAMrB,QAAQ;;;;UCnDO,yCAAyCC;;;;;;EAMxD,oBAAoB;;;;;;;;;wBAUN,uBACd,UAAS,mCACR;;;;qBAiCU,kBAAgB"}
|
package/dist/maas/edge/index.js
CHANGED
|
@@ -1,209 +1,179 @@
|
|
|
1
|
-
|
|
2
|
-
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
}),
|
|
31
|
-
privateKeyId: loadOptionalSetting({
|
|
32
|
-
settingValue: void 0,
|
|
33
|
-
environmentVariableName: "GOOGLE_PRIVATE_KEY_ID"
|
|
34
|
-
})
|
|
35
|
-
};
|
|
36
|
-
} catch (error) {
|
|
37
|
-
throw new Error(`Failed to load Google credentials: ${error.message}`);
|
|
38
|
-
}
|
|
1
|
+
import { getRuntimeEnvironmentUserAgent, loadOptionalSetting, loadSetting, resolve, withUserAgentSuffix, withoutTrailingSlash } from "@ai-sdk/provider-utils";
|
|
2
|
+
import { createOpenAICompatible } from "@ai-sdk/openai-compatible";
|
|
3
|
+
//#region src/version.ts
|
|
4
|
+
const VERSION = "5.0.99";
|
|
5
|
+
//#endregion
|
|
6
|
+
//#region src/edge/google-vertex-auth-edge.ts
|
|
7
|
+
const loadCredentials = async () => {
|
|
8
|
+
try {
|
|
9
|
+
return {
|
|
10
|
+
clientEmail: loadSetting({
|
|
11
|
+
settingValue: void 0,
|
|
12
|
+
settingName: "clientEmail",
|
|
13
|
+
environmentVariableName: "GOOGLE_CLIENT_EMAIL",
|
|
14
|
+
description: "Google client email"
|
|
15
|
+
}),
|
|
16
|
+
privateKey: loadSetting({
|
|
17
|
+
settingValue: void 0,
|
|
18
|
+
settingName: "privateKey",
|
|
19
|
+
environmentVariableName: "GOOGLE_PRIVATE_KEY",
|
|
20
|
+
description: "Google private key"
|
|
21
|
+
}),
|
|
22
|
+
privateKeyId: loadOptionalSetting({
|
|
23
|
+
settingValue: void 0,
|
|
24
|
+
environmentVariableName: "GOOGLE_PRIVATE_KEY_ID"
|
|
25
|
+
})
|
|
26
|
+
};
|
|
27
|
+
} catch (error) {
|
|
28
|
+
throw new Error(`Failed to load Google credentials: ${error.message}`);
|
|
29
|
+
}
|
|
39
30
|
};
|
|
40
|
-
|
|
41
|
-
|
|
31
|
+
const base64url = (str) => {
|
|
32
|
+
return btoa(str).replace(/\+/g, "-").replace(/\//g, "_").replace(/=/g, "");
|
|
42
33
|
};
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
return await crypto.subtle.importKey(
|
|
53
|
-
"pkcs8",
|
|
54
|
-
binaryData,
|
|
55
|
-
{ name: "RSASSA-PKCS1-v1_5", hash: "SHA-256" },
|
|
56
|
-
true,
|
|
57
|
-
["sign"]
|
|
58
|
-
);
|
|
34
|
+
const importPrivateKey = async (pemKey) => {
|
|
35
|
+
const pemContents = pemKey.replace("-----BEGIN PRIVATE KEY-----", "").replace("-----END PRIVATE KEY-----", "").replace(/\s/g, "");
|
|
36
|
+
const binaryString = atob(pemContents);
|
|
37
|
+
const binaryData = new Uint8Array(binaryString.length);
|
|
38
|
+
for (let i = 0; i < binaryString.length; i++) binaryData[i] = binaryString.charCodeAt(i);
|
|
39
|
+
return await crypto.subtle.importKey("pkcs8", binaryData, {
|
|
40
|
+
name: "RSASSA-PKCS1-v1_5",
|
|
41
|
+
hash: "SHA-256"
|
|
42
|
+
}, true, ["sign"]);
|
|
59
43
|
};
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
const encoder = new TextEncoder();
|
|
81
|
-
const data = encoder.encode(signingInput);
|
|
82
|
-
const signature = await crypto.subtle.sign(
|
|
83
|
-
"RSASSA-PKCS1-v1_5",
|
|
84
|
-
privateKey,
|
|
85
|
-
data
|
|
86
|
-
);
|
|
87
|
-
const signatureBase64 = base64url(
|
|
88
|
-
String.fromCharCode(...new Uint8Array(signature))
|
|
89
|
-
);
|
|
90
|
-
return `${base64url(JSON.stringify(header))}.${base64url(
|
|
91
|
-
JSON.stringify(payload)
|
|
92
|
-
)}.${signatureBase64}`;
|
|
44
|
+
const buildJwt = async (credentials) => {
|
|
45
|
+
const now = Math.floor(Date.now() / 1e3);
|
|
46
|
+
const header = {
|
|
47
|
+
alg: "RS256",
|
|
48
|
+
typ: "JWT"
|
|
49
|
+
};
|
|
50
|
+
if (credentials.privateKeyId) header.kid = credentials.privateKeyId;
|
|
51
|
+
const payload = {
|
|
52
|
+
iss: credentials.clientEmail,
|
|
53
|
+
scope: "https://www.googleapis.com/auth/cloud-platform",
|
|
54
|
+
aud: "https://oauth2.googleapis.com/token",
|
|
55
|
+
exp: now + 3600,
|
|
56
|
+
iat: now
|
|
57
|
+
};
|
|
58
|
+
const privateKey = await importPrivateKey(credentials.privateKey);
|
|
59
|
+
const signingInput = `${base64url(JSON.stringify(header))}.${base64url(JSON.stringify(payload))}`;
|
|
60
|
+
const data = new TextEncoder().encode(signingInput);
|
|
61
|
+
const signature = await crypto.subtle.sign("RSASSA-PKCS1-v1_5", privateKey, data);
|
|
62
|
+
const signatureBase64 = base64url(String.fromCharCode(...new Uint8Array(signature)));
|
|
63
|
+
return `${base64url(JSON.stringify(header))}.${base64url(JSON.stringify(payload))}.${signatureBase64}`;
|
|
93
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Generate an authentication token for Google Vertex AI in a manner compatible
|
|
67
|
+
* with the Edge runtime.
|
|
68
|
+
*/
|
|
94
69
|
async function generateAuthToken(credentials) {
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
})
|
|
108
|
-
});
|
|
109
|
-
if (!response.ok) {
|
|
110
|
-
throw new Error(`Token request failed: ${response.statusText}`);
|
|
111
|
-
}
|
|
112
|
-
const data = await response.json();
|
|
113
|
-
return data.access_token;
|
|
70
|
+
const creds = credentials || await loadCredentials();
|
|
71
|
+
const jwt = await buildJwt(creds);
|
|
72
|
+
const response = await fetch("https://oauth2.googleapis.com/token", {
|
|
73
|
+
method: "POST",
|
|
74
|
+
headers: withUserAgentSuffix({ "Content-Type": "application/x-www-form-urlencoded" }, `ai-sdk-google-vertex/${VERSION}`, getRuntimeEnvironmentUserAgent()),
|
|
75
|
+
body: new URLSearchParams({
|
|
76
|
+
grant_type: "urn:ietf:params:oauth:grant-type:jwt-bearer",
|
|
77
|
+
assertion: jwt
|
|
78
|
+
})
|
|
79
|
+
});
|
|
80
|
+
if (!response.ok) throw new Error(`Token request failed: ${response.statusText}`);
|
|
81
|
+
return (await response.json()).access_token;
|
|
114
82
|
}
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
import {
|
|
121
|
-
loadOptionalSetting as loadOptionalSetting2,
|
|
122
|
-
loadSetting as loadSetting2,
|
|
123
|
-
withoutTrailingSlash
|
|
124
|
-
} from "@ai-sdk/provider-utils";
|
|
125
|
-
var maxOutputTokensByModel = {
|
|
126
|
-
"meta/llama-4-maverick-17b-128e-instruct-maas": 8192,
|
|
127
|
-
"meta/llama-4-scout-17b-16e-instruct-maas": 8192
|
|
83
|
+
//#endregion
|
|
84
|
+
//#region src/maas/google-vertex-maas-provider.ts
|
|
85
|
+
const maxOutputTokensByModel = {
|
|
86
|
+
"meta/llama-4-maverick-17b-128e-instruct-maas": 8192,
|
|
87
|
+
"meta/llama-4-scout-17b-16e-instruct-maas": 8192
|
|
128
88
|
};
|
|
129
89
|
function transformGoogleVertexMaasRequestBody(args) {
|
|
130
|
-
|
|
131
|
-
|
|
90
|
+
const maxOutputTokens = maxOutputTokensByModel[args.model];
|
|
91
|
+
return maxOutputTokens != null && args.max_tokens === void 0 ? {
|
|
92
|
+
...args,
|
|
93
|
+
max_tokens: maxOutputTokens
|
|
94
|
+
} : args;
|
|
132
95
|
}
|
|
96
|
+
/**
|
|
97
|
+
* Create a Google Vertex AI MaaS (Model as a Service) provider instance.
|
|
98
|
+
* Uses the OpenAI-compatible Chat Completions API for partner and open models.
|
|
99
|
+
*
|
|
100
|
+
* @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models
|
|
101
|
+
*/
|
|
102
|
+
function createGoogleVertexMaas$1(options = {}) {
|
|
103
|
+
const loadLocation = () => loadOptionalSetting({
|
|
104
|
+
settingValue: options.location,
|
|
105
|
+
environmentVariableName: "GOOGLE_VERTEX_LOCATION"
|
|
106
|
+
});
|
|
107
|
+
const loadProject = () => loadSetting({
|
|
108
|
+
settingValue: options.project,
|
|
109
|
+
settingName: "project",
|
|
110
|
+
environmentVariableName: "GOOGLE_VERTEX_PROJECT",
|
|
111
|
+
description: "Google Vertex project"
|
|
112
|
+
});
|
|
113
|
+
const getHost = (location) => {
|
|
114
|
+
if (location === "global") return "aiplatform.googleapis.com";
|
|
115
|
+
else if (location === "eu" || location === "us") return `aiplatform.${location}.rep.googleapis.com`;
|
|
116
|
+
else return `${location}-aiplatform.googleapis.com`;
|
|
117
|
+
};
|
|
118
|
+
const constructBaseURL = () => {
|
|
119
|
+
const projectId = loadProject();
|
|
120
|
+
const location = loadLocation() ?? "global";
|
|
121
|
+
return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;
|
|
122
|
+
};
|
|
123
|
+
const loadBaseURL = () => withoutTrailingSlash(options.baseURL ?? "") || constructBaseURL();
|
|
124
|
+
let cachedProvider;
|
|
125
|
+
const getProvider = () => cachedProvider ??= createOpenAICompatible({
|
|
126
|
+
name: "vertex.maas",
|
|
127
|
+
baseURL: loadBaseURL(),
|
|
128
|
+
fetch: options.fetch,
|
|
129
|
+
transformRequestBody: transformGoogleVertexMaasRequestBody
|
|
130
|
+
});
|
|
131
|
+
const provider = (modelId) => getProvider()(modelId);
|
|
132
|
+
provider.specificationVersion = "v4";
|
|
133
|
+
provider.languageModel = (modelId) => getProvider().languageModel(modelId);
|
|
134
|
+
provider.chatModel = (modelId) => getProvider().chatModel(modelId);
|
|
135
|
+
provider.completionModel = (modelId) => getProvider().completionModel(modelId);
|
|
136
|
+
provider.embeddingModel = (modelId) => getProvider().embeddingModel(modelId);
|
|
137
|
+
provider.textEmbeddingModel = (modelId) => getProvider().textEmbeddingModel(modelId);
|
|
138
|
+
provider.imageModel = (modelId) => getProvider().imageModel(modelId);
|
|
139
|
+
return provider;
|
|
140
|
+
}
|
|
141
|
+
//#endregion
|
|
142
|
+
//#region src/maas/edge/google-vertex-maas-provider-edge.ts
|
|
143
|
+
/**
|
|
144
|
+
* Create a Google Vertex AI MaaS (Model as a Service) provider instance for Edge runtimes.
|
|
145
|
+
* Uses the OpenAI-compatible Chat Completions API for partner and open models.
|
|
146
|
+
* Automatically handles Google Cloud authentication.
|
|
147
|
+
*
|
|
148
|
+
* @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models
|
|
149
|
+
*/
|
|
133
150
|
function createGoogleVertexMaas(options = {}) {
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
const projectId = loadProject();
|
|
155
|
-
const location = loadLocation() ?? "global";
|
|
156
|
-
return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;
|
|
157
|
-
};
|
|
158
|
-
const loadBaseURL = () => withoutTrailingSlash(options.baseURL ?? "") || constructBaseURL();
|
|
159
|
-
let cachedProvider;
|
|
160
|
-
const getProvider = () => cachedProvider ??= createOpenAICompatible({
|
|
161
|
-
name: "vertex.maas",
|
|
162
|
-
baseURL: loadBaseURL(),
|
|
163
|
-
fetch: options.fetch,
|
|
164
|
-
transformRequestBody: transformGoogleVertexMaasRequestBody
|
|
165
|
-
});
|
|
166
|
-
const provider = (modelId) => getProvider()(modelId);
|
|
167
|
-
provider.specificationVersion = "v4";
|
|
168
|
-
provider.languageModel = (modelId) => getProvider().languageModel(modelId);
|
|
169
|
-
provider.chatModel = (modelId) => getProvider().chatModel(modelId);
|
|
170
|
-
provider.completionModel = (modelId) => getProvider().completionModel(modelId);
|
|
171
|
-
provider.embeddingModel = (modelId) => getProvider().embeddingModel(modelId);
|
|
172
|
-
provider.textEmbeddingModel = (modelId) => getProvider().textEmbeddingModel(modelId);
|
|
173
|
-
provider.imageModel = (modelId) => getProvider().imageModel(modelId);
|
|
174
|
-
return provider;
|
|
151
|
+
const customFetch = async (url, init) => {
|
|
152
|
+
const token = await generateAuthToken(options.googleCredentials);
|
|
153
|
+
const authHeaders = {
|
|
154
|
+
...await resolve(options.headers),
|
|
155
|
+
Authorization: `Bearer ${token}`
|
|
156
|
+
};
|
|
157
|
+
const fetchInit = {
|
|
158
|
+
...init,
|
|
159
|
+
headers: {
|
|
160
|
+
...init?.headers,
|
|
161
|
+
...authHeaders
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
return (options.fetch ?? fetch)(url, fetchInit);
|
|
165
|
+
};
|
|
166
|
+
return createGoogleVertexMaas$1({
|
|
167
|
+
...options,
|
|
168
|
+
fetch: customFetch,
|
|
169
|
+
headers: void 0
|
|
170
|
+
});
|
|
175
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Default Google Vertex AI MaaS provider instance for Edge runtimes.
|
|
174
|
+
*/
|
|
175
|
+
const googleVertexMaas = createGoogleVertexMaas();
|
|
176
|
+
//#endregion
|
|
177
|
+
export { createGoogleVertexMaas, createGoogleVertexMaas as createVertexMaas, googleVertexMaas, googleVertexMaas as vertexMaas };
|
|
176
178
|
|
|
177
|
-
// src/maas/edge/google-vertex-maas-provider-edge.ts
|
|
178
|
-
function createGoogleVertexMaas2(options = {}) {
|
|
179
|
-
const customFetch = async (url, init) => {
|
|
180
|
-
const token = await generateAuthToken(options.googleCredentials);
|
|
181
|
-
const resolvedHeaders = await resolve(options.headers);
|
|
182
|
-
const authHeaders = {
|
|
183
|
-
...resolvedHeaders,
|
|
184
|
-
Authorization: `Bearer ${token}`
|
|
185
|
-
};
|
|
186
|
-
const fetchInit = {
|
|
187
|
-
...init,
|
|
188
|
-
headers: {
|
|
189
|
-
...init?.headers,
|
|
190
|
-
...authHeaders
|
|
191
|
-
}
|
|
192
|
-
};
|
|
193
|
-
return (options.fetch ?? fetch)(url, fetchInit);
|
|
194
|
-
};
|
|
195
|
-
return createGoogleVertexMaas({
|
|
196
|
-
...options,
|
|
197
|
-
fetch: customFetch,
|
|
198
|
-
headers: void 0
|
|
199
|
-
// Don't pass headers, we handle them in fetch
|
|
200
|
-
});
|
|
201
|
-
}
|
|
202
|
-
var googleVertexMaas = createGoogleVertexMaas2();
|
|
203
|
-
export {
|
|
204
|
-
createGoogleVertexMaas2 as createGoogleVertexMaas,
|
|
205
|
-
createGoogleVertexMaas2 as createVertexMaas,
|
|
206
|
-
googleVertexMaas,
|
|
207
|
-
googleVertexMaas as vertexMaas
|
|
208
|
-
};
|
|
209
179
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/maas/edge/google-vertex-maas-provider-edge.ts","../../../src/edge/google-vertex-auth-edge.ts","../../../src/version.ts","../../../src/maas/google-vertex-maas-provider.ts"],"sourcesContent":["import { resolve, type FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n generateAuthToken,\n type GoogleCredentials,\n} from '../../edge/google-vertex-auth-edge';\nimport {\n createGoogleVertexMaas as createVertexMaasOriginal,\n type GoogleVertexMaasProvider,\n type GoogleVertexMaasProviderSettings as GoogleVertexMaasProviderSettingsOriginal,\n} from '../google-vertex-maas-provider';\nexport type { GoogleVertexMaasProvider };\n\nexport interface GoogleVertexMaasProviderSettings extends GoogleVertexMaasProviderSettingsOriginal {\n /**\n * Optional. The Google credentials for the Google Cloud service account. If\n * not provided, the Google Vertex provider will use environment variables to\n * load the credentials.\n */\n googleCredentials?: GoogleCredentials;\n}\n\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance for Edge runtimes.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n * Automatically handles Google Cloud authentication.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Create a custom fetch wrapper that adds auth headers\n const customFetch: FetchFunction = async (url, init) => {\n const token = await generateAuthToken(options.googleCredentials);\n const resolvedHeaders = await resolve(options.headers);\n const authHeaders = {\n ...resolvedHeaders,\n Authorization: `Bearer ${token}`,\n };\n\n // Merge auth headers with existing headers from init\n const fetchInit = {\n ...init,\n headers: {\n ...init?.headers,\n ...authHeaders,\n },\n };\n\n // Call the original fetch or user's custom fetch\n return (options.fetch ?? fetch)(url, fetchInit);\n };\n\n return createVertexMaasOriginal({\n ...options,\n fetch: customFetch,\n headers: undefined, // Don't pass headers, we handle them in fetch\n });\n}\n\n/**\n * Default Google Vertex AI MaaS provider instance for Edge runtimes.\n */\nexport const googleVertexMaas = createGoogleVertexMaas();\n","import {\n loadOptionalSetting,\n loadSetting,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from '../version';\n\nexport interface GoogleCredentials {\n /**\n * The client email for the Google Cloud service account. Defaults to the\n * value of the `GOOGLE_CLIENT_EMAIL` environment variable.\n */\n clientEmail: string;\n\n /**\n * The private key for the Google Cloud service account. Defaults to the\n * value of the `GOOGLE_PRIVATE_KEY` environment variable.\n */\n privateKey: string;\n\n /**\n * Optional. The private key ID for the Google Cloud service account. Defaults\n * to the value of the `GOOGLE_PRIVATE_KEY_ID` environment variable.\n */\n privateKeyId?: string;\n}\n\nconst loadCredentials = async (): Promise<GoogleCredentials> => {\n try {\n return {\n clientEmail: loadSetting({\n settingValue: undefined,\n settingName: 'clientEmail',\n environmentVariableName: 'GOOGLE_CLIENT_EMAIL',\n description: 'Google client email',\n }),\n privateKey: loadSetting({\n settingValue: undefined,\n settingName: 'privateKey',\n environmentVariableName: 'GOOGLE_PRIVATE_KEY',\n description: 'Google private key',\n }),\n privateKeyId: loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'GOOGLE_PRIVATE_KEY_ID',\n }),\n };\n } catch (error: any) {\n throw new Error(`Failed to load Google credentials: ${error.message}`);\n }\n};\n\n// Convert a string to base64url\nconst base64url = (str: string) => {\n return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n};\nconst importPrivateKey = async (pemKey: string) => {\n const pemHeader = '-----BEGIN PRIVATE KEY-----';\n const pemFooter = '-----END PRIVATE KEY-----';\n\n // Remove header, footer, and any whitespace/newlines\n const pemContents = pemKey\n .replace(pemHeader, '')\n .replace(pemFooter, '')\n .replace(/\\s/g, '');\n\n // Decode base64 to binary\n const binaryString = atob(pemContents);\n\n // Convert binary string to Uint8Array\n const binaryData = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n binaryData[i] = binaryString.charCodeAt(i);\n }\n\n return await crypto.subtle.importKey(\n 'pkcs8',\n binaryData,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n true,\n ['sign'],\n );\n};\n\nconst buildJwt = async (credentials: GoogleCredentials) => {\n const now = Math.floor(Date.now() / 1000);\n\n // Only include kid in header if privateKeyId is provided\n const header: { alg: string; typ: string; kid?: string } = {\n alg: 'RS256',\n typ: 'JWT',\n };\n\n if (credentials.privateKeyId) {\n header.kid = credentials.privateKeyId;\n }\n\n const payload = {\n iss: credentials.clientEmail,\n scope: 'https://www.googleapis.com/auth/cloud-platform',\n aud: 'https://oauth2.googleapis.com/token',\n exp: now + 3600,\n iat: now,\n };\n\n const privateKey = await importPrivateKey(credentials.privateKey);\n\n const signingInput = `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}`;\n const encoder = new TextEncoder();\n const data = encoder.encode(signingInput);\n\n const signature = await crypto.subtle.sign(\n 'RSASSA-PKCS1-v1_5',\n privateKey,\n data,\n );\n\n const signatureBase64 = base64url(\n String.fromCharCode(...new Uint8Array(signature)),\n );\n\n return `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}.${signatureBase64}`;\n};\n\n/**\n * Generate an authentication token for Google Vertex AI in a manner compatible\n * with the Edge runtime.\n */\nexport async function generateAuthToken(credentials?: GoogleCredentials) {\n const creds = credentials || (await loadCredentials());\n const jwt = await buildJwt(creds);\n\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: withUserAgentSuffix(\n { 'Content-Type': 'application/x-www-form-urlencoded' },\n `ai-sdk/google-vertex/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n ),\n body: new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: jwt,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Token request failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.access_token;\n}\n","// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import {\n createOpenAICompatible,\n type OpenAICompatibleProvider,\n} from '@ai-sdk/openai-compatible';\nimport {\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport type { GoogleVertexMaasModelId } from './google-vertex-maas-options';\n\nconst maxOutputTokensByModel: Record<string, number | undefined> = {\n 'meta/llama-4-maverick-17b-128e-instruct-maas': 8192,\n 'meta/llama-4-scout-17b-16e-instruct-maas': 8192,\n};\n\nfunction transformGoogleVertexMaasRequestBody(args: Record<string, any>) {\n const maxOutputTokens = maxOutputTokensByModel[args.model];\n\n return maxOutputTokens != null && args.max_tokens === undefined\n ? { ...args, max_tokens: maxOutputTokens }\n : args;\n}\n\nexport interface GoogleVertexMaasProvider extends OpenAICompatibleProvider<\n GoogleVertexMaasModelId,\n string,\n string,\n string\n> {}\n\nexport interface GoogleVertexMaasProviderSettings {\n /**\n * Google Cloud project ID. Defaults to the value of the `GOOGLE_VERTEX_PROJECT` environment variable.\n */\n project?: string;\n\n /**\n * Google Cloud location/region. Defaults to the value of the `GOOGLE_VERTEX_LOCATION` environment variable.\n * Use 'global' for the global endpoint.\n */\n location?: string;\n\n /**\n * Base URL for the API calls. If not provided, will be constructed from project and location.\n */\n baseURL?: string;\n\n /**\n * Headers to use for requests. Can be:\n * - A headers object\n * - A Promise that resolves to a headers object\n * - A function that returns a headers object\n * - A function that returns a Promise of a headers object\n */\n headers?: Resolvable<Record<string, string | undefined>>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Lazy-load settings to support loading from environment variables at runtime\n const loadLocation = () =>\n loadOptionalSetting({\n settingValue: options.location,\n environmentVariableName: 'GOOGLE_VERTEX_LOCATION',\n });\n\n const loadProject = () =>\n loadSetting({\n settingValue: options.project,\n settingName: 'project',\n environmentVariableName: 'GOOGLE_VERTEX_PROJECT',\n description: 'Google Vertex project',\n });\n\n const getHost = (location: string) => {\n if (location === 'global') {\n return 'aiplatform.googleapis.com';\n } else if (location === 'eu' || location === 'us') {\n return `aiplatform.${location}.rep.googleapis.com`;\n } else {\n return `${location}-aiplatform.googleapis.com`;\n }\n };\n\n const constructBaseURL = () => {\n const projectId = loadProject();\n const location = loadLocation() ?? 'global';\n\n return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;\n };\n\n const loadBaseURL = () =>\n withoutTrailingSlash(options.baseURL ?? '') || constructBaseURL();\n\n let cachedProvider: GoogleVertexMaasProvider | undefined;\n const getProvider = () =>\n (cachedProvider ??= createOpenAICompatible({\n name: 'vertex.maas',\n baseURL: loadBaseURL(),\n fetch: options.fetch,\n transformRequestBody: transformGoogleVertexMaasRequestBody,\n }));\n\n const provider = (modelId: GoogleVertexMaasModelId) => getProvider()(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().languageModel(modelId);\n provider.chatModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().chatModel(modelId);\n provider.completionModel = (modelId: string) =>\n getProvider().completionModel(modelId);\n provider.embeddingModel = (modelId: string) =>\n getProvider().embeddingModel(modelId);\n provider.textEmbeddingModel = (modelId: string) =>\n getProvider().textEmbeddingModel(modelId);\n provider.imageModel = (modelId: string) => getProvider().imageModel(modelId);\n\n return provider as GoogleVertexMaasProvider;\n}\n"],"mappings":"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","names":["loadOptionalSetting","loadSetting","createGoogleVertexMaas"]}
|
|
1
|
+
{"version":3,"file":"index.js","names":["createGoogleVertexMaas","createVertexMaasOriginal"],"sources":["../../../src/version.ts","../../../src/edge/google-vertex-auth-edge.ts","../../../src/maas/google-vertex-maas-provider.ts","../../../src/maas/edge/google-vertex-maas-provider-edge.ts"],"sourcesContent":["// Version string of this package injected at build time.\ndeclare const __PACKAGE_VERSION__: string | undefined;\nexport const VERSION: string =\n typeof __PACKAGE_VERSION__ !== 'undefined'\n ? __PACKAGE_VERSION__\n : '0.0.0-test';\n","import {\n loadOptionalSetting,\n loadSetting,\n withUserAgentSuffix,\n getRuntimeEnvironmentUserAgent,\n} from '@ai-sdk/provider-utils';\nimport { VERSION } from '../version';\n\nexport interface GoogleCredentials {\n /**\n * The client email for the Google Cloud service account. Defaults to the\n * value of the `GOOGLE_CLIENT_EMAIL` environment variable.\n */\n clientEmail: string;\n\n /**\n * The private key for the Google Cloud service account. Defaults to the\n * value of the `GOOGLE_PRIVATE_KEY` environment variable.\n */\n privateKey: string;\n\n /**\n * Optional. The private key ID for the Google Cloud service account. Defaults\n * to the value of the `GOOGLE_PRIVATE_KEY_ID` environment variable.\n */\n privateKeyId?: string;\n}\n\nconst loadCredentials = async (): Promise<GoogleCredentials> => {\n try {\n return {\n clientEmail: loadSetting({\n settingValue: undefined,\n settingName: 'clientEmail',\n environmentVariableName: 'GOOGLE_CLIENT_EMAIL',\n description: 'Google client email',\n }),\n privateKey: loadSetting({\n settingValue: undefined,\n settingName: 'privateKey',\n environmentVariableName: 'GOOGLE_PRIVATE_KEY',\n description: 'Google private key',\n }),\n privateKeyId: loadOptionalSetting({\n settingValue: undefined,\n environmentVariableName: 'GOOGLE_PRIVATE_KEY_ID',\n }),\n };\n } catch (error: any) {\n throw new Error(`Failed to load Google credentials: ${error.message}`);\n }\n};\n\n// Convert a string to base64url\nconst base64url = (str: string) => {\n return btoa(str).replace(/\\+/g, '-').replace(/\\//g, '_').replace(/=/g, '');\n};\nconst importPrivateKey = async (pemKey: string) => {\n const pemHeader = '-----BEGIN PRIVATE KEY-----';\n const pemFooter = '-----END PRIVATE KEY-----';\n\n // Remove header, footer, and any whitespace/newlines\n const pemContents = pemKey\n .replace(pemHeader, '')\n .replace(pemFooter, '')\n .replace(/\\s/g, '');\n\n // Decode base64 to binary\n const binaryString = atob(pemContents);\n\n // Convert binary string to Uint8Array\n const binaryData = new Uint8Array(binaryString.length);\n for (let i = 0; i < binaryString.length; i++) {\n binaryData[i] = binaryString.charCodeAt(i);\n }\n\n return await crypto.subtle.importKey(\n 'pkcs8',\n binaryData,\n { name: 'RSASSA-PKCS1-v1_5', hash: 'SHA-256' },\n true,\n ['sign'],\n );\n};\n\nconst buildJwt = async (credentials: GoogleCredentials) => {\n const now = Math.floor(Date.now() / 1000);\n\n // Only include kid in header if privateKeyId is provided\n const header: { alg: string; typ: string; kid?: string } = {\n alg: 'RS256',\n typ: 'JWT',\n };\n\n if (credentials.privateKeyId) {\n header.kid = credentials.privateKeyId;\n }\n\n const payload = {\n iss: credentials.clientEmail,\n scope: 'https://www.googleapis.com/auth/cloud-platform',\n aud: 'https://oauth2.googleapis.com/token',\n exp: now + 3600,\n iat: now,\n };\n\n const privateKey = await importPrivateKey(credentials.privateKey);\n\n const signingInput = `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}`;\n const encoder = new TextEncoder();\n const data = encoder.encode(signingInput);\n\n const signature = await crypto.subtle.sign(\n 'RSASSA-PKCS1-v1_5',\n privateKey,\n data,\n );\n\n const signatureBase64 = base64url(\n String.fromCharCode(...new Uint8Array(signature)),\n );\n\n return `${base64url(JSON.stringify(header))}.${base64url(\n JSON.stringify(payload),\n )}.${signatureBase64}`;\n};\n\n/**\n * Generate an authentication token for Google Vertex AI in a manner compatible\n * with the Edge runtime.\n */\nexport async function generateAuthToken(credentials?: GoogleCredentials) {\n const creds = credentials || (await loadCredentials());\n const jwt = await buildJwt(creds);\n\n const response = await fetch('https://oauth2.googleapis.com/token', {\n method: 'POST',\n headers: withUserAgentSuffix(\n { 'Content-Type': 'application/x-www-form-urlencoded' },\n `ai-sdk-google-vertex/${VERSION}`,\n getRuntimeEnvironmentUserAgent(),\n ),\n body: new URLSearchParams({\n grant_type: 'urn:ietf:params:oauth:grant-type:jwt-bearer',\n assertion: jwt,\n }),\n });\n\n if (!response.ok) {\n throw new Error(`Token request failed: ${response.statusText}`);\n }\n\n const data = await response.json();\n return data.access_token;\n}\n","import {\n createOpenAICompatible,\n type OpenAICompatibleProvider,\n} from '@ai-sdk/openai-compatible';\nimport {\n loadOptionalSetting,\n loadSetting,\n withoutTrailingSlash,\n type FetchFunction,\n type Resolvable,\n} from '@ai-sdk/provider-utils';\nimport type { GoogleVertexMaasModelId } from './google-vertex-maas-options';\n\nconst maxOutputTokensByModel: Record<string, number | undefined> = {\n 'meta/llama-4-maverick-17b-128e-instruct-maas': 8192,\n 'meta/llama-4-scout-17b-16e-instruct-maas': 8192,\n};\n\nfunction transformGoogleVertexMaasRequestBody(args: Record<string, any>) {\n const maxOutputTokens = maxOutputTokensByModel[args.model];\n\n return maxOutputTokens != null && args.max_tokens === undefined\n ? { ...args, max_tokens: maxOutputTokens }\n : args;\n}\n\nexport interface GoogleVertexMaasProvider extends OpenAICompatibleProvider<\n GoogleVertexMaasModelId,\n string,\n string,\n string\n> {}\n\nexport interface GoogleVertexMaasProviderSettings {\n /**\n * Google Cloud project ID. Defaults to the value of the `GOOGLE_VERTEX_PROJECT` environment variable.\n */\n project?: string;\n\n /**\n * Google Cloud location/region. Defaults to the value of the `GOOGLE_VERTEX_LOCATION` environment variable.\n * Use 'global' for the global endpoint.\n */\n location?: string;\n\n /**\n * Base URL for the API calls. If not provided, will be constructed from project and location.\n */\n baseURL?: string;\n\n /**\n * Headers to use for requests. Can be:\n * - A headers object\n * - A Promise that resolves to a headers object\n * - A function that returns a headers object\n * - A function that returns a Promise of a headers object\n */\n headers?: Resolvable<Record<string, string | undefined>>;\n\n /**\n * Custom fetch implementation. You can use it as a middleware to intercept requests,\n * or to provide a custom fetch implementation for e.g. testing.\n */\n fetch?: FetchFunction;\n}\n\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Lazy-load settings to support loading from environment variables at runtime\n const loadLocation = () =>\n loadOptionalSetting({\n settingValue: options.location,\n environmentVariableName: 'GOOGLE_VERTEX_LOCATION',\n });\n\n const loadProject = () =>\n loadSetting({\n settingValue: options.project,\n settingName: 'project',\n environmentVariableName: 'GOOGLE_VERTEX_PROJECT',\n description: 'Google Vertex project',\n });\n\n const getHost = (location: string) => {\n if (location === 'global') {\n return 'aiplatform.googleapis.com';\n } else if (location === 'eu' || location === 'us') {\n return `aiplatform.${location}.rep.googleapis.com`;\n } else {\n return `${location}-aiplatform.googleapis.com`;\n }\n };\n\n const constructBaseURL = () => {\n const projectId = loadProject();\n const location = loadLocation() ?? 'global';\n\n return `https://${getHost(location)}/v1/projects/${projectId}/locations/${location}/endpoints/openapi`;\n };\n\n const loadBaseURL = () =>\n withoutTrailingSlash(options.baseURL ?? '') || constructBaseURL();\n\n let cachedProvider: GoogleVertexMaasProvider | undefined;\n const getProvider = () =>\n (cachedProvider ??= createOpenAICompatible({\n name: 'vertex.maas',\n baseURL: loadBaseURL(),\n fetch: options.fetch,\n transformRequestBody: transformGoogleVertexMaasRequestBody,\n }));\n\n const provider = (modelId: GoogleVertexMaasModelId) => getProvider()(modelId);\n\n provider.specificationVersion = 'v4' as const;\n provider.languageModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().languageModel(modelId);\n provider.chatModel = (modelId: GoogleVertexMaasModelId) =>\n getProvider().chatModel(modelId);\n provider.completionModel = (modelId: string) =>\n getProvider().completionModel(modelId);\n provider.embeddingModel = (modelId: string) =>\n getProvider().embeddingModel(modelId);\n provider.textEmbeddingModel = (modelId: string) =>\n getProvider().textEmbeddingModel(modelId);\n provider.imageModel = (modelId: string) => getProvider().imageModel(modelId);\n\n return provider as GoogleVertexMaasProvider;\n}\n","import { resolve, type FetchFunction } from '@ai-sdk/provider-utils';\nimport {\n generateAuthToken,\n type GoogleCredentials,\n} from '../../edge/google-vertex-auth-edge';\nimport {\n createGoogleVertexMaas as createVertexMaasOriginal,\n type GoogleVertexMaasProvider,\n type GoogleVertexMaasProviderSettings as GoogleVertexMaasProviderSettingsOriginal,\n} from '../google-vertex-maas-provider';\nexport type { GoogleVertexMaasProvider };\n\nexport interface GoogleVertexMaasProviderSettings extends GoogleVertexMaasProviderSettingsOriginal {\n /**\n * Optional. The Google credentials for the Google Cloud service account. If\n * not provided, the Google Vertex provider will use environment variables to\n * load the credentials.\n */\n googleCredentials?: GoogleCredentials;\n}\n\n/**\n * Create a Google Vertex AI MaaS (Model as a Service) provider instance for Edge runtimes.\n * Uses the OpenAI-compatible Chat Completions API for partner and open models.\n * Automatically handles Google Cloud authentication.\n *\n * @see https://cloud.google.com/vertex-ai/generative-ai/docs/maas/use-open-models\n */\nexport function createGoogleVertexMaas(\n options: GoogleVertexMaasProviderSettings = {},\n): GoogleVertexMaasProvider {\n // Create a custom fetch wrapper that adds auth headers\n const customFetch: FetchFunction = async (url, init) => {\n const token = await generateAuthToken(options.googleCredentials);\n const resolvedHeaders = await resolve(options.headers);\n const authHeaders = {\n ...resolvedHeaders,\n Authorization: `Bearer ${token}`,\n };\n\n // Merge auth headers with existing headers from init\n const fetchInit = {\n ...init,\n headers: {\n ...init?.headers,\n ...authHeaders,\n },\n };\n\n // Call the original fetch or user's custom fetch\n return (options.fetch ?? fetch)(url, fetchInit);\n };\n\n return createVertexMaasOriginal({\n ...options,\n fetch: customFetch,\n headers: undefined, // Don't pass headers, we handle them in fetch\n });\n}\n\n/**\n * Default Google Vertex AI MaaS provider instance for Edge runtimes.\n */\nexport const googleVertexMaas = createGoogleVertexMaas();\n"],"mappings":"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"}
|