
    i                         d Z ddlZddlmZmZmZ ddedededdfd	Z	 	 ddeee	ef                  de	dedeee	ef                  fdZ
dS )aa  Anthropic prompt caching (system_and_3 strategy).

Reduces input token costs by ~75% on multi-turn conversations by caching
the conversation prefix. Uses 4 cache_control breakpoints (Anthropic max):
  1. System prompt (stable across all turns)
  2-4. Last 3 non-system messages (rolling window)

Pure functions -- no class state, no AIAgent dependency.
    N)AnyDictListFmsgcache_markernative_anthropicreturnc                 X   |                      dd          }|                      d          }|dk    r	|r|| d<   dS ||dk    r|| d<   dS t          |t                    rd||dg| d<   dS t          |t                    r&|r&|d	         }t          |t                    r||d<   dS dS dS dS )
zFAdd cache_control to a single message, handling all format variations.role contenttoolcache_controlNtext)typer   r   )get
isinstancestrlistdict)r   r   r   r   r   lasts         9/home/ubuntu/.hermes/hermes-agent/agent/prompt_caching.py_apply_cache_markerr      s    7762Dggi  Gv~~ 	0#/C 'R--+O'3 W|LL
I 	'4   1W 1r{dD!! 	1$0D!!!1 1 1 1	1 	1    5mapi_messages	cache_ttlc                 x   t          j        |           sS ddi}|dk    rd|d<   d}d                             d          dk    rt          d         ||           |d	z  }d
|z
  }fdt	          t                              D             }|| d         D ]}t          |         ||           S )zApply system_and_3 caching strategy to messages for Anthropic models.

    Places up to 4 cache_control breakpoints: system prompt + last 3 non-system messages.

    Returns:
        Deep copy of messages with cache_control breakpoints injected.
    r   	ephemeral1httlr   r   system)r         c                 R    g | ]#}|                              d           dk    !|$S )r   r#   )r   ).0imessagess     r   
<listcomp>z1apply_anthropic_cache_control.<locals>.<listcomp>D   s3    VVVQ(1+//&2I2IX2U2Uq2U2U2Ur   N)copydeepcopyr   r   rangelen)	r   r   r   markerbreakpoints_used	remainingnon_sysidxr)   s	           @r   apply_anthropic_cache_controlr4   )   s     }\**H k"FDu{v(**HQKBRSSSSA$$IVVVV%H..VVVG	z{{# V VHSM6DTUUUUUOr   )F)r   F)__doc__r+   typingr   r   r   r   boolr   r   r4    r   r   <module>r9      s      " " " " " " " " " "1 1T 1 1 1Z^ 1 1 1 18 " tCH~&  
$sCx.	     r   