首页
/ Composio Python SDK 开发指南:掌握代码布局、核心领域模型与完整开发检查流程

Composio Python SDK 开发指南:掌握代码布局、核心领域模型与完整开发检查流程

2026-09-09 19:52:08作者:董斯意

导读

本文基于 Composio 仓库中面向 Python SDK 开发者的技能文档(.agents/skills/python-sdk/SKILL.md)及其配套布局参考(.agents/skills/python-sdk/references/sdk-layout.md),系统梳理 python/composio 的代码结构、核心领域对象(tools、toolkits、sessions、auth configs、connected accounts 等)、工程约定与开发检查流水线。读完本文,你将掌握在 Composio 仓库中开展 Python SDK 实现与扩展工作的完整路径:从理解代码布局、定位要改的模块,到搭建开发环境、通过格式化 / 静态检查 / 类型检查 / 单测 / 类型推断验证的全套流程,并理解其与 TypeScript SDK 保持对等的跨 SDK 一致性要求。

一、技能文档定位:SDK 开发任务的入口

仓库中的 .agents/skills/ 目录为 AI Agent 与开发者提供了按领域划分的技能卡片,其中 python-sdk 技能用于实现或修改 Python SDK 行为。该技能文档明确划定了工作边界:

  • 涉及范围:python/composio 下的 tools(工具)、toolkits(工具包)、sessions(会话)、auth configs(认证配置)、connected accounts(连接账户)、client 集成以及共享的 Python 模型;
  • 使用前提:面向 Python 核心运行时 / API 工作;
  • 协作约定:当 TypeScript 端需要保持一致时,应与 python-testing(Python 测试)和 cross-sdk-parity(跨 SDK 一致性)技能配对使用;
  • 首要动作:在编辑 python/composio 之前,必须先阅读 references/sdk-layout.md——这保证了任何改动都建立在对仓库布局与工程约定的统一认知之上,而非凭感觉修改。

这一"先读布局、再动手改"的约束是技能文档的核心方法论:SDK 是大量领域对象与 provider 适配层的组合体,贸然修改很容易破坏类型契约或破坏与生成客户端(generated client)的衔接。

二、Python SDK 代码布局:五个关键区域

sdk-layout.md 将 Python 端划分为五个关键区域,是定位任何开发任务的坐标地图:

区域 路径 职责
核心 SDK python/composio/ SDK 的主实现:入口类、领域模型、客户端封装
测试 python/tests/ pytest 覆盖(单测、类型推断、schema 语义等)
Provider 包 python/providers/ 面向各 Agent 框架的适配包(OpenAI、Anthropic、LangChain 等)
脚本 python/scripts/ 发布与维护脚本(版本 bump、文档生成、provider 脚手架等)
配置 python/config/ Ruff、pytest、mypy 等工具链配置

2.1 核心 SDK:python/composio/

从目录结构看,核心 SDK 由四个部分组成:

  • client/:HTTP 客户端与类型层。其中 client/types.py 是"围绕自动生成的 composio client 类型的一层轻量包装",以类型别名形式暴露 ToolToolkitMinimalAuthConfig 以及 AuthSchemeL(认证方案字面量,如 OAUTH1OAUTH2API_KEYBASICNO_AUTHBEARER_TOKEN 等),并定义了 tool_execute_paramstool_execute_response 等请求 / 响应参数类型;
  • core/models/:领域模型层,覆盖 auth_configs.pyconnected_accounts.pytoolkits.pytools.pytriggers.pytool_router.pytool_router_session*.py(会话与会话文件)、custom_tool*.py(自定义工具)、mcp.pywebhook_events.py 等,另有 _modifiers.py_files.py_telemetry.py 等内部支撑模块;
  • core/provider/:Provider 抽象层,定义 BaseProvider、Agentic / Non-agentic provider 以及针对 OpenAI 的 _openai.py_openai_responses.py 实现;
  • utils/:工具函数,如 JSON Schema 转换、URL 安全校验、敏感文件上传路径保护、日志脱敏(redaction)、严格 schema 处理等。

2.2 SDK 入口:Composio

python/composio/sdk.py 是 SDK 的门面。Composio 是一个泛型类:

class Composio(t.Generic[TTool, TToolCollection], WithLogger):

泛型参数 TToolTToolCollection 由传入的 provider 自动推断:不传 provider 时默认使用 OpenAIProvider,此时类型为 Composio[OpenAITool, list[OpenAITool]];传入 AnthropicProvider 则自动推断为 Anthropic 的工具参数类型。这种设计让类型安全贯穿 provider 适配层,composio.tools.get() 的返回类型随 provider 变化而自动变化。

Composio.__init__ 还承担了环境探测与各领域对象的装配:

  • API Key 解析:优先取 api_key 参数,否则读环境变量 COMPOSIO_API_KEY,两者皆缺则抛出 ApiKeyNotProvidedError
  • 环境与地址:environment(默认 production)、base_url(或环境变量 COMPOSIO_BASE_URL)、timeoutmax_retries(默认 DEFAULT_MAX_RETRIES);
  • 领域对象装配:构造 toolstoolkitstriggersauth_configsconnected_accountsmcpexperimental,以及会话入口 self._sessionsToolRouter 实例)。

其中会话(Sessions)API 是推荐的规范入口,源码 docstring 中明确说明:应使用 composio.sessions(或快捷方式 composio.create / composio.use)创建会话,而 composio.tool_router 是自 0.17.0 起标记为 deprecated 的别名(python/composio/sdk.py 中使用 @te.deprecated 装饰,提示改用 sessions)。例如:

session = composio.sessions.create(user_id="user@example.com")
tools = session.tools()

2.3 配置项:SDKConfig

SDKConfig 是一个 TypedDict,集中定义了 Composio() 可接收的配置项(python/composio/sdk.py):

配置项 默认值 说明
environment production 目标 API 环境
api_key COMPOSIO_API_KEY 认证密钥
base_url COMPOSIO_BASE_URL 自定义 API 地址
timeout / max_retries 客户端默认 请求超时与重试次数
allow_tracking True 是否允许遥测
file_download_dir 工具执行结果文件下载目录
toolkit_versions latest 工具包版本:字典、全局字符串(如 '20250906_01')或省略
dangerously_allow_auto_upload_download_files False 是否开启工具执行期间的自动文件上传 / 下载
sensitive_file_upload_protection True 上传前是否拦截内置敏感路径黑名单上的本地路径
file_upload_path_deny_segments 追加到内置黑名单的路径段名
file_upload_dirs [~/.composio/temp] 自动上传允许读取的本地目录白名单;False 表示拒绝所有本地路径(URL 与内存字节不受影响),传 Sequence[str]替换默认值

其中 file_upload_dirs 的语义值得注意:允许条件基于"符号链接解析后的绝对路径位于这些目录内且按路径组件边界匹配"——/tmp/foo 允许 /tmp/foo/bar,但不允许 /tmp/foo-bar;Windows 下比较不区分大小写。这些文件上传安全参数在 ToolsToolRouter(会话)两处被一致地透传,保证自动上传策略在直接执行与会话执行两条路径上行为一致。

2.4 Provider 包:python/providers/

仓库中每个 provider 对应一个独立包(如 anthropiclangchaincrewaigeminigoogle_adkopenai_agents 等),它们将 session.tools() 的产物适配为各框架原生的工具格式。sdk-layout.md 对此给出了明确的架构纪律:provider 特定行为不得进入核心包,除非它是共享抽象的一部分——这正是"核心 SDK 保持框架无关、provider 包承担适配"的分层原则。

2.5 配置与脚本

  • python/config/ruff.toml:行宽 88(与 Black 一致),缩进 4;lint 规则集 select = ["E4", "E7", "E9", "F"]、忽略 E741,保持显式的 Pyflakes / pycodestyle 基线;
  • python/config/ 下另有 mypy.inipytest.inivulture_allowlist.py(死代码检测的允许清单)与 codecov.yml
  • python/scripts/ 承载发布与维护:bump.py(版本号 bump)、generate-docs.pycreate-provider.sh(新 provider 脚手架)等。

三、开发模式与工程约定

sdk-layout.md 明确了四条贯穿 SDK 开发的模式约束:

  1. 保留 Python 命名约定:不引入与现有风格冲突的命名习惯,保持代码库可读性与一致性;
  2. 核心不含 provider 特定行为:框架适配逻辑收敛在 providers/ 包中,除非该行为属于共享抽象的一部分,这保护了核心 SDK 的框架无关性;
  3. 优先添加本地类型,而非引入易变动的生成客户端内部实现:当只需一个小的类型化形状时,用本地类型(如 client/types.py 中的类型别名)替代直接依赖生成客户端内部细节,以降低升级生成客户端时的破坏风险。从源码看,core/models/tools.py 中的 _normalize_tool 正是这种防御性设计的体现——它将生成客户端响应"规整"为 SDK 的工具模型形状,并以 _toolkit_slug 这类函数安全解析不可信的 toolkit 元数据而不假设生成形状;
  4. 检查 TypeScript parity:对共享的 SDK 概念(tools、toolkits、sessions、auth configs 等)必须核对 TypeScript 端的对等实现,保证两个 SDK 行为一致。

四、开发环境搭建与检查流水线

技能文档规定所有开发命令均在 python/ 目录下执行,标准流程如下:

make env
source .venv/bin/activate
make chk
make tst

4.1 make env:创建开发环境

python/Makefile 的实现看,make env 基于 uv 管理环境:当未处于虚拟环境时,创建 Python 3.12 虚拟环境(.venv,prompt 为 composio),执行 uv syncuv sync --dev 安装开发依赖,随后安装全部 provider 包并以可编辑模式安装 SDK(uv pip install -e .);若已处于虚拟环境,则只做增量同步并提示先 deactivate 再重建。环境就绪后运行 source .venv/bin/activate 进入开发环境。

4.2 make chk:静态检查与类型检查

chk 会话(python/noxfile.py)安装核心包、dev 依赖组、mypy 及一组类型桩types-requeststypes-protobuftypes-jsonschema,以及 crewailangchainlanggraphllama-indexopenai-agentsgoogle-cloud-aiplatform 等 provider 库)后执行:

  • ruff check:按 config/ruff.toml 检查 composio/providers/tests/examples/scripts/
  • mypy --config-file config/mypy.ini:对 composio/providers/tests/scripts/ 逐模块类型检查。

noxfile 注释解释了类型桩不能放入锁定的 dev 依赖组的原因:provider 库(crewai、langchain、llama-index 等)会向根解析拖入冲突的传递依赖,因此这些库仅作为 mypy 的 import 解析目标按需安装。

4.3 make tst:单元测试

tst 会话安装核心包、dev 组及 crewai / langchain / langgraph 三个 provider 后运行 pytest(默认测试路径为 tests/,可用位置参数覆盖),输出详细报告(-v --tb=short)。测试仓库覆盖了极为细致的领域:schema 转换与语义回归(test_schema_converter.pytest_schema_semantic_regressions.py)、严格 schema(test_strict_schema*.py)、类型推断(test_type_inference*.py)、文件上传安全(test_sensitive_file_upload_paths.pytest_upload_dir_allowlist.py)、URL 安全(test_url_safety*.py)、路径拼接护栏(test_path_join_guardrail.py)、日志脱敏(test_logging_redaction.py)等,从测试即可反推 SDK 在安全与类型正确性上的关注点。

4.4 其他开发检查

  • make fmt:运行 nox -s fmt,执行 ruff 的 import 排序修复(--select I --fix)与 ruff format
  • make snt(即 sanity):快速冒烟测试,默认跑 tests/test_imports.pytests/test_sdk.py,验证导入与 SDK 初始化;
  • make type_inference:安装全部 provider 包后,用 mypy 校验 Composio.tools.get() 基于 @overload 签名对各 provider 返回类型的推断是否正确——这是跨 provider 类型安全的关键验证,独立于 chk 会话(后者不安装全部 provider 因而无法解析 provider 类型);
  • make dead-code:运行 vulture(最低置信度 80%,排除 build/dist/.venv/.nox/__pycache__/仅报告疑似死代码,不阻断会话;确认为误报的符号应加入 python/config/vulture_allowlist.py
  • 另有 tst_autogen 会话:在 protobuf 兼容环境中单独验证 autogen provider 的 skip_defaults 签名行为,体现"provider 间依赖冲突需隔离测试"的思路;
  • 友好别名:make format = fmtmake check = chkmake sanity = sntmake test = tst

五、从技能到实践:一次典型的 SDK 开发任务

综合技能文档、布局参考与源码,一次典型的 Python SDK 开发任务可以按以下路径推进:

  1. 定位:根据改动目标确定落点——工具 / 工具包逻辑在 python/composio/core/models/tools.pytoolkits.py,会话相关在 tool_router*.py 系列,认证在 auth_configs.py / connected_accounts.py,客户端类型在 python/composio/client/types.py,入口装配在 python/composio/sdk.py
  2. 环境:在 python/ 下执行 make env 并激活 .venv
  3. 实现:遵守命名约定与"核心不含 provider 特定行为"的纪律;优先使用本地类型而非生成客户端内部细节;对共享 SDK 概念同步核对 TypeScript 端实现(保持 cross-SDK parity);
  4. 验证make fmtmake chkmake tst,涉及工具类型推断时补跑 make type_inference,仅需快速确认时用 make snt;如需冒烟级别回归,测试覆盖可参考 python/tests/ 中对应领域的用例(如 test_tool_router.pytest_auth_configs.pytest_connected_accounts.py);
  5. 发布:涉及版本变更时,通过 python/scripts/bump.py(对应 make bump)与 make build 完成打包。

六、总结

Composio 的 Python SDK 技能文档为 SDK 开发定义了一条清晰、可复现的工程路径:以 SKILL.md 划定任务边界,以 references/sdk-layout.md 建立布局与约定共识,再以 make env / make chk / make tst 形成"环境搭建—静态与类型检查—单元测试"的完整质量闭环。配合 noxfile 中隔离依赖冲突的会话设计(tst_autogentype_inference)与 vulture 死代码巡检,这套流水线在保证核心 SDK 框架无关性、跨 provider 类型安全与跨 SDK 一致性的同时,也让新贡献者能够快速、安全地介入 Python 端的任何扩展工作。

登录后查看全文
热门项目推荐
相关项目推荐

项目优选

收起
kernelkernel
deepin linux kernel
C
33
18
docsdocs
暂无描述
Markdown
900
5.83 K
ops-transformerops-transformer
本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。
C++
1.14 K
2.76 K
pytorchpytorch
作为 Ascend for PyTorch 社区的核心组件,TorchNPU 是昇腾专为 PyTorch 打造的深度学习适配插件,使 PyTorch 框架能够直接调用昇腾 NPU,为开发者提供昇腾 AI 处理器的超强算力。
Python
860
1.35 K
ops-nnops-nn
本项目是CANN提供的神经网络类计算算子库,实现网络在NPU上加速计算。
C++
927
1.85 K
jiuwenswarmjiuwenswarm
JiuwenSwarm 是一款基于openJiuwen开发的智能AI Agent,它能够将大语言模型的强大能力,通过你日常使用的各类通讯应用,直接延伸至你的指尖。
Python
3.94 K
1.02 K
kernelkernel
openEuler内核是openEuler操作系统的核心,既是系统性能与稳定性的基石,也是连接处理器、设备与服务的桥梁。
C
533
603
ops-mathops-math
本项目是CANN提供的数学类基础计算算子库,实现网络在NPU上加速计算。
C++
1.37 K
1.46 K
AscendNPU-IRAscendNPU-IR
AscendNPU-IR是基于MLIR(Multi-Level Intermediate Representation)构建的,面向昇腾亲和算子编译时使用的中间表示,提供昇腾完备表达能力,通过编译优化提升昇腾AI处理器计算效率,支持通过生态框架使能昇腾AI处理器与深度调优
C++
548
396
cann-learning-hubcann-learning-hub
CANN 学习中心仓,支持在线互动运行、边学边练,提供教程、示例与优化方案,一站式助力昇腾开发者快速上手。
Jupyter Notebook
1.04 K
527