diff --git a/__pycache__/main.cpython-313.pyc b/__pycache__/main.cpython-313.pyc index f3c3640..fee451a 100644 Binary files a/__pycache__/main.cpython-313.pyc and b/__pycache__/main.cpython-313.pyc differ diff --git a/api/__pycache__/dependency.cpython-313.pyc b/api/__pycache__/dependency.cpython-313.pyc index ca98621..1919718 100644 Binary files a/api/__pycache__/dependency.cpython-313.pyc and b/api/__pycache__/dependency.cpython-313.pyc differ diff --git a/api/dependency.py b/api/dependency.py index 4455940..5cd2d5f 100644 --- a/api/dependency.py +++ b/api/dependency.py @@ -9,6 +9,8 @@ from repos.dao import DAO # ... ваши импорты ... +from aiogram import Bot + # Провайдеры "сырых" клиентов из состояния приложения def get_mongo_client(request: Request) -> AsyncIOMotorClient: return request.app.state.mongo_client @@ -16,6 +18,9 @@ def get_mongo_client(request: Request) -> AsyncIOMotorClient: def get_gemini_client(request: Request) -> GoogleAdapter: return request.app.state.gemini_client +def get_bot_client(request: Request) -> Bot: + return request.app.state.bot + # Провайдер DAO (собирается из mongo_client) def get_dao(mongo_client: AsyncIOMotorClient = Depends(get_mongo_client)) -> DAO: # FastAPI кэширует результат Depends в рамках одного запроса, @@ -26,5 +31,6 @@ def get_dao(mongo_client: AsyncIOMotorClient = Depends(get_mongo_client)) -> DAO def get_generation_service( dao: DAO = Depends(get_dao), gemini: GoogleAdapter = Depends(get_gemini_client), + bot: Bot = Depends(get_bot_client), ) -> GenerationService: - return GenerationService(dao, gemini) \ No newline at end of file + return GenerationService(dao, gemini, bot) \ No newline at end of file diff --git a/api/models/GenerationRequest.py b/api/models/GenerationRequest.py index 0b71ce8..06f8a96 100644 --- a/api/models/GenerationRequest.py +++ b/api/models/GenerationRequest.py @@ -13,6 +13,7 @@ class GenerationRequest(BaseModel): aspect_ratio: AspectRatios = AspectRatios.NINESIXTEEN quality: Quality = Quality.ONEK prompt: str + telegram_id: Optional[int] = None assets_list: List[str] diff --git a/api/models/__pycache__/GenerationRequest.cpython-313.pyc b/api/models/__pycache__/GenerationRequest.cpython-313.pyc index 9bddcb9..ff498b0 100644 Binary files a/api/models/__pycache__/GenerationRequest.cpython-313.pyc and b/api/models/__pycache__/GenerationRequest.cpython-313.pyc differ diff --git a/api/service/__pycache__/generation_service.cpython-313.pyc b/api/service/__pycache__/generation_service.cpython-313.pyc index beca295..07a5cf1 100644 Binary files a/api/service/__pycache__/generation_service.cpython-313.pyc and b/api/service/__pycache__/generation_service.cpython-313.pyc differ diff --git a/api/service/generation_service.py b/api/service/generation_service.py index 9d143da..be67fa9 100644 --- a/api/service/generation_service.py +++ b/api/service/generation_service.py @@ -5,6 +5,8 @@ from datetime import datetime, UTC from typing import List, Optional, Tuple, Any, Dict from io import BytesIO +from aiogram import Bot +from aiogram.types import BufferedInputFile from adapters.Exception import GoogleGenerationException from adapters.google_adapter import GoogleAdapter from api.models.GenerationRequest import GenerationRequest, GenerationResponse @@ -58,9 +60,10 @@ async def generate_image_task( return images_bytes, metrics class GenerationService: - def __init__(self, dao: DAO, gemini: GoogleAdapter): + def __init__(self, dao: DAO, gemini: GoogleAdapter, bot: Optional[Bot] = None): self.dao = dao self.gemini = gemini + self.bot = bot 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) 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): """ diff --git a/main.py b/main.py index 86e4723..7d11a95 100644 --- a/main.py +++ b/main.py @@ -66,7 +66,7 @@ char_repo = CharacterRepo(mongo_client) dao = DAO(mongo_client) # Главный DAO для бота dao = DAO(mongo_client) # Главный DAO для бота gemini = GoogleAdapter(api_key=GEMINI_API_KEY) -generation_service = GenerationService(dao, gemini) +generation_service = GenerationService(dao, gemini, bot) # Dispatcher 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.gemini_client = gemini + app.state.bot = bot print("✅ DB & DAO initialized") diff --git a/models/Generation.py b/models/Generation.py index 2f1f510..9bd313b 100644 --- a/models/Generation.py +++ b/models/Generation.py @@ -18,6 +18,7 @@ class Generation(BaseModel): status: GenerationStatus = GenerationStatus.RUNNING failed_reason: Optional[str] = None linked_character_id: Optional[str] = None + telegram_id: Optional[int] = None aspect_ratio: AspectRatios quality: Quality prompt: str diff --git a/models/__pycache__/Generation.cpython-313.pyc b/models/__pycache__/Generation.cpython-313.pyc index 036c27f..d31ee70 100644 Binary files a/models/__pycache__/Generation.cpython-313.pyc and b/models/__pycache__/Generation.cpython-313.pyc differ