API 参考
通过 REST API 将 ConceptViz 图表生成集成到您的应用中
认证
所有 API 请求需要通过 Authorization 请求头传入 API 密钥。
Authorization: Bearer cvk_your_api_key_here购买 API credits 后,您可以在 设置 > API 密钥 页面创建和管理 API 密钥。
API 密钥拥有您账户积分的完整访问权限,请妥善保管,切勿在客户端代码中暴露。
基础 URL
https://conceptviz.app/api/v1生成图表
图表生成是异步的。您提交请求后会收到一个任务 ID,然后轮询获取结果。
第一步:提交生成请求
POST /api/v1/generate
请求参数
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
prompt | string | 是* | 描述图表的文本提示词 |
prompts | string[] | 是* | 批量生成的提示词数组(最多 4 个) |
model | string | 否 | 公开模型系列:"cv-2"(默认)或 "cv-1" |
mode | string | 否 | CV-2 生成模式:"standard"(默认)或 "max" |
quality | string | 否 | 图片分辨率:"2k"(默认)或 "4k"。CV-2 max 默认使用 "4k" |
aspectRatio | string | 否 | 宽高比(如 "16:9"、"1:1"、"4:3"、"9:16"、"a4-portrait") |
prompt(单个)和 prompts(批量)二选一。如果同时提供,prompts 优先。
响应格式
{
"taskId": "vaW29_MJ1wbnyFU4bl_pd",
"status": "pending",
"model": "cv-2",
"mode": "standard",
"quality": "2k",
"aspect_ratio": "16:9",
"credits_used": 1,
"credits_remaining": 80,
"poll_url": "/api/v1/task/vaW29_MJ1wbnyFU4bl_pd"
}第二步:轮询获取结果
GET /api/v1/task/{taskId}
每 3–5 秒轮询一次,直到 status 为 completed 或 failed。通常需要 30–90 秒完成生成。
响应(成功)
{
"status": "completed",
"images": [
{
"url": "https://conceptviz.app/images/abc123.png",
"prompt": "water cycle diagram"
}
]
}响应(失败)
{
"status": "failed",
"error": "Image generation failed. Please try again later.",
"code": "GENERATION_FAILED",
"credits_refunded": true
}响应(进行中)
{
"status": "processing"
}编辑图片
图片编辑同样是异步任务。提交一张或多张输入图片和编辑提示词后,继续使用同一个任务查询接口轮询结果。
POST /api/v1/edit
JSON 请求参数
当输入图片已经有公开 URL,或需要传 data:image/...;base64,... 时使用此格式。
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
prompt | string | 是 | 图片编辑指令 |
images | string[] | 是 | 输入图片 URL 或 data:image/...;base64,...(最多 4 张) |
model | string | 否 | 公开模型系列:"cv-2"(默认)或 "cv-1" |
mode | string | 否 | CV-2 生成模式:"standard"(默认)或 "max" |
quality | string | 否 | 图片分辨率:"2k"(默认)或 "4k"。CV-2 max 默认使用 "4k" |
aspectRatio | string | 否 | 输出宽高比(如 "16:9"、"1:1"、"4:3"、"9:16") |
输入图片会先经过安全审核。上传图片单张最大 20MB,每次编辑最多 4 张输入图片。
curl -X POST https://conceptviz.app/api/v1/edit \
-H "Authorization: Bearer cvk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "Replace the annotations with a clean professional architecture diagram",
"images": ["https://example.com/marked-up-diagram.png"],
"model": "cv-2",
"mode": "standard"
}'Multipart 上传
当需要直接上传本地图片文件时使用此格式。
curl -X POST https://conceptviz.app/api/v1/edit \
-H "Authorization: Bearer cvk_your_api_key_here" \
-F "prompt=Convert this sketch into a polished system diagram" \
-F "image=@./sketch.png" \
-F "model=cv-2"如需提供多张输入图片,重复传入 image 表单字段即可。
curl -X POST https://conceptviz.app/api/v1/edit \
-H "Authorization: Bearer cvk_your_api_key_here" \
-F "prompt=Combine these references into one clean diagram" \
-F "image=@./reference-1.png" \
-F "image=@./reference-2.png"响应格式
{
"taskId": "vaW29_MJ1wbnyFU4bl_pd",
"status": "pending",
"model": "cv-2",
"mode": "standard",
"quality": "2k",
"aspect_ratio": "16:9",
"credits_used": 1,
"credits_remaining": 80,
"poll_url": "/api/v1/task/vaW29_MJ1wbnyFU4bl_pd"
}积分消耗
API 访问基于 API credits。API credits 永不过期,不需要持续订阅。
| 模型 | 模式 | 分辨率 | 每张图片消耗积分 |
|---|---|---|---|
cv-2 | standard | 2k | 1 |
cv-2 | standard | 4k | 2 |
cv-2 | max | 2k | 2 |
cv-2 | max | 4k | 4 |
cv-1 | — | 2k | 1 |
cv-1 | — | 4k | 2 |
积分在提交任务时扣除。如果生成失败,积分会自动退还。
示例
cURL
# 第一步:提交
RESPONSE=$(curl -s -X POST https://conceptviz.app/api/v1/generate \
-H "Authorization: Bearer cvk_your_api_key_here" \
-H "Content-Type: application/json" \
-d '{
"prompt": "water cycle diagram showing evaporation, condensation, and precipitation",
"model": "cv-2",
"mode": "standard",
"quality": "2k"
}')
TASK_ID=$(echo $RESPONSE | jq -r '.taskId')
echo "Task ID: $TASK_ID"
# 第二步:轮询直到完成
while true; do
RESULT=$(curl -s https://conceptviz.app/api/v1/task/$TASK_ID \
-H "Authorization: Bearer cvk_your_api_key_here")
STATUS=$(echo $RESULT | jq -r '.status')
echo "Status: $STATUS"
if [ "$STATUS" = "completed" ] || [ "$STATUS" = "failed" ]; then
echo $RESULT | jq .
break
fi
sleep 5
donePython
import requests
import time
API_KEY = "cvk_your_api_key_here"
BASE_URL = "https://conceptviz.app/api/v1"
HEADERS = {
"Authorization": f"Bearer {API_KEY}",
"Content-Type": "application/json",
}
# 第一步:提交
response = requests.post(
f"{BASE_URL}/generate",
headers=HEADERS,
json={
"prompt": "photosynthesis process diagram",
"model": "cv-2",
"mode": "standard",
"quality": "2k",
},
)
data = response.json()
task_id = data["taskId"]
print(f"任务已提交:{task_id}")
print(f"消耗积分:{data['credits_used']},剩余:{data['credits_remaining']}")
# 第二步:轮询获取结果
while True:
result = requests.get(f"{BASE_URL}/task/{task_id}", headers=HEADERS).json()
print(f"状态:{result['status']}")
if result["status"] == "completed":
for image in result["images"]:
print(f"图片 URL:{image['url']}")
break
elif result["status"] == "failed":
print(f"错误:{result['error']}")
print(f"积分已退还:{result.get('credits_refunded', False)}")
break
time.sleep(5)JavaScript / TypeScript
const API_KEY = "cvk_your_api_key_here";
const BASE_URL = "https://conceptviz.app/api/v1";
// 第一步:提交
const submitResponse = await fetch(`${BASE_URL}/generate`, {
method: "POST",
headers: {
Authorization: `Bearer ${API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify({
prompts: [
"cell division mitosis diagram",
"DNA double helix structure",
],
model: "cv-2",
mode: "standard",
quality: "2k",
}),
});
const { taskId, credits_used, credits_remaining } = await submitResponse.json();
console.log(`任务:${taskId},消耗积分:${credits_used}`);
// 第二步:轮询获取结果
while (true) {
const pollResponse = await fetch(`${BASE_URL}/task/${taskId}`, {
headers: { Authorization: `Bearer ${API_KEY}` },
});
const result = await pollResponse.json();
console.log(`状态:${result.status}`);
if (result.status === "completed") {
console.log("图片:", result.images);
break;
} else if (result.status === "failed") {
console.error("失败:", result.error);
break;
}
await new Promise((r) => setTimeout(r, 5000));
}错误处理
API 返回标准 HTTP 状态码和 JSON 错误信息:
{
"error": "错误描述信息",
"code": "ERROR_CODE"
}错误码
| HTTP 状态码 | 错误码 | 说明 |
|---|---|---|
400 | INVALID_BODY | 请求体不是有效的 JSON |
400 | IMAGE_REQUIRED | 编辑请求没有提供输入图片 |
400 | INVALID_IMAGE | 输入图片数据、URL 或文件类型无效 |
400 | PROMPT_REQUIRED | 未提供 prompt 或 prompts |
400 | TOO_MANY_IMAGES | 单次编辑请求超过 4 张图片 |
400 | TOO_MANY_PROMPTS | 一次请求超过 4 个提示词 |
400 | UNSUPPORTED_MODEL | 模型必须是 cv-2 或 cv-1;CV-2 模式必须是 standard 或 max |
401 | UNAUTHORIZED | 缺少或无效的 Authorization 请求头 |
401 | INVALID_API_KEY | API 密钥无效或已禁用 |
402 | INSUFFICIENT_CREDITS | 积分不足(响应中包含 credits_remaining) |
404 | TASK_NOT_FOUND | 任务 ID 不存在或不属于您的账户 |
429 | MODERATION_RATE_LIMITED | 短时间内安全审核请求过多 |
400 | INPUT_MODERATION_BLOCKED | 提示词或输入图片未通过安全审核 |
500 | CREDIT_CONSUMPTION_FAILED | 积分扣除失败 |
500 | GENERATION_FAILED | 图片生成失败(积分自动退还) |
示例:错误处理
response = requests.post(f"{BASE_URL}/generate", headers=headers, json=payload)
if response.status_code == 402:
data = response.json()
print(f"积分不足,剩余:{data.get('credits_remaining', 0)}")
elif response.status_code != 200:
print(f"错误:{response.json()['error']}")
else:
data = response.json()
task_id = data["taskId"]
# 开始轮询...限制
| 约束 | 值 |
|---|---|
| 每次请求最多图片数 | 4 |
| 每个账户最多 API 密钥数 | 5 |
| 生成耗时 | 通常 30–90 秒 |
| 推荐轮询间隔 | 3–5 秒 |
| 可用模型 | cv-2(默认)、cv-1 |
| 可用 CV-2 模式 | standard(默认)、max |
| 可用分辨率 | 2k、4k |