flare / llm /llm_startup.py
ciyidogan's picture
Upload 134 files
edec17e verified
"""
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()