Ruby调用GCP AIPlatform获取图像分类预测结果报错排查
问题根因
报错Invalid type Instance to assign to submessage field 'instances'的核心原因是你错误自定义了Instance proto类,GCP AI Platform V1版本的PredictRequest.instances字段要求传入Google::Protobuf::Value类型的结构化值,和你本地自定义的proto类没有任何类型关联,类型校验直接不通过。
你写的代码存在两个明确问题:
- 完全不需要自定义proto文件。AI Platform预测接口的输入结构是和你部署的模型输入schema绑定的,Ruby SDK不会识别你本地自定义的proto消息类,不需要额外生成proto代码。
- 构造实例参数时不需要实例化自定义类,直接传入和模型输入格式匹配的Ruby原生Hash结构即可,SDK会自动将原生结构序列化为接口要求的Protobuf Value类型。
修正后可运行代码
首先删除你本地自定义的Instance proto文件及对应生成的Ruby代码,然后按如下方式构造请求:
client = ::Google::Cloud::AIPlatform::V1::PredictionService::Client.new do |config| config.endpoint = "#{location}-aiplatform.googleapis.com" end # 读取图片并做base64编码,是否需要拼接data:image/png;base64前缀以你部署的模型输入要求为准 img_content = File.open(imgPath, 'rb') do |f| Base64.strict_encode64(f.read) end # 直接用Hash构造实例,不要使用自定义的Instance类 request = Google::Cloud::AIPlatform::V1::PredictRequest.new( endpoint: "projects/#{project}/locations/#{location}/endpoints/#{endpoint}", instances: [ { content: img_content } ] ) result = client.predict request p result
补充说明
- 你参考的JS示例能正常运行,原因是Node.js SDK会自动把普通JS对象转换为接口要求的
google.protobuf.Value类型,不存在手动传入自定义proto类的类型不匹配问题。 - 如果后续调用出现内容格式错误,对照你部署模型的输入定义调整图片格式即可:部分AutoML图像模型要求传入带mime前缀的Data URL格式字符串,部分自定义模型要求直接传入纯base64字符串,和模型输入schema保持一致即可。
- 所有AI Platform Prediction的Ruby SDK调用中,
instances、parameters字段都直接传Ruby原生类型(Hash、数组、字符串、数字、布尔值)即可,SDK内部会自动完成类型转换,不需要手动定义proto类。
内容的提问来源于stack exchange,提问作者Maxime Vincent
相关产品推荐
相关产品推荐

