File size: 2,581 Bytes
ba2fc46
370480b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# backend/src/services/llm/factory.py
from langchain_google_genai import ChatGoogleGenerativeAI
from langchain_openai import ChatOpenAI
from backend.src.core.config import settings

def get_llm_model(credentials: dict = None):
    """
    True Universal Factory (Fixed).
    Ab ye provider ke hisaab se sahi 'base_url' set karega.
    """
    
    # --- Default settings (Fallback) ---
    llm_provider = settings.LLM_PROVIDER.lower()
    llm_model_name = settings.LLM_MODEL_NAME
    llm_base_url = settings.LLM_BASE_URL
    llm_api_key = settings.LLM_API_KEY
    google_api_key = settings.GOOGLE_API_KEY

    # --- User-specific settings (Override) ---
    if credentials:
        # User ki settings use karo
        llm_provider = credentials.get("provider", llm_provider).lower()
        llm_model_name = credentials.get("model_name", llm_model_name)
        llm_base_url = credentials.get("base_url", llm_base_url)
        llm_api_key = credentials.get("api_key", llm_api_key)
        
        # Google ke liye
        if llm_provider == "google":
            google_api_key = llm_api_key
            
    # --- MAGIC FIX: Set Base URL for known providers ---
    if llm_provider == "groq" and not llm_base_url:
        llm_base_url = "https://api.groq.com/openai/v1"
        # Groq key .env se le lo agar user ne nahi di (fallback)
        llm_api_key = llm_api_key or settings.GROQ_API_KEY
        
    print(f"🤖 Loading AI Model: {llm_provider} -> {llm_model_name}")

    # --- BLOCK 1: GOOGLE GEMINI ---
    if llm_provider == "google":
        if not google_api_key:
            raise ValueError("Google API key not found.")
        return ChatGoogleGenerativeAI(
            model=llm_model_name,
            google_api_key=google_api_key,
            temperature=0.7,
            convert_system_message_to_human=True
        )

    # --- BLOCK 2: UNIVERSAL OPENAI-COMPATIBLE ---
    # Ye block Groq, OpenAI, Ollama, etc. sabko handle karega
    else:
        if not llm_api_key and "localhost" not in (llm_base_url or ""):
             print("⚠️ WARNING: No API Key provided for LLM. Trying global fallback.")
             # Fallback to global keys
             if settings.OPENAI_API_KEY and llm_provider == "openai":
                 llm_api_key = settings.OPENAI_API_KEY
             
        print(f"   -> Endpoint URL: {llm_base_url or 'Default OpenAI'}")
        
        return ChatOpenAI(
            model_name=llm_model_name,
            api_key=llm_api_key or "dummy-key",
            openai_api_base=llm_base_url,
            temperature=0.7
        )