使用Gradio ChatInterface集成Gemini API时用户输入重复的UI问题
问题分析与解决方案
核心错误原因:
chat_history.append((prompt, output))方法是原地修改列表,返回值为None。Gradio的ChatInterface期望函数返回更新后的完整聊天历史列表,返回None会导致界面渲染逻辑异常,进而出现用户输入重复显示的问题。其他潜在问题:
- 每次调用
generate函数都重新实例化GenerativeModel,会重复创建资源,降低性能。 - 未处理
prompt为空的情况,会导致response变量未定义引发报错。 - 初始判断
chat_history = chat_history or []属于冗余逻辑,Gradio会默认传入空列表。
- 每次调用
修正后的代码:
from google.cloud import aiplatform import vertexai from vertexai.preview.generative_models import GenerativeModel, Part import gradio as gr # 提前实例化模型,避免重复创建资源 vertexai.init(project="your-project-id", location="your-region") # 需补充你的项目ID和区域 model = GenerativeModel("gemini-pro") def generate(prompt, chat_history): if not prompt: return chat_history # 空输入直接返回原历史 response = model.generate_content( prompt, generation_config={ "max_output_tokens": 2048, "temperature": 0.9, "top_p": 1 }, stream=False, ) output = response.candidates[0].content.parts[0].text # 先更新聊天历史,再返回完整列表 chat_history.append((prompt, output)) return chat_history iface = gr.ChatInterface(generate) if __name__ == "__main__": iface.launch()
- 关键修改说明:
- 将
GenerativeModel实例化移到函数外部,仅初始化一次,提升运行效率。 - 增加空
prompt判断,避免无意义请求和代码报错。 - 先执行
chat_history.append((prompt, output))修改列表,再直接返回chat_history(完整的更新后列表),完全符合Gradio的返回要求。 - 移除冗余的
chat_history = chat_history or []逻辑。
- 将
内容的提问来源于stack exchange,提问作者Soumya Kanti Naskar
相关产品推荐
相关产品推荐

