Работа с API YandexART на Python

Всем привет!

Вчера делал интеграцию YandexART в своего юзербота, не нашел инструкций на Хабре, слава богу решил проблему сам, но я подумал что всё-таки надо поделиться способом интеграции.

Для начала создаем аккаунт на https://yandex.cloud или входим через свой аккаунт Яндекса.

После того как вошли/создали аккаунт переходим в консоль https://console.yandex.cloud.

Создаем платежный аккаунт и пополняем его на любую сумму (я положил 25 рублей).

После создания платежного аккаунта заходим на страницу «Сервисные аккаунты».

f5e526f5f0d7edd214735fb31c4921d9.png

Дальше нажимаем на кнопку «Создать сервисный аккаунт».

Вписываем любое имя, описание можно не добавлять.

Добавляем роль в катологе ai.imageGeneration.user

a7b3c46d0a7e51164047d32af1c3a65f.png

После выбора нажимаем кнопку «Создать».

После создания нажимаем на кнопку «Создать новый ключ».

f400f95b641489d0bf38158e0e963c83.png

В всплывающем меню выбираем «Создать API‑Ключ».

ee2da1529ccb76417bde74ba72f662a5.png

Вписываем описание, после нажимаем «Создать».

815f9c08fd3365b3a7f1af18de809294.png

После создания копируем идентификатор ключа и сам секретный ключ, ОБЯЗАТЕЛЬНО СОХРАНЯЕМ!

Теперь самое интересное — скрипт для генерации.

Для умных оставлю скрипт сразу, для чайников объясню что да как.

import requests
import base64
import time

def yandex_art_request(prompt, seed):
    prompt = {
        "modelUri": "art:///yandex-art/latest",
        "generationOptions": {
        "seed": seed,
        "aspectRatio": {
            "widthRatio": "1",
            "heightRatio": "1"
        }
        },
        "messages": [
            {
                "weight": "1",
                "text": prompt
            }
        ]
    }
    
    headers = {
        "Content-Type": "application/json",
        "Authorization": "Api-key <Секретный ключ>"
    }
    
    create_request = requests.post('https://llm.api.cloud.yandex.net/foundationModels/v1/imageGenerationAsync', headers=headers, json=prompt)

    while True:
        time.sleep(5)
        done_request = requests.get(f'https://llm.api.cloud.yandex.net:443/operations/{create_request.json()["id"]}', headers=headers)
        if done_request.json()['done'] == True:
            with open(create_request.json()['id'] + '.jpeg', 'wb') as file:
                file.write(base64.b64decode(done_request.json()['response']['image']))

            break
    
    return create_request.json()['id'] + '.jpeg'

Теперь объясняю для чайников что мы сделали в коде.

Одно из самых важных — промпт (Запрос к нейросети).

prompt = {
        "modelUri": "art:///yandex-art/latest",
        "generationOptions": {
        "seed": seed,
        "aspectRatio": {
            "widthRatio": "1",
            "heightRatio": "1"
        }
        },
        "messages": [
            {
                "weight": "1",
                "text": prompt
            }
        ]
    }

Вместо вставляем id своего каталога

ID можно скопировать нажав на эту кнопку

ID можно скопировать нажав на эту кнопку

Теперь объяснение сначала мы указываем урл модели в ключе «modelUri».

После указываем настройки генерации

  1. seed то есть зерно генерации, я его генерирую рандомно

  2. Параметр aspectratio, то есть разрешение изображение которое выдаст нейросеть

  3. messages — это сообщения для нейросети, в нашем промпте указано только 1 сообщение с текстом запроса

Теперь переходим к авторизации:

headers = {
        "Content-Type": "application/json",
        "Authorization": "Api-key <Секретный ключ>"
    }

В ключе «Authorization» указываем свой секретный API ключ который мы получили ранее в формате «Api-key <Секретный API ключ>».

Ну и самое интересное — начало генерации.

Для начала генерации нам нужно отправить запрос с промптом.

create_request = requests.post('https://llm.api.cloud.yandex.net/foundationModels/v1/imageGenerationAsync', headers=headers, json=prompt)

После отправки запроса о начале генерации начинаем проверку генерации, тоесть отправляем запрос каждые 5 секунд, если готово то записываем в файл jpeg.

while True:
        time.sleep(5)
        done_request = requests.get(f'https://llm.api.cloud.yandex.net:443/operations/{create_request.json()["id"]}', headers=headers)
        if done_request.json()['done'] == True: # Проверка готово ли изображение
            with open(create_request.json()['id'] + '.jpeg', 'wb') as file: # Если изображение готово то записываем картинку в файл
                file.write(base64.b64decode(done_request.json()['response']['image'])) # Расшифровываем изображение и записываем в файл

            break

После окончания генерации возвращаем название созданного изображения в папке с кодом.

return create_request.json()['id'] + '.jpeg'

Весь код:

import requests
import base64
import time

def yandex_art_request(prompt, seed):
    prompt = {
        "modelUri": "art:///yandex-art/latest",
        "generationOptions": {
        "seed": seed,
        "aspectRatio": {
            "widthRatio": "1",
            "heightRatio": "1"
        }
        },
        "messages": [
            {
                "weight": "1",
                "text": prompt
            }
        ]
    }
    
    headers = {
        "Content-Type": "application/json",
        "Authorization": "Api-key <Секретный ключ>"
    }
    
    create_request = requests.post('https://llm.api.cloud.yandex.net/foundationModels/v1/imageGenerationAsync', headers=headers, json=prompt)

    while True:
        time.sleep(5)
        done_request = requests.get(f'https://llm.api.cloud.yandex.net:443/operations/{create_request.json()["id"]}', headers=headers)
        if done_request.json()['done'] == True:
            with open(create_request.json()['id'] + '.jpeg', 'wb') as file:
                file.write(base64.b64decode(done_request.json()['response']['image']))

            break
    
    return create_request.json()['id'] + '.jpeg'

Надеюсь эта статья кому-то поможет, если у вас будут вопросы — пишите их в комментарии, попытаюсь ответить на все.

© Habrahabr.ru