
    jT3                     x   d dl Z d dlZd dlZd dlZd dlmZ ddlmZ ddlmZ	 ddl
mZ  ej                  e      Z e       Z ej"                  dd	      Z G d
 dej&                        Ze j*                   G d d             Zdedej.                  dej0                  eej.                  f   fdZ G d d      Zy)    N)AgentConfigNotFound   )type_helpers)cache)get_active_config_maskTAgentConfig)boundc                   Z    e Zd ZU eed<   ej                  ed<   ej                  e   ed<   y)ConfigFieldprefixed_keypy_typedescriptionN)__name__
__module____qualname__str__annotations__typingAnyOptional     {/Users/manta/Documents/Projects/TheRoad-I1/backend/.venv/lib/python3.12/site-packages/opik/api_objects/agent_config/base.pyr   r      s!    ZZ%%r   r   c                   V   e Zd ZU dZej
                  e   ed<   dZej
                  e   ed<   dZ	ej
                  e   ed<   dZ
ej                  ed<   dZej
                  e   ed<   dZej
                  e   ed<   dZej
                  ej                  e      ed<   d	Zeed
<   dZeed<   y)
_OpikStateNprojectenvmask_idmanagerblueprint_idblueprint_versionenvsTis_fallbackFmask_mismatch_warned)r   r   r   r   r   r   r   r   r   r   r    r   r!   r"   r#   Listr$   boolr%   r   r   r   r   r      s    $(GV__S!( $C	$$(GV__S!(GVZZ)-L&//#&-.2vs+2.2D&//&++c*
+2K!&$&r   r   config_fieldvaluereturnc                     t        j                  || j                        t        j                  | j                        d}| j                  | j                  |d<   |S )N)r)   typer   )r   python_value_to_metadata_valuer   python_type_to_backend_typer   )r(   r)   infos      r   _build_field_infor0   %   s]     <<<''
 889M9MN	*D +*66]Kr   c                       e Zd ZU dZej
                  ej                  eef      e	d<   e
e	d<   dej                  ddf fdZd$dZede
fd	       Zedej                   ej"                  e      fd
       Zedefd       Zdedej                  fdZdedej                  fdZdej                  eef   fdZedej                  eej                  f   fd       Zdej                  dej                  eef   defdZdej                  dej                   e   defdZdeddfdZedddej<                  e   dedej                  dedej                   e   dedej                   e   dej                   e    defd        Z!e"fded!ej                  ddfd"Z#ded!ej                  dej                  eej                  f   fd#Z$ xZ%S )%r	   a  Base class for user-defined agent configurations.

    Subclass this and declare typed fields::

        class MyConfig(opik.AgentConfig):
            temperature: Annotated[float, "Sampling temperature"]
            model: str

    Publish a version via :meth:`opik.Opik.create_agent_config_version`::

        cfg = MyConfig(temperature=0.7, model="gpt-4")
        client.create_agent_config_version(cfg, project_name="my-project")

    Retrieve it via :meth:`opik.Opik.get_agent_config`::

        result = client.get_agent_config(
            fallback=MyConfig(temperature=0.0, model="fallback"),
            project_name="my-project",
            latest=True,
        )
    __field_metadata___opik_statekwargsr*   Nc                    t        |   di | t        j                  |       st        j                  |        t        j
                  |       D ]`  }|j                  t        j                  us|j                  t        j                  us<t        d|j                   d| j                   d       | j                  }i }t        j                  |       D ]  \  }}}t        | d| ||      ||<    || _        y )NzQOpik AgentConfig does not support default values. Remove the default from field 'z' in .)r   r   r   r   )super__init_subclass__dataclassesis_dataclass	dataclassfieldsdefaultMISSINGdefault_factory	TypeErrornamer   r   extract_dataclass_fieldsr   r2   )	clsr4   fclass_prefixr<   f_namef_typedesc	__class__s	           r   r8   zAgentConfig.__init_subclass__N   s    !+F+'',!!#&##C(A		!4!44$$K,?,??667ffXU3<<.PQS  ) ||02$0$I$I#$N FFD( ,~Qvh7 F6N %O "(r   c                 B    t         j                  | dt                      y Nr3   )object__setattr__r   selfs    r   __post_init__zAgentConfig.__post_init__h   s    4
=r   c                 .    t         j                  | d      S rK   )rL   __getattribute__rN   s    r   _statezAgentConfig._statek   s    &&t];;r   c                 .    | j                   j                  S )z8Environment tags associated with the resolved blueprint.)rS   r#   rN   s    r   r#   zAgentConfig.envso   s     {{r   c                 .    | j                   j                  S )zaTrue if local fallback values are used because there was an issue communicating with the backend.)rS   r$   rN   s    r   r$   zAgentConfig.is_fallbackt   s     {{&&&r   attrc                     |t        |       j                  vrt        j                  | |      S | j                  j
                  t        j                  | |      S | j                  |      S N)r,   r2   rL   rR   rS   r   _resolve_field)rO   rV   s     r   rR   zAgentConfig.__getattribute__y   s[    tDz444**466;;&**466""4((r   c                    | j                   }t        j                  t        |j                        }t               }|O|j                  |k7  r@|j                  s4d|_        t        j                  t        |       j                   dd       t        j                  ||j                  |j                        }|j                  |_        |j                   |_        |j                  d u |_        t        |       j$                  |   j&                  }|j(                  j+                  |t,              }| j/                  ||       |t,        ur|S t0        j3                  | |      S )NTz was instantiated outside of an agent entrypoint and will not receive config overrides. Ensure get_agent_config() is called inside a function decorated with @opik.track(entrypoint=True) to enable agent optimization.   )
stacklevel)r)   )rS   r   castr   r   r   r   r%   warningswarnr,   r   	cache_modget_cached_configr   r!   r"   r$   r2   r   valuesget_MISSING_inject_trace_metadatarL   rR   )rO   rV   stater   active_maskinstance_cacher   r)   s           r   rY   zAgentConfig._resolve_field   s)   ++c5==1,.#,..)-E&MM:&&' (M N  #44WeiiW+88"0"B"B*774?Dz44T:GG%%)),A##D#6X-uV63J3J4QU3VVr   c                     i }t        |       j                  j                         D ]A  \  }}t        j	                  | |      }|j
                  ||j                  f||j                  <   C |S rX   )r,   r2   itemsrL   rR   r   r   r   )rO   resultrF   cfr)   s        r   _extract_fields_with_valuesz'AgentConfig._extract_fields_with_values   s_    *,t*77==?JFB++D&9E')zz5"..&IF2??# @ r   c                     | j                   j                         D ci c]  }|j                  |j                   c}S c c}w rX   )r2   rb   r   r   )rC   rl   s     r   _prefixed_field_typesz!AgentConfig._prefixed_field_types   s8    696L6L6S6S6UV6U+6UVVVs   >	blueprintfields_with_valuesc                    t        |       j                  dz   }|j                         D ch c]  }|j                  |      s| }}t	        |j                               }||z
  }|ry|j                         D ]M  \  }\  }	}
}|j                  |      }t        j                  |
|	      }t        j                  ||	      }||k7  sM y yc c}w )Nr6   FT)	r,   r   keys
startswithsetrj   rc   r   python_value_to_backend_value)rO   rp   rq   rE   kbp_keys
local_keysmissing_locallykeyr   r)   _descbp_value	local_serbp_sers                  r   _matches_blueprintzAgentConfig._matches_blueprint   s     Dz**S0'nn.M.!,,|2L1.M+0023
 %w.,>,D,D,F(C('5% }}S)H$BB5'RI!??'RFF" -G  Ns   C
C
r    r   c                    | j                         }| j                         }|j                  |      }|d u }|| j                  ||      r|}n3|j	                  |||      }|r|j                  d|j                         || j                  _        |j                  | j                  _	        |j                  | j                  _        |j                  | j                  _        d| j                  _        |j                  xs dS )N)field_types)rq   r   r   prodr   r!   F )rm   ro   get_blueprintr   create_blueprinttag_blueprint_with_envidrS   r    r!   rA   r"   r#   r$   )rO   r    r   rq   r   latestis_first_blueprintbps           r   _create_versionzAgentConfig._create_version   s    
 "==?002&&;&?#t^$"9"9&BT"UB))#5'' * B
 "..6.N%#%55 (*%77"'ww}"r   r   c                     | j                   }|j                  |j                  t        d      |j                  j	                  ||j                         y)zTag the current version with an environment name.

        Can be called after ``create_agent_config_version`` or
        ``get_agent_config``.

        Args:
            env: Environment name (e.g. ``"prod"``).
        NzYdeploy_to() requires a prior call to create_agent_config_version() or get_agent_config().r   )rS   r    r!   RuntimeErrorr   )rO   r   rf   s      r   	deploy_tozAgentConfig.deploy_to   sT     == E$6$6$>G  	,,5CUCU,Vr   )timeout_in_secondsrC   fallbackproject_namer   versionr   c          	         | j                         }t               }	|s|d n|}
	 |)|j                  ||	||      }|et        d|d|d      |r%|j                  |	||      }|;t        d|d      |j                  ||	||      }|t        d	|d|d
|d      i }| j                  j                         D ]M  \  }}|j                  |j                         v r||j                     ||<   5t        j                  ||      ||<   O  | di |}|j                  }||_        |
|_        |	|_        ||_        |j(                  |_        |j,                  |_        |j0                  |_        d|_        t        j                  ||
|	|||       |S # t        $ r  t        $ r5 t
        j                  dd       t        j                  ||
|	||       |cY S w xY w)N)rA   r   r   r   z,No agent config blueprint found for version=z in project r6   )r   r   r   z+No agent config blueprint found in project z3. Use create_agent_config_version() to publish one.)r   r   r   r   z(No agent config blueprint found for env=z2. Use create_agent_config_version() and deploy_to(z) to publish one.z9Failed to fetch agent config from backend, using fallbackTexc_infoF)rp   r   )ro   r   r   r   	Exceptionloggerdebugr`   init_cache_entryr2   rj   r   rs   rL   rR   rS   r   r   r   r    r   r!   rA   r"   r#   r$   )rC   r   r    r   r   r   r   r   r   r   resolved_envr   r4   rF   rl   instancerf   s                    r   _resolve_from_backendz!AgentConfig._resolve_from_backend   sY    //1(* &'*=tC-	"** # +'9	 +  :-FwkQ]^j]mmno  **# +'9 + 
 :-ElEU VL M 
 **# +'9	 +  :-B3'VbUe fKKN'Qbd   0200668JFB"'')+!#BOO!4v!'!8!86!Jv	 9 ==$ 	UU"$''WW
!"",gQS	
 G # 	 	LLK   &&lG[' O	s   A>F AGGr)   c                     ddl m}m} 	 | j                  ||      }d|i}|j	                  |       |j                  |       y # |j                  $ r Y y t        $ r t        j                  dd       Y y w xY w)Nr   )
exceptionsopik_contextagent_configuration)metadataz+Failed to inject config metadata into traceTr   )
opikr   r   _build_trace_metadataupdate_current_traceupdate_current_spanOpikExceptionr   r   r   )rO   rV   r)   r   r   r   payloads          r   re   z"AgentConfig._inject_trace_metadataC  s}    1	W11$>H,h7G--w-?,,g,>'' 	 	WLLFQULV	Ws   :A A8A87A8c                    | j                   }t        |       j                  |   }|t        ur|j                  t        ||      ini }|j                  |j                  d}|j                  |j                  |d<   ||d<   |S )N)_blueprint_idr"   _mask_idrb   )	rS   r,   r2   rd   r   r0   r!   r"   r   )rO   rV   r)   rf   r(   rb   rk   s          r   r   z!AgentConfig._build_trace_metadataP  s    
 Dz44T: H$ &&(9,(NO 	 #//!&!8!80
 ==$!&F:!xr   )r*   N)&r   r   r   __doc__r   ClassVarDictr   r   r   r   r   r8   rP   propertyrS   r   r&   r#   r'   r$   rR   rY   tuplerm   classmethodro   r   r   r   Typer   intr   rd   re   r   __classcell__)rI   s   @r   r	   r	   3   s   , C4D(EFF( ( (4> <
 < <  foofkk#&67     'T ' ')S )VZZ )W3 W6:: W4V[[e-D  Wfkk#vzz/&B W W:: #KKU
3 
	0 __S) 
	:WS WT W"  48U[[^UU U 	U __S!U U %U #OOC0U 
U Un EM W3 Wvzz WQU W zz 
S&**_	%	r   )r9   loggingr   r^   opik.exceptionsr   r   r   r   r`   contextr   	getLoggerr   r   rL   rd   TypeVarr   
NamedTupler   r;   r   r   r   r   r0   r	   r   r   r   <module>r      s        /    +			8	$8FNN3m,&&## & 	' 	' 	'&,jj[[fjj!p pr   