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

в 8:42, , рубрики: python, Yandex API, yandexart, генерация изображений, генерация картинок, нейросети, нейросеть, шедеврум, яндекс

Всем привет!

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

import requests
import base64
import time

def yandex_art_request(prompt, seed):
    prompt = {
        "modelUri": "art://<ID Каталога>/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://<ID Каталога>/yandex-art/latest",
        "generationOptions": {
        "seed": seed,
        "aspectRatio": {
            "widthRatio": "1",
            "heightRatio": "1"
        }
        },
        "messages": [
            {
                "weight": "1",
                "text": prompt
            }
        ]
    }

Вместо <ID Каталога> вставляем 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://<ID Каталога>/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'

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

Автор: Sterrist

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js