crewAI ComposioTool 完全指南:让 AI Agent 通过 Composio 调用海量第三方 SaaS 工具
本文基于 crewAI 仓库中 composio_tool/README.md 及其配套实现 composio_tool.py 编写,完整覆盖 ComposioTool 的安装认证、三种初始化方式(from_action、from_app + tags / use_case)、Agent 与 Task 的实战示例,并深入源码剖析工具封装、账号连接校验与参数 Schema 生成的底层机制,帮助你将 Composio 生态中的 SaaS 工具(如 GitHub、Gmail 等)无缝接入 crewAI Agent。
什么是 ComposioTool
ComposioTool 是 crewAI 对 Composio 工具集(toolset)的封装层,使 Agent 能够访问 Composio SDK 提供的各类第三方工具。从源码注释可以看到,它的类文档字符串非常简洁:Wrapper for composio tools.,位于 composio_tool.py。
其定位可以概括为三点:
- 桥接角色:把 Composio 的
Action(一次可执行的第三方 API 操作)包装成 crewAI 的BaseTool,让 LLM 能够以标准函数调用的方式触发; - Schema 自动转换:从 Composio 拉取 Action 的 JSON Schema,并转成 Pydantic 模型作为工具的
args_schema,使工具参数可被 LLM 正确填充和校验; - 认证前置校验:在工具创建阶段就检查目标应用是否已有已连接账号(connected account),避免运行期才暴露认证问题。
ComposioTool 在包内通过 crewai_tools/init.py 与 tools/init.py 两处导出,因此既可以用 from crewai_tools import ComposioTool,也可以从 crewai_tools.tools 子包导入。
安装与认证
按照原文档说明,安装需要两个依赖:
pip install composio-core
pip install 'crewai[tools]'
其中 composio-core 的最低版本约束可以在 pyproject.toml 中确认:
composio-core = [
"composio-core>=0.6.11.post1",
]
也就是说,crewai[tools] 的 composio-core 可选依赖实际对应的是 pip install 'crewai-tools[composio-core]' 这一依赖组(版本下限为 0.6.11.post1)。
安装完成后,认证有两种方式(原文档原文):
- 运行
composio login完成交互式登录; - 或者将 Composio API Key 导出为环境变量
COMPOSIO_API_KEY。
从源码看,COMPOSIO_API_KEY 不是一个"建议配置",而是被显式声明为必填环境变量:ComposioTool 的 env_vars 字段默认值中注册了 EnvVar(name="COMPOSIO_API_KEY", description="API key for Composio services", required=True),见 composio_tool.py。crewAI 的 BaseTool 基类(base_tool.py)中定义了 EnvVar 模型(name / description / required / default 四个字段)以及 env_vars 字段,Agent 运行时可以据此提示用户补齐缺失的环境变量。
三种工具初始化方式
方式一:from_action —— 精确指定单个 Action
当你确切知道要用哪个 Action 时,直接传入枚举:
from composio import Action
from crewai_tools import ComposioTool
from crewai import Agent, Task
tools = [ComposioTool.from_action(action=Action.GITHUB_ACTIVITY_STAR_REPO_FOR_AUTHENTICATED_USER)]
注意返回值是一个单工具实例,示例中用列表包裹是因为 Agent(tools=...) 接收列表。
方式二:from_app + tags —— 按标签筛选
不确定具体 Action 名时,可以按应用加标签过滤:
from composio import App
from crewai_tools import ComposioTool
tools = ComposioTool.from_app(App.GITHUB, tags=["important"])
方式三:from_app + use_case —— 按自然语言用例检索
最贴近 LLM 使用习惯的方式,用一句自然语言描述需求来检索相关 Action:
tools = ComposioTool.from_app(App.GITHUB, use_case="Star a github repository")
从源码实现看(composio_tool.py),from_app 有严格的前置校验:
| 校验规则 | 触发异常 |
|---|---|
未提供任何 app(len(apps) == 0) |
ValueError("You need to provide at least one app name") |
use_case 与 tags 同时为 None |
ValueError("Both 'use_case' and 'tags' cannot be None") |
use_case 与 tags 同时提供 |
ValueError("Cannot use both 'use_case' and 'tags' to filter the actions") |
检索路径也不同:use_case 走 toolset.find_actions_by_use_case(*apps, use_case=use_case),tags 走 toolset.find_actions_by_tags(*apps, tags=tags),两者最终都会对每个命中的 Action 递归调用 cls.from_action(action=action, **kwargs),因此 from_app 的返回值是 list[ComposioTool],可直接赋给 Agent 的 tools 参数。
完整实战示例:让 Agent Star 一个 GitHub 仓库
以下示例完整继承自原文档,演示了"初始化工具 → 定义 Agent → 执行 Task"的全流程:
-
初始化工具集(见上一节三种方式任选其一);
-
定义 Agent:
crewai_agent = Agent(
role="Github Agent",
goal="You take action on Github using Github APIs",
backstory=(
"You are AI agent that is responsible for taking actions on Github "
"on users behalf. You need to take action on Github using Github APIs"
),
verbose=True,
tools=tools,
)
- 执行 Task:
task = Task(
description="Star a repo ComposioHQ/composio on GitHub",
agent=crewai_agent,
expected_output="if the star happened",
)
task.execute()
Composio 侧更完整的工具目录可以在其官方工具目录中查阅(原文档指向 Composio 工具目录页,此处不重复外链)。
源码剖析:from_action 如何把一个 Action 变成 crewAI 工具
from_action(composio_tool.py)是整个封装的核心,执行链路可以拆成六步:
-
构建 ToolSet:实例化
ComposioToolSet(),并容忍传入字符串——如果action不是Action实例,会自动执行Action(action)转换; -
账号连接校验:调用
_check_connected_account(composio_tool.py)。若该 Action 标记了no_auth则直接放行;否则拉取toolset.client.connected_accounts.get(),检查tool.app是否出现在已连接账号的appUniqueId列表中,未命中则抛出:RuntimeError( f"No connected account found for app `{tool.app}`; " f"Run `composio add {tool.app}` to fix this" )也就是说,报错信息本身就给出了修复命令
composio add <app>; -
拉取 Schema:
toolset.get_action_schemas(actions=[action])拿到该 Action 的参数 Schema,并model_dump(exclude_none=True)序列化为字典; -
构造执行闭包:内部定义的
function(**kwargs)调用toolset.execute_action(action=Action(schema["name"]), params=kwargs, entity_id=entity_id)。注意entity_id从kwargs中弹出(kwargs.pop("entity_id", DEFAULT_ENTITY_ID)),默认取 Composio 的DEFAULT_ENTITY_ID常量,因此调用方仍可通过ComposioTool.from_action(action=..., entity_id="your-entity")指定自定义实体; -
注入元信息:将闭包的
__name__与__doc__分别设置为 Schema 中的name与description,保证日志与提示词中能显示真实工具名; -
实例化
ComposioTool:name、description取自 Schema,args_schema通过json_schema_to_model(action_schema.parameters.model_dump(exclude_none=True))将 JSON Schema 转成 Pydantic 模型——这就是 LLM 得以"看懂"工具参数、并让 crewAI 框架在调用前完成参数校验的关键一步。
运行时行为:_run 只做纯委托
ComposioTool 的运行时逻辑极为薄(composio_tool.py):
def _run(self, *args: t.Any, **kwargs: t.Any) -> t.Any:
"""Run the composio action with given arguments."""
return self.composio_action(*args, **kwargs)
它只是把参数原样透传给 from_action 阶段构造的闭包,最终落到 ComposioToolSet.execute_action。从源码结构看,这意味着所有认证、重试、网络请求细节都留在 Composio SDK 内部,crewAI 侧只负责"Schema 描述 + 执行委托"。
与 BaseTool 的关系
ComposioTool 继承自 base_tool.py 中的 BaseTool。BaseTool 通过 Pydantic 约束了 name、description、env_vars、args_schema、result_schema 等字段,并提供工具类型注册(__init_subclass__ 中写入 _TOOL_TYPE_REGISTRY)。因此 ComposioTool 无需自己实现任何序列化与注册逻辑,只需提供 composio_action 字段与 _run 方法即可获得完整的 crewAI 工具行为(可被 Agent 调用、可随 Crew 序列化、环境变量会被统一检查)。
关键行为速查
| 项 | 说明 | 依据 |
|---|---|---|
from_action(action=...) |
返回单个 ComposioTool 实例;支持传字符串自动转 Action |
composio_tool.py |
from_app(*apps, tags=...) / from_app(*apps, use_case=...) |
返回 list[ComposioTool];tags 与 use_case 必须且只能提供其一 |
同上 L96-L127 |
entity_id |
可作为 from_action 的 keyword 参数透传,默认 DEFAULT_ENTITY_ID |
同上 L71 |
| 必填环境变量 | COMPOSIO_API_KEY(required=True) |
同上 L14-L22 |
| 未连接账号时报错 | RuntimeError,提示执行 composio add <app> |
同上 L28-L46 |
| 依赖版本 | composio-core>=0.6.11.post1 |
pyproject.toml |
常见问题与排查思路
RuntimeError: No connected account found for app ...:说明该应用(如 GitHub)在 Composio 侧还没有已授权账号。按报错提示执行composio add <app>完成连接后重试;这是创建工具时抛出的,属于 fail-fast 设计,便于尽早发现认证缺失。ValueError: Both 'use_case' and 'tags' cannot be None:调用from_app时忘了提供筛选条件,二选一地补上tags或use_case即可。- 工具参数 LLM 填错:检查
args_schema是否正确生成——它直接来自toolset.get_action_schemas的返回,如果 Composio 侧 Schema 变更,可重新拉取确认字段名与类型。 - 认证方式选择:无头/CI 环境建议使用
COMPOSIO_API_KEY环境变量(这也是env_vars声明的必填项);本地开发可以用composio login交互式登录。
延伸阅读
- 官方文档站中的 Composio Tool 页面 介绍了基于
composio-crewaiProvider 与ComposioSession 的较新接入路径(session.tools()、手动authorize等),与本文 README 描述的composio-coreSDK 路径并存,可按项目实际选用的 SDK 版本参考; - 工具基类实现:base_tool.py,其中
EnvVar(L96-L100)与BaseTool(L103 起)定义了本文涉及的全部字段契约; - 本模块源码与文档原文:composio_tool.py、README.md。
atomcodeClaude Code 的开源替代方案。连接任意大模型,编辑代码,运行命令,自动验证 — 全自动执行。用 Rust 构建,极致性能。 | An open-source alternative to Claude Code. Connect any LLM, edit code, run commands, and verify changes — autonomously. Built in Rust for speed. Get StartedRust0623
Hy4-previewHy4 preview 是由腾讯混元团队研发的新一代混合专家(MoE)旗舰模型。模型总参数量 770B,每个 token 激活 49B,主干共包含78层,第一层采用标准 FFN,其余 77 层均为 MoE 结构,每层包含 256 个路由专家与 1 个共享专家,每个 token 激活 top-8 路由专家及共享专家。主干之外原生内置 1 层 MTP(总参数量 10B,激活 0.7B)以支持投机解码。Python00
GLM-5.3GLM-5.3 与 GLM-5.2 使用相同的基座模型——所有提升均来自后训练。与 GLM-5.2 相比,它在复杂编程和长程任务上的表现显著提升。Jinja00
GLM-5.3-FlashGLM-5.3-Flash (320B-A18B),是GLM-5系列的首个原生多模态模型。320B总参数,能力超过GLM-5.2Jinja00
Spark-X2.5-4BSpark-X2.5-4B 旨在让强大的 AI 更实用、更高效、更易获得。在广泛日常任务中表现强劲,涵盖对话、写作、翻译、推理、编码、工具调用以及智能体工作流,并在同等规模的开源模型中取得领先成绩。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00