Android端Gemini API触发SerializationException:totalTokenCount字段缺失
问题
原本使用Gemini API调用文本提示功能一切正常,现在每次发起请求都会触发SerializationException。已尝试更新Gemini依赖、Play Services,也在多台手机和模拟器上测试,均无法解决问题。
异常信息
com.google.ai.client.generativeai.type.SerializationException: Something went wrong while trying to deserialize a response from the server. 17:07:47.015 E at com.google.ai.client.generativeai.type.GoogleGenerativeAIException$Companion.from(Exceptions.kt:41) 17:07:47.015 E at com.google.ai.client.generativeai.GenerativeModel.generateContent(GenerativeModel.kt:116) 17:07:47.015 E at com.google.ai.client.generativeai.GenerativeModel$generateContent$1.invokeSuspend(Unknown Source:15) 17:07:47.015 E at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 17:07:47.015 E at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:106) 17:07:47.015 E at android.os.Handler.handleCallback(Handler.java:942) 17:07:47.015 E at android.os.Handler.dispatchMessage(Handler.java:99) 17:07:47.015 E at android.os.Looper.loopOnce(Looper.java:226) 17:07:47.015 E at android.os.Looper.loop(Looper.java:313) 17:07:47.015 E at android.app.ActivityThread.main(ActivityThread.java:8762) 17:07:47.015 E at java.lang.reflect.Method.invoke(Native Method) 17:07:47.015 E at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:604) 17:07:47.015 E at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1067) 17:07:47.016 E Caused by: io.ktor.serialization.JsonConvertException: Illegal input: Field 'totalTokenCount' is required for type with serial name 'com.google.ai.client.generativeai.common.UsageMetadata', but it was missing at path: $.usageMetadata 17:07:47.016 E at io.ktor.serialization.kotlinx.KotlinxSerializationConverter.deserialize(KotlinxSerializationConverter.kt:90) 17:07:47.016 E at io.ktor.serialization.ContentConverterKt$deserialize$$inlined$map$1$2.emit(Emitters.kt:224) 17:07:47.016 E at kotlinx.coroutines.flow.FlowKt__BuildersKt$asFlow$$inlined$unsafeFlow$3.collect(SafeCollector.common.kt:116) 17:07:47.016 E at io.ktor.serialization.ContentConverterKt$deserialize$$inlined$map$1.collect(SafeCollector.common.kt:113) 17:07:47.016 E at kotlinx.coroutines.flow.FlowKt__ReduceKt.firstOrNull(Reduce.kt:243) 17:07:47.016 E at kotlinx.coroutines.flow.FlowKt.firstOrNull(Unknown Source:1) 17:07:47.016 E at io.ktor.serialization.ContentConverterKt.deserialize(ContentConverter.kt:123) 17:07:47.016 E at io.ktor.client.plugins.contentnegotiation.ContentNegotiation.convertResponse$ktor_client_content_negotiation(ContentNegotiation.kt:230) 17:07:47.016 E at io.ktor.client.plugins.contentnegotiation.ContentNegotiation$Plugin$install$2.invokeSuspend(ContentNegotiation.kt:262) 17:07:47.016 E at io.ktor.client.plugins.contentnegotiation.ContentNegotiation$Plugin$install$2.invoke(Unknown Source:13) 17:07:47.016 E at io.ktor.client.plugins.contentnegotiation.ContentNegotiation$Plugin$install$2.invoke(Unknown Source:6) 17:07:47.016 E at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120) 17:07:47.016 E at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78) 17:07:47.016 E at io.ktor.client.HttpClient$4.invokeSuspend(HttpClient.kt:177) 17:07:47.016 E at io.ktor.client.HttpClient$4.invoke(Unknown Source:11) 17:07:47.016 E at io.ktor.client.HttpClient$4.invoke(Unknown Source:6) 17:07:47.016 E at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120) 17:07:47.016 E at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78) 17:07:47.016 E at io.ktor.util.pipeline.SuspendFunctionGun.proceedWith(SuspendFunctionGun.kt:88) 17:07:47.016 E at io.ktor.client.plugins.HttpCallValidator$Companion$install$2.invokeSuspend(HttpCallValidator.kt:142) 17:07:47.016 E at io.ktor.client.plugins.HttpCallValidator$Companion$install$2.invoke(Unknown Source:13) 17:07:47.016 E at io.ktor.client.plugins.HttpCallValidator$Companion$install$2.invoke(Unknown Source:6) 17:07:47.016 E at io.ktor.util.pipeline.SuspendFunctionGun.loop(SuspendFunctionGun.kt:120) 17:07:47.016 E at io.ktor.util.pipeline.SuspendFunctionGun.proceed(SuspendFunctionGun.kt:78) 17:07:47.016 E at io.ktor.util.pipeline.SuspendFunctionGun.execute$ktor_utils(SuspendFunctionGun.kt:98) 17:07:47.016 E at io.ktor.util.pipeline.Pipeline.execute(Pipeline.kt:77) 17:07:47.016 E at io.ktor.client.call.HttpClientCall.bodyNullable(HttpClientCall.kt:88) 17:07:47.016 E at com.google.ai.client.generativeai.common.APIController.generateContent(APIController.kt:262) 17:07:47.016 E at com.google.ai.client.generativeai.common.APIController$generateContent$1.invokeSuspend(Unknown Source:15) 17:07:47.016 E at kotlin.coroutines.jvm.internal.BaseContinuationImpl.resumeWith(ContinuationImpl.kt:33) 17:07:47.016 E at kotlinx.coroutines.DispatchedTask.run(DispatchedTask.kt:108) 17:07:47.016 E ... 8 more 17:07:47.016 E Caused by: kotlinx.serialization.MissingFieldException: Field 'totalTokenCount' is required for type with serial name 'com.google.ai.client.generativeai.common.UsageMetadata', but it was missing at path: $.usageMetadata 17:07:47.016 E at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:93) 17:07:47.016 E at kotlinx.serialization.encoding.AbstractDecoder.decodeSerializableValue(AbstractDecoder.kt:43) 17:07:47.016 E at kotlinx.serialization.encoding.AbstractDecoder.decodeNullableSerializableElement(AbstractDecoder.kt:79) 17:07:47.016 E at com.google.ai.client.generativeai.common.GenerateContentResponse$$serializer.deserialize(Response.kt:26) 17:07:47.017 E at com.google.ai.client.generativeai.common.GenerateContentResponse$$serializer.deserialize(Response.kt:26) 17:07:47.017 E at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:70) 17:07:47.017 E at kotlinx.serialization.json.Json.decodeFromString(Json.kt:107) 17:07:47.017 E at io.ktor.serialization.kotlinx.KotlinxSerializationConverter.deserialize(KotlinxSerializationConverter.kt:82) 17:07:47.017 E ... 38 more 17:07:47.017 E Caused by: kotlinx.serialization.MissingFieldException: Field 'totalTokenCount' is required for type with serial name 'com.google.ai.client.generativeai.common.UsageMetadata', but it was missing 17:07:47.017 E at kotlinx.serialization.internal.PluginExceptionsKt.throwMissingFieldException(PluginExceptions.kt:20) 17:07:47.017 E at com.google.ai.client.generativeai.common.UsageMetadata.<init>(Response.kt:39) 17:07:47.017 E at com.google.ai.client.generativeai.common.UsageMetadata$$serializer.deserialize(Response.kt:39) 17:07:47.017 E at com.google.ai.client.generativeai.common.UsageMetadata$$serializer.deserialize(Response.kt:39) 17:07:47.017 E at kotlinx.serialization.json.internal.StreamingJsonDecoder.decodeSerializableValue(StreamingJsonDecoder.kt:70) 17:07:47.017 E ... 45 more
代码实现
String prompt = Constants.getDetailsPrompt(title); GenerativeModel generativeModel = new GenerativeModel("gemini-pro", "--"); GenerativeModelFutures generativeModelFutures = GenerativeModelFutures.from(generativeModel); Content content = new Content.Builder() .addText(prompt) .build(); Executor executor = Runnable::run; ListenableFuture<GenerateContentResponse> response = generativeModelFutures.generateContent(content); Futures.addCallback(response, new FutureCallback<GenerateContentResponse>() { @Override public void onSuccess(GenerateContentResponse result) { String resultText = result.getText(); resultText = resultText.replace("*", ""); Timber.d("Result: %s", resultText); binding.tvDetails.setText(resultText); binding.tvDetails.setVisibility(View.VISIBLE); binding.svResult.setVisibility(View.VISIBLE); binding.loadingAnimation.setVisibility(View.GONE); } @Override public void onFailure(@NonNull Throwable t) { Timber.e(t); } }, executor);
解决方案
异常核心原因是:Gemini服务器返回的响应中缺少totalTokenCount字段,但客户端SDK的UsageMetadata类将该字段标记为必填,导致反序列化失败。以下是可行的解决方法:
- 降级Gemini SDK版本:新版本SDK可能调整了字段要求,但服务器端尚未同步返回该字段。找到之前能正常运行的SDK版本,替换项目中的依赖版本。例如,若当前使用的是
0.3.0,可尝试降级到0.2.0或更早版本。 - 检查API端点配置:确认代码中调用的是正式版Gemini API端点,避免误使用测试或预发布环境的端点,这类环境的响应结构可能与正式版不一致。
- 验证API密钥权限:虽然之前正常,但仍需确认API密钥的权限未被修改,某些权限变更可能导致返回的响应结构缺失字段。
内容的提问来源于stack exchange,提问作者pro_hussain
相关产品推荐
相关产品推荐

