Cách dễ nhất để tự động hóa việc tạo ảnh ở quy mô lớn mà không phải quản lý nhiều API khác nhau là tách luồng công việc khỏi nhà cung cấp mô hình. Đưa mọi yêu cầu ảnh vào một hàng đợi, định tuyến từng tác vụ đến một model ID hiện tại, và gửi các yêu cầu tương thích thông qua một khóa CometAPI và OpenAI-compatible base URL https://api.cometapi.com/v1.
Hướng dẫn này xây dựng pipeline đó bằng Python. Nó tiếp nhận các tác vụ sản phẩm, quảng cáo và nội dung từ hàng đợi JSON Lines; chọn mô hình; giới hạn mức đồng thời; thử lại các lỗi tạm thời; lưu kết quả dựa trên URL hoặc base64; và ghi lại mức sử dụng và chi phí ước tính cho từng tác vụ. Ví dụ giữ các yếu tố thiết yếu của môi trường production trong một khối gọn gàng để bạn có thể thử nghiệm luồng công việc mà không biến bài viết thành một tài liệu tham chiếu mã.
Cách một Unified Image API đơn giản hóa việc tạo hàng loạt
Khi hoàn tất, luồng công việc sẽ trông như sau:
jobs.jsonl → bounded worker pool → CometAPI /v1/images/generations → object storage → manifest.jsonl
Lớp hàng đợi và lưu trữ vẫn thuộc về bạn. Việc chuyển đổi mô hình ảnh chỉ thay đổi giá trị model, không thay đổi hệ thống xác thực hay tuyến yêu cầu chính. Đó là ưu thế thực tế của một unified image API: việc chọn mô hình trở thành quyết định định tuyến bên trong một pipeline duy nhất thay vì tích hợp nhà cung cấp riêng biệt.
Bạn cần gì để tự động hóa việc tạo ảnh?
Bạn cần Python 3.10 trở lên, gói requests, một khóa CometAPI, một vị trí đầu ra có thể ghi, và ít nhất một model ID hình ảnh hiện hành.
Cài đặt phụ thuộc duy nhất:
pip install requests
Đặt khóa của bạn trên máy chủ, không bao giờ trong mã chạy trên trình duyệt hoặc kho mã:
export COMETAPI_KEY="your-key"
Base URL là https://api.cometapi.com/v1, và các tác vụ text-to-image tương thích sử dụng POST /images/generations. Trước khi triển khai, hãy xác minh từng mô hình trong live model catalog; catalog trả về ID hiện tại, endpoint được hỗ trợ, tính năng và siêu dữ liệu giá mà không cần header ủy quyền.
Tính đến ngày 20 tháng 8 năm 2026, catalog trực tiếp liệt kê hai tuyến hữu ích sau:
| Khối lượng công việc | Model ID | Lý do phù hợp |
|---|---|---|
| Ảnh sản phẩm với cài đặt đầu ra có kiểm soát | gpt-image-2 | Trả về dữ liệu usage và nội dung ảnh base64 trên tuyến tương thích OpenAI đã được ghi tài liệu |
| Khối lượng lớn khái niệm quảng cáo và nội dung | doubao-seedream-4-5-251128 | Sử dụng cùng tuyến generation và được liệt kê với giá theo từng yêu cầu |
Bảng trên là điểm khởi đầu, không khẳng định rằng các mô hình có khả năng giống hệt nhau. Kích thước, chất lượng, định dạng, hỗ trợ ảnh tham chiếu và hành vi phản hồi vẫn phụ thuộc vào từng mô hình. Hãy kiểm tra bản ghi mô hình và tài liệu liên kết trước khi truyền các tham số tùy chọn.
Cách xây dựng luồng tạo ảnh hàng loạt bằng Python
1. Gán một ID bền vững cho mỗi tác vụ
Sử dụng một đối tượng JSON mỗi dòng để một hàng đợi, kết xuất cơ sở dữ liệu, hoặc tác vụ từ bảng tính có thể cấp dữ liệu cho cùng một worker:
{"id":"sku-1001","kind":"product","prompt":"Studio product photo of a ceramic coffee dripper on a warm neutral background"}
{"id":"campaign-204","kind":"ad","prompt":"Editorial summer travel image, vivid natural light, wide composition, no text"}
{"id":"blog-088","kind":"content","prompt":"Minimal illustration of a developer automating a creative workflow, no text"}
ID sẽ trở thành tên tệp đầu ra và khóa trong manifest. Trong môi trường production, hãy dùng nó làm idempotency key và bỏ qua các ID đã được đánh dấu thành công trước đó khi xử lý lại hàng đợi.
2. Định tuyến theo loại tác vụ, rồi xác minh với catalog trực tiếp
Ví dụ ánh xạ công việc sản phẩm tới gpt-image-2 và công việc quảng cáo hoặc nội dung tới doubao-seedream-4-5-251128. Một tác vụ có thể ghi đè lựa chọn đó bằng trường model của riêng nó. Khi khởi động, worker tải về catalog công khai và từ chối một ID không còn được liệt kê.
Cách này an toàn hơn so với hard-code một SDK đặc thù nhà cung cấp khắp ứng dụng. Bạn có thể thay đổi một tuyến trong một ánh xạ sau khi đánh giá chất lượng, độ trễ và giá cho các prompt của riêng bạn.
3. Giới hạn mức đồng thời thay vì khởi chạy toàn bộ lô
Worker bắt đầu với bốn yêu cầu đồng thời. Con số đó là cài đặt ứng dụng thận trọng, không phải giới hạn dịch vụ chung. Hãy đo độ trễ và phản hồi 429 cho tài khoản của bạn, rồi tăng hoặc giảm MAX_WORKERS một cách có chủ đích.
Chỉ các phản hồi 408, 429, và 5xx mới được thử lại với backoff lũy tiến và jitter. Lỗi xác thực, model ID không hợp lệ và tham số không được hỗ trợ sẽ thất bại ngay lập tức vì thử lại cùng yêu cầu sai chỉ khiến trễ thêm.
4. Chuẩn hóa kết quả trước khi lưu trữ
Các mô hình ảnh không phải lúc nào cũng trả về cùng một container. Phản hồi GPT Image được ghi tài liệu chứa data[0].b64_json; các mô hình tương thích khác có thể trả về data[0].url. Worker xử lý cả hai, ghi ảnh vào tệp tạm, và chỉ đổi tên sau khi tải xuống hoặc giải mã thành công.
Trong production, hãy thay thế thư mục output/ cục bộ bằng S3, R2, GCS hoặc một object store khác. Đừng coi URL do nhà cung cấp lưu trữ là lưu trữ lâu dài trừ khi chính sách lưu giữ nêu rõ.
5. Ghi nhận usage, số lần thử và chi phí ước tính
Mỗi kết quả trở thành một dòng manifest gọn với ID tác vụ, mô hình, đường dẫn đã lưu, trạng thái và chi phí USD ước tính khi catalog trực tiếp cung cấp đủ dữ liệu giá. Các tác vụ thất bại giữ lại lỗi thay vì biến mất khỏi lô.
Script Python hoàn chỉnh cho tạo ảnh hàng loạt
Lưu nội dung sau thành batch_image_pipeline.py, đặt hàng đợi cạnh nó với tên jobs.jsonl, và chạy python3 batch_image_pipeline.py.
import base64, json, os, random, time
from concurrent.futures import ThreadPoolExecutor
from pathlib import Path
import requests
BASE_URL = "https://api.cometapi.com/v1"
KEY = os.environ["COMETAPI_KEY"]
WORKERS = int(os.getenv("MAX_WORKERS", "4"))
OUT = Path("output")
ROUTES = {
"product": "gpt-image-2",
"ad": "doubao-seedream-4-5-251128",
"content": "doubao-seedream-4-5-251128",
}
catalog = requests.get("https://api.cometapi.com/api/models", timeout=30)
catalog.raise_for_status()
CATALOG = {model["id"]: model for model in catalog.json()["data"]}
def generate(job):
model = job.get("model", ROUTES[job["kind"]])
if model not in CATALOG:
raise ValueError(f"Unknown model: {model}")
payload = {"model": model, "prompt": job["prompt"], "n": 1}
if model == "gpt-image-2":
payload.update(quality="low", size="1024x1024", output_format="jpeg")
for attempt in range(4):
response = requests.post(
f"{BASE_URL}/images/generations",
headers={"Authorization": f"Bearer {KEY}"},
json=payload,
timeout=180,
)
if response.status_code not in {408, 429} and response.status_code < 500:
break
time.sleep(2**attempt + random.random())
response.raise_for_status()
body = response.json()
item = body["data"][0]
if item.get("b64_json"):
data = base64.b64decode(item["b64_json"])
extension = body.get("output_format", "png")
else:
download = requests.get(item["url"], timeout=120)
download.raise_for_status()
data = download.content
extension = {"image/png": "png", "image/webp": "webp"}.get(
download.headers.get("content-type"), "jpg"
)
path = OUT / f"{job['id']}.{extension}"
path.write_bytes(data)
price, usage = CATALOG[model].get("pricing") or {}, body.get("usage", {})
cost = price.get("per_request")
if cost is None and price.get("input") is not None:
cost = (usage.get("input_tokens", 0) * price["input"] +
usage.get("output_tokens", 0) * price["output"]) / 1_000_000
return {"id": job["id"], "model": model, "path": str(path),
"estimated_usd": cost * price.get("ratio", 1) if cost is not None else None}
def safe_generate(job):
try:
return {"status": "success", **generate(job)}
except Exception as error:
return {"id": job["id"], "status": "failed", "error": str(error)}
OUT.mkdir(exist_ok=True)
jobs = [json.loads(line) for line in Path("jobs.jsonl").read_text().splitlines() if line]
with ThreadPoolExecutor(max_workers=WORKERS) as pool:
results = list(pool.map(safe_generate, jobs))
with (OUT / "manifest.jsonl").open("w") as manifest:
manifest.writelines(json.dumps(result) + "\n" for result in results)
Script sử dụng catalog hiện tại tại thời điểm chạy, trong khi hai ánh xạ dự phòng là các ví dụ được xác minh vào ngày 20 tháng 8 năm 2026. Hãy kiểm tra lại trước khi xuất bản hoặc triển khai mã vào một ngày khác.
Cách kiểm thử luồng tạo ảnh hàng loạt
Bắt đầu với một tác vụ và một worker:
MAX_WORKERS=1 python3 batch_image_pipeline.py
Một phản hồi GPT Image thành công có cấu trúc như sau:
{
"created": 1776841943,
"output_format": "jpeg",
"quality": "low",
"size": "1024x1024",
"usage": {
"input_tokens": 16,
"output_tokens": 208,
"total_tokens": 224
},
"data": [{"b64_json": "<base64-image-data>"}]
}
Worker giải mã ảnh, ghi output/<job-id>.jpeg, và thêm một dòng thành công vào output/manifest.jsonl. Nếu một mô hình trả về URL, worker sẽ tải nó xuống và lưu đường dẫn cục bộ theo cùng định dạng manifest.
Mã đã được kiểm tra cú pháp cục bộ. Gọi generation trực tiếp vẫn yêu cầu khóa CometAPI của bạn, vì vậy hãy chạy thử một tác vụ trước khi tăng mức đồng thời.
Chi phí tạo ảnh hàng loạt là bao nhiêu?
Giá cần được đóng dấu thời gian vì mức giá mô hình thay đổi. Tính đến ngày 20 tháng 8 năm 2026, live CometAPI model catalog trả về các trường giá cơ bản sau và tỷ lệ thanh toán 0.8:
gpt-image-2: $5 cho 1M input tokens và $30 cho 1M output tokens; áp dụng tỷ lệ đã liệt kê cho mức giá hiệu dụng $4 và $24 mỗi 1M tokens.doubao-seedream-4-5-251128: $0.04 mỗi yêu cầu; áp dụng tỷ lệ đã liệt kê cho mức $0.032 mỗi yêu cầu.
CometAPI pricing guide giải thích cách tính phí theo token cho các mô hình có giá chính thức và cách tính theo lần gọi cho các mô hình có giá theo yêu cầu. Script đọc catalog khi chạy và sử dụng cùng quy tắc:
token cost = ratio × (input tokens × input rate + output tokens × output rate) / 1,000,000
request cost = ratio × per-request price
Ví dụ, phản hồi GPT Image đã ghi tài liệu ở trên báo cáo 16 input tokens và 208 output tokens. Sử dụng các giá trị catalog ngày 20 tháng 8, kết quả minh họa đó ước tính khoảng $0.005056. Tổng thực tế thay đổi theo mô hình, chất lượng, kích thước, prompt, số lần thử lại và usage trong phản hồi. Hãy coi phản hồi API và bảng điều khiển usage của tài khoản là bản ghi tính phí, không phải giả định chi phí cố định cho mỗi ảnh.
Hãy dự trù ngân sách cho công việc không thành công. Việc thử lại sau một timeout chưa xác nhận có thể tạo ra kết quả được tính phí lần thứ hai, và một ảnh về mặt kỹ thuật là thành công nhưng không qua kiểm duyệt vẫn tiêu tốn ngân sách. Theo dõi cả chi phí API và tỷ lệ chấp nhận:
effective cost per accepted image = total batch spend / approved images
Lỗi thường gặp của Image Generation API và cách khắc phục
| Triệu chứng | Nguyên nhân có thể | Cách khắc phục |
|---|---|---|
| 401 | Thiếu hoặc khóa không hợp lệ | Kiểm tra COMETAPI_KEY phía máy chủ |
| 400 | Model không hợp lệ hoặc tùy chọn không hỗ trợ | Kiểm tra lại catalog trực tiếp và loại bỏ các trường đặc thù mô hình |
| 429 | Quá nhiều đồng thời | Giảm MAX_WORKERS và duy trì backoff lũy tiến |
| Lặp lại 5xx | Lỗi tạm thời ở upstream | Thử lại có giới hạn, sau đó chuyển tác vụ sang dead-letter queue |
| Không lưu ảnh | Phản hồi dùng container khác | Kiểm tra data[0] và hỗ trợ b64_json hoặc url |
| Chi tiêu trùng lặp | Tác vụ được phát lại sau lỗi một phần | Dùng ID bền vững và chỉ xác nhận sau khi lưu trữ thành công |
Đừng thử lại mọi lỗi. Một yêu cầu 400 vĩnh viễn sẽ vẫn không hợp lệ, trong khi vòng lặp thử lại 429 không giới hạn có thể biến đột biến lưu lượng thành tồn đọng.
Thực hành tốt nhất cho tạo ảnh ở quy mô production
Chuyển từ JSON Lines sang hàng đợi bền vững khi nhiều worker tham gia. Đặt visibility timeout dài hơn thời gian tạo tối đa, chỉ xác nhận tác vụ sau khi ảnh và manifest đã được lưu, và gửi các tác vụ cạn số lần thử vào dead-letter queue để xem xét.
Giữ các điều khiển tùy chọn trong cấu hình đặc thù mô hình. Payload chung chỉ nên chứa các trường chung như model, prompt, và n: 1; chỉ thêm quality, size, hoặc output_format sau khi tài liệu của mô hình được chọn xác nhận chúng. Nếu bạn thêm định tuyến dự phòng, hãy chọn mô hình hỗ trợ cùng nhiệm vụ và xây dựng lại payload cho mô hình đó thay vì lặp lại mù quáng các tùy chọn đặc thù nhà cung cấp.
Lưu khóa API trong trình quản lý bí mật, hạn chế đầu vào prompt, quét tài sản đã tạo theo chính sách của bạn, và tránh đưa URL của nhà cung cấp vào hồ sơ sản phẩm dài hạn. Ghi nhật ký ID tác vụ, ID mô hình, độ trễ, số lần thử, usage, đường dẫn lưu trữ, kết quả kiểm duyệt, và ngày chụp catalog. Những trường đó cho phép bạn so sánh mô hình theo chi phí mỗi ảnh được chấp nhận thay vì chỉ theo mức giá danh nghĩa.
Cuối cùng, đặt hàng rào ngân sách: kích thước lô tối đa, giới hạn thử lại mỗi tác vụ, cảnh báo chi tiêu hàng ngày và điều kiện dừng khi tỷ lệ phê duyệt giảm. Mở rộng một prompt kém nhanh hơn không phải là tối ưu hóa.
Câu hỏi thường gặp về tự động hóa tạo ảnh ở quy mô lớn
Cách dễ nhất để tự động hóa tạo ảnh ở quy mô lớn mà không phải quản lý nhiều API là gì?
Sử dụng một luồng hàng đợi và lưu trữ, sau đó gửi các yêu cầu ảnh tương thích thông qua một khóa CometAPI và https://api.cometapi.com/v1/images/generations. Thay đổi model ID trong lớp định tuyến thay vì duy trì xác thực và SDK nhà cung cấp riêng.
Tôi có thể gửi một yêu cầu và yêu cầu nhiều mô hình ảnh tạo cùng lúc không?
Ví dụ gửi một mô hình cho mỗi tác vụ. Fan-out là một luồng công việc ứng dụng: nhân bản một tác vụ với các ID và giá trị mô hình khác nhau, rồi so sánh đầu ra đã lưu. Cách này giữ cho chi phí và trạng thái kiểm duyệt gắn với từng mô hình.
Tôi nên dùng mức đồng thời nào?
Không có con số chung cho mọi tài khoản và mô hình. Bắt đầu với một pool giới hạn nhỏ như bốn worker, theo dõi độ trễ và phản hồi 429, và điều chỉnh dựa trên bằng chứng.
Tôi nên lưu URL trả về hay chính ảnh?
Lưu ảnh trong object storage của bạn. URL trả về có thể là tạm thời, trong khi các mô hình GPT Image có thể trả về nội dung base64 thay vì URL.
Tôi chọn mô hình rẻ nhất bằng cách nào?
Tính chi phí trên mỗi ảnh được chấp nhận, không chỉ giá mỗi lần gọi. Bao gồm phí theo token hoặc yêu cầu, số lần thử lại, tải xuống thất bại, tài sản bị từ chối, hậu xử lý và kiểm duyệt của con người. Kiểm tra lại live model catalog vào ngày bạn xuất bản hoặc triển khai.
Tôi nên xác minh endpoint và định dạng phản hồi ở đâu?
Sử dụng CometAPI Quick Start, tài liệu catalog mô hình, tài liệu tham khảo image generation, và pricing guide.