Spaces:
Building
Building
""" | |
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() |