跳至主要內容

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.detailauto(預設)、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。