Skip to content

Commit 723077a

Browse files
committed
update
1 parent f2afcfd commit 723077a

File tree

4 files changed

+78
-70
lines changed

4 files changed

+78
-70
lines changed

firebase-ai/api.txt

Lines changed: 27 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -152,7 +152,7 @@ package com.google.firebase.ai.java {
152152
method public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> sendVideoRealtime(com.google.firebase.ai.type.InlineData video);
153153
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> startAudioConversation();
154154
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> startAudioConversation(boolean enableInterruptions);
155-
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> startAudioConversation(com.google.firebase.ai.type.ConversationConfig conversationConfig);
155+
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> startAudioConversation(com.google.firebase.ai.type.LiveAudioConversationConfig liveAudioConversationConfig);
156156
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> startAudioConversation(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler);
157157
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> startAudioConversation(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler, boolean enableInterruptions);
158158
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public abstract com.google.common.util.concurrent.ListenableFuture<kotlin.Unit> startAudioConversation(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler, kotlin.jvm.functions.Function2<? super com.google.firebase.ai.type.Transcription?,? super com.google.firebase.ai.type.Transcription?,kotlin.Unit>? transcriptHandler, boolean enableInterruptions);
@@ -290,31 +290,6 @@ package com.google.firebase.ai.type {
290290
public static final class ContentModality.Companion {
291291
}
292292

293-
@com.google.firebase.ai.type.PublicPreviewAPI public final class ConversationConfig {
294-
field public static final com.google.firebase.ai.type.ConversationConfig.Companion Companion;
295-
}
296-
297-
public static final class ConversationConfig.Builder {
298-
ctor public ConversationConfig.Builder();
299-
method public com.google.firebase.ai.type.ConversationConfig build();
300-
method public com.google.firebase.ai.type.ConversationConfig.Builder setAudioHandler(kotlin.jvm.functions.Function2<? super android.media.AudioRecord,? super android.media.AudioTrack,kotlin.Unit>? audioHandler);
301-
method public com.google.firebase.ai.type.ConversationConfig.Builder setEnableInterruptions(boolean enableInterruptions);
302-
method public com.google.firebase.ai.type.ConversationConfig.Builder setFunctionCallHandler(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler);
303-
method public com.google.firebase.ai.type.ConversationConfig.Builder setTranscriptHandler(kotlin.jvm.functions.Function2<? super com.google.firebase.ai.type.Transcription?,? super com.google.firebase.ai.type.Transcription?,kotlin.Unit>? transcriptHandler);
304-
field public kotlin.jvm.functions.Function2<? super android.media.AudioRecord,? super android.media.AudioTrack,kotlin.Unit>? audioHandler;
305-
field public boolean enableInterruptions;
306-
field public kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler;
307-
field public kotlin.jvm.functions.Function2<? super com.google.firebase.ai.type.Transcription?,? super com.google.firebase.ai.type.Transcription?,kotlin.Unit>? transcriptHandler;
308-
}
309-
310-
public static final class ConversationConfig.Companion {
311-
method public com.google.firebase.ai.type.ConversationConfig.Builder builder();
312-
}
313-
314-
public final class ConversationConfigKt {
315-
method public static com.google.firebase.ai.type.ConversationConfig conversationConfig(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.ConversationConfig.Builder,kotlin.Unit> init);
316-
}
317-
318293
public final class CountTokensResponse {
319294
ctor public CountTokensResponse(int totalTokens, @Deprecated Integer? totalBillableCharacters = null, java.util.List<com.google.firebase.ai.type.ModalityTokenCount> promptTokensDetails = emptyList());
320295
method public operator int component1();
@@ -864,6 +839,31 @@ package com.google.firebase.ai.type {
864839
public final class InvalidStateException extends com.google.firebase.ai.type.FirebaseAIException {
865840
}
866841

842+
@com.google.firebase.ai.type.PublicPreviewAPI public final class LiveAudioConversationConfig {
843+
field public static final com.google.firebase.ai.type.LiveAudioConversationConfig.Companion Companion;
844+
}
845+
846+
public static final class LiveAudioConversationConfig.Builder {
847+
ctor public LiveAudioConversationConfig.Builder();
848+
method public com.google.firebase.ai.type.LiveAudioConversationConfig build();
849+
method public com.google.firebase.ai.type.LiveAudioConversationConfig.Builder setAudioHandler(kotlin.jvm.functions.Function2<? super android.media.AudioRecord,? super android.media.AudioTrack,kotlin.Unit>? audioHandler);
850+
method public com.google.firebase.ai.type.LiveAudioConversationConfig.Builder setEnableInterruptions(boolean enableInterruptions);
851+
method public com.google.firebase.ai.type.LiveAudioConversationConfig.Builder setFunctionCallHandler(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler);
852+
method public com.google.firebase.ai.type.LiveAudioConversationConfig.Builder setTranscriptHandler(kotlin.jvm.functions.Function2<? super com.google.firebase.ai.type.Transcription?,? super com.google.firebase.ai.type.Transcription?,kotlin.Unit>? transcriptHandler);
853+
field public kotlin.jvm.functions.Function2<? super android.media.AudioRecord,? super android.media.AudioTrack,kotlin.Unit>? audioHandler;
854+
field public boolean enableInterruptions;
855+
field public kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler;
856+
field public kotlin.jvm.functions.Function2<? super com.google.firebase.ai.type.Transcription?,? super com.google.firebase.ai.type.Transcription?,kotlin.Unit>? transcriptHandler;
857+
}
858+
859+
public static final class LiveAudioConversationConfig.Companion {
860+
method public com.google.firebase.ai.type.LiveAudioConversationConfig.Builder builder();
861+
}
862+
863+
public final class LiveAudioConversationConfigKt {
864+
method public static com.google.firebase.ai.type.LiveAudioConversationConfig liveAudioConversationConfig(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.LiveAudioConversationConfig.Builder,kotlin.Unit> init);
865+
}
866+
867867
@com.google.firebase.ai.type.PublicPreviewAPI public final class LiveGenerationConfig {
868868
field public static final com.google.firebase.ai.type.LiveGenerationConfig.Companion Companion;
869869
}
@@ -948,7 +948,7 @@ package com.google.firebase.ai.type {
948948
method @Deprecated public suspend Object? sendMediaStream(java.util.List<com.google.firebase.ai.type.MediaData> mediaChunks, kotlin.coroutines.Continuation<? super kotlin.Unit>);
949949
method public suspend Object? sendTextRealtime(String text, kotlin.coroutines.Continuation<? super kotlin.Unit>);
950950
method public suspend Object? sendVideoRealtime(com.google.firebase.ai.type.InlineData video, kotlin.coroutines.Continuation<? super kotlin.Unit>);
951-
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public suspend Object? startAudioConversation(com.google.firebase.ai.type.ConversationConfig conversationConfig, kotlin.coroutines.Continuation<? super kotlin.Unit>);
951+
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public suspend Object? startAudioConversation(com.google.firebase.ai.type.LiveAudioConversationConfig liveAudioConversationConfig, kotlin.coroutines.Continuation<? super kotlin.Unit>);
952952
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public suspend Object? startAudioConversation(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler = null, boolean enableInterruptions = false, kotlin.coroutines.Continuation<? super kotlin.Unit>);
953953
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public suspend Object? startAudioConversation(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler = null, kotlin.coroutines.Continuation<? super kotlin.Unit>);
954954
method @RequiresPermission(android.Manifest.permission.RECORD_AUDIO) public suspend Object? startAudioConversation(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.FunctionCallPart,com.google.firebase.ai.type.FunctionResponsePart>? functionCallHandler = null, kotlin.jvm.functions.Function2<? super com.google.firebase.ai.type.Transcription?,? super com.google.firebase.ai.type.Transcription?,kotlin.Unit>? transcriptHandler = null, boolean enableInterruptions = false, kotlin.coroutines.Continuation<? super kotlin.Unit>);

firebase-ai/src/main/kotlin/com/google/firebase/ai/java/LiveSessionFutures.kt

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -21,10 +21,10 @@ import androidx.annotation.RequiresPermission
2121
import androidx.concurrent.futures.SuspendToFutureAdapter
2222
import com.google.common.util.concurrent.ListenableFuture
2323
import com.google.firebase.ai.type.Content
24-
import com.google.firebase.ai.type.ConversationConfig
2524
import com.google.firebase.ai.type.FunctionCallPart
2625
import com.google.firebase.ai.type.FunctionResponsePart
2726
import com.google.firebase.ai.type.InlineData
27+
import com.google.firebase.ai.type.LiveAudioConversationConfig
2828
import com.google.firebase.ai.type.LiveServerMessage
2929
import com.google.firebase.ai.type.LiveSession
3030
import com.google.firebase.ai.type.MediaData
@@ -54,12 +54,12 @@ public abstract class LiveSessionFutures internal constructor() {
5454
* Starts an audio conversation with the model, which can only be stopped using
5555
* [stopAudioConversation].
5656
*
57-
* @param conversationConfig A [ConversationConfig] provided by the user to control the various
58-
* aspects of the conversation.
57+
* @param liveAudioConversationConfig A [LiveAudioConversationConfig] provided by the user to
58+
* control the various aspects of the conversation.
5959
*/
6060
@RequiresPermission(RECORD_AUDIO)
6161
public abstract fun startAudioConversation(
62-
conversationConfig: ConversationConfig
62+
liveAudioConversationConfig: LiveAudioConversationConfig
6363
): ListenableFuture<Unit>
6464

6565
/**
@@ -312,8 +312,10 @@ public abstract class LiveSessionFutures internal constructor() {
312312
}
313313

314314
@RequiresPermission(RECORD_AUDIO)
315-
override fun startAudioConversation(conversationConfig: ConversationConfig) =
316-
SuspendToFutureAdapter.launchFuture { session.startAudioConversation(conversationConfig) }
315+
override fun startAudioConversation(liveAudioConversationConfig: LiveAudioConversationConfig) =
316+
SuspendToFutureAdapter.launchFuture {
317+
session.startAudioConversation(liveAudioConversationConfig)
318+
}
317319

318320
@RequiresPermission(RECORD_AUDIO)
319321
override fun startAudioConversation() =

firebase-ai/src/main/kotlin/com/google/firebase/ai/type/LiveAudioConversationConfig.kt

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,18 @@ import android.media.AudioTrack
2222
/**
2323
* Configuration parameters to use for conversation config.
2424
*
25-
* @property functionCallHandler A callback that is invoked whenever the model receives a
26-
* function call. The [FunctionResponsePart] that the callback function returns will be
27-
* automatically sent to the model.
25+
* @property functionCallHandler A callback that is invoked whenever the model receives a function
26+
* call. The [FunctionResponsePart] that the callback function returns will be automatically sent to
27+
* the model.
2828
*
29-
* @property transcriptHandler A callback that is invoked whenever the model receives a
30-
* transcript. The first [Transcription] object is the input transcription, and the second is the
31-
* output transcription.
29+
* @property transcriptHandler A callback that is invoked whenever the model receives a transcript.
30+
* The first [Transcription] object is the input transcription, and the second is the output
31+
* transcription.
3232
*
3333
* @property audioHandler A callback that is invoked immediately following the successful
3434
* initialization of the associated [AudioRecord] and [AudioTrack] objects. This offers a final
35-
* opportunity to configure these objects, which will remain
36-
* valid and effective for the duration of the current audio session.
35+
* opportunity to configure these objects, which will remain valid and effective for the duration of
36+
* the current audio session.
3737
*
3838
* @property enableInterruptions If enabled, allows the user to speak over or interrupt the model's
3939
* ongoing reply.
@@ -42,7 +42,7 @@ import android.media.AudioTrack
4242
* consistently available.
4343
*/
4444
@PublicPreviewAPI
45-
public class LiveConversationConfig
45+
public class LiveAudioConversationConfig
4646
private constructor(
4747
internal val functionCallHandler: ((FunctionCallPart) -> FunctionResponsePart)?,
4848
internal val audioHandler: ((AudioRecord, AudioTrack) -> Unit)?,
@@ -51,18 +51,18 @@ private constructor(
5151
) {
5252

5353
/**
54-
* Builder for creating a [ConversationConfig].
54+
* Builder for creating a [LiveAudioConversationConfig].
5555
*
56-
* Mainly intended for Java interop. Kotlin consumers should use [conversationConfig] for a more
57-
* idiomatic experience.
56+
* Mainly intended for Java interop. Kotlin consumers should use [liveAudioConversationConfig] for
57+
* a more idiomatic experience.
5858
*
59-
* @property functionCallHandler See [ConversationConfig.functionCallHandler].
59+
* @property functionCallHandler See [LiveAudioConversationConfig.functionCallHandler].
6060
*
61-
* @property audioHandler See [ConversationConfig.audioHandler].
61+
* @property audioHandler See [LiveAudioConversationConfig.audioHandler].
6262
*
63-
* @property transcriptHandler See [ConversationConfig.transcriptHandler].
63+
* @property transcriptHandler See [LiveAudioConversationConfig.transcriptHandler].
6464
*
65-
* @property enableInterruptions See [ConversationConfig.enableInterruptions].
65+
* @property enableInterruptions See [LiveAudioConversationConfig.enableInterruptions].
6666
*/
6767
public class Builder {
6868
@JvmField public var functionCallHandler: ((FunctionCallPart) -> FunctionResponsePart)? = null
@@ -87,9 +87,9 @@ private constructor(
8787
this.enableInterruptions = enableInterruptions
8888
}
8989

90-
/** Create a new [ConversationConfig] with the attached arguments. */
91-
public fun build(): ConversationConfig =
92-
ConversationConfig(
90+
/** Create a new [LiveAudioConversationConfig] with the attached arguments. */
91+
public fun build(): LiveAudioConversationConfig =
92+
LiveAudioConversationConfig(
9393
functionCallHandler = functionCallHandler,
9494
audioHandler = audioHandler,
9595
transcriptHandler = transcriptHandler,
@@ -100,30 +100,32 @@ private constructor(
100100
public companion object {
101101

102102
/**
103-
* Alternative casing for [ConversationConfig.Builder]:
103+
* Alternative casing for [LiveAudioConversationConfig.Builder]:
104104
* ```
105-
* val config = ConversationConfig.builder()
105+
* val config = LiveAudioConversationConfig.builder()
106106
* ```
107107
*/
108108
public fun builder(): Builder = Builder()
109109
}
110110
}
111111

112112
/**
113-
* Helper method to construct a [ConversationConfig] in a DSL-like manner.
113+
* Helper method to construct a [LiveAudioConversationConfig] in a DSL-like manner.
114114
*
115115
* Example Usage:
116116
* ```
117-
* conversationConfig {
117+
* liveAudioConversationConfig {
118118
* functionCallHandler = ...
119119
* audioHandler = ...
120120
* ...
121121
* }
122122
* ```
123123
*/
124124
@OptIn(PublicPreviewAPI::class)
125-
public fun conversationConfig(init: ConversationConfig.Builder.() -> Unit): ConversationConfig {
126-
val builder = ConversationConfig.builder()
125+
public fun liveAudioConversationConfig(
126+
init: LiveAudioConversationConfig.Builder.() -> Unit
127+
): LiveAudioConversationConfig {
128+
val builder = LiveAudioConversationConfig.builder()
127129
builder.init()
128130
return builder.build()
129131
}

firebase-ai/src/main/kotlin/com/google/firebase/ai/type/LiveSession.kt

Lines changed: 16 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -171,22 +171,26 @@ internal constructor(
171171
transcriptHandler: ((Transcription?, Transcription?) -> Unit)? = null,
172172
enableInterruptions: Boolean = false,
173173
) {
174-
val config = ConversationConfig.builder()
175-
config.functionCallHandler = functionCallHandler
176-
config.transcriptHandler = transcriptHandler
177-
config.enableInterruptions = enableInterruptions
178-
startAudioConversation(config.build())
174+
startAudioConversation(
175+
liveAudioConversationConfig {
176+
this.functionCallHandler = functionCallHandler
177+
this.transcriptHandler = transcriptHandler
178+
this.enableInterruptions = enableInterruptions
179+
}
180+
)
179181
}
180182

181183
/**
182184
* Starts an audio conversation with the model, which can only be stopped using
183185
* [stopAudioConversation] or [close].
184186
*
185-
* @param conversationConfig A [ConversationConfig] provided by the user to control the various
186-
* aspects of the conversation.
187+
* @param liveAudioConversationConfig A [LiveAudioConversationConfig] provided by the user to
188+
* control the various aspects of the conversation.
187189
*/
188190
@RequiresPermission(RECORD_AUDIO)
189-
public suspend fun startAudioConversation(conversationConfig: ConversationConfig) {
191+
public suspend fun startAudioConversation(
192+
liveAudioConversationConfig: LiveAudioConversationConfig
193+
) {
190194

191195
val context = firebaseApp.applicationContext
192196
if (
@@ -207,14 +211,14 @@ internal constructor(
207211
networkScope =
208212
CoroutineScope(blockingDispatcher + childJob() + CoroutineName("LiveSession Network"))
209213
audioScope = CoroutineScope(audioDispatcher + childJob() + CoroutineName("LiveSession Audio"))
210-
audioHelper = AudioHelper.build(conversationConfig.audioHandler)
214+
audioHelper = AudioHelper.build(liveAudioConversationConfig.audioHandler)
211215

212216
recordUserAudio()
213217
processModelResponses(
214-
conversationConfig.functionCallHandler,
215-
conversationConfig.transcriptHandler
218+
liveAudioConversationConfig.functionCallHandler,
219+
liveAudioConversationConfig.transcriptHandler
216220
)
217-
listenForModelPlayback(conversationConfig.enableInterruptions)
221+
listenForModelPlayback(liveAudioConversationConfig.enableInterruptions)
218222
}
219223
}
220224

0 commit comments

Comments
 (0)