Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,18 @@ struct GenerateContentIntegrationTests {
@Test(arguments: [
(InstanceConfig.vertexAI_v1beta, ModelNames.gemini2FlashLite),
(InstanceConfig.vertexAI_v1beta_global, ModelNames.gemini2FlashLite),
(InstanceConfig.vertexAI_v1beta_staging, ModelNames.gemini2FlashLite),
(InstanceConfig.vertexAI_v1beta_global_appCheckLimitedUse, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta_appCheckLimitedUse, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta, ModelNames.gemma3_4B),
(InstanceConfig.googleAI_v1beta_staging, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta_staging, ModelNames.gemma3_4B),
(InstanceConfig.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemma3_4B),
(InstanceConfig.googleAI_v1beta_freeTier, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta_freeTier, ModelNames.gemma3_4B),
// Note: The following configs are commented out for easy one-off manual testing.
// (InstanceConfig.googleAI_v1beta_staging, ModelNames.gemini2FlashLite),
// (InstanceConfig.googleAI_v1beta_staging, ModelNames.gemma3_4B),
// (InstanceConfig.vertexAI_v1beta_staging, ModelNames.gemini2FlashLite),
// (InstanceConfig.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2FlashLite),
// (InstanceConfig.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemma3_4B),
])
func generateContent(_ config: InstanceConfig, modelName: String) async throws {
let model = FirebaseAI.componentInstance(config).generativeModel(
Expand Down Expand Up @@ -165,15 +170,16 @@ struct GenerateContentIntegrationTests {
(.googleAI_v1beta_freeTier, ModelNames.gemini2_5_Flash, ThinkingConfig(
thinkingBudget: 24576, includeThoughts: true
)),
(.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2_5_Flash, ThinkingConfig(
thinkingBudget: 0
)),
(.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2_5_Flash, ThinkingConfig(
thinkingBudget: 24576
)),
(.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2_5_Flash, ThinkingConfig(
thinkingBudget: 24576, includeThoughts: true
)),
// Note: The following configs are commented out for easy one-off manual testing.
// (.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2_5_Flash, ThinkingConfig(
// thinkingBudget: 0
// )),
// (.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2_5_Flash, ThinkingConfig(
// thinkingBudget: 24576
// )),
// (.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2_5_Flash, ThinkingConfig(
// thinkingBudget: 24576, includeThoughts: true
// )),
] as [(InstanceConfig, String, ThinkingConfig)]
)
func generateContentThinking(_ config: InstanceConfig, modelName: String,
Expand Down Expand Up @@ -319,8 +325,9 @@ struct GenerateContentIntegrationTests {
InstanceConfig.vertexAI_v1beta,
InstanceConfig.vertexAI_v1beta_global,
InstanceConfig.googleAI_v1beta,
InstanceConfig.googleAI_v1beta_staging,
InstanceConfig.googleAI_v1beta_freeTier_bypassProxy,
// Note: The following configs are commented out for easy one-off manual testing.
// InstanceConfig.googleAI_v1beta_staging,
// InstanceConfig.googleAI_v1beta_freeTier_bypassProxy,
])
func generateImage(_ config: InstanceConfig) async throws {
let generationConfig = GenerationConfig(
Expand Down Expand Up @@ -416,13 +423,18 @@ struct GenerateContentIntegrationTests {
@Test(arguments: [
(InstanceConfig.vertexAI_v1beta, ModelNames.gemini2FlashLite),
(InstanceConfig.vertexAI_v1beta_global, ModelNames.gemini2FlashLite),
(InstanceConfig.vertexAI_v1beta_staging, ModelNames.gemini2FlashLite),
(InstanceConfig.vertexAI_v1beta_global_appCheckLimitedUse, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta_appCheckLimitedUse, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta, ModelNames.gemma3_4B),
(InstanceConfig.googleAI_v1beta_staging, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta_staging, ModelNames.gemma3_4B),
(InstanceConfig.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemma3_4B),
(InstanceConfig.googleAI_v1beta_freeTier, ModelNames.gemini2FlashLite),
(InstanceConfig.googleAI_v1beta_freeTier, ModelNames.gemma3_4B),
// Note: The following configs are commented out for easy one-off manual testing.
// (InstanceConfig.vertexAI_v1beta_staging, ModelNames.gemini2FlashLite),
// (InstanceConfig.googleAI_v1beta_staging, ModelNames.gemini2FlashLite),
// (InstanceConfig.googleAI_v1beta_staging, ModelNames.gemma3_4B),
// (InstanceConfig.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemini2FlashLite),
// (InstanceConfig.googleAI_v1beta_freeTier_bypassProxy, ModelNames.gemma3_4B),
])
func generateContentStream(_ config: InstanceConfig, modelName: String) async throws {
let expectedResponse = [
Expand Down
47 changes: 40 additions & 7 deletions FirebaseAI/Tests/TestApp/Tests/Utilities/InstanceConfig.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,20 @@ struct InstanceConfig: Equatable, Encodable {
location: "global",
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let vertexAI_v1beta_global_appCheckLimitedUse = InstanceConfig(
location: "global",
useLimitedUseAppCheckTokens: true,
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let vertexAI_v1beta_staging = InstanceConfig(
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyStaging), version: .v1beta)
)
static let googleAI_v1beta = InstanceConfig(
apiConfig: APIConfig(service: .googleAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let googleAI_v1beta_appCheckLimitedUse = InstanceConfig(
apiConfig: APIConfig(service: .googleAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let googleAI_v1beta_staging = InstanceConfig(
apiConfig: APIConfig(service: .googleAI(endpoint: .firebaseProxyStaging), version: .v1beta)
)
Expand All @@ -48,33 +56,54 @@ struct InstanceConfig: Equatable, Encodable {
static let allConfigs = [
vertexAI_v1beta,
vertexAI_v1beta_global,
vertexAI_v1beta_staging,
vertexAI_v1beta_global_appCheckLimitedUse,
googleAI_v1beta,
googleAI_v1beta_staging,
googleAI_v1beta_freeTier_bypassProxy,
googleAI_v1beta_appCheckLimitedUse,
googleAI_v1beta_freeTier,
// Note: The following configs are commented out for easy one-off manual testing.
// vertexAI_v1beta_staging,
// googleAI_v1beta_staging,
// googleAI_v1beta_freeTier_bypassProxy,
]

static let vertexAI_v1beta_appCheckNotConfigured = InstanceConfig(
appName: FirebaseAppNames.appCheckNotConfigured,
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let vertexAI_v1beta_appCheckNotConfigured_limitedUseTokens = InstanceConfig(
appName: FirebaseAppNames.appCheckNotConfigured,
useLimitedUseAppCheckTokens: true,
apiConfig: APIConfig(service: .vertexAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let googleAI_v1beta_appCheckNotConfigured = InstanceConfig(
appName: FirebaseAppNames.appCheckNotConfigured,
apiConfig: APIConfig(service: .googleAI(endpoint: .firebaseProxyProd), version: .v1beta)
)
static let googleAI_v1beta_appCheckNotConfigured_limitedUseTokens = InstanceConfig(
appName: FirebaseAppNames.appCheckNotConfigured,
useLimitedUseAppCheckTokens: true,
apiConfig: APIConfig(service: .googleAI(endpoint: .firebaseProxyProd), version: .v1beta)
)

static let appCheckNotConfiguredConfigs = [
vertexAI_v1beta_appCheckNotConfigured,
vertexAI_v1beta_appCheckNotConfigured_limitedUseTokens,
googleAI_v1beta_appCheckNotConfigured,
googleAI_v1beta_appCheckNotConfigured_limitedUseTokens,
]

let appName: String?
let location: String?
let useLimitedUseAppCheckTokens: Bool
let apiConfig: APIConfig

init(appName: String? = nil, location: String? = nil, apiConfig: APIConfig) {
init(appName: String? = nil,
location: String? = nil,
useLimitedUseAppCheckTokens: Bool = false,
apiConfig: APIConfig) {
self.appName = appName
self.location = location
self.useLimitedUseAppCheckTokens = useLimitedUseAppCheckTokens
self.apiConfig = apiConfig
}

Expand Down Expand Up @@ -108,8 +137,12 @@ extension InstanceConfig: CustomTestStringConvertible {
" - Bypass Proxy"
}
let locationSuffix = location.map { " - \($0)" } ?? ""
let appCheckLimitedUseDesignator = useLimitedUseAppCheckTokens ? " - FAC Limited-Use" : ""

return "\(serviceName) (\(versionName))\(freeTierDesignator)\(endpointSuffix)\(locationSuffix)"
return """
\(serviceName) (\(versionName))\(freeTierDesignator)\(endpointSuffix)\(locationSuffix)\
\(appCheckLimitedUseDesignator)
"""
}
}

Expand All @@ -122,7 +155,7 @@ extension FirebaseAI {
app: instanceConfig.app,
location: location,
apiConfig: instanceConfig.apiConfig,
useLimitedUseAppCheckTokens: false
useLimitedUseAppCheckTokens: instanceConfig.useLimitedUseAppCheckTokens
)
case .googleAI:
assert(
Expand All @@ -133,7 +166,7 @@ extension FirebaseAI {
app: instanceConfig.app,
location: nil,
apiConfig: instanceConfig.apiConfig,
useLimitedUseAppCheckTokens: false
useLimitedUseAppCheckTokens: instanceConfig.useLimitedUseAppCheckTokens
)
}
}
Expand Down
Loading