Skip to content

Commit 09dc310

Browse files
authored
Add developer api to bidi. (#7196)
This PR adds bidi support for developer api
1 parent 4c67185 commit 09dc310

File tree

4 files changed

+21
-5
lines changed

4 files changed

+21
-5
lines changed

firebase-ai/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
# Unreleased
22
* [feature] added support for Imagen Editing, including inpainting, outpainting, control, style
33
transfer, and subject references (#7075)
4+
* [feature] **Preview:** Added support for bidirectional streaming in Gemini Developer Api
45

56
# 17.0.0
67
* [feature] Added support for configuring the "thinking" budget when using Gemini

firebase-ai/src/main/kotlin/com/google/firebase/ai/FirebaseAI.kt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import com.google.firebase.ai.type.GenerativeBackend
2525
import com.google.firebase.ai.type.GenerativeBackendEnum
2626
import com.google.firebase.ai.type.ImagenGenerationConfig
2727
import com.google.firebase.ai.type.ImagenSafetySettings
28-
import com.google.firebase.ai.type.InvalidStateException
2928
import com.google.firebase.ai.type.LiveGenerationConfig
3029
import com.google.firebase.ai.type.PublicPreviewAPI
3130
import com.google.firebase.ai.type.RequestOptions
@@ -124,6 +123,7 @@ internal constructor(
124123
systemInstruction: Content? = null,
125124
requestOptions: RequestOptions = RequestOptions(),
126125
): LiveGenerativeModel {
126+
127127
if (!modelName.startsWith(GEMINI_MODEL_NAME_PREFIX)) {
128128
Log.w(
129129
TAG,
@@ -138,7 +138,7 @@ internal constructor(
138138
GenerativeBackendEnum.VERTEX_AI ->
139139
"projects/${firebaseApp.options.projectId}/locations/${backend.location}/publishers/google/models/${modelName}"
140140
GenerativeBackendEnum.GOOGLE_AI ->
141-
throw InvalidStateException("Live Model is not yet available on the Google AI backend")
141+
"projects/${firebaseApp.options.projectId}/models/${modelName}"
142142
},
143143
firebaseApp.options.apiKey,
144144
firebaseApp,
@@ -150,6 +150,7 @@ internal constructor(
150150
requestOptions,
151151
appCheckProvider.get(),
152152
internalAuthProvider.get(),
153+
backend
153154
)
154155
}
155156

firebase-ai/src/main/kotlin/com/google/firebase/ai/LiveGenerativeModel.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ import com.google.firebase.ai.common.APIController
2121
import com.google.firebase.ai.common.AppCheckHeaderProvider
2222
import com.google.firebase.ai.common.JSON
2323
import com.google.firebase.ai.type.Content
24+
import com.google.firebase.ai.type.GenerativeBackend
2425
import com.google.firebase.ai.type.LiveClientSetupMessage
2526
import com.google.firebase.ai.type.LiveGenerationConfig
2627
import com.google.firebase.ai.type.LiveSession
@@ -54,7 +55,7 @@ internal constructor(
5455
private val tools: List<Tool>? = null,
5556
private val systemInstruction: Content? = null,
5657
private val location: String,
57-
private val controller: APIController
58+
private val controller: APIController,
5859
) {
5960
internal constructor(
6061
modelName: String,
@@ -68,6 +69,7 @@ internal constructor(
6869
requestOptions: RequestOptions = RequestOptions(),
6970
appCheckTokenProvider: InteropAppCheckTokenProvider? = null,
7071
internalAuthProvider: InternalAuthProvider? = null,
72+
generativeBackend: GenerativeBackend,
7173
) : this(
7274
modelName,
7375
blockingDispatcher,
@@ -82,6 +84,7 @@ internal constructor(
8284
"gl-kotlin/${KotlinVersion.CURRENT}-ai fire/${BuildConfig.VERSION_NAME}",
8385
firebaseApp,
8486
AppCheckHeaderProvider(TAG, appCheckTokenProvider, internalAuthProvider),
87+
generativeBackend
8588
),
8689
)
8790

firebase-ai/src/main/kotlin/com/google/firebase/ai/common/APIController.kt

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ import com.google.firebase.ai.type.CountTokensResponse
2525
import com.google.firebase.ai.type.FinishReason
2626
import com.google.firebase.ai.type.GRpcErrorResponse
2727
import com.google.firebase.ai.type.GenerateContentResponse
28+
import com.google.firebase.ai.type.GenerativeBackend
29+
import com.google.firebase.ai.type.GenerativeBackendEnum
2830
import com.google.firebase.ai.type.ImagenGenerationResponse
2931
import com.google.firebase.ai.type.PublicPreviewAPI
3032
import com.google.firebase.ai.type.RequestOptions
@@ -99,6 +101,7 @@ internal constructor(
99101
private val appVersion: Int = 0,
100102
private val googleAppId: String,
101103
private val headerProvider: HeaderProvider?,
104+
private val backend: GenerativeBackend? = null
102105
) {
103106

104107
constructor(
@@ -108,6 +111,7 @@ internal constructor(
108111
apiClient: String,
109112
firebaseApp: FirebaseApp,
110113
headerProvider: HeaderProvider? = null,
114+
backend: GenerativeBackend? = null,
111115
) : this(
112116
key,
113117
model,
@@ -117,7 +121,8 @@ internal constructor(
117121
firebaseApp,
118122
getVersionNumber(firebaseApp),
119123
firebaseApp.options.applicationId,
120-
headerProvider
124+
headerProvider,
125+
backend
121126
)
122127

123128
private val model = fullModelName(model)
@@ -161,7 +166,13 @@ internal constructor(
161166
}
162167

163168
private fun getBidiEndpoint(location: String): String =
164-
"wss://firebasevertexai.googleapis.com/ws/google.firebase.vertexai.v1beta.LlmBidiService/BidiGenerateContent/locations/$location?key=$key"
169+
when (backend?.backend) {
170+
GenerativeBackendEnum.VERTEX_AI,
171+
null ->
172+
"wss://firebasevertexai.googleapis.com/ws/google.firebase.vertexai.v1beta.LlmBidiService/BidiGenerateContent/locations/$location?key=$key"
173+
GenerativeBackendEnum.GOOGLE_AI ->
174+
"wss://firebasevertexai.googleapis.com/ws/google.firebase.vertexai.v1beta.GenerativeService/BidiGenerateContent?key=$key"
175+
}
165176

166177
suspend fun getWebSocketSession(location: String): ClientWebSocketSession =
167178
client.webSocketSession(getBidiEndpoint(location)) { applyCommonHeaders() }

0 commit comments

Comments
 (0)