本页记录的是
squarecloud-api 5.0,这是 SDK 的一次重写。正从 v4 升级?请阅读 v4 → v5 迁移指南。要求
- Python 3.11 或更新版本。
- 一个 API 密钥(参见 API 密钥与作用域)。
http.client、json、ssl),并且带有完整类型(py.typed):响应是你的编辑器和类型检查器都能理解的 TypedDict。
安装
- pip
- uv
- poetry
squarecloud-api 的名称安装,以 squarecloud 的名称导入。已安装的版本为 squarecloud.__version__。
API 密钥与作用域
在 squarecloud.app/account/security 创建密钥。SDK 会将其原样放入Authorization 请求头发送(不带 Bearer 前缀)。
密钥可以限制为特定的作用域(apps:read、apps:deploy、apps:control、ai:chat……)以及特定的应用或数据库:
- 超出这些限制的调用会抛出
SquareCloudAPIError,状态为 403,代码为MISSING_SCOPE或RESOURCE_NOT_ALLOWED。 - 列表方法(
account.me()、apps.status_all()……)只返回该密钥可见的资源。 - 未知、已撤销或已过期的密钥会返回 401
ACCESS_DENIED。
SQUARECLOUD_API_KEY 读取密钥。请在运行示例的终端中设置它:
- macOS / Linux
- Windows (PowerShell)
创建客户端
SDK 提供两个客户端,拥有相同的分组和方法:SquareCloud是同步的,并且是线程安全的:可以在多个线程之间共享同一个实例。每个线程会复用自己的 keep-alive 连接。AsyncSquareCloud是相同的 API,只是需要await。每次调用都会在asyncio.to_thread中运行同步客户端,因此事件循环永远不会被阻塞。
- 同步
- 异步
with / async with 代码块时会关闭连接池中的连接。如果不使用代码块,请在用完后调用 client.close()。close() 在两个客户端上都是普通的(同步)方法。
空密钥或仅含空白字符的密钥会在构造函数中抛出 ValueError,早于任何请求。
异步客户端
AsyncSquareCloud 与 SquareCloud 只有三处不同:
- 每个方法都返回一个协程:
await client.apps.status(app_id)。 close()是同步的:调用时不要加await。apps.realtime(app_id)不需要 await:它返回一个AsyncRealtime,你可以用async for来消费它(参见实时)。
asyncio.gather 并发执行多个调用:
取消一个正在等待的任务并不会停止已在其工作线程中运行的请求:该调用仍会在后台完成(或超时)。
选项
AsyncSquareCloud 接受相同的选项。
客户端只将密钥保存在其私有的请求头中:不存在
client.api_key 属性,SDK 的日志记录器也绝不会写出它。模块
该包导出
SquareCloud、AsyncSquareCloud、SquareCloudAPIError、BASE_URL、HTTPTransport、Transport 和 Response 协议、Realtime、AsyncRealtime 以及 __version__。响应类型(App、RuntimeStats、Snapshot……)位于 squarecloud.types 中:
约定
ID 在前,返回纯数据
每个方法都以资源 ID 作为第一个参数,并返回纯数据:每个响应都是一个TypedDict,在运行时就是普通的 dict(没有类,没有缓存),因此 API 日后新增的字段也会被保留。字段名与 API 自身一致(created_at、version_id、lastModified、joinedAt、netIO……),因此 API 参考可直接适用。
- 变更操作返回
None,除非 API 返回数据(envs.*、deploys.set_webhook、deploys.link_github_app、databases.reset_credentials以及各create方法)。 - 字符串结果绝不会是
None:当 API 未返回时为''。 - 列表一次调用即完整返回:没有分页。
- 可选修饰参数只能以关键字形式传入(
status(app_id, raw=True)、commit(app_id, file, path="/src"))。唯一的例外是files.list的可选参数path,它也可以按位置传入。
Workspace 应用
每个app_id 也接受组合形式 <appId>-<workspaceId>,用于操作通过 workspace 与你共享的应用。workspaces.get() 和 workspaces.list() 返回原始 ID;组合 ID 需要你自行构建:
ID 会被编码
URL 路径中的 ID 会进行百分号编码。空的、. 或 .. 的 ID 会到达不同的路由,因此会在发送任何内容之前于本地以 INVALID_ID(状态 0)失败。Workspace 路由则将 ID 放在请求体中发送:在那里,INVALID_ID(400)来自服务器。
日期
start 和 end 参数(参见网络)接受 ISO 8601 字符串(原样发送)或 datetime(以 UTC 发送)。naive(不带时区的)datetime 会被视为本地时间并转换为 UTC,因此建议使用带时区的 datetime(datetime.now(UTC))。响应中的日期保持 API 发送时的原样(ISO 字符串,或在 API 使用时为 Unix 毫秒)。
超时
timeout 限制的是每次套接字操作:连接以及每一次读或写。一个持续发送数据的响应,其总耗时可能超过 timeout。
timeout 为 0 或更小时,会禁用所有超时,包括 120 秒的下限。
调用一旦发送就无法取消:唯一可以中途停止的流是 apps.realtime(),可从任意线程调用 close()。对于耗时较长的上传,请保留默认超时,以便在连接时检测到失效的连接;如果程序的其余部分必须继续运行,请在线程中或使用 AsyncSquareCloud 执行上传。
账户
client.account.me() 返回已认证的用户,以及该密钥可见的应用和数据库。
client.account.snapshots(scope=...) 列出账户的所有 snapshot:参见 Snapshots。
平台状态
client.service.status() 返回公开的平台状态。该路由不需要有效密钥,但客户端仍要求提供一个非空密钥。
unknown 表示检查本身无法运行:这并不代表发生了故障。
高级
自定义传输层
transport= 会替换 HTTP 层。可用于代理、追踪或测试。传输层是任何具有如下签名的可调用对象:
返回的对象需要具备
status、read()、readline() 和 close():http.client.HTTPResponse 即满足要求。重试、错误映射以及 {status, response} 的解包都保留在客户端中,因此传输层只负责搬运字节。
HTTPTransport(timeout=30.0) 是默认传输层:每个线程和主机一个 keep-alive 连接,响应使用 gzip 压缩(流除外),并将 timeout 作为那些没有自身超时的调用的连接上限。你可以对它进行包装:
client.close() 会关闭默认传输层的连接。具有 close() 方法的自定义传输层也会被关闭。
日志记录
SDK 会在squarecloud 日志记录器上以 DEBUG 级别记录每个请求:方法、路径和状态,绝不记录请求体或密钥。它只挂载了一个 NullHandler,因此在你配置日志之前不会输出任何内容:
后续步骤
管理应用
状态、生命周期、日志和指标。
错误
错误类、重试和速率限制。
API 简介
基础 URL、身份验证和第一个请求。
CLI 快速开始
在终端中部署和管理应用。

