Tài liệu API tạo ảnh
Tương thích thư viện OpenAI. Đổi địa chỉ và key là chạy được: ảnh vuông, dọc 9:16, ngang 16:9, nền trong suốt, chữ tiếng Việt có dấu.
Thông tin kết nối
https://api.apivn.dev/v1sk-…, do bên cung cấp gửi riênggpt-image-2.5-flareAuthorization: Bearer <API_KEY>Bạn cần làm gì?
Bắt đầu nhanh
Từ lúc nhận key đến ảnh đầu tiên chỉ mất vài phút.
- Nhận API keyBên cung cấp gửi cho bạn một key dạng
sk-…. Giữ kín key này. - Cài thư viện
pip install openai pillow
npm install openai
- Gọi thử tạo ảnhẢnh trả về nằm trong
data[0].b64_json.
import base64
from openai import OpenAI
client = OpenAI(
base_url="https://api.apivn.dev/v1",
api_key="<API_KEY>",
timeout=300, # mỗi ảnh có thể mất tới vài phút
max_retries=0, # không tự gửi lại khi lỗi
)
r = client.images.generate(
model="gpt-image-2.5-flare",
prompt="Một chú cáo trắng ngồi trên mây lúc hoàng hôn",
size="1024x1792", # ảnh dọc 9:16
)
with open("anh.bin", "wb") as f:
f.write(base64.b64decode(r.data[0].b64_json))import OpenAI from "openai";
import fs from "node:fs";
const client = new OpenAI({
baseURL: "https://api.apivn.dev/v1",
apiKey: "<API_KEY>",
timeout: 300000, // 300 giây
maxRetries: 0, // không tự gửi lại khi lỗi
});
const r = await client.images.generate({
model: "gpt-image-2.5-flare",
prompt: "Một chú cáo trắng ngồi trên mây lúc hoàng hôn",
size: "1024x1792", // ảnh dọc 9:16
});
fs.writeFileSync("anh.bin", Buffer.from(r.data[0].b64_json, "base64"));curl https://api.apivn.dev/v1/images/generations \
-H "Authorization: Bearer <API_KEY>" \
-H "Content-Type: application/json" \
--max-time 300 \
-d '{
"model": "gpt-image-2.5-flare",
"prompt": "A white fox sitting on a cloud at sunset",
"size": "1024x1792",
"n": 1
}'https://api.apivn.dev/v1: có /v1, không có dấu / ở cuối.Tạo ảnh
POST /v1/images/generations, cùng định dạng với API ảnh của OpenAI.
Tham số
| Tham số | Bắt buộc | Mô tả |
|---|---|---|
model | Có | gpt-image-2.5-flare: model nhanh, nên dùng mặc định. |
prompt | Có | Mô tả ảnh, tiếng Việt hoặc tiếng Anh. Prompt dài hàng trăm từ vẫn chạy. |
size | Không | Chỉ nhận các giá trị ở Kích thước ảnh. Mặc định auto. |
n | Không | Luôn là 1. Cần nhiều ảnh thì gửi nhiều yêu cầu song song. |
background | Không | "transparent" cho nền trong suốt. |
quality | Không | low, medium, high. Hiện không khác nhau về giá và tốc độ. |
Kết quả trả về
Ảnh luôn ở dạng base64 trong data[0].b64_json, không có link tải.
{
"created": 1763000000,
"data": [ { "b64_json": "iVBORw0KGgoAAAANSUhEUgAA..." } ]
}output_format. Cần đúng một định dạng thì mở bằng Pillow rồi lưu lại:import base64, io
from PIL import Image
img = Image.open(io.BytesIO(base64.b64decode(r.data[0].b64_json)))
img.convert("RGB").save("anh.jpg", quality=92) # hoặc img.save("anh.png")Nền trong suốt
r = client.images.generate(
model="gpt-image-2.5-flare",
prompt="Logo con mèo hoạt hình, nét đơn giản",
size="1024x1024",
background="transparent",
)Tạo nhiều ảnh cùng lúc
Mỗi yêu cầu chỉ ra một ảnh. Muốn nhiều ảnh thì chạy song song, tối đa 5 yêu cầu cùng lúc.
import base64
from concurrent.futures import ThreadPoolExecutor
from openai import OpenAI
client = OpenAI(base_url="https://api.apivn.dev/v1", api_key="<API_KEY>",
timeout=300, max_retries=0)
def make(prompt):
r = client.images.generate(model="gpt-image-2.5-flare", prompt=prompt, size="1024x1792")
return base64.b64decode(r.data[0].b64_json)
prompts = ["Một con mèo trên mái nhà", "Một con chó ở bãi biển", "Một chú chim trong rừng"]
with ThreadPoolExecutor(max_workers=5) as pool:
for i, data in enumerate(pool.map(make, prompts)):
open(f"anh_{i}.bin", "wb").write(data)Chữ trong ảnh
Chữ tiếng Việt có dấu hiển thị đúng. Đặt phần chữ trong dấu ngoặc kép trong prompt để giữ nguyên nội dung.
Poster khuyến mãi nền đỏ, chữ trắng lớn ở giữa: "GIẢM GIÁ 50% - MUA 1 TẶNG 1"
Kích thước ảnh
Chỉ nhận các giá trị size dưới đây. Giá trị khác bị từ chối ngay và không tính phí.
1024x10241024x1792TikTok, Reels, Story1792x1024YouTube, banner1536x10241024x1536Bảng chi tiết
| Nhu cầu | size gửi lên | Ảnh nhận được |
|---|---|---|
| Vuông 1:1 | 1024x1024 | Khoảng 1024–1254 px mỗi cạnh |
| Dọc 9:16 | 1024x1792 | 1008 × 1792 (đúng 9:16) |
| Ngang 16:9 | 1792x1024 | 1672 × 941 (đúng 16:9) |
| Ngang 3:2 | 1536x1024 | Đúng cỡ |
| Dọc 2:3 | 1024x1536 | Đúng cỡ |
| Tự chọn | auto | Thường 1024 × 1024 |
Cần đúng 1080×1920 hoặc 1920×1080
Tạo ảnh ở cỡ gần nhất trong bảng rồi phóng hoặc cắt ở phía bạn. Các cỡ như 1080x1920, 720x1280, 1024x1280, 512x512 bị từ chối.
from PIL import Image
import io, base64
img = Image.open(io.BytesIO(base64.b64decode(r.data[0].b64_json))) # 1008 x 1792
img = img.resize((1080, 1920), Image.LANCZOS)
img.convert("RGB").save("story_1080x1920.jpg", quality=92)2048x2048, 3840x2160, 1152x2048 mất quá lâu và bị ngắt. Cần ảnh lớn để in thì tạo ở 1024 rồi phóng to bằng công cụ khác.Chat và đọc ảnh
Gửi ảnh vào chat để hỏi nội dung hoặc đọc chữ trong ảnh. POST /v1/chat/completions.
Xem model được dùng
curl https://api.apivn.dev/v1/models \
-H "Authorization: Bearer <API_KEY>"Kết quả liệt kê đúng những model key của bạn gọi được. Dùng tên trong danh sách này cho tham số model của chat.
Gửi ảnh để hỏi
resp = client.chat.completions.create(
model="<MODEL_CHAT>", # lấy từ /v1/models
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Mô tả ảnh này bằng tiếng Việt."},
{"type": "image_url", "image_url": {"url": "https://example.com/anh.png"}},
],
}],
)
print(resp.choices[0].message.content)import base64
b64 = base64.b64encode(open("anh.png", "rb").read()).decode()
resp = client.chat.completions.create(
model="<MODEL_CHAT>",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "Đọc chữ trong ảnh này."},
{"type": "image_url", "image_url": {"url": f"data:image/png;base64,{b64}"}},
],
}],
)
print(resp.choices[0].message.content)Giới hạn và tính năng
Biết trước cái gì làm được và cái gì chưa để khỏi mất công thử.
Đã hỗ trợ
| Tính năng | Tình trạng | Ghi chú |
|---|---|---|
| Ảnh vuông, dọc 9:16, ngang 16:9, 3:2, 2:3 | Dùng được | Kích thước ảnh |
| Nền trong suốt | Dùng được | background: "transparent" |
| Chữ tiếng Việt có dấu trong ảnh | Dùng được | Đặt chữ trong ngoặc kép trong prompt |
| Prompt tiếng Việt, prompt dài | Dùng được | Không cần dịch sang tiếng Anh |
| Ảnh sản phẩm, poster, minh họa | Dùng được | |
| Gửi ảnh vào chat để mô tả, đọc chữ | Dùng được | Chat và đọc ảnh |
Thư viện openai chính thức | Dùng được | Đặt max_retries=0 và timeout 300 giây |
Chưa hỗ trợ trong bản này
| Tính năng | Tình trạng | Cách thay thế |
|---|---|---|
| Tạo ảnh từ ảnh có sẵn (đổi nền, đổi phong cách, ghép ảnh, xóa nền) | Chưa có | Mô tả cảnh mong muốn bằng chữ rồi tạo ảnh mới |
| Sửa một vùng bằng mặt nạ | Chưa có | Không có |
| Ảnh 2K, 4K | Chưa có | Tạo cỡ 1024 rồi phóng to ở phía bạn |
Nhiều ảnh trong một yêu cầu (n > 1) | Chưa có | Gửi nhiều yêu cầu song song, tối đa 5 |
Chọn định dạng đầu ra (output_format) | Không đổi được | Mở bằng Pillow rồi lưu lại định dạng cần |
| Biến thể từ ảnh có sẵn (variations) | Chưa có | Không có |
Thời gian và số yêu cầu
max_retries=0)quality low, medium hay high đều có giá và thời gian như nhau, cứ để high.Quy định sử dụng
- Bạn chịu trách nhiệm về nội dung do mình yêu cầu tạo và cách sử dụng ảnh.
- Không dùng để tạo ảnh giả mạo người thật, nội dung lừa đảo, xâm phạm bản quyền hoặc nội dung trái pháp luật.
- Giữ kín API key. Nghi key bị lộ thì báo ngay để được cấp key mới.
Thử tạo ảnh
Tạo một ảnh thử ngay trên trình duyệt. Mỗi lần bấm tính một ảnh vào hạn mức của key bạn.
Mã tương ứng
Lệnh cURL này tạo đúng ảnh như trên, cập nhật theo các ô phía trên.
Lỗi thường gặp
Triệu chứng, nguyên nhân và cách sửa.
Bảng tra nhanh
| Mã / thông báo | Thường là do | Cách sửa |
|---|---|---|
401 Invalid / Unauthorized | Key sai, thiếu ký tự khi copy, hoặc đã bị thu hồi | Copy lại key, kiểm tra không có khoảng trắng thừa; liên hệ hỗ trợ nếu vẫn lỗi |
404 Not Found | Base URL thiếu /v1 hoặc thành /v1/v1 | Đặt đúng https://api.apivn.dev/v1 |
400 Tham số không hợp lệ | size không có trong bảng, hoặc n khác 1 | Sửa theo Kích thước ảnh và Tạo ảnh |
413 Request too large | Dữ liệu gửi lên quá lớn (thường là ảnh gửi vào chat) | Thu nhỏ ảnh trước khi gửi |
503 Dịch vụ không sẵn sàng | Hệ thống tạm thời không nhận yêu cầu | Chờ vài phút rồi thử lại; liên hệ hỗ trợ nếu kéo dài |
524, 504, hết thời gian chờ | Yêu cầu chạy quá lâu (cỡ ảnh quá lớn hoặc đang quá tải) | Dùng cỡ 1024; thử lại một lần sau ít phút |
Thư viện báo Timeout | Timeout phía bạn quá ngắn | Đặt timeout=300 (Python) hoặc timeout: 300000 (Node.js) |
Câu hỏi hay gặp
Vì sao nên đặt max_retries=0?
Thư viện OpenAI tự gửi lại yêu cầu khi gặp lỗi. Với ảnh, yêu cầu đầu có thể đã tạo xong nên gửi lại sẽ tạo thêm ảnh ngoài ý muốn. Hãy tự quyết định có thử lại hay không.
Ảnh trả về là PNG hay WebP?
Có thể là một trong hai và bạn không chọn được. Đọc ảnh bằng Pillow (Python) hoặc sharp (Node.js) rồi lưu lại đúng định dạng cần.
Ảnh dọc cho TikTok phải gửi cỡ nào?
Gửi size: "1024x1792", nhận ảnh 1008×1792 đúng tỉ lệ 9:16, rồi phóng lên 1080×1920 nếu cần. Không gửi trực tiếp 1080×1920.
Yêu cầu bị lỗi thì có bị tính phí không?
Yêu cầu bị từ chối ngay vì tham số sai (lỗi 400) không bị tính. Với yêu cầu bị ngắt giữa chừng, hãy liên hệ hỗ trợ kèm thời điểm gửi để được kiểm tra.
Dùng một key trên nhiều máy được không?
Được, nhưng giữ tổng số yêu cầu chạy cùng lúc trên mọi máy không quá 5.
Có sửa ảnh có sẵn được không?
Bản này chưa hỗ trợ tạo ảnh từ ảnh. Xem Giới hạn và tính năng.
Vẫn không chạy?
- Gọi thẳng bằng cURL để loại trừ lỗi do mã của bạn:
Lệnh này chạy mà mã của bạn không chạy thì lỗi nằm ở cấu hình trong mã.
curl https://api.apivn.dev/v1/models \ -H "Authorization: Bearer <API_KEY>" - Soi lại ba thứ: Base URL có
/v1, key dán đủ ký tự, tên model đúng. - Liên hệ hỗ trợ: [ĐIỀN LIÊN HỆ HỖ TRỢ]. Gửi ảnh chụp lỗi và 4 ký tự cuối của key, không gửi cả key.