Composio Python SDK 开发指南:掌握代码布局、核心领域模型与完整开发检查流程
导读
本文基于 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 类型的一层轻量包装",以类型别名形式暴露Tool、ToolkitMinimal、AuthConfig以及AuthSchemeL(认证方案字面量,如OAUTH1、OAUTH2、API_KEY、BASIC、NO_AUTH、BEARER_TOKEN等),并定义了tool_execute_params、tool_execute_response等请求 / 响应参数类型;core/models/:领域模型层,覆盖auth_configs.py、connected_accounts.py、toolkits.py、tools.py、triggers.py、tool_router.py、tool_router_session*.py(会话与会话文件)、custom_tool*.py(自定义工具)、mcp.py、webhook_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):
泛型参数 TTool 与 TToolCollection 由传入的 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)、timeout、max_retries(默认DEFAULT_MAX_RETRIES); - 领域对象装配:构造
tools、toolkits、triggers、auth_configs、connected_accounts、mcp、experimental,以及会话入口self._sessions(ToolRouter实例)。
其中会话(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 下比较不区分大小写。这些文件上传安全参数在 Tools 与 ToolRouter(会话)两处被一致地透传,保证自动上传策略在直接执行与会话执行两条路径上行为一致。
2.4 Provider 包:python/providers/
仓库中每个 provider 对应一个独立包(如 anthropic、langchain、crewai、gemini、google_adk、openai_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.ini、pytest.ini、vulture_allowlist.py(死代码检测的允许清单)与codecov.yml;- python/scripts/ 承载发布与维护:
bump.py(版本号 bump)、generate-docs.py、create-provider.sh(新 provider 脚手架)等。
三、开发模式与工程约定
sdk-layout.md 明确了四条贯穿 SDK 开发的模式约束:
- 保留 Python 命名约定:不引入与现有风格冲突的命名习惯,保持代码库可读性与一致性;
- 核心不含 provider 特定行为:框架适配逻辑收敛在
providers/包中,除非该行为属于共享抽象的一部分,这保护了核心 SDK 的框架无关性; - 优先添加本地类型,而非引入易变动的生成客户端内部实现:当只需一个小的类型化形状时,用本地类型(如 client/types.py 中的类型别名)替代直接依赖生成客户端内部细节,以降低升级生成客户端时的破坏风险。从源码看,core/models/tools.py 中的
_normalize_tool正是这种防御性设计的体现——它将生成客户端响应"规整"为 SDK 的工具模型形状,并以_toolkit_slug这类函数安全解析不可信的 toolkit 元数据而不假设生成形状; - 检查 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 sync、uv sync --dev 安装开发依赖,随后安装全部 provider 包并以可编辑模式安装 SDK(uv pip install -e .);若已处于虚拟环境,则只做增量同步并提示先 deactivate 再重建。环境就绪后运行 source .venv/bin/activate 进入开发环境。
4.2 make chk:静态检查与类型检查
chk 会话(python/noxfile.py)安装核心包、dev 依赖组、mypy 及一组类型桩(types-requests、types-protobuf、types-jsonschema,以及 crewai、langchain、langgraph、llama-index、openai-agents、google-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.py、test_schema_semantic_regressions.py)、严格 schema(test_strict_schema*.py)、类型推断(test_type_inference*.py)、文件上传安全(test_sensitive_file_upload_paths.py、test_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.py与tests/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=fmt、make check=chk、make sanity=snt、make test=tst。
五、从技能到实践:一次典型的 SDK 开发任务
综合技能文档、布局参考与源码,一次典型的 Python SDK 开发任务可以按以下路径推进:
- 定位:根据改动目标确定落点——工具 / 工具包逻辑在 python/composio/core/models/tools.py 与
toolkits.py,会话相关在tool_router*.py系列,认证在auth_configs.py/connected_accounts.py,客户端类型在 python/composio/client/types.py,入口装配在 python/composio/sdk.py; - 环境:在
python/下执行make env并激活.venv; - 实现:遵守命名约定与"核心不含 provider 特定行为"的纪律;优先使用本地类型而非生成客户端内部细节;对共享 SDK 概念同步核对 TypeScript 端实现(保持 cross-SDK parity);
- 验证:
make fmt→make chk→make tst,涉及工具类型推断时补跑make type_inference,仅需快速确认时用make snt;如需冒烟级别回归,测试覆盖可参考 python/tests/ 中对应领域的用例(如test_tool_router.py、test_auth_configs.py、test_connected_accounts.py); - 发布:涉及版本变更时,通过 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_autogen、type_inference)与 vulture 死代码巡检,这套流水线在保证核心 SDK 框架无关性、跨 provider 类型安全与跨 SDK 一致性的同时,也让新贡献者能够快速、安全地介入 Python 端的任何扩展工作。
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 StartedRust0634
MiniCPM5-2BMiniCPM5-2B 是一款面向端侧、本地部署和资源受限场景的 2B 稠密 Transformer,能够达到同尺寸开源模型 SOTA 水平。Markdown00
jforgamejforgame是一个一站式游戏服务器开发框架。包含游戏服务器开发所需要的各种组件,比如网关,socket服务端与客户端,自定义高效消息编解码,游戏热更新,游戏通用工具等等。包含游戏服,跨服,匹配服,后台管理系统等实现,同时提供大量业务案例以供学习。亦可用于其他socket应用,例如及时聊天等。Java01
fizz-gateway-nodeAn Aggregation API Gateway in Java . FizzGate 是一个基于 Java开发的微服务聚合网关,是拥有自主知识产权的应用网关国产化替代方案,能够实现热服务编排聚合、自动授权选择、线上服务脚本编码、在线测试、高性能路由、API审核管理、回调管理等目的,拥有强大的自定义插件系统可以自行扩展,并且提供友好的图形化配置界面,能够快速帮助企业进行API服务治理、减少中间层胶水代码以及降低编码投入、提高 API 服务的稳定性和安全性。Java00
certd开源SSL证书管理工具;全自动证书申请、更新、续期;通配符证书,泛域名证书申请;证书自动化部署到阿里云、腾讯云、主机、群晖、宝塔;https证书,pfx证书,der证书,TLS证书,nginx证书自动续签自动部署JavaScript00
Spark-X2.5-1.7BSpark-X2.5-1.7B 旨在让强大的 AI 更加实用、高效且易于获取。这些模型在广泛的日常任务中表现出色,涵盖对话、写作、翻译、推理、编程、工具调用和智能体工作流,并在同等规模的开源模型中取得领先结果。Spark-X2.5 将面向效率的架构与最高 1M tokens 的原生上下文窗口相结合,并支持 200 多种语言。Python00