
    1jV                         d Z ddlmZmZmZmZ dZdZdZdZ	dedee
ef   fd	Zd
ee
ef   dee
df   dee   fdZdee
ef   dee
ee   f   fdZdee
ef   de
fdZy)u  trace 의 usage 에서 프롬프트 토큰·캐시 적중 토큰을 읽는다 (읽기 전용).

Opik 은 usage 를 점 표기로 평평하게 눕혀 저장한다(`original_usage.prompt_
tokens` 등). 제공사마다 캐시 토큰의 이름이 다르므로 아래 후보를 순서대로
찾는다. **어느 후보도 없으면 "0" 이 아니라 "미보고"다** — 둘을 섞으면
적중률 0% 라는 거짓 기준선이 남는다.
    )AnyDictOptionalTuple)z#prompt_tokens_details.cached_tokenscache_read_input_tokenscached_content_token_countcached_tokens)cache_creation_input_tokensz(cache_creation.ephemeral_5m_input_tokens)prompt_tokensinput_tokenszoriginal_usage.usagereturnc                 n    i dt         dt        ddffd t        | t              r| ni d       S )u\   중첩 dict 도 점 표기로 눕힌다 — Opik 저장 형태와 SDK 원형 둘 다 수용.nodeprefixr   Nc                     t        | t              r'| j                         D ]  \  }} || | d        y |r	| |d d <   y y )N.)
isinstancedictitems)r   r   kvoutwalks       W/Users/manta/Documents/Projects/TheRoad-I1/tools/opik_prompt_audit/audit/cache_usage.pyr   zflatten_usage.<locals>.walk   sP    dD!

1Q6(1#Q( %#Cs      )r   strr   r   )r   r   r   s    @@r   flatten_usager       s>    C$3 $ $ $ 	*UD)r26Jr   flat
candidates.c                 `   i }| j                         D ]M  \  }}|j                  t              r|t        t              d n|}||vs|j                  t              rI|||<   O |D ]G  }|j	                  |      }t        |t              r%t        |t        t        f      s<t        |      c S  y)uY   후보 이름 중 먼저 잡히는 정수 값. `original_usage.` 접두는 벗겨 본다.N)	r   
startswith_ORIGINAL_PREFIXlengetr   boolintfloat)r!   r"   
normalizedkeyvaluenamecands          r   _pickr0   +   s    !#Jjjl
U.1nn=M.Ns3'()*TWz!8H)I$Jt	 #
 t$eT"ec5\*u:  r   tracec                     t        | j                  d            }t        |t              t        |t              t        |t
              dS )uO   한 trace 의 토큰 값 — 없는 항목은 None(미보고) 으로 남긴다.r   )r   r	   cache_write_tokens)r    r'   r0   PROMPT_TOKEN_KEYSCACHED_READ_KEYSCACHE_WRITE_KEYS)r1   r!   s     r   read_tokensr7   <   s@    7+,Dt%67t%56#D*:; r   c                     | j                  d      xs i }t        |t              r|j                  d      rt        |d         S y)Nmetadatamodel?)r'   r   r   r   )r1   mds     r   model_ofr=   F   s;    	:		$"B"dw2g;r   N)__doc__typingr   r   r   r   r5   r6   r4   r%   r   r    r)   r0   r7   r=    r   r   <module>rA      s    . -   6 $  c3h  S#X E#s(O  "tCH~ $sHSM/A*B DcN s r   