Cloud Run部署的Vertex AI Gradio应用REST请求返回无效响应且日志无法显示
我来帮你逐个解决这两个头疼的问题:
一、REST请求返回奇怪响应的原因和解决办法
你现在直接POST到Cloud Run的端点,得到的其实是Gradio为网页前端交互生成的内部状态数据,不是模型的直接响应——这很正常,因为Gradio默认的/api/predict接口是给它自己的前端用的,不是标准的REST API。
解决思路有两个:
按照Gradio的API规范发送请求
如果你想继续用Gradio自带的接口,请求体必须符合它的格式。你的输入是MultimodalTextbox,请求应该这样构造:{ "data": ["需要修正的捷克文本内容"] }发送POST到
/api/predict后,响应里的data字段才是模型返回的结果,你可以从中提取text值。自定义标准REST接口(更推荐)
如果你需要一个符合自己需求的REST API,建议用FastAPI和Gradio结合,单独开一个路由处理POST请求。步骤如下:- 先在
requirements.txt里添加fastapi和uvicorn - 修改
app.py的代码:import base64 from google import genai from google.genai import types import gradio as gr import utils import logging from fastapi import FastAPI import uvicorn # 保留你原来的generate函数不变... # 初始化FastAPP和Gradio接口 app = FastAPI() iface = gr.Interface( fn=generate, inputs=gr.MultimodalTextbox(), outputs=gr.MultimodalTextbox(), title="Czech Text Correction and Explanation - Informal" ) # 把Gradio挂载到FastAPI的根路径(保留网页访问功能) app = gr.mount_gradio_app(app, iface, path="/") # 自定义REST接口,处理标准POST请求 @app.post("/api/correct-czech") async def correct_czech(text: str): # 调用generate函数,处理它的生成器返回值 final_result = None for output in generate(text, None): final_result = output # 返回你需要的JSON格式 return {"corrected_text": final_result["text"]} if __name__ == "__main__": # 用uvicorn启动服务,替代原来的iface.launch() uvicorn.run(app, host="0.0.0.0", port=8080)
这样你就可以POST到
/api/correct-czech,发送{"text": "你的捷克文本"},得到干净的标准JSON响应。- 先在
二、Cloud Run日志不显示的问题排查和修复
先看你代码里的几个明显问题,这些都会导致日志出不来:
代码里的未定义变量错误
你写了logger.info("got here"),但根本没定义logger对象,应该改成logging.info("got here"),这个错误会让程序直接崩溃,后面的日志自然打不出来。启动时主动抛出错误
你在main()函数里直接raise gr.Error(...),这会导致程序刚启动就崩溃,连Gradio都没机会启动,日志当然看不到。先把这行代码删掉,确保程序能正常运行。日志格式不兼容Cloud Run
Cloud Run优先收集结构化的JSON日志,或者至少要确保日志输出到stdout/stderr。修改你的logging配置:import logging from pythonjsonlogger import jsonlogger # 配置结构化日志,适配Cloud Run logger = logging.getLogger() logger.setLevel(logging.INFO) # 清空默认的handler,避免重复输出 logger.handlers = [] handler = logging.StreamHandler() # 用JSON格式输出日志,包含时间、级别、消息 formatter = jsonlogger.JsonFormatter( "%(asctime)s %(levelname)s %(message)s" ) handler.setFormatter(formatter) logger.addHandler(handler)记得把
python-json-logger加到requirements.txt里,Dockerfile会自动安装它。Cloud Run日志查看注意事项
- 进入Cloud Run控制台的服务详情页,点击「日志」标签,确认时间范围选对了,没有过滤掉INFO级别的日志
- 确认服务使用的服务账号(默认是
PROJECT_NUMBER-compute@developer.gserviceaccount.com)拥有Logs Writer权限,如果是自定义账号,手动添加这个权限
内容来源于stack exchange

