ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Composio × LlamaIndex:使用 LlamaIndexProvider 将 1000+ Composio 工具接入 FunctionAgent

Composio × LlamaIndex:使用 LlamaIndexProvider 将 1000+ Composio 工具接入 FunctionAgent Composio × LlamaIndex使用 LlamaIndexProvider 将 1000 Composio 工具接入 FunctionAgent【免费下载链接】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 官方 LlamaIndex 集成包composio-llamaindex的安装、配置与实战用法如何通过LlamaIndexProvider把 Composio 的 1000 应用工具适配为 LlamaIndex 的FunctionTool并直接交给FunctionAgent驱动执行。读完本文你将掌握从环境准备、会话创建到工具获取、Agent 运行含按 slug/toolkit/search 定向取工具的完整链路并理解其底层包装原理与类型推断机制。一、composio-llamaindex 是什么composio-llamaindex是 Composio 为 LlamaIndex 框架提供的官方适配层其职责可以用一句话概括见 python/providers/llamaindex/README.mdAdapts Composio tools to LlamaIndexsFunctionToolformat so a LlamaIndex agent can call 1000 apps through a single Composio session.即在 Composio 的通用工具模型与 LlamaIndex 的FunctionTool之间建立桥接Composio 负责工具发现、鉴权与执行LlamaIndex 的FunctionAgent负责编排与工具调用决策最终每个工具的实际执行仍由 Composio 完成。从包元数据看python/providers/llamaindex/pyproject.toml包名composio-llamaindex版本0.21.1依赖llama_index0.14.23与composio核心 SDK 会自动随依赖安装支持 Python3.10,4。二、安装与环境配置2.1 安装依赖使用 pip 一次性安装四个包pip install composio composio-llamaindex llama-index llama-index-llms-openai其中composio核心 SDK提供Composio客户端类与工具模型composio-llamaindex本集成包提供LlamaIndexProviderllama-indexLlamaIndex 主框架llama-index-llms-openai本示例使用的 OpenAI LLM 接入。2.2 配置 API Key需要两个环境变量export COMPOSIO_API_KEYxxxxxxxxx export OPENAI_API_KEYxxxxxxxxxCOMPOSIO_API_KEYComposio 平台密钥。核心 SDK 在初始化Composio时会读取它若未提供会抛出ApiKeyNotProvidedError见 python/composio/sdk.pyOPENAI_API_KEY供OpenAI(modelgpt-5.2)使用。若使用.env文件可参考仓库中的演示脚本 python/providers/llamaindex/llamaindex_demo.py它通过dotenv.load_dotenv()自动加载环境变量。三、快速开始把工具交给 FunctionAgent原文档的 Quickstart 演示了最核心的用法创建会话 → 获取工具 → 交给FunctionAgent。import asyncio from composio import Composio from composio_llamaindex import LlamaIndexProvider from llama_index.core.agent.workflow import FunctionAgent from llama_index.llms.openai import OpenAI composio Composio(providerLlamaIndexProvider()) llm OpenAI(modelgpt-5.2) # Each session is scoped to one of your users session composio.create(user_iduser_123) tools session.tools() agent FunctionAgent(toolstools, llmllm) async def main(): result await agent.run( user_msgSend an email to johnexample.com with the subject Hello and body Hello from Composio! ) print(result) asyncio.run(main())关键点拆解Composio(providerLlamaIndexProvider())向核心 SDK 注入 LlamaIndex 适配器。SDK 会根据 provider 自动推断泛型类型Composio[FunctionTool, list[FunctionTool]]详见下文「类型推断」一节。composio.create(user_iduser_123)创建会话。会话是工具发现、鉴权与执行的单元且按用户隔离——user_id指向你的某个终端用户每个用户拥有各自独立的授权上下文。create是composio.sessions.create的顶层快捷方式见 python/composio/sdk.py。session.tools()获取该会话下可用的全部工具返回list[FunctionTool]。FunctionAgent(toolstools, llmllm)LlamaIndex 的 Agent Workflow 直接消费这些工具。agent.run(...)异步运行。注意FunctionAgent.run是协程必须用asyncio.run驱动。运行时LlamaIndex 负责工具选择与参数编排每个工具内部通过 Composio 执行返回结果以 dict 形式含data/error/successful等字段回传给 Agent。四、定向获取工具slug / toolkit / search除session.tools()全量获取外SDK 的composio.tools.get(...)支持三种定向查询方式这在集成测试 python/tests/test_type_inference_llamaindex.py 中有完整体现# 方式一按工具 slug精确指定某个工具 tools composio.tools.get( user_idtest, slugGITHUB_CREATE_REPO, ) # 方式二按 toolkit某个应用的整个工具集 tools composio.tools.get( user_idtest, toolkits[github], ) # 方式三按关键词搜索 tools composio.tools.get( user_idtest, searchgithub repository, ) # 方式四传入多个 slug 列表 tools composio.tools.get( user_idtest, tools[GITHUB_CREATE_REPO, GITHUB_GET_USER], )四种查询方式返回类型完全一致list[FunctionTool]。仓库自带的演示脚本 python/providers/llamaindex/llamaindex_demo.py 给出了一个可运行的真实示例——让 Agent 为 GitHub 用户 star 一个仓库import asyncio import dotenv from composio_llamaindex import LlamaIndexProvider from llama_index.core.agent.workflow import FunctionAgent from llama_index.llms.openai import OpenAI from composio import Composio # Load environment variables from .env dotenv.load_dotenv() # Setup client llm OpenAI(modelgpt-5) composio Composio(providerLlamaIndexProvider()) # Get All the tools tools composio.tools.get( user_iddefault, tools[GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER], ) workflow FunctionAgent( toolstools, llmllm, system_promptYou are an agent that perform github actions., ) async def main(): result await workflow.run( user_msgHello! I would like to star a repo composiohq/composio on GitHub ) print(result) if __name__ __main__: asyncio.run(main())该示例额外展示了system_prompt参数的使用可在FunctionAgent中自定义 Agent 的行为约束。五、底层原理LlamaIndexProvider 如何包装工具要理解这套集成的工作方式关键是阅读LlamaIndexProvider的实现 python/providers/llamaindex/composio_llamaindex/provider.py。5.1 类定义与泛型契约class LlamaIndexProvider( AgenticProvider[FunctionTool, t.List[FunctionTool]], namellamaindex, ):它继承自AgenticProvider见 python/composio/core/provider/agentic.py泛型参数[FunctionTool, t.List[FunctionTool]]声明单个包装产物是FunctionTool工具集合是list[FunctionTool]。namellamaindex会通过__init_subclass__注册为 provider 名称并被 SDK 用于请求头的 provider 标识见 python/composio/sdk.py。AgenticProvider本身只定义契约wrap_tool(tool, execute_tool) - TTool包装单个工具wrap_tools(tools, execute_tool) - TToolCollection批量包装。具体实现由各 provider 完成LlamaIndexProvider即实现了这两个方法。5.2 wrap_tool 的完整流程wrap_tool的核心逻辑分为四步def wrap_tool(self, tool, execute_tool) - FunctionTool: schema_params, keywords substitute_reserved_python_keywords( schematool.input_parameters ) def function(**kwargs): kwargs reinstate_reserved_python_keywords( requestkwargs, keywordskeywords ) return execute_tool( slugtool.slug, argumentsnormalize_tool_arguments(kwargs) ) action_func types.FunctionType( function.__code__, globalsglobals(), nametool.slug, closurefunction.__closure__, ) action_func.__signature__ Signature( parametersget_signature_format_from_schema_params( schema_paramsschema_params, skip_defaultself.skip_default, ) ) action_func.__doc__ tool.description return FunctionTool.from_defaults( action_func, nametool.slug, descriptiontool.description, )第 1 步关键字替换keyword substitutionschema_params, keywords substitute_reserved_python_keywords(schematool.input_parameters)Composio 工具的参数名来自各应用的 API Schema可能包含 Python 保留字如from、class、import。该函数会把保留字替换为合法标识符并记录映射关系keywords供执行前还原。第 2 步定义执行闭包def function(**kwargs): kwargs reinstate_reserved_python_keywords(requestkwargs, keywordskeywords) return execute_tool(slugtool.slug, argumentsnormalize_tool_arguments(kwargs))reinstate_reserved_python_keywords把替换过的参数名还原为工具真实期望的参数名normalize_tool_arguments对参数做防御性归一化——即使 LLM 把 payload 以字符串形式传入也会被强制转换为 dict源码注释明确提到这是 issue #2406 的修复execute_tool即AgenticProviderExecuteFn按slug执行工具返回{data, error, successful}结构见 python/composio/core/provider/agentic.py。第 3 步动态生成函数并绑定签名action_func types.FunctionType( function.__code__, globalsglobals(), nametool.slug, closurefunction.__closure__, ) action_func.__signature__ Signature( parametersget_signature_format_from_schema_params( schema_paramsschema_params, skip_defaultself.skip_default, ) )用types.FunctionType复制函数对象并命名为工具 slug如GITHUB_STAR_A_REPOSITORY_FOR_THE_AUTHENTICATED_USER使 Agent 看到的工具名与 Composio slug 一致手动为函数注入__signature__签名参数由工具的 JSON Schema 生成get_signature_format_from_schema_params从而让 LlamaIndex 与 LLM 能正确解析每个工具的参数skip_defaultself.skip_default控制是否跳过带默认值的参数。skip_default来自BaseProvider.__init__读取的schema_config.skip_defaults配置见 python/composio/core/provider/base.py默认关闭。第 4 步包装为 FunctionToolaction_func.__doc__ tool.description return FunctionTool.from_defaults( action_func, nametool.slug, descriptiontool.description, )把动态函数、slug 名称与工具描述一起交给FunctionTool.from_defaults生成标准的 LlamaIndexFunctionTool对象。wrap_tools则简单地对工具列表逐一遍历调用wrap_tool。六、类型推断Composio[FunctionTool, list[FunctionTool]]由于Composio是泛型类见 python/composio/sdk.py其TTool/TToolCollection会根据传入的 provider 自动推断传入LlamaIndexProvider()即推断为FunctionTool/list[FunctionTool]因此composio.tools.get(...)与session.tools()的返回值类型对类型检查器完全可见。仓库通过 python/tests/test_type_inference_llamaindex.py 对这一点做了静态验证该文件不参与运行时执行而是交给 mypy 等类型检查器分析# 显式标注 composio: Composio[FunctionTool, list[FunctionTool]] Composio( providerLlamaIndexProvider() ) tools composio.tools.get(user_idtest, toolkits[github]) assert_type(tools, list[FunctionTool]) # 隐式推断 composio Composio(providerLlamaIndexProvider()) tools composio.tools.get(user_idtest, toolkits[github]) assert_type(tools, list[FunctionTool])运行方式mypy tests/test_type_inference_llamaindex.py。该文件覆盖了 toolkit 查询、slug 查询、多工具列表查询、search 搜索四种路径且同时验证显式标注与隐式推断两种写法确保list[FunctionTool]的类型契约在四种查询方式下都不变。七、会话Session与用户作用域Composio 的会话模型是本集成的核心概念之一值得单独说明每个session绑定一个user_id即你的某个终端用户会话决定了该用户可发现的工具、可使用的授权连接以及执行上下文composio.create(user_id...)是composio.sessions.create的快捷方式composio.use(...)则用于复用已有会话见 python/composio/sdk.py。在真实产品中你会为每个注册用户分配独立的user_id如user_123从而保证多用户环境下授权与执行隔离在本地快速验证时可以使用如default这样的固定值演示脚本即如此。八、常见问题与排查建议ApiKeyNotProvidedError未设置COMPOSIO_API_KEY。核心 SDK 在Composio.__init__中直接检查环境变量并抛错python/composio/sdk.py此时无法进入后续流程。工具执行结果结构与预期不符execute_tool的返回始终是{data, error, successful}结构见 python/composio/core/provider/agentic.py。读取结果时应优先取data字段并检查successful判定成败。参数名含 Python 保留字无需手动处理provider 内部已自动完成替换与还原substitute_reserved_python_keywords/reinstate_reserved_python_keywords。LLM 传入字符串化参数normalize_tool_arguments会在执行前做防御性类型归一化无需在 Agent 侧额外处理。Agent 无法触发工具确认工具是通过session.tools()或composio.tools.get(...)获取并传入FunctionAgent(tools...)的且工具对应的应用连接已完成授权。九、小结composio-llamaindex的核心价值在于开发者无需为每个应用手写 LlamaIndex 工具只需一次Composio(providerLlamaIndexProvider())初始化即可把 Composio 的 1000 工具以标准FunctionTool形式交给FunctionAgent使用。理解其wrap_tool的四步包装流程关键字替换 → 闭包执行 → 签名注入 → FunctionTool 包装有助于在遇到参数异常、类型问题或执行失败时快速定位原因。相关源码入口实现 python/providers/llamaindex/composio_llamaindex/provider.py、演示 python/providers/llamaindex/llamaindex_demo.py、类型测试 python/tests/test_type_inference_llamaindex.py、SDK 入口 python/composio/sdk.py。【免费下载链接】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),仅供参考
返回列表