Skip to content

Commit ecdad9f

Browse files
committed
[Firebase AI] Add Swift package product library FirebaseAI (#14773)
1 parent 4d2543a commit ecdad9f

File tree

5 files changed

+97
-83
lines changed

5 files changed

+97
-83
lines changed

FirebaseAI/Sources/FirebaseAI.swift

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,11 @@ public final class FirebaseAI: Sendable {
3535
/// - Returns: A `FirebaseAI` instance, configured with the custom `FirebaseApp`.
3636
public static func firebaseAI(app: FirebaseApp? = nil,
3737
backend: Backend = .googleAI()) -> FirebaseAI {
38-
let instance = firebaseAI(app: app, location: backend.location, apiConfig: backend.apiConfig)
38+
let instance = createInstance(
39+
app: app,
40+
location: backend.location,
41+
apiConfig: backend.apiConfig
42+
)
3943
// Verify that the `FirebaseAI` instance is always configured with the production endpoint since
4044
// this is the public API surface for creating an instance.
4145
assert(instance.apiConfig.service.endpoint == .firebaseVertexAIProd)
@@ -159,7 +163,8 @@ public final class FirebaseAI: Sendable {
159163
version: .v1beta
160164
)
161165

162-
static func firebaseAI(app: FirebaseApp?, location: String?, apiConfig: APIConfig) -> FirebaseAI {
166+
static func createInstance(app: FirebaseApp?, location: String?,
167+
apiConfig: APIConfig) -> FirebaseAI {
163168
guard let app = app ?? FirebaseApp.app() else {
164169
fatalError("No instance of the default Firebase app was found.")
165170
}

FirebaseAI/Tests/TestApp/Tests/Utilities/InstanceConfig.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,7 @@ extension FirebaseAI {
127127
switch instanceConfig.apiConfig.service {
128128
case .vertexAI:
129129
let location = instanceConfig.location ?? "us-central1"
130-
return FirebaseAI.firebaseAI(
130+
return FirebaseAI.createInstance(
131131
app: instanceConfig.app,
132132
location: location,
133133
apiConfig: instanceConfig.apiConfig
@@ -137,7 +137,7 @@ extension FirebaseAI {
137137
instanceConfig.location == nil,
138138
"The Developer API is global and does not support `location`."
139139
)
140-
return FirebaseAI.firebaseAI(
140+
return FirebaseAI.createInstance(
141141
app: instanceConfig.app,
142142
location: nil,
143143
apiConfig: instanceConfig.apiConfig

FirebaseAI/Tests/TestApp/VertexAITestApp.xcodeproj/project.pbxproj

Lines changed: 22 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,16 @@
1717
868A7C4F2CCC229F00E449DD /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 868A7C4D2CCC1F4700E449DD /* Credentials.swift */; };
1818
868A7C522CCC263300E449DD /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 868A7C502CCC263300E449DD /* Preview Assets.xcassets */; };
1919
868A7C542CCC26B500E449DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 868A7C532CCC26B500E449DD /* Assets.xcassets */; };
20-
8692F2982CC9477800539E8F /* FirebaseAppCheck in Frameworks */ = {isa = PBXBuildFile; productRef = 8692F2972CC9477800539E8F /* FirebaseAppCheck */; };
21-
8692F29A2CC9477800539E8F /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 8692F2992CC9477800539E8F /* FirebaseAuth */; };
22-
8692F29C2CC9477800539E8F /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 8692F29B2CC9477800539E8F /* FirebaseStorage */; };
23-
8692F29E2CC9477800539E8F /* FirebaseVertexAI in Frameworks */ = {isa = PBXBuildFile; productRef = 8692F29D2CC9477800539E8F /* FirebaseVertexAI */; };
2420
8698D7482CD4332B00ABA833 /* TestAppCheckProviderFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8698D7472CD4332B00ABA833 /* TestAppCheckProviderFactory.swift */; };
2521
86CC31352D91EE9E0087E964 /* FirebaseAppUtils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86CC31342D91EE9E0087E964 /* FirebaseAppUtils.swift */; };
2622
86D77DFC2D7A5340003D155D /* GenerateContentIntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86D77DFB2D7A5340003D155D /* GenerateContentIntegrationTests.swift */; };
2723
86D77DFE2D7B5C86003D155D /* GoogleService-Info-Spark.plist in Resources */ = {isa = PBXBuildFile; fileRef = 86D77DFD2D7B5C86003D155D /* GoogleService-Info-Spark.plist */; };
2824
86D77E022D7B63AF003D155D /* Constants.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86D77E012D7B63AC003D155D /* Constants.swift */; };
2925
86D77E042D7B6C9D003D155D /* InstanceConfig.swift in Sources */ = {isa = PBXBuildFile; fileRef = 86D77E032D7B6C95003D155D /* InstanceConfig.swift */; };
26+
86E8505B2DBAFBC3002E8D94 /* FirebaseAI in Frameworks */ = {isa = PBXBuildFile; productRef = 86E8505A2DBAFBC3002E8D94 /* FirebaseAI */; };
27+
86E8505D2DBAFBC3002E8D94 /* FirebaseAppCheck in Frameworks */ = {isa = PBXBuildFile; productRef = 86E8505C2DBAFBC3002E8D94 /* FirebaseAppCheck */; };
28+
86E8505F2DBAFBC3002E8D94 /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 86E8505E2DBAFBC3002E8D94 /* FirebaseAuth */; };
29+
86E850612DBAFBC3002E8D94 /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 86E850602DBAFBC3002E8D94 /* FirebaseStorage */; };
3030
DEF0BB4F2DA74F680093E9F4 /* TestHelpers.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF0BB4E2DA74F460093E9F4 /* TestHelpers.swift */; };
3131
DEF0BB512DA9B7450093E9F4 /* SchemaTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = DEF0BB502DA9B7400093E9F4 /* SchemaTests.swift */; };
3232
/* End PBXBuildFile section */
@@ -70,10 +70,10 @@
7070
isa = PBXFrameworksBuildPhase;
7171
buildActionMask = 2147483647;
7272
files = (
73-
8692F2982CC9477800539E8F /* FirebaseAppCheck in Frameworks */,
74-
8692F29E2CC9477800539E8F /* FirebaseVertexAI in Frameworks */,
75-
8692F29A2CC9477800539E8F /* FirebaseAuth in Frameworks */,
76-
8692F29C2CC9477800539E8F /* FirebaseStorage in Frameworks */,
73+
86E8505D2DBAFBC3002E8D94 /* FirebaseAppCheck in Frameworks */,
74+
86E850612DBAFBC3002E8D94 /* FirebaseStorage in Frameworks */,
75+
86E8505F2DBAFBC3002E8D94 /* FirebaseAuth in Frameworks */,
76+
86E8505B2DBAFBC3002E8D94 /* FirebaseAI in Frameworks */,
7777
);
7878
runOnlyForDeploymentPostprocessing = 0;
7979
};
@@ -187,10 +187,10 @@
187187
);
188188
name = "VertexAITestApp-SPM";
189189
packageProductDependencies = (
190-
8692F2972CC9477800539E8F /* FirebaseAppCheck */,
191-
8692F2992CC9477800539E8F /* FirebaseAuth */,
192-
8692F29B2CC9477800539E8F /* FirebaseStorage */,
193-
8692F29D2CC9477800539E8F /* FirebaseVertexAI */,
190+
86E8505A2DBAFBC3002E8D94 /* FirebaseAI */,
191+
86E8505C2DBAFBC3002E8D94 /* FirebaseAppCheck */,
192+
86E8505E2DBAFBC3002E8D94 /* FirebaseAuth */,
193+
86E850602DBAFBC3002E8D94 /* FirebaseStorage */,
194194
);
195195
productName = VertexAITestApp;
196196
productReference = 866138582CC943DD00F4B78E /* VertexAITestApp-SPM.app */;
@@ -243,7 +243,7 @@
243243
);
244244
mainGroup = 8661384F2CC943DD00F4B78E;
245245
packageReferences = (
246-
8692F2962CC9477800539E8F /* XCLocalSwiftPackageReference "../../.." */,
246+
86E850592DBAFBC3002E8D94 /* XCLocalSwiftPackageReference "../../.." */,
247247
);
248248
productRefGroup = 866138592CC943DD00F4B78E /* Products */;
249249
projectDirPath = "";
@@ -585,29 +585,29 @@
585585
/* End XCConfigurationList section */
586586

587587
/* Begin XCLocalSwiftPackageReference section */
588-
8692F2962CC9477800539E8F /* XCLocalSwiftPackageReference "../../.." */ = {
588+
86E850592DBAFBC3002E8D94 /* XCLocalSwiftPackageReference "../../.." */ = {
589589
isa = XCLocalSwiftPackageReference;
590-
relativePath = ../../..;
590+
relativePath = "../../..";
591591
};
592592
/* End XCLocalSwiftPackageReference section */
593593

594594
/* Begin XCSwiftPackageProductDependency section */
595-
8692F2972CC9477800539E8F /* FirebaseAppCheck */ = {
595+
86E8505A2DBAFBC3002E8D94 /* FirebaseAI */ = {
596+
isa = XCSwiftPackageProductDependency;
597+
productName = FirebaseAI;
598+
};
599+
86E8505C2DBAFBC3002E8D94 /* FirebaseAppCheck */ = {
596600
isa = XCSwiftPackageProductDependency;
597601
productName = FirebaseAppCheck;
598602
};
599-
8692F2992CC9477800539E8F /* FirebaseAuth */ = {
603+
86E8505E2DBAFBC3002E8D94 /* FirebaseAuth */ = {
600604
isa = XCSwiftPackageProductDependency;
601605
productName = FirebaseAuth;
602606
};
603-
8692F29B2CC9477800539E8F /* FirebaseStorage */ = {
607+
86E850602DBAFBC3002E8D94 /* FirebaseStorage */ = {
604608
isa = XCSwiftPackageProductDependency;
605609
productName = FirebaseStorage;
606610
};
607-
8692F29D2CC9477800539E8F /* FirebaseVertexAI */ = {
608-
isa = XCSwiftPackageProductDependency;
609-
productName = FirebaseVertexAI;
610-
};
611611
/* End XCSwiftPackageProductDependency section */
612612
};
613613
rootObject = 866138502CC943DD00F4B78E /* Project object */;

FirebaseAI/Tests/Unit/VertexComponentTests.swift

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -152,12 +152,12 @@ class VertexComponentTests: XCTestCase {
152152
}
153153

154154
func testSameAppAndDifferentAPI_newInstanceCreated() throws {
155-
let vertex1 = FirebaseAI.firebaseAI(
155+
let vertex1 = FirebaseAI.createInstance(
156156
app: VertexComponentTests.app,
157157
location: location,
158158
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1beta)
159159
)
160-
let vertex2 = FirebaseAI.firebaseAI(
160+
let vertex2 = FirebaseAI.createInstance(
161161
app: VertexComponentTests.app,
162162
location: location,
163163
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1)
@@ -208,7 +208,7 @@ class VertexComponentTests: XCTestCase {
208208
func testModelResourceName_developerAPI_generativeLanguage() throws {
209209
let app = try XCTUnwrap(VertexComponentTests.app)
210210
let apiConfig = APIConfig(service: .developer(endpoint: .generativeLanguage), version: .v1beta)
211-
let vertex = FirebaseAI.firebaseAI(app: app, location: nil, apiConfig: apiConfig)
211+
let vertex = FirebaseAI.createInstance(app: app, location: nil, apiConfig: apiConfig)
212212
let model = "test-model-name"
213213

214214
let modelResourceName = vertex.modelResourceName(modelName: model)
@@ -222,7 +222,7 @@ class VertexComponentTests: XCTestCase {
222222
service: .developer(endpoint: .firebaseVertexAIStaging),
223223
version: .v1beta
224224
)
225-
let vertex = FirebaseAI.firebaseAI(app: app, location: nil, apiConfig: apiConfig)
225+
let vertex = FirebaseAI.createInstance(app: app, location: nil, apiConfig: apiConfig)
226226
let model = "test-model-name"
227227
let projectID = vertex.firebaseInfo.projectID
228228

@@ -253,7 +253,7 @@ class VertexComponentTests: XCTestCase {
253253
service: .developer(endpoint: .firebaseVertexAIStaging),
254254
version: .v1beta
255255
)
256-
let vertex = FirebaseAI.firebaseAI(app: app, location: nil, apiConfig: apiConfig)
256+
let vertex = FirebaseAI.createInstance(app: app, location: nil, apiConfig: apiConfig)
257257
let modelResourceName = vertex.modelResourceName(modelName: modelName)
258258
let expectedSystemInstruction = ModelContent(role: nil, parts: systemInstruction.parts)
259259

Package.swift

Lines changed: 61 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,18 @@ let package = Package(
2525
name: "Firebase",
2626
platforms: [.iOS(.v12), .macCatalyst(.v13), .macOS(.v10_15), .tvOS(.v13), .watchOS(.v7)],
2727
products: [
28+
.library(
29+
name: "FirebaseAI",
30+
targets: ["FirebaseAI"]
31+
),
32+
// Backwards-compatibility library for existing "Vertex AI in Firebase" users.
33+
.library(
34+
name: "FirebaseVertexAI",
35+
targets: [
36+
"FirebaseAI",
37+
"FirebaseVertexAI",
38+
]
39+
),
2840
.library(
2941
name: "FirebaseAnalytics",
3042
targets: ["FirebaseAnalyticsTarget"]
@@ -121,10 +133,6 @@ let package = Package(
121133
name: "FirebaseStorage",
122134
targets: ["FirebaseStorage"]
123135
),
124-
.library(
125-
name: "FirebaseVertexAI",
126-
targets: ["FirebaseVertexAI"]
127-
),
128136
],
129137
dependencies: [
130138
.package(
@@ -179,6 +187,55 @@ let package = Package(
179187
path: "CoreOnly/Sources",
180188
publicHeadersPath: "./"
181189
),
190+
191+
// MARK: - Firebase AI
192+
193+
.target(
194+
name: "FirebaseAI",
195+
dependencies: [
196+
"FirebaseAppCheckInterop",
197+
"FirebaseAuthInterop",
198+
"FirebaseCore",
199+
"FirebaseCoreExtension",
200+
],
201+
path: "FirebaseAI/Sources"
202+
),
203+
.testTarget(
204+
name: "FirebaseAIUnit",
205+
dependencies: [
206+
"FirebaseAI",
207+
"FirebaseStorage",
208+
],
209+
path: "FirebaseAI/Tests/Unit",
210+
resources: [
211+
.copy("vertexai-sdk-test-data/mock-responses/vertexai"),
212+
.process("Resources"),
213+
],
214+
cSettings: [
215+
.headerSearchPath("../../../"),
216+
]
217+
),
218+
// Backwards-compatibility targets for existing "Vertex AI in Firebase" users.
219+
.target(
220+
name: "FirebaseVertexAI",
221+
dependencies: [
222+
"FirebaseAI",
223+
],
224+
path: "FirebaseVertexAI/Sources"
225+
),
226+
.testTarget(
227+
name: "FirebaseVertexAIUnit",
228+
dependencies: [
229+
"FirebaseVertexAI",
230+
],
231+
path: "FirebaseVertexAI/Tests/Unit",
232+
resources: [
233+
.process("Resources"),
234+
]
235+
),
236+
237+
// MARK: - Firebase Core
238+
182239
.target(
183240
name: "FirebaseCore",
184241
dependencies: [
@@ -1297,54 +1354,6 @@ let package = Package(
12971354
.headerSearchPath("../../.."),
12981355
]
12991356
),
1300-
1301-
// MARK: - Firebase AI
1302-
1303-
.target(
1304-
name: "FirebaseAI",
1305-
dependencies: [
1306-
"FirebaseAppCheckInterop",
1307-
"FirebaseAuthInterop",
1308-
"FirebaseCore",
1309-
"FirebaseCoreExtension",
1310-
],
1311-
path: "FirebaseAI/Sources"
1312-
),
1313-
.testTarget(
1314-
name: "FirebaseAIUnit",
1315-
dependencies: [
1316-
"FirebaseAI",
1317-
"FirebaseStorage",
1318-
],
1319-
path: "FirebaseAI/Tests/Unit",
1320-
resources: [
1321-
.copy("vertexai-sdk-test-data/mock-responses/vertexai"),
1322-
.process("Resources"),
1323-
],
1324-
cSettings: [
1325-
.headerSearchPath("../../../"),
1326-
]
1327-
),
1328-
1329-
// MARK: - Firebase Vertex AI
1330-
1331-
.target(
1332-
name: "FirebaseVertexAI",
1333-
dependencies: [
1334-
"FirebaseAI",
1335-
],
1336-
path: "FirebaseVertexAI/Sources"
1337-
),
1338-
.testTarget(
1339-
name: "FirebaseVertexAIUnit",
1340-
dependencies: [
1341-
"FirebaseVertexAI",
1342-
],
1343-
path: "FirebaseVertexAI/Tests/Unit",
1344-
resources: [
1345-
.process("Resources"),
1346-
]
1347-
),
13481357
] + firestoreTargets(),
13491358
cLanguageStandard: .c99,
13501359
cxxLanguageStandard: CXXLanguageStandard.gnucxx14

0 commit comments

Comments
 (0)