@@ -37,34 +37,43 @@ public interface Part {
3737
3838/* * Represents text or string based data sent to and received from requests. */
3939public class TextPart
40- internal constructor (public val text: String , public override val isThought: Boolean = false ) :
41- Part {
40+ internal constructor (
41+ public val text: String ,
42+ public override val isThought: Boolean ,
43+ internal val thoughtSignature: String?
44+ ) : Part {
4245
43- public constructor (text: String ) : this (text, false )
46+ public constructor (text: String ) : this (text, false , null )
4447
4548 @Serializable
46- internal data class Internal (val text : String , val thought : Boolean? = null ) : InternalPart
49+ internal data class Internal (
50+ val text : String ,
51+ val thought : Boolean? = null ,
52+ val thoughtSignature : String? = null
53+ ) : InternalPart
4754}
4855
4956public class CodeExecutionResultPart
5057internal constructor (
5158 public val outcome: String ,
5259 public val output: String ,
53- public override val isThought: Boolean = false
60+ public override val isThought: Boolean ,
61+ internal val thoughtSignature: String?
5462) : Part {
5563
56- public constructor (outcome: String , output: String ) : this (outcome, output, false )
64+ public constructor (outcome: String , output: String ) : this (outcome, output, false , null )
5765
5866 @Serializable
5967 internal data class Internal (
60- @SerialName(" codeExecutionResult" ) val codeExecutionResult : CodeExecutionResult
68+ @SerialName(" codeExecutionResult" ) val codeExecutionResult : CodeExecutionResult ,
69+ val thought : Boolean? = null ,
70+ val thoughtSignature : String? = null
6171 ) : InternalPart {
6272
6373 @Serializable
6474 internal data class CodeExecutionResult (
6575 @SerialName(" outcome" ) val outcome : String ,
66- val output : String ,
67- val thought : Boolean? = null
76+ val output : String
6877 )
6978 }
7079}
@@ -73,20 +82,23 @@ public class ExecutableCodePart
7382internal constructor (
7483 public val language: String ,
7584 public val code: String ,
76- public override val isThought: Boolean = false
85+ public override val isThought: Boolean ,
86+ internal val thoughtSignature: String?
7787) : Part {
7888
79- public constructor (language: String , code: String ) : this (language, code, false )
89+ public constructor (language: String , code: String ) : this (language, code, false , null )
8090
8191 @Serializable
82- internal data class Internal (@SerialName(" executableCode" ) val executableCode : ExecutableCode ) :
83- InternalPart {
92+ internal data class Internal (
93+ @SerialName(" executableCode" ) val executableCode : ExecutableCode ,
94+ val thought : Boolean? = null ,
95+ val thoughtSignature : String? = null
96+ ) : InternalPart {
8497
8598 @Serializable
8699 internal data class ExecutableCode (
87100 @SerialName(" language" ) val language : String ,
88- val code : String ,
89- val thought : Boolean? = null
101+ val code : String
90102 )
91103 }
92104}
@@ -98,16 +110,20 @@ internal constructor(
98110 * @param image [Bitmap] to convert into a [Part]
99111 */
100112public class ImagePart
101- internal constructor (public val image: Bitmap , public override val isThought: Boolean = false ) :
102- Part {
113+ internal constructor (
114+ public val image: Bitmap ,
115+ public override val isThought: Boolean ,
116+ internal val thoughtSignature: String?
117+ ) : Part {
103118
104- public constructor (image: Bitmap ) : this (image, false )
119+ public constructor (image: Bitmap ) : this (image, false , null )
105120
106121 internal fun toInlineDataPart () =
107122 InlineDataPart (
108123 android.util.Base64 .decode(encodeBitmapToBase64Jpeg(image), BASE_64_FLAGS ),
109124 " image/jpeg" ,
110- isThought
125+ isThought,
126+ thoughtSignature
111127 )
112128}
113129
@@ -122,21 +138,24 @@ public class InlineDataPart
122138internal constructor (
123139 public val inlineData: ByteArray ,
124140 public val mimeType: String ,
125- public override val isThought: Boolean = false
141+ public override val isThought: Boolean ,
142+ internal val thoughtSignature: String?
126143) : Part {
127144
128- public constructor (inlineData: ByteArray , mimeType: String ) : this (inlineData, mimeType, false )
145+ public constructor (
146+ inlineData: ByteArray ,
147+ mimeType: String
148+ ) : this (inlineData, mimeType, false , null )
129149
130150 @Serializable
131- internal data class Internal (@SerialName(" inlineData" ) val inlineData : InlineData ) :
132- InternalPart {
151+ internal data class Internal (
152+ @SerialName(" inlineData" ) val inlineData : InlineData ,
153+ val thought : Boolean? = null ,
154+ val thoughtSignature : String? = null
155+ ) : InternalPart {
133156
134157 @Serializable
135- internal data class InlineData (
136- @SerialName(" mimeType" ) val mimeType : String ,
137- val data : Base64 ,
138- val thought : Boolean? = null
139- )
158+ internal data class InlineData (@SerialName(" mimeType" ) val mimeType : String , val data : Base64 )
140159 }
141160}
142161
@@ -153,25 +172,29 @@ internal constructor(
153172 public val name: String ,
154173 public val args: Map <String , JsonElement >,
155174 public val id: String? = null ,
156- public override val isThought: Boolean = false
175+ public override val isThought: Boolean ,
176+ internal val thoughtSignature: String?
157177) : Part {
158178
159179 @JvmOverloads
160180 public constructor (
161181 name: String ,
162182 args: Map <String , JsonElement >,
163- id: String? = null
164- ) : this (name, args, id, false )
183+ id: String? = null ,
184+ ) : this (name, args, id, false , null )
165185
166186 @Serializable
167- internal data class Internal (val functionCall : FunctionCall ) : InternalPart {
187+ internal data class Internal (
188+ val functionCall : FunctionCall ,
189+ val thought : Boolean? = null ,
190+ val thoughtSignature : String? = null
191+ ) : InternalPart {
168192
169193 @Serializable
170194 internal data class FunctionCall (
171195 val name : String ,
172196 val args : Map <String , JsonElement ?>? = null ,
173- val id : String? = null ,
174- val thought : Boolean? = null
197+ val id : String? = null
175198 )
176199 }
177200}
@@ -188,30 +211,34 @@ internal constructor(
188211 public val name: String ,
189212 public val response: JsonObject ,
190213 public val id: String? = null ,
191- public override val isThought: Boolean = false
214+ public override val isThought: Boolean ,
215+ internal val thoughtSignature: String?
192216) : Part {
193217
194218 @JvmOverloads
195219 public constructor (
196220 name: String ,
197221 response: JsonObject ,
198222 id: String? = null
199- ) : this (name, response, id, false )
223+ ) : this (name, response, id, false , null )
200224
201225 @Serializable
202- internal data class Internal (val functionResponse : FunctionResponse ) : InternalPart {
226+ internal data class Internal (
227+ val functionResponse : FunctionResponse ,
228+ val thought : Boolean? = null ,
229+ val thoughtSignature : String? = null
230+ ) : InternalPart {
203231
204232 @Serializable
205233 internal data class FunctionResponse (
206234 val name : String ,
207235 val response : JsonObject ,
208- val id : String? = null ,
209- val thought : Boolean? = null
236+ val id : String? = null
210237 )
211238 }
212239
213240 internal fun toInternalFunctionCall (): Internal .FunctionResponse {
214- return Internal .FunctionResponse (name, response, id, isThought )
241+ return Internal .FunctionResponse (name, response, id)
215242 }
216243}
217244
@@ -227,19 +254,23 @@ public class FileDataPart
227254internal constructor (
228255 public val uri: String ,
229256 public val mimeType: String ,
230- public override val isThought: Boolean = false
257+ public override val isThought: Boolean ,
258+ internal val thoughtSignature: String?
231259) : Part {
232260
233- public constructor (uri: String , mimeType: String ) : this (uri, mimeType, false )
261+ public constructor (uri: String , mimeType: String ) : this (uri, mimeType, false , null )
234262
235263 @Serializable
236- internal data class Internal (@SerialName(" file_data" ) val fileData : FileData ) : InternalPart {
264+ internal data class Internal (
265+ @SerialName(" file_data" ) val fileData : FileData ,
266+ val thought : Boolean? = null ,
267+ val thoughtSignature : String? = null
268+ ) : InternalPart {
237269
238270 @Serializable
239271 internal data class FileData (
240272 @SerialName(" mime_type" ) val mimeType : String ,
241- @SerialName(" file_uri" ) val fileUri : String ,
242- val thought : Boolean? = null
273+ @SerialName(" file_uri" ) val fileUri : String
243274 )
244275 }
245276}
@@ -281,36 +312,51 @@ internal object PartSerializer :
281312
282313internal fun Part.toInternal (): InternalPart {
283314 return when (this ) {
284- is TextPart -> TextPart .Internal (text, isThought)
315+ is TextPart -> TextPart .Internal (text, isThought, thoughtSignature )
285316 is ImagePart ->
286317 InlineDataPart .Internal (
287- InlineDataPart .Internal .InlineData (" image/jpeg" , encodeBitmapToBase64Jpeg(image), isThought)
318+ InlineDataPart .Internal .InlineData (" image/jpeg" , encodeBitmapToBase64Jpeg(image)),
319+ isThought,
320+ thoughtSignature
288321 )
289322 is InlineDataPart ->
290323 InlineDataPart .Internal (
291324 InlineDataPart .Internal .InlineData (
292325 mimeType,
293- android.util.Base64 .encodeToString(inlineData, BASE_64_FLAGS ),
294- isThought
295- )
326+ android.util.Base64 .encodeToString(inlineData, BASE_64_FLAGS )
327+ ),
328+ isThought,
329+ thoughtSignature
296330 )
297331 is FunctionCallPart ->
298- FunctionCallPart .Internal (FunctionCallPart .Internal .FunctionCall (name, args, id, isThought))
332+ FunctionCallPart .Internal (
333+ FunctionCallPart .Internal .FunctionCall (name, args, id),
334+ isThought,
335+ thoughtSignature
336+ )
299337 is FunctionResponsePart ->
300338 FunctionResponsePart .Internal (
301- FunctionResponsePart .Internal .FunctionResponse (name, response, id, isThought)
339+ FunctionResponsePart .Internal .FunctionResponse (name, response, id),
340+ isThought,
341+ thoughtSignature
302342 )
303343 is FileDataPart ->
304344 FileDataPart .Internal (
305- FileDataPart .Internal .FileData (mimeType = mimeType, fileUri = uri, thought = isThought)
345+ FileDataPart .Internal .FileData (mimeType = mimeType, fileUri = uri),
346+ isThought,
347+ thoughtSignature
306348 )
307349 is ExecutableCodePart ->
308350 ExecutableCodePart .Internal (
309- ExecutableCodePart .Internal .ExecutableCode (language, code, isThought)
351+ ExecutableCodePart .Internal .ExecutableCode (language, code),
352+ isThought,
353+ thoughtSignature
310354 )
311355 is CodeExecutionResultPart ->
312356 CodeExecutionResultPart .Internal (
313- CodeExecutionResultPart .Internal .CodeExecutionResult (outcome, output, isThought)
357+ CodeExecutionResultPart .Internal .CodeExecutionResult (outcome, output),
358+ isThought,
359+ thoughtSignature
314360 )
315361 else ->
316362 throw com.google.firebase.ai.type.SerializationException (
@@ -328,42 +374,46 @@ private fun encodeBitmapToBase64Jpeg(input: Bitmap): String {
328374
329375internal fun InternalPart.toPublic (): Part {
330376 return when (this ) {
331- is TextPart .Internal -> TextPart (text, thought ? : false )
377+ is TextPart .Internal -> TextPart (text, thought ? : false , thoughtSignature )
332378 is InlineDataPart .Internal -> {
333379 val data = android.util.Base64 .decode(inlineData.data, BASE_64_FLAGS )
334380 if (inlineData.mimeType.contains(" image" )) {
335- ImagePart (decodeBitmapFromImage(data), inlineData. thought ? : false )
381+ ImagePart (decodeBitmapFromImage(data), thought ? : false , thoughtSignature )
336382 } else {
337- InlineDataPart (data, inlineData.mimeType, inlineData. thought ? : false )
383+ InlineDataPart (data, inlineData.mimeType, thought ? : false , thoughtSignature )
338384 }
339385 }
340386 is FunctionCallPart .Internal ->
341387 FunctionCallPart (
342388 functionCall.name,
343389 functionCall.args.orEmpty().mapValues { it.value ? : JsonNull },
344390 functionCall.id,
345- functionCall.thought ? : false
391+ thought ? : false ,
392+ thoughtSignature
346393 )
347394 is FunctionResponsePart .Internal ->
348395 FunctionResponsePart (
349396 functionResponse.name,
350397 functionResponse.response,
351398 functionResponse.id,
352- functionResponse.thought ? : false
399+ thought ? : false ,
400+ thoughtSignature
353401 )
354402 is FileDataPart .Internal ->
355- FileDataPart (fileData.mimeType, fileData.fileUri, fileData. thought ? : false )
403+ FileDataPart (fileData.mimeType, fileData.fileUri, thought ? : false , thoughtSignature )
356404 is ExecutableCodePart .Internal ->
357405 ExecutableCodePart (
358406 executableCode.language,
359407 executableCode.code,
360- executableCode.thought ? : false
408+ thought ? : false ,
409+ thoughtSignature
361410 )
362411 is CodeExecutionResultPart .Internal ->
363412 CodeExecutionResultPart (
364413 codeExecutionResult.outcome,
365414 codeExecutionResult.output,
366- codeExecutionResult.thought ? : false
415+ thought ? : false ,
416+ thoughtSignature
367417 )
368418 else ->
369419 throw com.google.firebase.ai.type.SerializationException (
0 commit comments