feat: Add optional telegram_id field to Generation and GenerationRequest models.

This commit is contained in:
xds
2026-02-05 21:10:50 +03:00
parent 463e73fa1e
commit d4682b1418
10 changed files with 29 additions and 3 deletions

Binary file not shown.

View File

@@ -9,6 +9,8 @@ from repos.dao import DAO
# ... ваши импорты ... # ... ваши импорты ...
from aiogram import Bot
# Провайдеры "сырых" клиентов из состояния приложения # Провайдеры "сырых" клиентов из состояния приложения
def get_mongo_client(request: Request) -> AsyncIOMotorClient: def get_mongo_client(request: Request) -> AsyncIOMotorClient:
return request.app.state.mongo_client return request.app.state.mongo_client
@@ -16,6 +18,9 @@ def get_mongo_client(request: Request) -> AsyncIOMotorClient:
def get_gemini_client(request: Request) -> GoogleAdapter: def get_gemini_client(request: Request) -> GoogleAdapter:
return request.app.state.gemini_client return request.app.state.gemini_client
def get_bot_client(request: Request) -> Bot:
return request.app.state.bot
# Провайдер DAO (собирается из mongo_client) # Провайдер DAO (собирается из mongo_client)
def get_dao(mongo_client: AsyncIOMotorClient = Depends(get_mongo_client)) -> DAO: def get_dao(mongo_client: AsyncIOMotorClient = Depends(get_mongo_client)) -> DAO:
# FastAPI кэширует результат Depends в рамках одного запроса, # FastAPI кэширует результат Depends в рамках одного запроса,
@@ -26,5 +31,6 @@ def get_dao(mongo_client: AsyncIOMotorClient = Depends(get_mongo_client)) -> DAO
def get_generation_service( def get_generation_service(
dao: DAO = Depends(get_dao), dao: DAO = Depends(get_dao),
gemini: GoogleAdapter = Depends(get_gemini_client), gemini: GoogleAdapter = Depends(get_gemini_client),
bot: Bot = Depends(get_bot_client),
) -> GenerationService: ) -> GenerationService:
return GenerationService(dao, gemini) return GenerationService(dao, gemini, bot)

View File

@@ -13,6 +13,7 @@ class GenerationRequest(BaseModel):
aspect_ratio: AspectRatios = AspectRatios.NINESIXTEEN aspect_ratio: AspectRatios = AspectRatios.NINESIXTEEN
quality: Quality = Quality.ONEK quality: Quality = Quality.ONEK
prompt: str prompt: str
telegram_id: Optional[int] = None
assets_list: List[str] assets_list: List[str]

View File

@@ -5,6 +5,8 @@ from datetime import datetime, UTC
from typing import List, Optional, Tuple, Any, Dict from typing import List, Optional, Tuple, Any, Dict
from io import BytesIO from io import BytesIO
from aiogram import Bot
from aiogram.types import BufferedInputFile
from adapters.Exception import GoogleGenerationException from adapters.Exception import GoogleGenerationException
from adapters.google_adapter import GoogleAdapter from adapters.google_adapter import GoogleAdapter
from api.models.GenerationRequest import GenerationRequest, GenerationResponse from api.models.GenerationRequest import GenerationRequest, GenerationResponse
@@ -58,9 +60,10 @@ async def generate_image_task(
return images_bytes, metrics return images_bytes, metrics
class GenerationService: class GenerationService:
def __init__(self, dao: DAO, gemini: GoogleAdapter): def __init__(self, dao: DAO, gemini: GoogleAdapter, bot: Optional[Bot] = None):
self.dao = dao self.dao = dao
self.gemini = gemini self.gemini = gemini
self.bot = bot
async def ask_prompt_assistant(self, prompt: str, assets: List[str] = None) -> str: async def ask_prompt_assistant(self, prompt: str, assets: List[str] = None) -> str:
@@ -249,6 +252,20 @@ class GenerationService:
await self.dao.generations.update_generation(generation) await self.dao.generations.update_generation(generation)
logger.info(f"Generation {generation.id} completed successfully. {len(created_assets)} assets created. Total Time: {generation.execution_time_seconds:.2f}s") logger.info(f"Generation {generation.id} completed successfully. {len(created_assets)} assets created. Total Time: {generation.execution_time_seconds:.2f}s")
# 6. Send to Telegram if telegram_id is provided
if generation.telegram_id and self.bot:
try:
for asset in created_assets:
if asset.data:
await self.bot.send_photo(
chat_id=generation.telegram_id,
photo=BufferedInputFile(asset.data, filename=f"{asset.name}.jpg"),
caption=f"Generated from prompt: {generation.prompt[:100]}..."
)
logger.info(f"Sent {len(created_assets)} assets to Telegram ID: {generation.telegram_id}")
except Exception as e:
logger.error(f"Failed to send assets to Telegram ID {generation.telegram_id}: {e}")
async def _simulate_progress(self, generation: Generation): async def _simulate_progress(self, generation: Generation):
""" """

View File

@@ -66,7 +66,7 @@ char_repo = CharacterRepo(mongo_client)
dao = DAO(mongo_client) # Главный DAO для бота dao = DAO(mongo_client) # Главный DAO для бота
dao = DAO(mongo_client) # Главный DAO для бота dao = DAO(mongo_client) # Главный DAO для бота
gemini = GoogleAdapter(api_key=GEMINI_API_KEY) gemini = GoogleAdapter(api_key=GEMINI_API_KEY)
generation_service = GenerationService(dao, gemini) generation_service = GenerationService(dao, gemini, bot)
# Dispatcher # Dispatcher
dp = Dispatcher(storage=MongoStorage(mongo_client, db_name=DB_NAME)) dp = Dispatcher(storage=MongoStorage(mongo_client, db_name=DB_NAME))
@@ -118,6 +118,7 @@ async def lifespan(app: FastAPI):
app.state.mongo_client = mongo_client app.state.mongo_client = mongo_client
app.state.mongo_client = mongo_client app.state.mongo_client = mongo_client
app.state.gemini_client = gemini app.state.gemini_client = gemini
app.state.bot = bot
print("✅ DB & DAO initialized") print("✅ DB & DAO initialized")

View File

@@ -18,6 +18,7 @@ class Generation(BaseModel):
status: GenerationStatus = GenerationStatus.RUNNING status: GenerationStatus = GenerationStatus.RUNNING
failed_reason: Optional[str] = None failed_reason: Optional[str] = None
linked_character_id: Optional[str] = None linked_character_id: Optional[str] = None
telegram_id: Optional[int] = None
aspect_ratio: AspectRatios aspect_ratio: AspectRatios
quality: Quality quality: Quality
prompt: str prompt: str