
    yj)              
          U d dl Z d dlZd dlmZ d dlmZmZmZmZm	Z	 d dl
Z
d dlmZ d dlmZmZmZmZmZ d dlmZ d dlmZmZmZmZmZ  ej        d          s ed	
            e j        e          Zed         Zed         Z ed         Z! e"dh          Z#e"e$         e%d<   de de$fdZ&dede$de'e$ef         fdZ( e(            Z)ed         Z* G d de          Z+ G d de          Z,dedefdZ-dede.dz  ddfdZ/ G d d e          Z0 G d! d"e          Z1 G d# d$e          Z2 G d% d&e          Z3 G d' d(e          Z4 G d) d*e          Z5d+e$dz  d,e$dz  de$dz  fd-Z6d.e0de2fd/Z7d0e1de3fd1Z8de de$dz  fd2Z9d0e4de5fd3Z: e"dd4h          Z;e"e$         e%d5<   de'e$ef         d6e$d7ede'e$ef         fd8Z< G d9 d:e          Z= G d; d<e          Z> G d= d>e>          Z? G d? d@e>          Z@ G dA dBe>          ZA G dC dDe>          ZB G dE dFe>          ZC G dG dHe>          ZD G dI dJe>          ZEedK         ZFg dKZGeHeF         e%dL<    G dM dNe          ZIde'eFeIf         fdOZJ G dP dQe>          ZK G dR dSe>          ZL G dT dUe>          ZM G dV dWe>          ZN G dX dYe>          ZO G dZ d[e>          ZP G d\ d]e          ZQ G d^ d_e>          ZR G d` dae>          ZS G db dce>          ZT eT            ZUeTe%dd<   dS )f    N)Path)	AnnotatedAnyClassVarLiteralcast)load_dotenv)AliasChoices	BaseModelFieldfield_validatormodel_validator)	FieldInfo)BaseSettingsDotEnvSettingsSourceEnvSettingsSourcePydanticBaseSettingsSourceSettingsConfigDictPYTHON_DOTENV_DISABLEDT)override)	anthropicopenaigemini)r   r   )autoalwaysneverztext-embedding-ada-002!_EMBEDDING_KNOWN_REJECTING_MODELS	transportreturnc                     | dk    rdS dS )Nr   zgemini-embedding-001text-embedding-3-small r   s    2/DATA/AppData/hermes/projects/honcho/src/config.py&_default_embedding_model_for_transportr%   #   s    H%%##    config.tomlconfig_pathc                    | dk    rt          j        d          ri S t          |           }|                                r	 t	          |d          5 }t          j        |          cddd           S # 1 swxY w Y   nA# t
          j        t          f$ r(}t          
                    d| |           i cY d}~S d}~ww xY wi S )z/Load configuration from TOML file if it exists.r'   HONCHO_CONFIG_TOML_DISABLEDrbNzFailed to load %s: %s)osgetenvr   existsopentomllibloadTOMLDecodeErrorOSErrorloggerwarning)r(   config_filefexcs       r$   load_toml_configr9   )   s   m##	2O(P(P#	{##K 	k4(( 'A|A' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ''1 	 	 	NN2KEEEIIIIII	 IsB   A> A2%A> 2A66A> 9A6:A> >B<B71B<7B<)noneminimallowmediumhighxhighmaxc                       e Zd ZU dZdZedz  ed<   dZedz  ed<   dZedz  ed<    e	e
          Ze
eef         ed<   dS )ModelOverrideSettingsz*Advanced module-level transport overrides.Napi_keyapi_key_envbase_urldefault_factoryprovider_params)__name__
__module____qualname____doc__rC   str__annotations__rD   rE   r   dictrH   r   r"   r&   r$   rB   rB   A   sy         44GS4Z"Kt"""HcDj&+eD&A&A&AOT#s(^AAAAAr&   rB   c                   P    e Zd ZU dZdZed         ed<   dZedz  ed<   dZ	e
ed<   dS )	PromptCachePolicyzPer-call prompt-caching configuration.

    Lives in config.py (not src/llm/caching.py) so ModelConfig can reference
    it as a field without a circular import. src/llm/caching.py re-exports
    this class for existing import paths.
    r:   )r:   prefixgemini_cached_contentmodeNttl_secondsv1key_version)rI   rJ   rK   rL   rT   r   rN   rU   intrW   rM   r"   r&   r$   rQ   rQ   K   sZ           @FD';
<EEE"Kt"""Kr&   rQ   datac                    t          | t                    s| S t          t          t          t          f         |           }d |                                D             }|                    d          }|                    d          }t          |t                    r-d|v r)|'|                    dd          \  }}|dv r
||d<   ||d<   |S )zLNormalize 'provider/model' shorthand into separate transport + model fields.c                 4    i | ]\  }}t          |          |S r"   rM   .0keyvalues      r$   
<dictcomp>z._normalize_model_transport.<locals>.<dictcomp>]   s$    QQQ*#uc#hhQQQr&   modelr   /N   >   r   r   r   
isinstancerO   r   r   itemsgetrM   split)rY   raw_dataupdatemodel_valuetransport_valuerR   
bare_models          r$   _normalize_model_transportro   X   s    dD!! DcND))HQQ@P@PQQQF**W%%Kjj--O+s## ){(:(:?V(..sA66
666"(F;(F7OMr&   thinking_budget_tokensc                 ^    | dk    r"|"d|cxk     rdk     rn dS t          d          dS dS dS )zEnforce transport-specific thinking_budget_tokens rules.

    Anthropic requires a minimum of 1024 tokens when thinking is enabled.
    Gemini/OpenAI accept any non-negative value (including 0 to disable).
    r   Nr      z;thinking_budget_tokens must be >= 1024 for Anthropic models)
ValueError)r   rp   s     r$   _validate_thinking_constraintsrt   h   s^     	[  ".&----------VWWW	 	! ..--r&   c                      e Zd ZU dZeed<   eed<   dZedz  ed<   dZ	edz  ed<   dZ
edz  ed<   dZedz  ed<   dZedz  ed	<   dZedz  ed
<    ed edd                    Zedz  ed<   dZedz  ed<   dZedz  ed<   dZee         dz  ed<   dZedz  ed<    ee          Zeed<    ed          ededefd                        Zededz  fd            Z  ed          dd            Z!dS )FallbackModelSettingszFIndependent fallback model configuration. No inheritance from primary.rb   r   Ntemperaturetop_ptop_kfrequency_penaltypresence_penaltyseedthinking_effortreasoning_effortdefaultvalidation_aliasrp   max_output_tokensstop_sequencescache_policyrF   	overridesbeforerT   rY   r   c                      t          |          S Nro   clsrY   s     r$   _normalize_legacy_model_formatz4FallbackModelSettings._normalize_legacy_model_format        *$///r&   c                     | j         S r   r}   selfs    r$   r~   z&FallbackModelSettings.reasoning_effort       ##r&   afterc                 :    t          | j        | j                   | S r   rt   r   rp   r   s    r$   _validate_runtime_shapez-FallbackModelSettings._validate_runtime_shape       &t~t7RSSSr&   )r   rv   )"rI   rJ   rK   rL   rM   rN   ModelTransportrw   floatrx   ry   rX   rz   r{   r|   r   r
   r}   ThinkingEffortLevelrp   r   r   listr   rQ   rB   r   r   classmethodr   r   propertyr~   r   r"   r&   r$   rv   rv   x   s        PPJJJ $K$$$E54<E3:&*ut|***%)edl)))D#*27%%&79KLL3 3 3O(4/    *.C$J---$(sTz((('+NDI$+++-1L#d*111',u=R'S'S'SI$SSS_(###0# 0# 0 0 0 [ $#0 $"5"< $ $ $ X$ _'"""   #"  r&   rv   c                      e Zd ZU dZeed<   eed<   dZedz  ed<   dZ	e
dz  ed<   dZe
dz  ed<   dZedz  ed<   dZe
dz  ed	<   dZe
dz  ed
<   dZedz  ed<    ed edd                    Zedz  ed<   dZedz  ed<   dZedz  ed<   dZee         dz  ed<   dZedz  ed<    ee          Zeed<    ed          ededefd                        Z e!dedz  fd            Z" ed          dd            Z#dS )ConfiguredModelSettingsz/Operator-configurable persisted model settings.rb   r   Nfallbackrw   rx   ry   rz   r{   r|   r}   r~   r   rp   r   r   r   rF   r   r   r   rY   r   c                      t          |          S r   r   r   s     r$   r   z6ConfiguredModelSettings._normalize_legacy_model_format   r   r&   c                     | j         S z@Backward-compatible alias for the generic thinking effort field.r   r   s    r$   r~   z(ConfiguredModelSettings.reasoning_effort        ##r&   r   c                 :    t          | j        | j                   | S r   r   r   s    r$   r   z/ConfiguredModelSettings._validate_runtime_shape   r   r&   )r   r   )$rI   rJ   rK   rL   rM   rN   r   r   rv   rw   r   rx   ry   rX   rz   r{   r|   r   r
   r}   r   rp   r   r   r   r   rQ   rB   r   r   r   r   r   r   r~   r   r"   r&   r$   r   r      s        99JJJ-1H#d*111 $K$$$E54<E3:&*ut|***%)edl)))D#*27%%&79KLL3 3 3O(4/    *.C$J---$(sTz((('+NDI$+++-1L#d*111',u=R'S'S'SI$SSS_(###0# 0# 0 0 0 [ $#0 $"5"< $ $ $ X$ _'"""   #"  r&   r   c                      e Zd ZU dZeed<   eed<   dZedz  ed<   dZedz  ed<   dZ	e
dz  ed<   dZe
dz  ed<   dZedz  ed	<   dZe
dz  ed
<   dZe
dz  ed<   dZedz  ed<    ed edd                    Zedz  ed<   dZedz  ed<    ee          Zeeef         ed<   dZedz  ed<   dZee         dz  ed<   dZedz  ed<   ededz  fd            ZdS )ResolvedFallbackConfigzCRuntime-resolved fallback config with credentials already resolved.rb   r   NrC   rE   rw   rx   ry   rz   r{   r|   r}   r~   r   rp   rF   rH   r   r   r   r   c                     | j         S r   r   r   s    r$   r~   z'ResolvedFallbackConfig.reasoning_effort   r   r&   ) rI   rJ   rK   rL   rM   rN   r   rC   rE   rw   r   rx   ry   rX   rz   r{   r|   r   r
   r}   r   rp   rO   rH   r   r   r   r   r   rQ   r   r~   r"   r&   r$   r   r      s        MMJJJGS4ZHcDj $K$$$E54<E3:&*ut|***%)edl)))D#*27%%&79KLL3 3 3O(4/    *.C$J---&+eD&A&A&AOT#s(^AAA$(sTz((('+NDI$+++-1L#d*111$"5"< $ $ $ X$ $ $r&   r   c                   Z   e Zd ZU dZeed<   eed<   dZedz  ed<   dZ	edz  ed<   dZ
edz  ed<   dZedz  ed<   dZedz  ed	<   dZedz  ed
<   dZedz  ed<   dZedz  ed<   dZedz  ed<    ed edd                    Zedz  ed<   dZedz  ed<    ee          Zeeef         ed<   dZedz  ed<   dZee         dz  ed<   dZedz  ed<    e d          e!dedefd                        Z"e#dedz  fd            Z$ e d          d#d            Z%ddd ed!edz  dd fd"Z&dS )$ModelConfigz>Reusable model configuration for any non-embedding LLM caller.rb   r   Nr   rC   rE   rw   rx   ry   rz   r{   r|   r}   r~   r   rp   rF   rH   r   r   r   r   r   rY   r   c                      t          |          S r   r   r   s     r$   r   z*ModelConfig._normalize_legacy_model_format  r   r&   c                     | j         S r   r   r   s    r$   r~   zModelConfig.reasoning_effort  r   r&   r   c                 :    t          | j        | j                   | S r   r   r   s    r$   &_validate_thinking_constraints_on_selfz2ModelConfig._validate_thinking_constraints_on_self  r   r&   )transport_overridemodel_overrider   c                B    |                      ||p| j        d          S )N)rb   r   )rk   )
model_copyr   )r   r   r   s      r$   	for_modelzModelConfig.for_model  s6     '/A4>   
 
 	
r&   )r   r   )'rI   rJ   rK   rL   rM   rN   r   r   r   rC   rE   rw   r   rx   ry   rX   rz   r{   r|   r   r
   r}   r   rp   rO   rH   r   r   r   r   r   rQ   r   r   r   r   r~   r   r   r"   r&   r$   r   r      s        HHJJJ.2H$t+222GS4ZHcDj $K$$$E54<E3:&*ut|***%)edl)))D#*27%%&79KLL3 3 3O(4/    *.C$J---&+eD&A&A&AOT#s(^AAA$(sTz((('+NDI$+++-1L#d*111_(###0# 0# 0 0 0 [ $#0 $"5"< $ $ $ X$ _'"""   #" 59	
 
 

 +T1	

 

 
 
 
 
 
r&   r   c                       e Zd ZU dZdZeed<   dZeed<    e	e
          Ze
ed<   dZeed	<    ed
          ededefd                        Z ed          dd            ZdS ) ConfiguredEmbeddingModelSettingsz3Operator-configurable persisted embedding settings.r!   rb   r   r   rF   r   r   dimensions_moder   r   rY   r   c                    t          |t                    s|S t          t          t          t          f         |          }d |                                D             }|                    d          }|                    d          }t          |t                    r-d|v r)|'|                    dd          \  }}|dv r
||d<   ||d<   |S )Nc                 4    i | ]\  }}t          |          |S r"   r\   r]   s      r$   ra   zSConfiguredEmbeddingModelSettings._normalize_legacy_model_format.<locals>.<dictcomp>8  $    !U!U!Ujc5#c((E!U!U!Ur&   rb   r   rc   rd      r   r   re   r   rY   rj   rk   rl   rm   rR   rn   s           r$   r   z?ConfiguredEmbeddingModelSettings._normalize_legacy_model_format1       $%% 	KS#X--!U!UHNNDTDT!U!U!Ujj)) **[11{C((	-{""'!,!2!23!:!:FJ---&,{#",wr&   r   c                 J    d| j         vrt          | j                  | _        | S Nrb   model_fields_setr%   r   rb   r   s    r$   _default_model_for_transportz=ConfiguredEmbeddingModelSettings._default_model_for_transportF  &    $///?OODJr&   N)r   r   )rI   rJ   rK   rL   rb   rM   rN   r   EmbeddingTransportr   rB   r   r   EmbeddingDimensionsModer   r   r   r   r   r"   r&   r$   r   r   )  s         ==)E3)))$,I!,,,',u=R'S'S'SI$SSS/5O,555_(#### #    [ $#& _'"""   #"  r&   r   c                       e Zd ZU dZdZeed<   dZeed<   dZ	edz  ed<   dZ
edz  ed<    ed	
          ededefd                        Z ed
          dd            ZdS )EmbeddingModelConfigz:Runtime embedding configuration with resolved credentials.r!   rb   r   r   NrC   rE   r   r   rY   r   c                    t          |t                    s|S t          t          t          t          f         |          }d |                                D             }|                    d          }|                    d          }t          |t                    r-d|v r)|'|                    dd          \  }}|dv r
||d<   ||d<   |S )Nc                 4    i | ]\  }}t          |          |S r"   r\   r]   s      r$   ra   zGEmbeddingModelConfig._normalize_legacy_model_format.<locals>.<dictcomp>\  r   r&   rb   r   rc   rd   r   re   r   s           r$   r   z3EmbeddingModelConfig._normalize_legacy_model_formatU  r   r&   r   c                 J    d| j         vrt          | j                  | _        | S r   r   r   s    r$   r   z1EmbeddingModelConfig._default_model_for_transportj  r   r&   )r   r   )rI   rJ   rK   rL   rb   rM   rN   r   r   rC   rE   r   r   r   r   r   r"   r&   r$   r   r   M  s         DD)E3)))$,I!,,,GS4ZHcDj_(#### #    [ $#& _'"""   #"  r&   r   r`   env_namec                 :    | | S |d S t          j        |          S r   )r,   r-   )r`   r   s     r$   _resolve_secretr   q  s(    t9Xr&   r   c           	      d   t          di d| j        d| j        dt          | j        j        | j        j                  d| j        j        d| j        d| j	        d| j
        d| j        d	| j        d
| j        d| j        d| j        d| j        j        d| j        d| j        d| j        S )zFResolve a FallbackModelSettings into a runtime ResolvedFallbackConfig.rb   r   rC   rE   rw   rx   ry   rz   r{   r|   r}   rp   rH   r   r   r   r"   )r   rb   r   r   r   rC   rD   rE   rw   rx   ry   rz   r{   r|   r}   rp   rH   r   r   r   )r   s    r$   _resolve_fallback_configr   y  s0    "   nn$$  &*
 
 
 #,, (( nn nn #44 "22 ]] !00  (>>  !*::!" #44#$  ..%& **' r&   
configuredc           	         | j         t          | j                   nd}t          di d| j        d| j        d|dt          | j        j        | j        j                  d| j        j	        d| j
        d| j        d	| j        d
| j        d| j        d| j        d| j        d| j        d| j        j        d| j        d| j        d| j        S )z>Resolve persisted model settings into the runtime ModelConfig.Nrb   r   r   rC   rE   rw   rx   ry   rz   r{   r|   r}   rp   rH   r   r   r   r"   )r   r   r   rb   r   r   r   rC   rD   rE   rw   rx   ry   rz   r{   r|   r}   rp   rH   r   r   r   )r   resolved_fallbacks     r$   resolve_model_configr     si   
 * 	!!4555     && #"   ( ,
 
 
	 %.. **   %66 $44 __ #22   *@@!" #,<<#$ %66%& "00'(  ,,) r&   c                 b    | dk    rt           j        j        S | dk    rt           j        j        S dS )z?Fall back to the global LLM API key for the matching transport.r   r   N)settingsLLMOPENAI_API_KEYGEMINI_API_KEYr#   s    r$   _default_embedding_api_keyr     s6    H|**H|** r&   c                     t          | j        j        | j        j                  }|t	          | j                  }t          | j        | j        || j        j                  S )z=Resolve persisted embedding settings into the runtime config.N)rb   r   rC   rE   )	r   r   rC   rD   r   r   r   rb   rE   )r   rC   s     r$   resolve_embedding_model_configr     sk    
 $( G ,Z-ABB&%.	   r&   r}   !_TRANSPORT_SPECIFIC_THINKING_KEYS
field_namerG   c                 .   |                      |          p&|                      |                                          }t          |t                    s| S  |            }t          |t                    r|                    d          }nt          |          }t          t          t          t          f         |          }d |	                                D             }d |	                                D             }|                     d          }	|                     d          }
|	H|	|
k    rBt          |                                          D ] }|                                t          v r||= !i ||}|| v r|n|                                }|| |<   | S )a  Fill missing keys in a partial nested dict from the field's defaults.

    When Pydantic's env_nested_delimiter splits an env var like
    ``DERIVER_MODEL_CONFIG__THINKING_BUDGET_TOKENS=2048`` it produces
    ``{"MODEL_CONFIG": {"THINKING_BUDGET_TOKENS": 2048}}``.  Without merging
    that partial dict would fail validation because required keys like
    ``model`` and ``transport`` are missing.  This helper fills them from
    the field's ``default_factory`` so partial overrides work.

    If the env override switches ``transport`` to a value that differs from
    the default's, transport-specific thinking params
    (``thinking_budget_tokens``, ``thinking_effort``) are dropped from the
    default before merging.  This prevents e.g. a Gemini default's
    ``thinking_budget_tokens=1024`` from leaking into an OpenAI override,
    which would then be rejected by the OpenAI backend (OpenAI uses
    ``reasoning.effort``, not a token budget). Explicit thinking params in
    the env override are preserved.
    Tby_aliasc                 >    i | ]\  }}|                                 |S r"   lowerr^   kvs      r$   ra   z3_fill_defaults_for_nested_field.<locals>.<dictcomp>  s&    ;;;$!QA;;;r&   c                 >    i | ]\  }}|                                 |S r"   r   r   s      r$   ra   z3_fill_defaults_for_nested_field.<locals>.<dictcomp>  s&    CCCdaQWWYYCCCr&   r   )rh   r   rf   rO   r   
model_dumpr   rM   r   rg   r   keysr   )rY   r   rG   rawdefault_objdefault_dictraw_dict	raw_lowerdefault_loweroverride_transportdefault_transportr   mergedr_   s                 r$   _fill_defaults_for_nested_fieldr     s   . xx
##Ctxx
0@0@0B0B'C'CCc4   !/##K+y)) )'2'='=t'='L'LK((DcNC((H;;(..*:*:;;;ICCl.@.@.B.BCCCM"{33%))+66%*<@Q*Q*Ql''))** 	$ 	$Awwyy=== O999F"d****
0@0@0B0BCDIKr&   c            	           e Zd ZU dZdee         ddf fdZi dddd	d
dddddddddddddddddddddd d!d"d#d$d%Zee	e
e
f                  ed&<   d'ed(e
deee
ef         fd)Zde	e
ef         fd*Z xZS )+TomlConfigSettingsSourcez2Custom settings source for loading from TOML file.settings_clsr   Nc                 J    t                                          |           d S r   )super__init__)r   r   	__class__s     r$   r   z!TomlConfigSettingsSource.__init__  s!    &&&&&r&   DBdbAUTHauthSENTRYsentryCACHEcacher   llm	EMBEDDING	embeddingDERIVERderiver	PEER_CARD	peer_card	DIALECTIC	dialecticSUMMARYsummaryWEBHOOKwebhookDREAMdreamVECTOR_STOREvector_storeMETRICSmetrics	TELEMETRY	telemetry appSECTION_MAPfieldr   c                    | j         j                            dd          }|                    d          r
|d d         }| j                            ||                                          }t                              |i           }|                    |                                          }|'|                    |                                          }||                    |          }||dfS )N
env_prefixr  _F)r   model_configrh   endswithr  r   TOML_CONFIGupper)r   r  r   rR   section	toml_datafield_values          r$   get_field_valuez(TomlConfigSettingsSource.get_field_value!  s     "/33L"EE??3 	!CRC[F "&&vv||~~>>OOGR00	  mmJ$4$4$6$677#--
(8(8(:(:;;K#--
33KJ--r&   c                 L   | j         j                            dd          }|                    d          r
|d d         }| j                            ||                                          }t                              |i           }d |                                D             S )Nr  r  r  r  c                 >    i | ]\  }}|                                 |S r"   )r#  r]   s      r$   ra   z5TomlConfigSettingsSource.__call__.<locals>.<dictcomp>@  s&    GGGzsE		UGGGr&   )r   r   rh   r!  r  r   r"  rg   )r   rR   r$  r%  s       r$   __call__z!TomlConfigSettingsSource.__call__6  s    "/33L"EE??3 	!CRC[F"&&vv||~~>>OOGR00	 HGY__5F5FGGGGr&   )rI   rJ   rK   rL   typer   r   r  r   rO   rM   rN   r   tupler   boolr'  r*  __classcell__)r   s   @r$   r   r     s        <<'T,%7 'D ' ' ' ' ' '-d-- 	(- 		-
 	u- 	[- 	9- 	[- 	[- 	9- 	9- 	- 	- 	9- 	[-  	E!-K$sCx.)   &..,/.	sC~	. . . .*
H$sCx. 
H 
H 
H 
H 
H 
H 
H 
Hr&   r   c                   ^    e Zd ZdZedee         dedede	dede
edf         fd	            Zd
S )HonchoSettingszkBase class for all settings models in Honcho.

    Defines the source precedence for loading settings.
    r   init_settingsenv_settingsdotenv_settingsfile_secret_settingsr   .c                 *    |||t          |          |fS r   )r   )r   r   r1  r2  r3  r4  s         r$   settings_customise_sourcesz)HonchoSettings.settings_customise_sourcesI  s%     $\22 
 	
r&   N)rI   rJ   rK   rL   r   r+  r   r   r   r   r,  r6  r"   r&   r$   r0  r0  C  s         
 
<(
 2
 (	

 .
 9
 
)3.	/
 
 
 [
 
 
r&   r0  c                   d   e Zd ZU  edd          ZdZeed<   dZeed<   dZ	eed	<   d
Z
eed<   dZee eddd          f         ed<   dZee eddd          f         ed<   dZee eddd          f         ed<   dZee eddd          f         ed<   d
Zeed<   dZeed<   dZeed<   dS )
DBSettingsDB_ignorer  extraz>postgresql+psycopg://postgres:postgres@localhost:5432/postgresCONNECTION_URIpublicSCHEMAr   
POOL_CLASSTPOOL_PRE_PING
   r     r   gtle	POOL_SIZE   r   gerF  MAX_OVERFLOW   ,  POOL_TIMEOUTi   POOL_RECYCLEPOOL_USE_LIFOF	SQL_DEBUGTRACINGN)rI   rJ   rK   r   r   r=  rM   rN   r?  r@  rA  r-  rG  r   rX   r   rK  rN  rO  rP  rQ  rR  r"   r&   r$   r8  r8  \  sg        %%hGGGL 	I C    FCJM4BDIyeeB1>>>>?DDDEGL)CraD!A!A!AABGGG
 )CraC!@!@!@@A    	 )CsqT!B!B!BBC    M4ItGTr&   r8  c                   x    e Zd ZU  edd          ZdZeed<   dZe	dz  ed<    e
d	          dd            ZdS )AuthSettingsAUTH_r:  r;  FUSE_AUTHN
JWT_SECRETr   r   r   c                 @    | j         r| j        st          d          | S )Nz*JWT_SECRET must be set if USE_AUTH is true)rV  rW  rs   r   s    r$   _require_jwt_secretz AuthSettings._require_jwt_secretx  s+    = 	K 	KIJJJr&   )r   rT  )rI   rJ   rK   r   r   rV  r-  rN   rW  rM   r   rY  r"   r&   r$   rT  rT  r  s{         %%IIILHd!Jd
!!!_'"""   #"  r&   rT  c                       e Zd ZU  edd          ZdZeed<   dZe	dz  ed<   dZ
e	dz  ed<   d	Ze	ed
<   dZee eddd          f         ed<   dZee eddd          f         ed<   dS )SentrySettingsSENTRY_r:  r;  FENABLEDNDSNRELEASEdevelopmentENVIRONMENT皙?              ?rI  TRACES_SAMPLE_RATEPROFILES_SAMPLE_RATE)rI   rJ   rK   r   r   r]  r-  rN   r^  rM   r_  ra  re  r   r   r   rf  r"   r&   r$   r[  r[    s         %%(KKKLGTCtGS4Z$K$$$OR	%sss)K)K)K"KLRRRQT)E55+M+M+M$MNTTTTTr&   r[  c                   D   e Zd ZU  edd          ZdZedz  ed<   dZedz  ed<   dZ	edz  ed<   dZ
edz  ed<   dZedz  ed	<   dZedz  ed
<   dZee eddd          f         ed<   dZee eddd          f         ed<   dZee eddd          f         ed<   dS )LLMSettingsLLM_r:  r;  NANTHROPIC_API_KEYr   r   ANTHROPIC_BASE_URLOPENAI_BASE_URLGEMINI_BASE_URLi	  rC  r   順 rD  DEFAULT_MAX_TOKENS'  MAX_TOOL_OUTPUT_CHARS  MAX_MESSAGE_CONTENT_CHARS)rI   rJ   rK   r   r   rj  rM   rN   r   r   rk  rl  rm  ro  r   rX   r   rq  rs  r"   r&   r$   rh  rh    sE        %%xHHHL %)sTz(((!%NC$J%%%!%NC$J%%% &*d
)))"&OS4Z&&&"&OS4Z&&& QU	#uuTaG'L'L'L"LMTTT 	 9S%%!*P*P*P%PQ    	 yeeDQ6.R.R.R)RS     r&   rh  c                   V   e Zd ZU  eddd          Zedefd            Z ee          Z	ee
d<   d	Zee ed	d
          f         e
d<   dZee edd
          f         e
d<   dZee edd
          f         e
d<    ed          ededefd                        ZdefdZdS )EmbeddingSettings
EMBEDDING___r:  r  env_nested_delimiterr<  r   c                  $    t          dd          S )Nr   r!   r   rb   )r   r"   r&   r$   _MODEL_CONFIG_DEFAULTz'EmbeddingSettings._MODEL_CONFIG_DEFAULT  s    /*
 
 
 	
r&   rF   MODEL_CONFIG   r   r   rE  VECTOR_DIMENSIONS    MAX_INPUT_TOKENSi MAX_TOKENS_PER_REQUESTr   r   rY   c                     t          |t                    r;t          t          t          t          t
          f         |          d| j                   |S Nr}  rf   rO   r   r   rM   r   r|  r   s     r$   _merge_model_config_defaultsz.EmbeddingSettings._merge_model_config_defaults  M     dD!! 	+T#s(^T**)  
 r&   c                 v    | j         j        }|dk    rdS |dk    rdS | j         j        t          v rdS d| j        v S )ue  Decide whether OpenAI embedding calls should forward ``dimensions=``.

        Lives on the settings instance because ``auto`` mode needs access to
        ``self.model_fields_set`` to tell whether the operator explicitly set
        ``VECTOR_DIMENSIONS`` — a standalone resolver over
        ``ConfiguredEmbeddingModelSettings`` cannot see that.
        r   Tr   Fr  )r}  r   rb   r   r   )r   rT   s     r$   resolve_send_dimensionsz)EmbeddingSettings.resolve_send_dimensions  sR      0847??5"&GGG5"d&;;;r&   N)rI   rJ   rK   r   r   staticmethodr   r|  r   r}  rN   r  r   rX   r  r  r   r   r   r  r-  r  r"   r&   r$   ru  ru    sj        %%d(  L 
#C 
 
 
 \
 6;U-6 6 6L2    DHyeeDQ&?&?&?!?@GGGBFiUU4A%>%>%> >?FFFKRIc55Q+G+G+G&GHRRR_(###     [ $#< < < < < < <r&   ru  c                      e Zd ZU  eddd          ZdZeed<   dZe	e
 eddd	
          f         ed<   dZe	e eddd
          f         ed<   dZe	e
 eddd
          f         ed<   dZe	e
 edd          f         ed<   edefd            Z ee          Zeed<   dZeed<   dZeed<   dZe	e
 eddd
          f         ed<   dZe	e
 eddd           f         ed!<   d	Ze	e
 ed	dd"
          f         ed#<   d$Ze	e
 ed$d%d&           f         ed'<   dZeed(<    ed)*          ed+edefd,                        Z ed-*          d.             Zd/S )0DeriverSettingsDERIVER_rw  r:  rx  Tr]  rd   r   d   rD  WORKERSrd  rc        N@POLLING_SLEEP_INTERVAL_SECONDS     STALE_SESSION_TIMEOUT_MINUTESi ' r  QUEUE_ERROR_RETENTION_SECONDSr   c                  $    t          dd          S Nr   zgpt-5.4-minir{  r   r"   r&   r$   r|  z%DeriverSettings._MODEL_CONFIG_DEFAULT  s!    
 ' 
 
 
 	
r&   rF   r}  DEDUPLICATEFLOG_OBSERVATIONSa  r  rr  rI  MAX_CUSTOM_INSTRUCTIONS_TOKENSrC  'WORKING_REPRESENTATION_MAX_OBSERVATIONSrr       @  REPRESENTATION_BATCH_MAX_TOKENSFLUSH_ENABLEDr   r   rY   c                     t          |t                    r;t          t          t          t          t
          f         |          d| j                   |S r  r  r   s     r$   r  z,DeriverSettings._merge_model_config_defaults  r  r&   r   c                 f    | j         | j        k    r t          d| j          d| j         d          | S )Nz!REPRESENTATION_BATCH_MAX_TOKENS (z*) cannot exceed max deriver input tokens ())r  r  rs   r   s    r$   &validate_batch_tokens_vs_context_limitz6DeriverSettings.validate_batch_tokens_vs_context_limit  sc    /$2GGG ]D4X  ]  ]  EI  EZ  ]  ]  ]   r&   N) rI   rJ   rK   r   r   r]  r-  rN   r  r   rX   r   r  r   r  r  r  r   r|  r}  r  r  r  r  r  r  r  r   r   r   r  r  r"   r&   r$   r  r    s        %%D  L GT>?GYsEE!c::::;??? 	 #IuuSST2222%    VW!9S%%aD2Q2Q2Q-Q#RVVV
 	 "9UU>a0000$    
#: 
 
 
 \
 -2EBW,X,X,XL)XXX K"d"""MRiUU5Q5%I%I%I IJRRR 	 #IUU4A$////%    	 ,YUU31.....    	 $Ydsv...	0&     M4_(###     [ $# _'"""  #"  r&   r  c                   8    e Zd ZU  edd          ZdZeed<   dS )PeerCardSettings
PEER_CARD_r:  r;  Tr]  N)rI   rJ   rK   r   r   r]  r-  rN   r"   r&   r$   r  r  #  s7         %%XNNNLGTr&   r  r;   r<   r=   r>   r@   REASONING_LEVELSc                   ,   e Zd ZU dZ ed          Zee ed          f         e	d<   ee
 eddd	
          f         e	d<   dZee
dz   eddd
          f         e	d<   dZeedz   ed          f         e	d<    ed          dd            ZdS )DialecticLevelSettingsz9Settings for a specific reasoning level in the dialectic.T)populate_by_namer   )r   r}  r   2   max_tool_iterations)rJ  rF  r   MAX_TOOL_ITERATIONSNrd   rn  r   MAX_OUTPUT_TOKENStool_choiceTOOL_CHOICEr   r   r   c                     | j         j        dk    rL| j         j        @| j         j        dk    r0| j         j        dk     r t          dd| j         j         dz             | S )z9Ensure Anthropic thinking budget is >= 1024 when enabled.r   Nr   rr   zVMODEL_CONFIG.thinking_budget_tokens must be >= 1024 for Anthropic models when enabled z(got r  )r}  r   rp   rs   r   s    r$   #_validate_anthropic_thinking_budgetz:DialecticLevelSettings._validate_anthropic_thinking_budgetG  s{     ';66!8D!81<<!84??3E$+BEEEF  
 r&   )r   r  )rI   rJ   rK   rL   r   r   r   r   r   rN   rX   r  r  rM   r   r  r"   r&   r$   r  r  4  s3        CC%%t<<<L~...	0    #UUaB1FGGGG   
 	 yd
EEQ7=PQQQQ    	 3:uum'L'L'LLM    _'"""   #"  r&   r  c                     dt           fd} t           |             ddd          t           |             dd          t           |             d	
          t           |             d
          t           |             d
          dS )Nr   c                  $    t          dd          S r  r  r"   r&   r$   _default_model_configz8_default_dialectic_levels.<locals>._default_model_config^  s    & 
 
 
 	
r&   rd      r   )r}  r  r  r  r  )r}  r  r     )r}  r     rB  r  )r   r  )r  s    r$   _default_dialectic_levelsr  X  s    
#: 
 
 
 
 *..00 !!	
 
 
 &..00 !
 
 

 )..00 !
 
 
 '..00 !
 
 
 &..00 "
 
 
)  r&   c                      e Zd ZU  eddd          Z ee          Zee	e
f         ed<   dZee eddd	
          f         ed<   d	Zee ed	dd
          f         ed<   dZee eddd	
          f         ed<   dZee eddd          f         ed<    ed          ededefd                        Z ed          dd            Z ed          dd            ZdS )DialecticSettings
DIALECTIC_rw  r:  rx  rF   LEVELSr  r   rn  rD  r  @ r  HISTORY_TOKEN_LIMITi   r  rI  SESSION_HISTORY_MAX_TOKENSr   r   rY   r   c                 @   t          |t                    s|S t          t          t          t          f         |          }|                    d          p|                    d          }t          |t                    s|S t                      }|                                D ]\  }}t          |          }t          |t                    s+t          t          t          t          f         |          }||v rl||                             d          }	dD ]C}
|
|v r;t          ||
         t                    rt          |	                    d          p|	                    d          pi           }t          t          t          t          f         ||
                   }d |                                D             }d	 |                                D             }|                    d
          }|                    d
          }|H||k    rBt          |
                                          D ] }|                                t          v r||= !i ||||
<   Ei |	|||<   |                                D ]"\  }}||vr|                    d          ||<   #|S )z5Merge partial level overrides with built-in defaults.r  levelsTr   )r}  r   r}  r   c                 >    i | ]\  }}|                                 |S r"   r   r   s      r$   ra   z;DialecticSettings._merge_level_defaults.<locals>.<dictcomp>  s&    )W)W)W41a!''))Q)W)W)Wr&   c                 >    i | ]\  }}|                                 |S r"   r   r   s      r$   ra   z;DialecticSettings._merge_level_defaults.<locals>.<dictcomp>  s&    %O%O%Otq!aggii%O%O%Or&   r   )rf   rO   r   rM   r   rh   r  rg   r   r   r   r   r   )r   rY   
typed_data
levels_rawdefaultslevel_name_keylevel_override_val
level_namelevel_overridebasemc_keybase_mcoverride_mcoverride_lower
base_lowerr   base_transportr   default_level_namedefault_levels                       r$   _merge_level_defaultsz'DialecticSettings._merge_level_defaults  s    $%% 	K$sCx.$//
,6NN8,D,D -

I
 I

 *d++ 	K,..2<2B2B2D2D  	D  	D.N.^,,J0$77 !$sCx.2DEENX%%'/
';'F'FPT'F'U'U ? L LF//J&v.5 5/ 37 HH^44V8P8PVTV3 3 '+4S>>&;Q&R&R)W)W;CTCTCVCV)W)W)W%O%Ow}}%O%O%O
-;-?-?-L-L*)3)D)D.: 2n D D%)',,..%9%9 3 3#$77990Q#Q#Q(/
1KG1K{1Kv.)CD)CN)C
:&191A1A 	Y 	Y-!331>1I1ISW1I1X1X
-.r&   r   c                     | j                                         D ]J\  }}|j        j        pd}|j        |j        n| j        }|dk    r||k    rt          dd| dz             K| S )z;Ensure the output token limit exceeds all thinking budgets.r   Nz4MAX_OUTPUT_TOKENS must be greater than MODEL_CONFIG.z"thinking_budget_tokens for level '')r  rg   r}  rp   r  rs   )r   levellevel_settingsthinking_budgeteffective_maxs        r$   _validate_token_budgetsz)DialecticSettings._validate_token_budgets  s     &*[%6%6%8%8 	 	!E>,9PUTUO "3? 00+ 
 ""-'G'G JC5CCCD   r&   c                     t          t                    t          | j                                                  z
  }|rt	          d|           | S )z+Ensure all reasoning levels are configured.z,Missing configuration for reasoning levels: )setr  r  r   rs   )r   missings     r$   _validate_all_levels_presentz.DialecticSettings._validate_all_levels_present  sR     &''#dk.>.>.@.@*A*AA 	WUGUUVVVr&   N)r   r  )rI   rJ   rK   r   r   r   r  r  rO   ReasoningLevelr  rN   r  r   rX   r  r  r  r   r   r   r  r  r  r"   r&   r$   r  r    s        %%d(  L <A51< < <FD!778    PTyeeDQ7&K&K&K!KLSSSQXiUU7qW%M%M%M MNXXX RV3dqW(M(M(M#MNUUU 	 	UU5Q62222!    _(###0 0 0 0 0 [ $#0d _'"""   #"  _'"""   #"  r&   r  c                      e Zd ZU  eddd          ZdZeed<   dZe	e
 eddd	
          f         ed<   dZe	e
 eddd
          f         ed<   edefd            Z ee          Zeed<    ed          ededefd                        ZdZe	e
 eddd
          f         ed<   dZe	e
 eddd
          f         ed<   dS )SummarySettingsSUMMARY_rw  r:  rx  Tr]  rH  r   r  rD  MESSAGES_PER_SHORT_SUMMARY<   i  MESSAGES_PER_LONG_SUMMARYr   c                  $    t          dd          S r  r  r"   r&   r$   r|  z%SummarySettings._MODEL_CONFIG_DEFAULT  !     ' 
 
 
 	
r&   rF   r}  r   r   rY   c                     t          |t                    r;t          t          t          t          t
          f         |          d| j                   |S r  r  r   s     r$   r  z,SummarySettings._merge_model_config_defaults  r  r&   rC  rp  MAX_TOKENS_SHORTi  i N  MAX_TOKENS_LONGN)rI   rJ   rK   r   r   r]  r-  rN   r  r   rX   r   r  r  r   r|  r}  r   r   r   r  r  r  r"   r&   r$   r  r    s        %%D  L GTRT	#uuRA#/N/N/N*N OTTTQSyeeB1.M.M.M)MNSSS
#: 
 
 
 \
 -2EBW,X,X,XL)XXX_(###     [ $# NRiUU4A&%I%I%I IJQQQLPOYsEE$1$H$H$HHIPPPPPr&   r  c                   L    e Zd ZU  edd          ZdZedz  ed<   dZe	ed<   dS )WebhookSettingsWEBHOOK_r:  r;  NSECRETrB  MAX_WORKSPACE_LIMIT)
rI   rJ   rK   r   r   r  rM   rN   r  rX   r"   r&   r$   r  r    sL         %%8LLLLFC$J!!!!!!r&   r  c                   L    e Zd ZU  edd          ZdZeed<   dZe	dz  ed<   dS )MetricsSettingsMETRICS_r:  r;  Fr]  N	NAMESPACE)
rI   rJ   rK   r   r   r]  r-  rN   r  rM   r"   r&   r$   r  r    sK         %%8LLLLGT IsTz     r&   r  c                      e Zd ZU dZ edd          ZdZeed<   dZ	e
dz  ed<   dZee
e
f         dz  ed	<   d
Zee ed
dd          f         ed<   dZee eddd          f         ed<   dZee eddd          f         ed<   dZee eddd          f         ed<   dZee eddd          f         ed<   dZe
dz  ed<   dZee eddd          f         ed<   dS )TelemetrySettingszCloudEvents telemetry settings for analytics.

    These settings configure the CloudEvents emitter for pushing
    structured events to an analytics backend.
    
TELEMETRY_r:  r;  Fr]  NENDPOINTHEADERSr  r   rC  rD  
BATCH_SIZErd  rc  r  FLUSH_INTERVAL_SECONDSr  FLUSH_THRESHOLD   rB  MAX_RETRIESrp  rn  MAX_BUFFER_SIZEr  rI  HIGH_VOLUME_SAMPLE_RATE)rI   rJ   rK   rL   r   r   r]  r-  rN   r  rM   r  rO   r  r   rX   r   r   r   r  r  r  r  r  r"   r&   r$   r  r    s          &%XNNNL GT  HcDj &*GT#s(^d"))) EHJ	#uuSQ4@@@@AGGGTWIeUU334-P-P-P&PQWWWHJOYsEE"t$D$D$DDEJJJ BCK3aA" = = ==>BBB NSOYsEE%A&$I$I$IIJRRR !IsTz    UXYueeCCC.P.P.P'PQWWWWWr&   r  c                       e Zd ZU  edd          ZdZeed<   dZe	ed<   dZ
e	dz  ed	<   d
Zee ed
dd          f         ed<   dZee eddd          f         ed<   dS )CacheSettingsCACHE_r:  r;  Fr]  z&redis://localhost:6379/0?suppress=trueURLNr  rM  rd   iQ rI  DEFAULT_TTL_SECONDSr  DEFAULT_LOCK_TTL_SECONDS)rI   rJ   rK   r   r   r]  r-  rN   r	  rM   r  r
  r   rX   r   r  r"   r&   r$   r  r  B  s         %%JJJLGT7C777 IsTz    3caF(K(K(K#KL   
 	
 iUU1v-N-N-N(NO     r&   r  c                   J   e Zd ZU dZdZeed<   dZed         ed<   dZ	e
e eddd	
          f         ed<   dZed         ed<   dZe
e eddd
          f         ed<   dZe
e eddd
          f         ed<   dZe
e edd          f         ed<   ddgZee         ed<   dS )SurprisalSettingsz9Settings for tree-based surprisal sampling during dreams.Fr]  kdtree)r  balltreerptree	covertreelshgraph	prototype	TREE_TYPEr  r   rH  rD  TREE_Krecent)r  randomallSAMPLING_STRATEGY   rr  SAMPLE_SIZErb  rc  rd  TOP_PERCENT_SURPRISALrB  r  MIN_HIGH_SURPRISAL_FOR_REPLACEexplicit	deductiveINCLUDE_LEVELSN)rI   rJ   rK   rL   r]  r-  rN   r  r   r  r   rX   r   r  r  r  r   r  r!  r   rM   r"   r&   r$   r  r  Q  s<        CCGT
 	 wP    =>FIc55qR88889=== =Ew89DDDEHK3caD A A AABHHH 	 9UEE$33,O,O,O%OP    OQ"Ic553J3J3J.J$KPPP ",[ 9NDI99999r&   r  c                   r   e Zd ZU  eddd          ZdZeed<   dZe	e
 eddd	
          f         ed<   dZe	e
 eddd
          f         ed<   dZe	e
 eddd
          f         ed<   dgZee         ed<   dZe	e
 eddd
          f         ed<   dZe	e
 eddd
          f         ed<   edefd            Z ee          Zeed<   edefd            Z ee          Zeed<    ee          Zeed<    ed !          ed"edefd#                        Z ed$!          d'd%            Zd&S )(DreamSettingsDREAM_rw  r:  rx  Tr]  r  r   rC  rD  DOCUMENT_THRESHOLDr  r  IDLE_TIMEOUT_MINUTES   H   MIN_HOURS_BETWEEN_DREAMSomniENABLED_TYPESrH  r  r  r  r  r   c                  $    t          dd          S r  r  r"   r&   r$   _DEDUCTION_MODEL_CONFIG_DEFAULTz-DreamSettings._DEDUCTION_MODEL_CONFIG_DEFAULT~  r  r&   rF   DEDUCTION_MODEL_CONFIGc                  $    t          dd          S r  r  r"   r&   r$   _INDUCTION_MODEL_CONFIG_DEFAULTz-DreamSettings._INDUCTION_MODEL_CONFIG_DEFAULT  r  r&   INDUCTION_MODEL_CONFIG	SURPRISALr   r   rY   c                     t          |t                    rSt          t          t          t          f         |          }t          |d| j                   t          |d| j                   |S )Nr.  r1  )rf   rO   r   rM   r   r   r-  r0  )r   rY   r  s      r$   r  z*DreamSettings._merge_model_config_defaults  sr     dD!! 	d38nd33J+(3  
 ,(3  
 r&   r   c                     d| j         fd| j        ffD ]=\  }}|j        1|j        *|j        |j        k    rt	          d| dd| dz             >| S )zFEnsure thinking_budget_tokens < max_output_tokens for each specialist.r.  r1  Nzdream.z(.max_output_tokens must be greater than z.thinking_budget_tokens)r.  r1  r   rp   rs   )r   namecfgs      r$   "_validate_specialist_token_budgetsz0DreamSettings._validate_specialist_token_budgets  s     &t'BC%t'BC
 	 	ID#
 %1.:)S-GGG KTKKK<t<<<=   r&   N)r   r#  ) rI   rJ   rK   r   r   r]  r-  rN   r%  r   rX   r   r&  r)  r+  r   rM   r  r  r  r   r-  r.  r0  r1  r  r2  r   r   r   r  r7  r"   r&   r$   r#  r#  k  s        %%$h  L GTKM	#uuRA$'G'G'G"GHMMMMO)CraD)I)I)I$IJOOONOiUU1r-J-J-J(JKOOO &xM49''' KM3bQ2(F(F(F#FGLLL 	 3fw(O(O(O#OP    
-D 
 
 
 \
 7<e77 7 73    
-D 
 
 
 \
 7<e77 7 73   
 $)59J#K#K#KI KKK_(###     [ $# _'"""   #"  r&   r#  c                   .   e Zd ZU dZ edd          ZdZed         ed<   dZ	e
ed	<   d
Zeed<   dZee edd          f         ed<   dZedz  ed<   dZedz  ed<   dZeed<   dZee edd          f         ed<    ed          dd            ZdS )VectorStoreSettingsz>Settings for vector store (pgvector, Turbopuffer, or LanceDB).VECTOR_STORE_r:  r;  pgvector)r;  turbopufferlancedbTYPEFMIGRATEDhonchor  r~  r   r  
DIMENSIONSNTURBOPUFFER_API_KEYTURBOPUFFER_REGIONz./lancedb_dataLANCEDB_PATHrM  RECONCILIATION_INTERVAL_SECONDSr   r   r   c                 H    | j         dk    r| j        st          d          | S )Nr<  zGVECTOR_STORE_TURBOPUFFER_API_KEY must be set when TYPE is 'turbopuffer')r>  rB  rs   r   s    r$    _require_api_key_for_turbopufferz4VectorStoreSettings._require_api_key_for_turbopuffer  s3    9%%d.F%Y   r&   )r   r9  )rI   rJ   rK   rL   r   r   r>  r   rN   r?  r-  r  rM   rA  r   rX   r   rB  rC  rD  rE  r   rG  r"   r&   r$   r9  r9    sN        HH%%QQQL ;ED'6
7DDDHd Is 	 		
 	
 	
	    '+t***%)d
))) )L#((( 	 $YsEE#!4L4L4L/L%M    _'"""   #"  r&   r9  c                      e Zd ZU  eddd          ZdZeed<   dZe	e
 edd	          f         ed
<   dZe	e
 edd	          f         ed<   dZe	e
 eddd          f         ed<   dZe	e
 edd	          f         ed<   dZeed<   dZedz  ed<   dZedz  ed<   dZeed<   dZeed<   dZedz  ed<   dZeed<    ee          Zeed <    ee          Zeed!<    ee          Zeed"<    ee          Zeed#<    ee          Z eed$<    ee!          Z"e!ed%<    ee#          Z$e#ed&<    ee%          Z&e%ed'<    ee'          Z(e'ed(<    ee)          Z*e)ed)<    ee+          Z,e+ed*<    ee-          Z.e-ed+<    ee/          Z0e/ed,<    ee1          Z2e1ed-<    ee3          Z4e3ed.<    e5d          d/ed0efd1            Z6 e7d23          d5d4            Z8dS )6AppSettingsr  rw  r:  rx  INFO	LOG_LEVELrB  r   r  SESSION_OBSERVERS_LIMITi  P MAX_FILE_SIZErn  i rD  GET_CONTEXT_MAX_TOKENSr  MAX_MESSAGE_SIZETEMBED_MESSAGESNLANGFUSE_HOSTLANGFUSE_PUBLIC_KEYFCOLLECT_METRICS_LOCALzmetrics.jsonlLOCAL_METRICS_FILEREASONING_TRACES_FILEr@  r  rF   r   r   r   r   r  r  r
  r  r  r  r  r  r  r  r  r   r   c                 Z    |                                 }|dvrt          d|           |S )N)DEBUGrJ  WARNINGERRORCRITICALzInvalid log level: )r#  rs   )r   r   	log_levels      r$   validate_log_levelzAppSettings.validate_log_level  s8    GGII	MMM6166777r&   r   r   c                    d| j         j        vr| j        | j         _        d| j        j        vr| j        | j        _        d| j        j        v r=ddl}d}t
                              |           |                    |t          d           | j	        j
        | j        _        d| j        j        vr| j        | j        _        d| j        j        vr| j        | j        _        | S )zGPropagate top-level NAMESPACE to nested settings if not explicitly set.r  rA  r   NzVECTOR_STORE_DIMENSIONS is deprecated; EMBEDDING_VECTOR_DIMENSIONS is authoritative. Drop VECTOR_STORE_DIMENSIONS from your .env.r  )
stacklevel)r  r   r  r  warningsr4   r5   warnDeprecationWarningr  r  rA  r  r  )r   r_  messages      r$   propagate_namespacezAppSettings.propagate_namespace  s     dj999#'>DJ d/@@@*..D'4,=== OOO? 
 NN7###MM'#5!MDDD'+~'G$dn==='+~DN$dl;;;%)^DL"r&   )r   rI  )9rI   rJ   rK   r   r   rK  rM   rN   rL  r   rX   r   rM  rN  rO  rP  r-  rQ  rR  rS  rT  rU  r  r8  r   rT  r   r[  r   rh  r   ru  r  r  r  r  r
  r  r  r  r  r  r  r  r  r  r  r  r  r#  r  r9  r  r   r\  r   rc  r"   r&   r$   rI  rI    s        %%D  L
 IsGIYsEE",C,C,C'CDIIIDMM9S%%	a"@"@"@@AMMM Ic55Q7+S+S+S&ST    EKiUU6a%@%@%@ @AJJJND $M3:$$$&*t***"'4'''----(,3:,,,Is U:666B
666|<<<D,<<<"U>BBBFNBBBu[999C999#(59J#K#K#KI KKK$u_EEEG_EEE#(59J#K#K#KI KKK"'%8H"I"I"IIIII$u_EEEG_EEE$u_EEEG_EEE$u_EEEG_EEE#(59J#K#K#KI KKK 5???E=??? 5???E=???(->Q(R(R(RL%RRR_[!!3 3    "! _'"""   #"  r&   rI  r   )r'   )Vloggingr,   pathlibr   typingr   r   r   r   r   r0   dotenvr	   pydanticr
   r   r   r   r   pydantic.fieldsr   pydantic_settingsr   r   r   r   r   r-   	getLoggerrI   r4   r   r   r   	frozensetr   rM   rN   r%   rO   r9   r"  r   rB   rQ   ro   rX   rt   rv   r   r   r   r   r   r   r   r   r   r   r   r   r   r0  r8  rT  r[  rh  ru  r  r  r  r  r   r  r  r  r  r  r  r  r  r  r#  r9  rI  r   r"   r&   r$   <module>rm     s    				       : : : : : : : : : : : : : :        U U U U U U U U U U U U U U % % % % % %              ry)** K		8	$	$89/0 !";<  5>I5 5 !9S>   
$6H $S $ $ $ $ # $sCx.         > 
B B B B BI B B B
 
 
 
 
	 
 
 
S S     XX7:TzX	X X X X & & & & &I & & &R) ) ) ) )i ) ) )X$ $ $ $ $Y $ $ $B8
 8
 8
 8
 8
) 8
 8
 8
v! ! ! ! !y ! ! !H! ! ! ! !9 ! ! !H3: t d
    #   6%<     B+*< +t + + + +0   ( 5>I015 5 !9S>   
/
sCx.// / 
#s(^	/ / / /d8H 8H 8H 8H 8H9 8H 8H 8Hv
 
 
 
 
\ 
 
 
2       ,
 
 
 
 
> 
 
 
U U U U U^ U U U    .   >-< -< -< -< -< -< -< -<`G G G G Gn G G GT    ~    BC* * * $~&   ! ! ! ! !Y ! ! !H$48N(N#O $ $ $ $N` ` ` ` ` ` ` `F Q  Q  Q  Q  Qn  Q  Q  QF" " " " "n " " "! ! ! ! !n ! ! !-X -X -X -X -X -X -X -X`    N   : : : : :	 : : :4O O O O ON O O Od* * * * *. * * *ZM M M M M. M M Mb $+ % % % % %r&   