You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 18:37:03