Lunos logoLunos

Input Gambar

Model vision (visual) dapat digunakan untuk membaca teks pada screenshot, mengklasifikasikan objek di dalam foto, mengekstraksi tulisan (OCR), hingga tanya jawab mendalam berbasis visual.

Endpoint

POST /v1/chat/completions

Autentikasi

Authorization: Bearer YOUR_SECRET_KEY
Content-Type: application/json

Format Struktur Konten

{
  "type": "image_url",
  "image_url": {
    "url": "https://example.com/image.jpg"
  }
}

Anda bisa mengirim lebih dari satu gambar secara bersamaan di dalam satu request. Sangat direkomendasikan untuk menaruh blok instruksi teks terlebih dahulu sebelum blok gambarnya.

Aturan Struktur Request

  • Kirimkan payload gambar tersebut ke dalam susunan array di dalam messages[].content[].
  • Kami sangat menyarankan agar Anda menggabungkan seluruh prompt ke dalam satu message bertipe user yang berisi tipe konten campuran.
  • Jika Anda ingin menganalisis banyak gambar, cukup tambahkan beberapa objek bertipe image_url ke dalam array tersebut.
  • Perlu diingat bahwa setiap penyedia model AI memiliki batas maksimal jumlah gambar per request yang berbeda-beda.

Tautan URL vs Data Base64

  • Gunakan tautan URL jika gambar Anda bisa diakses secara publik (hal ini akan membuat ukuran payload jauh lebih ringan).
  • Gunakan format data URI Base64 khusus untuk memproses gambar yang ada di komputer lokal atau bersifat sangat privat.

Contoh format Base64:

data:image/jpeg;base64,<BASE64_DATA>

Tipe MIME Gambar yang Didukung

  • image/png
  • image/jpeg
  • image/webp
  • image/gif

Contoh Request (Menggunakan URL)

cURL

curl -X POST "https://api.lunos.tech/v1/chat/completions" \
  -H "Authorization: Bearer YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemini-2.5-flash",
    "messages": [
      {
        "role": "user",
        "content": [
          { "type": "text", "text": "Tolong ekstrak semua nama produk beserta harganya yang terlihat di gambar." },
          { "type": "image_url", "image_url": { "url": "https://example.com/menu.png" } }
        ]
      }
    ]
  }'

Python

import requests

response = requests.post(
    "https://api.lunos.tech/v1/chat/completions",
    headers={
        "Authorization": "Bearer YOUR_SECRET_KEY",
        "Content-Type": "application/json",
    },
    json={
        "model": "google/gemini-2.5-flash",
        "messages": [
            {
                "role": "user",
                "content": [
                    {"type": "text", "text": "Tolong ekstrak semua nama produk beserta harganya yang terlihat di gambar."},
                    {"type": "image_url", "image_url": {"url": "https://example.com/menu.png"}},
                ],
            }
        ],
    },
)
print(response.json())
const response = await fetch("https://api.lunos.tech/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_SECRET_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    model: "google/gemini-2.5-flash",
    messages: [
      {
        role: "user",
        content: [
          { type: "text", text: "Tolong ekstrak semua nama produk beserta harganya yang terlihat di gambar." },
          { type: "image_url", image_url: { url: "https://example.com/menu.png" } },
        ],
      },
    ],
  }),
});
console.log(await response.json());

Contoh Request (Banyak Gambar Sekaligus)

cURL

curl -X POST "https://api.lunos.tech/v1/chat/completions" \
  -H "Authorization: Bearer YOUR_SECRET_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "google/gemini-2.5-flash",
    "messages": [
      {
        "role": "user",
        "content": [
          { "type": "text", "text": "Tolong bandingkan kedua gambar ini lalu jelaskan apa saja perbedaannya secara rinci." },
          { "type": "image_url", "image_url": { "url": "https://example.com/before.jpg" } },
          { "type": "image_url", "image_url": { "url": "https://example.com/after.jpg" } }
        ]
      }
    ]
  }'
import requests

payload = {
    "model": "google/gemini-2.5-flash",
    "messages": [
        {
            "role": "user",
            "content": [
                {"type": "text", "text": "Tolong bandingkan kedua gambar ini lalu jelaskan apa saja perbedaannya secara rinci."},
                {"type": "image_url", "image_url": {"url": "https://example.com/before.jpg"}},
                {"type": "image_url", "image_url": {"url": "https://example.com/after.jpg"}},
            ],
        }
    ],
}
response = requests.post(
    "https://api.lunos.tech/v1/chat/completions",
    headers={
        "Authorization": "Bearer YOUR_SECRET_KEY",
        "Content-Type": "application/json",
    },
    json=payload,
)
print(response.json())

TypeScript

const payload = {
  model: "google/gemini-2.5-flash",
  messages: [
    {
      role: "user",
      content: [
        { type: "text", text: "Tolong bandingkan kedua gambar ini lalu jelaskan apa saja perbedaannya secara rinci." },
        { type: "image_url", image_url: { url: "https://example.com/before.jpg" } },
        { type: "image_url", image_url: { url: "https://example.com/after.jpg" } },
      ],
    },
  ],
};

const response = await fetch("https://api.lunos.tech/v1/chat/completions", {
  method: "POST",
  headers: {
    Authorization: "Bearer YOUR_SECRET_KEY",
    "Content-Type": "application/json",
  },
  body: JSON.stringify(payload),
});
console.log(await response.json());

Kompatibilitas Format Penulisan Lama

Lunos masih dapat menerima format penulisan properti image_url maupun imageUrl, namun format kanonis (canonical) standarnya adalah:

{ "type": "image_url", "image_url": { "url": "..." } }

Checklist Panduan Lunos

  • Sebelum request, pastikan Anda sudah mengecek bahwa model pilihan Anda memiliki keterangan image di atribut inputModalities.
  • Hindari mengirim gambar dengan resolusi yang terlalu raksasa agar latensi (waktu tunggu) response tetap stabil.
  • Tulislah instruksi format output yang sangat spesifik (misalnya: "buat dalam bentuk ringkasan", "kembalikan format bidang JSON", atau "pisahkan baris hasil OCR").
  • Selalu perjelas prompt teks pengiring agar model memahami fokus analisis utamanya secara konsisten.