> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.tramlabs.io/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.tramlabs.io/_mcp/server.

# Nhận diện hình ảnh (Image Inputs)

> Cách gửi hình ảnh đến các model của Trạm AI

Để gửi hình ảnh tới các multimodal model, hãy dùng API `/v1/chat/completions` với tham số `messages` ở dạng multi-part. Trường `image_url` có thể là một URL, hoặc một ảnh đã mã hóa base64. Người dùng cũng có thể gửi nhiều ảnh cùng lúc, mỗi ảnh nằm trong một entry riêng của mảng content. Số ảnh tối đa trong một request sẽ tùy theo từng provider và từng model.

Mẹo nhỏ: Do cách content được xử lý, hãy đặt text prompt trước rồi mới tới hình ảnh. Nếu bắt buộc phải để ảnh lên đầu, hãy đưa ảnh vào system prompt.

Với hình ảnh, Trạm AI hỗ trợ hai cách:

* **URL trực tiếp**: Đơn giản hơn cho ảnh công khai, không cần mã hóa.
* **Base64**: Dùng khi ảnh nằm ở máy cá nhân, hoặc ảnh riêng tư không truy cập công khai được.

### Gửi ảnh bằng URL

Đây là cách gửi một ảnh qua URL:

**`TypeScript`**

```typescript title="TypeScript" expandable lines
import OpenAI from 'openai';

const openai = new OpenAI({
  baseURL: 'https://api.tramlabs.io/v1',
  apiKey: '{{API_KEY_REF}}',
});

const result = await openai.chat.completions.create({
  model: '{{MODEL}}',
  messages: [
    {
      role: 'user',
      content: [
        {
          type: 'text',
          text: "What's in this image?",
        },
        {
          type: 'image_url',
          imageUrl: {
            url: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg',
          },
        },
      ],
    },
  ],
  stream: false,
});

console.log(result);
```

**`Python expandable lines`**

```python Python expandable lines
import requests
import json

url = "https://api.tramlabs.io/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {API_KEY_REF}",
    "Content-Type": "application/json"
}

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "What's in this image?"
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg"
                }
            }
        ]
    }
]

payload = {
    "model": "{{MODEL}}",
    "messages": messages
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())
```

**`TypeScript (fetch)`**

```typescript title="TypeScript (fetch)" expandable lines
const response = await fetch('https://api.tramlabs.io/v1/chat/completions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${API_KEY_REF}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: '{{MODEL}}',
    messages: [
      {
        role: 'user',
        content: [
          {
            type: 'text',
            text: "What's in this image?",
          },
          {
            type: 'image_url',
            image_url: {
              url: 'https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg',
            },
          },
        ],
      },
    ],
  }),
});

const data = await response.json();
console.log(data);
```

### Gửi ảnh mã hóa Base64

Với ảnh lưu sẵn ở máy, chỉ cần mã hóa base64 rồi gửi đi. Cách thực hiện như sau:

**`TypeScript`**

```typescript title="TypeScript" expandable lines
import OpenAI from 'openai';
import * as fs from 'fs';

const openai = new OpenAI({
  baseURL: 'https://api.tramlabs.io/v1',
  apiKey: '{{API_KEY_REF}}',
});

async function encodeImageToBase64(imagePath: string): Promise<string> {
  const imageBuffer = await fs.promises.readFile(imagePath);
  const base64Image = imageBuffer.toString('base64');
  return `data:image/jpeg;base64,${base64Image}`;
}

// Read and encode the image
const imagePath = 'path/to/your/image.jpg';
const base64Image = await encodeImageToBase64(imagePath);

const result = await openai.chat.completions.create({
  model: '{{MODEL}}',
  messages: [
    {
      role: 'user',
      content: [
        {
          type: 'text',
          text: "What's in this image?",
        },
        {
          type: 'image_url',
          imageUrl: {
            url: base64Image,
          },
        },
      ],
    },
  ],
  stream: false,
});

console.log(result);
```

**`Python expandable lines`**

```python Python expandable lines
import requests
import json
import base64
from pathlib import Path

def encode_image_to_base64(image_path):
    with open(image_path, "rb") as image_file:
        return base64.b64encode(image_file.read()).decode('utf-8')

url = "https://api.tramlabs.io/v1/chat/completions"
headers = {
    "Authorization": f"Bearer {API_KEY_REF}",
    "Content-Type": "application/json"
}

# Read and encode the image
image_path = "path/to/your/image.jpg"
base64_image = encode_image_to_base64(image_path)
data_url = f"data:image/jpeg;base64,{base64_image}"

messages = [
    {
        "role": "user",
        "content": [
            {
                "type": "text",
                "text": "What's in this image?"
            },
            {
                "type": "image_url",
                "image_url": {
                    "url": data_url
                }
            }
        ]
    }
]

payload = {
    "model": "{{MODEL}}",
    "messages": messages
}

response = requests.post(url, headers=headers, json=payload)
print(response.json())
```

**`TypeScript (fetch)`**

```typescript title="TypeScript (fetch)" expandable lines
async function encodeImageToBase64(imagePath: string): Promise<string> {
  const imageBuffer = await fs.promises.readFile(imagePath);
  const base64Image = imageBuffer.toString('base64');
  return `data:image/jpeg;base64,${base64Image}`;
}

// Read and encode the image
const imagePath = 'path/to/your/image.jpg';
const base64Image = await encodeImageToBase64(imagePath);

const response = await fetch('https://api.tramlabs.io/v1/chat/completions', {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${API_KEY_REF}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    model: '{{MODEL}}',
    messages: [
      {
        role: 'user',
        content: [
          {
            type: 'text',
            text: "What's in this image?",
          },
          {
            type: 'image_url',
            image_url: {
              url: base64Image,
            },
          },
        ],
      },
    ],
  }),
});

const data = await response.json();
console.log(data);
```

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

* `image/png`
* `image/jpeg`
* `image/webp`
* `image/gif`