Skip to content
Draft
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 @@ -37,6 +37,7 @@ import com.google.firebase.app
import com.google.firebase.appcheck.interop.InteropAppCheckTokenProvider
import com.google.firebase.auth.internal.InternalAuthProvider
import com.google.firebase.inject.Provider
import com.google.firebase.platforminfo.UserAgentPublisher
import kotlin.coroutines.CoroutineContext

/** Entry point for all _Firebase AI_ functionality. */
Expand All @@ -48,6 +49,7 @@ internal constructor(
private val appCheckProvider: Provider<InteropAppCheckTokenProvider>,
private val internalAuthProvider: Provider<InternalAuthProvider>,
private val onDeviceFactoryProvider: Provider<FirebaseAIOnDeviceGenerativeModelFactory>,
private val userAgentPublisher: Provider<UserAgentPublisher>,
private val useLimitedUseAppCheckTokens: Boolean
) {

Expand Down Expand Up @@ -148,6 +150,12 @@ internal constructor(
this.onDeviceFactoryProvider = this@FirebaseAI.onDeviceFactoryProvider.get()
this.internalAuthProvider = this@FirebaseAI.internalAuthProvider.get()
this.appCheckTokenProvider = appCheckProvider.get()
val customUserAgents = userAgentPublisher.get()?.userAgent ?: ""
val adkUserAgent =
customUserAgents.split(' ').firstOrNull { it.startsWith("google-adk/") } ?: ""
if (adkUserAgent.isNotEmpty()) {
this.apiClient = "${this.apiClient} $adkUserAgent"
}
}
.build()
}
Expand All @@ -166,6 +174,12 @@ internal constructor(
toolConfig: TemplateToolConfig? = null,
): TemplateGenerativeModel {
val templateUri = getTemplateUri(backend)
val baseApiClient = "gl-kotlin/${KotlinVersion.CURRENT}-ai fire/${BuildConfig.VERSION_NAME}"
val customUserAgents = userAgentPublisher.get()?.userAgent ?: ""
val adkUserAgent =
customUserAgents.split(' ').firstOrNull { it.startsWith("google-adk/") } ?: ""
val apiClient = if (adkUserAgent.isNotEmpty()) "$baseApiClient $adkUserAgent" else baseApiClient

return TemplateGenerativeModel(
templateUri,
firebaseApp.options.apiKey,
Expand All @@ -176,6 +190,7 @@ internal constructor(
toolConfig,
appCheckProvider.get(),
internalAuthProvider.get(),
apiClient
)
}

Expand Down Expand Up @@ -210,6 +225,10 @@ internal constructor(
.trimIndent(),
)
}
val baseApiClient = "gl-kotlin/${KotlinVersion.CURRENT}-ai fire/${BuildConfig.VERSION_NAME}"
val userAgent = userAgentPublisher.get()?.userAgent ?: ""
val apiClient = if (userAgent.isNotEmpty()) "$baseApiClient $userAgent" else baseApiClient

return LiveGenerativeModel(
when (backend.backend) {
GenerativeBackendEnum.VERTEX_AI,
Expand All @@ -230,6 +249,7 @@ internal constructor(
internalAuthProvider.get(),
backend,
useLimitedUseAppCheckTokens,
apiClient
)
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@ import com.google.firebase.annotations.concurrent.Blocking
import com.google.firebase.appcheck.interop.InteropAppCheckTokenProvider
import com.google.firebase.auth.internal.InternalAuthProvider
import com.google.firebase.inject.Provider
import com.google.firebase.platforminfo.UserAgentPublisher
import kotlin.coroutines.CoroutineContext

/**
Expand All @@ -36,7 +37,8 @@ internal class FirebaseAIMultiResourceComponent(
@Blocking val blockingDispatcher: CoroutineContext,
private val appCheckProvider: Provider<InteropAppCheckTokenProvider>,
private val internalAuthProvider: Provider<InternalAuthProvider>,
private val onDeviceFactoryProvider: Provider<FirebaseAIOnDeviceGenerativeModelFactory>
private val onDeviceFactoryProvider: Provider<FirebaseAIOnDeviceGenerativeModelFactory>,
private val userAgentPublisher: Provider<UserAgentPublisher>
) {

@GuardedBy("this") private val instances: MutableMap<InstanceKey, FirebaseAI> = mutableMapOf()
Expand All @@ -51,6 +53,7 @@ internal class FirebaseAIMultiResourceComponent(
appCheckProvider,
internalAuthProvider,
onDeviceFactoryProvider,
userAgentPublisher,
key.useLimitedUseAppCheckTokens
)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ import com.google.firebase.components.Dependency
import com.google.firebase.components.Qualified
import com.google.firebase.components.Qualified.unqualified
import com.google.firebase.platforminfo.LibraryVersionComponent
import com.google.firebase.platforminfo.UserAgentPublisher
import kotlinx.coroutines.CoroutineDispatcher

/**
Expand All @@ -46,13 +47,15 @@ internal class FirebaseAIRegistrar : ComponentRegistrar {
.add(Dependency.optionalProvider(appCheckInterop))
.add(Dependency.optionalProvider(internalAuthProvider))
.add(Dependency.optionalProvider(ondeviceInterop))
.add(Dependency.optionalProvider(userAgentPublisher))
.factory { container ->
FirebaseAIMultiResourceComponent(
container[firebaseApp],
container.get(blockingDispatcher),
container.getProvider(appCheckInterop),
container.getProvider(internalAuthProvider),
container.getProvider(ondeviceInterop)
container.getProvider(ondeviceInterop),
container.getProvider(userAgentPublisher)
)
}
.build(),
Expand All @@ -66,6 +69,7 @@ internal class FirebaseAIRegistrar : ComponentRegistrar {
private val appCheckInterop = unqualified(InteropAppCheckTokenProvider::class.java)
private val internalAuthProvider = unqualified(InternalAuthProvider::class.java)
private val ondeviceInterop = unqualified(FirebaseAIOnDeviceGenerativeModelFactory::class.java)
private val userAgentPublisher = unqualified(UserAgentPublisher::class.java)
private val blockingDispatcher =
Qualified.qualified(Blocking::class.java, CoroutineDispatcher::class.java)
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -80,6 +80,7 @@ internal constructor(
internalAuthProvider: InternalAuthProvider? = null,
generativeBackend: GenerativeBackend,
useLimitedUseAppCheckTokens: Boolean,
apiClient: String = "gl-kotlin/${KotlinVersion.CURRENT}-ai fire/${BuildConfig.VERSION_NAME}",
) : this(
modelName,
blockingDispatcher,
Expand All @@ -92,7 +93,7 @@ internal constructor(
apiKey,
modelName,
requestOptions,
"gl-kotlin/${KotlinVersion.CURRENT}-ai fire/${BuildConfig.VERSION_NAME}",
apiClient,
firebaseApp,
AppCheckHeaderProvider(
TAG,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -71,14 +71,15 @@ internal constructor(
tools: List<TemplateTool>? = null,
toolConfig: TemplateToolConfig? = null,
appCheckTokenProvider: InteropAppCheckTokenProvider? = null,
internalAuthProvider: InternalAuthProvider? = null
internalAuthProvider: InternalAuthProvider? = null,
apiClient: String = "gl-kotlin/${KotlinVersion.CURRENT}-ai fire/${BuildConfig.VERSION_NAME}"
) : this(
templateUri,
APIController(
apiKey,
"",
requestOptions,
"gl-kotlin/${KotlinVersion.CURRENT}-ai fire/${BuildConfig.VERSION_NAME}",
apiClient,
firebaseApp,
AppCheckHeaderProvider(
TAG,
Expand Down
Loading