
    Si                       U d Z ddlmZ ddlmZmZ ddlmZ ddlm	Z	  ed      Z
 ed      Z ed	       G d
 d             Z ed	       G d d             Zd+d,dZ eddd       eddd       eddd       eddd       eddd       eddd       eddd       eddd       edd       edd       ed d!       ed"d#       ed$d%      d&Zd'ed(<   	 d-	 	 	 	 	 	 	 	 	 d.d)Zd/d*Zy)0u  모델별 비용 계산 유틸리티.

실제 사용 중인 모델 위주의 간결한 가격표와 비용 계산 함수를 제공한다.
외부 패키지 없이 stdlib만 사용. 가격 단위는 모두 USD / 1M 토큰.

참고 가격 (2026-03 기준 공식 문서 스냅샷):
  Anthropic: https://docs.anthropic.com/en/docs/build-with-claude/prompt-caching
  OpenAI:    https://openai.com/api/pricing/
  Google:    https://ai.google.dev/pricing
  DeepSeek:  https://api-docs.deepseek.com/quick_start/pricing
    )annotations)	dataclassfield)Decimal)Optional10000000T)frozenc                  B    e Zd ZU dZded<   ded<    ed      Zded<   y)	PricingEntryu6   모델 1개에 대한 가격 정보 (USD / 1M 토큰).r   input_per_1moutput_per_1mN)defaultzOptional[Decimal]cache_read_per_1m)__name__
__module____qualname____doc____annotations__r   r        D/home/jay/workspace/.worktrees/task-2117-dev1/utils/usage_pricing.pyr   r      s"    @+0+>(>r   r   c                  :    e Zd ZU dZded<   ded<   ded<   ded<   y)
CostResultu*  calculate_cost() 반환값.

    Attributes:
        input_cost: 일반 입력 토큰 비용 (USD).
        output_cost: 출력 토큰 비용 (USD).
        cache_savings: 캐시 사용으로 절약한 금액 (USD, >= 0).
        total_cost: 실제 청구 금액 = input + output + cache_read.
    r   
input_costoutput_costcache_savings
total_costN)r   r   r   r   r   r   r   r   r   r       s!     r   r   Nc                f    t        t        |       t        |      |t        |            S d       S )N)r   r   r   )r   r   )inpoutcrs      r   _pr#   5   s8    S\cl)+'"+  >B r   z15.00z75.00z1.50z3.00z0.30z0.80z4.00z0.08z0.25z1.25z0.03z2.50z10.00z0.15z0.60z0.075z0.10z0.40z0.14z0.28z0.55z2.19)zclaude-opus-4-6zclaude-sonnet-4-6zclaude-3-5-sonnet-20241022zclaude-3-5-haiku-20241022zclaude-3-opus-20240229zclaude-3-haiku-20240307zgpt-4ozgpt-4o-minizgemini-2.5-prozgemini-2.5-flashzgemini-2.0-flashzdeepseek-chatzdeepseek-reasonerzdict[str, PricingEntry]_PRICING_TABLEc                   t         |    }t        |      |j                  z  t        z  }t        |      |j                  z  t        z  }t
        }t
        }|dkD  rY|j                  Mt        |      |j                  z  t        z  }|j                  |j                  z
  }	t        |      |	z  t        z  }t        |||||z   |z         S )u  모델 이름과 토큰 수를 받아 USD 비용을 계산한다.

    Args:
        model: 모델 ID (_PRICING_TABLE 키).
        input_tokens: 일반 입력 토큰 수.
        output_tokens: 출력 토큰 수.
        cache_read_tokens: 캐시 읽기 토큰 수 (기본 0).

    Returns:
        CostResult (input_cost, output_cost, cache_savings, total_cost).

    Raises:
        KeyError: 가격표에 없는 모델 ID.
    r   )r   r   r   r   )r$   r   r   _ONE_MILLIONr   _ZEROr   r   )
modelinput_tokensoutput_tokenscache_read_tokensentryr   r   
cache_costr   saved_per_tokens
             r   calculate_costr/   T   s    ( 5!E&););;lJJ-(5+>+>>MKJM1!8!8!D./%2I2IILX
,,u/F/FF 12_D|S#+j8	 r   c                |    | j                   }| j                  }dd} ||      }|t        kD  r| d ||       dS |S )u   CostResult를 사람이 읽기 쉬운 문자열로 변환한다.

    $0.01 이상: "$18.00" 형식 (소수 2자리)
    $0.01 미만: "$0.000045" 형식 (소수 6자리)
    캐시 절약 있을 때: "$0.90 (saved $2.70 with cache)" 형식
    c                J    | t        d      k\  rd| dS | t        kD  rd| dS y)Nz0.01$z.2fz.6fz$0.00)r   r'   )amounts    r   _fmtzformat_cost.<locals>._fmt   s6    WV_$vcl##E>vcl##r   z (saved z with cache))r3   r   returnstr)r   r   r'   )cost_resulttotalsavingsr4   cost_strs        r   format_costr;   }   sM     ""E''G E{H8DM?,??Or   )N)r    r6   r!   r6   r"   zOptional[str]r5   r   )r   )
r(   r6   r)   intr*   r<   r+   r<   r5   r   )r7   r   r5   r6   )r   
__future__r   dataclassesr   r   decimalr   typingr   r&   r'   r   r   r#   r$   r   r/   r;   r   r   r   <module>rA      sM  
 # (  y! $? ? ? $  ( '7F3FGV4"$VWf"=!#FFF!; '6:!&&&9&)ffg.)66*66*'FF+'+' 6 	&&& & 	&
 &Rr   