AHV AI Orchestrator

Dịch vụ API xử lý các tác vụ AI nặng — đổi mặt, nâng cấp ảnh, tạo ảnh/video, nhạc, giọng nói, thử đồ ảo… — theo cơ chế job bất đồng bộ: bạn gửi yêu cầu, nhận ngay job_id, rồi nhận kết quả qua webhook hoặc polling.

Kiến trúc (mức khái niệm)

Client ──HTTPS──► API │ ▼ Orchestrator (hàng đợi + điều phối) │ ▼ Cụm GPU xử lý │ ▼ Kết quả (url + meta) ├─ Webhook: queued / started / finished └─ hoặc polling: GET /v1/jobs/{job_id}
  • Bất đồng bộ: POST /v1/jobs trả về ngay; việc nặng chạy nền, bạn không phải giữ kết nối.
  • Điều phối tự động: orchestrator xếp hàng đợi và chọn tài nguyên xử lý phù hợp trong cụm GPU. Phía khách không cần (và không thể) chọn máy xử lý.
  • Ước tính thời gian: mỗi job trả về predict_time (giây) và eta_utc — chỉ là ước tính tham khảo, không phải cam kết.
  • Kiểm duyệt nội dung: nội dung đầu vào có thể được hệ thống kiểm duyệt tự động; nội dung vi phạm bị từ chối (rejected).

Tương thích ngược: tính năng mới được bổ sung dưới dạng tham số tuỳ chọn. Gọi theo cách cũ (không gửi tham số mới) vẫn cho kết quả như trước.

Bắt đầu nhanh

Mọi API công khai nằm dưới https://ai.ahvchat.com. Ba bước để chạy job đầu tiên:

1. Tạo job

curl -X POST https://ai.ahvchat.com/v1/jobs \
  -H "Content-Type: application/json" \
  -H "X-API-Key: YOUR_API_KEY" \
  -d '{
    "task": "faceswap",
    "payload": {
      "target_url": "https://example.com/photo.jpg",
      "source_url": "https://example.com/face.jpg"
    },
    "webhook_url": "https://your-server.com/webhook"
  }'

Phản hồi:

{
  "job_id": "JOB_ID",
  "status": "queued",
  "predict_time": 10,
  "eta_utc": "2026-11-11T10:00:10Z"
}

2. Nhận kết quả

Có hai cách (dùng một hoặc cả hai): chờ webhook gửi tới webhook_url, hoặc hỏi trạng thái job bằng polling:

curl https://ai.ahvchat.com/v1/jobs/JOB_ID \
  -H "X-API-Key: YOUR_API_KEY"

3. Tải kết quả về

Khi status là succeeded, lấy result.url và tải tệp về lưu ở hệ thống của bạn — liên kết kết quả chỉ tồn tại tạm thời (xem Khuyến nghị tích hợp).

Xác thực

Các API tạo/đọc job và kiểm duyệt ảnh yêu cầu header:

X-API-Key: YOUR_API_KEY
  • Khoá API do AHV cấp. Cần khoá API hoặc hỗ trợ tích hợp? Xem mục Liên hệ ở trang chủ.
  • Decide API dùng một khoá riêng (xem Decide API).
  • Thiếu hoặc sai khoá ⇒ HTTP 401.
  • Chỉ dùng khoá ở máy chủ của bạn. Không nhúng khoá vào app di động, trang web hay mã nguồn công khai. Nếu nghi ngờ khoá bị lộ, hãy liên hệ AHV để thu hồi và cấp khoá mới.

Trong tài liệu này, YOUR_API_KEY chỉ là chỗ giữ chỗ — hãy thay bằng khoá của bạn.

Vòng đời job & trạng thái

Trạng tháiÝ nghĩaCuối cùng?
queuedĐã nhận, đang chờ trong hàng đợi.Không
runningĐang xử lý. progress tăng từ 0 đến 100.Không
succeededHoàn thành; có result.url.Có
failedLỗi kỹ thuật hoặc quá thời gian xử lý; có error.Có
rejectedBị từ chối do nội dung vi phạm (NSFW_BLOCKED).Có

Luồng xử lý

  1. Client gửi POST /v1/jobs với task, payload và (tuỳ chọn) webhook_url.
  2. Job được ghi nhận ở trạng thái queued; phản hồi có job_id, predict_time, eta_utc.
  3. Webhook giai đoạn 1: sự kiện job.queued.
  4. Hệ thống nhận job từ hàng đợi và giao cho tài nguyên xử lý phù hợp; webhook giai đoạn 2: job.started.
  5. Xử lý xong, hệ thống lưu kết quả; webhook giai đoạn 3: job.finished kèm result hoặc error.

Job không lưu vĩnh viễn. Thông tin job và tệp kết quả chỉ được giữ trong một khoảng thời gian giới hạn rồi bị xoá tự động. Hãy lưu kết quả cần thiết ngay khi job hoàn tất.

API: Tạo & theo dõi job

POST /v1/jobs — Tạo job

TrườngBắt buộcMô tả
taskCóLoại tính năng, ví dụ faceswap, try_on, ahv_image. Xem danh sách tính năng.
payloadCóTham số riêng của từng task (xem các mục Tính năng).
webhook_urlKhôngURL HTTPS nhận kết quả. Bỏ trống nếu bạn dùng polling.

Ví dụ gọi: xem Bắt đầu nhanh. Phản hồi thành công gồm job_id, status (queued), predict_time, eta_utc.

GET /v1/jobs/{job_id} — Xem trạng thái

Khi thành công

{
  "job_id": "JOB_ID",
  "task": "faceswap",
  "status": "succeeded",
  "progress": 100,
  "result": {
    "url": "https://...",
    "filename": "result.jpg",
    "meta": {"width": 1080, "height": 1920}
  },
  "duration_sec": 3.5
}

Khi lỗi

{
  "job_id": "JOB_ID",
  "status": "failed",
  "error": {"code": 502, "message": "Processing timeout"}
}

result.meta chứa thông tin bổ sung tuỳ task (kích thước, thời lượng…). Chỉ nên dựa vào các trường đã được mô tả trong API Docs; các trường khác có thể thay đổi.

Chi tiết payload từng task: xem API Docs, mục 1.

API: Upload & kiểm duyệt ảnh

POST /upload — Upload tệp

Dùng khi ảnh/âm thanh của bạn chưa có URL công khai (hoặc nguồn chặn tải trực tiếp). Gửi tệp bằng multipart/form-data, nhận lại URL để dùng làm đầu vào cho job.

curl -X POST https://ai.ahvchat.com/upload -F "file=@photo.jpg"
{"url": "https://...", "filename": "..."}

Tệp upload chỉ lưu tạm; hãy tạo job ngay sau khi upload.

POST /v1/nsfw-check — Kiểm duyệt ảnh

Kiểm tra nhanh một ảnh có nội dung 18+ hay không. Gửi image_url (hoặc tệp ảnh) kèm mức strict:

strictMô tả
lowMặc định.
mediumNhạy hơn mức mặc định.
highNhạy nhất.

Kết quả gồm cờ is_nsfw và nhãn (safe/nsfw). Cần header X-API-Key. Định dạng chi tiết: xem API Docs.

Webhook

Nếu job có webhook_url, hệ thống gửi POST JSON tới URL đó ở 3 thời điểm:

Thời điểmeventstatus
Job được nhậnjob.queuedqueued
Bắt đầu xử lýjob.startedrunning
Xử lý xongjob.finishedsucceeded / failed / rejected

Payload khi thành công

{
  "event": "job.finished",
  "event_id": "...",
  "job_id": "JOB_ID",
  "task": "faceswap",
  "status": "succeeded",
  "ok": true,
  "progress": 100,
  "duration": 3.5,
  "predict_time": 10,
  "result": {
    "ok": true,
    "status": "succeeded",
    "url": "https://...",
    "filename": "result.jpg",
    "meta": {"width": 1080, "height": 1920}
  },
  "error": null
}

Payload khi lỗi / bị từ chối

{
  "event": "job.finished",
  "job_id": "JOB_ID",
  "status": "failed",
  "ok": false,
  "error": {"code": 502, "message": "Processing timeout"}
}

{
  "event": "job.finished",
  "job_id": "JOB_ID",
  "status": "rejected",
  "ok": false,
  "error": {"code": "NSFW_BLOCKED", "message": "Content violates policy"}
}

Phía máy chủ của bạn nên

  • Trả HTTP 2xx nhanh (xử lý nặng thì đưa vào hàng đợi của bạn). Nếu không nhận được 2xx, sự kiện có thể được gửi lại.
  • Chống trùng: cùng một sự kiện có thể được gửi nhiều hơn một lần. Dùng job_id + event (hoặc event_id) để bỏ qua bản trùng.
  • Đối chiếu trước khi hành động quan trọng (cộng tiền, giao hàng…): gọi GET /v1/jobs/{job_id} để xác nhận trạng thái thật thay vì chỉ tin nội dung request.
  • Giữ kín webhook_url (dùng HTTPS, đừng ghi vào log công khai) và chỉ nhận phương thức POST. URL không phải cơ chế xác thực — hãy dựa vào bước đối chiếu ở trên.
  • Luôn có phương án dự phòng: nếu không nhận được webhook, dùng polling theo job_id.

API: Decide (quyết định có kiểu)

Gửi một nội dung (state) kèm vài câu hỏi có kiểu → nhận đáp án có cấu trúc kèm xác suất. API đồng bộ (trả kết quả ngay trong response, không tạo job) và tương thích với các client Decide chuẩn: chỉ cần đổi base_url (chi tiết tương thích xem API Docs).

EndpointMô tả
POST /decide/v1/systemoneĐặt 1–32 câu hỏi cho một state (tối đa 2.048 token).
GET /decide/v1/modelsDanh sách tên model có thể dùng.
  • Base URL cho client tương thích: https://ai.ahvchat.com/decide
  • Xác thực: header Authorization: Bearer YOUR_API_KEY hoặc X-API-Key: YOUR_API_KEY. Đây là khoá riêng của Decide API, không phải khoá dùng cho /v1/jobs.
  • 3 kiểu câu hỏi: noul (có/không → xác suất), choice (chọn 1 nhãn trong 2–255 nhãn), score (thang 2–10 mức). Các trường mở rộng của AHV (ví dụ warnings): xem API Docs.
  • Mã lỗi: 401 sai/thiếu khoá, 429 gọi quá nhanh, 503 dịch vụ tạm thời không khả dụng (thử lại sau).
curl -s https://ai.ahvchat.com/decide/v1/systemone \
  -H "Authorization: Bearer YOUR_API_KEY" -H "Content-Type: application/json" \
  -d '{"model":"jev-latest","state":"Mình đã thanh toán nhưng chưa thấy đơn hàng được xác nhận!",
       "questions":{"gap":{"type":"score","instructions":"Mức gấp?",
                           "criteria":["không gấp","sớm","khẩn cấp"]}}}'

Tài liệu đầy đủ: API Docs, mục 10; thử trực tiếp ở tab Decide trên API Demo.

Danh sách tính năng (task)

Giá trị task gửi trong POST /v1/jobs. Cột “Chi tiết” dẫn tới mục tương ứng trong API Docs.

TaskÝ nghĩaĐầu vào chínhChi tiết
faceswapĐổi mặt trên ảnhtarget_url, source_urlAPI Docs
faceswap_multiĐổi nhiều khuôn mặt trong một ảnhtarget_url, source_urls[]API Docs
faceswap_videoĐổi mặt trong video, giữ nguyên âm thanhtarget_url, source_urlAPI Docs
upscaleNâng cấp, làm nét và làm đẹp ảnh bằng AIimage_urlAPI Docs
ahv_imageTạo ảnh từ mô tả (text-to-image) hoặc biến đổi ảnh (image-to-image)promptAPI Docs
gg_image, cx_imageTạo ảnh từ mô tả bằng các engine bổ sungpromptGG · CX
ahv_videoTạo video (có tiếng) từ mô tả, tuỳ chọn kèm ảnh nguồnpromptAPI Docs
talking_videoẢnh chân dung + giọng nói → video người trong ảnh nói khớp môiimage_url + audio_url hoặc scriptMục bên dưới
music_genTạo bài nhạc (có lời hoặc hoà tấu) từ mô tảprompt, lyrics, durationMục bên dưới
music_coverPhối lại / đổi giọng từ audio có sẵnaudio_url, modeMục bên dưới
tts, sttChữ → giọng nói; giọng nói → chữvăn bản (tts) / tệp âm thanh (stt)API Docs
try_onThử đồ ảo: mặc trang phục lên người trong ảnhperson_image_url, garment_image_urlMục bên dưới
remove_objectXoá vật thể khỏi ảnhimage_url, prompt hoặc mask_urls[]Mục bên dưới
scan_objectsPhát hiện và gán nhãn các vật thể trong ảnhimage_urlMục bên dưới
remove_backgroundTách nền ảnh tự độngimage_urlMục bên dưới
nsfw_checkKiểm duyệt nội dung ảnhimage_url, strictMục bên dưới
tattooGhép hình xăm lên đúng vùng da được chọnimage_url, tattoo_image_url, vùng chọnAPI Docs
ad_videoVideo quảng cáo nhiều cảnh (2–10 cảnh) dựng tự độngkịch bản các cảnhAPI Docs

Ngoài job bất đồng bộ, API Docs còn mô tả các API đồng bộ: Chat LLM (mục 7) và Giọng nói (mục 8), cùng Decide API ở trên.

Faceswap & Upscale

faceswap

Đổi một khuôn mặt lên ảnh đích.

Bắt buộc: target_url, source_url

faceswap_multi

Đổi nhiều khuôn mặt trong một ảnh.

Bắt buộc: target_url, source_urls[]

faceswap_video

Đổi mặt trong video, giữ nguyên âm thanh. Video dài xử lý lâu hơn — nên dùng webhook.

Bắt buộc: target_url (video), source_url (ảnh mặt)

upscale

Nâng cấp, làm nét và khôi phục chi tiết ảnh bằng AI.

Bắt buộc: image_url

Tham số tuỳ chọn

Tham sốMặc địnhMô tả
max_side1080Cạnh dài tối đa của ảnh kết quả (px).
max_faces0 (tất cả)Giới hạn số khuôn mặt được đổi.
upscale1Bật nâng cấp độ phân giải (0/1).
restore_face1Bật khôi phục chi tiết khuôn mặt (0/1).
sharpen0.12Độ làm nét (0–1).

Kiểm duyệt nội dung: nội dung đầu vào có thể được kiểm duyệt tự động. Vi phạm ⇒ status: "rejected" với mã NSFW_BLOCKED.

Tạo ảnh

ahv_image

Tạo ảnh từ mô tả (text-to-image) hoặc biến đổi ảnh có sẵn (image-to-image). Hệ thống tự chọn engine phù hợp.

gg_image

Tạo ảnh từ mô tả bằng engine bổ sung. Chi tiết trong API Docs.

cx_image

Tạo ảnh từ mô tả bằng engine bổ sung, hỗ trợ ảnh tham chiếu. Chi tiết trong API Docs.

Payload (ahv_image)

Tham sốBắt buộcMô tả
promptCóMô tả ảnh mong muốn.
image_urlKhôngẢnh nguồn cho image-to-image.
width / heightKhôngKích thước ảnh kết quả.
aspect_ratioKhông1:1, 16:9, 9:16.
seedKhôngSố ngẫu nhiên cố định để tái tạo kết quả.

Tham số nâng cao của từng engine: xem API Docs. Chỉ gửi các tham số có trong tài liệu.

Tạo video

ahv_video

Tạo video (có tiếng) từ mô tả, tuỳ chọn kèm ảnh nguồn (image-to-video).

Bắt buộc: prompt

Payload

Tham sốBắt buộcMô tả
promptCóMô tả video.
image_urlKhôngẢnh nguồn (image-to-video).
durationKhôngĐộ dài video, mặc định 6 giây.
aspect_ratioKhông16:9, 9:16, 1:1.
fpsKhôngSố khung hình/giây.

Việc tạo video mất nhiều thời gian hơn ảnh — hãy dùng webhook hoặc polling thưa (mỗi vài chục giây).

Talking video (lip sync)

Gửi một ảnh chân dung kèm nguồn giọng nói → nhận video người trong ảnh nói đúng lời, khớp môi. Dùng chung task: "talking_video"; ba luồng khác nhau ở nguồn giọng:

LuồngPayloadMô tả
Aimage_url + audio_urlBạn đã có sẵn tệp âm thanh.
Simage_url + script (+ language)Hệ thống đọc kịch bản bằng giọng máy (TTS).
SCimage_url + script + voice_ref_url (+ ref_text)Hệ thống đọc kịch bản bằng giọng nhân bản từ một mẫu giọng.

Tham số

Tham sốMô tả & giới hạn
image_urlBắt buộc. Ảnh người: JPG/PNG/WebP, ≤ 10 MB, cạnh ngắn ≥ 256 px, cạnh dài ≤ 4096 px, ≤ 16 megapixel.
audio_urlLuồng A. mp3/wav/m4a/aac/ogg/flac/opus, ≤ 20 MB, dài 1–120 giây.
scriptLuồng S/SC. 1–800 ký tự; giọng đọc dài tối đa khoảng 60 giây (quá dài sẽ được rút ngắn).
languageTuỳ chọn, đi cùng script; mặc định vi.
tts_instructTuỳ chọn, ≤ 200 ký tự: mô tả phong cách giọng (giới tính, tuổi, cao độ…). Có thể viết tiếng Việt. Không nhận ra kiểu giọng nào ⇒ lỗi 400 TV_INSTRUCT_INVALID.
voice_ref_urlLuồng SC. Giọng mẫu 5–30 giây, ≤ 10 MB, phải nghe rõ lời.
ref_textTuỳ chọn, ≤ 500 ký tự: lời của giọng mẫu. Bỏ trống thì hệ thống tự xử lý.
promptTuỳ chọn, ≤ 300 ký tự: mô tả thêm dáng vẻ/cử chỉ khi nói.
resolutionTuỳ chọn; hiện chỉ nhận 480p (mặc định).
seedTuỳ chọn, số nguyên 0–2147483647; nếu bỏ trống, hệ thống chọn ngẫu nhiên và trả lại trong meta.seed.

Thời gian xử lý

Thời gian tỉ lệ thuận với độ dài video — từ vài phút đến vài chục phút. Hãy dùng webhook job.finished; nếu polling thì thưa (30–60 giây/lần). Video kết quả được đánh dấu là nội dung do AI tạo. Khi hệ thống đang bận có thể trả TV_BUSY; xem Mã lỗi. Chi tiết đầy đủ: API Docs, mục 9.

Nhạc: music_gen / music_cover

music_gen

Mô tả phong cách (+ lời, hoặc [auto:vi] để AI tự viết lời) → bài nhạc dài 30–240 giây. Có thể sáng tác từ ảnh (image_url) hoặc hoà tấu không lời.

Thường dùng: prompt, lyrics, duration, format

music_cover

Từ audio có sẵn + phong cách → phối lại hoặc đổi giọng. Bốn kịch bản theo mode (bảng dưới).

Luôn cần: audio_url

music_cover — bốn kịch bản

Kịch bảnPayloadLàm gì
Phối lại + đổi giọngmode: "remix" + prompt + voice_ref_urlĐổi giọng theo giọng mẫu, rồi phối lại nhạc theo prompt.
Phối lại · giữ giọngmode: "remix" + promptĐổi phong cách nhạc, giữ nguyên lời.
Giữ nhạc · đổi giọngmode: "voice" + voice_ref_url (không cần prompt)Giữ nhạc gốc, đổi giọng hát theo giọng mẫu.
Tự hát → phối nhạcmode: "vocal" + promptBạn tự hát, hệ thống phối nhạc đệm. Không nhận voice_ref_url.
  • Sai tổ hợp tham số (ví dụ mode: "voice" thiếu voice_ref_url, hoặc thiếu prompt ở remix/vocal) ⇒ lỗi 400 ngay, không cần thử lại.
  • Đây là các task dài: dùng webhook hoặc polling thưa. Thời gian xử lý có thể dao động tuỳ độ dài và tình trạng hệ thống.
  • Kết quả là liên kết HTTPS tới tệp âm thanh; liên kết chỉ tồn tại tạm thời — hãy tải về sớm.

Chi tiết payload: API Docs mục 5 (music_gen) và mục 6 (music_cover).

Virtual Try-On

try_on

Thử đồ ảo: mặc trang phục lên người trong ảnh.

Bắt buộc: person_image_url, garment_image_url

Payload

Tham sốBắt buộcMô tả
person_image_urlCóẢnh người mặc.
garment_image_urlCóẢnh trang phục.
top_urlKhôngÁo (khi thử riêng áo và quần).
bottom_urlKhôngQuần/váy (khi thử riêng áo và quần).
promptKhôngHướng dẫn bổ sung.

Lưu ý: ảnh cần có người rõ ràng, trang phục nhìn rõ; URL ảnh phải còn truy cập được cho tới khi job kết thúc. Hệ thống tự chọn cách xử lý phù hợp — phía khách không cần chọn. Chi tiết: API Docs.

Công cụ ảnh

remove_object

Xoá vật thể khỏi ảnh bằng mô tả hoặc bằng mask.

image_url + prompt hoặc mask_urls[]

scan_objects

Phát hiện và gán nhãn các vật thể trong ảnh.

image_url

remove_background

Tách nền ảnh tự động.

image_url

nsfw_check

Kiểm duyệt nội dung ảnh.

image_url, strict (low/medium/high)

Xoá nhiều vật thể trong một lượt

remove_object nhận mask_urls (tối đa 10 mask) để xoá nhiều vị trí một lần. Kết hợp với scan_objects (trả về nhãn, ảnh biểu tượng và mask của từng vật) để làm luồng “bấm chọn vật cần xoá”:

  1. Gọi scan_objects với ảnh gốc → nhận danh sách vật thể kèm mask_url.
  2. Người dùng chọn các vật muốn xoá.
  3. Gọi remove_object với mask_urls là các mask đã chọn.

Mask chỉ tồn tại tạm thời; hãy dùng ngay sau khi quét. Chi tiết: scan_objects, remove_object, remove_background.

Mã lỗi & cách xử lý

Khi gọi API (HTTP status)

MãÝ nghĩaCách xử lý phía khách
400Thiếu hoặc sai tham số, tổ hợp tham số không hợp lệ.Sửa request. Không thử lại nguyên văn.
401Thiếu hoặc sai khoá API.Kiểm tra header X-API-Key.
404job_id không tồn tại (hoặc đã bị xoá sau thời gian lưu).Kiểm tra id; lưu kết quả sớm.
422Dữ liệu đúng cấu trúc nhưng không xử lý được (ví dụ âm thanh không có lời).Sửa dữ liệu đầu vào.
429Gọi quá nhanh.Chờ rồi gọi lại; giảm tần suất, dùng backoff.
5xxLỗi hoặc quá tải tạm thời.Thử lại với backoff (xem bên dưới).

Khi job kết thúc không thành công

Job ở trạng thái failed hoặc rejected có đối tượng error dạng {"code": ..., "message": "..."}.

Trường hợpÝ nghĩaCách xử lý phía khách
failed + code: 502Lỗi xử lý tạm thời hoặc quá thời gian (ví dụ quá thời gian xử lý).Tạo job mới sau vài giây (tối đa vài lần). Nếu lặp lại, liên hệ AHV kèm job_id.
rejected + NSFW_BLOCKEDNội dung đầu vào vi phạm chính sách.Không thử lại với cùng ảnh; báo người dùng chọn nội dung khác.
failed + lỗi dữ liệu đầu vàoVí dụ: URL không tải được, tệp ảnh không hợp lệ hoặc bị hỏng, không tìm thấy khuôn mặt/đối tượng, mask trống.Kiểm tra lại URL và tệp; đây không phải lỗi hệ thống nên thử lại y nguyên sẽ không hết lỗi.

Mã lỗi theo tính năng

MãTaskÝ nghĩaXử lý
TV_DISABLEDtalking_videoTính năng tạm thời không nhận job.Thử lại sau.
TV_DAILY_CAPtalking_videoĐã đạt hạn mức job trong ngày.Chờ sang ngày mới hoặc liên hệ AHV.
TV_BUSYtalking_videoHệ thống đang bận.Thử lại sau vài phút.
TV_INSTRUCT_INVALIDtalking_video(400) tts_instruct không nhận ra kiểu giọng nào.Sửa mô tả giọng; không thử lại nguyên văn.
TTS_INSTRUCT_INVALIDtts(400) instruct không nhận ra kiểu giọng nào.Sửa mô tả giọng.
400music_coverSai tổ hợp mode / prompt / voice_ref_url.Sửa theo bảng kịch bản.

Chiến lược thử lại

  • Chỉ thử lại lỗi tạm thời: 429, 5xx, và job failed với code: 502.
  • Không thử lại lỗi do dữ liệu (400, 422, NSFW_BLOCKED, lỗi tải ảnh) trước khi sửa dữ liệu.
  • Backoff luỹ thừa có jitter: chờ khoảng 2 → 4 → 8 → 16 giây (cộng ngẫu nhiên nhỏ), tối đa vài lần rồi dừng và báo lỗi cho người dùng.
  • Khi tạo lại job sau lỗi, hãy dùng job_id mới và ghi nhớ job_id cũ để đối soát.

Ví dụ: chờ kết quả bằng polling

import time
import requests

API = "https://ai.ahvchat.com"
HEADERS = {"X-API-Key": "YOUR_API_KEY"}
RETRY_HTTP = (429, 500, 502, 503, 504)

def wait_for_job(job_id, interval=3, timeout=3600):
    # timeout: đặt theo loại task (video, nhạc, talking_video cần lâu hơn ảnh)
    deadline = time.time() + timeout
    while time.time() < deadline:
        r = requests.get(f"{API}/v1/jobs/{job_id}", headers=HEADERS, timeout=15)
        if r.status_code not in RETRY_HTTP:
            r.raise_for_status()
            job = r.json()
            if job["status"] in ("succeeded", "failed", "rejected"):
                return job
        time.sleep(interval)
        interval = min(interval * 1.5, 30)   # thưa dần, tối đa 30 giây
    raise TimeoutError(job_id)

Tránh tạo job trùng: nếu POST /v1/jobs bị timeout hoặc lỗi mạng, chưa chắc job đã được tạo. Hãy giới hạn số lần thử, và gắn mã đối soát của bạn (ví dụ mã đơn hàng) vào query của webhook_url để nhận diện và bỏ qua job trùng.

Giới hạn đầu vào

Các giới hạn dưới đây áp dụng cho từng tính năng; giới hạn chi tiết khác xem trong API Docs.

Tính năngGiới hạn
Mọi URL đầu vào (ảnh, video, âm thanh)URL truy cập công khai (khuyến nghị HTTPS), tải trực tiếp được (không cần đăng nhập, không chặn hotlink) và phải còn tồn tại cho tới khi job kết thúc. Nguồn chặn tải trực tiếp: upload lên trước qua POST /upload.
talking_video — ảnhJPG/PNG/WebP, ≤ 10 MB, cạnh ngắn ≥ 256 px, cạnh dài ≤ 4096 px, ≤ 16 megapixel.
talking_video — âm thanh≤ 20 MB, 1–120 giây (script: 1–800 ký tự, giọng đọc tối đa khoảng 60 giây).
talking_video — giọng mẫu5–30 giây, ≤ 10 MB; tts_instruct ≤ 200 ký tự; ref_text ≤ 500; prompt ≤ 300.
music_genĐộ dài bài nhạc 30–240 giây.
remove_objectmask_urls tối đa 10 mask mỗi lượt.
faceswap / upscaleCạnh dài kết quả mặc định tối đa 1080 px (max_side).
Decide API1–32 câu hỏi mỗi lần; state tối đa 2.048 token; choice có 2–255 nhãn; score có 2–10 mức.
Âm thanh gửi để chuyển thành chữ (stt)Tối đa 25 MB (webm, wav, mp3, m4a, ogg, opus, flac).

Khuyến nghị tích hợp

  1. Ưu tiên webhook thay cho polling dày; nếu polling, bắt đầu sau vài giây và giãn dần (task nhanh: 2–3 giây/lần; video, nhạc, talking video: 30–60 giây/lần).
  2. Lưu job_id ngay khi tạo job; dùng nó để đối soát và khi cần hỗ trợ.
  3. Xử lý webhook idempotent: cùng sự kiện có thể đến nhiều lần.
  4. Tải kết quả về và lưu riêng. Liên kết kết quả, mask và tệp upload chỉ tồn tại tạm thời; đừng dùng chúng làm kho lưu trữ lâu dài.
  5. Kiểm tra đầu vào trước khi gọi: URL còn sống và tải được, định dạng và kích thước hợp lệ, ảnh có nội dung phù hợp. Phần lớn lỗi job là do dữ liệu đầu vào.
  6. Phân loại lỗi: thử lại lỗi tạm thời có backoff; báo người dùng và sửa dữ liệu với lỗi 4xx / rejected.
  7. Hiển thị tiến độ cho người dùng bằng progress, predict_time và eta_utc.
  8. Bảo vệ khoá API: chỉ gọi từ máy chủ của bạn, không đưa vào mã nguồn công khai hay ứng dụng phía người dùng.

Tài liệu & liên hệ

Trang chủ

Giới thiệu sản phẩm, tính năng và bảng giá.

API Docs

Tài liệu tham chiếu đầy đủ: payload từng task, ví dụ và mã lỗi.

API Demo

Thử các API trực tiếp trong trình duyệt (có tab Decide).

Liên hệ

Xin cấp khoá API, thêm quyền hoặc hỗ trợ tích hợp.