Bỏ qua, tới nội dung chính

Đầu vào ảnh

Ba model của chúng tôi đọc được ảnh. Gửi ảnh dạng base64 data URI trong mảng content quen thuộc là chạy, SDK OpenAI giữ nguyên. Chỉ hai chi tiết quyết định lần thử đầu của bạn — và một trong hai trông y hệt việc model bị mù.

Model nào đọc được ảnh

Chúng tôi probe mọi model trong catalog bằng cùng hai tấm ảnh thay vì tin vào khả năng ghi ở nguồn — và hai thứ đó nói khác nhau. Chỉ ba model này trả lời đúng theo thứ có trong ảnh:

ModelĐầu vào ảnh
qwen3.8-27bCó — đã kiểm
kimi-k2.6Có — đã kiểm
kimi-k2.7-codeCó — đã kiểm
glm-5.2 · glm-4.7-flashKhông
deepseek-v4-flash · deepseek-v4-proKhông

Danh sách này máy cũng đọc được: trường capabilities.vision trong GET /v1/models. Gửi ảnh cho model khác sẽ bị từ chối bằng vision_not_available trước khi request rời khỏi chúng tôi, và không tốn của bạn đồng nào.

Vì sao chúng tôi từ chối thay vì cứ chuyển tiếp

Hai trong số các model không đọc được ảnh vẫn nhận payload, lờ tấm ảnh đi, rồi tự tin trả lời chỉ dựa vào phần chữ. Bạn sẽ bị tính tiền đủ cho một câu phỏng đoán, mà không gì trong response nói rằng tấm ảnh đã bị bỏ. Một lời từ chối bạn xử lý được thì đáng giá hơn một đoạn văn trôi chảy về tấm ảnh chẳng ai nhìn.

Gửi một tấm ảnh

Dùng mảng content chuẩn: một phần text và một phần image_url. URL phải là base64 data URI — link http(s) không được tải về, và chúng tôi từ chối ngay từ đầu bằng image_url_not_supported thay vì để nó hỏng ở tầng sâu hơn.

python
import base64
from openai import OpenAI

client = OpenAI(base_url="https://api.clfaigateway.dev/v1", api_key="sk-gw-...")

with open("screenshot.png", "rb") as f:
    b64 = base64.b64encode(f.read()).decode()

resp = client.chat.completions.create(
    model="qwen3.8-27b",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "What does this screen show?"},
            {"type": "image_url",
             "image_url": {"url": f"data:image/png;base64,{b64}"}},
        ],
    }],
    max_completion_tokens=400,
)
print(resp.choices[0].message.content)

Câu trả lời rỗng gần như luôn là do ngân sách token

Các model này suy nghĩ trước khi trả lời, và phần suy nghĩ tiêu từ chính max_completion_tokens. Đặt quá thấp thì toàn bộ ngân sách chui vào phần suy luận, để lại content rỗng — nhìn không phân biệt được với một model mù. Chỗ này từng làm chúng tôi mất một giờ mới nhận ra. Khi gửi ảnh, hãy để ngân sách từ 400 token trở lên.

Giới hạn và cách tính tiền

  • Tính tiền: ảnh tính như token input theo đúng giá input thường của model. Không có phụ phí riêng cho ảnh.
  • Ảnh tốn bao nhiêu token: khoảng 64 token cho mỗi ô 256×256 của ảnh — ảnh tới 256×256 tốn khoảng 66 token, ảnh 512×512 khoảng 258. Số token đó tính vào cửa sổ context như mọi input khác.
  • Cỡ request: tối đa 10 MB mỗi body, tính cả base64. Lớn hơn sẽ bị từ chối bằng request_too_large.
  • Nhiều ảnh: được — thêm nhiều phần image_url vào cùng một mảng content.
  • Riêng tư: ảnh là nội dung request, mà chúng tôi chỉ log metadata — không bao giờ log nội dung prompt hay response. Xem chính sách dữ liệu.

Chúng tôi CHƯA đo những gì

Bài probe của chúng tôi chứng minh model thật sự đọc tấm ảnh nó nhận. Nó không chứng minh chất lượng OCR: chữ nhỏ, tài liệu scan và biểu đồ dày đặc đều chưa được kiểm, nên chúng tôi không bán những thứ đó như tính năng. Hãy thử trên chính tài liệu của bạn trước — request hỏng không sinh ra gì thì $0, và count_tokens thì miễn phí.