From c9c822de13ac9a0d8919cdfccf9fa7e09eda4136 Mon Sep 17 00:00:00 2001 From: Mila <107142260+milaGGL@users.noreply.github.com> Date: Tue, 14 Jul 2026 16:43:38 -0400 Subject: [PATCH] remove shadow class --- .../ai/ksp/FirebaseSymbolProcessor.kt | 11 +++++- .../ai/ksp/SchemaSymbolProcessorVisitor.kt | 5 --- .../firebase/testing/processor/SchemaTest.kt | 4 +- .../ai/ondevice/GenerativeModelImpl.kt | 38 ++++--------------- ai-logic/firebase-ai/api.txt | 2 - ai-logic/firebase-ai/firebase-ai.gradle.kts | 6 ++- gradle/libs.versions.toml | 2 + settings.gradle.kts | 1 - 8 files changed, 26 insertions(+), 43 deletions(-) diff --git a/ai-logic/firebase-ai-ksp-processor/src/main/kotlin/com/google/firebase/ai/ksp/FirebaseSymbolProcessor.kt b/ai-logic/firebase-ai-ksp-processor/src/main/kotlin/com/google/firebase/ai/ksp/FirebaseSymbolProcessor.kt index af8a09e3fb2..de3653c3fa3 100644 --- a/ai-logic/firebase-ai-ksp-processor/src/main/kotlin/com/google/firebase/ai/ksp/FirebaseSymbolProcessor.kt +++ b/ai-logic/firebase-ai-ksp-processor/src/main/kotlin/com/google/firebase/ai/ksp/FirebaseSymbolProcessor.kt @@ -29,9 +29,16 @@ public class FirebaseSymbolProcessor( private val logger: KSPLogger, ) : SymbolProcessor { override fun process(resolver: Resolver): List { - resolver - .getSymbolsWithAnnotation("com.google.firebase.ai.annotations.Generable") + val generableSymbols = + resolver.getSymbolsWithAnnotation( + "com.google.mlkit.genai.structuredoutput.annotations.Generable" + ) + + resolver.getSymbolsWithAnnotation("com.google.mlkit.genai.schema.annotations.Generable") + + resolver.getSymbolsWithAnnotation("com.google.firebase.ai.annotations.Generable") + + generableSymbols .filterIsInstance() + .distinct() .map { it to SchemaSymbolProcessorVisitor(logger, codeGenerator) } .forEach { (klass, visitor) -> visitor.visitClassDeclaration(klass, Unit) } diff --git a/ai-logic/firebase-ai-ksp-processor/src/main/kotlin/com/google/firebase/ai/ksp/SchemaSymbolProcessorVisitor.kt b/ai-logic/firebase-ai-ksp-processor/src/main/kotlin/com/google/firebase/ai/ksp/SchemaSymbolProcessorVisitor.kt index dfdb0f31c62..bcd2cdf355c 100644 --- a/ai-logic/firebase-ai-ksp-processor/src/main/kotlin/com/google/firebase/ai/ksp/SchemaSymbolProcessorVisitor.kt +++ b/ai-logic/firebase-ai-ksp-processor/src/main/kotlin/com/google/firebase/ai/ksp/SchemaSymbolProcessorVisitor.kt @@ -63,11 +63,6 @@ internal class SchemaSymbolProcessorVisitor( codeGenerator, Dependencies(true, containingFile), ) - val companionFile = generateMlKitCompanionFileSpec(classDeclaration) - companionFile.writeTo( - codeGenerator, - Dependencies(true, containingFile), - ) } fun generateFileSpec(classDeclaration: KSClassDeclaration): FileSpec { diff --git a/ai-logic/firebase-ai-ksp-processor/test-app/src/main/kotlin/com/google/firebase/testing/processor/SchemaTest.kt b/ai-logic/firebase-ai-ksp-processor/test-app/src/main/kotlin/com/google/firebase/testing/processor/SchemaTest.kt index c770584e698..115ab0651ed 100644 --- a/ai-logic/firebase-ai-ksp-processor/test-app/src/main/kotlin/com/google/firebase/testing/processor/SchemaTest.kt +++ b/ai-logic/firebase-ai-ksp-processor/test-app/src/main/kotlin/com/google/firebase/testing/processor/SchemaTest.kt @@ -16,8 +16,8 @@ package com.google.firebase.testing.processor -import com.google.firebase.ai.annotations.Generable -import com.google.firebase.ai.annotations.Guide +import com.google.mlkit.genai.structuredoutput.annotations.Generable +import com.google.mlkit.genai.structuredoutput.annotations.Guide /** * A test kdoc diff --git a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/GenerativeModelImpl.kt b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/GenerativeModelImpl.kt index e130a7a91b4..edd78a51838 100644 --- a/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/GenerativeModelImpl.kt +++ b/ai-logic/firebase-ai-ondevice/src/main/kotlin/com/google/firebase/ai/ondevice/GenerativeModelImpl.kt @@ -61,24 +61,6 @@ internal class GenerativeModelImpl( android.util.Log.i("MLKIT_IO", "[SDK_BRIDGE] ==========================================") android.util.Log.i("MLKIT_IO", "[SDK_BRIDGE] Calling ML Kit generateTypedContentRequest") android.util.Log.i("MLKIT_IO", "[SDK_BRIDGE] Input SDK Class: ${schemaClass.qualifiedName}") - val companionClassName = "${schemaClass.java.name}_MlKitCompanion" - val targetClass = - try { - Class.forName(companionClassName).kotlin - } catch (e: Exception) { - if (schemaClass.java.name.endsWith("_MlKitCompanion")) { - schemaClass - } else { - throw IllegalArgumentException( - "Shadow class $companionClassName not found for structured output. Ensure KSP processor is running and generated the MlKit companion class.", - e - ) - } - } - android.util.Log.i( - "MLKIT_IO", - "[SDK_BRIDGE] Resolved ML Kit Class: ${targetClass.qualifiedName}" - ) android.util.Log.i( "MLKIT_IO", "[SDK_BRIDGE] includeSchemaInPrompt: true (ML Kit manages prompt formatting)" @@ -89,7 +71,7 @@ internal class GenerativeModelImpl( val mlkitRequest = com.google.mlkit.genai.prompt.generateTypedContentRequest( generateContentRequest = request.toMlKit(), - outputClass = targetClass as kotlin.reflect.KClass, + outputClass = schemaClass as kotlin.reflect.KClass, includeSchemaInPrompt = true ) val typedResponse = mlkitModel.generateContent(mlkitRequest) @@ -102,19 +84,15 @@ internal class GenerativeModelImpl( "[SDK_BRIDGE] ML Kit returned structured instances count: ${mlkitInstances.size}" ) - @Suppress("UNCHECKED_CAST") - val sdkInstances = - mlkitInstances.map { mlkitInstance -> - if (mlkitInstance.javaClass.name.endsWith("_MlKitCompanion")) { - val toSdkMethod = mlkitInstance.javaClass.getMethod("toSdk") - toSdkMethod.invoke(mlkitInstance) as T - } else { - mlkitInstance as T - } - } + @Suppress("UNCHECKED_CAST") val sdkInstances = mlkitInstances as List com.google.firebase.ai.ondevice.interop.GenerateObjectResponse(sdkInstances) - } catch (e: GenAiException) { + } catch (e: Throwable) { + android.util.Log.e( + "MLKIT_IO", + "[SDK_BRIDGE] generateObject failed with exception: ${e.javaClass.name}: ${e.message}", + e + ) throw getMappingException(e) } diff --git a/ai-logic/firebase-ai/api.txt b/ai-logic/firebase-ai/api.txt index 52f9d9ea387..1fe3f6e69d7 100644 --- a/ai-logic/firebase-ai/api.txt +++ b/ai-logic/firebase-ai/api.txt @@ -217,8 +217,6 @@ package com.google.firebase.ai { method @Deprecated public suspend Object? generateImages(String templateId, java.util.Map inputs, kotlin.coroutines.Continuation>); } -} - package com.google.firebase.ai.annotations { @kotlin.annotation.Retention(kotlin.annotation.AnnotationRetention.SOURCE) @kotlin.annotation.Target(allowedTargets=kotlin.annotation.AnnotationTarget.CLASS) public @interface Generable { diff --git a/ai-logic/firebase-ai/firebase-ai.gradle.kts b/ai-logic/firebase-ai/firebase-ai.gradle.kts index 5925a75e3d9..51d239bd034 100644 --- a/ai-logic/firebase-ai/firebase-ai.gradle.kts +++ b/ai-logic/firebase-ai/firebase-ai.gradle.kts @@ -71,7 +71,10 @@ android { } kotlin { - compilerOptions { jvmTarget = JvmTarget.JVM_1_8 } + compilerOptions { + jvmTarget = JvmTarget.JVM_1_8 + freeCompilerArgs.add("-Xskip-metadata-version-check") + } explicitApi() } @@ -84,6 +87,7 @@ dependencies { implementation(libs.ktor.client.logging) api(libs.firebase.common) + api(libs.genai.structured.output) { exclude(group = "org.jetbrains.kotlin") } api("com.google.firebase:firebase-appcheck:19.2.0") implementation(libs.firebase.components) implementation(libs.firebase.annotations) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 7bd4c2a4b23..fdd9690926b 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -121,6 +121,8 @@ firebase-annotations = { module = "com.google.firebase:firebase-annotations", ve firebase-common = { module = "com.google.firebase:firebase-common", version.ref = "firebaseCommon" } firebase-components = { module = "com.google.firebase:firebase-components", version.ref = "firebaseComponents" } genai-prompt = { module = "com.google.mlkit:genai-prompt", version.ref = "genaiPrompt" } +genai-schema = { module = "com.google.mlkit:genai-schema", version = "1.0.0-alpha1" } +genai-structured-output = { module = "com.google.mlkit:genai-structured-output", version = "1.0.0-alpha1" } glide = { module = "com.github.bumptech.glide:glide", version.ref = "glide" } google-api-client = { module = "com.google.api-client:google-api-client", version.ref = "googleApiClient" } google-dexmaker = { module = "com.google.dexmaker:dexmaker", version.ref = "dexmakerVersion" } diff --git a/settings.gradle.kts b/settings.gradle.kts index 93afb7ab7df..59f90d402ed 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -36,7 +36,6 @@ dependencyResolutionManagement { google() mavenLocal() mavenCentral() - maven { url = uri("/Users/milamamat/Downloads/mlkit_genai_structured_output") } } }