自定义应用接入
本篇调用 Chat Completions 接口。先准备一把有效的API Key和一个支持该接口的完整模型 ID。
1. 保存请求体
在当前工作目录新建 request.json,以 UTF-8 无 BOM 格式保存以下内容,并把 YOUR_MODEL_ID 换成真实模型 ID:
{
"model": "YOUR_MODEL_ID",
"messages": [
{"role": "user", "content": "请用一句话介绍自己。"}
],
"stream": false
}文件里没有 API Key,可以重复用于测试。不要把请求体中的占位模型原样发送。
2. 按系统执行请求
macOS / Linux,在保存 request.json 的目录打开终端:
export CERTAEDGE_API_KEY='sk-YOUR_API_KEY'
curl -i -sS https://certaedge.com/v1/chat/completions \
-H "Authorization: Bearer $CERTAEDGE_API_KEY" \
-H 'Content-Type: application/json' \
--data-binary @request.jsonWindows PowerShell,使用 curl.exe,避免旧版 PowerShell 把 curl 当作其他命令:
$env:CERTAEDGE_API_KEY = 'sk-YOUR_API_KEY'
curl.exe -i -sS https://certaedge.com/v1/chat/completions -H "Authorization: Bearer $env:CERTAEDGE_API_KEY" -H "Content-Type: application/json" --data-binary "@request.json"把 sk-YOUR_API_KEY 替换成自己的完整密钥。命令中的地址已经包含完整端点,不再追加 /v1 或 /chat/completions。
3. 确认成功
-i 会显示 HTTP 响应头。成功时最终响应状态为 200,JSON 中 choices[0].message.content 包含回复,使用日志中也有对应记录。模型调用会按实际用量计费。
只有收到 HTTP 响应才能按状态码排错;DNS、TLS 或连接超时先检查地址和网络。
常见问题
| 现象 | 处理方式 |
|---|---|
找不到 request.json | 在文件所在目录运行命令,检查是否被保存为 .json.txt |
| 400 / JSON 解析失败 | 检查逗号、引号、文件编码以及模型占位值 |
| 401 | 检查当前终端中的完整密钥、有效期和启用状态 |
| 404 | 核对端点与模型 ID,确认该模型支持 Chat Completions |
| 429 | 阅读错误正文后检查请求频率、余额和密钥额度 |
调用 Responses、Anthropic Messages 等接口时,需要使用对应请求结构,不能只改 URL。正式应用应把密钥保存在服务端环境变量或受保护的凭证存储中。
用 Python 查询生成任务
下面的脚本只查询一个已经提交的视频任务并下载结果,不会提交或重新生成。先按视频接口教程取得真实 id,再设置密钥和任务 ID。
macOS / Linux:
export CERTAEDGE_API_KEY='sk-YOUR_API_KEY'
export CERTAEDGE_TASK_ID='task_EXAMPLE'Windows PowerShell:
$env:CERTAEDGE_API_KEY = 'sk-YOUR_API_KEY'
$env:CERTAEDGE_TASK_ID = 'task_EXAMPLE'把以下代码保存为 poll_video.py。它只使用 Python 标准库,不需要额外安装 SDK;建议在独立测试目录运行。
import json
import os
import shutil
import time
import urllib.parse
import urllib.request
from pathlib import Path
class NoRedirect(urllib.request.HTTPRedirectHandler):
def redirect_request(self, req, fp, code, msg, headers, newurl):
return None
api_key = os.environ["CERTAEDGE_API_KEY"]
task_id = os.environ["CERTAEDGE_TASK_ID"]
if not task_id.startswith("task_"):
raise ValueError("请使用视频提交响应中的真实任务 ID")
base = "https://certaedge.com"
headers = {"Authorization": f"Bearer {api_key}"}
encoded_id = urllib.parse.quote(task_id, safe="")
status_url = f"{base}/v1/videos/{encoded_id}"
opener = urllib.request.build_opener(NoRedirect())
for attempt in range(60):
request = urllib.request.Request(status_url, headers=headers)
with opener.open(request, timeout=60) as response:
task = json.load(response)
status = task.get("status")
print(f"第 {attempt + 1} 次查询:{status}")
if status == "completed":
break
if status == "failed":
raise RuntimeError(task.get("error") or "任务生成失败")
if status not in {"queued", "in_progress"}:
raise RuntimeError(f"无法识别状态:{status}")
if attempt < 59:
time.sleep(15)
else:
raise TimeoutError("本次等待结束,请保留任务 ID 后续查询,不要自动重新提交")
output = Path("result.mp4")
if output.exists():
raise FileExistsError("result.mp4 已存在,请先重命名或移走旧文件")
request = urllib.request.Request(f"{status_url}/content", headers=headers)
with opener.open(request, timeout=120) as response:
content_type = response.headers.get_content_type()
if not (content_type.startswith("video/") or content_type == "application/octet-stream"):
raise RuntimeError(f"返回内容不是视频:{content_type}")
with output.open("xb") as target:
shutil.copyfileobj(response, target)
print(f"已保存到 {output.resolve()}")macOS / Linux 用 python3 poll_video.py;Windows 用 py -3 poll_video.py。已有虚拟环境时,也可以使用首次调用教程中的 Python 路径运行。
脚本最多查 60 次,间隔约 15 秒,不承诺任务一定在此时间内完成。网络、HTTP 错误、未知状态或重定向都会停止,便于核对地址后继续查询原任务;不会把认证头自动转发给另一个主机。
任务失败时停止;下载中断可能留下未完成的本地文件,应检查并移走后再下载。脚本不会覆盖已有 result.mp4。