API Stock 与 CometAPI 对比
何时选择 API Stock
如果需要同一账号中的聊天与异步媒体任务,可选择 API Stock。迁移前请分别比较每条 CometAPI 路由的价格。
横向滚动以查看表格的所有列。
| 集成细节 | CometAPI | API Stock |
|---|---|---|
| 请求 | POST /v1/images/generations | POST /api/v1/generation/create |
| 身份验证 | Authorization: Bearer | Authorization: Bearer |
| 模型标识符 | doubao-seedream-4-5-251128 | seedream-4-5 |
这里只比较下方示例模型,并非服务商的全部端点。模型同名不代表参数、审核规则或输出完全一致。
价格对比:CometAPI 与 API Stock
选取双方共有的模型,按相同计费单位比较。我方价格来自当前目录;对方价格为附有核查日期和来源链接的记录。
| 模型 | API Stock | CometAPI | 我方价格差异 |
|---|---|---|---|
| Seedream 4.52K · 每张图片 · 文本生成图片 | API Stock$0.036 | CometAPI$0.032 | 高 12.5% |
| Seedream 5.0 Lite2K · 每张图片 · 文本生成图片 | API Stock$0.03325 | CometAPI$0.028 | 高 18.8% |
文本生成单张图片,不含参考图片。此处为公开基础价格;订阅、批量折扣、其他分辨率和编辑可能影响最终费用。
工作量费用示例
Seedream 4.5 · 2K
按上述配置生成 1,000 张图片
- API Stock
- $36
- CometAPI
- $32
Seedream 5.0 Lite · 2K
按上述配置生成 1,000 张图片
- API Stock
- $33.25
- CometAPI
- $28
按上表计算的示例总价,不含批量折扣、订阅或付费附加选项。不代表相同延迟或完全一致的输出。
从 CometAPI 迁移
聊天可保留 OpenAI SDK,修改基础 URL、密钥和模型 id。图片需从 /v1/images/generations 改为异步 /api/v1/generation/create,并使用轮询或 webhook 获取结果。
1
创建账号、充值预付余额并生成 API 密钥。
2
向 /api/v1/generation/create 发送 POST,填写公开模型 id 和文档中的参数。每个任务生成一个结果。
3
读取 taskId。轮询 GET /api/v1/task/status/TASK_ID,或创建时设置 webhook。
CometAPI
curl --fail-with-body 'https://api.cometapi.com/v1/images/generations' \-H "Authorization: Bearer $COMETAPI_KEY" \-H 'Content-Type: application/json' \-d '{"model": "doubao-seedream-4-5-251128","prompt": "A ceramic mug on a wooden table, soft morning light","size": "2K","n": 1}'
API Stock
curl --fail-with-body 'https://api.api-stock.com/api/v1/generation/create' \-H "Authorization: Bearer $API_KEY" \-H 'Content-Type: application/json' \-d '{"model": "seedream-4-5","prompt": "A ceramic mug on a wooden table, soft morning light","resolution": "2K","size": "1:1"}'
完整示例:创建任务并获取文件
在服务器上使用 Node 22+ 或 Bun,并设置 API_KEY。示例只创建一个付费任务,随后轮询而不重复创建。链接有效期有限,请将文件存入自己的存储。
import { writeFile } from "node:fs/promises";const baseURL = "https://api.api-stock.com/api/v1";const apiKey = process.env.API_KEY;if (!apiKey) throw new Error("Set API_KEY on the server");async function request(path, options = {}) {const response = await fetch(baseURL + path, {...options,headers: {Authorization: `Bearer ${apiKey}`,"Content-Type": "application/json",},signal: AbortSignal.timeout(30_000),});if (!response.ok) throw new Error(await response.text());return response.json();}const { taskId } = await request("/generation/create", {method: "POST",body: JSON.stringify({"model": "seedream-4-5","prompt": "A ceramic mug on a wooden table, soft morning light","resolution": "2K","size": "1:1"}),});if (!taskId) throw new Error("Missing taskId");const deadline = Date.now() + 10 * 60_000;let fileUrl;while (Date.now() < deadline) {const { data } = await request(`/task/status/${encodeURIComponent(taskId)}`);if (data.status === "finished") {fileUrl = data.files?.[0]?.fileUrl;if (!fileUrl) throw new Error("Task finished without a file");break;}if (data.status === "failed" || data.status === "expired") {throw new Error(data.errorMessage || data.status);}await new Promise((resolve) => setTimeout(resolve, 2000));}if (!fileUrl) throw new Error(`Still processing: save taskId ${taskId} and resume polling`);const file = await fetch(fileUrl, { signal: AbortSignal.timeout(60_000) });if (!file.ok) throw new Error(`Download failed: ${file.status}`);const mime = file.headers.get("content-type")?.split(";")[0];const extension = { "image/png": "png", "image/jpeg": "jpg", "image/webp": "webp" }[mime] || "bin";await writeFile(`generated-image.${extension}`, new Uint8Array(await file.arrayBuffer()));
将 API 密钥保存在服务器端。迁移生产流量前,先测试一个请求的参数、状态处理和输出。
常见问题
如何从 CometAPI 迁移?
聊天可保留 OpenAI SDK,修改基础 URL、密钥和模型 id。图片需从 /v1/images/generations 改为异步 /api/v1/generation/create,并使用轮询或 webhook 获取结果。
API Stock 总比 CometAPI 便宜吗?
并非如此。请比较表中具体模型、配置和计费单位。价格可能上涨或下降;迁移生产流量前请核查双方目录。
能迁移所有 CometAPI 工作流吗?
CometAPI 可能在某个模型上更便宜,Seedream 表格会展示双方价格。保留当前 API Stock 目录中没有的路由和功能。
失败或未完成的请求如何处理?
媒体任务按已配置路由重试,有可用备用服务商时才会切换。生成最终失败会退款。正在处理的任务应继续轮询,不要重复创建。文件链接过期不代表生成失败。
如何充值余额?
可用的付款方式、币种和最低充值金额会在付款前显示在您的账户中。无需订阅,模型使用费用从预付余额中扣除。
在 API Stock 尝试第一个请求
选择模型,确认参数和价格,再创建 API 密钥。迁移流量前先测试一个请求。