Аутентификация
Все запросы к API должны содержать API-ключ. Поддерживается два способа передачи:
Способ 1: Заголовок Authorization (рекомендуется)
Authorization: Bearer YOUR_API_KEY
Способ 2: Заголовок X-API-Key
X-API-Key: YOUR_API_KEY
Получение API-ключа: Обратитесь к администратору системы или создайте ключ в разделе "API ключи" админ-панели.
Обработка ошибок
API возвращает ошибки в стандартном формате:
{
"success": false,
"error": {
"code": 400,
"message": "Описание ошибки"
}
}
Коды ошибок
| Код | Описание |
|---|---|
| 400 | Неверный запрос (отсутствуют параметры) |
| 401 | Не авторизован (неверный API-ключ) |
| 403 | Доступ запрещён |
| 404 | Ресурс не найден |
| 429 | Превышен лимит запросов |
| 500 | Внутренняя ошибка сервера |
POST /analyze
Загрузить и проанализировать изображение.
Параметры запроса
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
image |
file | * | Файл изображения (multipart/form-data) |
image_base64 |
string | * | Изображение в Base64 (с или без data URI prefix) |
image_url |
string | * | URL изображения для загрузки |
model |
string | Нет | Модель для анализа (по умолчанию: google/gemma-3-27b) |
prompt |
string | Нет | Пользовательский промпт для анализа |
* Один из параметров image, image_base64 или image_url обязателен
Пример запроса (файл)
curl -X POST https://vision.bakatuev.ru/api/v1/analyze \
-H "Authorization: Bearer YOUR_API_KEY" \
-F "image=@photo.jpg" \
-F "model=google/gemma-3-27b"
Пример запроса (Base64)
curl -X POST https://vision.bakatuev.ru/api/v1/analyze \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "image_base64=data:image/jpeg;base64,/9j/4AAQ..." \
-d "prompt=Опиши что изображено на фото"
Пример запроса (URL)
curl -X POST https://vision.bakatuev.ru/api/v1/analyze \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "image_url=https://example.com/photo.jpg"
Успешный ответ
{
"success": true,
"data": {
"image": {
"id": 123,
"filename": "20241209_143022_a1b2c3d4.jpg",
"original_name": "photo.jpg",
"url": "/assets/uploads/20241209_143022_a1b2c3d4.jpg",
"file_size": 245760,
"mime_type": "image/jpeg",
"status": "completed",
"description": "На изображении показан...",
"model_used": "google/gemma-3-27b",
"tokens_used": 512,
"processing_time": 2.345,
"created_at": "2024-12-09 14:30:22"
},
"remaining_requests": 95
}
}
GET /images
Получить список изображений пользователя.
Query параметры
| Параметр | Тип | По умолчанию | Описание |
|---|---|---|---|
page |
integer | 1 | Номер страницы |
per_page |
integer | 20 | Элементов на странице (макс. 100) |
status |
string | — | Фильтр по статусу: pending, processing, completed, failed |
Пример запроса
curl -X GET "https://vision.bakatuev.ru/api/v1/images?page=1&per_page=10" \
-H "Authorization: Bearer YOUR_API_KEY"
Ответ
{
"success": true,
"data": {
"images": [
{
"id": 123,
"filename": "20241209_143022_a1b2c3d4.jpg",
"original_name": "photo.jpg",
"status": "completed",
"description": "На изображении...",
"created_at": "2024-12-09 14:30:22"
}
],
"pagination": {
"page": 1,
"per_page": 10,
"total": 45,
"total_pages": 5
}
}
}
GET /images/{id}
Получить информацию о конкретном изображении.
Пример запроса
curl -X GET https://vision.bakatuev.ru/api/v1/images/123 \
-H "Authorization: Bearer YOUR_API_KEY"
Ответ
{
"success": true,
"data": {
"image": {
"id": 123,
"filename": "20241209_143022_a1b2c3d4.jpg",
"original_name": "photo.jpg",
"url": "/assets/uploads/20241209_143022_a1b2c3d4.jpg",
"file_size": 245760,
"mime_type": "image/jpeg",
"status": "completed",
"description": "На изображении показан...",
"model_used": "google/gemma-3-27b",
"tokens_used": 512,
"processing_time": 2.345,
"error_message": null,
"created_at": "2024-12-09 14:30:22"
}
}
}
DELETE /images/{id}
Удалить изображение.
Пример запроса
curl -X DELETE https://vision.bakatuev.ru/api/v1/images/123 \
-H "Authorization: Bearer YOUR_API_KEY"
Ответ
{
"success": true,
"data": {
"message": "Изображение удалено"
}
}
POST /images/{id}/reanalyze
Повторно проанализировать существующее изображение (с другой моделью или промптом).
Параметры
| Параметр | Тип | Описание |
|---|---|---|
model |
string | Модель для анализа |
prompt |
string | Пользовательский промпт |
Пример запроса
curl -X POST https://vision.bakatuev.ru/api/v1/images/123/reanalyze \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/x-www-form-urlencoded" \
-d "prompt=Подробно опиши все объекты на изображении"
GET /stats
Получить статистику использования.
Пример запроса
curl -X GET https://vision.bakatuev.ru/api/v1/stats \
-H "Authorization: Bearer YOUR_API_KEY"
Ответ
{
"success": true,
"data": {
"user": {
"id": 1,
"username": "user123"
},
"usage": {
"total_images": 156,
"today_images": 12,
"requests_limit": 100,
"requests_used": 45,
"requests_remaining": 55
},
"api_key": {
"name": "Production Key",
"requests_count": 1234,
"expires_at": "2025-12-31"
}
}
}
GET /models
Получить список доступных моделей.
Пример запроса
curl -X GET https://vision.bakatuev.ru/api/v1/models \
-H "Authorization: Bearer YOUR_API_KEY"
Ответ
{
"success": true,
"data": {
"models": [
"google/gemma-3-27b",
"llava-v1.6"
],
"default": "google/gemma-3-27b"
}
}
Примеры кода
Python
import requests
API_KEY = "your_api_key"
BASE_URL = "https://vision.bakatuev.ru/api/v1"
headers = {"Authorization": f"Bearer {API_KEY}"}
# Анализ изображения из файла
with open("photo.jpg", "rb") as f:
response = requests.post(
f"{BASE_URL}/analyze",
headers=headers,
files={"image": f},
data={"prompt": "Опиши изображение"}
)
print(response.json())
# Анализ по URL
response = requests.post(
f"{BASE_URL}/analyze",
headers=headers,
data={
"image_url": "https://example.com/photo.jpg",
"model": "google/gemma-3-27b"
}
)
print(response.json())
JavaScript (Node.js)
const fs = require('fs');
const FormData = require('form-data');
const axios = require('axios');
const API_KEY = 'your_api_key';
const BASE_URL = 'https://vision.bakatuev.ru/api/v1';
const headers = { Authorization: `Bearer ${API_KEY}` };
// Анализ изображения из файла
async function analyzeFile() {
const form = new FormData();
form.append('image', fs.createReadStream('photo.jpg'));
form.append('prompt', 'Опиши изображение');
const response = await axios.post(`${BASE_URL}/analyze`, form, {
headers: { ...headers, ...form.getHeaders() }
});
console.log(response.data);
}
// Получение статистики
async function getStats() {
const response = await axios.get(`${BASE_URL}/stats`, { headers });
console.log(response.data);
}
analyzeFile();
PHP
<?php
$apiKey = 'your_api_key';
$baseUrl = 'https://vision.bakatuev.ru/api/v1';
// Анализ изображения
$ch = curl_init();
curl_setopt_array($ch, [
CURLOPT_URL => "$baseUrl/analyze",
CURLOPT_RETURNTRANSFER => true,
CURLOPT_POST => true,
CURLOPT_HTTPHEADER => [
"Authorization: Bearer $apiKey",
],
CURLOPT_POSTFIELDS => [
'image' => new CURLFile('photo.jpg'),
'prompt' => 'Опиши изображение',
],
]);
$response = curl_exec($ch);
curl_close($ch);
$data = json_decode($response, true);
print_r($data);