Gemini-API
一个为 Google Gemini 网页应用(前身为 Bard)设计的异步 Python 封装器,通过逆向工程实现。
特性
- 持久化 Cookies - 在后台自动刷新 cookies。为长期运行的服务进行了优化。
- ImageFx 支持 - 支持获取由 ImageFx(Google 最新的 AI 图像生成器)生成的图像。
- 扩展支持 - 支持使用 Gemini 扩展(如 YouTube 和 Gmail)生成内容。
- 分类输出 - 自动对响应中的文本、网络图像和 AI 生成的图像进行分类。
- 官方风格 - 提供简洁优雅的接口,灵感来自 Google Generative AI 的官方 API。
- 异步 - 利用
asyncio
高效运行生成任务并返回输出。
目录
安装
[!注意]
此软件包需要 Python 3.10 或更高版本。
使用 pip 安装/更新软件包。
pip install -U gemini_webapi
可选地,本软件包提供了一种从本地浏览器自动导入 cookies 的方法。要启用此功能,还需安装 browser-cookie3
。支持的平台和浏览器可以在这里找到。
pip install -U browser-cookie3
认证
[!提示]
如果已安装
browser-cookie3
,可以跳过此步骤直接进入使用方法部分。只需确保您已在浏览器中登录 https://gemini.google.com。
- 转到 https://gemini.google.com 并使用您的 Google 账户登录
- 按 F12 打开 Web 检查器,转到"网络"标签页并刷新页面
- 点击任意请求,复制
__Secure-1PSID
和__Secure-1PSIDTS
的 cookie 值
[!注意]
如果您的应用程序部署在容器化环境中(如 Docker),您可能希望使用卷来持久化 cookies,以避免每次容器重建时都需要重新认证。
以下是一个示例
docker-compose.yml
文件的部分内容:
services:
main:
volumes:
- ./gemini_cookies:/usr/local/lib/python3.12/site-packages/gemini_webapi/utils/temp
[!注意]
API 的自动 cookie 刷新功能不需要
browser-cookie3
,并且默认是启用的。它允许您保持 API 服务运行而不用担心 cookie 过期。此功能可能导致您需要在浏览器中重新登录 Google 账户。这是预期的行为,不会影响 API 的功能。
为避免这种情况,建议从单独的浏览器会话获取 cookies,并尽快关闭它以获得最佳利用(例如,在浏览器的隐私模式下进行新的登录)。更多详情可以在这里找到。
使用方法
初始化
导入所需的包,并使用上一步获得的 cookies 初始化客户端。成功初始化后,API 将在后台自动刷新 __Secure-1PSIDTS
,只要进程保持活跃。
import asyncio
from gemini_webapi import GeminiClient
# 将 "COOKIE VALUE HERE" 替换为您实际的 cookie 值。
# 如果您的账户没有 Secure_1PSIDTS,请将其留空。
Secure_1PSID = "COOKIE VALUE HERE"
Secure_1PSIDTS = "COOKIE VALUE HERE"
async def main():
# 如果安装了 browser-cookie3,只需使用 `client = GeminiClient()`
client = GeminiClient(Secure_1PSID, Secure_1PSIDTS, proxies=None)
await client.init(timeout=30, auto_close=False, close_delay=300, auto_refresh=True)
asyncio.run(main())
[!提示]
auto_close
和close_delay
是可选参数,用于在一定时间不活动后自动关闭客户端。此功能默认禁用。在像聊天机器人这样的长期运行服务中,建议将auto_close
设置为True
,并配合合理的close_delay
秒数,以更好地管理资源。
从文本生成内容
通过调用 GeminiClient.generate_content
提出一次性快速问题。
async def main():
response = await client.generate_content("Hello World!")
print(response.text)
asyncio.run(main())
[!提示]
如果您只想查看响应文本,可以直接使用
print(response)
获得相同的输出
从图像生成内容
Gemini 支持图像识别和从图像生成内容。您可以选择将图像作为 bytes
类型的文件数据列表,或者 str
或 pathlib.Path
类型的文件路径列表,与文本提示一起传递给 GeminiClient.generate_content
。
async def main():
response = await client.generate_content(
"描述这些图像中的每一个",
images=["assets/banner.png", "assets/favicon.png"],
)
print(response.text)
asyncio.run(main())
多轮对话
如果您想保持对话的连续性,请使用 GeminiClient.start_chat
创建一个 ChatSession
对象,并通过它发送消息。对话历史将在每轮对话后自动处理和更新。
async def main():
chat = client.start_chat()
response1 = await chat.send_message("简要介绍一下欧洲")
response2 = await chat.send_message("那里的人口是多少?")
print(response1.text, response2.text, sep="\n\n----------------------------------\n\n")
asyncio.run(main())
[!提示]
与
GeminiClient.generate_content
一样,ChatSession.send_message
也接受image
作为可选参数。
继续之前的对话
要手动检索之前的对话,您可以在创建新的 ChatSession
时将之前 ChatSession
的元数据传递给 GeminiClient.start_chat
。或者,如果您需要在当前 Python 进程结束后访问它们,可以将之前的元数据保存到文件或数据库中。
async def main():
# 开始新的聊天会话
chat = client.start_chat()
response = await chat.send_message("今天天气真好")
# 保存聊天的元数据
previous_session = chat.metadata
# 加载之前的对话
previous_chat = client.start_chat(metadata=previous_session)
response = await previous_chat.send_message("我之前的消息是什么?")
print(response)
asyncio.run(main())
获取响应中的图像
API 输出中的图像以 Image
对象列表的形式存储。您可以通过调用 image.title
、image.url
和 image.alt
分别访问图像的标题、URL 和描述。
async def main():
response = await client.generate_content("给我发一些猫的图片")
for image in response.images:
print(image, "\n\n----------------------------------\n")
asyncio.run(main())
使用 ImageFx 生成图像
2022年2月,Google 推出了一个名为 ImageFx 的新 AI 图像生成器,并将其集成到 Gemini 中。您可以通过自然语言简单地要求 Gemini 使用 ImageFx 生成图像。
[!IMPORTANT]
Google对Gemini的图像生成功能有一些限制,所以其可用性可能因地区/账户而异。以下是从官方文档复制的摘要(截至2024年2月15日):
Gemini应用程序中的图像生成功能在大多数国家可用,欧洲经济区(EEA)、瑞士和英国除外。它仅支持英语提示。
此功能在任何特定Gemini应用程序中的可用性也仅限于该应用程序支持的语言和国家。
目前,此功能不向18岁以下用户开放。
async def main():
response = await client.generate_content("生成一些猫的图片")
for image in response.images:
print(image, "\n\n----------------------------------\n")
asyncio.run(main())
[!NOTE]
默认情况下,当被要求发送图像时(如上例所示),Gemini会发送从网络获取的图像,而不是使用AI模型生成图像,除非你在提示中特别要求"生成"图像。在这个包中,网络图像和生成的图像被分别视为
WebImage
和GeneratedImage
,并会在输出中自动分类。
将图像保存到本地文件
你可以通过调用Image.save()
将Gemini返回的图像保存到/temp
下的本地文件。你可以选择通过传递path
和filename
参数来指定文件路径和文件名,并通过传递skip_invalid_filename=True
来跳过无效文件名的图像。这适用于WebImage
和GeneratedImage
。
async def main():
response = await client.generate_content("生成一些猫的图片")
for i, image in enumerate(response.images):
await image.save(path="temp/", filename=f"cat_{i}.png", verbose=True)
asyncio.run(main())
使用Gemini扩展生成内容
[!IMPORTANT]
要在API中访问Gemini扩展,你必须先在Gemini网站上激活它们。与图像生成一样,Google对Gemini扩展的可用性也有限制。以下是从官方文档复制的摘要(截至2024年2月18日):
要在Gemini应用程序中使用扩展:
使用你自己管理的个人Google账户登录。扩展(包括Google Workspace扩展)目前不适用于学校、企业或其他组织的Google Workspace账户。
启用Gemini应用程序活动。扩展仅在Gemini应用程序活动开启时可用。
重要提示:目前,扩展仅支持英语、日语和韩语。
在为你的账户激活扩展后,你可以通过自然语言或在提示前加上"@"后跟扩展关键词来在你的提示中访问它们。
async def main():
response1 = await client.generate_content("@Gmail 我邮箱里最新的消息是什么?")
print(response1, "\n\n----------------------------------\n")
response2 = await client.generate_content("@Youtube Taylor Swift最近的活动是什么?")
print(response2, "\n\n----------------------------------\n")
asyncio.run(main())
[!NOTE]
对于可用地区的限制,实际上只要求你的Google账户的首选语言设置为上述三种支持语言之一即可。你可以在这里更改你的语言设置。
检查并切换到其他回复候选
来自Gemini的响应通常包含多个具有不同生成内容的回复候选。你可以检查所有候选并选择一个来继续对话。默认情况下,第一个候选会被自动选择。
async def main():
# 开始对话并列出所有回复候选
chat = client.start_chat()
response = await chat.send_message("给我推荐一本科幻小说。")
for candidate in response.candidates:
print(candidate, "\n\n----------------------------------\n")
if len(response.candidates) > 1:
# 通过手动选择候选来控制正在进行的对话流程
new_candidate = chat.choose_candidate(index=1) # 在这里选择第二个候选
followup_response = await chat.send_message("告诉我更多关于它的信息。") # 将基于选择的候选生成内容
print(new_candidate, followup_response, sep="\n\n----------------------------------\n\n")
else:
print("只有一个可用候选。")
asyncio.run(main())
控制日志级别
你可以将包的日志级别设置为以下值之一:DEBUG
、INFO
、WARNING
、ERROR
和CRITICAL
。默认值为INFO
。
from gemini_webapi import set_log_level
set_log_level("DEBUG")