ДокументацияКартинки: распознать и нарисовать

Картинки: распознать и нарисовать

СценарииСредний20 мин

Вы научите модель отвечать на вопросы по фото и скриншотам, а когда генерацию включат — рисовать картинки по описанию.

Нужно: ключ fetch_... (создать), баланс (пополнить), Python и pip install openai.

1Вопрос по картинке

  1. 1
    Установите SDK

    pip install openai

  2. 2
    Сохраните код

    Скопируйте код ниже в vision.py.

  3. 3
    Задайте вопрос
    bash
    export ZUKKO_API_KEY="fetch_..."
    python vision.py screenshot.png "Что означает эта ошибка и как её исправить?"
    python vision.py https://example.com/photo.jpg "Опиши товар для карточки маркетплейса"

    Картинку можно передать файлом или публичной ссылкой. Ссылки за логином и временные модель не скачает.

vision.py
import base64
import mimetypes
import os
import sys

from openai import OpenAI

client = OpenAI(
    base_url="https://api.zukko.pro/v1",
    api_key=os.environ["ZUKKO_API_KEY"],
    timeout=120,
)
MODEL = os.environ.get("ZUKKO_MODEL", "claude-haiku-5-5")  # модель должна принимать картинки

2Какую модель взять

Модель должна принимать картинки — см. столбец «Картинки на вход» в Модели и цены.

МодельВход / выход, $ за 1M токеновКогда брать
claude-haiku-5-50.05 / 0.2Чеки, скриншоты, простые фото
gpt-6-sol0.13 / 0.63Универсальный вариант
claude-sonnet-50.4 / 2Мелкий текст, таблицы, схемы
qwen3.8-omni-flash0.03 / 0.08Самый дешёвый

Не принимают картинки: deepseek-v4.1-flash, gemini-3.8-flash, kimi-k3.1-pro, glm-5.3, gpt-6-luna. Актуальный список — GET /v1/models/info, поле supports_vision.

3Чек в JSON

Положите receipt.py рядом с vision.py и запустите: python receipt.py check.jpg. Код сверяет сумму строк с итогом — расхождения проверяйте вручную.

receipt.py
import json
import sys

from vision import client, image_to_data_url

RECEIPT_FORMAT = {
    "type": "json_schema",
    "json_schema": {
        "name": "receipt",
        "strict": True,
        "schema": {
            "type": "object",
            "properties": {
                "store": {"type": "string"},

4В Telegram-боте

Добавьте обработчик в бота из статьи Telegram-бот с нейросетью: пользователь шлёт фото с вопросом в подписи. Модель в ZUKKO_MODEL должна принимать картинки.

bot.py (добавить)
import base64


async def on_photo(update: Update, context: ContextTypes.DEFAULT_TYPE) -> None:
    photo = update.message.photo[-1]  # Telegram присылает несколько размеров, берём самый большой
    file = await photo.get_file()
    data = base64.b64encode(await file.download_as_bytearray()).decode()
    question = update.message.caption or "Что на этой картинке?"

    response = await client.chat.completions.create(
        model=MODEL,  # модель должна принимать картинки, например claude-haiku-5-5
        messages=[
            {
                "role": "user",

5Генерация картинок

Эндпоинт — POST /v1/images/generations в формате OpenAI. Генерация идёт до 3 минут, поэтому таймаут клиента — 300 с. Для curl нужен jq. Все параметры — POST /v1/images/generations.

import base64
import os

from openai import OpenAI

client = OpenAI(
    base_url="https://api.zukko.pro/v1",
    api_key=os.environ["ZUKKO_API_KEY"],
    timeout=300,  # генерация может идти до 3 минут
)

result = client.images.generate(
    model="openai-gpt-image-2-text-to-image",
    prompt="Уютная кофейня осенним вечером, тёплый свет из окон, акварель",
    size="1024x1024",
    quality="high",
    response_format="b64_json",
)

with open("picture.png", "wb") as f:
    f.write(base64.b64decode(result.data[0].b64_json))
print("Готово: picture.png")

6Если не работает

Что видитеЧто сделать
400 или модель «не видит» картинкуВозьмите модель с поддержкой картинок, например claude-haiku-5-5
Ошибка про ссылку на картинкуСкачайте картинку и отправьте файлом (data URL)
Модель путает цифры в чекеПереснимите ближе, возьмите claude-sonnet-5
json.JSONDecodeError в receipt.pyПовторите запрос, для длинных чеков увеличьте max_tokens
503 model_disabled при генерацииМодели изображений временно выключены — следите за GET /v1/models
402 insufficient_balance или 504 image_generation_timeout402 — пополните баланс. 504 — повторите, упростите промпт

Остальные коды — Ошибки API.

Картинки: распознать и нарисовать · Документация Zukko