Bỏ qua để đến nội dung

Đầu vào đa phương thức

Đầu vào đa phương thức cho phép các mô hình xử lý không chỉ văn bản mà còn cả hình ảnh, âm thanh và các dạng nội dung khác. RouteAPI hỗ trợ truyền nội dung đa phương thức trên cả /v1/chat/completions (định dạng OpenAI) và /v1/messages (định dạng Claude), đồng thời tự động xử lý chuyển đổi định dạng giữa các giao thức upstream khác nhau.

Loại phương thứcMô tả
Hình ảnh (Vision)Các định dạng PNG, JPEG, WebP, GIF để hiểu hình ảnh, OCR, phân tích biểu đồ
Âm thanh (Audio)Một số mô hình hỗ trợ đầu vào âm thanh để hiểu giọng nói, phiên âm, v.v.
VideoMột số mô hình hỗ trợ đầu vào khung hình video bằng cách chia video thành chuỗi khung hình chính

Hiện tại, hỗ trợ đầu vào hình ảnh là phổ biến nhất, hầu hết tất cả các mô hình thị giác chính thống đều hỗ trợ. Đầu vào âm thanh và video phụ thuộc vào khả năng cụ thể của mô hình.

Các mô hình sau hỗ trợ đầu vào hình ảnh (danh sách không đầy đủ):

Họ mô hìnhID mô hình điển hình
OpenAI GPT-4 Visiongpt-4o, gpt-4-turbo, gpt-5.5
Claude Visionclaude-sonnet-4-5, claude-opus-4-5
Gemini Visiongemini-2.0-flash, gemini-2.5-pro
Azure OpenAIazure-gpt-4o

Trước tiên hãy dùng endpoint danh sách mô hình để xác nhận mô hình có khả dụng trong tài khoản của bạn:

Terminal window
curl https://api.routeapi.ai/v1/models \
-H "Authorization: Bearer $ROUTEAPI_KEY"

Endpoint này không trả về trường biểu thị khả năng nhận đầu vào hình ảnh. Hãy xác nhận mô hình có hỗ trợ thị giác hay không qua tài liệu của nhà cung cấp, hoặc bằng một request thực tế có kèm hình ảnh.

Các định dạng hình ảnh được hỗ trợ

Phần tiêu đề “Các định dạng hình ảnh được hỗ trợ”
Định dạngMIME TypeMô tả
PNGimage/pngĐịnh dạng không mất dữ liệu, phù hợp cho ảnh chụp màn hình và biểu đồ
JPEGimage/jpegNén mất dữ liệu, phù hợp cho ảnh
WebPimage/webpĐịnh dạng hiện đại với kích thước nhỏ và chất lượng cao
GIFimage/gifĐịnh dạng không động (chỉ sử dụng khung hình đầu tiên)

Các mô hình khác nhau có giới hạn kích thước hình ảnh khác nhau. Khuyến nghị chung:

Mục giới hạnGiá trị khuyến nghịMô tả
Kích thước hình ảnh đơn< 20 MBHình ảnh rất lớn làm tăng thời gian xử lý và chi phí
Độ phân giải hình ảnhCạnh dài ≤ 2048pxĐộ phân giải cao sẽ được tự động thu nhỏ hoặc xử lý theo khối
Sau khi mã hóa Base64< 32 MBTổng kích thước yêu cầu bị giới hạn bởi dịch vụ upstream

Khuyến nghị nén hình ảnh trước khi tải lên, giảm độ phân giải trong khi đảm bảo khả năng đọc được để giảm cả thời gian truyền và chi phí token.

Hình ảnh được chuyển đổi thành token để tính phí. Hình ảnh độ phân giải cao tiêu thụ nhiều token hơn văn bản rất nhiều:

  • Chế độ độ phân giải thấp (như detail: "low" của OpenAI): Cố định khoảng 85 token/hình ảnh.
  • Chế độ độ phân giải cao (như detail: "high"): Chia theo kích thước hình ảnh; một hình ảnh 2048×2048 có thể tiêu thụ 800-1500 token.

Trong môi trường production, chọn chế độ độ phân giải dựa trên nhu cầu thực tế. Sử dụng chế độ low khi không cần nhận diện chi tiết.

Hình ảnh có thể được truyền theo hai cách: URL và mã hóa Base64.

Truyền một URL hình ảnh có thể truy cập công khai để dịch vụ mô hình upstream tải về:

Ưu điểm:

  • Kích thước yêu cầu nhỏ, không sử dụng băng thông tải lên của bạn.
  • Phù hợp cho hình ảnh đã được lưu trữ trên CDN.

Nhược điểm:

  • Hình ảnh phải có thể truy cập công khai; IP của dịch vụ upstream phải có thể truy cập được.
  • Nếu tải hình ảnh thất bại (vấn đề mạng, xác thực, liên kết hết hạn), yêu cầu sẽ báo lỗi.

Trường hợp sử dụng: Hình ảnh đã có trên các host hình ảnh công khai hoặc CDN, không cần tải lên tạm thời.

Đọc hình ảnh dưới dạng dữ liệu nhị phân, mã hóa bằng Base64 và nhúng trực tiếp vào yêu cầu:

Ưu điểm:

  • Không cần URL có thể truy cập công khai, phù hợp cho hình ảnh riêng tư.
  • Yêu cầu tự chứa, không phụ thuộc vào tính khả dụng của dịch vụ bên ngoài.

Nhược điểm:

  • Mã hóa Base64 làm tăng kích thước dữ liệu khoảng 33%.
  • Kích thước yêu cầu lớn, thời gian tải lên lâu hơn.

Trường hợp sử dụng: Hình ảnh riêng tư do người dùng tải lên, tệp cục bộ, ảnh chụp màn hình tạm thời không có URL công khai.

So sánhPhương pháp URLPhương pháp Base64
Kích thước yêu cầuNhỏ (chỉ chuỗi URL)Lớn (Base64 ~1.33× tệp gốc)
Tốc độ tải lênNhanhChậm
Khả năng truy cập hình ảnhPhải có thể truy cập công khaiKhông có yêu cầu, hình ảnh riêng tư OK
Phụ thuộc bên ngoàiPhụ thuộc vào máy chủ hình ảnh và tải upstreamKhông có phụ thuộc bên ngoài
Trường hợp sử dụngHost hình ảnh công khai, CDNTải lên người dùng, tệp cục bộ

Trong /v1/chat/completions, hình ảnh được truyền qua mảng content, trong đó mỗi phần tử là một khối nội dung được phân biệt bởi type cho văn bản và hình ảnh.

content có thể là chuỗi (văn bản thuần) hoặc mảng (đa phương thức):

{
"role": "user",
"content": [
{ "type": "text", "text": "Có gì trong hình ảnh này?" },
{
"type": "image_url",
"image_url": {
"url": "https://example.com/image.jpg"
}
}
]
}

Các trường của khối nội dung image_url:

TrườngLoạiBắt buộcMô tả
typestringCóCố định là "image_url"
image_url.urlstringCóURL hình ảnh hoặc Data URI Base64
image_url.detailstringKhôngChế độ độ phân giải: "low", "high", "auto" (mặc định)

detail kiểm soát độ phân giải xử lý hình ảnh và chi phí:

Giá trịHành viTiêu thụ token
"low"Chế độ độ phân giải thấp, hình ảnh được thu nhỏ xuống kích thước cố định (ví dụ: 512×512)Cố định khoảng 85 token
"high"Chế độ độ phân giải cao, hình ảnh được xử lý theo khối, giữ lại chi tiếtTheo số lượng khối, thường hàng trăm đến hàng nghìn token
"auto"Mô hình tự động chọn (mặc định)Phụ thuộc vào chiến lược mô hình

Ví dụ về sự khác biệt chi phí:

  • Một ảnh chụp màn hình đơn giản với "low" có thể chỉ cần 85 token (~$0.0001).
  • Cùng một hình ảnh với "high" có thể tiêu thụ 800 token (~$0.001).

Đối với các tình huống không cần nhận diện chữ nhỏ hoặc chi tiết (như “đây là con vật gì” hoặc “màu chủ đề của giao diện là gì”), "low" là đủ. Chỉ sử dụng "high" khi cần OCR, đọc giá trị biểu đồ hoặc nhận diện đối tượng nhỏ.

{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/320px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg",
"detail": "high"
}
},
{ "type": "text", "text": "Mô tả nội dung của hình ảnh này" }
]
}
]
}

Base64 yêu cầu định dạng Data URI: data:<mime_type>;base64,<encoded_data>.

{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "data:image/jpeg;base64,/9j/4AAQSkZJRgABAQEAYABgAAD..."
}
},
{ "type": "text", "text": "Có văn bản gì trong hình ảnh này?" }
]
}
]
}

Lưu ý rằng chuỗi Base64 có thể rất dài; ví dụ trên đã được cắt bớt. Trong sử dụng thực tế, mã hóa hoàn chỉnh có thể từ vài trăm KB đến vài MB.

Trong /v1/messages, hình ảnh được truyền qua các khối loại image trong mảng content, với cấu trúc khác biệt đáng kể so với định dạng OpenAI.

{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/jpeg",
"data": "/9j/4AAQSkZJRgABAQEAYABgAAD..."
}
},
{ "type": "text", "text": "Mô tả hình ảnh này" }
]
}

Trường source chỉ định nguồn hình ảnh theo hai cách:

TrườngLoạiBắt buộcMô tả
typestringCóCố định là "base64"
media_typestringCóLoại MIME, như image/jpeg, image/png
datastringCóDữ liệu hình ảnh được mã hóa Base64 (không có tiền tố data:)

Lưu ý rằng Base64 của định dạng Claude không cần tiền tố Data URI; truyền trực tiếp chuỗi được mã hóa.

{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": "iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mNk+M9QDwADhgGAWjR9awAAAABJRU5ErkJggg=="
}
}
TrườngLoạiBắt buộcMô tả
typestringCóCố định là "url"
urlstringCóURL hình ảnh có thể truy cập công khai
{
"type": "image",
"source": {
"type": "url",
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/320px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
}
}
{
"model": "claude-sonnet-4-5",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "url",
"url": "https://upload.wikimedia.org/wikipedia/commons/a/a7/Camponotus_flavomarginatus_ant.jpg"
}
},
{ "type": "text", "text": "Đây là con côn trùng gì?" }
]
}
]
}

Định dạng gốc của Gemini sử dụng mảng parts thay vì content, với cấu trúc khá khác biệt. RouteAPI xử lý chuyển đổi nội bộ, vì vậy khi gọi các mô hình Gemini sử dụng định dạng OpenAI hoặc Claude, bạn không cần lo lắng về chi tiết định dạng gốc. Sau đây chỉ để tham khảo.

{
"contents": [
{
"role": "user",
"parts": [
{ "text": "Mô tả hình ảnh này" },
{
"inlineData": {
"mimeType": "image/jpeg",
"data": "/9j/4AAQSkZJRg..."
}
}
]
}
]
}
TrườngMô tả
inlineData.mimeTypeLoại MIME
inlineData.dataDữ liệu được mã hóa Base64

Gemini cũng hỗ trợ tham chiếu tệp đã tải lên dịch vụ Google qua URI tệp:

{
"fileData": {
"mimeType": "image/jpeg",
"fileUri": "gs://bucket-name/path/to/image.jpg"
}
}

Trong thực tế, khi gọi các mô hình Gemini qua RouteAPI, sử dụng định dạng OpenAI hoặc Claude; RouteAPI sẽ tự động chuyển đổi.

Tất cả các mô hình thị giác chính thống đều hỗ trợ truyền nhiều hình ảnh trong một yêu cầu duy nhất.

Đặt nhiều khối hình ảnh trong mảng content / parts:

Định dạng OpenAI:

{
"role": "user",
"content": [
{ "type": "text", "text": "So sánh sự khác biệt giữa hai hình ảnh này" },
{
"type": "image_url",
"image_url": { "url": "https://example.com/image1.jpg" }
},
{
"type": "image_url",
"image_url": { "url": "https://example.com/image2.jpg" }
}
]
}

Định dạng Claude:

{
"role": "user",
"content": [
{ "type": "text", "text": "Điểm tương đồng và khác biệt giữa hai hình ảnh này là gì?" },
{
"type": "image",
"source": { "type": "url", "url": "https://example.com/before.jpg" }
},
{
"type": "image",
"source": { "type": "url", "url": "https://example.com/after.jpg" }
}
]
}

Mô hình hiểu hình ảnh theo thứ tự mảng. Nếu văn bản tham chiếu đến “hình ảnh đầu tiên” hoặc “hình ảnh thứ hai”, mô hình sẽ tương ứng theo thứ tự xuất hiện. Khuyến nghị đặt văn bản giải thích trước hoặc sau tất cả hình ảnh, không xen kẽ giữa chúng, để ngữ nghĩa rõ ràng hơn:

{
"content": [
{ "type": "text", "text": "Hình đầu tiên là ảnh chụp màn hình giao diện người dùng, hình thứ hai là bản thiết kế. Vui lòng so sánh sự khác biệt và đưa ra đề xuất sửa đổi." },
{ "type": "image_url", "image_url": { "url": "..." } },
{ "type": "image_url", "image_url": { "url": "..." } }
]
}

Bạn cũng có thể xen kẽ văn bản và hình ảnh để giải thích từng bước:

{
"content": [
{ "type": "text", "text": "Đây là giao diện gốc:" },
{ "type": "image_url", "image_url": { "url": "https://example.com/old.jpg" } },
{ "type": "text", "text": "Đây là giao diện được cải thiện:" },
{ "type": "image_url", "image_url": { "url": "https://example.com/new.jpg" } },
{ "type": "text", "text": "Vui lòng tóm tắt các cải tiến." }
]
}

Hiệu quả thực tế phụ thuộc vào khả năng hiểu thứ tự khối nội dung của mô hình; các mô hình thị giác chính thống thường có thể xử lý điều này một cách chính xác.

Một số mô hình hỗ trợ đầu vào âm thanh để hiểu giọng nói, phiên âm, phân tích cảm xúc, v.v. Hỗ trợ hiện tại ít phổ biến hơn hình ảnh.

Phụ thuộc vào các mô hình cụ thể, các định dạng phổ biến bao gồm:

  • WAV (audio/wav)
  • MP3 (audio/mpeg)
  • OGG (audio/ogg)
  • FLAC (audio/flac)

Giống như hình ảnh, âm thanh hỗ trợ cả hai phương pháp URL và Base64. Ví dụ định dạng OpenAI (giả sử mô hình hỗ trợ):

{
"role": "user",
"content": [
{
"type": "input_audio",
"input_audio": {
"data": "<base64-encoded-audio>",
"format": "wav"
}
},
{ "type": "text", "text": "Phiên âm đoạn âm thanh này và tóm tắt các điểm chính" }
]
}

Tên trường và cấu trúc thực tế phụ thuộc vào giao thức mô hình. Trước khi sử dụng, hãy tham khảo tài liệu của mô hình đã chọn hoặc xác minh trường supports_audio_input qua endpoint danh sách mô hình.

Các ví dụ sau đây cho thấy triển khai đầu đến cuối của việc hiểu hình ảnh bằng curl, Python và Node.js.

Cho một hình ảnh và yêu cầu mô hình mô tả nội dung của nó.

curl (định dạng OpenAI, phương pháp URL):

Terminal window
curl https://api.routeapi.ai/v1/chat/completions \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/320px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
}
},
{ "type": "text", "text": "Mô tả chi tiết nội dung và không khí của hình ảnh này" }
]
}
]
}'

Python (OpenAI SDK, phương pháp Base64):

import base64
import os
from openai import OpenAI
client = OpenAI(
api_key=os.environ["ROUTEAPI_KEY"],
base_url="https://api.routeapi.ai/v1",
)
# Đọc hình ảnh cục bộ và mã hóa thành Base64
with open("image.jpg", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
response = client.chat.completions.create(
model="gpt-4o",
messages=[
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": f"data:image/jpeg;base64,{image_data}"
},
},
{"type": "text", "text": "Có gì trong hình ảnh này?"},
],
}
],
)
print(response.choices[0].message.content)

Node.js (gói openai, phương pháp URL):

import OpenAI from 'openai';
const client = new OpenAI({
apiKey: process.env.ROUTEAPI_KEY,
baseURL: 'https://api.routeapi.ai/v1',
});
const response = await client.chat.completions.create({
model: 'gpt-4o',
messages: [
{
role: 'user',
content: [
{
type: 'image_url',
image_url: {
url: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/320px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg',
},
},
{ type: 'text', text: 'Tóm tắt chủ đề của hình ảnh này trong một câu' },
],
},
],
});
console.log(response.choices[0].message.content);

Phân tích biểu đồ và trực quan hóa dữ liệu

Phần tiêu đề “Phân tích biểu đồ và trực quan hóa dữ liệu”

Tải lên ảnh chụp màn hình biểu đồ và yêu cầu mô hình đọc dữ liệu và phân tích:

Python (định dạng Claude, Base64):

import base64
import os
from anthropic import Anthropic
client = Anthropic(
api_key=os.environ["ROUTEAPI_KEY"],
base_url="https://api.routeapi.ai",
)
with open("chart.png", "rb") as f:
image_data = base64.b64encode(f.read()).decode("utf-8")
message = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=1024,
messages=[
{
"role": "user",
"content": [
{
"type": "image",
"source": {
"type": "base64",
"media_type": "image/png",
"data": image_data,
},
},
{
"type": "text",
"text": "Biểu đồ này cho thấy xu hướng gì? Vui lòng trích xuất các điểm dữ liệu chính và cung cấp phân tích.",
},
],
}
],
)
print(message.content[0].text)

Trích xuất nội dung văn bản từ ảnh chụp màn hình hoặc ảnh:

curl (định dạng OpenAI, độ phân giải cao):

Terminal window
curl https://api.routeapi.ai/v1/chat/completions \
-H "Authorization: Bearer $ROUTEAPI_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "gpt-4o",
"messages": [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {
"url": "https://example.com/document.jpg",
"detail": "high"
}
},
{
"type": "text",
"text": "Trích xuất tất cả văn bản trong hình ảnh, duy trì định dạng và cấu trúc gốc"
}
]
}
]
}'

Đối với các tình huống OCR, sử dụng "detail": "high" để đảm bảo độ chính xác nhận diện, đặc biệt là cho chữ nhỏ hoặc văn bản dày đặc.

So sánh sự khác biệt giữa hai hoặc nhiều hình ảnh:

Python (định dạng OpenAI, nhiều hình ảnh):

from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["ROUTEAPI_KEY"],
base_url="https://api.routeapi.ai/v1",
)
response = client.chat.completions.create(
model="gpt-5.5",
messages=[
{
"role": "user",
"content": [
{
"type": "text",
"text": "So sánh hai hình ảnh sau và tìm 5 điểm khác biệt chính giữa chúng:",
},
{
"type": "image_url",
"image_url": {"url": "https://example.com/before.jpg"},
},
{
"type": "image_url",
"image_url": {"url": "https://example.com/after.jpg"},
},
],
}
],
)
print(response.choices[0].message.content)

Cuộc trò chuyện kết hợp hình ảnh-văn bản

Phần tiêu đề “Cuộc trò chuyện kết hợp hình ảnh-văn bản”

Kết hợp hình ảnh và văn bản trong các cuộc trò chuyện nhiều lượt:

from openai import OpenAI
import os
client = OpenAI(
api_key=os.environ["ROUTEAPI_KEY"],
base_url="https://api.routeapi.ai/v1",
)
messages = [
{
"role": "user",
"content": [
{
"type": "image_url",
"image_url": {"url": "https://example.com/product.jpg"},
},
{"type": "text", "text": "Các đặc điểm chính của sản phẩm này là gì?"},
],
}
]
response = client.chat.completions.create(model="gpt-4o", messages=messages)
messages.append(response.choices[0].message)
print("Lượt đầu tiên:", response.choices[0].message.content)
# Tiếp tục đặt câu hỏi (văn bản thuần)
messages.append({"role": "user", "content": "Nó phù hợp với loại người dùng nào?"})
response = client.chat.completions.create(model="gpt-4o", messages=messages)
print("Lượt thứ hai:", response.choices[0].message.content)

Hình ảnh chỉ cần được truyền một lần trong lượt đầu tiên; trong các lượt tiếp theo, mô hình sẽ nhớ nội dung hình ảnh (trong cửa sổ ngữ cảnh) mà không cần tải lại.

Thực hiện tối ưu hóa cần thiết trước khi tải lên hình ảnh để giảm chi phí và cải thiện tốc độ phản hồi:

Tối ưu hóaKhuyến nghị
Kích thướcGiữ cạnh dài trong vòng 2048px trừ khi thực sự cần nhận diện nhiều chi tiết hơn
Định dạngSử dụng PNG cho ảnh chụp màn hình và biểu đồ, JPEG cho ảnh, WebP cho nén tối đa
NénChất lượng JPEG 80-90% là đủ, sự khác biệt trực quan tối thiểu nhưng kích thước giảm đáng kể
Cắt xénLoại bỏ các vùng không liên quan (khoảng trắng lớn, hình mờ, viền), chỉ giữ nội dung chính

Đừng nén hình ảnh đến mức không thể nhận diện để tiết kiệm token; nếu mô hình không thể nhận diện, thực ra là lãng phí.

Chi phí đầu vào đa phương thức chủ yếu đến từ hình ảnh:

Tình huốngTiêu thụ token điển hìnhƯớc tính chi phí (GPT-4o)
Hình ảnh độ phân giải thấp (detail: "low")~85 token$0.0001
Hình ảnh nhỏ độ phân giải cao (500×500, detail: "high")~200 token$0.0003
Hình ảnh lớn độ phân giải cao (2000×2000, detail: "high")~800 token$0.0012
Nhiều hình ảnh độ phân giải cao (5 hình ảnh, detail: "high")~4000 token$0.006

Tỷ giá cụ thể phụ thuộc vào mô hình đã chọn; trên đây chỉ là ví dụ. Khuyến nghị cho production:

  1. Mặc định sử dụng detail: "auto" hoặc "low", để mô hình hoặc nhu cầu người dùng xác định độ phân giải.
  2. Chỉ sử dụng "high" khi rõ ràng cần nhận diện chi tiết (OCR, dữ liệu biểu đồ, phát hiện đối tượng nhỏ).
  3. Ghi lại mức sử dụng token cho mỗi yêu cầu (trường usage của phản hồi) để xác định các bất thường về chi phí.

Đầu vào đa phương thức đưa ra các điểm thất bại bổ sung cần xử lý có mục tiêu:

Định dạng hình ảnh không được hỗ trợ

Phần tiêu đề “Định dạng hình ảnh không được hỗ trợ”
{
"error": {
"message": "Unsupported image format",
"type": "invalid_request_error"
}
}

Giải pháp: Xác nhận loại MIME đúng hoặc chuyển đổi sang PNG/JPEG.

{
"error": {
"message": "Image size exceeds limit",
"type": "invalid_request_error"
}
}

Giải pháp: Nén hình ảnh hoặc giảm độ phân giải và thử lại.

{
"error": {
"message": "Failed to fetch image from URL",
"type": "invalid_request_error"
}
}

Giải pháp:

  • Xác nhận URL có thể truy cập công khai không cần xác thực.
  • Kiểm tra xem IP của dịch vụ upstream có thể truy cập URL đó không (tường lửa, hạn chế địa lý).
  • Chuyển sang phương pháp Base64 để tránh phụ thuộc vào dịch vụ bên ngoài.
{
"error": {
"message": "Invalid base64 encoding",
"type": "invalid_request_error"
}
}

Giải pháp: Kiểm tra xem mã hóa Base64 có đầy đủ và định dạng có đúng không (định dạng OpenAI cần tiền tố data:, định dạng Claude không cần).

Rủi roBiện pháp bảo vệ
Rò rỉ URL hình ảnhĐảm bảo URL trỏ đến hình ảnh không chứa thông tin nhạy cảm hoặc sử dụng liên kết tạm thời được xác thực
Tấn công kích thước Base64Giới hạn giới hạn kích thước tải lên hình ảnh của người dùng (ví dụ: 20 MB) để ngăn chặn yêu cầu quá lớn
Tấn công injectionKhông nối trực tiếp URL hình ảnh do người dùng tải lên vào lệnh hệ thống hoặc SQL
Ảo giác mô hìnhKết quả hiểu hình ảnh có thể không chính xác; các tình huống rủi ro cao (y tế, pháp lý, tài chính) cần xem xét của con người
  • Khả năng thị giác, định dạng hình ảnh được hỗ trợ và số lượng hình ảnh tối đa phụ thuộc vào mô hình đã chọn; kiểm tra và xác minh trước khi production.
  • Tham số detail chỉ có ý nghĩa trong định dạng OpenAI; định dạng Claude không có tham số tương ứng.
  • Các mô hình khác nhau có chiến lược xử lý độ phân giải khác nhau; cùng một hình ảnh có thể tiêu thụ token rất khác nhau trên các mô hình khác nhau.
  • Trong phản hồi streaming, kết quả xử lý nội dung hình ảnh thường được trả về một lần sớm hoặc muộn trong luồng, không phải streaming từng ký tự.
  • Ghi lại request ID, model ID, mã trạng thái và mức sử dụng token cho mỗi yêu cầu để dễ dàng khắc phục sự cố về chi phí và chất lượng. Xem Lỗi và gỡ lỗi để biết chi tiết.