
    (<iy              
       *   U d Z ddlZddlmZmZ ddlmZmZ e G d d             Z eddd	d
d       eddddd       eddddd       eddddd      gZ	ee   e
d<   g dg dg ddZeeee   f   e
d<   d d!d"dZeeef   e
d#<    G d$ d%      Zy)&u  보조 LLM 라우터 — 저렴한 모델 자동 선택 + 다단계 fallback.

task_type 매핑:
  summarize → Haiku > Gemini Flash > GPT-4o-mini
  analyze   → Sonnet > GPT-4o > Gemini Pro
  classify  → Haiku > GPT-4o-mini > Gemini Flash
  default   → 첫 번째 사용 가능한 프로바이더

실제 API 호출 없음 — 라우팅 로직만 구현.
호출자가 반환된 ProviderConfig로 직접 호출해야 함.
    N)	dataclassfield)ListOptionalc                   R    e Zd ZU dZeed<   eed<   eed<   dZee   ed<   dZe	ed<   y)	ProviderConfigu"   단일 LLM 프로바이더 설정.namemodelapi_key_envNbase_urlr   priority)
__name__
__module____qualname____doc__str__annotations__r   r   r   int     E/home/jay/workspace/.worktrees/task-2057-dev2/utils/aux_llm_router.pyr   r      s-    ,
IJ"Hhsm"Hcr   r   	anthropiczclaude-haiku-4-5ANTHROPIC_API_KEYzhttps://api.anthropic.com/v1
   r	   r
   r   r   r   openaizgpt-4o-miniOPENAI_API_KEY   googlezgemini-2.5-flashGOOGLE_API_KEYz7https://generativelanguage.googleapis.com/v1beta/openai   deepseekzdeepseek-chatDEEPSEEK_API_KEYzhttps://api.deepseek.com/v1   _DEFAULT_PROVIDERS)r   r   r   )r   r   r   )	summarizeanalyzeclassify_TASK_CHAINSzclaude-sonnet-4-6zgpt-4ozgemini-2.5-pro_ANALYZE_MODEL_OVERRIDESc                   V    e Zd ZdZd	deee      ddfdZdee   fdZde	dee   fdZ
y)
	AuxRouteru   보조 LLM 라우터.

    Args:
        providers: 사용할 ProviderConfig 목록.
                   None이면 기본 4개 프로바이더(_DEFAULT_PROVIDERS) 사용.
    N	providersreturnc                 R    |t        t              | _        y t        |      | _        y N)listr%   r-   )selfr-   s     r   __init__zAuxRouter.__init__a   s     378J3KDN!)_DNr   c                     g }| j                   D ]@  }t        j                  j                  |j                  d      }|s0|j                  |       B |S )u   API 키가 환경변수에 설정된(비어 있지 않은) 프로바이더만 반환.

        Returns:
            사용 가능한 ProviderConfig 리스트 (등록 순서 유지).
         )r-   osenvirongetr   append)r2   	availableprovider	key_values       r   get_available_providersz!AuxRouter.get_available_providersl   sO     +-	 	+H

x';';R@I  *	+ r   	task_typec                 ^   | j                         }|sy|D ci c]  }|j                  | }}t        j                  |      }|r`|D ][  }||v s||   }|dk(  rG|t        v r?t        |j                  t        |   |j                  |j                  |j                        }|c S  |d   S c c}w )u`  task_type에 맞는 최적 프로바이더를 선택해 반환.

        Args:
            task_type: "summarize" | "analyze" | "classify" | "default"
                       그 외 알 수 없는 값은 "default" 동작 적용.

        Returns:
            선택된 ProviderConfig, 또는 사용 가능한 프로바이더가 없으면 None.
        Nr'   r   r   )	r=   r	   r)   r8   r*   r   r   r   r   )r2   r>   r:   pprovider_mapchainr	   selecteds           r   routezAuxRouter.routey   s     002	 GP2P166192P2P  + $<'+D1H I-$:R2R#1!)":4"@(0(<(<%-%6%6%-%6%6$ $O$ |) 3Qs   B*r0   )r   r   r   r   r   r   r   r3   r=   r   rD   r   r   r   r,   r,   Y   sM    -(4+?"@ -D -n)= #s #x'? #r   r,   )r   r6   dataclassesr   r   typingr   r   r   r%   r   r)   dictr   r*   r,   r   r   r   <module>rH      s   
 
 ( !     '/ $  $J &.-, D( D 301&d3S	>"  %, $sCx. C Cr   