Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions FirebaseAI/Sources/FirebaseAI.swift
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ public final class FirebaseAI: Sendable {
)
// Verify that the `FirebaseAI` instance is always configured with the production endpoint since
// this is the public API surface for creating an instance.
assert(instance.apiConfig.service.endpoint == .firebaseVertexAIProd)
assert(instance.apiConfig.service.endpoint == .firebaseProxyProd)
assert(instance.apiConfig.version == .v1beta)
return instance
}
Expand Down Expand Up @@ -159,7 +159,7 @@ public final class FirebaseAI: Sendable {
let location: String?

static let defaultVertexAIAPIConfig = APIConfig(
service: .vertexAI(endpoint: .firebaseVertexAIProd),
service: .vertexAI(endpoint: .firebaseProxyProd),
version: .v1beta
)

Expand Down Expand Up @@ -218,7 +218,7 @@ public final class FirebaseAI: Sendable {
switch apiConfig.service {
case .vertexAI:
return vertexAIModelResourceName(modelName: modelName)
case .developer:
case .googleAI:
return developerModelResourceName(modelName: modelName)
}
}
Expand All @@ -242,10 +242,10 @@ public final class FirebaseAI: Sendable {

private func developerModelResourceName(modelName: String) -> String {
switch apiConfig.service.endpoint {
case .firebaseVertexAIStaging, .firebaseVertexAIProd:
case .firebaseProxyStaging, .firebaseProxyProd:
let projectID = firebaseInfo.projectID
return "projects/\(projectID)/models/\(modelName)"
case .generativeLanguage:
case .geminiDeveloperDirect:
return "models/\(modelName)"
}
}
Expand Down
8 changes: 4 additions & 4 deletions FirebaseAI/Sources/GenerativeModel.swift
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ public final class GenerativeModel: Sendable {
let requestContent = switch apiConfig.service {
case .vertexAI:
content
case .developer:
case .googleAI:
// The `role` defaults to "user" but is ignored in `countTokens`. However, it is erroneously
// erroneously counted towards the prompt and total token count when using the Developer API
// backend; set to `nil` to avoid token count discrepancies between `countTokens` and
Expand All @@ -290,10 +290,10 @@ public final class GenerativeModel: Sendable {
// "models/model-name". This field is unaltered by the Firebase backend before forwarding the
// request to the Generative Language backend, which expects the form "models/model-name".
let generateContentRequestModelResourceName = switch apiConfig.service {
case .vertexAI, .developer(endpoint: .generativeLanguage):
case .vertexAI, .googleAI(endpoint: .geminiDeveloperDirect):
modelResourceName
case .developer(endpoint: .firebaseVertexAIProd),
.developer(endpoint: .firebaseVertexAIStaging):
case .googleAI(endpoint: .firebaseProxyProd),
.googleAI(endpoint: .firebaseProxyStaging):
"models/\(modelName)"
}

Expand Down
25 changes: 17 additions & 8 deletions FirebaseAI/Sources/Types/Internal/APIConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -50,7 +50,7 @@ extension APIConfig {
/// The Gemini Developer API provided by Google AI.
///
/// See the [Google AI docs](https://ai.google.dev/gemini-api/docs) for more details.
case developer(endpoint: Endpoint)
case googleAI(endpoint: Endpoint)

/// The specific network address to use for API requests.
///
Expand All @@ -59,7 +59,7 @@ extension APIConfig {
switch self {
case let .vertexAI(endpoint: endpoint):
return endpoint
case let .developer(endpoint: endpoint):
case let .googleAI(endpoint: endpoint):
return endpoint
}
}
Expand All @@ -69,14 +69,23 @@ extension APIConfig {
extension APIConfig.Service {
/// Network addresses for generative AI API services.
enum Endpoint: String {
/// The Vertex AI in Firebase production endpoint.
case firebaseVertexAIProd = "https://firebasevertexai.googleapis.com"
/// The Firebase proxy production endpoint.
///
/// This endpoint supports both Google AI and Vertex AI.
case firebaseProxyProd = "https://firebasevertexai.googleapis.com"

/// The Vertex AI in Firebase staging endpoint; for SDK development and testing only.
case firebaseVertexAIStaging = "https://staging-firebasevertexai.sandbox.googleapis.com"
/// The Firebase proxy staging endpoint; for SDK development and testing only.
///
/// This endpoint supports both the Gemini Developer API (commonly referred to as Google AI)
/// and the Gemini API in Vertex AI (commonly referred to simply as Vertex AI).
case firebaseProxyStaging = "https://staging-firebasevertexai.sandbox.googleapis.com"

/// The Gemini Developer API production endpoint; for SDK development and testing only.
case generativeLanguage = "https://generativelanguage.googleapis.com"
/// The Gemini Developer API (Google AI) direct production endpoint; for SDK development and
/// testing only.
///
/// This bypasses the Firebase proxy and directly connects to the Gemini Developer API
/// (Google AI) backend. This endpoint only supports the Gemini Developer API, not Vertex AI.
case geminiDeveloperDirect = "https://generativelanguage.googleapis.com"
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ extension CountTokensRequest: Encodable {
switch apiConfig.service {
case .vertexAI:
try encodeForVertexAI(to: encoder)
case .developer:
case .googleAI:
try encodeForDeveloper(to: encoder)
}
}
Expand Down
4 changes: 2 additions & 2 deletions FirebaseAI/Sources/Types/Public/Backend.swift
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ public struct Backend {
/// for a list of supported locations.
public static func vertexAI(location: String = "us-central1") -> Backend {
return Backend(
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1beta),
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta),
location: location
)
}

/// Initializes a `Backend` configured for the Google Developer API.
public static func googleAI() -> Backend {
return Backend(
apiConfig: APIConfig(service: .developer(endpoint: .firebaseVertexAIProd), version: .v1beta),
apiConfig: APIConfig(service: .googleAI(endpoint: .firebaseProxyProd), version: .v1beta),
location: nil
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ struct CountTokensIntegrationTests {
switch config.apiConfig.service {
case .vertexAI:
#expect(response.totalBillableCharacters == 16)
case .developer:
case .googleAI:
#expect(response.totalBillableCharacters == nil)
}
#expect(response.promptTokensDetails.count == 1)
Expand All @@ -87,7 +87,7 @@ struct CountTokensIntegrationTests {
switch config.apiConfig.service {
case .vertexAI:
#expect(response.totalBillableCharacters == 61)
case .developer:
case .googleAI:
#expect(response.totalBillableCharacters == nil)
}
#expect(response.promptTokensDetails.count == 1)
Expand Down Expand Up @@ -144,7 +144,7 @@ struct CountTokensIntegrationTests {
case .vertexAI:
#expect(response.totalTokens == 65)
#expect(response.totalBillableCharacters == 170)
case .developer:
case .googleAI:
// The Developer API erroneously ignores the `responseSchema` when counting tokens, resulting
// in a lower total count than Vertex AI.
#expect(response.totalTokens == 34)
Expand Down
32 changes: 16 additions & 16 deletions FirebaseAI/Tests/TestApp/Tests/Utilities/InstanceConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -21,30 +21,30 @@ import VertexAITestApp

struct InstanceConfig {
static let vertexV1 = InstanceConfig(
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1)
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1)
)
static let vertexV1Staging = InstanceConfig(
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIStaging), version: .v1)
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyStaging), version: .v1)
)
static let vertexV1Beta = InstanceConfig(
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1beta)
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let vertexV1BetaStaging = InstanceConfig(
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIStaging), version: .v1beta)
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyStaging), version: .v1beta)
)
static let developerV1Beta = InstanceConfig(
apiConfig: APIConfig(service: .developer(endpoint: .firebaseVertexAIProd), version: .v1beta)
apiConfig: APIConfig(service: .googleAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let developerV1BetaStaging = InstanceConfig(
apiConfig: APIConfig(service: .developer(endpoint: .firebaseVertexAIStaging), version: .v1beta)
apiConfig: APIConfig(service: .googleAI(endpoint: .firebaseProxyStaging), version: .v1beta)
)
static let developerV1Spark = InstanceConfig(
appName: FirebaseAppNames.spark,
apiConfig: APIConfig(service: .developer(endpoint: .generativeLanguage), version: .v1)
apiConfig: APIConfig(service: .googleAI(endpoint: .geminiDeveloperDirect), version: .v1)
)
static let developerV1BetaSpark = InstanceConfig(
appName: FirebaseAppNames.spark,
apiConfig: APIConfig(service: .developer(endpoint: .generativeLanguage), version: .v1beta)
apiConfig: APIConfig(service: .googleAI(endpoint: .geminiDeveloperDirect), version: .v1beta)
)
static let allConfigs = [
vertexV1,
Expand All @@ -71,11 +71,11 @@ struct InstanceConfig {

static let vertexV1AppCheckNotConfigured = InstanceConfig(
appName: FirebaseAppNames.appCheckNotConfigured,
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1)
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1)
)
static let vertexV1BetaAppCheckNotConfigured = InstanceConfig(
appName: FirebaseAppNames.appCheckNotConfigured,
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1beta)
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta)
)

let appName: String?
Expand All @@ -96,8 +96,8 @@ struct InstanceConfig {
switch apiConfig.service {
case .vertexAI:
return "Vertex AI"
case .developer:
return "Developer"
case .googleAI:
return "Google AI"
}
}

Expand All @@ -109,11 +109,11 @@ struct InstanceConfig {
extension InstanceConfig: CustomTestStringConvertible {
var testDescription: String {
let endpointSuffix = switch apiConfig.service.endpoint {
case .firebaseVertexAIProd:
case .firebaseProxyProd:
""
case .firebaseVertexAIStaging:
case .firebaseProxyStaging:
" - Staging"
case .generativeLanguage:
case .geminiDeveloperDirect:
" - Generative Language"
}
let locationSuffix = location.map { " - \($0)" } ?? ""
Expand All @@ -132,7 +132,7 @@ extension FirebaseAI {
location: location,
apiConfig: instanceConfig.apiConfig
)
case .developer:
case .googleAI:
assert(
instanceConfig.location == nil,
"The Developer API is global and does not support `location`."
Expand Down
6 changes: 3 additions & 3 deletions FirebaseAI/Tests/Unit/Types/BackendTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ import XCTest
final class BackendTests: XCTestCase {
func testVertexAI_defaultLocation() {
let expectedAPIConfig = APIConfig(
service: .vertexAI(endpoint: .firebaseVertexAIProd),
service: .vertexAI(endpoint: .firebaseProxyProd),
version: .v1beta
)

Expand All @@ -31,7 +31,7 @@ final class BackendTests: XCTestCase {

func testVertexAI_customLocation() {
let expectedAPIConfig = APIConfig(
service: .vertexAI(endpoint: .firebaseVertexAIProd),
service: .vertexAI(endpoint: .firebaseProxyProd),
version: .v1beta
)
let customLocation = "europe-west1"
Expand All @@ -44,7 +44,7 @@ final class BackendTests: XCTestCase {

func testGoogleAI() {
let expectedAPIConfig = APIConfig(
service: .developer(endpoint: .firebaseVertexAIProd),
service: .googleAI(endpoint: .firebaseProxyProd),
version: .v1beta
)

Expand Down
12 changes: 6 additions & 6 deletions FirebaseAI/Tests/Unit/Types/Internal/APIConfigTests.swift
Original file line number Diff line number Diff line change
Expand Up @@ -19,21 +19,21 @@ import XCTest
@available(iOS 15.0, macOS 12.0, macCatalyst 15.0, tvOS 15.0, watchOS 8.0, *)
final class APIConfigTests: XCTestCase {
func testInitialize_vertexAI_prod_v1() {
let apiConfig = APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1)
let apiConfig = APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1)

XCTAssertEqual(apiConfig.service.endpoint.rawValue, "https://firebasevertexai.googleapis.com")
XCTAssertEqual(apiConfig.version.rawValue, "v1")
}

func testInitialize_vertexAI_prod_v1beta() {
let apiConfig = APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIProd), version: .v1beta)
let apiConfig = APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta)

XCTAssertEqual(apiConfig.service.endpoint.rawValue, "https://firebasevertexai.googleapis.com")
XCTAssertEqual(apiConfig.version.rawValue, "v1beta")
}

func testInitialize_vertexAI_staging_v1() {
let apiConfig = APIConfig(service: .vertexAI(endpoint: .firebaseVertexAIStaging), version: .v1)
let apiConfig = APIConfig(service: .vertexAI(endpoint: .firebaseProxyStaging), version: .v1)

XCTAssertEqual(
apiConfig.service.endpoint.rawValue, "https://staging-firebasevertexai.sandbox.googleapis.com"
Expand All @@ -43,7 +43,7 @@ final class APIConfigTests: XCTestCase {

func testInitialize_vertexAI_staging_v1beta() {
let apiConfig = APIConfig(
service: .vertexAI(endpoint: .firebaseVertexAIStaging),
service: .vertexAI(endpoint: .firebaseProxyStaging),
version: .v1beta
)

Expand All @@ -55,7 +55,7 @@ final class APIConfigTests: XCTestCase {

func testInitialize_developer_staging_v1beta() {
let apiConfig = APIConfig(
service: .developer(endpoint: .firebaseVertexAIStaging), version: .v1beta
service: .googleAI(endpoint: .firebaseProxyStaging), version: .v1beta
)

XCTAssertEqual(
Expand All @@ -65,7 +65,7 @@ final class APIConfigTests: XCTestCase {
}

func testInitialize_developer_generativeLanguage_v1beta() {
let apiConfig = APIConfig(service: .developer(endpoint: .generativeLanguage), version: .v1beta)
let apiConfig = APIConfig(service: .googleAI(endpoint: .geminiDeveloperDirect), version: .v1beta)

XCTAssertEqual(apiConfig.service.endpoint.rawValue, "https://generativelanguage.googleapis.com")
XCTAssertEqual(apiConfig.version.rawValue, "v1beta")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ final class CountTokensRequestTests: XCTestCase {
let textPart = TextPart("test-prompt")
let vertexAPIConfig = FirebaseAI.defaultVertexAIAPIConfig
let developerAPIConfig = APIConfig(
service: .developer(endpoint: .firebaseVertexAIProd),
service: .googleAI(endpoint: .firebaseProxyProd),
version: .v1beta
)
let requestOptions = RequestOptions()
Expand Down
Loading
Loading