166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
from ai_bot.keyboards.flux.SelectTypeRequestKeyboard import SelectTypeRequestKeyboard
|
|
from ai_bot.msg.flux.SelectTypeMsg import SelectTypeMsg
|
|
from bot import FIRST
|
|
from bot.Handler import Handler
|
|
from telegram.constants import ParseMode
|
|
from ai_bot.states.FluxStates import FLUX_SET_PROMPT, FLUX_SET_SUBMODEL, FLUX_SET_TYPE_REQUEST, FLUX_SET_TEXT_PROMPT, FLUX_SET_IMG_TEXT_PROMPT, FluxStates
|
|
from telegram.ext import MessageHandler, filters, CallbackQueryHandler
|
|
from igf_api.IgfClient import IgfClient
|
|
from piapi_ai.PiapiAiApi import PiapiAiApi
|
|
from piapi_ai import client as piapi_client
|
|
from telegram import Bot
|
|
from dotenv import dotenv_values
|
|
import base64
|
|
|
|
config = dotenv_values(".env")
|
|
|
|
|
|
class FluxHandler(Handler):
|
|
|
|
@staticmethod
|
|
async def set_prompt(update, context):
|
|
igf_client = IgfClient()
|
|
task = igf_client.piapiTask.get_one({
|
|
'bot_id': context.bot.id,
|
|
'dialog_id': update.effective_chat.id,
|
|
'status': 0
|
|
})
|
|
|
|
task['prompt'] = update.effective_message.text
|
|
|
|
piapi_task = piapi_client.flux.create_task({
|
|
'model': task['model'],
|
|
'task_type': task['task_type'],
|
|
'input': {
|
|
'prompt': task['prompt'],
|
|
'width': 1024,
|
|
'height': 1024,
|
|
}
|
|
})
|
|
|
|
task['status'] = 1
|
|
task['task_id'] = piapi_task['data']['task_id']
|
|
|
|
igf_client.piapiTask.update(task['id'], task)
|
|
|
|
await context.bot.send_message(chat_id=update.effective_chat.id, text="Запрос к Flux принят, идет обработка",
|
|
parse_mode=ParseMode.HTML)
|
|
|
|
return FIRST
|
|
|
|
@staticmethod
|
|
async def set_img_prompt(update, context):
|
|
igf_client = IgfClient()
|
|
task = igf_client.piapiTask.get_one({
|
|
'bot_id': context.bot.id,
|
|
'dialog_id': update.effective_chat.id,
|
|
'status': 0
|
|
})
|
|
|
|
if update.message.caption:
|
|
task['prompt'] = update.message.caption
|
|
else:
|
|
await context.bot.send_message(chat_id=update.effective_chat.id, text="Prompt нужно указать в описании изображения",
|
|
parse_mode=ParseMode.HTML)
|
|
|
|
return FluxStates.get_state_by_key("set_img_text_prompt")
|
|
|
|
photo_inst = update.message.photo[-1]
|
|
photo = await context.bot.get_file(photo_inst['file_id'])
|
|
file_content = await photo.download_as_bytearray()
|
|
# Convert the file content to Base64
|
|
base64_encoded = base64.b64encode(file_content).decode('utf-8')
|
|
|
|
piapi_task = piapi_client.flux.create_task({
|
|
'model': task['model'],
|
|
'task_type': task['task_type'],
|
|
'input': {
|
|
'prompt': task['prompt'],
|
|
'image': base64_encoded,
|
|
}
|
|
})
|
|
|
|
task['status'] = 1
|
|
task['task_id'] = piapi_task['data']['task_id']
|
|
|
|
igf_client.piapiTask.update(task['id'], task)
|
|
|
|
await context.bot.send_message(chat_id=update.effective_chat.id, text="Запрос к Flux принят",
|
|
parse_mode=ParseMode.HTML)
|
|
|
|
return FIRST
|
|
|
|
@staticmethod
|
|
async def set_submodel(update, context):
|
|
query = update.callback_query
|
|
command, params = Handler.load_callback_query(query.data)
|
|
|
|
@staticmethod
|
|
async def set_type_request(update, context):
|
|
query = update.callback_query
|
|
command, params = Handler.load_callback_query(query.data)
|
|
|
|
igf_client = IgfClient()
|
|
|
|
task = igf_client.piapiTask.create({
|
|
'bot_id': context.bot.id,
|
|
'dialog_id': update.effective_chat.id,
|
|
'task_type': params['type'],
|
|
'model': 'Qubico/flux1-dev',
|
|
'status': 0,
|
|
})
|
|
|
|
if params['type'] == 'txt2img':
|
|
text = "Введите запрос для генерации изображения"
|
|
state = FluxStates.get_state_by_key("set_text_prompt")
|
|
else:
|
|
text = "Загрузите изображение и запрос для создания изображения"
|
|
state = FluxStates.get_state_by_key("set_img_text_prompt")
|
|
|
|
await context.bot.send_message(chat_id=update.effective_chat.id, text=text,
|
|
parse_mode=ParseMode.HTML)
|
|
|
|
return state
|
|
|
|
@staticmethod
|
|
async def start_scenario(update, context):
|
|
msg = SelectTypeMsg()
|
|
reply_markup = SelectTypeRequestKeyboard()
|
|
|
|
state = FluxStates.get_state_by_key("set_type_request")
|
|
|
|
await context.bot.send_message(chat_id=update.effective_chat.id, text=msg.get_msg(),
|
|
parse_mode=ParseMode.HTML, reply_markup=reply_markup.create_keyboard())
|
|
|
|
return state
|
|
|
|
@staticmethod
|
|
async def send_task_result(igf_task: dict, piapi_task: dict):
|
|
TOKEN = config['TELEGRAM_TOKEN']
|
|
bot = Bot(TOKEN)
|
|
|
|
await bot.send_document(chat_id=igf_task['dialog_id'], document=piapi_task['data']['output']['image_url'])
|
|
await bot.send_photo(chat_id=igf_task['dialog_id'], photo=piapi_task['data']['output']['image_url'])
|
|
|
|
igf_client = IgfClient()
|
|
igf_task['status'] = 2
|
|
igf_client.piapiTask.update(igf_task['id'], igf_task)
|
|
|
|
return FIRST
|
|
|
|
@staticmethod
|
|
def get_states(data=None) -> dict:
|
|
return {
|
|
FLUX_SET_TEXT_PROMPT: [
|
|
MessageHandler(filters.TEXT, FluxHandler.set_prompt)
|
|
],
|
|
FLUX_SET_SUBMODEL: [
|
|
CallbackQueryHandler(FluxHandler.set_submodel, pattern='^set_submodel?\S{3,}'),
|
|
],
|
|
FLUX_SET_TYPE_REQUEST: [
|
|
CallbackQueryHandler(FluxHandler.set_type_request, pattern='^set_type_request?\S{3,}'),
|
|
],
|
|
FLUX_SET_IMG_TEXT_PROMPT: [
|
|
MessageHandler(filters.PHOTO, FluxHandler.set_img_prompt)
|
|
],
|
|
} |