我一直在尝试将 Palm API 和 palm.chat() 函数与谷歌新的生成 API 一起使用。我一直陷入文档和错误的迷宫中,但我似乎无法摆脱这个困境。我的代码非常简单,错误来自 palm.chat() 的简单请求。我有一个 API 密钥,当我用curl 测试它时它可以工作。我还下载了凭据。我设置了一个 OAuth 同意屏幕,因为我认为这可能会帮助我添加所需的范围,但我看不到 palm.chat 的范围要求是什么。这是我的代码:
import google.generativeai as palm
import os
palm.configure(api_key='XXXXXXXXXXXXXXXXXXXXX')
os.environ['GOOGLE_APPLICATION_CREDENTIALS']='XXXXXXXXX/.config/gcloud/application_default_credentials.json'
response = palm.chat(messages='Hello')
response.last
我得到的确切错误是:
文件“/Library/Frameworks/Python.framework/Versions/3.11/lib/python3.11/site-packages/google/api_core/grpc_helpers.py”,第 67 行,位于 error_remapped_callable 中 从 exc 引发异常。from_grpc_error(exc) google.api_core.exceptions.PermissionDenied:403 请求的身份验证范围不足。 [原因:“ACCESS_TOKEN_SCOPE_INSUFFICIENT” 域名:“googleapis.com” 元数据{ 关键:“方法” 值:“google.ai.generativelanguage.v1beta2.TextService.GenerateText” } 元数据{ 关键词:“服务” 值:“generativelanguage.googleapis.com” }
我不知道我做错了什么,我一整天都在绕圈子解决这个错误。任何帮助将非常感激。谢谢!
我在使用
virtualenv
时遇到了同样的错误,但是当我使用相同的代码切换到pyenv
时,它工作得很好。我想这意味着 python 环境出了问题,我不太确定。此外,您甚至不需要安装 Google Cloud CLI,因为您拥有 API 密钥。
更多详情请参考https://github.com/google/generative-ai-python/issues/50
建议的解决方案是坚持单独使用 API 密钥,但如果您必须使用 ADC,则可以使用
gcloud
来设置范围:
gcloud config set account [email protected]
gcloud config set project name-of-your-cloud-project
gcloud auth application-default login --scopes="https://www.googleapis.com/auth/generative-language,https://www.googleapis.com/auth/cloud-platform"
并且不要混合凭据 - 要么使用 API 密钥 要么 ADC,但不能同时使用两者。它可能有效,但尚不清楚在任何给定的代码路径中哪种身份验证机制将优先。
更多详细信息,请参见 GitHub 问题。
我终于让它在另一台计算机上运行了。我怀疑其中一个模块有损坏。创建了一个包含以下模块的 req.txt 文件:
cachetools-5.3.1 google-ai-generativelanguage-0.2.0 google-api-core-2.11.1 google-auth-2.22.0 google-generativeai-0.1.0 googleapis-common-protos-1.59.1 grpcio-1.56.2 grpcio-status-1.56.2 proto-plus-1.22.3 protobuf-4.23.4 pyasn1-0.5.0 pyasn1-modules-0.3.0 rsa-4.9
然:
pip uninstall -y -r reqs.txt pip install google-generativeai
现在它正在按预期工作
尝试使用langchain时遇到同样的错误
VirtualEmbeddings()
。在 virtualenv 中只需要执行 gcloud auth application-default login
,错误就消失了。
对我有用的是使用凭据而不是 api_key 进行身份验证,这意味着您需要先生成它。
from google.oauth2 import service_account
credentials = service_account.Credentials.from_service_account_file('./credentials.json')
palm.configure(credentials=credentials)
print([m for m in palm.list_models() ]) # should work!
但是,我支持这样的想法:某些东西已损坏,或者生成ai库中存在错误,这个问题只发生在我的本地 Jupiter 内核中,但运行 python 脚本、curl 命令甚至 Google Colab,就像你可以在快速启动效果很好。 https://colab.research.google.com/github/google/generative-ai-docs/blob/main/site/en/tutorials/text_quickstart.ipynb 你只需要传递一个 api_key 即可。
我认为 python/pip 版本有问题,最终切换到不同的设备,第一次尝试一切都运行良好。