Chuyển mã OpenAI Images sang AI Hình Ảnh chỉ bằng cách đổi base URL
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.

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_formattruyền quaextra_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;webpnhẹ 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ố | OpenAI | AI Hình Ảnh |
|---|---|---|
model | gpt-image-1, dall-e-3… | plus (500đ), pro (1.000đ), max (1.500đ); tên OpenAI vẫn chạy (xem dưới) |
prompt | Tiếng gì cũng được | Tố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 |
size | Vài khổ cố định | RỘ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 |
n | 1–10 tuỳ mô hình | 1–4 |
quality | standard, hd, high… | Chỉ có tác dụng khi model là tên OpenAI: high hoặc hd → Max |
output_format | png, jpeg, webp | png (mặc định), jpeg, webp |
response_format | b64_json, url | b64_json (mặc định), url |
Các tham số khác (style, background…) | Có tác dụng | Khô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ĩa | Làm gì |
|---|---|---|
| 400 | Tham số sai, thiếu prompt | Sửa dữ liệu, đừng gửi lại y nguyên |
| 401 | Thiếu khoá, sai khoá, khoá đã tắt | Kiểm tra header Authorization: Bearer ahn_… |
| 402 | Không đủ điểm | Nạp thêm điểm, dừng hàng đợi |
| 503 | Máy vẽ bận | Đọc Retry-After (giây), chờ rồi thử lại |
Danh sách việc khi chuyển
- Tạo khoá, đặt vào biến môi trường.
- Đổi
base_urlthànhhttps://aihinhanh.com/v1. - Đổi
modelsangplus,prohoặcmax; bỏquality. - Kiểm tra
size, đọc kích thước thật thay vì số cứng. - Viết câu lệnh tiếng Anh.
- Lặp theo số hình ảnh thực nhận, không theo
n. - Đặt thời gian chờ 120 giây, xử lý 503 bằng
Retry-After. - 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.



