Skip to content

Commit 5d390d0

Browse files
authored
fix public preview annotations
1 parent c987b9e commit 5d390d0

File tree

9 files changed

+39
-7
lines changed

9 files changed

+39
-7
lines changed

firebase-ai/CHANGELOG.md

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
11
# Unreleased
22

33
- [changed] **Breaking Change**: Removed the `candidateCount` option from `LiveGenerationConfig`
4-
- [changed] Added support for the URL context tool, which allows the model to access content from provided public web URLs to inform and enhance its responses.
4+
- [changed] Added support for the URL context tool, which allows the model to access content from
5+
provided public web URLs to inform and enhance its responses.
56

67
# 17.3.0
78

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

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,15 +38,17 @@ import kotlinx.serialization.json.JsonNames
3838
* enabled.
3939
*/
4040
public class Candidate
41+
@OptIn(PublicPreviewAPI::class)
4142
internal constructor(
4243
public val content: Content,
4344
public val safetyRatings: List<SafetyRating>,
4445
public val citationMetadata: CitationMetadata?,
4546
public val finishReason: FinishReason?,
4647
public val groundingMetadata: GroundingMetadata?,
47-
public val urlContextMetadata: UrlContextMetadata?
48+
@property:PublicPreviewAPI public val urlContextMetadata: UrlContextMetadata?
4849
) {
4950

51+
@OptIn(PublicPreviewAPI::class)
5052
@Serializable
5153
internal data class Internal(
5254
val content: Content.Internal? = null,
@@ -56,6 +58,8 @@ internal constructor(
5658
val groundingMetadata: GroundingMetadata.Internal? = null,
5759
val urlContextMetadata: UrlContextMetadata.Internal? = null
5860
) {
61+
62+
@OptIn(PublicPreviewAPI::class)
5963
internal fun toPublic(): Candidate {
6064
val safetyRatings = safetyRatings?.mapNotNull { it.toPublic() }.orEmpty()
6165
val citations = citationMetadata?.toPublic()
@@ -505,7 +509,9 @@ public class Segment(
505509
*/
506510
@PublicPreviewAPI
507511
public class UrlContextMetadata internal constructor(public val urlMetadata: List<UrlMetadata>) {
512+
508513
@Serializable
514+
@PublicPreviewAPI
509515
internal data class Internal(val urlMetadata: List<UrlMetadata.Internal>?) {
510516
internal fun toPublic() = UrlContextMetadata(urlMetadata?.map { it.toPublic() } ?: emptyList())
511517
}

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

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,9 @@ package com.google.firebase.ai.type
2323
"This API is part of an experimental public preview and may change in " +
2424
"backwards-incompatible ways without notice.",
2525
)
26+
@Target(
27+
AnnotationTarget.CLASS,
28+
AnnotationTarget.FUNCTION,
29+
AnnotationTarget.PROPERTY
30+
)
2631
public annotation class PublicPreviewAPI()

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

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,19 +24,24 @@ import kotlinx.serialization.json.JsonObject
2424
* can be used to gather information or complete tasks.
2525
*/
2626
public class Tool
27+
@OptIn(PublicPreviewAPI::class)
2728
internal constructor(
2829
internal val functionDeclarations: List<FunctionDeclaration>?,
2930
internal val googleSearch: GoogleSearch?,
3031
internal val codeExecution: JsonObject?,
31-
internal val urlContext: UrlContext?,
32+
@property:PublicPreviewAPI internal val urlContext: UrlContext?,
3233
) {
34+
35+
@OptIn(PublicPreviewAPI::class)
3336
internal fun toInternal() =
3437
Internal(
3538
functionDeclarations?.map { it.toInternal() } ?: emptyList(),
3639
googleSearch = this.googleSearch?.toInternal(),
3740
codeExecution = this.codeExecution,
3841
urlContext = this.urlContext?.toInternal()
3942
)
43+
44+
@OptIn(PublicPreviewAPI::class)
4045
@Serializable
4146
internal data class Internal(
4247
val functionDeclarations: List<FunctionDeclaration.Internal>? = null,
@@ -47,6 +52,7 @@ internal constructor(
4752
)
4853
public companion object {
4954

55+
@OptIn(PublicPreviewAPI::class)
5056
private val codeExecutionInstance by lazy { Tool(null, null, JsonObject(emptyMap()), null) }
5157

5258
/**
@@ -56,6 +62,7 @@ internal constructor(
5662
*/
5763
@JvmStatic
5864
public fun functionDeclarations(functionDeclarations: List<FunctionDeclaration>): Tool {
65+
@OptIn(PublicPreviewAPI::class)
5966
return Tool(functionDeclarations, null, null, null)
6067
}
6168

@@ -97,6 +104,7 @@ internal constructor(
97104
*/
98105
@JvmStatic
99106
public fun googleSearch(googleSearch: GoogleSearch = GoogleSearch()): Tool {
107+
@OptIn(PublicPreviewAPI::class)
100108
return Tool(null, googleSearch, null, null)
101109
}
102110
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ package com.google.firebase.ai
1818

1919
import com.google.firebase.ai.type.FinishReason
2020
import com.google.firebase.ai.type.InvalidAPIKeyException
21+
import com.google.firebase.ai.type.PublicPreviewAPI
2122
import com.google.firebase.ai.type.ResponseStoppedException
2223
import com.google.firebase.ai.type.ServerException
2324
import com.google.firebase.ai.type.UrlRetrievalStatus
@@ -135,6 +136,7 @@ internal class DevAPIUnarySnapshotTests {
135136
}
136137
}
137138

139+
@OptIn(PublicPreviewAPI::class)
138140
@Test
139141
fun `url context`() =
140142
goldenDevAPIUnaryFile("unary-success-url-context.json") {
@@ -167,6 +169,7 @@ internal class DevAPIUnarySnapshotTests {
167169
}
168170
}
169171

172+
@OptIn(PublicPreviewAPI::class)
170173
@Test
171174
fun `url context mixed validity`() =
172175
goldenDevAPIUnaryFile("unary-success-url-context-mixed-validity.json") {

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import com.google.firebase.ai.common.util.doBlocking
2323
import com.google.firebase.ai.type.Candidate
2424
import com.google.firebase.ai.type.Content
2525
import com.google.firebase.ai.type.GenerateContentResponse
26+
import com.google.firebase.ai.type.PublicPreviewAPI
2627
import com.google.firebase.ai.type.RequestOptions
2728
import com.google.firebase.ai.type.ServerException
2829
import com.google.firebase.ai.type.TextPart
@@ -41,7 +42,6 @@ import io.ktor.http.content.TextContent
4142
import io.ktor.http.headersOf
4243
import kotlin.time.Duration.Companion.seconds
4344
import kotlinx.coroutines.withTimeout
44-
import kotlinx.serialization.ExperimentalSerializationApi
4545
import kotlinx.serialization.encodeToString
4646
import org.junit.Before
4747
import org.junit.Test
@@ -146,7 +146,7 @@ internal class GenerativeModelTesting {
146146
exception.message shouldContain "location"
147147
}
148148

149-
@OptIn(ExperimentalSerializationApi::class)
149+
@OptIn(PublicPreviewAPI::class)
150150
private fun generateContentResponseAsJsonString(text: String): String {
151151
return JSON.encodeToString(
152152
GenerateContentResponse.Internal(

firebase-ai/src/test/java/com/google/firebase/ai/common/APIControllerTests.kt

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ import com.google.firebase.ai.type.Content
2626
import com.google.firebase.ai.type.CountTokensResponse
2727
import com.google.firebase.ai.type.FunctionCallingConfig
2828
import com.google.firebase.ai.type.GoogleSearch
29+
import com.google.firebase.ai.type.PublicPreviewAPI
2930
import com.google.firebase.ai.type.RequestOptions
3031
import com.google.firebase.ai.type.TextPart
3132
import com.google.firebase.ai.type.Tool
@@ -285,6 +286,7 @@ internal class RequestFormatTests {
285286
)
286287

287288
withTimeout(5.seconds) {
289+
@OptIn(PublicPreviewAPI::class)
288290
controller
289291
.generateContentStream(
290292
GenerateContentRequest(
@@ -323,6 +325,7 @@ internal class RequestFormatTests {
323325
)
324326

325327
withTimeout(5.seconds) {
328+
@OptIn(PublicPreviewAPI::class)
326329
controller
327330
.generateContentStream(
328331
GenerateContentRequest(
@@ -432,6 +435,7 @@ internal class RequestFormatTests {
432435
)
433436

434437
withTimeout(5.seconds) {
438+
@OptIn(PublicPreviewAPI::class)
435439
controller
436440
.generateContentStream(
437441
GenerateContentRequest(

firebase-ai/src/test/java/com/google/firebase/ai/common/util/tests.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.google.firebase.ai.common.JSON
2424
import com.google.firebase.ai.type.Candidate
2525
import com.google.firebase.ai.type.Content
2626
import com.google.firebase.ai.type.GenerateContentResponse
27+
import com.google.firebase.ai.type.PublicPreviewAPI
2728
import com.google.firebase.ai.type.RequestOptions
2829
import com.google.firebase.ai.type.TextPart
2930
import io.ktor.client.engine.mock.MockEngine
@@ -32,7 +33,6 @@ import io.ktor.http.HttpHeaders
3233
import io.ktor.http.HttpStatusCode
3334
import io.ktor.http.headersOf
3435
import io.ktor.utils.io.ByteChannel
35-
import kotlinx.serialization.ExperimentalSerializationApi
3636
import kotlinx.serialization.encodeToString
3737
import org.mockito.Mockito
3838

@@ -44,7 +44,7 @@ internal fun prepareStreamingResponse(
4444
response: List<GenerateContentResponse.Internal>
4545
): List<ByteArray> = response.map { "data: ${JSON.encodeToString(it)}$SSE_SEPARATOR".toByteArray() }
4646

47-
@OptIn(ExperimentalSerializationApi::class)
47+
@OptIn(PublicPreviewAPI::class)
4848
internal fun createResponses(vararg text: String): List<GenerateContentResponse.Internal> {
4949
val candidates =
5050
text.map { Candidate.Internal(Content.Internal(parts = listOf(TextPart.Internal(it)))) }

firebase-ai/src/test/java/com/google/firebase/ai/type/ToolTest.kt

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ internal class ToolTest {
2828
tool.googleSearch.shouldNotBeNull()
2929
tool.functionDeclarations.shouldBeNull()
3030
tool.codeExecution.shouldBeNull()
31+
@OptIn(PublicPreviewAPI::class)
3132
tool.urlContext.shouldBeNull()
3233
}
3334

@@ -39,6 +40,7 @@ internal class ToolTest {
3940
tool.functionDeclarations?.first() shouldBe functionDeclaration
4041
tool.googleSearch.shouldBeNull()
4142
tool.codeExecution.shouldBeNull()
43+
@OptIn(PublicPreviewAPI::class)
4244
tool.urlContext.shouldBeNull()
4345
}
4446

@@ -48,16 +50,19 @@ internal class ToolTest {
4850
tool.codeExecution.shouldNotBeNull()
4951
tool.functionDeclarations.shouldBeNull()
5052
tool.googleSearch.shouldBeNull()
53+
@OptIn(PublicPreviewAPI::class)
5154
tool.urlContext.shouldBeNull()
5255
}
5356

57+
@OptIn(PublicPreviewAPI::class)
5458
@Test
5559
fun `urlContext() creates a tool with a urlContext property`() {
5660
val tool = Tool.urlContext()
5761

5862
tool.googleSearch.shouldBeNull()
5963
tool.functionDeclarations.shouldBeNull()
6064
tool.codeExecution.shouldBeNull()
65+
@OptIn(PublicPreviewAPI::class)
6166
tool.urlContext.shouldNotBeNull()
6267
}
6368
}

0 commit comments

Comments
 (0)