@firebase/ai 2.1.0-canary.44d8d742f → 2.1.0-canary.84b8bed35
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/dist/ai-public.d.ts +85 -9
- package/dist/ai.d.ts +100 -10
- package/dist/esm/index.esm.js +114 -82
- package/dist/esm/index.esm.js.map +1 -1
- package/dist/esm/src/index.d.ts +3 -0
- package/dist/esm/src/methods/chrome-adapter.d.ts +23 -21
- package/dist/esm/src/models/ai-model.d.ts +1 -1
- package/dist/esm/src/public-types.d.ts +10 -1
- package/dist/esm/src/requests/response-helpers.d.ts +9 -5
- package/dist/esm/src/service.d.ts +4 -1
- package/dist/esm/src/types/chrome-adapter.d.ts +6 -4
- package/dist/esm/src/types/content.d.ts +25 -0
- package/dist/esm/src/types/requests.d.ts +13 -1
- package/dist/esm/src/types/responses.d.ts +23 -4
- package/dist/index.cjs.js +114 -81
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.node.cjs.js +101 -70
- package/dist/index.node.cjs.js.map +1 -1
- package/dist/index.node.mjs +101 -70
- package/dist/index.node.mjs.map +1 -1
- package/dist/src/index.d.ts +3 -0
- package/dist/src/methods/chrome-adapter.d.ts +23 -21
- package/dist/src/models/ai-model.d.ts +1 -1
- package/dist/src/public-types.d.ts +10 -1
- package/dist/src/requests/response-helpers.d.ts +9 -5
- package/dist/src/service.d.ts +4 -1
- package/dist/src/types/chrome-adapter.d.ts +6 -4
- package/dist/src/types/content.d.ts +25 -0
- package/dist/src/types/requests.d.ts +13 -1
- package/dist/src/types/responses.d.ts +23 -4
- package/package.json +8 -8
package/dist/esm/index.esm.js
CHANGED
|
@@ -4,7 +4,7 @@ import { FirebaseError, getModularInstance } from '@firebase/util';
|
|
|
4
4
|
import { Logger } from '@firebase/logger';
|
|
5
5
|
|
|
6
6
|
var name = "@firebase/ai";
|
|
7
|
-
var version = "2.1.0-canary.
|
|
7
|
+
var version = "2.1.0-canary.84b8bed35";
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* @license
|
|
@@ -653,6 +653,12 @@ class AIService {
|
|
|
653
653
|
_delete() {
|
|
654
654
|
return Promise.resolve();
|
|
655
655
|
}
|
|
656
|
+
set options(optionsToSet) {
|
|
657
|
+
this._options = optionsToSet;
|
|
658
|
+
}
|
|
659
|
+
get options() {
|
|
660
|
+
return this._options;
|
|
661
|
+
}
|
|
656
662
|
}
|
|
657
663
|
|
|
658
664
|
/**
|
|
@@ -837,7 +843,12 @@ class AIModel {
|
|
|
837
843
|
};
|
|
838
844
|
}
|
|
839
845
|
else if (ai.appCheck) {
|
|
840
|
-
|
|
846
|
+
if (ai.options?.useLimitedUseAppCheckTokens) {
|
|
847
|
+
this._apiSettings.getAppCheckToken = () => ai.appCheck.getLimitedUseToken();
|
|
848
|
+
}
|
|
849
|
+
else {
|
|
850
|
+
this._apiSettings.getAppCheckToken = () => ai.appCheck.getToken();
|
|
851
|
+
}
|
|
841
852
|
}
|
|
842
853
|
if (ai.auth) {
|
|
843
854
|
this._apiSettings.getAuthToken = () => ai.auth.getToken();
|
|
@@ -1100,6 +1111,28 @@ async function makeRequest(model, task, apiSettings, stream, body, requestOption
|
|
|
1100
1111
|
* See the License for the specific language governing permissions and
|
|
1101
1112
|
* limitations under the License.
|
|
1102
1113
|
*/
|
|
1114
|
+
/**
|
|
1115
|
+
* Check that at least one candidate exists and does not have a bad
|
|
1116
|
+
* finish reason. Warns if multiple candidates exist.
|
|
1117
|
+
*/
|
|
1118
|
+
function hasValidCandidates(response) {
|
|
1119
|
+
if (response.candidates && response.candidates.length > 0) {
|
|
1120
|
+
if (response.candidates.length > 1) {
|
|
1121
|
+
logger.warn(`This response had ${response.candidates.length} ` +
|
|
1122
|
+
`candidates. Returning text from the first candidate only. ` +
|
|
1123
|
+
`Access response.candidates directly to use the other candidates.`);
|
|
1124
|
+
}
|
|
1125
|
+
if (hadBadFinishReason(response.candidates[0])) {
|
|
1126
|
+
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Response error: ${formatBlockErrorMessage(response)}. Response body stored in error.response`, {
|
|
1127
|
+
response
|
|
1128
|
+
});
|
|
1129
|
+
}
|
|
1130
|
+
return true;
|
|
1131
|
+
}
|
|
1132
|
+
else {
|
|
1133
|
+
return false;
|
|
1134
|
+
}
|
|
1135
|
+
}
|
|
1103
1136
|
/**
|
|
1104
1137
|
* Creates an EnhancedGenerateContentResponse object that has helper functions and
|
|
1105
1138
|
* other modifications that improve usability.
|
|
@@ -1123,18 +1156,8 @@ function createEnhancedContentResponse(response) {
|
|
|
1123
1156
|
*/
|
|
1124
1157
|
function addHelpers(response) {
|
|
1125
1158
|
response.text = () => {
|
|
1126
|
-
if (response
|
|
1127
|
-
|
|
1128
|
-
logger.warn(`This response had ${response.candidates.length} ` +
|
|
1129
|
-
`candidates. Returning text from the first candidate only. ` +
|
|
1130
|
-
`Access response.candidates directly to use the other candidates.`);
|
|
1131
|
-
}
|
|
1132
|
-
if (hadBadFinishReason(response.candidates[0])) {
|
|
1133
|
-
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Response error: ${formatBlockErrorMessage(response)}. Response body stored in error.response`, {
|
|
1134
|
-
response
|
|
1135
|
-
});
|
|
1136
|
-
}
|
|
1137
|
-
return getText(response);
|
|
1159
|
+
if (hasValidCandidates(response)) {
|
|
1160
|
+
return getText(response, part => !part.thought);
|
|
1138
1161
|
}
|
|
1139
1162
|
else if (response.promptFeedback) {
|
|
1140
1163
|
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Text not available. ${formatBlockErrorMessage(response)}`, {
|
|
@@ -1143,18 +1166,20 @@ function addHelpers(response) {
|
|
|
1143
1166
|
}
|
|
1144
1167
|
return '';
|
|
1145
1168
|
};
|
|
1169
|
+
response.thoughtSummary = () => {
|
|
1170
|
+
if (hasValidCandidates(response)) {
|
|
1171
|
+
const result = getText(response, part => !!part.thought);
|
|
1172
|
+
return result === '' ? undefined : result;
|
|
1173
|
+
}
|
|
1174
|
+
else if (response.promptFeedback) {
|
|
1175
|
+
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Thought summary not available. ${formatBlockErrorMessage(response)}`, {
|
|
1176
|
+
response
|
|
1177
|
+
});
|
|
1178
|
+
}
|
|
1179
|
+
return undefined;
|
|
1180
|
+
};
|
|
1146
1181
|
response.inlineDataParts = () => {
|
|
1147
|
-
if (response
|
|
1148
|
-
if (response.candidates.length > 1) {
|
|
1149
|
-
logger.warn(`This response had ${response.candidates.length} ` +
|
|
1150
|
-
`candidates. Returning data from the first candidate only. ` +
|
|
1151
|
-
`Access response.candidates directly to use the other candidates.`);
|
|
1152
|
-
}
|
|
1153
|
-
if (hadBadFinishReason(response.candidates[0])) {
|
|
1154
|
-
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Response error: ${formatBlockErrorMessage(response)}. Response body stored in error.response`, {
|
|
1155
|
-
response
|
|
1156
|
-
});
|
|
1157
|
-
}
|
|
1182
|
+
if (hasValidCandidates(response)) {
|
|
1158
1183
|
return getInlineDataParts(response);
|
|
1159
1184
|
}
|
|
1160
1185
|
else if (response.promptFeedback) {
|
|
@@ -1165,17 +1190,7 @@ function addHelpers(response) {
|
|
|
1165
1190
|
return undefined;
|
|
1166
1191
|
};
|
|
1167
1192
|
response.functionCalls = () => {
|
|
1168
|
-
if (response
|
|
1169
|
-
if (response.candidates.length > 1) {
|
|
1170
|
-
logger.warn(`This response had ${response.candidates.length} ` +
|
|
1171
|
-
`candidates. Returning function calls from the first candidate only. ` +
|
|
1172
|
-
`Access response.candidates directly to use the other candidates.`);
|
|
1173
|
-
}
|
|
1174
|
-
if (hadBadFinishReason(response.candidates[0])) {
|
|
1175
|
-
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Response error: ${formatBlockErrorMessage(response)}. Response body stored in error.response`, {
|
|
1176
|
-
response
|
|
1177
|
-
});
|
|
1178
|
-
}
|
|
1193
|
+
if (hasValidCandidates(response)) {
|
|
1179
1194
|
return getFunctionCalls(response);
|
|
1180
1195
|
}
|
|
1181
1196
|
else if (response.promptFeedback) {
|
|
@@ -1188,13 +1203,17 @@ function addHelpers(response) {
|
|
|
1188
1203
|
return response;
|
|
1189
1204
|
}
|
|
1190
1205
|
/**
|
|
1191
|
-
* Returns all text
|
|
1206
|
+
* Returns all text from the first candidate's parts, filtering by whether
|
|
1207
|
+
* `partFilter()` returns true.
|
|
1208
|
+
*
|
|
1209
|
+
* @param response - The `GenerateContentResponse` from which to extract text.
|
|
1210
|
+
* @param partFilter - Only return `Part`s for which this returns true
|
|
1192
1211
|
*/
|
|
1193
|
-
function getText(response) {
|
|
1212
|
+
function getText(response, partFilter) {
|
|
1194
1213
|
const textStrings = [];
|
|
1195
1214
|
if (response.candidates?.[0].content?.parts) {
|
|
1196
1215
|
for (const part of response.candidates?.[0].content?.parts) {
|
|
1197
|
-
if (part.text) {
|
|
1216
|
+
if (part.text && partFilter(part)) {
|
|
1198
1217
|
textStrings.push(part.text);
|
|
1199
1218
|
}
|
|
1200
1219
|
}
|
|
@@ -1207,7 +1226,7 @@ function getText(response) {
|
|
|
1207
1226
|
}
|
|
1208
1227
|
}
|
|
1209
1228
|
/**
|
|
1210
|
-
* Returns {@link FunctionCall}
|
|
1229
|
+
* Returns every {@link FunctionCall} associated with first candidate.
|
|
1211
1230
|
*/
|
|
1212
1231
|
function getFunctionCalls(response) {
|
|
1213
1232
|
const functionCalls = [];
|
|
@@ -1226,7 +1245,7 @@ function getFunctionCalls(response) {
|
|
|
1226
1245
|
}
|
|
1227
1246
|
}
|
|
1228
1247
|
/**
|
|
1229
|
-
* Returns {@link InlineDataPart}
|
|
1248
|
+
* Returns every {@link InlineDataPart} in the first candidate if present.
|
|
1230
1249
|
*
|
|
1231
1250
|
* @internal
|
|
1232
1251
|
*/
|
|
@@ -1306,7 +1325,7 @@ async function handlePredictResponse(response) {
|
|
|
1306
1325
|
});
|
|
1307
1326
|
}
|
|
1308
1327
|
else {
|
|
1309
|
-
throw new AIError(AIErrorCode.RESPONSE_ERROR, `
|
|
1328
|
+
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Unexpected element in 'predictions' array in response: '${JSON.stringify(prediction)}'`);
|
|
1310
1329
|
}
|
|
1311
1330
|
}
|
|
1312
1331
|
return { images, filteredReason };
|
|
@@ -1874,12 +1893,14 @@ const VALID_PART_FIELDS = [
|
|
|
1874
1893
|
'text',
|
|
1875
1894
|
'inlineData',
|
|
1876
1895
|
'functionCall',
|
|
1877
|
-
'functionResponse'
|
|
1896
|
+
'functionResponse',
|
|
1897
|
+
'thought',
|
|
1898
|
+
'thoughtSignature'
|
|
1878
1899
|
];
|
|
1879
1900
|
const VALID_PARTS_PER_ROLE = {
|
|
1880
1901
|
user: ['text', 'inlineData'],
|
|
1881
1902
|
function: ['functionResponse'],
|
|
1882
|
-
model: ['text', 'functionCall'],
|
|
1903
|
+
model: ['text', 'functionCall', 'thought', 'thoughtSignature'],
|
|
1883
1904
|
// System instructions shouldn't be in history anyway.
|
|
1884
1905
|
system: ['text']
|
|
1885
1906
|
};
|
|
@@ -1901,7 +1922,7 @@ function validateChatHistory(history) {
|
|
|
1901
1922
|
throw new AIError(AIErrorCode.INVALID_CONTENT, `Each item should include role field. Got ${role} but valid roles are: ${JSON.stringify(POSSIBLE_ROLES)}`);
|
|
1902
1923
|
}
|
|
1903
1924
|
if (!Array.isArray(parts)) {
|
|
1904
|
-
throw new AIError(AIErrorCode.INVALID_CONTENT, `Content should have 'parts'
|
|
1925
|
+
throw new AIError(AIErrorCode.INVALID_CONTENT, `Content should have 'parts' property with an array of Parts`);
|
|
1905
1926
|
}
|
|
1906
1927
|
if (parts.length === 0) {
|
|
1907
1928
|
throw new AIError(AIErrorCode.INVALID_CONTENT, `Each Content should have at least one part`);
|
|
@@ -1910,7 +1931,9 @@ function validateChatHistory(history) {
|
|
|
1910
1931
|
text: 0,
|
|
1911
1932
|
inlineData: 0,
|
|
1912
1933
|
functionCall: 0,
|
|
1913
|
-
functionResponse: 0
|
|
1934
|
+
functionResponse: 0,
|
|
1935
|
+
thought: 0,
|
|
1936
|
+
thoughtSignature: 0
|
|
1914
1937
|
};
|
|
1915
1938
|
for (const part of parts) {
|
|
1916
1939
|
for (const key of VALID_PART_FIELDS) {
|
|
@@ -2369,17 +2392,17 @@ class ChromeAdapterImpl {
|
|
|
2369
2392
|
/**
|
|
2370
2393
|
* Checks if a given request can be made on-device.
|
|
2371
2394
|
*
|
|
2372
|
-
*
|
|
2373
|
-
*
|
|
2374
|
-
*
|
|
2375
|
-
*
|
|
2376
|
-
*
|
|
2377
|
-
* </ol>
|
|
2395
|
+
* Encapsulates a few concerns:
|
|
2396
|
+
* the mode
|
|
2397
|
+
* API existence
|
|
2398
|
+
* prompt formatting
|
|
2399
|
+
* model availability, including triggering download if necessary
|
|
2378
2400
|
*
|
|
2379
|
-
*
|
|
2380
|
-
*
|
|
2401
|
+
*
|
|
2402
|
+
* Pros: callers needn't be concerned with details of on-device availability.</p>
|
|
2403
|
+
* Cons: this method spans a few concerns and splits request validation from usage.
|
|
2381
2404
|
* If instance variables weren't already part of the API, we could consider a better
|
|
2382
|
-
* separation of concerns
|
|
2405
|
+
* separation of concerns.
|
|
2383
2406
|
*/
|
|
2384
2407
|
async isAvailable(request) {
|
|
2385
2408
|
if (!this.mode) {
|
|
@@ -2420,8 +2443,9 @@ class ChromeAdapterImpl {
|
|
|
2420
2443
|
/**
|
|
2421
2444
|
* Generates content on device.
|
|
2422
2445
|
*
|
|
2423
|
-
*
|
|
2424
|
-
*
|
|
2446
|
+
* @remarks
|
|
2447
|
+
* This is comparable to {@link GenerativeModel.generateContent} for generating content in
|
|
2448
|
+
* Cloud.
|
|
2425
2449
|
* @param request - a standard Firebase AI {@link GenerateContentRequest}
|
|
2426
2450
|
* @returns {@link Response}, so we can reuse common response formatting.
|
|
2427
2451
|
*/
|
|
@@ -2434,8 +2458,9 @@ class ChromeAdapterImpl {
|
|
|
2434
2458
|
/**
|
|
2435
2459
|
* Generates content stream on device.
|
|
2436
2460
|
*
|
|
2437
|
-
*
|
|
2438
|
-
*
|
|
2461
|
+
* @remarks
|
|
2462
|
+
* This is comparable to {@link GenerativeModel.generateContentStream} for generating content in
|
|
2463
|
+
* Cloud.
|
|
2439
2464
|
* @param request - a standard Firebase AI {@link GenerateContentRequest}
|
|
2440
2465
|
* @returns {@link Response}, so we can reuse common response formatting.
|
|
2441
2466
|
*/
|
|
@@ -2486,11 +2511,11 @@ class ChromeAdapterImpl {
|
|
|
2486
2511
|
/**
|
|
2487
2512
|
* Triggers out-of-band download of an on-device model.
|
|
2488
2513
|
*
|
|
2489
|
-
*
|
|
2490
|
-
* LanguageModel.create
|
|
2514
|
+
* Chrome only downloads models as needed. Chrome knows a model is needed when code calls
|
|
2515
|
+
* LanguageModel.create.
|
|
2491
2516
|
*
|
|
2492
|
-
*
|
|
2493
|
-
* tracking if a download has previously been requested
|
|
2517
|
+
* Since Chrome manages the download, the SDK can only avoid redundant download requests by
|
|
2518
|
+
* tracking if a download has previously been requested.
|
|
2494
2519
|
*/
|
|
2495
2520
|
download() {
|
|
2496
2521
|
if (this.isDownloading) {
|
|
@@ -2544,12 +2569,12 @@ class ChromeAdapterImpl {
|
|
|
2544
2569
|
/**
|
|
2545
2570
|
* Abstracts Chrome session creation.
|
|
2546
2571
|
*
|
|
2547
|
-
*
|
|
2572
|
+
* Chrome uses a multi-turn session for all inference. Firebase AI uses single-turn for all
|
|
2548
2573
|
* inference. To map the Firebase AI API to Chrome's API, the SDK creates a new session for all
|
|
2549
|
-
* inference
|
|
2574
|
+
* inference.
|
|
2550
2575
|
*
|
|
2551
|
-
*
|
|
2552
|
-
* new session is created before an old session is destroyed
|
|
2576
|
+
* Chrome will remove a model from memory if it's no longer in use, so this method ensures a
|
|
2577
|
+
* new session is created before an old session is destroyed.
|
|
2553
2578
|
*/
|
|
2554
2579
|
async createSession() {
|
|
2555
2580
|
if (!this.languageModelProvider) {
|
|
@@ -2957,14 +2982,20 @@ class ImagenImageFormat {
|
|
|
2957
2982
|
*
|
|
2958
2983
|
* @public
|
|
2959
2984
|
*/
|
|
2960
|
-
function getAI(app = getApp(), options
|
|
2985
|
+
function getAI(app = getApp(), options) {
|
|
2961
2986
|
app = getModularInstance(app);
|
|
2962
2987
|
// Dependencies
|
|
2963
2988
|
const AIProvider = _getProvider(app, AI_TYPE);
|
|
2964
|
-
const
|
|
2965
|
-
|
|
2989
|
+
const backend = options?.backend ?? new GoogleAIBackend();
|
|
2990
|
+
const finalOptions = {
|
|
2991
|
+
useLimitedUseAppCheckTokens: options?.useLimitedUseAppCheckTokens ?? false
|
|
2992
|
+
};
|
|
2993
|
+
const identifier = encodeInstanceIdentifier(backend);
|
|
2994
|
+
const aiInstance = AIProvider.getImmediate({
|
|
2966
2995
|
identifier
|
|
2967
2996
|
});
|
|
2997
|
+
aiInstance.options = finalOptions;
|
|
2998
|
+
return aiInstance;
|
|
2968
2999
|
}
|
|
2969
3000
|
/**
|
|
2970
3001
|
* Returns a {@link GenerativeModel} class with methods for inference
|
|
@@ -3020,23 +3051,24 @@ function getImagenModel(ai, modelParams, requestOptions) {
|
|
|
3020
3051
|
*
|
|
3021
3052
|
* @packageDocumentation
|
|
3022
3053
|
*/
|
|
3054
|
+
function factory(container, { instanceIdentifier }) {
|
|
3055
|
+
if (!instanceIdentifier) {
|
|
3056
|
+
throw new AIError(AIErrorCode.ERROR, 'AIService instance identifier is undefined.');
|
|
3057
|
+
}
|
|
3058
|
+
const backend = decodeInstanceIdentifier(instanceIdentifier);
|
|
3059
|
+
// getImmediate for FirebaseApp will always succeed
|
|
3060
|
+
const app = container.getProvider('app').getImmediate();
|
|
3061
|
+
const auth = container.getProvider('auth-internal');
|
|
3062
|
+
const appCheckProvider = container.getProvider('app-check-internal');
|
|
3063
|
+
return new AIService(app, backend, auth, appCheckProvider);
|
|
3064
|
+
}
|
|
3023
3065
|
function registerAI() {
|
|
3024
|
-
_registerComponent(new Component(AI_TYPE,
|
|
3025
|
-
if (!instanceIdentifier) {
|
|
3026
|
-
throw new AIError(AIErrorCode.ERROR, 'AIService instance identifier is undefined.');
|
|
3027
|
-
}
|
|
3028
|
-
const backend = decodeInstanceIdentifier(instanceIdentifier);
|
|
3029
|
-
// getImmediate for FirebaseApp will always succeed
|
|
3030
|
-
const app = container.getProvider('app').getImmediate();
|
|
3031
|
-
const auth = container.getProvider('auth-internal');
|
|
3032
|
-
const appCheckProvider = container.getProvider('app-check-internal');
|
|
3033
|
-
return new AIService(app, backend, auth, appCheckProvider);
|
|
3034
|
-
}, "PUBLIC" /* ComponentType.PUBLIC */).setMultipleInstances(true));
|
|
3066
|
+
_registerComponent(new Component(AI_TYPE, factory, "PUBLIC" /* ComponentType.PUBLIC */).setMultipleInstances(true));
|
|
3035
3067
|
registerVersion(name, version);
|
|
3036
3068
|
// BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation
|
|
3037
3069
|
registerVersion(name, version, 'esm2020');
|
|
3038
3070
|
}
|
|
3039
3071
|
registerAI();
|
|
3040
3072
|
|
|
3041
|
-
export { AIError, AIErrorCode, AIModel, AnyOfSchema, ArraySchema, Backend, BackendType, BlockReason, BooleanSchema, ChatSession, FinishReason, FunctionCallingMode, GenerativeModel, GoogleAIBackend, HarmBlockMethod, HarmBlockThreshold, HarmCategory, HarmProbability, HarmSeverity, ImagenAspectRatio, ImagenImageFormat, ImagenModel, ImagenPersonFilterLevel, ImagenSafetyFilterLevel, InferenceMode, IntegerSchema, Modality, NumberSchema, ObjectSchema, POSSIBLE_ROLES, ResponseModality, Schema, SchemaType, StringSchema, VertexAIBackend, getAI, getGenerativeModel, getImagenModel };
|
|
3073
|
+
export { AIError, AIErrorCode, AIModel, AnyOfSchema, ArraySchema, Backend, BackendType, BlockReason, BooleanSchema, ChatSession, FinishReason, FunctionCallingMode, GenerativeModel, GoogleAIBackend, HarmBlockMethod, HarmBlockThreshold, HarmCategory, HarmProbability, HarmSeverity, ImagenAspectRatio, ImagenImageFormat, ImagenModel, ImagenPersonFilterLevel, ImagenSafetyFilterLevel, InferenceMode, IntegerSchema, Modality, NumberSchema, ObjectSchema, POSSIBLE_ROLES, ResponseModality, Schema, SchemaType, StringSchema, VertexAIBackend, factory, getAI, getGenerativeModel, getImagenModel };
|
|
3042
3074
|
//# sourceMappingURL=index.esm.js.map
|