File size: 1,967 Bytes
9b1e3db
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
# 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})