MarketSync / modules /llm_provider.py
hyeonjoo's picture
Initial project commit with LFS
9b1e3db
# modules/llm_provider.py
from langchain_google_genai import ChatGoogleGenerativeAI
from typing import Optional
import config
logger = config.get_logger(__name__)
_llm_instance: Optional[ChatGoogleGenerativeAI] = None
def set_llm(llm: ChatGoogleGenerativeAI):
"""
Orchestrator가 생성한 기본 LLM 인스턴스를
글로벌 변수에 저장합니다.
"""
global _llm_instance
if _llm_instance is None:
logger.info(f"--- [LLM Provider] Global LLM instance set. (Model: {llm.model}, Temp: {llm.temperature}) ---")
_llm_instance = llm
else:
logger.info("--- [LLM Provider] Global LLM instance already set. ---")
def get_llm(temperature: float = 0.1) -> ChatGoogleGenerativeAI:
"""
저장된 글로벌 LLM 인스턴스를 검색합니다.
만약 도구가 요청한 temperature가 기본값과 다르면,
기본 인스턴스의 설정을 복사하여 temperature만 변경한
새로운 인스턴스를 반환합니다. (API 키 등은 재사용)
"""
global _llm_instance
if _llm_instance is None:
logger.error("--- [LLM Provider] LLM not initialized. ---")
raise RuntimeError(
"LLM not initialized. The Orchestrator must call set_llm() before any tools are used."
)
if _llm_instance.temperature == temperature:
logger.debug(f"--- [LLM Provider] Reusing global LLM instance (temp={temperature}) ---")
return _llm_instance
logger.info(f"--- [LLM Provider] Creating new LLM instance with temp={temperature} (default was {_llm_instance.temperature}) ---")
try:
# Pydantic v2+ (langchain-core 0.1.23+)
return _llm_instance.model_copy(update={"temperature": temperature})
except AttributeError:
# Pydantic v1 (fallback)
logger.warning("--- [LLM Provider] Using .copy() fallback (Pydantic v1) ---")
return _llm_instance.copy(update={"temperature": temperature})