File size: 3,837 Bytes
edec17e
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
8304bb2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
"""

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()