SMART-FC / settings.py
Phuc-HugigFace's picture
Fix API AGENT 1
8864c89 verified
"""
Cấu hình hệ thống Multi-Agent Fake News Verification.
Thiết kế đơn giản: chỉ cần 3 biến để cấu hình LLM:
- LLM_BASE_URL: Endpoint API (đổi URL = đổi provider)
- LLM_API_KEY: API key tương ứng
- LLM_MODEL: Tên model
Hầu hết providers đều hỗ trợ OpenAI-compatible API,
nên chỉ cần 1 class ChatOpenAI là chạy được tất cả.
"""
from __future__ import annotations
import os
from pathlib import Path
from typing import TYPE_CHECKING, Optional
from dotenv import load_dotenv
if TYPE_CHECKING:
from langchain_openai import ChatOpenAI # type: ignore[import-untyped]
# Load .env file
env_path = Path(__file__).resolve().parent.parent / ".env"
load_dotenv(dotenv_path=env_path, override=True)
# ============================================================
# Cấu hình LLM — Gọi thông qua get_llm_for_agent
# ============================================================
def get_llm_for_agent(agent_type: str = "AGENT1") -> ChatOpenAI:
"""
Khởi tạo LLM client riêng cho từng Agent, lách Rate Limit bằng cách mix AI.
Đọc biến môi trường theo prefix (VD: AGENT1_BASE_URL, AGENT2_API_KEY).
Hỗ trợ mọi Provider có chuẩn OpenAI-compatible (Groq, HuggingFace, Gemini via OpenAI SDK).
"""
base_url = os.getenv(f"{agent_type}_BASE_URL", "https://api.groq.com/openai/v1")
api_key = os.getenv(f"{agent_type}_API_KEY", "")
model = os.getenv(f"{agent_type}_MODEL", "llama-3.1-8b-instant")
temperature = float(os.getenv(f"{agent_type}_TEMPERATURE", "0.1"))
max_tokens = int(os.getenv(f"{agent_type}_MAX_TOKENS", "4096"))
# Fallback back compatibility cũ nếu chưa update .env kịp
if not api_key:
api_key = os.getenv("LLM_API_KEY", "")
# Nếu dùng mechanism Pool Keys trên Hugging Face, gán dummy key để khỏi bị lỗi lúc init.
# BaseAgent sẽ tự động tráo key thật vào lúc call_llm().
if not api_key:
api_key = "dummy_key_for_pool_mechanism"
from langchain_openai import ChatOpenAI # type: ignore[import-untyped]
return ChatOpenAI(
model=model,
temperature=temperature,
max_tokens=max_tokens,
base_url=base_url,
api_key=api_key,
)
_gemini_pool_keys = []
_gemini_key_index = 0
_groq_pool_keys = []
_groq_key_index = 0
_hf_pool_keys = []
_hf_key_index = 0
_openrouter_pool_keys = []
_openrouter_key_index = 0
_openai_pool_keys = []
_openai_key_index = 0
def get_next_groq_key() -> Optional[str]:
"""Rút API Key Groq theo cơ chế xoay vòng."""
global _groq_pool_keys, _groq_key_index
if not _groq_pool_keys:
import os
keys_str = os.getenv("GROQ_POOL_KEYS", "")
if keys_str:
_groq_pool_keys = [k.strip() for k in keys_str.split(",") if k.strip()]
if _groq_pool_keys:
key = _groq_pool_keys[_groq_key_index % len(_groq_pool_keys)]
_groq_key_index += 1
return key
return None
def get_next_gemini_key() -> Optional[str]:
"""
Rút API Key từ rổ GEMINI_POOL_KEYS theo cơ chế vòng lặp xoay vòng (Round-Robin).
Sử dụng khi gặp Rate Limit (429) để tự động đổi Key mà không cần chờ.
"""
global _gemini_pool_keys, _gemini_key_index
# Load pool key 1 lần duy nhất
if not _gemini_pool_keys:
import os
keys_str = os.getenv("GEMINI_POOL_KEYS", "")
if keys_str:
_gemini_pool_keys = [k.strip() for k in keys_str.split(",") if k.strip()]
# Lấy key và xoay vòng
if _gemini_pool_keys:
key = _gemini_pool_keys[_gemini_key_index % len(_gemini_pool_keys)]
_gemini_key_index += 1
return key
return None
def get_next_hf_key() -> Optional[str]:
"""Rút API Key HuggingFace theo cơ chế xoay vòng."""
global _hf_pool_keys, _hf_key_index
if not _hf_pool_keys:
import os
keys_str = os.getenv("HF_POOL_KEYS", "")
if keys_str:
_hf_pool_keys = [k.strip() for k in keys_str.split(",") if k.strip()]
if _hf_pool_keys:
key = _hf_pool_keys[_hf_key_index % len(_hf_pool_keys)]
_hf_key_index += 1
return key
return None
def get_next_openrouter_key() -> Optional[str]:
"""Rút API Key OpenRouter theo cơ chế xoay vòng."""
global _openrouter_pool_keys, _openrouter_key_index
if not _openrouter_pool_keys:
import os
keys_str = os.getenv("OPENROUTER_POOL_KEYS", "")
if keys_str:
_openrouter_pool_keys = [k.strip() for k in keys_str.split(",") if k.strip()]
if _openrouter_pool_keys:
key = _openrouter_pool_keys[_openrouter_key_index % len(_openrouter_pool_keys)]
_openrouter_key_index += 1
return key
return None
def get_next_openai_key() -> Optional[str]:
"""Rút API Key OpenAI Native theo cơ chế vòng lặp."""
global _openai_pool_keys, _openai_key_index
if not _openai_pool_keys:
import os
keys_str = os.getenv("OPENAI_POOL_KEYS", "")
if keys_str:
_openai_pool_keys = [k.strip() for k in keys_str.split(",") if k.strip()]
if _openai_pool_keys:
key = _openai_pool_keys[_openai_key_index % len(_openai_pool_keys)]
_openai_key_index += 1
return key
return None