Composio API 返回 400 No connected account found for this user and toolkit 怎么处理
【免费下载链接】composioComposio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio
在调用 Composio API 执行工具时,如果请求返回 HTTP 400 且错误信息为No connected account found for this user and toolkit,含义很直接:该user_id还没有连接到目标 toolkit,Composio 找不到可用于执行工具的凭据。错误对象的suggested_fix字段也会给出同样的提示:Connect the user to the toolkit first(文档示例):
{ "error": { "message": "No connected account found for this user and toolkit", "status": 400, "request_id": "req_abc123def456", "suggested_fix": "Connect the user to the toolkit first" } }Composio 中所有工具都按用户作用域隔离:每个用户用自己的userID连接各自的账号(Gmail、GitHub、Slack 等),凭据以该userID存储。因此这个错误的修复路径就是两件事——先确认该用户确实没有可用连接,再为该用户创建连接,最后用ACTIVE状态验证连接可用后重试原请求。相关文档:Errors、Authenticating Tools、Authentication。
确认连接状态:先排除"有连接但不可用"
不要假设错误一定意味着"从未连接过"。一个已存在的连接也可能处于不可用状态(EXPIRED、FAILED、INACTIVE),只有ACTIVE状态的连接才能执行工具。先用 SDK 按user_id过滤查询该用户的连接(示例为文档中的写法,user_id和 auth config ID 换成你自己的值):
from composio import Composio composio = Composio(api_key="your_api_key") # 按 user_id、auth config 和状态过滤(只查 ACTIVE 的账号) filtered_connections = composio.connected_accounts.list( user_ids=["user_123"], auth_config_ids=["your_auth_config_id"], statuses=["ACTIVE"] ) for connection in filtered_connections.items: print(f"{connection.id}: {connection.status}")import { Composio } from '@composio/core'; const composio = new Composio({ apiKey: 'your_api_key' }); // 按 userId、authConfigId 和状态过滤(只查 ACTIVE 的账号) const filteredConnections = await composio.connectedAccounts.list({ userIds: ['user_123'], authConfigIds: ['your_auth_config_id'], statuses: ['ACTIVE'] }); filteredConnections.items.forEach(connection => { console.log(`${connection.id}: ${connection.status}`); });判断方法:
- 查不到任何连接:用户确实还没连接过该 toolkit,进入下一步创建连接。
- 查到了连接但状态不是 ACTIVE:按文档中的连接状态表处理——
INITIATED(OAuth 流程未完成,10 分钟后自动过期)把用户重新引导到 Connect Link 完成授权;EXPIRED或FAILED需要让用户重新授权,并查看连接上的status_reason字段获取具体原因;INACTIVE是通过 API 手动禁用的,需要通过 API 或 dashboard 重新启用。
另外检查一个容易被忽略的点:创建连接时传的user_id和执行工具时传的user_id是否完全一致。连接是按userID存储的,两个值不一致等价于"这个用户没有连接"。文档建议userID使用稳定的标识(如数据库 UUID 或主键),避免使用可能变化的邮箱地址。
为该用户创建连接
确认没有可用连接后,为该用户创建连接。根据调用方式有两条路径:
使用 sessions 的写法
如果你的 agent 使用 sessions,连接可以直接通过session.authorize()按需生成 Connect Link,用于引导、设置页或任务前检查:
session = composio.create(user_id="user_123") connection_request = session.authorize("gmail") # 把这个 URL 发给用户(邮件、应用内通知等) print(connection_request.redirect_url)import { Composio } from '@composio/core'; const composio = new Composio({ apiKey: 'your_api_key' }); // ---cut--- const session = await composio.create("user_123"); const connectionRequest = await session.authorize("gmail"); // 把这个 URL 发给用户(邮件、应用内通知等) console.log(connectionRequest.redirectUrl);"gmail"换成报错信息中对应的 toolkit slug。用户在该托管链接上完成登录后,Composio 创建 connected account 并存储、刷新其 token,凭据不经过你的应用。
直接执行工具(direct execution)的写法
如果你的代码直接调用composio.tools.execute(),用connected_accounts.link()生成 Connect Link:
from composio import Composio composio = Composio(api_key="your_api_key") # 使用 dashboard 中的 AUTH CONFIG ID auth_config_id = "your_auth_config_id" # 应用中每个用户使用唯一标识 user_id = 'user-1349-129-12' connection_request = composio.connected_accounts.link( user_id=user_id, auth_config_id=auth_config_id, callback_url='https://your-app.com/callback' ) redirect_url = connection_request.redirect_url print(f"Visit: {redirect_url} to authenticate your account")import { Composio } from '@composio/core'; const composio = new Composio({apiKey: "your_api_key"}); // 使用 dashboard 中的 AUTH CONFIG ID const authConfigId = 'your_auth_config_id'; // 应用中每个用户使用唯一标识 const userId = 'user-1349-129-12'; const connectionRequest = await composio.connectedAccounts.link(userId, authConfigId, { callbackUrl: 'https://your-app.com/callback' }); const redirectUrl = connectionRequest.redirectUrl; console.log(`Visit: ${redirectUrl} to authenticate your account`);代码中需要替换的占位值:your_api_key是你的 Composio API key;your_auth_config_id是 dashboard Auth Configs 页面对应 toolkit 的 Auth Config ID(如果还没有,先在该 toolkit 下创建一个 Auth Config,同一 auth config 可复用于所有用户);user_id必须是与后续工具调用一致的该用户标识;callback_url是用户完成授权后返回的地址,可省略。
两个需要注意的行为:
link()默认拒绝为同一用户、同一 auth config 创建第二个活跃连接。如果用户确实需要在该 auth config 下再连一个账号(如工作 Gmail 和个人 Gmail),Python 传allow_multiple=True、TypeScript 传allowMultiple: true。- 如果配置了 callback URL,授权成功后的重定向会带有查询参数:
status(success或failed)和connected_account_id(新建连接的 ID)。用这两个参数判断连接是否真正完成,而不是只看重定向发生。
验证连接可用并重试
连接流程完成后,回到上一节的connected_accounts.list()查询(不带statuses=["ACTIVE"]过滤,改为按user_id和auth_config_id查,或直接用connected_accounts.get("your_connected_account_id")取单条),确认状态为ACTIVE:
connected_account = composio.connected_accounts.get("your_connected_account_id") print(f"Status: {connected_account.status}")只有ACTIVE状态的连接可用于执行工具。状态确认后可重试原来报错的工具调用;如果再次报错且message不同(例如工具执行层面外部服务返回的错误),则属于其他错误类别,按 Errors 中的错误类型表继续对照。
相关错误与限制
request_id:错误对象中的request_id是本次请求的唯一标识,联系 Composio 支持时带上它。- 连接被删除或不存在:如果场景里是显式传了
connected_account_id却报 connected account 不存在,对应的是connectedAccountId不存在或已被删除(deleted),需要重新创建连接,而不是重复执行工具。 - API key 问题要区分开:
401(无有效 API key)和403(key 无权限)是认证类错误,与本文的400 No connected account是不同问题;400在这里表示请求信息本身不被接受(缺少可用的连接),而不是 key 无效。 - dashboard 验证:如果项目配置了 callback identity verification(verifier URL),从 dashboard 发起的连接无法完成,需要用应用自己的流程测试。
更多账号管理操作(刷新、启停、吊销、删除)见 Connected Accounts API。
【免费下载链接】composioComposio powers 1000+ toolkits, tool search, context management, authentication, and a sandboxed workbench to help you build AI agents that turn intent into action.项目地址: https://gitcode.com/GitHub_Trending/co/composio
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考