Skip to content

Commit 7e7d2c3

Browse files
authored
Merge a9a39dd into 1654b31
2 parents 1654b31 + a9a39dd commit 7e7d2c3

File tree

6 files changed

+183
-5
lines changed

6 files changed

+183
-5
lines changed

firebase-ai/api.txt

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,23 @@ package com.google.firebase.ai.type {
165165
public final class APINotConfiguredException extends com.google.firebase.ai.type.FirebaseAIException {
166166
}
167167

168+
public final class AspectRatio {
169+
field public static final com.google.firebase.ai.type.AspectRatio.Companion Companion;
170+
field public static final com.google.firebase.ai.type.AspectRatio LANDSCAPE_16x9;
171+
field public static final com.google.firebase.ai.type.AspectRatio LANDSCAPE_21x9;
172+
field public static final com.google.firebase.ai.type.AspectRatio LANDSCAPE_3x2;
173+
field public static final com.google.firebase.ai.type.AspectRatio LANDSCAPE_4x3;
174+
field public static final com.google.firebase.ai.type.AspectRatio LANDSCAPE_5x4;
175+
field public static final com.google.firebase.ai.type.AspectRatio PORTRAIT_2x3;
176+
field public static final com.google.firebase.ai.type.AspectRatio PORTRAIT_3x4;
177+
field public static final com.google.firebase.ai.type.AspectRatio PORTRAIT_4x5;
178+
field public static final com.google.firebase.ai.type.AspectRatio PORTRAIT_9x16;
179+
field public static final com.google.firebase.ai.type.AspectRatio SQUARE_1x1;
180+
}
181+
182+
public static final class AspectRatio.Companion {
183+
}
184+
168185
public final class AudioRecordInitializationFailedException extends com.google.firebase.ai.type.FirebaseAIException {
169186
ctor public AudioRecordInitializationFailedException(String message);
170187
}
@@ -325,8 +342,13 @@ package com.google.firebase.ai.type {
325342
property public final int ordinal;
326343
field public static final com.google.firebase.ai.type.FinishReason BLOCKLIST;
327344
field public static final com.google.firebase.ai.type.FinishReason.Companion Companion;
345+
field public static final com.google.firebase.ai.type.FinishReason IMAGE_OTHER;
346+
field public static final com.google.firebase.ai.type.FinishReason IMAGE_PROHIBITED_CONTENT;
347+
field public static final com.google.firebase.ai.type.FinishReason IMAGE_RECITATION;
348+
field public static final com.google.firebase.ai.type.FinishReason IMAGE_SAFETY;
328349
field public static final com.google.firebase.ai.type.FinishReason MALFORMED_FUNCTION_CALL;
329350
field public static final com.google.firebase.ai.type.FinishReason MAX_TOKENS;
351+
field public static final com.google.firebase.ai.type.FinishReason NO_IMAGE;
330352
field public static final com.google.firebase.ai.type.FinishReason OTHER;
331353
field public static final com.google.firebase.ai.type.FinishReason PROHIBITED_CONTENT;
332354
field public static final com.google.firebase.ai.type.FinishReason RECITATION;
@@ -414,6 +436,7 @@ package com.google.firebase.ai.type {
414436
method public com.google.firebase.ai.type.GenerationConfig build();
415437
method public com.google.firebase.ai.type.GenerationConfig.Builder setCandidateCount(Integer? candidateCount);
416438
method public com.google.firebase.ai.type.GenerationConfig.Builder setFrequencyPenalty(Float? frequencyPenalty);
439+
method public com.google.firebase.ai.type.GenerationConfig.Builder setImageConfig(com.google.firebase.ai.type.ImageConfig? imageConfig);
417440
method public com.google.firebase.ai.type.GenerationConfig.Builder setMaxOutputTokens(Integer? maxOutputTokens);
418441
method public com.google.firebase.ai.type.GenerationConfig.Builder setPresencePenalty(Float? presencePenalty);
419442
method public com.google.firebase.ai.type.GenerationConfig.Builder setResponseMimeType(String? responseMimeType);
@@ -426,6 +449,7 @@ package com.google.firebase.ai.type {
426449
method public com.google.firebase.ai.type.GenerationConfig.Builder setTopP(Float? topP);
427450
field public Integer? candidateCount;
428451
field public Float? frequencyPenalty;
452+
field public com.google.firebase.ai.type.ImageConfig? imageConfig;
429453
field public Integer? maxOutputTokens;
430454
field public Float? presencePenalty;
431455
field public String? responseMimeType;
@@ -573,6 +597,19 @@ package com.google.firebase.ai.type {
573597
public static final class HarmSeverity.Companion {
574598
}
575599

600+
public final class ImageConfig {
601+
}
602+
603+
public static final class ImageConfig.Builder {
604+
ctor public ImageConfig.Builder();
605+
method public com.google.firebase.ai.type.ImageConfig build();
606+
method public com.google.firebase.ai.type.ImageConfig.Builder setAspectRatio(com.google.firebase.ai.type.AspectRatio? aspectRatio);
607+
}
608+
609+
public final class ImageConfigKt {
610+
method public static com.google.firebase.ai.type.ImageConfig imageConfig(kotlin.jvm.functions.Function1<? super com.google.firebase.ai.type.ImageConfig.Builder,kotlin.Unit> init);
611+
}
612+
576613
public final class ImagePart implements com.google.firebase.ai.type.Part {
577614
ctor public ImagePart(android.graphics.Bitmap image);
578615
method public android.graphics.Bitmap getImage();
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright 2024 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.firebase.ai.type
18+
19+
/** Represents the aspect ratio that the generated image should conform to. */
20+
public class AspectRatio private constructor(internal val internalVal: String) {
21+
public companion object {
22+
@JvmField public val SQUARE_1x1: AspectRatio = AspectRatio("1:1")
23+
@JvmField public val PORTRAIT_2x3: AspectRatio = AspectRatio("2:3")
24+
@JvmField public val LANDSCAPE_3x2: AspectRatio = AspectRatio("3:2")
25+
@JvmField public val PORTRAIT_3x4: AspectRatio = AspectRatio("3:4")
26+
@JvmField public val LANDSCAPE_4x3: AspectRatio = AspectRatio("4:3")
27+
@JvmField public val PORTRAIT_4x5: AspectRatio = AspectRatio("4:5")
28+
@JvmField public val LANDSCAPE_5x4: AspectRatio = AspectRatio("5:4")
29+
@JvmField public val PORTRAIT_9x16: AspectRatio = AspectRatio("9:16")
30+
@JvmField public val LANDSCAPE_16x9: AspectRatio = AspectRatio("16:9")
31+
@JvmField public val LANDSCAPE_21x9: AspectRatio = AspectRatio("21:9")
32+
}
33+
}

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

Lines changed: 27 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -247,7 +247,12 @@ public class FinishReason private constructor(public val name: String, public va
247247
BLOCKLIST,
248248
PROHIBITED_CONTENT,
249249
SPII,
250-
MALFORMED_FUNCTION_CALL;
250+
MALFORMED_FUNCTION_CALL,
251+
IMAGE_SAFETY,
252+
IMAGE_PROHIBITED_CONTENT,
253+
IMAGE_RECITATION,
254+
IMAGE_OTHER,
255+
NO_IMAGE;
251256

252257
internal object Serializer : KSerializer<Internal> by FirstOrdinalSerializer(Internal::class)
253258

@@ -262,6 +267,11 @@ public class FinishReason private constructor(public val name: String, public va
262267
PROHIBITED_CONTENT -> FinishReason.PROHIBITED_CONTENT
263268
SPII -> FinishReason.SPII
264269
MALFORMED_FUNCTION_CALL -> FinishReason.MALFORMED_FUNCTION_CALL
270+
IMAGE_SAFETY -> FinishReason.IMAGE_SAFETY
271+
IMAGE_PROHIBITED_CONTENT -> FinishReason.IMAGE_PROHIBITED_CONTENT
272+
IMAGE_RECITATION -> FinishReason.IMAGE_RECITATION
273+
IMAGE_OTHER -> FinishReason.IMAGE_OTHER
274+
NO_IMAGE -> FinishReason.NO_IMAGE
265275
else -> FinishReason.UNKNOWN
266276
}
267277
}
@@ -301,6 +311,22 @@ public class FinishReason private constructor(public val name: String, public va
301311
/** The function call generated by the model is invalid. */
302312
@JvmField
303313
public val MALFORMED_FUNCTION_CALL: FinishReason = FinishReason("MALFORMED_FUNCTION_CALL", 9)
314+
315+
/** Token generation stopped because generated images has safety violations. */
316+
@JvmField public val IMAGE_SAFETY: FinishReason = FinishReason("IMAGE_SAFETY", 10)
317+
318+
/** Image generation stopped because generated images has other prohibited content. */
319+
@JvmField
320+
public val IMAGE_PROHIBITED_CONTENT: FinishReason = FinishReason("IMAGE_PROHIBITED_CONTENT", 11)
321+
322+
/** Image generation stopped due to recitation. */
323+
@JvmField public val IMAGE_RECITATION: FinishReason = FinishReason("IMAGE_RECITATION", 12)
324+
325+
/** Image generation stopped because of other miscellaneous issue. */
326+
@JvmField public val IMAGE_OTHER: FinishReason = FinishReason("IMAGE_OTHER", 13)
327+
328+
/** The model was expected to generate an image, but none was generated. */
329+
@JvmField public val NO_IMAGE: FinishReason = FinishReason("NO_IMAGE", 14)
304330
}
305331
}
306332

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

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -92,6 +92,7 @@ private constructor(
9292
internal val responseSchema: Schema?,
9393
internal val responseModalities: List<ResponseModality>?,
9494
internal val thinkingConfig: ThinkingConfig?,
95+
internal val imageConfig: ImageConfig?,
9596
) {
9697

9798
/**
@@ -137,6 +138,7 @@ private constructor(
137138
@JvmField public var responseSchema: Schema? = null
138139
@JvmField public var responseModalities: List<ResponseModality>? = null
139140
@JvmField public var thinkingConfig: ThinkingConfig? = null
141+
@JvmField public var imageConfig: ImageConfig? = null
140142

141143
public fun setTemperature(temperature: Float?): Builder = apply {
142144
this.temperature = temperature
@@ -170,6 +172,9 @@ private constructor(
170172
public fun setThinkingConfig(thinkingConfig: ThinkingConfig?): Builder = apply {
171173
this.thinkingConfig = thinkingConfig
172174
}
175+
public fun setImageConfig(imageConfig: ImageConfig?): Builder = apply {
176+
this.imageConfig = imageConfig
177+
}
173178

174179
/** Create a new [GenerationConfig] with the attached arguments. */
175180
public fun build(): GenerationConfig =
@@ -185,7 +190,8 @@ private constructor(
185190
responseMimeType = responseMimeType,
186191
responseSchema = responseSchema,
187192
responseModalities = responseModalities,
188-
thinkingConfig = thinkingConfig
193+
thinkingConfig = thinkingConfig,
194+
imageConfig = imageConfig
189195
)
190196
}
191197

@@ -202,7 +208,8 @@ private constructor(
202208
responseMimeType = responseMimeType,
203209
responseSchema = responseSchema?.toInternal(),
204210
responseModalities = responseModalities?.map { it.toInternal() },
205-
thinkingConfig = thinkingConfig?.toInternal()
211+
thinkingConfig = thinkingConfig?.toInternal(),
212+
imageConfig = imageConfig?.toInternal()
206213
)
207214

208215
@Serializable
@@ -218,7 +225,8 @@ private constructor(
218225
@SerialName("frequency_penalty") val frequencyPenalty: Float? = null,
219226
@SerialName("response_schema") val responseSchema: Schema.Internal? = null,
220227
@SerialName("response_modalities") val responseModalities: List<String>? = null,
221-
@SerialName("thinking_config") val thinkingConfig: ThinkingConfig.Internal? = null
228+
@SerialName("thinking_config") val thinkingConfig: ThinkingConfig.Internal? = null,
229+
@SerialName("image_config") val imageConfig: ImageConfig.Internal? = null
222230
)
223231

224232
public companion object {
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
/*
2+
* Copyright 2024 Google LLC
3+
*
4+
* Licensed under the Apache License, Version 2.0 (the "License");
5+
* you may not use this file except in compliance with the License.
6+
* You may obtain a copy of the License at
7+
*
8+
* http://www.apache.org/licenses/LICENSE-2.0
9+
*
10+
* Unless required by applicable law or agreed to in writing, software
11+
* distributed under the License is distributed on an "AS IS" BASIS,
12+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13+
* See the License for the specific language governing permissions and
14+
* limitations under the License.
15+
*/
16+
17+
package com.google.firebase.ai.type
18+
19+
import kotlinx.serialization.Serializable
20+
21+
/**
22+
* Configuration parameters to use for image generation.
23+
*
24+
* @property aspectRatio The aspect ratio of the generated image.
25+
*/
26+
public class ImageConfig internal constructor(internal val aspectRatio: AspectRatio?) {
27+
28+
/**
29+
* Builder for creating an [ImageConfig].
30+
*
31+
* Mainly intended for Java interop. Kotlin consumers should use [imageConfig] for a more
32+
* idiomatic experience.
33+
*
34+
* @property aspectRatio See [ImageConfig.aspectRatio].
35+
* @see [imageConfig]
36+
*/
37+
public class Builder {
38+
@JvmField
39+
@set:JvmSynthetic // hide void setter from Java
40+
public var aspectRatio: AspectRatio? = null
41+
42+
public fun setAspectRatio(aspectRatio: AspectRatio?): Builder = apply {
43+
this.aspectRatio = aspectRatio
44+
}
45+
46+
/** Create a new [ImageConfig] with the attached arguments. */
47+
public fun build(): ImageConfig = ImageConfig(aspectRatio = aspectRatio)
48+
}
49+
50+
internal fun toInternal() = Internal(aspectRatio = aspectRatio?.internalVal)
51+
52+
@Serializable internal data class Internal(val aspectRatio: String?)
53+
}
54+
55+
/**
56+
* Helper method to construct an [ImageConfig] in a DSL-like manner.
57+
*
58+
* Example Usage:
59+
* ```
60+
* imageConfig {
61+
* aspectRatio = AspectRatio.LANDSCAPE_16x9
62+
* }
63+
* ```
64+
*/
65+
public fun imageConfig(init: ImageConfig.Builder.() -> Unit): ImageConfig {
66+
val builder = ImageConfig.Builder()
67+
builder.init()
68+
return builder.build()
69+
}

firebase-ai/src/test/java/com/google/firebase/ai/SerializationTests.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,12 @@ internal class SerializationTests {
151151
"BLOCKLIST",
152152
"PROHIBITED_CONTENT",
153153
"SPII",
154-
"MALFORMED_FUNCTION_CALL"
154+
"MALFORMED_FUNCTION_CALL",
155+
"IMAGE_SAFETY",
156+
"IMAGE_PROHIBITED_CONTENT",
157+
"IMAGE_RECITATION",
158+
"IMAGE_OTHER",
159+
"NO_IMAGE"
155160
]
156161
},
157162
"safetyRatings": {

0 commit comments

Comments
 (0)