AI Hình Ảnh
API & tự động hoá hình ảnh

Chuyển mã OpenAI Images sang AI Hình Ảnh chỉ bằng cách đổi base URL

23/09/2026 · 3 phút đọc · AI Hình Ảnh

Mã Python, Node.js và PHP cURL chạy được ngay, bảng đối chiếu tham số model, size, quality, và những chỗ khác biệt cần sửa để không bị trừ nhầm hạng Max.

Chuyển mã OpenAI Images sang AI Hình Ảnh chỉ bằng cách đổi base URL

Nếu hệ thống của bạn đang gọi OpenAI Images để vẽ hình đầu bài hay hình ảnh sản phẩm, chuyển sang AI Hình Ảnh thường chỉ mất mười phút: đổi base_url, đổi khoá, đổi tên model. Phần còn lại của bài là những khác biệt nhỏ mà ai bỏ qua sẽ gặp ở tuần thứ hai: câu lệnh tiếng Việt cho kết quả kém, quality: "hd" bị tính hạng đắt nhất, n: 4 với hạng Max chỉ trả về hai hình ảnh. Mã mẫu bên dưới chạy được nguyên văn, chỉ cần thay khoá.

Chuẩn bị: khoá và một lệnh thử

Đăng nhập, vào trang khoá API, tạo khoá. Khoá có dạng ahn_ theo sau là một chuỗi dài. Đặt vào biến môi trường, đừng dán thẳng vào mã:

```bash
export AHN_KEY="ahn_XXXX"
```

Thử bằng curl trước khi đụng vào mã:

```bash
curl -s https://aihinhanh.com/v1/images/generations \
-H "Authorization: Bearer $AHN_KEY" \
-H "Content-Type: application/json" \
-d '{"model":"plus","prompt":"A ceramic coffee cup on a wooden windowsill, morning light, shallow depth of field, realistic photo","size":"1536x1024","n":1,"response_format":"url"}'
```

Kết quả có dạng:

```json
{"created":1792130000,"model":"plus","data":[{"revised_prompt":"A ceramic coffee cup ...","url":"https://aihinhanh.com/out/..."}],"usage":{"images":1,"credits":500}}
```

usage.credits là số điểm đã trừ cho các hình ảnh trả về. Xem danh sách hạng và giá hiện hành bằng GET https://aihinhanh.com/v1/models.

Python: thư viện openai

```python
import base64
import os
from openai import OpenAI

client = OpenAI(
api_key=os.environ["AHN_KEY"],
base_url="https://aihinhanh.com/v1",
timeout=120, # mỗi lượt chờ tối đa khoảng 90 giây
max_retries=2, # thư viện tự thử lại khi gặp 503
)

r = client.images.generate(
model="plus",
prompt=(
"A bowl of Vietnamese beef noodle soup on a worn wooden table, "
"fresh herbs and lime on the side, steam rising, soft window light, "
"realistic food photo, 45-degree angle"
),
size="1536x1024",
n=1,
extra_body={"output_format": "webp"},
)

with open("pho.webp", "wb") as f:
f.write(base64.b64decode(r.data[0].b64_json))
print("Đã lưu pho.webp")
```

Hai chỗ đáng chú ý:

  • output_format truyền qua extra_body để chạy được với cả bản thư viện cũ chưa có tham số này. Mặc định API trả png; webp nhẹ hơn nhiều cho web.
  • timeout=120: lượt vẽ là đồng bộ, máy chủ chờ tối đa khoảng 90 giây. Đặt thời gian chờ phía bạn ngắn hơn mức đó là tự cắt ngang những lượt sắp xong.

Thư viện openai cho Python tự thử lại với mã 503 và tôn trọng header Retry-After. Với chạy hàng loạt, nên tự viết vòng thử lại để kiểm soát số lần và thời gian chờ; xem bài xử lý lỗi 503 và Retry-After.

Node.js: thư viện openai

```javascript
import OpenAI from "openai";
import { writeFile } from "node:fs/promises";

const client = new OpenAI({
apiKey: process.env.AHN_KEY,
baseURL: "https://aihinhanh.com/v1",
timeout: 120_000,
maxRetries: 2,
});

const r = await client.images.generate({
model: "pro",
prompt:
"A linen summer dress hanging on a rattan chair by an open window, " +
"soft natural light, visible fabric texture, product photo, vertical frame",
size: "1024x1536",
n: 1,
output_format: "webp",
});

await writeFile("vay.webp", Buffer.from(r.data[0].b64_json, "base64"));
console.log("Đã lưu vay.webp");
```

Chạy bằng Node 18 trở lên, tệp đuôi .mjs hoặc đặt "type": "module" trong package.json. Nếu dùng TypeScript và trình biên dịch kêu model: "pro" hay size: "1024x1536" không thuộc kiểu cho phép, ép kiểu đối tượng tham số (as any) là đủ; API nhận chuỗi tự do.

PHP cURL: không cần thư viện

Nhiều website Việt Nam chạy PHP trên máy chủ thuê, không cài được Composer. cURL có sẵn là đủ:

```php
<?php
$key = getenv('AHN_KEY') ?: 'ahn_XXXX';

$payload = json_encode([
'model' => 'plus',
'prompt' => 'A Vietnamese street corner at dawn, empty plastic stools, '
. 'soft mist, warm light, realistic photo, wide angle',
'size' => '1664x928',
'n' => 1,
'output_format' => 'webp',
]);

$retryAfter = 0;
$ch = curl_init('https://aihinhanh.com/v1/images/generations');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => $payload,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer ' . $key,
'Content-Type: application/json',
],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 120,
CURLOPT_HEADERFUNCTION => function ($ch, $line) use (&$retryAfter) {
if (stripos($line, 'Retry-After:') === 0) {
$retryAfter = (int) trim(substr($line, 12));
}
return strlen($line);
},
]);
$body = curl_exec($ch);
$code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
curl_close($ch);

$json = json_decode((string) $body, true);
if ($code !== 200) {
$msg = $json['error']['message'] ?? 'không rõ';
exit("Lỗi $code: $msg" . ($retryAfter ? " (thử lại sau {$retryAfter}s)" : '') . "\n");
}
file_put_contents(__DIR__ . '/goc-pho.webp', base64_decode($json['data'][0]['b64_json']));
echo 'Đã lưu, trừ ' . $json['usage']['credits'] . " điểm\n";
```

Lỗi trả về theo khuôn của OpenAI: {"error": {"message": "...", "type": "...", "code": 503}}, nên mã xử lý lỗi cũ của bạn thường đọc được nguyên.

Bảng đối chiếu tham số

Tham sốOpenAIAI Hình Ảnh
modelgpt-image-1, dall-e-3…plus (500đ), pro (1.000đ), max (1.500đ); tên OpenAI vẫn chạy (xem dưới)
promptTiếng gì cũng đượcTối đa 4.000 ký tự; API không tự dịch, viết tiếng Anh cho kết quả sát nhất
sizeVài khổ cố địnhRỘNGxCAO bất kỳ, cạnh dài tới 2048, tự làm tròn về bội số 16, tối đa khoảng 2,4 MP
n1–10 tuỳ mô hình1–4
qualitystandard, hd, high…Chỉ có tác dụng khi model là tên OpenAI: high hoặc hd → Max
output_formatpng, jpeg, webppng (mặc định), jpeg, webp
response_formatb64_json, urlb64_json (mặc định), url
Các tham số khác (style, background…)Có tác dụngKhông có tác dụng
Sửa hình ảnh, biến thể (/images/edits, /variations)CóKhông có, chỉ có /images/generations và /models

Những chỗ hay vấp khi chuyển

Tên mô hình cũ và hạng bị tính

Mã cũ gửi model: "dall-e-3" vẫn chạy. Quy tắc: nếu đi kèm quality: "high" (hoặc "hd"), lượt vẽ chạy hạng Max, 1.500 điểm mỗi hình ảnh; mọi trường hợp khác chạy hạng Plus, 500 điểm. Nhiều mã cũ để sẵn quality: "hd" vì thói quen, và chuyển sang là bị tính giá gấp ba mà không hay biết. Sau khi chuyển, đổi hẳn sang model: "plus", "pro" hoặc "max" để đọc mã là biết hạng.

Khổ của DALL·E 3

Khổ 1792x1024 và 1024x1792 quen thuộc của DALL·E 3 được tự đổi sang 1664x928 (16:9) và 928x1664 (9:16), là hai khổ màn rộng và dọc của AI Hình Ảnh. Hình ảnh trả về vì thế có kích thước khác yêu cầu một chút; mã nào cắt khung theo số cứng 1792 cần sửa thành đọc kích thước thật từ tệp.

Câu lệnh tiếng Việt

Trang web có bước chuyển mô tả tiếng Việt thành câu lệnh vẽ tiếng Anh; API thì không. Gửi tiếng Việt vẫn vẽ được nhưng kém sát ý, nhất là với món ăn, đồ vật đặc trưng Việt Nam. revised_prompt trong kết quả trả lại chính câu bạn gửi, không phải câu đã viết lại. Cách học viết câu lệnh nhanh: gõ mô tả tiếng Việt trên ô vẽ, xem dòng "Câu lệnh vẽ" dưới kết quả, rồi làm khuôn cho mã của bạn.

n lớn với hạng chậm

Các hình ảnh trong một lượt được vẽ lần lượt, và cả lượt chỉ có khoảng 90 giây. Plus (khoảng 6–10 giây mỗi hình ảnh) với n: 4 thoải mái. Max (25–40 giây mỗi hình ảnh) với n: 4 thường chỉ kịp hai hoặc ba; số hình ảnh không kịp vẽ được hoàn điểm. Mã cũ giả định len(r.data) == n sẽ lỗi. Luôn lặp theo r.data thực nhận, và với Max thì gửi n: 1 hoặc 2, nhiều lượt nối nhau. Chi tiết tính toán ở bài chọn model, size, n tối ưu.

Gọi song song

Hệ thống của bạn có thể đang bắn mười yêu cầu cùng lúc tới OpenAI. Máy vẽ của AI Hình Ảnh đặt tại Việt Nam, dùng chung với các dịch vụ khác, nhận một số lượt đồng thời có hạn; vượt quá sẽ nhận 503 kèm Retry-After. Chạy tuần tự, hoặc tối đa hai luồng, thường nhanh hơn tổng thể vì không mất thời gian chờ thử lại.

Bảng mã lỗi

MãNghĩaLàm gì
400Tham số sai, thiếu promptSửa dữ liệu, đừng gửi lại y nguyên
401Thiếu khoá, sai khoá, khoá đã tắtKiểm tra header Authorization: Bearer ahn_…
402Không đủ điểmNạp thêm điểm, dừng hàng đợi
503Máy vẽ bậnĐọc Retry-After (giây), chờ rồi thử lại

Danh sách việc khi chuyển

  1. Tạo khoá, đặt vào biến môi trường.
  2. Đổi base_url thành https://aihinhanh.com/v1.
  3. Đổi model sang plus, pro hoặc max; bỏ quality.
  4. Kiểm tra size, đọc kích thước thật thay vì số cứng.
  5. Viết câu lệnh tiếng Anh.
  6. Lặp theo số hình ảnh thực nhận, không theo n.
  7. Đặt thời gian chờ 120 giây, xử lý 503 bằng Retry-After.
  8. Chuyển sang chạy tuần tự nếu đang bắn song song.

Giá API bằng giá web, xem ở bảng giá. Ví điểm dùng chung với các dịch vụ khác của hệ AI Đỉnh.

Hỏi đáp nhanh

Có cần cài thư viện riêng của AI Hình Ảnh không?
Không. Thư viện openai chính thức cho Python và Node.js dùng được nguyên, chỉ cần đặt base_url là https://aihinhanh.com/v1 và dùng khoá ahn_. Với PHP hay ngôn ngữ khác, gọi HTTP thẳng bằng cURL là đủ.
Gửi model dall-e-3 thì bị tính giá nào?
Nếu kèm quality high hoặc hd thì chạy hạng Max, 1.500 điểm mỗi hình ảnh; còn lại chạy Plus, 500 điểm. Nên đổi hẳn sang plus, pro hoặc max để rõ ràng.
Gửi câu lệnh tiếng Việt qua API có được không?
Vẫn vẽ được, nhưng API không tự dịch nên kết quả kém sát ý hơn. Nên viết tiếng Anh; có thể học khuôn câu từ dòng câu lệnh vẽ hiện dưới kết quả trên trang web.
Có dùng được endpoint sửa hình ảnh hay tạo biến thể không?
Không. API chỉ có tạo hình ảnh mới từ câu lệnh (/v1/images/generations) và liệt kê hạng (/v1/models).
Tại sao gửi n bằng 4 mà chỉ nhận về 2 hình ảnh?
Các hình ảnh trong một lượt vẽ lần lượt và cả lượt có khoảng 90 giây. Với hạng chậm như Max, hình ảnh nào không kịp vẽ sẽ không trả về và được hoàn điểm; nên gửi n nhỏ và nhiều lượt nối nhau.
Tạo hình ảnh bằng AI từ mô tả tiếng ViệtGõ mô tả tiếng Việt, chọn hạng Plus, Pro hoặc Max — có hình ảnh trong vài giây.
Vẽ hình ảnh ngay

Đọc tiếp

Liên hệ AI Hình Ảnh
📞 Gọi 0918 832 283💬 Chat Zalo🟢 WhatsAppĐóng