Spaces:
Paused
Paused
| """ | |
| Flare – LLM startup notifier (Refactored) | |
| ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ | |
| Projeler açılırken LLM provider'a startup çağrısı yapar. | |
| """ | |
| from __future__ import annotations | |
| import threading | |
| import asyncio | |
| from typing import Dict, Any | |
| from utils.logger import log_info, log_error, log_warning, log_debug | |
| from config.config_provider import ConfigProvider, ProjectConfig, VersionConfig | |
| from .llm_factory import LLMFactory | |
| def _select_live_version(p: ProjectConfig) -> VersionConfig | None: | |
| """Yayınlanmış en güncel versiyonu getir.""" | |
| published = [v for v in p.versions if v.published] | |
| return max(published, key=lambda v: v.no) if published else None | |
| async def notify_startup_async(): | |
| """Notify LLM provider about project startups (async version)""" | |
| cfg = ConfigProvider.get() | |
| # Check if LLM provider requires repo info | |
| llm_provider_def = cfg.global_config.get_provider_config( | |
| "llm", | |
| cfg.global_config.llm_provider.name | |
| ) | |
| if not llm_provider_def or not llm_provider_def.requires_repo_info: | |
| log_info(f"ℹ️ LLM provider '{cfg.global_config.llm_provider.name}' does not require startup notification") | |
| return | |
| # Create LLM provider instance | |
| try: | |
| llm_provider = LLMFactory.create_provider() | |
| except Exception as e: | |
| log_error("❌ Failed to create LLM provider for startup", e) | |
| return | |
| # Notify for each enabled project | |
| enabled_projects = [p for p in cfg.projects if p.enabled and not getattr(p, 'deleted', False)] | |
| if not enabled_projects: | |
| log_info("ℹ️ No enabled projects found for startup notification") | |
| return | |
| for project in enabled_projects: | |
| version = _select_live_version(project) | |
| if not version: | |
| log_info(f"⚠️ No published version found for project '{project.name}', skipping startup") | |
| continue | |
| # Build project config - version.id yerine version.no kullan | |
| project_config = { | |
| "name": project.name, | |
| "version_no": version.no, # version_id yerine version_no | |
| "repo_id": version.llm.repo_id, | |
| "generation_config": version.llm.generation_config, | |
| "use_fine_tune": version.llm.use_fine_tune, | |
| "fine_tune_zip": version.llm.fine_tune_zip | |
| } | |
| try: | |
| log_info(f"🚀 Notifying LLM provider startup for project '{project.name}'...") | |
| success = await llm_provider.startup(project_config) | |
| if success: | |
| log_info(f"✅ LLM provider acknowledged startup for '{project.name}'") | |
| else: | |
| log_info(f"⚠️ LLM provider startup failed for '{project.name}'") | |
| except Exception as e: | |
| log_error(f"❌ Error during startup notification for '{project.name}'", e) | |
| def notify_startup(): | |
| """Synchronous wrapper for async startup notification""" | |
| # Create new event loop for thread | |
| loop = asyncio.new_event_loop() | |
| asyncio.set_event_loop(loop) | |
| try: | |
| loop.run_until_complete(notify_startup_async()) | |
| finally: | |
| loop.close() | |
| def run_in_thread(): | |
| """Start startup notification in background thread""" | |
| cfg = ConfigProvider.get() | |
| # Check if provider requires startup | |
| llm_provider_def = cfg.global_config.get_provider_config( | |
| "llm", | |
| cfg.global_config.llm_provider.name | |
| ) | |
| if not llm_provider_def or not llm_provider_def.requires_repo_info: | |
| log_info(f"🤖 {cfg.global_config.llm_provider.name} - Startup notification not required") | |
| return | |
| log_info("🚀 Starting LLM provider startup notification thread...") | |
| threading.Thread(target=notify_startup, daemon=True).start() |