File size: 3,808 Bytes
4f5da3c
 
 
 
 
 
 
 
 
 
eb65f56
4f5da3c
 
 
 
 
 
850e988
4f5da3c
 
 
 
 
 
 
 
 
 
 
 
eb65f56
4f5da3c
 
 
 
 
 
eb65f56
4f5da3c
 
 
 
 
 
eb65f56
4f5da3c
 
 
 
 
eb65f56
4f5da3c
 
850e988
4f5da3c
 
850e988
4f5da3c
 
 
 
 
 
 
eb65f56
4f5da3c
 
 
eb65f56
4f5da3c
eb65f56
4f5da3c
 
eb65f56
4f5da3c
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eb65f56
4f5da3c
 
eb65f56
4f5da3c
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 logger import log_info, log_error, log_warning, log_debug
from 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()