
本文详细讲解使用 Google Generative AI SDK 实现 Gemini Pro 多轮对话的两种标准方式(generate_content 手动维护消息列表 和 start_chat() 自动管理会话),并解决常见类型错误,强调 SDK 版本兼容性与消息格式规范。
本文详细讲解使用 google generative ai sdk 实现 gemini pro 多轮对话的两种标准方式(`generate_content` 手动维护消息列表 和 `start_chat()` 自动管理会话),并解决常见类型错误,强调 sdk 版本兼容性与消息格式规范。
在使用 gemini-pro 模型进行多轮对话时,开发者常因消息结构混用或 SDK 版本过旧而遇到类似 TypeError: Could not create Blob... got <class 'google.ai.generativelanguage_v1beta.types.content.Content'> 的错误。该错误本质并非逻辑缺陷,而是 SDK 对输入消息类型的校验升级所致——较新版本(如 0.5.1+)已支持混合使用字典格式消息与 Protocol Buffer 类型(如 Content 对象),但旧版本(如 <0.4.0)对此兼容性不足,导致 response.candidates[0].content(即 Content 实例)无法直接追加到原为字典的 messages 列表中。
✅ 推荐方案一:使用 start_chat()(推荐新手 & 生产环境)
这是官方封装的会话管理方式,自动处理消息历史、角色对齐与状态持久化,代码简洁且健壮:
import google.generativeai as genai
genai.configure(api_key="YOUR_API_KEY")
model = genai.GenerativeModel("gemini-pro")
convo = model.start_chat() # 创建会话对象
# 第一轮
r1 = convo.send_message("Hello")
print(r1.text) # 输出:Hello! How can I assist you today?
# 第二轮(自动携带历史)
r2 = convo.send_message("Explain quantum superposition in simple terms.")
print(r2.text) # 输出基于上下文的连贯回答✅ 推荐方案二:手动调用 generate_content(适合需精细控制消息结构的场景)
若需自定义消息顺序或插入系统提示,可手动构建 messages 列表,但必须确保所有元素统一为字典格式(而非混入 Content 对象):
model = genai.GenerativeModel("gemini-pro")
# 初始化消息列表(全部为 dict)
messages = [
{"role": "user", "parts": ["Hello"]},
]
# 第一次生成
response = model.generate_content(messages)
messages.append({"role": "model", "parts": [response.text]}) # ✅ 提取 .text 转为字符串,保持字典结构
# 第二轮用户输入
messages.append({"role": "user", "parts": ["How does quantum physics work?"]})
response = model.generate_content(messages)
print(response.text)⚠️ 关键注意事项:
- SDK 版本务必 ≥ 0.5.1:运行 pip install --upgrade google-generativeai 升级,并验证 print(genai.__version__);
- 避免直接追加 Content 对象:response.candidates[0].content 是 Protocol Buffer 类型,不可直接放入 messages(即使新版支持,也建议显式转换以增强可读性与兼容性);
- 角色必须严格为 "user" 或 "model":"assistant" 不被 Gemini API 接受,会导致 400 错误;
- send_message 内部已自动维护历史,切勿重复调用 start_chat() 或重置 convo,否则丢失上下文。
总结:多轮对话的核心在于消息序列的一致性与 SDK 的版本匹配。优先选用 start_chat() + send_message() 组合,安全、简洁、符合最佳实践;若需底层控制,请统一使用字典格式构建 messages,并通过 .text 属性提取模型回复内容,确保类型纯净。


















