
    #jۗ                    8   U d Z ddlZddlZddlZddlZddlmZmZmZ ddl	m	Z	m
Z
 ddlmZmZ ddlmZmZ ddlmZ dd	lmZ  e ed
          d
            ej        e          Z G d de          Z G d d          Zd Zd ZdedefdZdeeef         deeef         fdZ dZ!dZ"dZ#dZ$dZ%dZ&dZ'dZ(d Z)d!Z*d"Z+d#Z,d$Z-d%Z.d&Z/d'Z0d(Z1d)Z2d*Z3d+Z4d,Z5d-Z6dZ7dZ8dZ9d.Z:d/Z;d0Z<d1Z=d2Z>d3Z?d4Z@d5ZAd6ZBd7ZCd8ZDd9ZEd:ZFd;ZGd<ZHd=ZId>ZJd?ZKd@ZLdAZMdBZNdCZOdDZPdEZQdFZRdGZSdHZTdIZUdJZVdKZWdLZXdMZYdNZZdOZ[dPZ\dQZ]dRZ^dSZ_dTZ`dUZadVZbdWZcdXZddYZedZZfd[Zgd\Zhd]Zid^Zjd_Zkd`ZldaZmdbZndcZoddZpdeZqdfZrdgZsdhZtdiZudjZvdkZwdlZxdmZydnZzdoZ{dpZ|dqZ}drZ~dsZdtZduZdvZdwZdxZdyZdzZd{Zd|Zd}Zd~ZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZdZ dZdZdddddZeeeeef         f         ed<   dZdZdZ	d Z
dZdZdZdZdZdZdZdZd	Zd
ZdZdZdZdZdZdZdZdZdZdZdZdZ dZ!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/d0d1d2d3d4d4d5dd6d7d8d9d:Z#dZ$d;Z%d<Z&dZ'd=Z(dZ)d>Z*d?Z+d@Z,dAZ-dBZ.dZ/dCZ0dZ1dZ2dDZ3dEZ4d=Z5d=Z6dFZ7dGZ8dHZ9dIZ:d=Z;dJZ<dDZ=dKZ>d=Z?dLZ@d=ZAd=ZBd=ZCd>ZDdMZEdNZFdOZGdPZHdQZIdZJd=ZKdRZLdSZMdTZNdUZOdVZPdWZQdXZRdYZSdZZTd[ZUd\ZVdFZWd]ZXdZYedz  ed^<   d_ZZd`Z[d]Z\daZ]dbZ^dcZ_ddZ`deZadZbd
ZcdZdeee         dz  edf<   d=Zfd
ZgdZhedz  edg<   dhZid>ZjdLZkdiZldNZmdjZndkZodlZpdmZqd
ZrdnZsdoZtdZudZvdZwdZxedz  edp<   dGZydqZzdrZ{d=Z|dsZ}d[Z~dtZdZdGZduZd
Zd
Zd
Zd
Zd
Zd?ZdvZdGZdNZdwZdxZdyZdzZdZd;Zd
Zd{ZdGZdsZd|Zd}Zd
ZdZdiZd?Zd~ZduZdLZduZdZdPZd;Zd
ZdZdZdZdZdGZdPZdZdZdZdZdZdZdZdZdZd=ZdZdZd=Zd=ZdcZd;ZdZdZe<ZdZdZdZd|Z G d dej                  Zdedeee         fdZÐdededz  dedefdZĐdedefdZŐdedefdZƐdedefdZǐdededz  fdZȐdedz  dedz  fdZe G d d                      Zdaːedz  ed<   defdZdefdZ͐ddZdS (  zn
Centralized configuration for Hindsight API.

All environment variables and their defaults are defined here.
    N)	dataclassfieldfields)datetimetimezone)AnyLiteral)find_dotenvload_dotenv   )validate_extension)mask_network_locationT)usecwd)overridec                       e Zd ZdZdS )ConfigFieldAccessErrorzJRaised when trying to access a bank-configurable field from global config.N)__name__
__module____qualname____doc__     \/home/rurouni/.hermes/hermes-agent/venv/lib/python3.11/site-packages/hindsight_api/config.pyr   r      s        TTDr   r   c                   2    e Zd ZdZd	dZdefdZdefdZdS )
StaticConfigProxya&  
    Proxy that wraps HindsightConfig and only allows access to static (non-configurable) fields.

    Raises ConfigFieldAccessError when trying to access configurable fields that vary per-bank.
    Forces developers to use get_resolved_config(bank_id, context) for bank-specific settings.
    configHindsightConfigc                     t                               | d|           t                               | dt                                                     d S )N_config_configurable_fields)object__setattr__r   get_configurable_fields)selfr   s     r   __init__zStaticConfigProxy.__init__(   sE    4F3334!79`9`9b9bcccccr   namec                    |                     d          rt                              | |          S t                              | d          }||v rt          d| d          t                              | d          }t	          ||          S )N_r    zField 'z' is bank-configurable and cannot be accessed from global config. Use ConfigResolver.resolve_full_config(bank_id, context) to get bank-specific config. This prevents accidentally using global defaults when bank-specific overrides exist.r   )
startswithr!   __getattribute__r   getattr)r$   r&   configurable_fieldsr   s       r   r*   z"StaticConfigProxy.__getattribute__,   s    ??3 	7**4666$55d<RSS&&&(h$ h h h   ((y99vt$$$r   c                      t          d          )NzBConfig is read-only. Modifications must go through ConfigResolver.)AttributeError)r$   r&   values      r   r"   zStaticConfigProxy.__setattr__;   s    abbbr   N)r   r   )r   r   r   r   r%   strr*   r"   r   r   r   r   r       ss         d d d d%S % % % %c c c c c c cr   r   c                 (    t          | ddi          S )z
    Mark a config field as hierarchical (can be overridden per-tenant/bank).

    Hierarchical fields can be customized at the tenant or bank level via database
    configuration. Examples: LLM settings, retention parameters, retrieval settings.
    hierarchicalTdefaultmetadatar   default_values    r   r2   r2   @   s     .$1GHHHHr   c                 (    t          | ddi          S )a   
    Mark a config field as static (server-level only, cannot be overridden).

    Static fields are infrastructure-level settings that affect the entire server
    and cannot vary per tenant or bank. Examples: database URL, API port, worker settings.
    r2   Fr3   r6   r7   s    r   staticr:   J   s     .%1HIIIIr   keyreturnc                     |                      d          r| t          d          d         } |                                 S )ap  
    Convert environment variable format to Python field name format.

    Examples:
        HINDSIGHT_API_LLM_PROVIDER -> llm_provider
        LLM_MODEL -> llm_model
        llm_model -> llm_model (already normalized)

    Args:
        key: Environment variable name or Python field name

    Returns:
        Normalized Python field name (lowercase snake_case)
    HINDSIGHT_API_N)r)   lenlower)r;   s    r   normalize_config_keyrA   U   s@     ~~&'' +#&''))*99;;r   r   c                 >    d |                                  D             S )a  
    Normalize all keys in a config dict to Python field names.

    Allows users to provide config overrides in either format:
    - Python field format: {"llm_provider": "openai"}
    - Env var format: {"HINDSIGHT_API_LLM_PROVIDER": "openai"}

    Args:
        config: Dict with env var or Python field names as keys

    Returns:
        Dict with all keys normalized to Python field names
    c                 4    i | ]\  }}t          |          |S r   )rA   .0kvs      r   
<dictcomp>z)normalize_config_dict.<locals>.<dictcomp>w   s'    BBB41a ##QBBBr   )items)r   s    r   normalize_config_dictrJ   i   s!     CB6<<>>BBBBr   HINDSIGHT_API_DATABASE_BACKENDHINDSIGHT_API_DATABASE_URLHINDSIGHT_API_READ_DATABASE_URL#HINDSIGHT_API_READ_DB_POOL_MIN_SIZE#HINDSIGHT_API_READ_DB_POOL_MAX_SIZE$HINDSIGHT_API_MIGRATION_DATABASE_URLHINDSIGHT_API_DATABASE_SCHEMAHINDSIGHT_API_LLM_PROVIDERHINDSIGHT_API_LLM_API_KEYHINDSIGHT_API_LLM_MODELHINDSIGHT_API_LLM_BASE_URL HINDSIGHT_API_LLM_MAX_CONCURRENTHINDSIGHT_API_LLM_MAX_RETRIES!HINDSIGHT_API_LLM_INITIAL_BACKOFFHINDSIGHT_API_LLM_MAX_BACKOFFHINDSIGHT_API_LLM_TIMEOUT#HINDSIGHT_API_LLM_GROQ_SERVICE_TIER%HINDSIGHT_API_LLM_OPENAI_SERVICE_TIERHINDSIGHT_API_LLM_EXTRA_BODY!HINDSIGHT_API_LLM_DEFAULT_HEADERS&HINDSIGHT_API_LLM_LITELLMROUTER_CONFIGauto!HINDSIGHT_API_RETAIN_LLM_PROVIDER HINDSIGHT_API_RETAIN_LLM_API_KEYHINDSIGHT_API_RETAIN_LLM_MODEL!HINDSIGHT_API_RETAIN_LLM_BASE_URL'HINDSIGHT_API_RETAIN_LLM_MAX_CONCURRENT$HINDSIGHT_API_RETAIN_LLM_MAX_RETRIES(HINDSIGHT_API_RETAIN_LLM_INITIAL_BACKOFF$HINDSIGHT_API_RETAIN_LLM_MAX_BACKOFF HINDSIGHT_API_RETAIN_LLM_TIMEOUT-HINDSIGHT_API_RETAIN_LLM_LITELLMROUTER_CONFIG"HINDSIGHT_API_REFLECT_LLM_PROVIDER!HINDSIGHT_API_REFLECT_LLM_API_KEYHINDSIGHT_API_REFLECT_LLM_MODEL"HINDSIGHT_API_REFLECT_LLM_BASE_URL(HINDSIGHT_API_REFLECT_LLM_MAX_CONCURRENT%HINDSIGHT_API_REFLECT_LLM_MAX_RETRIES)HINDSIGHT_API_REFLECT_LLM_INITIAL_BACKOFF%HINDSIGHT_API_REFLECT_LLM_MAX_BACKOFF!HINDSIGHT_API_REFLECT_LLM_TIMEOUT.HINDSIGHT_API_REFLECT_LLM_LITELLMROUTER_CONFIG(HINDSIGHT_API_CONSOLIDATION_LLM_PROVIDER'HINDSIGHT_API_CONSOLIDATION_LLM_API_KEY%HINDSIGHT_API_CONSOLIDATION_LLM_MODEL(HINDSIGHT_API_CONSOLIDATION_LLM_BASE_URL.HINDSIGHT_API_CONSOLIDATION_LLM_MAX_CONCURRENT+HINDSIGHT_API_CONSOLIDATION_LLM_MAX_RETRIES/HINDSIGHT_API_CONSOLIDATION_LLM_INITIAL_BACKOFF+HINDSIGHT_API_CONSOLIDATION_LLM_MAX_BACKOFF'HINDSIGHT_API_CONSOLIDATION_LLM_TIMEOUT4HINDSIGHT_API_CONSOLIDATION_LLM_LITELLMROUTER_CONFIG!HINDSIGHT_API_EMBEDDINGS_PROVIDER$HINDSIGHT_API_EMBEDDINGS_LOCAL_MODEL(HINDSIGHT_API_EMBEDDINGS_LOCAL_FORCE_CPU0HINDSIGHT_API_EMBEDDINGS_LOCAL_TRUST_REMOTE_CODE HINDSIGHT_API_EMBEDDINGS_TEI_URL'HINDSIGHT_API_EMBEDDINGS_OPENAI_API_KEY%HINDSIGHT_API_EMBEDDINGS_OPENAI_MODEL(HINDSIGHT_API_EMBEDDINGS_OPENAI_BASE_URL*HINDSIGHT_API_EMBEDDINGS_OPENAI_BATCH_SIZE'HINDSIGHT_API_EMBEDDINGS_GEMINI_API_KEY%HINDSIGHT_API_EMBEDDINGS_GEMINI_MODEL5HINDSIGHT_API_EMBEDDINGS_GEMINI_OUTPUT_DIMENSIONALITY*HINDSIGHT_API_EMBEDDINGS_GEMINI_FORCE_IPV4,HINDSIGHT_API_EMBEDDINGS_VERTEXAI_PROJECT_ID(HINDSIGHT_API_EMBEDDINGS_VERTEXAI_REGION5HINDSIGHT_API_EMBEDDINGS_VERTEXAI_SERVICE_ACCOUNT_KEY'HINDSIGHT_API_EMBEDDINGS_COHERE_API_KEY%HINDSIGHT_API_EMBEDDINGS_COHERE_MODEL(HINDSIGHT_API_EMBEDDINGS_COHERE_BASE_URL1HINDSIGHT_API_EMBEDDINGS_COHERE_OUTPUT_DIMENSIONS%HINDSIGHT_API_RERANKER_COHERE_API_KEY#HINDSIGHT_API_RERANKER_COHERE_MODEL&HINDSIGHT_API_RERANKER_COHERE_BASE_URL HINDSIGHT_API_OPENROUTER_API_KEY+HINDSIGHT_API_EMBEDDINGS_OPENROUTER_API_KEY)HINDSIGHT_API_EMBEDDINGS_OPENROUTER_MODEL)HINDSIGHT_API_RERANKER_OPENROUTER_API_KEY'HINDSIGHT_API_RERANKER_OPENROUTER_MODELHINDSIGHT_API_COHERE_API_KEY)HINDSIGHT_API_EMBEDDINGS_LITELLM_API_BASE(HINDSIGHT_API_EMBEDDINGS_LITELLM_API_KEY&HINDSIGHT_API_EMBEDDINGS_LITELLM_MODEL'HINDSIGHT_API_RERANKER_LITELLM_API_BASE&HINDSIGHT_API_RERANKER_LITELLM_API_KEY$HINDSIGHT_API_RERANKER_LITELLM_MODEL1HINDSIGHT_API_RERANKER_LITELLM_MAX_TOKENS_PER_DOC,HINDSIGHT_API_EMBEDDINGS_LITELLM_SDK_API_KEY*HINDSIGHT_API_EMBEDDINGS_LITELLM_SDK_MODEL-HINDSIGHT_API_EMBEDDINGS_LITELLM_SDK_API_BASE6HINDSIGHT_API_EMBEDDINGS_LITELLM_SDK_OUTPUT_DIMENSIONS4HINDSIGHT_API_EMBEDDINGS_LITELLM_SDK_ENCODING_FORMAT*HINDSIGHT_API_RERANKER_LITELLM_SDK_API_KEY(HINDSIGHT_API_RERANKER_LITELLM_SDK_MODEL+HINDSIGHT_API_RERANKER_LITELLM_SDK_API_BASEHINDSIGHT_API_LITELLM_API_BASEHINDSIGHT_API_LITELLM_API_KEYHINDSIGHT_API_RERANKER_PROVIDER"HINDSIGHT_API_RERANKER_LOCAL_MODEL&HINDSIGHT_API_RERANKER_LOCAL_FORCE_CPU+HINDSIGHT_API_RERANKER_LOCAL_MAX_CONCURRENT.HINDSIGHT_API_RERANKER_LOCAL_TRUST_REMOTE_CODE!HINDSIGHT_API_RERANKER_LOCAL_FP16,HINDSIGHT_API_RERANKER_LOCAL_BUCKET_BATCHING'HINDSIGHT_API_RERANKER_LOCAL_BATCH_SIZEHINDSIGHT_API_RERANKER_TEI_URL%HINDSIGHT_API_RERANKER_TEI_BATCH_SIZE)HINDSIGHT_API_RERANKER_TEI_MAX_CONCURRENT'HINDSIGHT_API_RERANKER_TEI_HTTP_TIMEOUT%HINDSIGHT_API_RERANKER_MAX_CANDIDATES&HINDSIGHT_API_RERANKER_FLASHRANK_MODEL*HINDSIGHT_API_RERANKER_FLASHRANK_CACHE_DIR.HINDSIGHT_API_RERANKER_FLASHRANK_CPU_MEM_ARENA*HINDSIGHT_API_RERANKER_ZEROENTROPY_API_KEY(HINDSIGHT_API_RERANKER_ZEROENTROPY_MODEL+HINDSIGHT_API_RERANKER_ZEROENTROPY_BASE_URL*HINDSIGHT_API_RERANKER_SILICONFLOW_API_KEY(HINDSIGHT_API_RERANKER_SILICONFLOW_MODEL+HINDSIGHT_API_RERANKER_SILICONFLOW_BASE_URL#HINDSIGHT_API_RERANKER_GOOGLE_MODEL(HINDSIGHT_API_RERANKER_GOOGLE_PROJECT_ID1HINDSIGHT_API_RERANKER_GOOGLE_SERVICE_ACCOUNT_KEYHINDSIGHT_API_VECTOR_EXTENSION#HINDSIGHT_API_TEXT_SEARCH_EXTENSIONHINDSIGHT_API_HOSTHINDSIGHT_API_PORTHINDSIGHT_API_BASE_PATHHINDSIGHT_API_LOG_LEVELHINDSIGHT_API_LOG_FORMATHINDSIGHT_API_LOG_JSON_FIELDSHINDSIGHT_API_WORKERSHINDSIGHT_API_MCP_ENABLEDHINDSIGHT_API_MCP_ENABLED_TOOLSHINDSIGHT_API_MCP_STATELESS$HINDSIGHT_API_ENABLE_BANK_CONFIG_API#HINDSIGHT_API_DEFAULT_BANK_TEMPLATEHINDSIGHT_API_GRAPH_RETRIEVER#HINDSIGHT_API_RECALL_MAX_CONCURRENT&HINDSIGHT_API_RECALL_CONNECTION_BUDGET%HINDSIGHT_API_RECALL_MAX_QUERY_TOKENS.HINDSIGHT_API_MENTAL_MODEL_REFRESH_CONCURRENCY-HINDSIGHT_API_LINK_EXPANSION_PER_ENTITY_LIMIT$HINDSIGHT_API_LINK_EXPANSION_TIMEOUT!HINDSIGHT_API_OTEL_TRACES_ENABLED)HINDSIGHT_API_OTEL_EXPORTER_OTLP_ENDPOINT(HINDSIGHT_API_OTEL_EXPORTER_OTLP_HEADERSHINDSIGHT_API_OTEL_SERVICE_NAME)HINDSIGHT_API_OTEL_DEPLOYMENT_ENVIRONMENT%HINDSIGHT_API_METRICS_INCLUDE_BANK_ID%HINDSIGHT_API_LLM_VERTEXAI_PROJECT_ID!HINDSIGHT_API_LLM_VERTEXAI_REGION.HINDSIGHT_API_LLM_VERTEXAI_SERVICE_ACCOUNT_KEY(HINDSIGHT_API_LLM_GEMINI_SAFETY_SETTINGS*HINDSIGHT_API_RETAIN_MAX_COMPLETION_TOKENSHINDSIGHT_API_RETAIN_CHUNK_SIZE)HINDSIGHT_API_RETAIN_EXTRACT_CAUSAL_LINKS$HINDSIGHT_API_RETAIN_EXTRACTION_MODEHINDSIGHT_API_RETAIN_MISSION(HINDSIGHT_API_RETAIN_CUSTOM_INSTRUCTIONS%HINDSIGHT_API_RETAIN_DEFAULT_STRATEGY!HINDSIGHT_API_RETAIN_BATCH_TOKENS"HINDSIGHT_API_RETAIN_ENTITY_LOOKUP"HINDSIGHT_API_RETAIN_BATCH_ENABLED0HINDSIGHT_API_RETAIN_BATCH_POLL_INTERVAL_SECONDS%HINDSIGHT_API_RETAIN_CHUNK_BATCH_SIZEHINDSIGHT_API_FILE_STORAGE_TYPE$HINDSIGHT_API_FILE_STORAGE_S3_BUCKET$HINDSIGHT_API_FILE_STORAGE_S3_REGION&HINDSIGHT_API_FILE_STORAGE_S3_ENDPOINT+HINDSIGHT_API_FILE_STORAGE_S3_ACCESS_KEY_ID/HINDSIGHT_API_FILE_STORAGE_S3_SECRET_ACCESS_KEY%HINDSIGHT_API_FILE_STORAGE_GCS_BUCKET2HINDSIGHT_API_FILE_STORAGE_GCS_SERVICE_ACCOUNT_KEY*HINDSIGHT_API_FILE_STORAGE_AZURE_CONTAINER-HINDSIGHT_API_FILE_STORAGE_AZURE_ACCOUNT_NAME,HINDSIGHT_API_FILE_STORAGE_AZURE_ACCOUNT_KEYHINDSIGHT_API_FILE_PARSER#HINDSIGHT_API_FILE_PARSER_ALLOWLIST$HINDSIGHT_API_FILE_PARSER_IRIS_TOKEN%HINDSIGHT_API_FILE_PARSER_IRIS_ORG_ID-HINDSIGHT_API_FILE_PARSER_LLAMA_PARSE_API_KEY/HINDSIGHT_API_FILE_CONVERSION_MAX_BATCH_SIZE_MB,HINDSIGHT_API_FILE_CONVERSION_MAX_BATCH_SIZE$HINDSIGHT_API_ENABLE_FILE_UPLOAD_API&HINDSIGHT_API_FILE_DELETE_AFTER_RETAIN!HINDSIGHT_API_ENABLE_OBSERVATIONS&HINDSIGHT_API_CONSOLIDATION_BATCH_SIZE2HINDSIGHT_API_CONSOLIDATION_MAX_MEMORIES_PER_ROUND*HINDSIGHT_API_CONSOLIDATION_LLM_BATCH_SIZE&HINDSIGHT_API_CONSOLIDATION_MAX_TOKENS3HINDSIGHT_API_CONSOLIDATION_SOURCE_FACTS_MAX_TOKENSCHINDSIGHT_API_CONSOLIDATION_SOURCE_FACTS_MAX_TOKENS_PER_OBSERVATION)HINDSIGHT_API_CONSOLIDATION_RECALL_BUDGET(HINDSIGHT_API_CONSOLIDATION_MAX_ATTEMPTS"HINDSIGHT_API_OBSERVATIONS_MISSION(HINDSIGHT_API_MAX_OBSERVATIONS_PER_SCOPE(HINDSIGHT_API_ENABLE_OBSERVATION_HISTORY)HINDSIGHT_API_ENABLE_MENTAL_MODEL_HISTORYHINDSIGHT_API_WEBHOOK_URLHINDSIGHT_API_WEBHOOK_SECRET!HINDSIGHT_API_WEBHOOK_EVENT_TYPES4HINDSIGHT_API_WEBHOOK_DELIVERY_POLL_INTERVAL_SECONDS!HINDSIGHT_API_LLAMACPP_MODEL_PATH!HINDSIGHT_API_LLAMACPP_GPU_LAYERS#HINDSIGHT_API_LLAMACPP_CONTEXT_SIZE"HINDSIGHT_API_LLAMACPP_CHAT_FORMAT!HINDSIGHT_API_LLAMACPP_NO_GRAMMAR!HINDSIGHT_API_LLAMACPP_EXTRA_ARGS#HINDSIGHT_API_SKIP_LLM_VERIFICATIONHINDSIGHT_API_LAZY_RERANKER'HINDSIGHT_API_RUN_MIGRATIONS_ON_STARTUPHINDSIGHT_API_DB_POOL_MIN_SIZEHINDSIGHT_API_DB_POOL_MAX_SIZE HINDSIGHT_API_DB_COMMAND_TIMEOUT HINDSIGHT_API_DB_ACQUIRE_TIMEOUT"HINDSIGHT_API_DB_STATEMENT_TIMEOUTHINDSIGHT_API_WORKER_ENABLEDHINDSIGHT_API_WORKER_ID%HINDSIGHT_API_WORKER_POLL_INTERVAL_MS HINDSIGHT_API_WORKER_MAX_RETRIESHINDSIGHT_API_WORKER_HTTP_PORTHINDSIGHT_API_WORKER_MAX_SLOTS),HINDSIGHT_API_WORKER_CONSOLIDATION_MAX_SLOTS   )%HINDSIGHT_API_WORKER_RETAIN_MAX_SLOTSr   )2HINDSIGHT_API_WORKER_FILE_CONVERT_RETAIN_MAX_SLOTSr   )3HINDSIGHT_API_WORKER_REFRESH_MENTAL_MODEL_MAX_SLOTSr   )consolidationretainfile_convert_retainrefresh_mental_modelWORKER_SLOT_RESERVATION_TYPES#HINDSIGHT_API_RETAIN_MAX_CONCURRENT$HINDSIGHT_API_REFLECT_MAX_ITERATIONS(HINDSIGHT_API_REFLECT_MAX_CONTEXT_TOKENS"HINDSIGHT_API_REFLECT_WALL_TIMEOUTHINDSIGHT_API_REFLECT_MISSION-HINDSIGHT_API_REFLECT_SOURCE_FACTS_MAX_TOKENS#HINDSIGHT_API_RECALL_INCLUDE_CHUNKSHINDSIGHT_API_RECALL_MAX_TOKENS&HINDSIGHT_API_RECALL_CHUNKS_MAX_TOKENS$HINDSIGHT_API_RECALL_BUDGET_FUNCTION%HINDSIGHT_API_RECALL_BUDGET_FIXED_LOW%HINDSIGHT_API_RECALL_BUDGET_FIXED_MID&HINDSIGHT_API_RECALL_BUDGET_FIXED_HIGH(HINDSIGHT_API_RECALL_BUDGET_ADAPTIVE_LOW(HINDSIGHT_API_RECALL_BUDGET_ADAPTIVE_MID)HINDSIGHT_API_RECALL_BUDGET_ADAPTIVE_HIGHHINDSIGHT_API_RECALL_BUDGET_MINHINDSIGHT_API_RECALL_BUDGET_MAXHINDSIGHT_API_AUDIT_LOG_ENABLEDHINDSIGHT_API_AUDIT_LOG_ACTIONS&HINDSIGHT_API_AUDIT_LOG_RETENTION_DAYS$HINDSIGHT_API_DISPOSITION_SKEPTICISM$HINDSIGHT_API_DISPOSITION_LITERALISM!HINDSIGHT_API_DISPOSITION_EMPATHY
postgresqlpg0publicopenaizgpt-4o-mini	anthropiczclaude-haiku-4-5geminizgemini-2.5-flashgroqzopenai/gpt-oss-120bminimaxzMiniMax-M2.7deepseekzdeepseek-v4-flashzaizglm-4.5-flashollamaz
gemma3:12bllamacppzgemma-4-e2b-itlmstudiozlocal-modelvertexaizgoogle/gemini-2.5-flash-litezopenai-codexzgpt-5.4-minizclaude-codezclaude-sonnet-4-5-20250929mockz
mock-modelnonelitellmbedrockzus.amazon.nova-2-lite-v1:0zdoubao-pro-32kzqwen/qwen3.5-9b)volcano
openrouteri    F       g      ?g      N@g      ^@zus-central1localzBAAI/bge-small-en-v1.5ztext-embedding-3-smalld   zgemini-embedding-001i   i  z$cross-encoder/ms-marco-MiniLM-L-6-v2         g      >@i,  zms-marco-MiniLM-L-12-v2zembed-english-v3.0zrerank-english-v3.0zperplexity/pplx-embed-v1-0.6bzcohere/rerank-v3.5zzerank-2zBAAI/bge-reranker-v2-m3zhttps://api.siliconflow.cn/v1zsemantic-ranker-default-004pgvectornativezhttp://localhost:4000zcohere/rerank-english-v3.0+DEFAULT_RERANKER_LITELLM_MAX_TOKENS_PER_DOCzcohere/embed-english-v3.0floatz0.0.0.0i"   infotextDEFAULT_MCP_ENABLED_TOOLSDEFAULT_DEFAULT_BANK_TEMPLATElink_expansioni     g      $@i   i  concise)rs  verbosecustomverbatimchunksDEFAULT_RETAIN_STRATEGIESi'  trigram<   
markitdown
   2   i   lowi            iX  i"  i i   i  )fixedadaptiver  g?g333333?g      ?   i  zhindsight-apidevelopmenta  Store important information to long-term memory.

Use this tool PROACTIVELY whenever the user shares:
- Personal facts, preferences, or interests
- Important events or milestones
- User history, experiences, or background
- Decisions, opinions, or stated preferences
- Goals, plans, or future intentions
- Relationships or people mentioned
- Work context, projects, or responsibilitiesa  Search memories to provide personalized, context-aware responses.

Use this tool PROACTIVELY to:
- Check user's preferences before making suggestions
- Recall user's history to provide continuity
- Remember user's goals and context
- Personalize responses based on past interactionszconsolidation.completedc            
            e Zd ZdZej        dej        dej        dej        dej	        diZ
ddee         dz  f fd	Zd
ej        defdZ xZS )JsonFormatterzJSON formatter for structured logging.

    Outputs logs in JSON format with a 'severity' field that cloud logging
    systems (GCP, AWS CloudWatch, etc.) can parse to correctly categorize log levels.
    DEBUGINFOWARNINGERRORCRITICALNallowed_fieldsc                 V    t                                                       || _        d S N)superr%   _allowed_fields)r$   r  	__class__s     r   r%   zJsonFormatter.__init__  s'    -r   recordr<   c                      j                             |j        d          |                                t	          j        t          j                                                  |j	        d}ddl
m} |                                }|r||d<   |j        r                     |j                  |d<    j          fd|                                D             }t!          j        |          S )NDEFAULT)severitymessage	timestamploggerr   )_current_schematenant	exceptionc                 .    i | ]\  }}|j         v ||S r   )r  )rE   rF   rG   r$   s      r   rH   z(JsonFormatter.format.<locals>.<dictcomp>  s,    YYY$!QqDDX?X?XA?X?X?Xr   )SEVERITY_MAPgetlevelno
getMessager   nowr   utc	isoformatr&   "hindsight_api.engine.memory_enginer  exc_infoformatExceptionr  rI   jsondumps)r$   r  	log_entryr  r  s   `    r   formatzJsonFormatter.format  s    )--fniHH((**!hl33==??k	
 
	 	GFFFFF $$&& 	)"(Ih ? 	K%)%9%9&/%J%JIk"+YYYY)//*;*;YYYIz)$$$r   r  )r   r   r   r   loggingr  r  r  r  r  r  	frozensetr0   r%   	LogRecordr  __classcell__)r  s   @r   r  r    s          	wfw*L. .y~'< . . . . . .%W. %3 % % % % % % % %r   r  r/   c                 @    d |                      d          D             S )zHParse a comma-separated string into a non-empty list of stripped tokens.c                 ^    g | ]*}|                                 |                                 +S r   strip)rE   rG   s     r   
<listcomp>z#_parse_str_list.<locals>.<listcomp>  s-    ===!17799=AGGII===r   ,)split)r/   s    r   _parse_str_listr    s"    ==u{{3//====r   r&   rawr4   c                     ||dk    r|S 	 t          |          }n'# t          $ r}t          |  d|          |d}~ww xY w|dk     rt          |  d|           |S )a  
    Parse an env var that must be a positive integer (>= 1).

    Falls back to ``default`` when unset/empty. Raises ValueError on non-integer
    or non-positive values so misconfiguration fails fast instead of triggering
    infinite loops or zero-step range() calls downstream.
    Nrl  z must be an integer, got r   z must be >= 1, got )int
ValueError)r&   r  r4   parsedes        r   _parse_positive_intr    s     {cRiiKS K K KDBB3BBCCJKzzD==V==>>>Ms    
A ;A modec           	          |                                  }|t          vr5t                              d|  dt           dt           d           t          S |S )z'Validate and normalize extraction mode.zInvalid extraction mode '', must be one of . Defaulting to ''.)r@   RETAIN_EXTRACTION_MODESr  warningDEFAULT_RETAIN_EXTRACTION_MODE)r  
mode_lowers     r   _validate_extraction_moder    sw    J000A A A@W A A<A A A	
 	
 	
 .-r   functionc           	          |                                  }|t          vr5t                              d|  dt           dt           d           t          S |S )z.Validate and normalize recall budget function.z Invalid recall budget function 'r  r  r  )r@   RECALL_BUDGET_FUNCTIONSr  r  DEFAULT_RECALL_BUDGET_FUNCTION)r  function_lowers     r    _validate_recall_budget_functionr  &  sy    ^^%%N444Ax A AKb A A<A A A	
 	
 	
 .-r   providerc                 f    t                               |                                 t                    S )z+Get the default model for a given provider.)PROVIDER_DEFAULT_MODELSr  r@   DEFAULT_LLM_MODEL)r  s    r   _get_default_model_for_providerr  2  s#    "&&x~~'7'79JKKKr   env_varc                     t          j        | d                                          }|sdS 	 t          j        |          S # t          j        $ r}t          d|  d|           |d}~ww xY w)uQ  
    Parse a LiteLLM Router configuration from a JSON env var.

    The value is forwarded verbatim to ``litellm.Router(**config)``. We only
    check that it parses as JSON; LiteLLM Router is authoritative about the
    shape (``model_list``, ``fallbacks``, ``routing_strategy``, …). See
    https://docs.litellm.ai/docs/routing.
    rl  NInvalid z: invalid JSON: )osgetenvr  r  loadsJSONDecodeErrorr  )r  r  r  s      r   _parse_llm_router_configr  7  s     )GR
 
 
&
&
(
(C tIz# I I I@G@@Q@@AAqHIs   A A+A&&A+c                 Z   | |                                  dk    rt          S 	 t          j        |           }n2# t          j        $ r }t          dt           d|           |d}~ww xY wt          |t                    s,t          dt           dt          |          j
                   |S )af  
    Parse HINDSIGHT_API_DEFAULT_BANK_TEMPLATE as JSON.

    The env var holds a BankTemplateManifest (JSON object) applied verbatim to
    every newly-created bank. Full Pydantic validation is deferred to bank
    creation time (to avoid pulling API models into config.py), but we fail
    fast here if the value is not valid JSON or not a JSON object.
    Nrl  r  z,: expected a JSON object, got invalid JSON: z: expected a JSON object, got )r  rp  r  r  r  r  ENV_DEFAULT_BANK_TEMPLATE
isinstancedicttyper   )r  r  r  s      r   _parse_default_bank_templater  I  s     {ciikkR'',,wC w w wn$=nnklnnoouvvwfd## vt$=tt]abh]i]i]rttuuuMs   8 A'A""A'c                   r   e Zd ZU dZed         ed<   eed<   edz  ed<   eed<   eed<   edz  ed	<   eed
<   eed<   eed<   eed<   edz  ed<   eed<   edz  ed<   eed<   eed<   eed<   eed<   eed<   eed<   edz  ed<   e	dz  ed<   e	dz  ed<   e	dz  ed<   edz  ed<   eed<   edz  ed<   e
dz  ed<   edz  ed<   eed <   eed!<   edz  ed"<   eed#<   edz  ed$<   edz  ed%<   edz  ed&<   edz  ed'<   edz  ed(<   edz  ed)<   edz  ed*<   edz  ed+<   edz  ed,<   edz  ed-<   e	dz  ed.<   edz  ed/<   edz  ed0<   edz  ed1<   edz  ed2<   edz  ed3<   edz  ed4<   edz  ed5<   edz  ed6<   edz  ed7<   e	dz  ed8<   edz  ed9<   edz  ed:<   edz  ed;<   edz  ed<<   edz  ed=<   edz  ed><   edz  ed?<   edz  ed@<   edz  edA<   e	dz  edB<   eedC<   eedD<   eedE<   eedF<   edz  edG<   edz  edH<   edz  edI<   eedJ<   edz  edK<   edz  edL<   edz  edM<   eedN<   eedO<   edz  edP<   eedQ<   edz  edR<   eedS<   edz  edT<   edz  edU<   edz  edV<   edz  edW<   eedX<   edz  edY<   eedZ<   edz  ed[<   edz  ed\<   edz  ed]<   eed^<   eed_<   eed`<   eeda<   eedb<   eedc<   eedd<   eede<   edz  edf<   eedg<   eedh<   eedi<   eedj<   edz  edk<   eedl<   edz  edm<   edz  edn<   eedo<   eedp<   edz  edq<   eedr<   edz  eds<   edz  edt<   eedu<   edz  edv<   edz  edw<   eedx<   edz  edy<   edz  edz<   eed{<   eed|<   eed}<   edz  ed~<   edz  ed<   eed<   eed<   eed<   eed<   eed<   e
e         dz  ed<   eed<   e
e         dz  ed<   eed<   eed<   e	dz  ed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   edz  ed<   edz  ed<   edz  ed<   e	dz  ed<   eed<   eed<   eed<   eed<   eed<   eed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   edz  ed<   e
e         ed<   e
e         dz  ed<   edz  ed<   edz  ed<   edz  ed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   edz  ed<   eed<   e
dz  ed<   eed<   edz  ed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   edz  ed<   edz  ed<   edz  ed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   eed<   edz  ed<   eed<   eed<   eed<   eed<   e	eef         ed<   eed<   eed<   eed<   eed<   eed<   edz  ed<   edz  ed<   eed<   eed<   eed<   eed<   e
e         ed<   eed<   edz  ed<   edz  ed<   e
e         ed<   eed<   eZeed<   h dZh dZedefd            Zedee         fd            Zedee         fd            Zedee         fd            Zedee         fd            ZddZedd            ZdefdZdefdZdd ZddZdS (  r   z*Configuration container for Hindsight API.)rL  oracledatabase_backenddatabase_urlNread_database_urlread_db_pool_min_sizeread_db_pool_max_sizemigration_database_urldatabase_schemavector_extensiontext_search_extensionllm_providerllm_api_key	llm_modelllm_base_urlllm_max_concurrentllm_max_retriesllm_initial_backoffllm_max_backoffllm_timeoutllm_groq_service_tierllm_openai_service_tierllm_extra_bodyllm_default_headersllm_litellmrouter_configllm_vertexai_project_idllm_vertexai_region llm_vertexai_service_account_keyllm_gemini_safety_settingsllamacpp_model_pathllamacpp_gpu_layersllamacpp_context_sizellamacpp_chat_formatllamacpp_no_grammarllamacpp_extra_argsretain_llm_providerretain_llm_api_keyretain_llm_modelretain_llm_base_urlretain_llm_max_concurrentretain_llm_max_retriesretain_llm_initial_backoffretain_llm_max_backoffretain_llm_timeoutretain_llm_litellmrouter_configreflect_llm_providerreflect_llm_api_keyreflect_llm_modelreflect_llm_base_urlreflect_llm_max_concurrentreflect_llm_max_retriesreflect_llm_initial_backoffreflect_llm_max_backoffreflect_llm_timeout reflect_llm_litellmrouter_configconsolidation_llm_providerconsolidation_llm_api_keyconsolidation_llm_modelconsolidation_llm_base_url consolidation_llm_max_concurrentconsolidation_llm_max_retries!consolidation_llm_initial_backoffconsolidation_llm_max_backoffconsolidation_llm_timeout&consolidation_llm_litellmrouter_configembeddings_providerembeddings_local_modelembeddings_local_force_cpu"embeddings_local_trust_remote_codeembeddings_tei_urlembeddings_openai_base_urlembeddings_cohere_api_keyembeddings_cohere_modelembeddings_cohere_base_url#embeddings_cohere_output_dimensionsembeddings_openrouter_api_keyembeddings_openrouter_modelembeddings_litellm_api_baseembeddings_litellm_api_keyembeddings_litellm_modelembeddings_litellm_sdk_api_keyembeddings_litellm_sdk_modelembeddings_litellm_sdk_api_base(embeddings_litellm_sdk_output_dimensions&embeddings_litellm_sdk_encoding_formatembeddings_gemini_api_keyembeddings_gemini_model'embeddings_gemini_output_dimensionalityembeddings_gemini_force_ipv4embeddings_vertexai_project_idembeddings_vertexai_region'embeddings_vertexai_service_account_keyreranker_providerreranker_local_modelreranker_local_force_cpureranker_local_max_concurrent reranker_local_trust_remote_codereranker_local_fp16reranker_local_bucket_batchingreranker_local_batch_sizereranker_tei_urlreranker_tei_batch_sizereranker_tei_max_concurrentreranker_tei_http_timeoutreranker_max_candidatesreranker_cohere_api_keyreranker_cohere_modelreranker_cohere_base_urlreranker_openrouter_api_keyreranker_openrouter_modelreranker_litellm_api_basereranker_litellm_api_keyreranker_litellm_model#reranker_litellm_max_tokens_per_docreranker_litellm_sdk_api_keyreranker_litellm_sdk_modelreranker_litellm_sdk_api_basereranker_zeroentropy_api_keyreranker_zeroentropy_modelreranker_zeroentropy_base_urlreranker_siliconflow_api_keyreranker_siliconflow_modelreranker_siliconflow_base_urlreranker_google_modelreranker_google_project_id#reranker_google_service_account_keyhostport	base_path	log_level
log_formatlog_json_fieldsmcp_enabledmcp_enabled_toolsmcp_statelessenable_bank_config_apidefault_bank_templategraph_retrieverrecall_max_concurrentrecall_connection_budgetrecall_max_query_tokens mental_model_refresh_concurrencylink_expansion_per_entity_limitlink_expansion_timeoutretain_max_completion_tokensretain_chunk_sizeretain_extract_causal_linksretain_extraction_moderetain_missionretain_custom_instructionsretain_default_strategyretain_strategiesretain_batch_tokensretain_batch_enabled"retain_batch_poll_interval_secondsretain_entity_lookupretain_chunk_batch_sizefile_storage_typefile_storage_s3_bucketfile_storage_s3_regionfile_storage_s3_endpointfile_storage_s3_access_key_id!file_storage_s3_secret_access_keyfile_storage_gcs_bucket$file_storage_gcs_service_account_keyfile_storage_azure_containerfile_storage_azure_account_namefile_storage_azure_account_keyfile_parserfile_parser_allowlistfile_parser_iris_tokenfile_parser_iris_org_idfile_parser_llama_parse_api_key!file_conversion_max_batch_size_mbfile_conversion_max_batch_sizeenable_file_upload_apifile_delete_after_retainenable_observationsenable_observation_historyenable_mental_model_historyconsolidation_batch_size$consolidation_max_memories_per_roundconsolidation_llm_batch_sizeconsolidation_max_tokensconsolidation_recall_budget%consolidation_source_facts_max_tokens5consolidation_source_facts_max_tokens_per_observationconsolidation_max_attemptsobservations_missionmax_observations_per_scopeentity_labelsentities_allow_free_formreflect_missionreflect_source_facts_max_tokensrecall_include_chunksrecall_max_tokensrecall_chunks_max_tokensrecall_budget_functionrecall_budget_fixed_lowrecall_budget_fixed_midrecall_budget_fixed_highrecall_budget_adaptive_lowrecall_budget_adaptive_midrecall_budget_adaptive_highrecall_budget_minrecall_budget_maxdisposition_skepticismdisposition_literalismdisposition_empathyskip_llm_verificationlazy_rerankerrun_migrations_on_startupdb_pool_min_sizedb_pool_max_sizedb_command_timeoutdb_acquire_timeoutdb_statement_timeoutworker_enabled	worker_idworker_poll_interval_msworker_max_retriesworker_http_portworker_max_slotsworker_slot_reservationsretain_max_concurrentreflect_max_iterationsreflect_max_context_tokensreflect_wall_timeoutotel_traces_enabledotel_exporter_otlp_endpointotel_exporter_otlp_headersotel_service_nameotel_deployment_environmentmetrics_include_bank_idaudit_log_enabledaudit_log_actionsaudit_log_retention_dayswebhook_urlwebhook_secretwebhook_event_types&webhook_delivery_poll_interval_secondsembeddings_openai_batch_size>   r  r  r  r  r  r  reranker_tei_base_urlr  embeddings_tei_base_urlr  rM  r  r7  r  r  r\  rY  r  r  r  r  r  r  r_  r  r"  r=  >#   r  rv  r  rg  r  r  r  rs  ry  r  r  r  r  r  r  r  ru  r  r  r~  rx  r  r  r  r  r  r  r  rw  r  r  r  r  r  r  r<   c                     | j         dz  dz  S )z&Get maximum total batch size in bytes.i   )r  )r$   s    r   $file_conversion_max_batch_size_bytesz4HindsightConfig.file_conversion_max_batch_size_bytes  s     5<tCCr   c                 4    | j                                         S )a  
        Get set of field names that are configurable per-tenant/bank via API.

        Configurable fields are manually tagged behavioral settings that are safe
        to expose and modify (e.g., retain_chunk_size, custom_instructions).
        Excludes credentials, infrastructure config, and provider/model selection.

        Returns:
            Set of configurable field names
        )_CONFIGURABLE_FIELDScopyclss    r   r#   z'HindsightConfig.get_configurable_fields  s     ',,...r   c                 4    | j                                         S )a2  
        Get set of field names that are credentials (NEVER exposed via API).

        Credential fields include API keys, base URLs, and service account keys.
        These must never be returned in API responses or accepted in updates.

        Returns:
            Set of credential field names
        )_CREDENTIAL_FIELDSr  r  s    r   get_credential_fieldsz%HindsightConfig.get_credential_fields  s     %**,,,r   c                 *    |                                  S )z
        DEPRECATED: Use get_configurable_fields() instead.

        Kept for backward compatibility during migration.
        )r#   r  s    r   get_hierarchical_fieldsz'HindsightConfig.get_hierarchical_fields  s     **,,,r   c                 H    d t          |           D             }|| j        z
  S )ap  
        Get set of field names that are static (server-level only).

        Static fields are infrastructure-level settings that cannot vary
        per tenant or bank. These include database config, API port, worker settings, etc.
        Also includes credential fields which are never configurable.

        Returns:
            Set of static field names
        c                     h | ]	}|j         
S r   )r&   )rE   fs     r   	<setcomp>z4HindsightConfig.get_static_fields.<locals>.<setcomp>.  s    222af222r   )r   r  )r  
all_fieldss     r   get_static_fieldsz!HindsightConfig.get_static_fields!  s+     32fSkk222
C444r   c                 B   t          | j                   d}| j        |vr-t          d| j         dd                    |                     | j        dk    r(d| _        d| _        t          	                    d           | j        dk    r^| j
        | j        k    rNt          d	| j
         d
| j         d| j         d| j
         d| j        p| j         d| j        p| j         d          | j        dk    s| j        dk    r	 ddl}|                    d           n# t&          $ rs g }| j        dk    r|                    d           | j        dk    r|                    d           t                              dd                    |                     Y nw xY wt-          | j                                                  }|| j        k    rTd                    d | j                                        D                       }t          d| d| d| j         d          dS )zHValidate configuration values and raise errors for invalid combinations.)ri  vchordpg_textsearchzInvalid text_search_extension: z. Must be one of: z, r[  rw  FzLLM provider set to 'none': forcing retain_extraction_mode='chunks', disabling observations/consolidation. Reflect will return HTTP 400.zCInvalid configuration: HINDSIGHT_API_RETAIN_MAX_COMPLETION_TOKENS (z8) must be greater than HINDSIGHT_API_RETAIN_CHUNK_SIZE (zm). 

You have two options to fix this:
  1. Increase HINDSIGHT_API_RETAIN_MAX_COMPLETION_TOKENS to a value > z)
  2. Use a model that supports at least z$ output tokens
     (current model: z, provider: )rc  r   Nsentence_transformers
embeddingsrerankeraN  Local ML provider configured for %s, but 'sentence-transformers' is not installed. The API will fail at startup. Either:
  1. Install local ML deps: pip install hindsight-api[local-ml]
  2. Use a remote provider instead:
     HINDSIGHT_API_EMBEDDINGS_PROVIDER=openai (or gemini, tei)
     HINDSIGHT_API_RERANKER_PROVIDER=none (or tei)z and c              3   6   K   | ]\  }}|d k    | d| V  dS )r   =Nr   rD   s      r   	<genexpr>z+HindsightConfig.validate.<locals>.<genexpr>q  s<      +r+r41almpqlqlqqJJ1JJlqlqlqlq+r+rr   z(Sum of per-operation slot reservations (z: z) exceeds worker_max_slots (zB). Reduce reservations or increase HINDSIGHT_API_WORKER_MAX_SLOTS.)r   r  r  r  joinr  ru  r  r  rm  rr  rs  r  r  r  r#  r>  	importlibimport_moduleImportErrorappendr  sumr  valuesr  rI   )r$   valid_text_searchr  missingtotal_reservedreservation_detailss         r   validatezHindsightConfig.validate2  s    	40111 B%->>>~$2L~~`d`i`ij{`|`|~~  
 &&*2D'',D$KKV   &&4+LPTPf+f+fN5N N484JN N \`[q	N N
 >B=^N N +/*?*Q4>N N "5J9JN N N	 	 	 #w..$2HG2S2S    ''(?@@@@   +w66NN<000)W44NN:...I LL))    " T:AACCDDD111"&))+r+r4C`CfCfChCh+r+r+r"r"rS> S SM` S S-1-BS S S   21s    D A:FFc                 t[   t          j        t          t                    }t          j        t                    pt          |          } | di dt          j        t          t                                                    dt          j        t          t                    dt          j        t                    pddt          t          j        t          t          t                                        dt          t          j        t           t          t"                                        dt          j        t$                    pddt          j        t&          t(                    d	t          j        t*          t,                                                    d
t          j        t.          t0                                                    d|dt          j        t2                    d|dt          j        t4                    pddt          t          j        t6          t          t8                                        dt          t          j        t:          t          t<                                        dt?          t          j        t@          t          tB                                        dt?          t          j        tD          t          tF                                        dt?          t          j        tH          t          tJ                                        dt          j        tL          tN                    dt          j        tP          tR                    dtU          j+        t          j        tX          d                    dtU          j+        t          j        tZ          d                    dt]          t^                    dt          j        t`                    ptb          dt          j        td          tf                    dt          j        th                    ptj          dtU          j+        t          j        tl          d                    dt          j        tn                    pddt          t          j        tp          t          tr                                        d t          t          j        tt          t          tv                                        d!t          j        tx                    ptz          d"t          j        t|          t          t~                                                              d#v d$t          j        t                    pt          d%t          j        t                    pdd&t          j        t                    pdd't          j        t                    p@t          j        t                    r&t          t          j        t                              ndd(t          j        t                    pdd)t          j        t                    r&t          t          j        t                              ndd*t          j        t                    r&t          t          j        t                              ndd+t          j        t                    r&t?          t          j        t                              ndd,t          j        t                    r&t?          t          j        t                              ndd-t          j        t                    r&t?          t          j        t                              ndd.t]          t                    d/t          j        t                    pdd0t          j        t                    pdd1t          j        t                    p@t          j        t                    r&t          t          j        t                              ndd2t          j        t                    pdd3t          j        t                    r&t          t          j        t                              ndd4t          j        t                    r&t          t          j        t                              ndd5t          j        t                    r&t?          t          j        t                              ndd6t          j        t                    r&t?          t          j        t                              ndd7t          j        t                    r&t?          t          j        t                              ndd8t]          t                    d9t          j        t                    pdd:t          j        t                    pdd;t          j        t                    p@t          j        t                    r&t          t          j        t                              ndd<t          j        t                    pdd=t          j        t                    r&t          t          j        t                              ndd>t          j        t                    r&t          t          j        t                              ndd?t          j        t                    r&t?          t          j        t                              ndd@t          j        t                    r&t?          t          j        t                              nddAt          j        t                    r&t?          t          j        t                              nddBt]          t                    dCt          j        t          t                    dDt          j        t          t                    dEt          j        t          t          t                                                              d#v dFt          j        t          t          t                                                              d#v dGt          j        t                    dHt          j        t                    pddIt          t          t          j        t                    t                    dJt          j        t                    pt          j        t                    dKt          j        t          t                    dLt          j        t                    pddMt          j        t                    x}rt          |          nddNt          j        t                    p1t          j        t                    pt          j        t2                    dOt          j        t          t                    dPt          j        t                    pt          j        t          t                    dQt          j        t                    pt          j        t                    dRt          j        t          t                    dSt          j        t                    dTt          j        t          t                     dUt          j        t                    pddVt          j        t                    x}rt          |          nddWt          j        t          t                    dXt          j        t
                    pt          j        t2                    dYt          j        t          t                    dZt          t          j        t          t          t                                        d[t          j        t          t          t                                                              d#v d\t          j        t                    pt          j        t`                    d]t          j        t                    pt          j        td                    d^t          j        t                    pt          j        th                    d_t          j        t          t                     d`t          j        t"          t$                    dat          j        t&          t          t(                                                              d#v dbt          t          j        t*          t          t,                                        dct          j        t.          t          t0                                                              d#v ddt          j        t2          t          t4                                                              d#v det          j        t6          t          t8                                                              d#v dft          t          j        t:          t          t<                                        dgt          j        t>                    dht          t          j        t@          t          tB                                        dit          t          j        tD          t          tF                                        djt?          t          j        tH          t          tJ                                        dkt          t          j        tL          t          tN                                        dlt          j        tP                    pt          j        t                    dmt          j        tR          tT                    dnt          j        tV                    pddot          j        tX                    p1t          j        t                    pt          j        t2                    dpt          j        tZ          t\                    dqt          j        t^                    pt          j        t          t                    drt          j        t`                    pt          j        t                    dst          j        tb          td                    dtt          j        tf                    x}rt          |          nth          dut          j        tj                    dvt          j        tl          tn                    dwt          j        tp                    pddxt          j        tr                    dyt          j        tt          tv                    dzt          j        tx                    pdd{t          j        tz                    d|t          j        t|          t~                    d}t          j        t          t                    d~t          j        t          t                    dt          j        t                    pt          j        t`                    dt          j        t                    pt          j        th                    dt          j        t          t                    dt          t          j        t          t                              dt          j        t          t                    dt          j        t          t                    dt          j        t          t                                                    dt          t          j        t          d                    pddt          j        t          t          t                                                              dk    dt          j        t                    r7d t          j        t                                        d          D             nt          dt          j        t          t          t                                                              dk    dt          j        t          t          t                                                              dk    dt          t          j        t                              dt          j        t          t                    dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt?          t          j        t          t          t                                        dt          j        t          d                                          dk    dt          j        t          d                                          dk    dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          j        t          t          t                                                              dk    dt          t          j        t          t                              dt          j        t                    pt          dt          j        t                    pt          dt          j        t                    pt          dt          dt          t          j        t          t          t                                        dt          j        t          t                     dt          j        t          t          t                                                              dk    dt          t          j        t          t          t                                        dt          t          j        t
          t          t                                        dt          j        t          t                    dt          j        t                    pddt          j        t                    pddt          j        t                    pddt          j        t                    pddt          j        t                    pddt          j        t                    pddt          j        t                    pddt          j        t                     pddt          j        t"                    pddt          j        t$                    pddt          t          j        t&          t(                              dt          j        t*                    r(t          t          j        t*                              nddt          j        t,                    pddt          j        t.                    pddt          j        t0                    pddt          t          j        t2          t          t4                                        dt          t          j        t6          t          t8                                        dt          j        t:          t          t<                                                              dk    dt          j        t>          t          t@                                                              dk    dt          j        tB          t          tD                                                              dk    dt          j        tF          t          tH                                                              dk    dt          j        tJ          t          tL                                                              dk    dt          t          j        tN          t          tP                                        dt          t          j        tR          t          tT                                        dt          t          j        tV          t          tX                                        dt          t          j        tZ          t          t\                                        dt          j        t^          t`                    dt          t          j        tb          t          td                                        dt          t          j        tf          t          th                                        dt          t          j        tj          t          tl                                        dt          j        tn                    ptp          dt          t          j        tr          t          tt                                        ddddʓdt          j        tv          d                                          dk    dt          t          j        tx          t          t                                        dt          t          j        tz          t          t"                                        dt          t          j        t|          t          t~                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          j        t          t          t                                                              dk    dt          j        t                    pt          dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dd؄ t          Q                                D             dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          j        t                    pddt          t          j        t          t          t                                        dt          j        t          t          t                                                              dv dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t                              dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt?          t          j        t          t          t                                        dt?          t          j        t          t          t                                        dt?          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          t          j        t          t          t                                        dt          j        t                    r't          t          j        t                              nt          dt          j        t                    r't          t          j        t                              nt          dt          j        t                    r't          t          j        t                              nt          dt          j        t          t          t                                                              dv dt          j        t                    pddt          j        t                    pddt          j        t           t                    dt          j        t          t                    dt          j        t          t          t
                                                              dv dt          j        t          t          t                                                              dk    dd t          j        t          t                                        d          D             dt          t          j        t          t          t                                        dt          j        t                    pt          dt          j        t                    pt          dd t          j        t           t"                                        d          D             dt          t          j        t$          t          t&                                        }|                                 |S )z0Create configuration from environment variables.r  r  r  Nr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  nullr  r  r  r  r  r  r  r   r  r  r  )true1r  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  r  r   r!  r"  r#  r$  r%  r&  r'  r(  r  r)  r*  r+  r,  r-  r.  r/  r0  r1  r2  r3  r4  r5  r6  r7  r8  r9  r:  r;  r<  r=  r>  r?  r@  rA  rB  rC  rD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rc  rd  re  rl  rf  r   rg  c                 ^    g | ]*}|                                 |                                 +S r   r  rE   ts     r   r  z,HindsightConfig.from_env.<locals>.<listcomp>  s2    kkkQabahahajajkqwwyykkkr   r  rh  ri  rj  rk  rl  rm  rn  ro  rp  rq  r  falser  rr  rs  rt  ru  rv  rw  rx  ry  rz  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  r  r  r  r  r  r  r  r  r  r  r  r  r  Tr  r  r  r  r  r  r  r  r  r  r  r  r  c                     i | ]k\  }\  }}t          t          j        |t          |                              d k    ;|t          t          j        |t          |                              lS )r   )r  r  r  r0   )rE   op_typer  r4   s       r   rH   z,HindsightConfig.from_env.<locals>.<dictcomp>  sl     & & &/G/gwry#g,,77881<< RYwG==>><<<r   r  r  r  r  r  r  r  )r   r  yesr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  c                 ^    g | ]*}|                                 |                                 +S r   r  )rE   as     r   r  z,HindsightConfig.from_env.<locals>.<listcomp>I  sB       mnmtmtmvmv		  r   r  r  r  r  c                 ^    g | ]*}|                                 |                                 +S r   r  r  s     r   r  z,HindsightConfig.from_env.<locals>.<listcomp>R  s>     ! ! !7799!		! ! !r   r  r   (  r  r  ENV_LLM_PROVIDERDEFAULT_LLM_PROVIDERENV_LLM_MODELr  ENV_DATABASE_BACKENDDEFAULT_DATABASE_BACKENDr@   ENV_DATABASE_URLDEFAULT_DATABASE_URLENV_READ_DATABASE_URLr  ENV_READ_DB_POOL_MIN_SIZEr0   DEFAULT_DB_POOL_MIN_SIZEENV_READ_DB_POOL_MAX_SIZEDEFAULT_DB_POOL_MAX_SIZEENV_MIGRATION_DATABASE_URLENV_DATABASE_SCHEMADEFAULT_DATABASE_SCHEMAENV_VECTOR_EXTENSIONDEFAULT_VECTOR_EXTENSIONENV_TEXT_SEARCH_EXTENSIONDEFAULT_TEXT_SEARCH_EXTENSIONENV_LLM_API_KEYENV_LLM_BASE_URLENV_LLM_MAX_CONCURRENTDEFAULT_LLM_MAX_CONCURRENTENV_LLM_MAX_RETRIESDEFAULT_LLM_MAX_RETRIESrk  ENV_LLM_INITIAL_BACKOFFDEFAULT_LLM_INITIAL_BACKOFFENV_LLM_MAX_BACKOFFDEFAULT_LLM_MAX_BACKOFFENV_LLM_TIMEOUTDEFAULT_LLM_TIMEOUTENV_LLM_GROQ_SERVICE_TIERDEFAULT_LLM_GROQ_SERVICE_TIERENV_LLM_OPENAI_SERVICE_TIERDEFAULT_LLM_OPENAI_SERVICE_TIERr  r  ENV_LLM_EXTRA_BODYENV_LLM_DEFAULT_HEADERSr  ENV_LLM_LITELLMROUTER_CONFIGENV_LLM_VERTEXAI_PROJECT_IDDEFAULT_LLM_VERTEXAI_PROJECT_IDENV_LLM_VERTEXAI_REGIONDEFAULT_LLM_VERTEXAI_REGION$ENV_LLM_VERTEXAI_SERVICE_ACCOUNT_KEY(DEFAULT_LLM_VERTEXAI_SERVICE_ACCOUNT_KEYENV_LLM_GEMINI_SAFETY_SETTINGSENV_LLAMACPP_MODEL_PATHENV_LLAMACPP_GPU_LAYERSDEFAULT_LLAMACPP_GPU_LAYERSENV_LLAMACPP_CONTEXT_SIZEDEFAULT_LLAMACPP_CONTEXT_SIZEENV_LLAMACPP_CHAT_FORMATDEFAULT_LLAMACPP_CHAT_FORMATENV_LLAMACPP_NO_GRAMMARDEFAULT_LLAMACPP_NO_GRAMMARENV_LLAMACPP_EXTRA_ARGSDEFAULT_LLAMACPP_EXTRA_ARGSENV_RETAIN_LLM_PROVIDERENV_RETAIN_LLM_API_KEYENV_RETAIN_LLM_MODELENV_RETAIN_LLM_BASE_URLENV_RETAIN_LLM_MAX_CONCURRENTENV_RETAIN_LLM_MAX_RETRIESENV_RETAIN_LLM_INITIAL_BACKOFFENV_RETAIN_LLM_MAX_BACKOFFENV_RETAIN_LLM_TIMEOUT#ENV_RETAIN_LLM_LITELLMROUTER_CONFIGENV_REFLECT_LLM_PROVIDERENV_REFLECT_LLM_API_KEYENV_REFLECT_LLM_MODELENV_REFLECT_LLM_BASE_URLENV_REFLECT_LLM_MAX_CONCURRENTENV_REFLECT_LLM_MAX_RETRIESENV_REFLECT_LLM_INITIAL_BACKOFFENV_REFLECT_LLM_MAX_BACKOFFENV_REFLECT_LLM_TIMEOUT$ENV_REFLECT_LLM_LITELLMROUTER_CONFIGENV_CONSOLIDATION_LLM_PROVIDERENV_CONSOLIDATION_LLM_API_KEYENV_CONSOLIDATION_LLM_MODELENV_CONSOLIDATION_LLM_BASE_URL$ENV_CONSOLIDATION_LLM_MAX_CONCURRENT!ENV_CONSOLIDATION_LLM_MAX_RETRIES%ENV_CONSOLIDATION_LLM_INITIAL_BACKOFF!ENV_CONSOLIDATION_LLM_MAX_BACKOFFENV_CONSOLIDATION_LLM_TIMEOUT*ENV_CONSOLIDATION_LLM_LITELLMROUTER_CONFIGENV_EMBEDDINGS_PROVIDERDEFAULT_EMBEDDINGS_PROVIDERENV_EMBEDDINGS_LOCAL_MODELDEFAULT_EMBEDDINGS_LOCAL_MODELENV_EMBEDDINGS_LOCAL_FORCE_CPU"DEFAULT_EMBEDDINGS_LOCAL_FORCE_CPU&ENV_EMBEDDINGS_LOCAL_TRUST_REMOTE_CODE*DEFAULT_EMBEDDINGS_LOCAL_TRUST_REMOTE_CODEENV_EMBEDDINGS_TEI_URLENV_EMBEDDINGS_OPENAI_BASE_URLr   ENV_EMBEDDINGS_OPENAI_BATCH_SIZE$DEFAULT_EMBEDDINGS_OPENAI_BATCH_SIZEENV_EMBEDDINGS_COHERE_API_KEYENV_COHERE_API_KEYENV_EMBEDDINGS_COHERE_MODELDEFAULT_EMBEDDINGS_COHERE_MODELENV_EMBEDDINGS_COHERE_BASE_URL'ENV_EMBEDDINGS_COHERE_OUTPUT_DIMENSIONS!ENV_EMBEDDINGS_OPENROUTER_API_KEYENV_OPENROUTER_API_KEYENV_EMBEDDINGS_OPENROUTER_MODEL#DEFAULT_EMBEDDINGS_OPENROUTER_MODELENV_EMBEDDINGS_LITELLM_API_BASEENV_LITELLM_API_BASEDEFAULT_LITELLM_API_BASEENV_EMBEDDINGS_LITELLM_API_KEYENV_LITELLM_API_KEYENV_EMBEDDINGS_LITELLM_MODEL DEFAULT_EMBEDDINGS_LITELLM_MODEL"ENV_EMBEDDINGS_LITELLM_SDK_API_KEY ENV_EMBEDDINGS_LITELLM_SDK_MODEL$DEFAULT_EMBEDDINGS_LITELLM_SDK_MODEL#ENV_EMBEDDINGS_LITELLM_SDK_API_BASE,ENV_EMBEDDINGS_LITELLM_SDK_OUTPUT_DIMENSIONS*ENV_EMBEDDINGS_LITELLM_SDK_ENCODING_FORMAT.DEFAULT_EMBEDDINGS_LITELLM_SDK_ENCODING_FORMATENV_EMBEDDINGS_GEMINI_API_KEYENV_EMBEDDINGS_GEMINI_MODELDEFAULT_EMBEDDINGS_GEMINI_MODEL+ENV_EMBEDDINGS_GEMINI_OUTPUT_DIMENSIONALITY/DEFAULT_EMBEDDINGS_GEMINI_OUTPUT_DIMENSIONALITY ENV_EMBEDDINGS_GEMINI_FORCE_IPV4$DEFAULT_EMBEDDINGS_GEMINI_FORCE_IPV4"ENV_EMBEDDINGS_VERTEXAI_PROJECT_IDENV_EMBEDDINGS_VERTEXAI_REGION+ENV_EMBEDDINGS_VERTEXAI_SERVICE_ACCOUNT_KEYENV_RERANKER_PROVIDERDEFAULT_RERANKER_PROVIDERENV_RERANKER_LOCAL_MODELDEFAULT_RERANKER_LOCAL_MODELENV_RERANKER_LOCAL_FORCE_CPU DEFAULT_RERANKER_LOCAL_FORCE_CPU!ENV_RERANKER_LOCAL_MAX_CONCURRENT%DEFAULT_RERANKER_LOCAL_MAX_CONCURRENT$ENV_RERANKER_LOCAL_TRUST_REMOTE_CODE(DEFAULT_RERANKER_LOCAL_TRUST_REMOTE_CODEENV_RERANKER_LOCAL_FP16DEFAULT_RERANKER_LOCAL_FP16"ENV_RERANKER_LOCAL_BUCKET_BATCHING&DEFAULT_RERANKER_LOCAL_BUCKET_BATCHINGENV_RERANKER_LOCAL_BATCH_SIZE!DEFAULT_RERANKER_LOCAL_BATCH_SIZEENV_RERANKER_TEI_URLENV_RERANKER_TEI_BATCH_SIZEDEFAULT_RERANKER_TEI_BATCH_SIZEENV_RERANKER_TEI_MAX_CONCURRENT#DEFAULT_RERANKER_TEI_MAX_CONCURRENTENV_RERANKER_TEI_HTTP_TIMEOUT!DEFAULT_RERANKER_TEI_HTTP_TIMEOUTENV_RERANKER_MAX_CANDIDATESDEFAULT_RERANKER_MAX_CANDIDATESENV_RERANKER_COHERE_API_KEYENV_RERANKER_COHERE_MODELDEFAULT_RERANKER_COHERE_MODELENV_RERANKER_COHERE_BASE_URLENV_RERANKER_OPENROUTER_API_KEYENV_RERANKER_OPENROUTER_MODEL!DEFAULT_RERANKER_OPENROUTER_MODELENV_RERANKER_LITELLM_API_BASEENV_RERANKER_LITELLM_API_KEYENV_RERANKER_LITELLM_MODELDEFAULT_RERANKER_LITELLM_MODEL'ENV_RERANKER_LITELLM_MAX_TOKENS_PER_DOCrj   ENV_RERANKER_LITELLM_SDK_API_KEYENV_RERANKER_LITELLM_SDK_MODEL"DEFAULT_RERANKER_LITELLM_SDK_MODEL!ENV_RERANKER_LITELLM_SDK_API_BASE ENV_RERANKER_ZEROENTROPY_API_KEYENV_RERANKER_ZEROENTROPY_MODEL"DEFAULT_RERANKER_ZEROENTROPY_MODEL!ENV_RERANKER_ZEROENTROPY_BASE_URL ENV_RERANKER_SILICONFLOW_API_KEYENV_RERANKER_SILICONFLOW_MODEL"DEFAULT_RERANKER_SILICONFLOW_MODEL!ENV_RERANKER_SILICONFLOW_BASE_URL%DEFAULT_RERANKER_SILICONFLOW_BASE_URLENV_RERANKER_GOOGLE_MODELDEFAULT_RERANKER_GOOGLE_MODELENV_RERANKER_GOOGLE_PROJECT_ID'ENV_RERANKER_GOOGLE_SERVICE_ACCOUNT_KEYENV_HOSTDEFAULT_HOSTENV_PORTDEFAULT_PORTENV_BASE_PATHDEFAULT_BASE_PATHENV_LOG_LEVELDEFAULT_LOG_LEVELENV_LOG_FORMATDEFAULT_LOG_FORMATr  ENV_LOG_JSON_FIELDSENV_MCP_ENABLEDDEFAULT_MCP_ENABLEDENV_MCP_ENABLED_TOOLSr  ro  ENV_MCP_STATELESSDEFAULT_MCP_STATELESSENV_ENABLE_BANK_CONFIG_APIDEFAULT_ENABLE_BANK_CONFIG_APIr  r  ENV_GRAPH_RETRIEVERDEFAULT_GRAPH_RETRIEVERENV_RECALL_MAX_CONCURRENTDEFAULT_RECALL_MAX_CONCURRENTENV_RECALL_CONNECTION_BUDGET DEFAULT_RECALL_CONNECTION_BUDGETENV_RECALL_MAX_QUERY_TOKENSDEFAULT_RECALL_MAX_QUERY_TOKENS$ENV_MENTAL_MODEL_REFRESH_CONCURRENCY(DEFAULT_MENTAL_MODEL_REFRESH_CONCURRENCY#ENV_LINK_EXPANSION_PER_ENTITY_LIMIT'DEFAULT_LINK_EXPANSION_PER_ENTITY_LIMITENV_LINK_EXPANSION_TIMEOUTDEFAULT_LINK_EXPANSION_TIMEOUTENV_SKIP_LLM_VERIFICATIONENV_LAZY_RERANKER ENV_RETAIN_MAX_COMPLETION_TOKENS$DEFAULT_RETAIN_MAX_COMPLETION_TOKENSENV_RETAIN_CHUNK_SIZEDEFAULT_RETAIN_CHUNK_SIZEENV_RETAIN_EXTRACT_CAUSAL_LINKS#DEFAULT_RETAIN_EXTRACT_CAUSAL_LINKSr  ENV_RETAIN_EXTRACTION_MODEr  ENV_RETAIN_MISSIONDEFAULT_RETAIN_MISSIONENV_RETAIN_CUSTOM_INSTRUCTIONS"DEFAULT_RETAIN_CUSTOM_INSTRUCTIONSENV_RETAIN_DEFAULT_STRATEGYDEFAULT_RETAIN_DEFAULT_STRATEGYrx  ENV_RETAIN_BATCH_TOKENSDEFAULT_RETAIN_BATCH_TOKENSENV_RETAIN_ENTITY_LOOKUPDEFAULT_RETAIN_ENTITY_LOOKUPENV_RETAIN_BATCH_ENABLEDDEFAULT_RETAIN_BATCH_ENABLED&ENV_RETAIN_BATCH_POLL_INTERVAL_SECONDS*DEFAULT_RETAIN_BATCH_POLL_INTERVAL_SECONDSENV_RETAIN_CHUNK_BATCH_SIZEDEFAULT_RETAIN_CHUNK_BATCH_SIZEENV_FILE_STORAGE_TYPEDEFAULT_FILE_STORAGE_TYPEENV_FILE_STORAGE_S3_BUCKETENV_FILE_STORAGE_S3_REGIONENV_FILE_STORAGE_S3_ENDPOINT!ENV_FILE_STORAGE_S3_ACCESS_KEY_ID%ENV_FILE_STORAGE_S3_SECRET_ACCESS_KEYENV_FILE_STORAGE_GCS_BUCKET(ENV_FILE_STORAGE_GCS_SERVICE_ACCOUNT_KEY ENV_FILE_STORAGE_AZURE_CONTAINER#ENV_FILE_STORAGE_AZURE_ACCOUNT_NAME"ENV_FILE_STORAGE_AZURE_ACCOUNT_KEYENV_FILE_PARSERDEFAULT_FILE_PARSERENV_FILE_PARSER_ALLOWLISTENV_FILE_PARSER_IRIS_TOKENENV_FILE_PARSER_IRIS_ORG_ID#ENV_FILE_PARSER_LLAMA_PARSE_API_KEY%ENV_FILE_CONVERSION_MAX_BATCH_SIZE_MB)DEFAULT_FILE_CONVERSION_MAX_BATCH_SIZE_MB"ENV_FILE_CONVERSION_MAX_BATCH_SIZE&DEFAULT_FILE_CONVERSION_MAX_BATCH_SIZEENV_ENABLE_FILE_UPLOAD_APIDEFAULT_ENABLE_FILE_UPLOAD_APIENV_FILE_DELETE_AFTER_RETAIN DEFAULT_FILE_DELETE_AFTER_RETAINENV_ENABLE_OBSERVATIONSDEFAULT_ENABLE_OBSERVATIONSENV_ENABLE_OBSERVATION_HISTORY"DEFAULT_ENABLE_OBSERVATION_HISTORYENV_ENABLE_MENTAL_MODEL_HISTORY#DEFAULT_ENABLE_MENTAL_MODEL_HISTORYENV_CONSOLIDATION_BATCH_SIZE DEFAULT_CONSOLIDATION_BATCH_SIZE(ENV_CONSOLIDATION_MAX_MEMORIES_PER_ROUND,DEFAULT_CONSOLIDATION_MAX_MEMORIES_PER_ROUND ENV_CONSOLIDATION_LLM_BATCH_SIZE$DEFAULT_CONSOLIDATION_LLM_BATCH_SIZEENV_CONSOLIDATION_MAX_TOKENS DEFAULT_CONSOLIDATION_MAX_TOKENSENV_CONSOLIDATION_RECALL_BUDGET#DEFAULT_CONSOLIDATION_RECALL_BUDGET)ENV_CONSOLIDATION_SOURCE_FACTS_MAX_TOKENS-DEFAULT_CONSOLIDATION_SOURCE_FACTS_MAX_TOKENS9ENV_CONSOLIDATION_SOURCE_FACTS_MAX_TOKENS_PER_OBSERVATION=DEFAULT_CONSOLIDATION_SOURCE_FACTS_MAX_TOKENS_PER_OBSERVATIONENV_CONSOLIDATION_MAX_ATTEMPTS"DEFAULT_CONSOLIDATION_MAX_ATTEMPTSENV_OBSERVATIONS_MISSIONDEFAULT_OBSERVATIONS_MISSIONENV_MAX_OBSERVATIONS_PER_SCOPE"DEFAULT_MAX_OBSERVATIONS_PER_SCOPEENV_RUN_MIGRATIONS_ON_STARTUPENV_DB_POOL_MIN_SIZEENV_DB_POOL_MAX_SIZEENV_DB_COMMAND_TIMEOUTDEFAULT_DB_COMMAND_TIMEOUTENV_DB_ACQUIRE_TIMEOUTDEFAULT_DB_ACQUIRE_TIMEOUTENV_DB_STATEMENT_TIMEOUTDEFAULT_DB_STATEMENT_TIMEOUTENV_WORKER_ENABLEDDEFAULT_WORKER_ENABLEDENV_WORKER_IDDEFAULT_WORKER_IDENV_WORKER_POLL_INTERVAL_MSDEFAULT_WORKER_POLL_INTERVAL_MSENV_WORKER_MAX_RETRIESDEFAULT_WORKER_MAX_RETRIESENV_WORKER_HTTP_PORTDEFAULT_WORKER_HTTP_PORTENV_WORKER_MAX_SLOTSDEFAULT_WORKER_MAX_SLOTSr3  rI   ENV_RETAIN_MAX_CONCURRENTDEFAULT_RETAIN_MAX_CONCURRENTENV_REFLECT_MAX_ITERATIONSDEFAULT_REFLECT_MAX_ITERATIONSENV_REFLECT_MAX_CONTEXT_TOKENS"DEFAULT_REFLECT_MAX_CONTEXT_TOKENSENV_REFLECT_WALL_TIMEOUTDEFAULT_REFLECT_WALL_TIMEOUTENV_REFLECT_MISSION#ENV_REFLECT_SOURCE_FACTS_MAX_TOKENS'DEFAULT_REFLECT_SOURCE_FACTS_MAX_TOKENSENV_RECALL_INCLUDE_CHUNKSDEFAULT_RECALL_INCLUDE_CHUNKSENV_RECALL_MAX_TOKENSDEFAULT_RECALL_MAX_TOKENSENV_RECALL_CHUNKS_MAX_TOKENS DEFAULT_RECALL_CHUNKS_MAX_TOKENSr  ENV_RECALL_BUDGET_FUNCTIONr  ENV_RECALL_BUDGET_FIXED_LOWDEFAULT_RECALL_BUDGET_FIXED_LOWENV_RECALL_BUDGET_FIXED_MIDDEFAULT_RECALL_BUDGET_FIXED_MIDENV_RECALL_BUDGET_FIXED_HIGH DEFAULT_RECALL_BUDGET_FIXED_HIGHENV_RECALL_BUDGET_ADAPTIVE_LOW"DEFAULT_RECALL_BUDGET_ADAPTIVE_LOWENV_RECALL_BUDGET_ADAPTIVE_MID"DEFAULT_RECALL_BUDGET_ADAPTIVE_MIDENV_RECALL_BUDGET_ADAPTIVE_HIGH#DEFAULT_RECALL_BUDGET_ADAPTIVE_HIGHENV_RECALL_BUDGET_MINDEFAULT_RECALL_BUDGET_MINENV_RECALL_BUDGET_MAXDEFAULT_RECALL_BUDGET_MAXENV_DISPOSITION_SKEPTICISMDEFAULT_DISPOSITION_SKEPTICISMENV_DISPOSITION_LITERALISMDEFAULT_DISPOSITION_LITERALISMENV_DISPOSITION_EMPATHYDEFAULT_DISPOSITION_EMPATHYENV_OTEL_TRACES_ENABLEDDEFAULT_OTEL_TRACES_ENABLEDENV_OTEL_EXPORTER_OTLP_ENDPOINTENV_OTEL_EXPORTER_OTLP_HEADERSENV_OTEL_SERVICE_NAMEDEFAULT_OTEL_SERVICE_NAMEENV_OTEL_DEPLOYMENT_ENVIRONMENT#DEFAULT_OTEL_DEPLOYMENT_ENVIRONMENTENV_METRICS_INCLUDE_BANK_IDDEFAULT_METRICS_INCLUDE_BANK_IDENV_AUDIT_LOG_ENABLEDDEFAULT_AUDIT_LOG_ENABLEDENV_AUDIT_LOG_ACTIONSDEFAULT_AUDIT_LOG_ACTIONSENV_AUDIT_LOG_RETENTION_DAYS DEFAULT_AUDIT_LOG_RETENTION_DAYSENV_WEBHOOK_URLDEFAULT_WEBHOOK_URLENV_WEBHOOK_SECRETDEFAULT_WEBHOOK_SECRETENV_WEBHOOK_EVENT_TYPESDEFAULT_WEBHOOK_EVENT_TYPES*ENV_WEBHOOK_DELIVERY_POLL_INTERVAL_SECONDS.DEFAULT_WEBHOOK_DELIVERY_POLL_INTERVAL_SECONDSr  )r  r  r  rG   r   s        r   from_envzHindsightConfig.from_envx  s(    y!13GHHIm,,]0OP\0]0]	 ^
 ^
 ^
Y';=UVV\\^^^^
 #35IJJJ^
 !i(=>>F$	^

 #&bi0I3OgKhKh&i&i"j"j"j^
 #&bi0I3OgKhKh&i&i"j"j"j^
 $&9-G#H#H#PD^
 I&9;RSSS^
  Y';=UVV\\^^^^
 #%),EGd"e"e"k"k"m"m"m^
 &^
 	/222^
  i^
 #344<^
   #29-CSIcEdEd#e#efff!^
"  	*=sCZ?[?[ \ \]]]#^
$ !&bi0GMhIiIi&j&j k k k%^
& ""),?E\A]A]"^"^___'^
( bi=P9Q9QRRSSS)^
* #%),EGd"e"e"e+^
, %'I.IKj$k$k$k-^
.  :bi0BF&K&KLLL/^
0 !%
295Lf+U+U V V V1^
2 &>>Z%[%[%[3^
6 %'I.I$J$J$mNm7^
8 !#	*AC^ _ _ _9^
: .0Y7[-\-\ .87=^
@ (,z")<Z\b2c2c'd'd'dA^
D !#	*A B B JdE^
F !$BI.EsKfGgGg$h$h i i iG^
H #&bi0I3OlKmKm&n&n"o"o"oI^
J "$+C!D!D!dHdK^
L !#	*A3GbCcCc d d j j l l! !M^
P !#	*A B B aFaQ^
T !#	*A B B JdU^
V  "y)?@@HDW^
X  Y';<<  9455/	:Q0R0RSSSa^
d !#	*A B B Jde^
h y677'c")4Q*R*R&S&S&Sk^
n y344$3ry1K'L'L#M#M#Mq^
t y788(uRY7U-V-V'W'W'Ww^
z y344$53M)N)N#O#O#O}^
~ LN9UkKlKlvuRY/E%F%FGGGrv^
@ -EEh,i,i,iA^
B "$+C!D!D!LC^
D !#	*A B B JdE^
F !i(=>>  9566/	:R0S0STTTO^
R "$+C!D!D!LS^
V y788(s295S+T+T'U'U'UY^
\ y455%C	2M(N(N$O$O$O_^
b y899)bi8W.X.X(Y(Y(Ye^
h y455%E")4O*P*P$Q$Q$Qk^
n y011!bi0G&H&H I I Iq^
r .FFj-k-k-ks^
t (*y1O'P'P'XTXu^
v ')i0M&N&N&VRVw^
x %'I.I$J$J % 9;<</	:X0Y0YZZZA^
D (*y1O'P'P'XTXE^
H y=>>.S;_1`1`-a-a-aK^
N y:;;+#bi8Y.Z.Z*[*[*[Q^
T y>??/eBI>c4d4d.e.e.eW^
Z y:;;+%	:[0\0\*]*]*]]^
` y677'eBI6S,T,T&U&U&Uc^
d 4LLv3w3w3we^
h !#	*AC^ _ _ _i^
j $&9-GIg#h#h#hk^
l (*y.4V0W0W( (egg( (m^
t 02y6<f8g8g0 0egg0 0u^
|  "y)?@@@}^
~ (*y1O'P'P'XTX^
@ *=0	:;;4* * *A^
L ')i0M&N&N&oRTR[\nRoRoM^
N %'I.IKj$k$k$kO^
P (*y1O'P'P'XTXQ^
T YFGGG1AW^
Z +-)4U*V*V +*y/00+*y))_^
` )+	2QSv(w(w(wa^
d )+	2Q(R(R )Iy-/GHHg^
h (*y1O'P'P'rTVT]^qTrTri^
j &(Y/KMm%n%n%nk^
n ,.95W+X+X+Xo^
p *,02V* * *q^
v -/I6Y,Z,Z,b^bw^
z YKLLL6SVVV}^
~ 469:<j4 4 4^
F ')i0M&N&N&lRTR[\kRlRlG^
H %'I.IKj$k$k$kI^
J 58	?GHH 5 5 5K^
V *,0899* * egg	* *W^
` ,.95W+X+X ,6y455c^
d (*y1O'P'P'vTVT]^uTvTve^
f 57I>i4j4j 5?y=>>i^
l !i(=?XYYYm^
n "$+CEa!b!b!bo^
p &(Y,c2R.S.S& &egg& &q^
x +.	;SAf=g=ghh+ + +y^
~ .0Y4c:b6c6c. .egg. .^
F !#	*A3GbCcCc d d j j l l! !G^
J ,.92C8^4_4_, ,egg, ,K^
R '*	7=^9_9_``' ' 'S^
X  Y';<<<Y^
Z %(	2MsSrOsOs(t(t$u$u$u[^
\ ),	93?b;c;cdd) ) )]^
b ',	7=^9_9_``' ' 'c^
h %(	2MsSrOsOs(t(t$u$u$ui^
l %'I.I$J$J$kbiXjNkNkm^
n #%),EGd"e"e"eo^
p &(Y/K%L%L%TPTq^
t )+	2Q(R(R )*y/00)*y))y^
z ')i0MOp&q&q&q{^
~ ')i0M&N&N 'Iy-/GHHA^
B &(Y/K%L%L%nPRPYZmPnPnC^
D $&9-GIg#h#h#hE^
H YFGGG1=A<K^
N *,3S)T)T)TO^
P (*y1OQs't't'tQ^
R +-)4U*V*V*^Z^S^
V *,3S)T)T)TW^
X (*y1OQs't't'tY^
Z +-)4U*V*V*^Z^[^
^ *,3S)T)T)T_^
` (*y1OQs't't'ta^
b +-)13X+ + +c^
j #%),EGd"e"e"ek^
l (*y1O'P'P (6y455o^
p 13	:a0b0b 1?y=>>s^
v 8\222w^
x RYx66777y^
z i/@AAA{^
| i/@AAA}^
~ y1CDDJJLLL^
@ ,BI6I2,N,NOOWSWA^
B 	/37J3K3KLLRRTTX^^^C^
F y.//+kk")<Q2R2R2X2XY\2]2]kkkk*I^
J )$5s;P7Q7QRRXXZZ^dddK^
L $&9-GMkIlIl#m#m#s#s#u#u$ $M^
P #?ryIb?c?c"d"d"dQ^
T I&9;RSSSU^
V #&bi0I3OlKmKm&n&n"o"o"oW^
X &)	6<\8]8]^^& & &Y^
^ %(	2MsSrOsOs(t(t$u$u$u_^
` .1	>Dl@m@mnn. . .a^
f -0	=sCj?k?kll- - -g^
l $)3MsSqOrOr)s)s#t#t#tm^
p #%),Ew"O"O"U"U"W"W[a"a"aq^
r )$5w??EEGG6QQs^
v *-	:C@d<e<eff* * *w^
| ""),A3G`CaCa"b"bccc}^
~ )+	/5X1Y1Y) )egg) )^
F	 $=	46TUU$ $ $G	^
L	 9%788R<RM	^
N	 (*y1O'P'P'vTvO	^
P	 %'I.I$J$J$mNmQ	^
R	 87S	^
T	 !$BI.EsKfGgGg$h$h i i iU	^
V	 "$+CEa!b!b!bW	^
X	 "$+CSIeEfEf!g!g!m!m!o!o" "Y	^
\	 03	@#FpBqBqrr0 0 0]	^
b	 %(	2MsSrOsOs(t(t$u$u$uc	^
f	 !i(=?XYYYg	^
h	 $&9-G#H#H#PDi	^
j	 $&9-G#H#H#PDk	^
l	 &(Y/K%L%L%TPTm	^
n	 +-)4U*V*V*^Z^o	^
p	 /1i8].^.^.fbfq	^
r	 %'I.I$J$J$Rds	^
t	 24;c1d1d1lhlu	^
v	 *,3S)T)T)\X\w	^
x	 -/I6Y,Z,Z,b^by	^
z	 ,.95W+X+X+`\`{	^
|	 (	/CV(W(WXXX}	^
@
 y233#/")<U2V2V"W"W"WC
^
D
 $&9-G#H#H#PDE
^
F
 %'I.I$J$J$RdG
^
H
 -/I6Y,Z,Z,b^bI
^
J
 /2	?EnAoAopp/ / /K
^
P
 ,/	<cBh>i>ijj, , ,Q
^
V
 $&9-GMkIlIl#m#m#s#s#u#u$ $W
^
Z
 &(Y,c2R.S.S& &egg& &[
^
d
 !#	*A3GbCcCc d d j j l lpv v ve
^
f
 (*y.4V0W0W( (egg( (g
^
n
 )+	/5X1Y1Y) )egg) )o
^
v
 &)	6<\8]8]^^& & &w
^
|
 25	<DEE 2 2 2}
^
H *-	:C@d<e<eff* * *I^
N &)	6<\8]8]^^& & &O^
T )+	2QSv(w(w(wU^
V 36	CSIvEwEwxx3 3 3W^
\ CF	MUVV C C C]^
h (+	8#>`:a:abb( ( (i^
n "$+C!D!D!dHdo^
p (+	8#>`:a:abb( ( (q^
v $w^
x &*Ty^
| ')i0Mv&V&V&\&\&^&^bh&h&h}^
@ !+?E]A^A^!_!_```A^
B !+?E]A^A^!_!_```C^
D  #29-CSIcEdEd#e#efffE^
F  #29-CSIcEdEd#e#efffG^
H "%RY/GMiIjIj%k%k!l!l!lI^
L 9%7=S9T9TUU[[]]agggM^
N i..C2CO^
P %(	2MsSrOsOs(t(t$u$u$uQ^
R  #29-CSIcEdEd#e#efffS^
T !+?E]A^A^!_!_```U^
V !+?E]A^A^!_!_```W^
X& &3P3V3V3X3X& & & &Y^
b #&bi0I3OlKmKm&n&n"o"o"oc^
f $'ry1KSQoMpMp'q'q#r#r#rg^
h (+	8#>`:a:abb( ( (i^
n "%RY/GMiIjIj%k%k!l!l!lo^
p I&9::Bdq^
r -0	=sCj?k?kll- - -s^
x #%),EsKhGiGi"j"j"p"p"r"r##$ #$y^
| ""),A3G`CaCa"b"bccc}^
~ &)	6<\8]8]^^& & &^
D $D	46TUU$ $ $E^
J %(	2MsSrOsOs(t(t$u$u$uK^
L %(	2MsSrOsOs(t(t$u$u$uM^
N &)	6<\8]8]^^& & &O^
T (-	8#>`:a:abb( ( (U^
Z (-	8#>`:a:abb( ( ([^
` ).	93?b;c;cdd) ) )a^
f ""),A3G`CaCa"b"bcccg^
h ""),A3G`CaCa"b"bccci^
n y344$03ry1K'L'L#M#M#M/q^
t y344$03ry1K'L'L#M#M#M/w^
z y011!-BI.E$F$F G G G,}^
@ !#	*A3GbCcCc d d j j l l#!$ !$A^
D )+	2Q(R(R(ZVZE^
F (*y1O'P'P'XTXG^
H !i(=?XYYYI^
J )+	2QSv(w(w(wK^
L %'I.I3OnKoKo$p$p$v$v$x$x#%$ %$M^
R !i(=sC\?]?]^^ddffjpppS^
T #%9-BD]#^#^#d#deh#i#i   U^
Z &)	6<\8]8]^^& & &[^
b 	/22I6Ic^
d 9%788R<Re^
f! !#:<WXX^^_bcc! ! ! !g^
p 47	>FGG 4 4 4q^
~ 	r   c                     | j         r| j         S | j                                        }|dk    rdS |dk    rdS |dk    rdS dS )z6Get the LLM base URL, with provider-specific defaults.rR  zhttps://api.groq.com/openai/v1rV  zhttp://localhost:11434/v1rX  zhttp://localhost:1234/v1rl  )r  r  r@   )r$   r  s     r   get_llm_base_urlz HindsightConfig.get_llm_base_urla  sb     	%$$$**,,v33!!..##--2r   c                     t           j        t           j        t           j        t           j        t           j        t           j        d}|                    | j                                        t           j                  S )zBGet the Python logging level from the configured log level string.)criticalerrorr  rm  debugtrace)	r  r  r  r  r  r  r  rc  r@   )r$   log_level_maps     r   get_python_log_levelz$HindsightConfig.get_python_log_levelp  sW      (]L]]
 
   !5!5!7!7FFFr   c                    t          j                    }|                    |                                            |j        dd         D ]}|                    |           t          j        t          j                  }|                    |                                            | j	        dk    rA| j
        rt          | j
                  nd}|                    t          |                     n'|                    t          j        d                     |                    |           t          j        d                              t           j                   dS )zConfigure Python logging based on the log level and format.

        When log_format is "json", outputs structured JSON logs with a severity
        field that GCP Cloud Logging can parse for proper log level categorization.
        Nr  )r  z4%(asctime)s - %(levelname)s - %(name)s - %(message)szgoogle_genai.models)r  	getLoggersetLevelr  handlersremoveHandlerStreamHandlersysstdoutrd  re  r  setFormatterr  	Formatter
addHandlerr  )r$   root_loggerhandleralloweds       r   configure_loggingz!HindsightConfig.configure_logging|  sE    '))T6688999 #+AAA. 	/ 	/G%%g.... '
332244555?f$$9=9MWi 4555SWG  g!F!F!FGGGG  !23i!j!jkkkw''' 	/0099'/JJJJJr   c                 *   t                               dt          | j                   d| j         d           | j        r/t                               dt          | j                              | j        r/t                               dt          | j                              t                               d| j         d| j                    | j	        s| j
        r<| j	        p| j        }| j
        p| j        }t                               d| d|            | j        s| j        r<| j        p| j        }| j        p| j        }t                               d	| d|            | j        s| j        r<| j        p| j        }| j        p| j        }t                               d
| d|            t                               d| j                    t                               d| j                    t                               d| j                    dS )z9Log the current configuration (without sensitive values).z
Database: z
 (schema: r  z%Read database (recall queries only): zMigration database: zLLM: provider=z, model=zLLM (retain): provider=zLLM (reflect): provider=zLLM (consolidation): provider=zEmbeddings: provider=zReranker: provider=zGraph retriever: N)r  rm  r   r  r  r  r  r  r  r  r  r  r  r  r  r#  r>  rk  )r$   retain_providerretain_modelreflect_providerreflect_modelconsolidation_providerconsolidation_models          r   
log_configzHindsightConfig.log_config  s8   l!6t7H!I!IllUYUilllmmm! 	qKKo@UVZVl@m@mooppp& 	eKKc/DTE`/a/accdddPT%6PPPPQQQ# 	[t'< 	["6K$:KO0BDNLKKY/YY<YYZZZ$ 	^(> 	^#8MD<M 2DdnMKK\3C\\]\\]]]* 	pd.J 	p%)%D%YHY""&">"P$.KKn9OnnYlnnoooFD,DFFGGGB$*@BBCCC>(<>>?????r   r<   N)r<   r   )r   r   r   r   r	   __annotations__r0   r  rk  r  listboolrm  r  r  r  propertyr  classmethodsetr#   r  r  r  r  r  r  r  r  r  r   r   r   r   r   ]  s        44 45555 Tz!!!$J&&& tNNN* 4Z'''t   	t   #Tk))) !4Z'''&)Dj000 !%t+++ t###*$$$t### t###d
"""Dj   t###"Tz)))$J&&& %,,,!DL((($$$%)D[000*$$$t###Tz!!!*$$$ #d
*** 4Z'''!&---"T\)))%%%&*Tk111 #d
***"Tz))) 4Z''' #d
***&)Dj000#&:---',t|333#(4<///$t|+++,04K777  $$$$(,,,,d
""" #d
***"Tz)))     #d
***),t333#&:---!$$$$!$$$$ #d
***!!!!$'$J..."%%%%%(4Z///.1Dj888,/$J666"Tz)))    -04Z777"&&&&$'$J... #d
***-04Z777 """"#&&&&&****$((((""""Dj       !$$$$$$$$     4Z'''!Dj(((!$t+++""""""""!Dj(((),t333"%*,,, #####&:---"%*,,, #####&:---"%*,,, #####&&&& #d
***),t333 III
IIINNNNNNOOO#Y%%%%Cy4''''      $;&&& !!!!    &))))%((((!!!! #&%%%!%%%%$J #d
*** 4Z'''d{"""(++++     $J&&&$J&&&!Dj(((#&:---'*Tz111 4Z'''*-*444"%*,,,%(4Z///$'$J...c9t++++$J&&& 4Z'''%(4Z///'****$''''    """"  $$$$!%%%%!!!!*----"%%%%!!!!!$$$$+....;>>>> ####*$$$ #### $; #""" 4Z%((((  !!!!          !!!! %%%% %%%%!&&&&  $J&&&$J&&&t###    $###  Tz    "38n,,,   #### !$t+++ #d
***!$$$$!!!! Cy   !!!! t$Jc""",//// )M #LLL
# # #P- - -^ Dc D D D XD /C / / / [/ 
-c#h 
- 
- 
- [
- -C - - - [- 5#c( 5 5 5 [5 D D D DL f f f [fP#    
Gc 
G 
G 
G 
GK K K K8@ @ @ @ @ @r   r   _config_cachec                  8    t          t                                S )a^  
    Get global configuration with ONLY static (non-configurable) fields accessible.

    This returns a proxy that prevents access to bank-configurable fields
    (like enable_observations, retain_chunk_size, etc.).

    For bank-specific configuration, use:
        config_resolver.resolve_full_config(bank_id, context)

    This design prevents accidentally using global defaults when bank-specific
    overrides exist.

    Returns:
        StaticConfigProxy that only exposes static infrastructure fields

    Raises:
        ConfigFieldAccessError: If you try to access a bank-configurable field
    )r   _get_raw_configr   r   r   
get_configr    s    & _..///r   c                  P    t           t                                          a t           S )z
    Get raw config (internal use only).

    INTERNAL USE ONLY. Do not use this directly in application code.
    Use get_config() for static fields or ConfigResolver.resolve_full_config() for bank-specific config.
    )r  r   r  r   r   r   r  r    s!     '0022r   c                  
    da dS )z?Clear the config cache. Useful for testing or reloading config.N)r  r   r   r   clear_config_cacher    s     MMMr   r  (  r   r  r  r  r  dataclassesr   r   r   r   r   typingr   r	   dotenvr
   r   _vector_indexr   utilsr   r  r   r  r.   r   r   r2   r:   r0   rA   r  rJ   r  r  r  r  r  r  r  r  r  r  r   r!  r#  r%  r'  r)  r+  r-  r/  r0  r1  r,  r.  DEFAULT_LLM_EXTRA_BODYDEFAULT_LLM_DEFAULT_HEADERSrD  rE  rF  rG  rH  rI  rJ  rK  rL  rM  rN  rO  rP  rQ  rR  rS  rT  rU  rV  rW  rX  rY  rZ  r[  r\  r]  r^  r_  r`  ra  rb  rd  rf  rh  rj  ENV_EMBEDDINGS_OPENAI_API_KEYENV_EMBEDDINGS_OPENAI_MODELrk  rl  r  r  r  r  r  r  r  rn  rp  rr  rs  r  r  r  ru  rt  rv  r  r  ro  rx  r{  r}  r  r  r  r  r  r  r  r  r  r  r  r  ry  r|  r  r  r  r  r  r  r  r  r  r  r  r  r  ENV_RERANKER_FLASHRANK_MODEL ENV_RERANKER_FLASHRANK_CACHE_DIR$ENV_RERANKER_FLASHRANK_CPU_MEM_ARENAr  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  ENV_WORKERSr  r  r  r  r  r  r  r  r  r  r  r  rp  rr  rs  rt  rv  rx  r2  r4  r6  r8  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  r  r  r  r  r  r  r  r  r!  r#  r%  r)  r+  r'  r-  r/  r1  r  r  r  r  r  r  r9  r:  r<  r>  r@  rB  r  r  r3  r4  r5  r6  r8  r:  r<  r>  r@  rB  rD  rF  r3  tupler  r  rH  rJ  rL  rN  rP  rQ  rS  rU  rW  rY  rZ  r\  r^  r`  rb  rd  rf  rh  rz  r|  r~  rj  rl  rn  r  r  r  r  r  r  r;  r=  r?  rA  rC  r"  r$  r&  r(  r*  r3  r5  r7  "DEFAULT_LLM_GEMINI_SAFETY_SETTINGSrc  re  rg  ri  DEFAULT_EMBEDDINGS_OPENAI_MODELrm  r  r  r  DEFAULT_EMBEDDING_DIMENSIONr  r  r  r  r  r  r  r  r  r  r  r   DEFAULT_RERANKER_FLASHRANK_MODEL$DEFAULT_RERANKER_FLASHRANK_CACHE_DIR(DEFAULT_RERANKER_FLASHRANK_CPU_MEM_ARENArq  r  rw  r  r  r  r  r  r  r  rz  r~  r  rj  r  r  r  r  r  r  r  r  DEFAULT_WORKERSr  ro  r  r  r  rp  r  r  r  r  r  r  r  r  r  r  r  r  r  r  r  rx  r  r  r  r  r  r   r  DEFAULT_FILE_PARSER_ALLOWLISTr  r  r  r  r  r  r  r.  r   r"  r$  r&  r(  r*  r,  r0  r2  !DEFAULT_RUN_MIGRATIONS_ON_STARTUPr  r  r7  r9  r;  r=  r?  rA  rC  rE  rG  rI  rK  rM  rO  rR  rT  rV  rX  r  r  r[  r]  r_  ra  rc  re  rg  ri  rk  rm  ro  rq  ru  rw  ry  r{  r}  r  DEFAULT_MCP_RETAIN_DESCRIPTIONDEFAULT_MCP_RECALL_DESCRIPTIONEMBEDDING_DIMENSIONr  r  r  r  r  r  r  r  r  r  r  r  r  r   r  r  r  r  r   r   r   <module>r     se       				 



 0 0 0 0 0 0 0 0 0 0 ' ' ' ' ' ' ' '         + + + + + + + + - - - - - - ( ( ( ( ( ( KKt$$$t 4 4 4 4		8	$	$	 	 	 	 	^ 	 	 	c c c c c c c c@I I IJ J Jc c    (C$sCx. CT#s(^ C C C C$ 8 / 9 A A C 5 / -)/ ; 5 = 5 -A E 3 =   H  !' "&   
 > ; 7 =  I C !K C ; &U #? = 9 ? !K E "M E = 'W $!K  I E !K 'W $$Q !(Y %$Q ! I -c *= C !K )[ &;  I E !K #O   !J E .e +#O  %S "!K .e + !J E !K *] 'E A G  < $Q !"M "M  I  4  #N !K G  I G C *] ' &T "#O  &U #/g ,-c *#O  !K $Q ! 8 5 9 ? G $Q !'W $= %S " I 7 E "M  I E G #O  'W $ $P  !K $Q ! $P  !K $Q ! B !K *] '7 A ))+5 %-9 1 C A 5 A G E 'W $&U #C  > "M !K 9 "M E  F = 'W $ "L  $P  9 "M C 3 !K E = ? ? )[ &E  : C C G $Q !(Y %E +_ (#O  &U #%S "-A C E &U #(Y %%S "C G  > G +_ (#O  G ,a )I : #N !K ? !K !K "M  .3 = -c * > = A ? = =  B 1  !J  8 7 ; ; ?  4 )E ; 7 7  I:TV	= = tCsCx$89    B  D !K ? 5 &U #A 9 G  D E E G !K !K "M 9 9  : 9 G  D C =  (  "  m#   !	
 ~ # 
? l    . N / L F  }!" +#$  #'   * "    $ # # "   !    #' + +/ ( &* "% !9 %* "-2 *": '* $"8 25 /', $! # E #(  () %	 ) $ ). &$& !"% &' #$( !"% #<  '+ $+0 ("6  5  'F #$8 !%/ "%> "(G % =  &  !)  3 #;  != :> +S4Z > > > (C $18 .%A "    .2 49t+ 2 2 2 !% -1 td{ 1 1 1*  " #$  "% +, (*- '!%  (- $  &* #!* P  %) ""& )- 4$; - - -   % ( $ -/ * % "  $ ,/ ))+ &!% #'   # %) "&* #%& "#%   - () $#&  &+ # .  >  $ %' " %) !     "    "%     !  "$ %, "" *, ' $   #'   0 !( "% "% #'  %* "%* "&* #    "& !% "  $ + &3 #"'  "  #%  	"1 "6  2    7 13 .)% )% )% )% )%G% )% )% )%X>3 >49 > > > >
c d
 S S    &	C 	C 	 	 	 		s 	s 	 	 	 	Lc Lc L L L L
Ic IdTk I I I I$cDj TD[    ( P@ P@ P@ P@ P@ P@ P@ P@h" )-% , , ,0% 0 0 0 0,
 
 
 
 
     r   