user() | account.me()['user'] | me() 还会返回 applications 和 databases |
all_apps() | account.me()['applications'] | |
app(app_id) | apps.get(app_id) | 现在是 GET /apps/{id}:适用于 workspace ID '<appId>-<workspaceId>' |
user_snapshots(scope) | account.snapshots(*, scope=None) | scope 只能以关键字形式传入。条目带有 API 的 version_id 和已签名的 url |
service_status() | service.status() | |
upload_app(File(path)) | apps.create(path) | 从磁盘流式传输;返回 AppCreated(domain 是网站的完整主机;没有 subdomain) |
delete_app(id) | apps.delete(id) | 返回 None |
all_apps_status() | apps.status_all(*, workspace_id=None) | 已停止的应用不再被丢弃 |
app_status(id) | apps.status(id, *, raw=False) | raw=True(仅限关键字参数)返回数字 |
start_app / stop_app / restart_app | apps.start / apps.stop / apps.restart | 返回 None |
get_logs(id) | apps.logs(id) | 返回 str |
app_metrics(id) | apps.metrics(id) | |
realtime(id)(逐行产出每个 data: 行的异步生成器,尽可能进行 JSON 解码) | apps.realtime(id) | 由 {'event', 'data', 'id'} 组成的迭代器,data 为原始文本,日志事件额外带有 stream/line,状态事件带有合并后的 status。会自行重新连接(参见行为变更);流没有读取超时(v4 在 90 秒没有数据后放弃),因此请用 close() 停止它 |
all_domains() | apps.domains() | |
load_balancers() | apps.load_balancers() | |
commit(id, File(path)) | apps.commit(id, file, *, path=None, filename=None) | 仅限关键字的 path = 目标目录;filename 为非 zip 文件命名(bytes 默认为 commit.zip) |
github_integration(id, access_token) | apps.deploys.set_webhook(id, access_token) | |
last_deploys(id) | apps.deploys.list(id) | 事件包含 source、branch、files;失败的 deploy 以 state='error' 加上 code 和 message 结束 |
current_app_integration(id) | apps.deploys.current(id) | 返回 {'app'?, 'webhook'?},而不是 webhook 字符串 |
get_app_envs / set_app_envs / overwrite_app_envs / delete_app_envs | apps.envs.get / set / replace / delete | |
clear_app_envs(id) | apps.envs.replace(id, {}) | |
app_files_list(id, path) | apps.files.list(id, path=None) | 条目是 API 的 FileEntry(没有计算得出的 path/app_id)。不存在的目录会抛出 404 FILE_NOT_FOUND,而不是返回 [];被阻止的目录返回 403 BLOCKED_PATH |
read_app_file(id, path) → BytesIO | apps.files.read(id, path) → bytes | 以 base64 编码获取(?encoding=base64)并解码;超过 10 MB 返回 413 FILE_TOO_LARGE |
create_app_file(id, File(...), path) | apps.files.write(id, path, content) | str 以文本发送,bytes 以 base64 编码发送(对二进制安全);路径原样发送(不额外添加 /);空内容('' 或 b'')会创建一个空文件 |
move_app_file(id, origin, dest) | apps.files.move(id, path, to) | |
delete_app_file(id, path) | apps.files.delete(id, path) | |
snapshot(id) → Snapshot | apps.snapshots.create(id) | 遇到 202 时返回 {'pending': True} 而不是抛出异常;之后轮询 list,切勿重新创建 |
all_app_snapshots(id) | apps.snapshots.list(id) | 条目带有 API 的 version_id 和已签名的下载 url,按原样传递 |
restore_snapshot('app', id, snapshot_id, version_id) | apps.snapshots.restore(id, name, version_id) | list 条目中的 name 和 version_id |
restore_snapshot('database', id, ...) | databases.snapshots.restore(id, name, version_id) | list 条目中的 name 和 version_id |
Snapshot.download(path) | client.download_snapshot(url, dest) | 直接以流的方式获取 zip 本身(v4 会将其再包装进另一个 zip) |
domain_analytics(id, start=, end=, ...) | apps.network.analytics(id, start, end, *, country=, ...) | API 要求提供 start/end;过滤器只能以关键字形式传入 |
network_errors(id, start, end, include_4xx) / network_logs / network_performance | apps.network.errors(id, start, end, *, include_4xx=False) / logs / performance | analytics、errors 和 performance 对于没有数据的窗口返回 None |
dns_records(id) | apps.network.dns(id) | |
set_custom_domain(id, custom_domain) | apps.network.set_domain(id, domain) | v4 从未发送请求体 |
purge_cache(id) | apps.network.purge_cache(id) | |
link_github_app(id, repository_name, repository_branch) | apps.deploys.link_github_app(id, repository, branch) | 现在可以使用 API 密钥(作用域 apps:deploy);返回 LinkedRepository({id, full_name, branch})而不是原始字典;没有安装 GitHub App 时返回 403 GITHUB_NOT_CONNECTED |
unlink_github_app(id) | apps.deploys.unlink_github_app(id) | 返回 None;没有任何关联时返回 400 GIT_NOT_CONFIGURED |
create_database(name, memory, type, version=None) | databases.create(name, type=, version=, memory=) | 仅限关键字参数;version 为必填项(例如 '8' 这样的主版本号即可) |
get_database_info(id) | databases.get(id) | |
edit_database(id, name, memory) | databases.update(id, name=, ram=) | v4 发送的是 memory,API 会忽略它 |
delete_database / start_database / stop_database | databases.delete / start / stop | |
get_database_status(id) | databases.status(id, *, raw=False) | |
all_databases_status() | databases.status_all() | |
database_metrics(id) | databases.metrics(id) | |
get_database_certificate(id) → Certificate | databases.certificate(id) → base64 str | base64.b64decode(...) 可得到 PEM |
reset_database_password(id) | databases.reset_credentials(id, 'password') | 返回新密码 |
reset_database_certificate(id) | databases.reset_credentials(id, 'certificate') | 返回 '' |
all_database_snapshots(id) / database_snapshot(id) | databases.snapshots.list(id) / create(id) | 与应用一样,条目带有 version_id 和 url |
create_workspace(name) | workspaces.create(name) | 在一个请求中返回 {id, name} |
all_workspaces() / get_workspace(id) | workspaces.list() / workspaces.get(id) | v4 会将每个应用的 id 改写为组合形式 '<appId>-<workspaceId>';v5 返回 API 的原始 ID,因此需要你自行构建:f"{app['id']}-{workspace['id']}" |
delete_workspace / leave_workspace | workspaces.delete / workspaces.leave | |
add_member_to_workspace(ws, invite_code, permissions) | workspaces.members.add(ws, code, group) | |
modify_member_permissions(ws, user_id, permissions) | workspaces.members.update(ws, member_id, group) | |
remove_member_from_workspace(ws, user_id) | workspaces.members.remove(ws, member_id) | |
get_invite_code() | workspaces.members.invite_code() | |
add_app_to_workspace / remove_app_from_workspace | workspaces.apps.add / workspaces.apps.remove | |
| — | ai.chat(request) | 新增;request 是 OpenAI 风格的请求体({'messages': [...], 'model': ...}) |
client.api_key | 已移除 | 请自行保存对密钥的引用 |
on_request(endpoint), Application.capture(endpoint) | 已移除 | 参见概览中的监听器一行 |
squarecloud.utils.ConfigFile | 已移除 | 请自行编写 squarecloud.app 文件(KEY=value 行) |