Всем привет!
Вчера делал интеграцию YandexART в своего юзербота, не нашел инструкций на Хабре, слава богу решил проблему сам, но я подумал что всё-таки надо поделиться способом интеграции.
Для начала создаем аккаунт на https://yandex.cloud или входим через свой аккаунт Яндекса.
После того как вошли/создали аккаунт переходим в консоль https://console.yandex.cloud.
Создаем платежный аккаунт и пополняем его на любую сумму (я положил 25 рублей).
После создания платежного аккаунта заходим на страницу «Сервисные аккаунты».
Дальше нажимаем на кнопку «Создать сервисный аккаунт».
Вписываем любое имя, описание можно не добавлять.
Добавляем роль в катологе ai.imageGeneration.user
После выбора нажимаем кнопку «Создать».
После создания нажимаем на кнопку «Создать новый ключ».
В всплывающем меню выбираем «Создать API‑Ключ».
Вписываем описание, после нажимаем «Создать».
После создания копируем идентификатор ключа и сам секретный ключ, ОБЯЗАТЕЛЬНО СОХРАНЯЕМ!
Теперь самое интересное — скрипт для генерации.
Для умных оставлю скрипт сразу, для чайников объясню что да как.
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 своего каталога
Теперь объяснение сначала мы указываем урл модели в ключе «modelUri».
После указываем настройки генерации
seed то есть зерно генерации, я его генерирую рандомно
Параметр aspectratio, то есть разрешение изображение которое выдаст нейросеть
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'
Надеюсь эта статья кому-то поможет, если у вас будут вопросы - пишите их в комментарии, попытаюсь ответить на все.
CapToYou
While True
при интеграции с внешним api лучше не использовать, нужно всегда ограничивать число попыток.И ещё, желательно retry добавить и для первого
POST
запроса.