@firebase/ai 2.1.0-canary.5501791d0 → 2.1.0-canary.9b63cd60e
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 +75 -4
- package/dist/ai.d.ts +90 -5
- package/dist/esm/index.esm.js +90 -60
- package/dist/esm/index.esm.js.map +1 -1
- package/dist/esm/src/index.d.ts +3 -0
- 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/content.d.ts +25 -0
- package/dist/esm/src/types/requests.d.ts +9 -0
- package/dist/esm/src/types/responses.d.ts +23 -4
- package/dist/index.cjs.js +90 -59
- package/dist/index.cjs.js.map +1 -1
- package/dist/index.node.cjs.js +77 -48
- package/dist/index.node.cjs.js.map +1 -1
- package/dist/index.node.mjs +77 -48
- package/dist/index.node.mjs.map +1 -1
- package/dist/src/index.d.ts +3 -0
- 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/content.d.ts +25 -0
- package/dist/src/types/requests.d.ts +9 -0
- package/dist/src/types/responses.d.ts +23 -4
- package/package.json +8 -8
package/dist/esm/src/index.d.ts
CHANGED
|
@@ -3,10 +3,13 @@
|
|
|
3
3
|
*
|
|
4
4
|
* @packageDocumentation
|
|
5
5
|
*/
|
|
6
|
+
import { AIService } from './service';
|
|
7
|
+
import { ComponentContainer, InstanceFactoryOptions } from '@firebase/component';
|
|
6
8
|
declare global {
|
|
7
9
|
interface Window {
|
|
8
10
|
[key: string]: unknown;
|
|
9
11
|
}
|
|
10
12
|
}
|
|
13
|
+
export declare function factory(container: ComponentContainer, { instanceIdentifier }: InstanceFactoryOptions): AIService;
|
|
11
14
|
export * from './api';
|
|
12
15
|
export * from './public-types';
|
|
@@ -35,6 +35,10 @@ export interface AI {
|
|
|
35
35
|
* Vertex AI Gemini API (using {@link VertexAIBackend}).
|
|
36
36
|
*/
|
|
37
37
|
backend: Backend;
|
|
38
|
+
/**
|
|
39
|
+
* Options applied to this {@link AI} instance.
|
|
40
|
+
*/
|
|
41
|
+
options?: AIOptions;
|
|
38
42
|
/**
|
|
39
43
|
* @deprecated use `AI.backend.location` instead.
|
|
40
44
|
*
|
|
@@ -83,6 +87,11 @@ export type BackendType = (typeof BackendType)[keyof typeof BackendType];
|
|
|
83
87
|
export interface AIOptions {
|
|
84
88
|
/**
|
|
85
89
|
* The backend configuration to use for the AI service instance.
|
|
90
|
+
* Defaults to the Gemini Developer API backend ({@link GoogleAIBackend}).
|
|
86
91
|
*/
|
|
87
|
-
backend
|
|
92
|
+
backend?: Backend;
|
|
93
|
+
/**
|
|
94
|
+
* Whether to use App Check limited use tokens. Defaults to false.
|
|
95
|
+
*/
|
|
96
|
+
useLimitedUseAppCheckTokens?: boolean;
|
|
88
97
|
}
|
|
@@ -14,7 +14,7 @@
|
|
|
14
14
|
* See the License for the specific language governing permissions and
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
|
-
import { EnhancedGenerateContentResponse, FunctionCall, GenerateContentResponse, ImagenGCSImage, ImagenInlineImage, InlineDataPart } from '../types';
|
|
17
|
+
import { EnhancedGenerateContentResponse, FunctionCall, GenerateContentResponse, ImagenGCSImage, ImagenInlineImage, InlineDataPart, Part } from '../types';
|
|
18
18
|
/**
|
|
19
19
|
* Creates an EnhancedGenerateContentResponse object that has helper functions and
|
|
20
20
|
* other modifications that improve usability.
|
|
@@ -26,15 +26,19 @@ export declare function createEnhancedContentResponse(response: GenerateContentR
|
|
|
26
26
|
*/
|
|
27
27
|
export declare function addHelpers(response: GenerateContentResponse): EnhancedGenerateContentResponse;
|
|
28
28
|
/**
|
|
29
|
-
* Returns all text
|
|
29
|
+
* Returns all text from the first candidate's parts, filtering by whether
|
|
30
|
+
* `partFilter()` returns true.
|
|
31
|
+
*
|
|
32
|
+
* @param response - The `GenerateContentResponse` from which to extract text.
|
|
33
|
+
* @param partFilter - Only return `Part`s for which this returns true
|
|
30
34
|
*/
|
|
31
|
-
export declare function getText(response: GenerateContentResponse): string;
|
|
35
|
+
export declare function getText(response: GenerateContentResponse, partFilter: (part: Part) => boolean): string;
|
|
32
36
|
/**
|
|
33
|
-
* Returns {@link FunctionCall}
|
|
37
|
+
* Returns every {@link FunctionCall} associated with first candidate.
|
|
34
38
|
*/
|
|
35
39
|
export declare function getFunctionCalls(response: GenerateContentResponse): FunctionCall[] | undefined;
|
|
36
40
|
/**
|
|
37
|
-
* Returns {@link InlineDataPart}
|
|
41
|
+
* Returns every {@link InlineDataPart} in the first candidate if present.
|
|
38
42
|
*
|
|
39
43
|
* @internal
|
|
40
44
|
*/
|
|
@@ -15,7 +15,7 @@
|
|
|
15
15
|
* limitations under the License.
|
|
16
16
|
*/
|
|
17
17
|
import { FirebaseApp, _FirebaseService } from '@firebase/app';
|
|
18
|
-
import { AI } from './public-types';
|
|
18
|
+
import { AI, AIOptions } from './public-types';
|
|
19
19
|
import { AppCheckInternalComponentName, FirebaseAppCheckInternal } from '@firebase/app-check-interop-types';
|
|
20
20
|
import { Provider } from '@firebase/component';
|
|
21
21
|
import { FirebaseAuthInternal, FirebaseAuthInternalName } from '@firebase/auth-interop-types';
|
|
@@ -25,7 +25,10 @@ export declare class AIService implements AI, _FirebaseService {
|
|
|
25
25
|
backend: Backend;
|
|
26
26
|
auth: FirebaseAuthInternal | null;
|
|
27
27
|
appCheck: FirebaseAppCheckInternal | null;
|
|
28
|
+
_options?: Omit<AIOptions, 'backend'>;
|
|
28
29
|
location: string;
|
|
29
30
|
constructor(app: FirebaseApp, backend: Backend, authProvider?: Provider<FirebaseAuthInternalName>, appCheckProvider?: Provider<AppCheckInternalComponentName>);
|
|
30
31
|
_delete(): Promise<void>;
|
|
32
|
+
set options(optionsToSet: AIOptions);
|
|
33
|
+
get options(): AIOptions | undefined;
|
|
31
34
|
}
|
|
@@ -38,6 +38,11 @@ export interface TextPart {
|
|
|
38
38
|
inlineData?: never;
|
|
39
39
|
functionCall?: never;
|
|
40
40
|
functionResponse?: never;
|
|
41
|
+
thought?: boolean;
|
|
42
|
+
/**
|
|
43
|
+
* @internal
|
|
44
|
+
*/
|
|
45
|
+
thoughtSignature?: string;
|
|
41
46
|
}
|
|
42
47
|
/**
|
|
43
48
|
* Content part interface if the part represents an image.
|
|
@@ -52,6 +57,11 @@ export interface InlineDataPart {
|
|
|
52
57
|
* Applicable if `inlineData` is a video.
|
|
53
58
|
*/
|
|
54
59
|
videoMetadata?: VideoMetadata;
|
|
60
|
+
thought?: boolean;
|
|
61
|
+
/**
|
|
62
|
+
* @internal
|
|
63
|
+
*/
|
|
64
|
+
thoughtSignature?: never;
|
|
55
65
|
}
|
|
56
66
|
/**
|
|
57
67
|
* Describes the input video content.
|
|
@@ -78,6 +88,11 @@ export interface FunctionCallPart {
|
|
|
78
88
|
inlineData?: never;
|
|
79
89
|
functionCall: FunctionCall;
|
|
80
90
|
functionResponse?: never;
|
|
91
|
+
thought?: boolean;
|
|
92
|
+
/**
|
|
93
|
+
* @internal
|
|
94
|
+
*/
|
|
95
|
+
thoughtSignature?: never;
|
|
81
96
|
}
|
|
82
97
|
/**
|
|
83
98
|
* Content part interface if the part represents {@link FunctionResponse}.
|
|
@@ -88,6 +103,11 @@ export interface FunctionResponsePart {
|
|
|
88
103
|
inlineData?: never;
|
|
89
104
|
functionCall?: never;
|
|
90
105
|
functionResponse: FunctionResponse;
|
|
106
|
+
thought?: boolean;
|
|
107
|
+
/**
|
|
108
|
+
* @internal
|
|
109
|
+
*/
|
|
110
|
+
thoughtSignature?: never;
|
|
91
111
|
}
|
|
92
112
|
/**
|
|
93
113
|
* Content part interface if the part represents {@link FileData}
|
|
@@ -99,6 +119,11 @@ export interface FileDataPart {
|
|
|
99
119
|
functionCall?: never;
|
|
100
120
|
functionResponse?: never;
|
|
101
121
|
fileData: FileData;
|
|
122
|
+
thought?: boolean;
|
|
123
|
+
/**
|
|
124
|
+
* @internal
|
|
125
|
+
*/
|
|
126
|
+
thoughtSignature?: never;
|
|
102
127
|
}
|
|
103
128
|
/**
|
|
104
129
|
* A predicted {@link FunctionCall} returned from the model
|
|
@@ -305,4 +305,13 @@ export interface ThinkingConfig {
|
|
|
305
305
|
* feature or if the specified budget is not within the model's supported range.
|
|
306
306
|
*/
|
|
307
307
|
thinkingBudget?: number;
|
|
308
|
+
/**
|
|
309
|
+
* Whether to include "thought summaries" in the model's response.
|
|
310
|
+
*
|
|
311
|
+
* @remarks
|
|
312
|
+
* Thought summaries provide a brief overview of the model's internal thinking process,
|
|
313
|
+
* offering insight into how it arrived at the final answer. This can be useful for
|
|
314
|
+
* debugging, understanding the model's reasoning, and verifying its accuracy.
|
|
315
|
+
*/
|
|
316
|
+
includeThoughts?: boolean;
|
|
308
317
|
}
|
|
@@ -48,15 +48,34 @@ export interface EnhancedGenerateContentResponse extends GenerateContentResponse
|
|
|
48
48
|
*/
|
|
49
49
|
text: () => string;
|
|
50
50
|
/**
|
|
51
|
-
* Aggregates and returns
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* @returns An array of {@link InlineDataPart}s containing data from the response, if available.
|
|
51
|
+
* Aggregates and returns every {@link InlineDataPart} from the first candidate of
|
|
52
|
+
* {@link GenerateContentResponse}.
|
|
55
53
|
*
|
|
56
54
|
* @throws If the prompt or candidate was blocked.
|
|
57
55
|
*/
|
|
58
56
|
inlineDataParts: () => InlineDataPart[] | undefined;
|
|
57
|
+
/**
|
|
58
|
+
* Aggregates and returns every {@link FunctionCall} from the first candidate of
|
|
59
|
+
* {@link GenerateContentResponse}.
|
|
60
|
+
*
|
|
61
|
+
* @throws If the prompt or candidate was blocked.
|
|
62
|
+
*/
|
|
59
63
|
functionCalls: () => FunctionCall[] | undefined;
|
|
64
|
+
/**
|
|
65
|
+
* Aggregates and returns every {@link TextPart} with their `thought` property set
|
|
66
|
+
* to `true` from the first candidate of {@link GenerateContentResponse}.
|
|
67
|
+
*
|
|
68
|
+
* @throws If the prompt or candidate was blocked.
|
|
69
|
+
*
|
|
70
|
+
* @remarks
|
|
71
|
+
* Thought summaries provide a brief overview of the model's internal thinking process,
|
|
72
|
+
* offering insight into how it arrived at the final answer. This can be useful for
|
|
73
|
+
* debugging, understanding the model's reasoning, and verifying its accuracy.
|
|
74
|
+
*
|
|
75
|
+
* Thoughts will only be included if {@link ThinkingConfig.includeThoughts} is
|
|
76
|
+
* set to `true`.
|
|
77
|
+
*/
|
|
78
|
+
thoughtSummary: () => string | undefined;
|
|
60
79
|
}
|
|
61
80
|
/**
|
|
62
81
|
* Individual response from {@link GenerativeModel.generateContent} and
|
package/dist/index.cjs.js
CHANGED
|
@@ -8,7 +8,7 @@ var util = require('@firebase/util');
|
|
|
8
8
|
var logger$1 = require('@firebase/logger');
|
|
9
9
|
|
|
10
10
|
var name = "@firebase/ai";
|
|
11
|
-
var version = "2.1.0-canary.
|
|
11
|
+
var version = "2.1.0-canary.9b63cd60e";
|
|
12
12
|
|
|
13
13
|
/**
|
|
14
14
|
* @license
|
|
@@ -657,6 +657,12 @@ class AIService {
|
|
|
657
657
|
_delete() {
|
|
658
658
|
return Promise.resolve();
|
|
659
659
|
}
|
|
660
|
+
set options(optionsToSet) {
|
|
661
|
+
this._options = optionsToSet;
|
|
662
|
+
}
|
|
663
|
+
get options() {
|
|
664
|
+
return this._options;
|
|
665
|
+
}
|
|
660
666
|
}
|
|
661
667
|
|
|
662
668
|
/**
|
|
@@ -841,7 +847,12 @@ class AIModel {
|
|
|
841
847
|
};
|
|
842
848
|
}
|
|
843
849
|
else if (ai.appCheck) {
|
|
844
|
-
|
|
850
|
+
if (ai.options?.useLimitedUseAppCheckTokens) {
|
|
851
|
+
this._apiSettings.getAppCheckToken = () => ai.appCheck.getLimitedUseToken();
|
|
852
|
+
}
|
|
853
|
+
else {
|
|
854
|
+
this._apiSettings.getAppCheckToken = () => ai.appCheck.getToken();
|
|
855
|
+
}
|
|
845
856
|
}
|
|
846
857
|
if (ai.auth) {
|
|
847
858
|
this._apiSettings.getAuthToken = () => ai.auth.getToken();
|
|
@@ -1104,6 +1115,28 @@ async function makeRequest(model, task, apiSettings, stream, body, requestOption
|
|
|
1104
1115
|
* See the License for the specific language governing permissions and
|
|
1105
1116
|
* limitations under the License.
|
|
1106
1117
|
*/
|
|
1118
|
+
/**
|
|
1119
|
+
* Check that at least one candidate exists and does not have a bad
|
|
1120
|
+
* finish reason. Warns if multiple candidates exist.
|
|
1121
|
+
*/
|
|
1122
|
+
function hasValidCandidates(response) {
|
|
1123
|
+
if (response.candidates && response.candidates.length > 0) {
|
|
1124
|
+
if (response.candidates.length > 1) {
|
|
1125
|
+
logger.warn(`This response had ${response.candidates.length} ` +
|
|
1126
|
+
`candidates. Returning text from the first candidate only. ` +
|
|
1127
|
+
`Access response.candidates directly to use the other candidates.`);
|
|
1128
|
+
}
|
|
1129
|
+
if (hadBadFinishReason(response.candidates[0])) {
|
|
1130
|
+
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Response error: ${formatBlockErrorMessage(response)}. Response body stored in error.response`, {
|
|
1131
|
+
response
|
|
1132
|
+
});
|
|
1133
|
+
}
|
|
1134
|
+
return true;
|
|
1135
|
+
}
|
|
1136
|
+
else {
|
|
1137
|
+
return false;
|
|
1138
|
+
}
|
|
1139
|
+
}
|
|
1107
1140
|
/**
|
|
1108
1141
|
* Creates an EnhancedGenerateContentResponse object that has helper functions and
|
|
1109
1142
|
* other modifications that improve usability.
|
|
@@ -1127,18 +1160,8 @@ function createEnhancedContentResponse(response) {
|
|
|
1127
1160
|
*/
|
|
1128
1161
|
function addHelpers(response) {
|
|
1129
1162
|
response.text = () => {
|
|
1130
|
-
if (response
|
|
1131
|
-
|
|
1132
|
-
logger.warn(`This response had ${response.candidates.length} ` +
|
|
1133
|
-
`candidates. Returning text from the first candidate only. ` +
|
|
1134
|
-
`Access response.candidates directly to use the other candidates.`);
|
|
1135
|
-
}
|
|
1136
|
-
if (hadBadFinishReason(response.candidates[0])) {
|
|
1137
|
-
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Response error: ${formatBlockErrorMessage(response)}. Response body stored in error.response`, {
|
|
1138
|
-
response
|
|
1139
|
-
});
|
|
1140
|
-
}
|
|
1141
|
-
return getText(response);
|
|
1163
|
+
if (hasValidCandidates(response)) {
|
|
1164
|
+
return getText(response, part => !part.thought);
|
|
1142
1165
|
}
|
|
1143
1166
|
else if (response.promptFeedback) {
|
|
1144
1167
|
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Text not available. ${formatBlockErrorMessage(response)}`, {
|
|
@@ -1147,18 +1170,20 @@ function addHelpers(response) {
|
|
|
1147
1170
|
}
|
|
1148
1171
|
return '';
|
|
1149
1172
|
};
|
|
1173
|
+
response.thoughtSummary = () => {
|
|
1174
|
+
if (hasValidCandidates(response)) {
|
|
1175
|
+
const result = getText(response, part => !!part.thought);
|
|
1176
|
+
return result === '' ? undefined : result;
|
|
1177
|
+
}
|
|
1178
|
+
else if (response.promptFeedback) {
|
|
1179
|
+
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Thought summary not available. ${formatBlockErrorMessage(response)}`, {
|
|
1180
|
+
response
|
|
1181
|
+
});
|
|
1182
|
+
}
|
|
1183
|
+
return undefined;
|
|
1184
|
+
};
|
|
1150
1185
|
response.inlineDataParts = () => {
|
|
1151
|
-
if (response
|
|
1152
|
-
if (response.candidates.length > 1) {
|
|
1153
|
-
logger.warn(`This response had ${response.candidates.length} ` +
|
|
1154
|
-
`candidates. Returning data from the first candidate only. ` +
|
|
1155
|
-
`Access response.candidates directly to use the other candidates.`);
|
|
1156
|
-
}
|
|
1157
|
-
if (hadBadFinishReason(response.candidates[0])) {
|
|
1158
|
-
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Response error: ${formatBlockErrorMessage(response)}. Response body stored in error.response`, {
|
|
1159
|
-
response
|
|
1160
|
-
});
|
|
1161
|
-
}
|
|
1186
|
+
if (hasValidCandidates(response)) {
|
|
1162
1187
|
return getInlineDataParts(response);
|
|
1163
1188
|
}
|
|
1164
1189
|
else if (response.promptFeedback) {
|
|
@@ -1169,17 +1194,7 @@ function addHelpers(response) {
|
|
|
1169
1194
|
return undefined;
|
|
1170
1195
|
};
|
|
1171
1196
|
response.functionCalls = () => {
|
|
1172
|
-
if (response
|
|
1173
|
-
if (response.candidates.length > 1) {
|
|
1174
|
-
logger.warn(`This response had ${response.candidates.length} ` +
|
|
1175
|
-
`candidates. Returning function calls from the first candidate only. ` +
|
|
1176
|
-
`Access response.candidates directly to use the other candidates.`);
|
|
1177
|
-
}
|
|
1178
|
-
if (hadBadFinishReason(response.candidates[0])) {
|
|
1179
|
-
throw new AIError(AIErrorCode.RESPONSE_ERROR, `Response error: ${formatBlockErrorMessage(response)}. Response body stored in error.response`, {
|
|
1180
|
-
response
|
|
1181
|
-
});
|
|
1182
|
-
}
|
|
1197
|
+
if (hasValidCandidates(response)) {
|
|
1183
1198
|
return getFunctionCalls(response);
|
|
1184
1199
|
}
|
|
1185
1200
|
else if (response.promptFeedback) {
|
|
@@ -1192,13 +1207,17 @@ function addHelpers(response) {
|
|
|
1192
1207
|
return response;
|
|
1193
1208
|
}
|
|
1194
1209
|
/**
|
|
1195
|
-
* Returns all text
|
|
1210
|
+
* Returns all text from the first candidate's parts, filtering by whether
|
|
1211
|
+
* `partFilter()` returns true.
|
|
1212
|
+
*
|
|
1213
|
+
* @param response - The `GenerateContentResponse` from which to extract text.
|
|
1214
|
+
* @param partFilter - Only return `Part`s for which this returns true
|
|
1196
1215
|
*/
|
|
1197
|
-
function getText(response) {
|
|
1216
|
+
function getText(response, partFilter) {
|
|
1198
1217
|
const textStrings = [];
|
|
1199
1218
|
if (response.candidates?.[0].content?.parts) {
|
|
1200
1219
|
for (const part of response.candidates?.[0].content?.parts) {
|
|
1201
|
-
if (part.text) {
|
|
1220
|
+
if (part.text && partFilter(part)) {
|
|
1202
1221
|
textStrings.push(part.text);
|
|
1203
1222
|
}
|
|
1204
1223
|
}
|
|
@@ -1211,7 +1230,7 @@ function getText(response) {
|
|
|
1211
1230
|
}
|
|
1212
1231
|
}
|
|
1213
1232
|
/**
|
|
1214
|
-
* Returns {@link FunctionCall}
|
|
1233
|
+
* Returns every {@link FunctionCall} associated with first candidate.
|
|
1215
1234
|
*/
|
|
1216
1235
|
function getFunctionCalls(response) {
|
|
1217
1236
|
const functionCalls = [];
|
|
@@ -1230,7 +1249,7 @@ function getFunctionCalls(response) {
|
|
|
1230
1249
|
}
|
|
1231
1250
|
}
|
|
1232
1251
|
/**
|
|
1233
|
-
* Returns {@link InlineDataPart}
|
|
1252
|
+
* Returns every {@link InlineDataPart} in the first candidate if present.
|
|
1234
1253
|
*
|
|
1235
1254
|
* @internal
|
|
1236
1255
|
*/
|
|
@@ -1878,12 +1897,14 @@ const VALID_PART_FIELDS = [
|
|
|
1878
1897
|
'text',
|
|
1879
1898
|
'inlineData',
|
|
1880
1899
|
'functionCall',
|
|
1881
|
-
'functionResponse'
|
|
1900
|
+
'functionResponse',
|
|
1901
|
+
'thought',
|
|
1902
|
+
'thoughtSignature'
|
|
1882
1903
|
];
|
|
1883
1904
|
const VALID_PARTS_PER_ROLE = {
|
|
1884
1905
|
user: ['text', 'inlineData'],
|
|
1885
1906
|
function: ['functionResponse'],
|
|
1886
|
-
model: ['text', 'functionCall'],
|
|
1907
|
+
model: ['text', 'functionCall', 'thought', 'thoughtSignature'],
|
|
1887
1908
|
// System instructions shouldn't be in history anyway.
|
|
1888
1909
|
system: ['text']
|
|
1889
1910
|
};
|
|
@@ -1905,7 +1926,7 @@ function validateChatHistory(history) {
|
|
|
1905
1926
|
throw new AIError(AIErrorCode.INVALID_CONTENT, `Each item should include role field. Got ${role} but valid roles are: ${JSON.stringify(POSSIBLE_ROLES)}`);
|
|
1906
1927
|
}
|
|
1907
1928
|
if (!Array.isArray(parts)) {
|
|
1908
|
-
throw new AIError(AIErrorCode.INVALID_CONTENT, `Content should have 'parts'
|
|
1929
|
+
throw new AIError(AIErrorCode.INVALID_CONTENT, `Content should have 'parts' property with an array of Parts`);
|
|
1909
1930
|
}
|
|
1910
1931
|
if (parts.length === 0) {
|
|
1911
1932
|
throw new AIError(AIErrorCode.INVALID_CONTENT, `Each Content should have at least one part`);
|
|
@@ -1914,7 +1935,9 @@ function validateChatHistory(history) {
|
|
|
1914
1935
|
text: 0,
|
|
1915
1936
|
inlineData: 0,
|
|
1916
1937
|
functionCall: 0,
|
|
1917
|
-
functionResponse: 0
|
|
1938
|
+
functionResponse: 0,
|
|
1939
|
+
thought: 0,
|
|
1940
|
+
thoughtSignature: 0
|
|
1918
1941
|
};
|
|
1919
1942
|
for (const part of parts) {
|
|
1920
1943
|
for (const key of VALID_PART_FIELDS) {
|
|
@@ -2963,14 +2986,20 @@ class ImagenImageFormat {
|
|
|
2963
2986
|
*
|
|
2964
2987
|
* @public
|
|
2965
2988
|
*/
|
|
2966
|
-
function getAI(app$1 = app.getApp(), options
|
|
2989
|
+
function getAI(app$1 = app.getApp(), options) {
|
|
2967
2990
|
app$1 = util.getModularInstance(app$1);
|
|
2968
2991
|
// Dependencies
|
|
2969
2992
|
const AIProvider = app._getProvider(app$1, AI_TYPE);
|
|
2970
|
-
const
|
|
2971
|
-
|
|
2993
|
+
const backend = options?.backend ?? new GoogleAIBackend();
|
|
2994
|
+
const finalOptions = {
|
|
2995
|
+
useLimitedUseAppCheckTokens: options?.useLimitedUseAppCheckTokens ?? false
|
|
2996
|
+
};
|
|
2997
|
+
const identifier = encodeInstanceIdentifier(backend);
|
|
2998
|
+
const aiInstance = AIProvider.getImmediate({
|
|
2972
2999
|
identifier
|
|
2973
3000
|
});
|
|
3001
|
+
aiInstance.options = finalOptions;
|
|
3002
|
+
return aiInstance;
|
|
2974
3003
|
}
|
|
2975
3004
|
/**
|
|
2976
3005
|
* Returns a {@link GenerativeModel} class with methods for inference
|
|
@@ -3026,18 +3055,19 @@ function getImagenModel(ai, modelParams, requestOptions) {
|
|
|
3026
3055
|
*
|
|
3027
3056
|
* @packageDocumentation
|
|
3028
3057
|
*/
|
|
3058
|
+
function factory(container, { instanceIdentifier }) {
|
|
3059
|
+
if (!instanceIdentifier) {
|
|
3060
|
+
throw new AIError(AIErrorCode.ERROR, 'AIService instance identifier is undefined.');
|
|
3061
|
+
}
|
|
3062
|
+
const backend = decodeInstanceIdentifier(instanceIdentifier);
|
|
3063
|
+
// getImmediate for FirebaseApp will always succeed
|
|
3064
|
+
const app = container.getProvider('app').getImmediate();
|
|
3065
|
+
const auth = container.getProvider('auth-internal');
|
|
3066
|
+
const appCheckProvider = container.getProvider('app-check-internal');
|
|
3067
|
+
return new AIService(app, backend, auth, appCheckProvider);
|
|
3068
|
+
}
|
|
3029
3069
|
function registerAI() {
|
|
3030
|
-
app._registerComponent(new component.Component(AI_TYPE,
|
|
3031
|
-
if (!instanceIdentifier) {
|
|
3032
|
-
throw new AIError(AIErrorCode.ERROR, 'AIService instance identifier is undefined.');
|
|
3033
|
-
}
|
|
3034
|
-
const backend = decodeInstanceIdentifier(instanceIdentifier);
|
|
3035
|
-
// getImmediate for FirebaseApp will always succeed
|
|
3036
|
-
const app = container.getProvider('app').getImmediate();
|
|
3037
|
-
const auth = container.getProvider('auth-internal');
|
|
3038
|
-
const appCheckProvider = container.getProvider('app-check-internal');
|
|
3039
|
-
return new AIService(app, backend, auth, appCheckProvider);
|
|
3040
|
-
}, "PUBLIC" /* ComponentType.PUBLIC */).setMultipleInstances(true));
|
|
3070
|
+
app._registerComponent(new component.Component(AI_TYPE, factory, "PUBLIC" /* ComponentType.PUBLIC */).setMultipleInstances(true));
|
|
3041
3071
|
app.registerVersion(name, version);
|
|
3042
3072
|
// BUILD_TARGET will be replaced by values like esm, cjs, etc during the compilation
|
|
3043
3073
|
app.registerVersion(name, version, 'cjs2020');
|
|
@@ -3079,6 +3109,7 @@ exports.Schema = Schema;
|
|
|
3079
3109
|
exports.SchemaType = SchemaType;
|
|
3080
3110
|
exports.StringSchema = StringSchema;
|
|
3081
3111
|
exports.VertexAIBackend = VertexAIBackend;
|
|
3112
|
+
exports.factory = factory;
|
|
3082
3113
|
exports.getAI = getAI;
|
|
3083
3114
|
exports.getGenerativeModel = getGenerativeModel;
|
|
3084
3115
|
exports.getImagenModel = getImagenModel;
|