composio-crewai 集成实战:让 CrewAI Agent 通过 Composio 会话调用 1000+ 应用工具
【免费下载链接】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 官方 CrewAI 提供器(composio-crewai)的完整集成方案:它将 Composio 平台上的 1000+ 应用工具适配为 CrewAI 的BaseTool格式,使 CrewAI 的Agent可以在同一个 Composio 会话内跨应用执行真实操作(发邮件、操作 GitHub、管理日历等)。读完本文,你将掌握安装配置、会话创建、工具注入、参数校验与结构化错误处理的全链路实操方法,并能理解其底层适配原理。
背景:为什么需要 CrewAI 适配层
CrewAI 的 Agent 依赖crewai.tools.BaseTool这一统一工具协议来执行动作,而 Composio 平台的工具以平台自身的格式暴露(包含 JSON Schema 输入参数、工具 slug 等元数据),两者无法直接互通。composio-crewai包提供的CrewAIProvider正是二者之间的桥梁——它把每个 Composio 工具包装成一个BaseTool实例,且所有工具共享同一个 Composio 会话(Session)执行,因此你的 Crew 可以跨 Gmail、GitHub、Slack 等 1000+ 应用连贯地完成多步任务,而无需为每个应用单独写适配代码。
该适配器基于 Composio SDK 统一的AgenticProvider抽象实现(见 python/composio/core/provider/agentic.py),该基类定义了wrap_tool与wrap_tools两个核心契约,各框架提供器只需实现自己的包装逻辑即可接入。
安装与依赖
在python/providers/crewai/pyproject.toml中定义了该包的核心依赖约束:
crewai>=1.15.7,<2.0.0composio(同仓库 SDK,本地安装时即依赖主包)requires-python = ">=3.10,<4"
实际使用中,一条命令即可完成全部安装:
pip install composio composio-crewai crewai安装完成后,还需在环境中配置两个密钥:COMPOSIO_API_KEY(用于认证 Composio 平台服务)和OPENAI_API_KEY(用于 CrewAI 内置的 LLM 调用)。通过环境变量注入即可:
export COMPOSIO_API_KEY=xxxxxxxxx export OPENAI_API_KEY=xxxxxxxxx快速开始:五分钟跑通一个 Crew
核心流程只有四步:创建 Composio 客户端(绑定 CrewAI 提供器)→ 为用户创建会话 → 拉取会话工具 → 注入 Agent 并让 Crew 执行任务。
from crewai import Agent, Crew, Task from composio import Composio from composio_crewai import CrewAIProvider composio = Composio(provider=CrewAIProvider()) # Each session is scoped to one of your users session = composio.create(user_id="user_123") tools = session.tools() agent = Agent( role="Email Agent", goal="Send emails on behalf of the user", backstory="You are an AI agent that sends emails using Gmail.", tools=tools, llm="gpt-5.2", ) task = Task( description="Send an email to john@example.com with the subject 'Hello' and body 'Hello from Composio!'", agent=agent, expected_output="Confirmation that the email was sent", ) crew = Crew(agents=[agent], tasks=[task]) result = crew.kickoff() print(result)关键点说明:
composio.create(user_id="user_123")返回一个会话(Session),会话与某个终端用户绑定,后续该用户的所有工具调用都在此会话上下文内完成,天然支持多用户隔离;session.tools()返回该会话可用工具,且这些工具已经过CrewAIProvider包装成BaseTool列表,可直接塞进Agent(tools=...);- CrewAI 负责编排任务与 LLM 推理,而每个工具真正执行时,由 Composio 后端完成 Gmail 等应用的 API 调用,执行结果原样回流到 Crew 的任务输出中。
会话与工具获取的底层机制
从源码看,composio.create(...)实际创建的是ToolRouterSession(见 python/composio/core/models/tool_router_session.py),其tools()方法(同文件 L182-L209)会将提供器传入ToolsModel,再按提供器格式批量包装工具返回。也就是说,工具获取并不是一次简单的列表拉取,而是"按会话配置 + 按提供器包装"两步完成。
create()还支持丰富的高级配置参数(见 python/composio/core/models/tool_router.py 的签名重载),常用项包括:
toolkits:会话预启用的工具集,例如["GITHUB"];auth_configs/connected_accounts:预绑定认证配置或已连接账号,省去运行时授权;sandbox/workbench:沙箱与工作台配置;mcp=True:显式启用会话的 MCP 端点(返回类型升级为ToolRouterSessionWithMcp);preload:预加载工具,减少首次调用延迟。
从代码结构可以推断,默认场景下 Agent 通过原生tools()方式使用工具,MCP 属于显式可选路径。
进阶用法:按工具集(Toolkit)拉取工具
仓库内的演示脚本 python/providers/crewai/crewai_demo.py 展示了另一种常见用法——按toolkits参数按需拉取某个应用的全部工具(此处为 GitHub):
from composio_crewai import CrewAIProvider from crewai import Agent, Crew, Task from langchain_openai import ChatOpenAI from composio import Composio # Initialize tools. openai_client = ChatOpenAI() composio = Composio(provider=CrewAIProvider()) # Get All the tools tools = composio.tools.get(user_id="default", toolkits=["GITHUB"]) # Define 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, llm=openai_client, ) # Define task task = Task( description=( "Star a repo composiohq/composio on GitHub, if the action is successful " "include Action executed successfully" ), agent=crewai_agent, expected_output="if the star happened", ) my_crew = Crew(agents=[crewai_agent], tasks=[task]) result = my_crew.kickoff() print(result)这段代码与 README 快速开始的区别在于:它通过composio.tools.get(...)直接按工具集过滤(这里为 GITHUB),并且用ChatOpenAI(LangChain)作为 LLM,展示了两条工具获取路径与两种 LLM 接入方式的组合。toolkits参数同样支持传列表批量启用多个应用。
工具包装原理:从 Composio Tool 到 BaseTool
CrewAIProvider的核心实现在 python/providers/crewai/composio_crewai/providers.py。从源码看,其适配过程分四层:
- Schema 解引用(dereference):工具输入参数中若包含 JSON Schema 内部的
$ref/$defs引用,会先通过dereference_json_schema内联展开,避免引用属性被类型化为Any而失去类型信息;无法解析的悬空引用则降级为宽松的 object 类型而非直接报错; - 生成 Pydantic 模型:解引用后的 JSON Schema 交给
json_schema_to_model(见 python/composio/utils/shared.py)构建args_schema,CrewAI 据此对 Agent 传入的参数做进入工具前的校验; - 包装为
BaseTool:动态生成Wrapper(BaseTool)类,以tool.slug作为工具名、tool.description作为描述; - 执行回调:
_run内部调用execute_tool(slug=..., arguments=...)回调,把实际执行交给 Composio 会话完成。
值得注意的细节:_run在执行前还会调用normalize_tool_arguments做一次防御性归一化(见 python/composio/utils/shared.py)。这是因为部分模型或 MCP 传输层会把工具参数以 JSON 字符串形式而非 dict 传出,导致后端报 "Input should be a valid dictionary" 类错误;该函数会把None归一为空 dict、把合法 JSON 字符串解析为 dict,从而保证所有提供器行为一致。单元测试 python/tests/test_crewai_provider.py 专门验证了$ref解引用后,被引用属性在args_schema中仍保持正确的嵌套 Pydantic 模型类型。
错误处理:结构化返回而非异常抛出
README 明确给出了一条重要的工程实践:工具校验失败时不会抛异常,而是返回结构化结果:
{"successful": False, "error": "<validation message>", "data": None}也就是说,在任务输出中检查successful字段即可判断工具调用是否成功,而无需用try/except包裹调用。其实现路径从源码看有双重保障:
- 一方面,CrewAI 的
Wrapper.run捕获pydantic.ValidationError,通过parse_pydantic_error(见 python/composio/utils/pydantic.py)把校验错误转成可读的字符串,封装进上述结构; - 另一方面,
_validate_kwargs在执行前先用validate_and_serialize_tool_arguments(见 python/composio/utils/shared.py)完成参数校验与序列化,这一过程同样可能触发校验错误并被上层捕获。
此外,validate_and_serialize_tool_arguments的序列化语义也值得了解:它利用 Pydantic 模型对可选字段的None占位与model_fields_set元数据,在保留显式 null、默认值与别名映射的同时,只向后端发送应当出现的参数,避免"未传字段被写成 null"或"默认值被丢弃"两类问题。
验证与调试建议
- 仓库自带的测试 python/tests/test_crewai_provider.py 可帮助你理解包装器的 Schema 行为;若需快速体验完整链路,可直接运行 crewai_demo.py(需先配置
COMPOSIO_API_KEY与OPENAI_API_KEY); - 调试时优先检查任务输出中的
successful字段与error信息,而不是依赖框架层日志;参数形态异常(如字符串化的 JSON)已被normalize_tool_arguments兜底处理; - 若使用多用户场景,务必为每个用户创建独立会话(不同
user_id),避免跨用户串用连接与授权状态。
小结
composio-crewai以极小的接入成本把 CrewAI 与 Composio 的工具生态打通:安装两个依赖、配置两个环境变量、三行核心代码即可让 CrewAI Agent 具备跨 1000+ 应用的执行能力。其底层通过CrewAIProvider.wrap_tool完成 Schema 解引用、Pydantic 模型生成与BaseTool包装,并通过normalize_tool_arguments与validate_and_serialize_tool_arguments双重保障参数的健壮性,最终以successful结构化结果统一错误语义——这套"轻接入、重结构"的设计,让 CrewAI 团队可以专注于编排逻辑,而把工具生态与执行稳定性交给 Composio 平台。
【免费下载链接】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),仅供参考