Картинки: распознать и нарисовать
Вы научите модель отвечать на вопросы по фото и скриншотам, а когда генерацию включат — рисовать картинки по описанию.
Нужно: ключ fetch_... (создать), баланс (пополнить), Python и pip install openai.
1Вопрос по картинке
- 1Установите SDK
pip install openai - 2Сохраните код
Скопируйте код ниже в
vision.py. - 3Задайте вопросbash
export ZUKKO_API_KEY="fetch_..." python vision.py screenshot.png "Что означает эта ошибка и как её исправить?" python vision.py https://example.com/photo.jpg "Опиши товар для карточки маркетплейса"Картинку можно передать файлом или публичной ссылкой. Ссылки за логином и временные модель не скачает.
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-5 | 0.05 / 0.2 | Чеки, скриншоты, простые фото |
gpt-6-sol | 0.13 / 0.63 | Универсальный вариант |
claude-sonnet-5 | 0.4 / 2 | Мелкий текст, таблицы, схемы |
qwen3.8-omni-flash | 0.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. Код сверяет сумму строк с итогом — расхождения проверяйте вручную.
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 должна принимать картинки.
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_timeout | 402 — пополните баланс. 504 — повторите, упростите промпт |
Остальные коды — Ошибки API.