diff --git a/.github/workflows/vertexai.yml b/.github/workflows/vertexai.yml
index 3d98ba70555..9cc70054bbb 100644
--- a/.github/workflows/vertexai.yml
+++ b/.github/workflows/vertexai.yml
@@ -125,6 +125,37 @@ jobs:
retry_wait_seconds: 120
command: scripts/build.sh FirebaseVertexAIIntegration ${{ matrix.target }} spm
+ testapp-integration:
+ strategy:
+ matrix:
+ target: [iOS]
+ os: [macos-15]
+ include:
+ - os: macos-15
+ xcode: Xcode_16
+ runs-on: ${{ matrix.os }}
+ needs: spm-package-resolved
+ env:
+ TEST_RUNNER_FIRAAppCheckDebugToken: ${{ secrets.VERTEXAI_INTEGRATION_FAC_DEBUG_TOKEN }}
+ FIREBASECI_USE_LATEST_GOOGLEAPPMEASUREMENT: 1
+ secrets_passphrase: ${{ secrets.GHASecretsGPGPassphrase1 }}
+ steps:
+ - uses: actions/checkout@v4
+ - uses: actions/cache/restore@v4
+ with:
+ path: .build
+ key: ${{needs.spm-package-resolved.outputs.cache_key}}
+ - name: Install Secret GoogleService-Info.plist
+ run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/VertexAI/TestApp-GoogleService-Info.plist.gpg \
+ FirebaseVertexAI/Tests/TestApp/Resources/GoogleService-Info.plist "$secrets_passphrase"
+ - name: Install Secret Credentials.swift
+ run: scripts/decrypt_gha_secret.sh scripts/gha-encrypted/VertexAI/TestApp-Credentials.swift.gpg \
+ FirebaseVertexAI/Tests/TestApp/Tests/Integration/Credentials.swift "$secrets_passphrase"
+ - name: Xcode
+ run: sudo xcode-select -s /Applications/${{ matrix.xcode }}.app/Contents/Developer
+ - name: Run IntegrationTests
+ run: scripts/build.sh VertexIntegration ${{ matrix.target }}
+
pod-lib-lint:
# Don't run on private repo unless it is a PR.
if: (github.repository == 'Firebase/firebase-ios-sdk' && github.event_name == 'schedule') || github.event_name == 'pull_request'
diff --git a/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json b/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json
new file mode 100644
index 00000000000..eb878970081
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/AccentColor.colorset/Contents.json
@@ -0,0 +1,11 @@
+{
+ "colors" : [
+ {
+ "idiom" : "universal"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json b/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
new file mode 100644
index 00000000000..532cd729c61
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/AppIcon.appiconset/Contents.json
@@ -0,0 +1,63 @@
+{
+ "images" : [
+ {
+ "idiom" : "universal",
+ "platform" : "ios",
+ "size" : "1024x1024"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "16x16"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "16x16"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "32x32"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "32x32"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "128x128"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "128x128"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "256x256"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "256x256"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "1x",
+ "size" : "512x512"
+ },
+ {
+ "idiom" : "mac",
+ "scale" : "2x",
+ "size" : "512x512"
+ }
+ ],
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/Contents.json b/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/Contents.json
new file mode 100644
index 00000000000..73c00596a7f
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/Resources/Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/FirebaseVertexAI/Tests/TestApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json b/FirebaseVertexAI/Tests/TestApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json
new file mode 100644
index 00000000000..73c00596a7f
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/Resources/Preview Content/Preview Assets.xcassets/Contents.json
@@ -0,0 +1,6 @@
+{
+ "info" : {
+ "author" : "xcode",
+ "version" : 1
+ }
+}
diff --git a/FirebaseVertexAI/Tests/TestApp/Resources/TestApp.entitlements b/FirebaseVertexAI/Tests/TestApp/Resources/TestApp.entitlements
new file mode 100644
index 00000000000..ee95ab7e582
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/Resources/TestApp.entitlements
@@ -0,0 +1,10 @@
+
+
+
+
+ com.apple.security.app-sandbox
+
+ com.apple.security.network.client
+
+
+
diff --git a/FirebaseVertexAI/Tests/TestApp/Sources/ContentView.swift b/FirebaseVertexAI/Tests/TestApp/Sources/ContentView.swift
new file mode 100644
index 00000000000..52af5939455
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/Sources/ContentView.swift
@@ -0,0 +1,31 @@
+// Copyright 2024 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import SwiftUI
+
+struct ContentView: View {
+ var body: some View {
+ VStack {
+ Image(systemName: "globe")
+ .imageScale(.large)
+ .foregroundStyle(.tint)
+ Text("Hello, world!")
+ }
+ .padding()
+ }
+}
+
+#Preview {
+ ContentView()
+}
diff --git a/FirebaseVertexAI/Tests/TestApp/Sources/TestApp.swift b/FirebaseVertexAI/Tests/TestApp/Sources/TestApp.swift
new file mode 100644
index 00000000000..2226e352203
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/Sources/TestApp.swift
@@ -0,0 +1,31 @@
+// Copyright 2024 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import FirebaseAppCheck
+import FirebaseCore
+import SwiftUI
+
+@main
+struct TestApp: App {
+ init() {
+ AppCheck.setAppCheckProviderFactory(AppCheckDebugProviderFactory())
+ FirebaseApp.configure()
+ }
+
+ var body: some Scene {
+ WindowGroup {
+ ContentView()
+ }
+ }
+}
diff --git a/FirebaseVertexAI/Tests/TestApp/Tests/Integration/IntegrationTests.swift b/FirebaseVertexAI/Tests/TestApp/Tests/Integration/IntegrationTests.swift
new file mode 100644
index 00000000000..b90a13515a6
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/Tests/Integration/IntegrationTests.swift
@@ -0,0 +1,214 @@
+// Copyright 2024 Google LLC
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+
+import FirebaseAuth
+import FirebaseCore
+import FirebaseStorage
+import FirebaseVertexAI
+import XCTest
+
+@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *)
+final class IntegrationTests: XCTestCase {
+ // Set temperature, topP and topK to lowest allowed values to make responses more deterministic.
+ let generationConfig = GenerationConfig(
+ temperature: 0.0,
+ topP: 0.0,
+ topK: 1,
+ responseMIMEType: "text/plain"
+ )
+ let systemInstruction = ModelContent(
+ role: "system",
+ parts: "You are a friendly and helpful assistant."
+ )
+ let safetySettings = [
+ SafetySetting(harmCategory: .harassment, threshold: .blockLowAndAbove, method: .probability),
+ SafetySetting(harmCategory: .hateSpeech, threshold: .blockLowAndAbove, method: .severity),
+ SafetySetting(harmCategory: .sexuallyExplicit, threshold: .blockLowAndAbove),
+ SafetySetting(harmCategory: .dangerousContent, threshold: .blockLowAndAbove),
+ SafetySetting(harmCategory: .civicIntegrity, threshold: .blockLowAndAbove),
+ ]
+
+ var vertex: VertexAI!
+ var model: GenerativeModel!
+ var storage: Storage!
+ var userID1 = ""
+
+ override func setUp() async throws {
+ let authResult = try await Auth.auth().signIn(
+ withEmail: Credentials.emailAddress1,
+ password: Credentials.emailPassword1
+ )
+ userID1 = authResult.user.uid
+
+ vertex = VertexAI.vertexAI()
+ model = vertex.generativeModel(
+ modelName: "gemini-1.5-flash",
+ generationConfig: generationConfig,
+ safetySettings: safetySettings,
+ tools: [],
+ toolConfig: .init(functionCallingConfig: .none()),
+ systemInstruction: systemInstruction
+ )
+
+ storage = Storage.storage()
+ }
+
+ // MARK: - Generate Content
+
+ func testGenerateContent() async throws {
+ let prompt = "Where is Google headquarters located? Answer with the city name only."
+
+ let response = try await model.generateContent(prompt)
+
+ let text = try XCTUnwrap(response.text).trimmingCharacters(in: .whitespacesAndNewlines)
+ XCTAssertEqual(text, "Mountain View")
+ }
+
+ // MARK: - Count Tokens
+
+ func testCountTokens_text() async throws {
+ let prompt = "Why is the sky blue?"
+ model = vertex.generativeModel(
+ modelName: "gemini-1.5-pro",
+ generationConfig: generationConfig,
+ safetySettings: [
+ SafetySetting(harmCategory: .harassment, threshold: .blockLowAndAbove, method: .severity),
+ SafetySetting(harmCategory: .hateSpeech, threshold: .blockMediumAndAbove),
+ SafetySetting(harmCategory: .sexuallyExplicit, threshold: .blockOnlyHigh),
+ SafetySetting(harmCategory: .dangerousContent, threshold: .blockNone),
+ SafetySetting(harmCategory: .civicIntegrity, threshold: .off, method: .probability),
+ ],
+ toolConfig: .init(functionCallingConfig: .auto()),
+ systemInstruction: systemInstruction
+ )
+
+ let response = try await model.countTokens(prompt)
+
+ XCTAssertEqual(response.totalTokens, 14)
+ XCTAssertEqual(response.totalBillableCharacters, 51)
+ }
+
+ #if canImport(UIKit)
+ func testCountTokens_image_inlineData() async throws {
+ guard let image = UIImage(systemName: "cloud") else {
+ XCTFail("Image not found.")
+ return
+ }
+
+ let response = try await model.countTokens(image)
+
+ XCTAssertEqual(response.totalTokens, 266)
+ XCTAssertEqual(response.totalBillableCharacters, 35)
+ }
+ #endif // canImport(UIKit)
+
+ func testCountTokens_image_fileData_public() async throws {
+ let storageRef = storage.reference(withPath: "vertexai/public/green.png")
+ let fileData = FileDataPart(uri: storageRef.gsURI, mimeType: "image/png")
+
+ let response = try await model.countTokens(fileData)
+
+ XCTAssertEqual(response.totalTokens, 266)
+ XCTAssertEqual(response.totalBillableCharacters, 35)
+ }
+
+ func testCountTokens_image_fileData_requiresAuth_signedIn() async throws {
+ let storageRef = storage.reference(withPath: "vertexai/authenticated/all_users/yellow.jpg")
+ let fileData = FileDataPart(uri: storageRef.gsURI, mimeType: "image/jpeg")
+
+ let response = try await model.countTokens(fileData)
+
+ XCTAssertEqual(response.totalTokens, 266)
+ XCTAssertEqual(response.totalBillableCharacters, 35)
+ }
+
+ func testCountTokens_image_fileData_requiresUserAuth_userSignedIn() async throws {
+ let storageRef = storage.reference(withPath: "vertexai/authenticated/user/\(userID1)/red.webp")
+
+ let fileData = FileDataPart(uri: storageRef.gsURI, mimeType: "image/webp")
+
+ let response = try await model.countTokens(fileData)
+
+ XCTAssertEqual(response.totalTokens, 266)
+ XCTAssertEqual(response.totalBillableCharacters, 35)
+ }
+
+ func testCountTokens_image_fileData_requiresUserAuth_wrongUser_permissionDenied() async throws {
+ let userID = "3MjEzU6JIobWvHdCYHicnDMcPpQ2"
+ let storageRef = storage.reference(withPath: "vertexai/authenticated/user/\(userID)/pink.webp")
+
+ let fileData = FileDataPart(uri: storageRef.gsURI, mimeType: "image/webp")
+
+ do {
+ _ = try await model.countTokens(fileData)
+ XCTFail("Expected to throw an error.")
+ } catch {
+ let errorDescription = String(describing: error)
+ XCTAssertTrue(errorDescription.contains("403"))
+ XCTAssertTrue(errorDescription.contains("The caller does not have permission"))
+ }
+ }
+
+ func testCountTokens_functionCalling() async throws {
+ let sumDeclaration = FunctionDeclaration(
+ name: "sum",
+ description: "Adds two integers.",
+ parameters: ["x": .integer(), "y": .integer()]
+ )
+ model = vertex.generativeModel(
+ modelName: "gemini-1.5-flash",
+ tools: [.functionDeclarations([sumDeclaration])],
+ toolConfig: .init(functionCallingConfig: .any(allowedFunctionNames: ["sum"]))
+ )
+ let prompt = "What is 10 + 32?"
+ let sumCall = FunctionCallPart(name: "sum", args: ["x": .number(10), "y": .number(32)])
+ let sumResponse = FunctionResponsePart(name: "sum", response: ["result": .number(42)])
+
+ let response = try await model.countTokens([
+ ModelContent(role: "user", parts: prompt),
+ ModelContent(role: "model", parts: sumCall),
+ ModelContent(role: "function", parts: sumResponse),
+ ])
+
+ XCTAssertEqual(response.totalTokens, 24)
+ XCTAssertEqual(response.totalBillableCharacters, 71)
+ }
+
+ func testCountTokens_jsonSchema() async throws {
+ model = vertex.generativeModel(
+ modelName: "gemini-1.5-flash",
+ generationConfig: GenerationConfig(
+ responseMIMEType: "application/json",
+ responseSchema: Schema.object(properties: [
+ "startDate": .string(format: .custom("date")),
+ "yearsSince": .integer(format: .custom("int16")),
+ "hoursSince": .integer(format: .int32),
+ "minutesSince": .integer(format: .int64),
+ ])
+ )
+ )
+ let prompt = "It is 2050-01-01, how many years, hours and minutes since 2000-01-01?"
+
+ let response = try await model.countTokens(prompt)
+
+ XCTAssertEqual(response.totalTokens, 34)
+ XCTAssertEqual(response.totalBillableCharacters, 59)
+ }
+}
+
+extension StorageReference {
+ var gsURI: String {
+ return "gs://\(bucket)/\(fullPath)"
+ }
+}
diff --git a/FirebaseVertexAI/Tests/TestApp/VertexAITestApp.xcodeproj/project.pbxproj b/FirebaseVertexAI/Tests/TestApp/VertexAITestApp.xcodeproj/project.pbxproj
new file mode 100644
index 00000000000..145a13b2f90
--- /dev/null
+++ b/FirebaseVertexAI/Tests/TestApp/VertexAITestApp.xcodeproj/project.pbxproj
@@ -0,0 +1,556 @@
+// !$*UTF8*$!
+{
+ archiveVersion = 1;
+ classes = {
+ };
+ objectVersion = 60;
+ objects = {
+
+/* Begin PBXBuildFile section */
+ 8661385C2CC943DD00F4B78E /* TestApp.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8661385B2CC943DD00F4B78E /* TestApp.swift */; };
+ 8661385E2CC943DD00F4B78E /* ContentView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8661385D2CC943DD00F4B78E /* ContentView.swift */; };
+ 8661386E2CC943DE00F4B78E /* IntegrationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8661386D2CC943DE00F4B78E /* IntegrationTests.swift */; };
+ 868A7C482CCA931B00E449DD /* GoogleService-Info.plist in Resources */ = {isa = PBXBuildFile; fileRef = 868A7C462CCA931B00E449DD /* GoogleService-Info.plist */; };
+ 868A7C4F2CCC229F00E449DD /* Credentials.swift in Sources */ = {isa = PBXBuildFile; fileRef = 868A7C4D2CCC1F4700E449DD /* Credentials.swift */; };
+ 868A7C522CCC263300E449DD /* Preview Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 868A7C502CCC263300E449DD /* Preview Assets.xcassets */; };
+ 868A7C542CCC26B500E449DD /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 868A7C532CCC26B500E449DD /* Assets.xcassets */; };
+ 8692F2982CC9477800539E8F /* FirebaseAppCheck in Frameworks */ = {isa = PBXBuildFile; productRef = 8692F2972CC9477800539E8F /* FirebaseAppCheck */; };
+ 8692F29A2CC9477800539E8F /* FirebaseAuth in Frameworks */ = {isa = PBXBuildFile; productRef = 8692F2992CC9477800539E8F /* FirebaseAuth */; };
+ 8692F29C2CC9477800539E8F /* FirebaseStorage in Frameworks */ = {isa = PBXBuildFile; productRef = 8692F29B2CC9477800539E8F /* FirebaseStorage */; };
+ 8692F29E2CC9477800539E8F /* FirebaseVertexAI in Frameworks */ = {isa = PBXBuildFile; productRef = 8692F29D2CC9477800539E8F /* FirebaseVertexAI */; };
+/* End PBXBuildFile section */
+
+/* Begin PBXContainerItemProxy section */
+ 8661386A2CC943DE00F4B78E /* PBXContainerItemProxy */ = {
+ isa = PBXContainerItemProxy;
+ containerPortal = 866138502CC943DD00F4B78E /* Project object */;
+ proxyType = 1;
+ remoteGlobalIDString = 866138572CC943DD00F4B78E;
+ remoteInfo = VertexAITestApp;
+ };
+/* End PBXContainerItemProxy section */
+
+/* Begin PBXFileReference section */
+ 866138582CC943DD00F4B78E /* VertexAITestApp-SPM.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "VertexAITestApp-SPM.app"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8661385B2CC943DD00F4B78E /* TestApp.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TestApp.swift; sourceTree = ""; };
+ 8661385D2CC943DD00F4B78E /* ContentView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ContentView.swift; sourceTree = ""; };
+ 866138692CC943DE00F4B78E /* IntegrationTests-SPM.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = "IntegrationTests-SPM.xctest"; sourceTree = BUILT_PRODUCTS_DIR; };
+ 8661386D2CC943DE00F4B78E /* IntegrationTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IntegrationTests.swift; sourceTree = ""; };
+ 868A7C462CCA931B00E449DD /* GoogleService-Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = "GoogleService-Info.plist"; sourceTree = ""; };
+ 868A7C4D2CCC1F4700E449DD /* Credentials.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Credentials.swift; sourceTree = ""; };
+ 868A7C502CCC263300E449DD /* Preview Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = "Preview Assets.xcassets"; sourceTree = ""; };
+ 868A7C532CCC26B500E449DD /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
+ 868A7C552CCC271300E449DD /* TestApp.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = TestApp.entitlements; sourceTree = ""; };
+/* End PBXFileReference section */
+
+/* Begin PBXFrameworksBuildPhase section */
+ 866138552CC943DD00F4B78E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8692F2982CC9477800539E8F /* FirebaseAppCheck in Frameworks */,
+ 8692F29E2CC9477800539E8F /* FirebaseVertexAI in Frameworks */,
+ 8692F29A2CC9477800539E8F /* FirebaseAuth in Frameworks */,
+ 8692F29C2CC9477800539E8F /* FirebaseStorage in Frameworks */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 866138662CC943DE00F4B78E /* Frameworks */ = {
+ isa = PBXFrameworksBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXFrameworksBuildPhase section */
+
+/* Begin PBXGroup section */
+ 8661384F2CC943DD00F4B78E = {
+ isa = PBXGroup;
+ children = (
+ 868A7C562CCC277100E449DD /* Sources */,
+ 868A7C582CCC27AF00E449DD /* Tests */,
+ 868A7C472CCA931B00E449DD /* Resources */,
+ 866138592CC943DD00F4B78E /* Products */,
+ );
+ sourceTree = "";
+ };
+ 866138592CC943DD00F4B78E /* Products */ = {
+ isa = PBXGroup;
+ children = (
+ 866138582CC943DD00F4B78E /* VertexAITestApp-SPM.app */,
+ 866138692CC943DE00F4B78E /* IntegrationTests-SPM.xctest */,
+ );
+ name = Products;
+ sourceTree = "";
+ };
+ 868A7C472CCA931B00E449DD /* Resources */ = {
+ isa = PBXGroup;
+ children = (
+ 868A7C512CCC263300E449DD /* Preview Content */,
+ 868A7C532CCC26B500E449DD /* Assets.xcassets */,
+ 868A7C552CCC271300E449DD /* TestApp.entitlements */,
+ 868A7C462CCA931B00E449DD /* GoogleService-Info.plist */,
+ );
+ path = Resources;
+ sourceTree = "";
+ };
+ 868A7C512CCC263300E449DD /* Preview Content */ = {
+ isa = PBXGroup;
+ children = (
+ 868A7C502CCC263300E449DD /* Preview Assets.xcassets */,
+ );
+ path = "Preview Content";
+ sourceTree = "";
+ };
+ 868A7C562CCC277100E449DD /* Sources */ = {
+ isa = PBXGroup;
+ children = (
+ 8661385B2CC943DD00F4B78E /* TestApp.swift */,
+ 8661385D2CC943DD00F4B78E /* ContentView.swift */,
+ );
+ path = Sources;
+ sourceTree = "";
+ };
+ 868A7C572CCC27AF00E449DD /* Integration */ = {
+ isa = PBXGroup;
+ children = (
+ 868A7C4D2CCC1F4700E449DD /* Credentials.swift */,
+ 8661386D2CC943DE00F4B78E /* IntegrationTests.swift */,
+ );
+ path = Integration;
+ sourceTree = "";
+ };
+ 868A7C582CCC27AF00E449DD /* Tests */ = {
+ isa = PBXGroup;
+ children = (
+ 868A7C572CCC27AF00E449DD /* Integration */,
+ );
+ path = Tests;
+ sourceTree = "";
+ };
+/* End PBXGroup section */
+
+/* Begin PBXNativeTarget section */
+ 866138572CC943DD00F4B78E /* VertexAITestApp-SPM */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 8661387D2CC943DE00F4B78E /* Build configuration list for PBXNativeTarget "VertexAITestApp-SPM" */;
+ buildPhases = (
+ 866138542CC943DD00F4B78E /* Sources */,
+ 866138552CC943DD00F4B78E /* Frameworks */,
+ 866138562CC943DD00F4B78E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ );
+ name = "VertexAITestApp-SPM";
+ packageProductDependencies = (
+ 8692F2972CC9477800539E8F /* FirebaseAppCheck */,
+ 8692F2992CC9477800539E8F /* FirebaseAuth */,
+ 8692F29B2CC9477800539E8F /* FirebaseStorage */,
+ 8692F29D2CC9477800539E8F /* FirebaseVertexAI */,
+ );
+ productName = VertexAITestApp;
+ productReference = 866138582CC943DD00F4B78E /* VertexAITestApp-SPM.app */;
+ productType = "com.apple.product-type.application";
+ };
+ 866138682CC943DE00F4B78E /* IntegrationTests-SPM */ = {
+ isa = PBXNativeTarget;
+ buildConfigurationList = 866138802CC943DE00F4B78E /* Build configuration list for PBXNativeTarget "IntegrationTests-SPM" */;
+ buildPhases = (
+ 866138652CC943DE00F4B78E /* Sources */,
+ 866138662CC943DE00F4B78E /* Frameworks */,
+ 866138672CC943DE00F4B78E /* Resources */,
+ );
+ buildRules = (
+ );
+ dependencies = (
+ 8661386B2CC943DE00F4B78E /* PBXTargetDependency */,
+ );
+ name = "IntegrationTests-SPM";
+ productName = VertexAITestAppTests;
+ productReference = 866138692CC943DE00F4B78E /* IntegrationTests-SPM.xctest */;
+ productType = "com.apple.product-type.bundle.unit-test";
+ };
+/* End PBXNativeTarget section */
+
+/* Begin PBXProject section */
+ 866138502CC943DD00F4B78E /* Project object */ = {
+ isa = PBXProject;
+ attributes = {
+ BuildIndependentTargetsInParallel = 1;
+ LastSwiftUpdateCheck = 1520;
+ LastUpgradeCheck = 1520;
+ TargetAttributes = {
+ 866138572CC943DD00F4B78E = {
+ CreatedOnToolsVersion = 15.2;
+ };
+ 866138682CC943DE00F4B78E = {
+ CreatedOnToolsVersion = 15.2;
+ TestTargetID = 866138572CC943DD00F4B78E;
+ };
+ };
+ };
+ buildConfigurationList = 866138532CC943DD00F4B78E /* Build configuration list for PBXProject "VertexAITestApp" */;
+ compatibilityVersion = "Xcode 15.0";
+ developmentRegion = en;
+ hasScannedForEncodings = 0;
+ knownRegions = (
+ en,
+ Base,
+ );
+ mainGroup = 8661384F2CC943DD00F4B78E;
+ packageReferences = (
+ 8692F2962CC9477800539E8F /* XCLocalSwiftPackageReference "../../.." */,
+ );
+ productRefGroup = 866138592CC943DD00F4B78E /* Products */;
+ projectDirPath = "";
+ projectRoot = "";
+ targets = (
+ 866138572CC943DD00F4B78E /* VertexAITestApp-SPM */,
+ 866138682CC943DE00F4B78E /* IntegrationTests-SPM */,
+ );
+ };
+/* End PBXProject section */
+
+/* Begin PBXResourcesBuildPhase section */
+ 866138562CC943DD00F4B78E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 868A7C522CCC263300E449DD /* Preview Assets.xcassets in Resources */,
+ 868A7C542CCC26B500E449DD /* Assets.xcassets in Resources */,
+ 868A7C482CCA931B00E449DD /* GoogleService-Info.plist in Resources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 866138672CC943DE00F4B78E /* Resources */ = {
+ isa = PBXResourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXResourcesBuildPhase section */
+
+/* Begin PBXSourcesBuildPhase section */
+ 866138542CC943DD00F4B78E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 8661385E2CC943DD00F4B78E /* ContentView.swift in Sources */,
+ 8661385C2CC943DD00F4B78E /* TestApp.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+ 866138652CC943DE00F4B78E /* Sources */ = {
+ isa = PBXSourcesBuildPhase;
+ buildActionMask = 2147483647;
+ files = (
+ 868A7C4F2CCC229F00E449DD /* Credentials.swift in Sources */,
+ 8661386E2CC943DE00F4B78E /* IntegrationTests.swift in Sources */,
+ );
+ runOnlyForDeploymentPostprocessing = 0;
+ };
+/* End PBXSourcesBuildPhase section */
+
+/* Begin PBXTargetDependency section */
+ 8661386B2CC943DE00F4B78E /* PBXTargetDependency */ = {
+ isa = PBXTargetDependency;
+ target = 866138572CC943DD00F4B78E /* VertexAITestApp-SPM */;
+ targetProxy = 8661386A2CC943DE00F4B78E /* PBXContainerItemProxy */;
+ };
+/* End PBXTargetDependency section */
+
+/* Begin XCBuildConfiguration section */
+ 8661387B2CC943DE00F4B78E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = dwarf;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_TESTABILITY = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_DYNAMIC_NO_PIC = NO;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_OPTIMIZATION_LEVEL = 0;
+ GCC_PREPROCESSOR_DEFINITIONS = (
+ "DEBUG=1",
+ "$(inherited)",
+ );
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE;
+ MTL_FAST_MATH = YES;
+ ONLY_ACTIVE_ARCH = YES;
+ SWIFT_ACTIVE_COMPILATION_CONDITIONS = "DEBUG $(inherited)";
+ SWIFT_OPTIMIZATION_LEVEL = "-Onone";
+ };
+ name = Debug;
+ };
+ 8661387C2CC943DE00F4B78E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_SEARCH_USER_PATHS = NO;
+ ASSETCATALOG_COMPILER_GENERATE_SWIFT_ASSET_SYMBOL_EXTENSIONS = YES;
+ CLANG_ANALYZER_NONNULL = YES;
+ CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;
+ CLANG_CXX_LANGUAGE_STANDARD = "gnu++20";
+ CLANG_ENABLE_MODULES = YES;
+ CLANG_ENABLE_OBJC_ARC = YES;
+ CLANG_ENABLE_OBJC_WEAK = YES;
+ CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
+ CLANG_WARN_BOOL_CONVERSION = YES;
+ CLANG_WARN_COMMA = YES;
+ CLANG_WARN_CONSTANT_CONVERSION = YES;
+ CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
+ CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
+ CLANG_WARN_DOCUMENTATION_COMMENTS = YES;
+ CLANG_WARN_EMPTY_BODY = YES;
+ CLANG_WARN_ENUM_CONVERSION = YES;
+ CLANG_WARN_INFINITE_RECURSION = YES;
+ CLANG_WARN_INT_CONVERSION = YES;
+ CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
+ CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
+ CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
+ CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
+ CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = YES;
+ CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
+ CLANG_WARN_STRICT_PROTOTYPES = YES;
+ CLANG_WARN_SUSPICIOUS_MOVE = YES;
+ CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;
+ CLANG_WARN_UNREACHABLE_CODE = YES;
+ CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
+ COPY_PHASE_STRIP = NO;
+ DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
+ ENABLE_NS_ASSERTIONS = NO;
+ ENABLE_STRICT_OBJC_MSGSEND = YES;
+ ENABLE_USER_SCRIPT_SANDBOXING = YES;
+ GCC_C_LANGUAGE_STANDARD = gnu17;
+ GCC_NO_COMMON_BLOCKS = YES;
+ GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
+ GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
+ GCC_WARN_UNDECLARED_SELECTOR = YES;
+ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
+ GCC_WARN_UNUSED_FUNCTION = YES;
+ GCC_WARN_UNUSED_VARIABLE = YES;
+ LOCALIZATION_PREFERS_STRING_CATALOGS = YES;
+ MTL_ENABLE_DEBUG_INFO = NO;
+ MTL_FAST_MATH = YES;
+ SWIFT_COMPILATION_MODE = wholemodule;
+ };
+ name = Release;
+ };
+ 8661387E2CC943DE00F4B78E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_ENTITLEMENTS = Resources/TestApp.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_ASSET_PATHS = "\"Resources/Preview Content\"";
+ ENABLE_PREVIEWS = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
+ "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 17.2;
+ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
+ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
+ MACOSX_DEPLOYMENT_TARGET = 14.2;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.VertexAITestApp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = auto;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Debug;
+ };
+ 8661387F2CC943DE00F4B78E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
+ ASSETCATALOG_COMPILER_GLOBAL_ACCENT_COLOR_NAME = AccentColor;
+ CODE_SIGN_ENTITLEMENTS = Resources/TestApp.entitlements;
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ DEVELOPMENT_ASSET_PATHS = "\"Resources/Preview Content\"";
+ ENABLE_PREVIEWS = YES;
+ GENERATE_INFOPLIST_FILE = YES;
+ "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSceneManifest_Generation[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UIApplicationSupportsIndirectInputEvents[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphoneos*]" = YES;
+ "INFOPLIST_KEY_UILaunchScreen_Generation[sdk=iphonesimulator*]" = YES;
+ "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphoneos*]" = UIStatusBarStyleDefault;
+ "INFOPLIST_KEY_UIStatusBarStyle[sdk=iphonesimulator*]" = UIStatusBarStyleDefault;
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPad = "UIInterfaceOrientationPortrait UIInterfaceOrientationPortraitUpsideDown UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ INFOPLIST_KEY_UISupportedInterfaceOrientations_iPhone = "UIInterfaceOrientationPortrait UIInterfaceOrientationLandscapeLeft UIInterfaceOrientationLandscapeRight";
+ IPHONEOS_DEPLOYMENT_TARGET = 17.2;
+ LD_RUNPATH_SEARCH_PATHS = "@executable_path/Frameworks";
+ "LD_RUNPATH_SEARCH_PATHS[sdk=macosx*]" = "@executable_path/../Frameworks";
+ MACOSX_DEPLOYMENT_TARGET = 14.2;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.VertexAITestApp;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = auto;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
+ SWIFT_EMIT_LOC_STRINGS = YES;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ };
+ name = Release;
+ };
+ 866138812CC943DE00F4B78E /* Debug */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.2;
+ MACOSX_DEPLOYMENT_TARGET = 14.2;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.VertexAITestAppTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = auto;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/VertexAITestApp-SPM.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/VertexAITestApp-SPM";
+ };
+ name = Debug;
+ };
+ 866138822CC943DE00F4B78E /* Release */ = {
+ isa = XCBuildConfiguration;
+ buildSettings = {
+ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
+ BUNDLE_LOADER = "$(TEST_HOST)";
+ CODE_SIGN_STYLE = Automatic;
+ CURRENT_PROJECT_VERSION = 1;
+ GENERATE_INFOPLIST_FILE = YES;
+ IPHONEOS_DEPLOYMENT_TARGET = 17.2;
+ MACOSX_DEPLOYMENT_TARGET = 14.2;
+ MARKETING_VERSION = 1.0;
+ PRODUCT_BUNDLE_IDENTIFIER = com.google.firebase.VertexAITestAppTests;
+ PRODUCT_NAME = "$(TARGET_NAME)";
+ SDKROOT = auto;
+ SUPPORTED_PLATFORMS = "iphoneos iphonesimulator macosx";
+ SWIFT_EMIT_LOC_STRINGS = NO;
+ SWIFT_VERSION = 5.0;
+ TARGETED_DEVICE_FAMILY = "1,2";
+ TEST_HOST = "$(BUILT_PRODUCTS_DIR)/VertexAITestApp-SPM.app/$(BUNDLE_EXECUTABLE_FOLDER_PATH)/VertexAITestApp-SPM";
+ };
+ name = Release;
+ };
+/* End XCBuildConfiguration section */
+
+/* Begin XCConfigurationList section */
+ 866138532CC943DD00F4B78E /* Build configuration list for PBXProject "VertexAITestApp" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 8661387B2CC943DE00F4B78E /* Debug */,
+ 8661387C2CC943DE00F4B78E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 8661387D2CC943DE00F4B78E /* Build configuration list for PBXNativeTarget "VertexAITestApp-SPM" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 8661387E2CC943DE00F4B78E /* Debug */,
+ 8661387F2CC943DE00F4B78E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+ 866138802CC943DE00F4B78E /* Build configuration list for PBXNativeTarget "IntegrationTests-SPM" */ = {
+ isa = XCConfigurationList;
+ buildConfigurations = (
+ 866138812CC943DE00F4B78E /* Debug */,
+ 866138822CC943DE00F4B78E /* Release */,
+ );
+ defaultConfigurationIsVisible = 0;
+ defaultConfigurationName = Release;
+ };
+/* End XCConfigurationList section */
+
+/* Begin XCLocalSwiftPackageReference section */
+ 8692F2962CC9477800539E8F /* XCLocalSwiftPackageReference "../../.." */ = {
+ isa = XCLocalSwiftPackageReference;
+ relativePath = ../../..;
+ };
+/* End XCLocalSwiftPackageReference section */
+
+/* Begin XCSwiftPackageProductDependency section */
+ 8692F2972CC9477800539E8F /* FirebaseAppCheck */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = FirebaseAppCheck;
+ };
+ 8692F2992CC9477800539E8F /* FirebaseAuth */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = FirebaseAuth;
+ };
+ 8692F29B2CC9477800539E8F /* FirebaseStorage */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = FirebaseStorage;
+ };
+ 8692F29D2CC9477800539E8F /* FirebaseVertexAI */ = {
+ isa = XCSwiftPackageProductDependency;
+ productName = FirebaseVertexAI;
+ };
+/* End XCSwiftPackageProductDependency section */
+ };
+ rootObject = 866138502CC943DD00F4B78E /* Project object */;
+}
diff --git a/scripts/build.sh b/scripts/build.sh
index f3f5525a29b..0a8cdc857a6 100755
--- a/scripts/build.sh
+++ b/scripts/build.sh
@@ -503,6 +503,15 @@ case "$product-$platform-$method" in
build
;;
+ VertexIntegration-*-*)
+ RunXcodebuild \
+ -project 'FirebaseVertexAI/Tests/TestApp/VertexAITestApp.xcodeproj' \
+ -scheme "VertexAITestApp-SPM" \
+ "${xcb_flags[@]}" \
+ build \
+ test
+ ;;
+
VertexSample-*-*)
RunXcodebuild \
-project 'FirebaseVertexAI/Sample/VertexAISample.xcodeproj' \
diff --git a/scripts/gha-encrypted/VertexAI/TestApp-Credentials.swift.gpg b/scripts/gha-encrypted/VertexAI/TestApp-Credentials.swift.gpg
new file mode 100644
index 00000000000..f7beaecccb0
Binary files /dev/null and b/scripts/gha-encrypted/VertexAI/TestApp-Credentials.swift.gpg differ
diff --git a/scripts/gha-encrypted/VertexAI/TestApp-GoogleService-Info.plist.gpg b/scripts/gha-encrypted/VertexAI/TestApp-GoogleService-Info.plist.gpg
new file mode 100644
index 00000000000..47f836feff3
Binary files /dev/null and b/scripts/gha-encrypted/VertexAI/TestApp-GoogleService-Info.plist.gpg differ