File size: 2,761 Bytes
512e442
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
"""Multi-provider LLM factory. Người dùng chọn provider + model tuỳ thích."""
from __future__ import annotations
import os
from typing import Optional

# Danh sách model free khả dụng cho mỗi provider
PROVIDERS = {
    "gemini": {
        "label": "Google Gemini",
        "env": "GOOGLE_API_KEY",
        "models": [
            "gemini-2.5-flash",
            "gemini-2.5-flash-lite",
            "gemini-2.5-pro",
            "gemini-2.0-flash",
            "gemini-2.0-flash-lite",
            "gemini-flash-latest",
            "gemini-pro-latest",
        ],
        "default": "gemini-2.5-flash-lite",
    },
    "groq": {
        "label": "Groq (cực nhanh)",
        "env": "GROQ_API_KEY",
        "models": [
            "llama-3.3-70b-versatile",
            "llama-3.1-8b-instant",
            "llama-3.2-90b-vision-preview",
            "mixtral-8x7b-32768",
            "gemma2-9b-it",
        ],
        "default": "llama-3.3-70b-versatile",
    },
    "github": {
        "label": "GitHub Models",
        "env": "GITHUB_TOKEN",
        "models": [
            "gpt-4o-mini",
            "gpt-4o",
            "Phi-3.5-mini-instruct",
            "Mistral-Nemo",
            "Llama-3.3-70B-Instruct",
        ],
        "default": "gpt-4o-mini",
    },
}


def available_providers() -> list[str]:
    """Trả về list provider có API key sẵn sàng dùng."""
    return [p for p, cfg in PROVIDERS.items() if os.getenv(cfg["env"])]


def build_llm(provider: str, model: Optional[str] = None, temperature: float = 0.3):
    """Khởi tạo LLM theo provider chọn. Raise nếu thiếu key."""
    if provider not in PROVIDERS:
        raise ValueError(f"Provider không hỗ trợ: {provider}. Chọn 1 trong {list(PROVIDERS)}")

    cfg = PROVIDERS[provider]
    api_key = os.getenv(cfg["env"])
    if not api_key:
        raise RuntimeError(
            f"Thiếu biến môi trường {cfg['env']} cho provider {provider}. "
            f"Xem .env.example để lấy hướng dẫn API key."
        )

    model = model or cfg["default"]

    if provider == "gemini":
        from langchain_google_genai import ChatGoogleGenerativeAI
        return ChatGoogleGenerativeAI(model=model, google_api_key=api_key, temperature=temperature)

    if provider == "groq":
        from langchain_groq import ChatGroq
        return ChatGroq(model=model, groq_api_key=api_key, temperature=temperature)

    if provider == "github":
        from langchain_openai import ChatOpenAI
        return ChatOpenAI(
            model=model,
            api_key=api_key,
            base_url="https://models.inference.ai.azure.com",
            temperature=temperature,
        )

    raise ValueError(f"Provider {provider} chưa implement")