
    i                     t    d Z ddlZddlmZ deeef   deeef   ddfdZdeeeef      deeeef      fd	Zy)
u  Anthropic 프롬프트 캐싱 유틸리티 (system_and_3 전략).

멀티턴 대화에서 입력 토큰 비용을 절감하기 위해 Anthropic의 cache_control
breakpoint를 메시지에 삽입합니다.

system_and_3 전략:
  - breakpoint 1: 시스템 프롬프트 (모든 턴에서 동일, 캐시 효과 최대)
  - breakpoint 2-4: 최근 비시스템 메시지 최대 3개 (롤링 윈도우)

총 최대 4개의 breakpoint를 사용하며 이는 Anthropic API 제한과 일치합니다.

순수 함수 설계: 입력을 deep copy하여 원본 메시지 목록을 변경하지 않습니다.

Usage:
    from utils.prompt_cache import apply_cache_markers

    cached_messages = apply_cache_markers(messages)
    # Anthropic API 호출 시 cached_messages 사용
    N)Anymsgmarkerreturnc                     | j                  d      }||dk(  r|| d<   yt        |t              rd||dg| d<   yt        |t              r|r|d   }t        |t              r||d<   yyyy)uQ  단일 메시지의 마지막 content 블록에 cache_control을 삽입합니다.

    메시지 content 형식에 따라 처리:
    - str: [{"type": "text", "text": ..., "cache_control": ...}] 로 변환
    - list: 마지막 블록에 cache_control 추가
    - None/빈 문자열: 메시지 레벨에 직접 cache_control 추가
    contentN cache_controltext)typer   r
   )get
isinstancestrlistdict)r   r   r   
last_blocks       C/home/jay/workspace/.worktrees/task-2116-dev1/utils/prompt_cache.py_attach_cache_controlr      s     ggi G'R-%O'3#)7VTUI'4 WR[
j$'*0J' ( &-     messagesc                 >   | sg S t        j                  |       }ddi}d}|d   j                  d      dk(  rt        |d   |       |dz  }t	        |      D cg c]  \  }}|j                  d      dk7  s| }}}|| d D ]  }t        ||   |        |S c c}}w )	uA  system_and_3 전략으로 메시지에 Anthropic 캐시 마커를 삽입합니다.

    시스템 프롬프트 1개 + 최근 비시스템 메시지 최대 3개에 cache_control breakpoint를
    삽입하여 총 최대 4개의 breakpoint를 사용합니다.

    원본 messages 리스트를 변경하지 않습니다 (deep copy 반환).

    Args:
        messages: Anthropic API 형식의 메시지 목록.
                  각 메시지는 {"role": ..., "content": ...} 형태.

    Returns:
        cache_control breakpoint가 삽입된 메시지 목록의 deep copy.
    r   	ephemeral   r   rolesystem   N)copydeepcopyr   r   	enumerate)r   resultr   breakpoints_remainingimnon_system_indicesidxs           r   apply_cache_markersr'   1   s     	]]8$F$k2F ay}}V(fQi0" )2&(9W1QUU6]h=V!WW!#8"8"9: 3fSk623 M	 Xs   B6B)	__doc__r   typingr   r   r   r   r   r'    r   r   <module>r+      si   (  1tCH~ 1tCH~ 1$ 10 $tCH~"6  4S#X;O  r   