Cloud Run运行子代理时出现Project ID缺失错误求助
Cloud Run部署ADK子代理时出现Project ID缺失问题
问题描述
我有一个ADK解决方案,采用路由代理架构,路由代理包含三类组件:作为工具的函数、作为工具的代理,以及用于转接用户请求的子代理。所有代理在本地环境运行时均正常工作,但部署到Cloud Run后,路由代理可正常运行,子代理却无法调用,报错提示缺少Project ID。所有代理均通过google.adk.agents Agent类实例化。
错误信息
File "/usr/local/lib/python3.13/site-packages/litellm/llms/vertex_ai/vertex_llm_base.py", line 432, in get_access_token raise ValueError("Could not resolve project_id") ValueError: Could not resolve project_id
排查与尝试
查看vertex_llm_base.py中的get_access_token函数后发现,project_id需要作为凭证令牌的一部分传入。我尝试在用于授权请求的JWT中添加project_id声明,但问题仍未解决。
JWT负载生成代码:
def generate_jwt_payload(service_account_email: str, resource_url: str) -> str: iat = datetime.datetime.now(tz=datetime.timezone.utc) exp = iat + datetime.timedelta(seconds=3600) payload = { "iss": service_account_email, "sub": service_account_email, "aud": resource_url, "iat": int(iat.timestamp()), "exp": int(exp.timestamp()), "project_id": service_account_email.split('@')[1].split('.')[0], # 从服务账号邮箱提取Project ID } return json.dumps(payload)
目前怀疑问题可能出在服务间凭证缓存或内部令牌传递环节,但无法确定具体原因,陷入瓶颈。
以下是令牌创建的完整代码细节(基于Python客户端库):
def sign_jwt(target_sa: str, resource_url: str) -> str: source_credentials, project_id = google.auth.default() # 使用源凭证初始化IAM凭证客户端 iam_client = iam_credentials_v1.IAMCredentialsClient(credentials=source_credentials) # 生成服务账号资源名称 name = "projects/-/serviceAccounts/" + target_sa # 创建并签名JWT负载 payload = generate_jwt_payload(target_sa, resource_url) # 调用IAM凭证API完成JWT签名 response = iam_client.sign_jwt(name=name, payload=payload) return response.signed_jwt
服务账号资源名称是按文档格式组装的,生成的格式示例为:projects/-/serviceAccounts/my-service-account@my-project.iam.gserviceaccount.com,其中的连字符为通配符,而非使用iam_client.service_account_path(project, target_sa)方法生成名称时传入的具体project_id。
内容的提问来源于stack exchange,提问作者sdmonkey
相关产品推荐
相关产品推荐

