Vision(圖片輸入)
以 image_url content part 傳入圖片 URL 或 base64,讓模型理解影像。
Vision(圖片輸入)
具備 vision 能力的模型可以讀圖。把 content 從字串改成 content part 陣列,混合 text 與 image_url 兩種型別即可。
Content part 格式
{
"role": "user",
"content": [
{ "type": "text", "text": "這張圖裡有什麼?" },
{
"type": "image_url",
"image_url": {
"url": "https://example.com/photo.jpg",
"detail": "auto"
}
}
]
}
| 欄位 | 說明 |
|---|---|
image_url.url | 公開可存取的 HTTPS URL,或 data: base64 URI。 |
image_url.detail | auto(預設)、low、high。low 用較少 token、較便宜;high 保留細節。部分上游模型會忽略此欄位。 |
支援的格式:PNG、JPEG、WebP、非動畫 GIF。
傳 URL
curl
curl https://api.alphacurve.io/v1/chat/completions \
-H "Authorization: Bearer $INFERENCE_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"model": "openai/gpt-4o",
"messages": [{
"role": "user",
"content": [
{ "type": "text", "text": "這張圖裡有什麼?" },
{ "type": "image_url", "image_url": { "url": "https://example.com/photo.jpg" } }
]
}]
}'
Python
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.alphacurve.io/v1",
api_key=os.environ["INFERENCE_API_KEY"],
)
resp = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "這張圖裡有什麼?"},
{"type": "image_url",
"image_url": {"url": "https://example.com/photo.jpg"}},
],
}],
)
print(resp.choices[0].message.content)
Node / TypeScript
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.alphacurve.io/v1",
apiKey: process.env.INFERENCE_API_KEY!,
});
const resp = await client.chat.completions.create({
model: "google/gemini-2.5-pro",
messages: [{
role: "user",
content: [
{ type: "text", text: "這張圖裡有什麼?" },
{ type: "image_url", image_url: { url: "https://example.com/photo.jpg" } },
],
}],
});
console.log(resp.choices[0].message.content);
傳本機檔案(base64)
圖片不在公開網路上時,改用 data: URI。
Python
import base64
import os
from openai import OpenAI
client = OpenAI(
base_url="https://api.alphacurve.io/v1",
api_key=os.environ["INFERENCE_API_KEY"],
)
with open("receipt.png", "rb") as f:
b64 = base64.b64encode(f.read()).decode()
resp = client.chat.completions.create(
model="anthropic/claude-sonnet-4-5",
messages=[{
"role": "user",
"content": [
{"type": "text", "text": "把這張收據轉成 JSON。"},
{"type": "image_url",
"image_url": {"url": f"data:image/png;base64,{b64}"}},
],
}],
response_format={"type": "json_object"},
)
print(resp.choices[0].message.content)
Node / TypeScript
import { readFile } from "node:fs/promises";
import OpenAI from "openai";
const client = new OpenAI({
baseURL: "https://api.alphacurve.io/v1",
apiKey: process.env.INFERENCE_API_KEY!,
});
const b64 = (await readFile("receipt.png")).toString("base64");
const resp = await client.chat.completions.create({
model: "anthropic/claude-sonnet-4-5",
messages: [{
role: "user",
content: [
{ type: "text", text: "把這張收據轉成 JSON。" },
{ type: "image_url", image_url: { url: `data:image/png;base64,${b64}` } },
],
}],
response_format: { type: "json_object" },
});
console.log(resp.choices[0].message.content);
多張圖片
同一則訊息可放多個 image_url,適合做比對:
content = [{"type": "text", "text": "這兩張圖有什麼差別?"}]
for url in ["https://example.com/a.png", "https://example.com/b.png"]:
content.append({"type": "image_url", "image_url": {"url": url}})
resp = client.chat.completions.create(
model="openai/gpt-4o",
messages=[{"role": "user", "content": content}],
)
計費
圖片會換算成輸入 token 計價,成本取決於解析度與 detail 設定。實際數字一律以回應的 usage.prompt_tokens 為準。
省成本的做法:
- 上傳前先縮圖到模型真正需要的尺寸,過大的圖不會提升準確度,只會變貴。
- 只需要判斷「這是什麼」時用
detail: "low";需要讀小字或細節時才用"high"。 - 同一張圖若要問多個問題,把問題合併在同一則訊息裡,避免重複傳圖。
注意事項
- 呼叫不支援 vision 的模型時,上游可能回傳
400 invalid_request或直接忽略圖片。請先用GET /v1/models確認capabilities.vision。 - 圖片 URL 必須讓上游供應商能直接取得;需要登入或簽章的連結請改用 base64。
- 每則請求的整體大小有上限,多張高解析度圖片建議改用 URL 而非 base64。