Skip to content

Commit 3e6c17d

Browse files
committed
Migrate to parameter instead of config struct
1 parent df24a84 commit 3e6c17d

File tree

6 files changed

+44
-88
lines changed

6 files changed

+44
-88
lines changed

FirebaseAI/Sources/AppCheckOptions.swift

Lines changed: 0 additions & 48 deletions
This file was deleted.

FirebaseAI/Sources/FirebaseAI.swift

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -35,15 +35,33 @@ public final class FirebaseAI: Sendable {
3535
/// - config: Configuration options for the Firebase AI SDK that propogate across all models
3636
/// created. Uses default options when not specified, see the ``FirebaseAI.Config``
3737
/// documentation for more information.
38+
/// - useLimitedUseAppCheckTokens: When sending tokens to the backend, this option enables
39+
/// the usage of App Check's limited-use tokens instead of the standard cached tokens.
40+
///
41+
/// A new limited-use tokens will be generated for each request; providing a smaller attack
42+
/// surface for malicious parties to hijack tokens. When used alongside replay protection,
43+
/// limited-use tokens are also _consumed_ after each request, ensuring they can't be used
44+
/// again.
45+
///
46+
/// _This flag is set to `false` by default._
47+
///
48+
/// > Important: Replay protection is not currently supported for the FirebaseAI backend.
49+
/// > While this feature is being developed, you can still migrate to using
50+
/// > limited-use tokens. Because limited-use tokens are backwards compatible, you can still
51+
/// > use them without replay protection. Due to their shorter TTL over standard App Check
52+
/// > tokens, they still provide a security benefit.
53+
/// >
54+
/// > Migrating to limited-use tokens sooner minimizes disruption when support for replay
55+
/// > protection is added.
3856
/// - Returns: A `FirebaseAI` instance, configured with the custom `FirebaseApp`.
3957
public static func firebaseAI(app: FirebaseApp? = nil,
4058
backend: Backend = .googleAI(),
41-
config: FirebaseAI.Config = .config()) -> FirebaseAI {
59+
useLimitedUseAppCheckTokens: Bool = false) -> FirebaseAI {
4260
let instance = createInstance(
4361
app: app,
4462
location: backend.location,
4563
apiConfig: backend.apiConfig,
46-
aiConfig: config
64+
useLimitedUseAppCheckTokens: useLimitedUseAppCheckTokens
4765
)
4866
// Verify that the `FirebaseAI` instance is always configured with the production endpoint since
4967
// this is the public API surface for creating an instance.
@@ -96,7 +114,7 @@ public final class FirebaseAI: Sendable {
96114
toolConfig: toolConfig,
97115
systemInstruction: systemInstruction,
98116
requestOptions: requestOptions,
99-
aiConfig: aiConfig
117+
useLimitedUseAppCheckTokens: useLimitedUseAppCheckTokens
100118
)
101119
}
102120

@@ -133,37 +151,22 @@ public final class FirebaseAI: Sendable {
133151
generationConfig: generationConfig,
134152
safetySettings: safetySettings,
135153
requestOptions: requestOptions,
136-
aiConfig: aiConfig
154+
useLimitedUseAppCheckTokens: useLimitedUseAppCheckTokens
137155
)
138156
}
139157

140158
/// Class to enable FirebaseAI to register via the Objective-C based Firebase component system
141159
/// to include FirebaseAI in the userAgent.
142160
@objc(FIRVertexAIComponent) class FirebaseVertexAIComponent: NSObject {}
143161

144-
/// Configuration options for ``FirebaseAI``, which persists across all models.
145-
@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *)
146-
public struct Config: Sendable, Hashable, Equatable {
147-
/// Options for App Check specific behavior within a ``FirebaseAI`` instance.
148-
let appCheck: AppCheckOptions
149-
150-
/// Creates a new ``FirebaseAI.Config`` value.
151-
///
152-
/// - Parameters:
153-
/// - appCheck: Optionally configure certain behavior with how App Check is used.
154-
public static func config(appCheck: AppCheckOptions = AppCheckOptions()) -> Config {
155-
Config(appCheck: appCheck)
156-
}
157-
}
158-
159162
// MARK: - Private
160163

161164
/// Firebase data relevant to Firebase AI.
162165
let firebaseInfo: FirebaseInfo
163166

164167
let apiConfig: APIConfig
165168

166-
let aiConfig: FirebaseAI.Config
169+
let useLimitedUseAppCheckTokens: Bool
167170

168171
/// A map of active `FirebaseAI` instances keyed by the `FirebaseApp` name and the `location`,
169172
/// in the format `appName:location`.
@@ -180,7 +183,7 @@ public final class FirebaseAI: Sendable {
180183
)
181184

182185
static func createInstance(app: FirebaseApp?, location: String?,
183-
apiConfig: APIConfig, aiConfig: FirebaseAI.Config) -> FirebaseAI {
186+
apiConfig: APIConfig, useLimitedUseAppCheckTokens: Bool) -> FirebaseAI {
184187
guard let app = app ?? FirebaseApp.app() else {
185188
fatalError("No instance of the default Firebase app was found.")
186189
}
@@ -194,7 +197,7 @@ public final class FirebaseAI: Sendable {
194197
appName: app.name,
195198
location: location,
196199
apiConfig: apiConfig,
197-
aiConfig: aiConfig
200+
useLimitedUseAppCheckTokens: useLimitedUseAppCheckTokens
198201
)
199202
if let instance = instances[instanceKey] {
200203
return instance
@@ -203,13 +206,13 @@ public final class FirebaseAI: Sendable {
203206
app: app,
204207
location: location,
205208
apiConfig: apiConfig,
206-
aiConfig: aiConfig
209+
useLimitedUseAppCheckTokens: useLimitedUseAppCheckTokens
207210
)
208211
instances[instanceKey] = newInstance
209212
return newInstance
210213
}
211214

212-
init(app: FirebaseApp, location: String?, apiConfig: APIConfig, aiConfig: FirebaseAI.Config) {
215+
init(app: FirebaseApp, location: String?, apiConfig: APIConfig, useLimitedUseAppCheckTokens: Bool) {
213216
guard let projectID = app.options.projectID else {
214217
fatalError("The Firebase app named \"\(app.name)\" has no project ID in its configuration.")
215218
}
@@ -229,7 +232,7 @@ public final class FirebaseAI: Sendable {
229232
)
230233
self.apiConfig = apiConfig
231234
self.location = location
232-
self.aiConfig = aiConfig
235+
self.useLimitedUseAppCheckTokens = useLimitedUseAppCheckTokens
233236
}
234237

235238
func modelResourceName(modelName: String) -> String {
@@ -284,6 +287,6 @@ public final class FirebaseAI: Sendable {
284287
let appName: String
285288
let location: String?
286289
let apiConfig: APIConfig
287-
let aiConfig: FirebaseAI.Config
290+
let useLimitedUseAppCheckTokens: Bool
288291
}
289292
}

FirebaseAI/Sources/GenerativeAIService.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,12 +30,12 @@ struct GenerativeAIService {
3030

3131
private let urlSession: URLSession
3232

33-
private let aiConfig: FirebaseAI.Config
33+
private let useLimitedUseAppCheckTokens: Bool
3434

35-
init(firebaseInfo: FirebaseInfo, urlSession: URLSession, aiConfig: FirebaseAI.Config) {
35+
init(firebaseInfo: FirebaseInfo, urlSession: URLSession, useLimitedUseAppCheckTokens: Bool) {
3636
self.firebaseInfo = firebaseInfo
3737
self.urlSession = urlSession
38-
self.aiConfig = aiConfig
38+
self.useLimitedUseAppCheckTokens = useLimitedUseAppCheckTokens
3939
}
4040

4141
func loadRequest<T: GenerativeAIRequest>(request: T) async throws -> T.Response {
@@ -212,7 +212,7 @@ struct GenerativeAIService {
212212

213213
private func fetchAppCheckToken(appCheck: AppCheckInterop) async throws
214214
-> FIRAppCheckTokenResultInterop {
215-
if aiConfig.appCheck.requireLimitedUseTokens {
215+
if useLimitedUseAppCheckTokens {
216216
if let token = await appCheck.getLimitedUseToken?() {
217217
return token
218218
}

FirebaseAI/Sources/GenerativeModel.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ public final class GenerativeModel: Sendable {
7676
/// only text content is supported.
7777
/// - requestOptions: Configuration parameters for sending requests to the backend.
7878
/// - urlSession: The `URLSession` to use for requests; defaults to `URLSession.shared`.
79-
/// - aiConfig: Configuration for various behavior shared across models.
79+
/// - useLimitedUseAppCheckTokens: Use App Check's limited-use tokens instead of the standard cached tokens.
8080
init(modelName: String,
8181
modelResourceName: String,
8282
firebaseInfo: FirebaseInfo,
@@ -88,14 +88,14 @@ public final class GenerativeModel: Sendable {
8888
systemInstruction: ModelContent? = nil,
8989
requestOptions: RequestOptions,
9090
urlSession: URLSession = GenAIURLSession.default,
91-
aiConfig: FirebaseAI.Config = .config()) {
91+
useLimitedUseAppCheckTokens: Bool) {
9292
self.modelName = modelName
9393
self.modelResourceName = modelResourceName
9494
self.apiConfig = apiConfig
9595
generativeAIService = GenerativeAIService(
9696
firebaseInfo: firebaseInfo,
9797
urlSession: urlSession,
98-
aiConfig: aiConfig
98+
useLimitedUseAppCheckTokens: useLimitedUseAppCheckTokens
9999
)
100100
self.generationConfig = generationConfig
101101
self.safetySettings = safetySettings

FirebaseAI/Sources/Types/Public/Imagen/ImagenModel.swift

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,14 @@ public final class ImagenModel {
5353
generationConfig: ImagenGenerationConfig?,
5454
safetySettings: ImagenSafetySettings?,
5555
requestOptions: RequestOptions,
56-
urlSession: URLSession = GenAIURLSession.default, aiConfig: FirebaseAI.Config) {
56+
urlSession: URLSession = GenAIURLSession.default,
57+
useLimitedUseAppCheckTokens: Bool) {
5758
self.modelResourceName = modelResourceName
5859
self.apiConfig = apiConfig
5960
generativeAIService = GenerativeAIService(
6061
firebaseInfo: firebaseInfo,
6162
urlSession: urlSession,
62-
aiConfig: aiConfig
63+
useLimitedUseAppCheckTokens: useLimitedUseAppCheckTokens
6364
)
6465
self.generationConfig = generationConfig
6566
self.safetySettings = safetySettings

FirebaseAI/Tests/Unit/VertexComponentTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -156,13 +156,13 @@ class VertexComponentTests: XCTestCase {
156156
app: VertexComponentTests.app,
157157
location: location,
158158
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta),
159-
aiConfig: .config()
159+
useLimitedUseAppCheckTokens: false
160160
)
161161
let vertex2 = FirebaseAI.createInstance(
162162
app: VertexComponentTests.app,
163163
location: location,
164164
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1),
165-
aiConfig: .config()
165+
useLimitedUseAppCheckTokens: false
166166
)
167167

168168
// Ensure they are different instances.
@@ -215,7 +215,7 @@ class VertexComponentTests: XCTestCase {
215215
app: app,
216216
location: nil,
217217
apiConfig: apiConfig,
218-
aiConfig: .config()
218+
useLimitedUseAppCheckTokens: false
219219
)
220220
let model = "test-model-name"
221221

@@ -234,7 +234,7 @@ class VertexComponentTests: XCTestCase {
234234
app: app,
235235
location: nil,
236236
apiConfig: apiConfig,
237-
aiConfig: .config()
237+
useLimitedUseAppCheckTokens: false
238238
)
239239
let model = "test-model-name"
240240
let projectID = vertex.firebaseInfo.projectID
@@ -270,7 +270,7 @@ class VertexComponentTests: XCTestCase {
270270
app: app,
271271
location: nil,
272272
apiConfig: apiConfig,
273-
aiConfig: .config()
273+
useLimitedUseAppCheckTokens: false
274274
)
275275
let modelResourceName = vertex.modelResourceName(modelName: modelName)
276276
let expectedSystemInstruction = ModelContent(role: nil, parts: systemInstruction.parts)

0 commit comments

Comments
 (0)