
    j                        d dl mZ d dlZd dlmZ d dlmZmZ d dlm	Z	m
Z
  ej        e          Z G d de	          Z e            Ze                    dej                   dS )	    )annotationsN)Optional)Fieldfield_validator)BaseSettingsSettingsConfigDictc                  J   e Zd ZU dZ edddd          ZdZded	<   d
Zded<   dZ	ded<   dZ
ded<    edd          Zded<   dZded<   dZded<   dZded<    edd          Zded<   dZded<    edd          Zded <    edd!          Zded"<   d#Zded$<   d%Zded&<   d'Zded(<    edd)          Zded*<   d+Zded,<   d+Zded-<   d%Zded.<   d'Zded/<    edd0          Zded1<   d2Zded3<   d4Zded5<   d'Zded6<    edd7          Z ded8<   d9Z!ded:<   d;Z"ded<<   d=Z#ded><   d'Z$ded?<   d@Z%dedA<   dBZ&dedC<   dDZ'dedE<   dFZ(dedG<   dHZ)dedI<   dJZ*dedK<   dFZ+dedL<   dMZ,dedN<   dOZ-dedP<    e.d          e/dYdS                        Z0e1dZdU            Z2e1d[dW            Z3dXS )\Settingsa_  Single source of truth for every runtime value.

    Secrets are mandatory at construction: they have no defaults. The only
    values with defaults are operational tuning knobs (timeouts, concurrency,
    cron parameters, the OG site name). Anything missing at boot surfaces a
    clean ValidationError long before the orchestration ever starts.
    z.envzutf-8Tignore)env_fileenv_file_encodingcase_sensitiveextra
productionstrAPP_ENVz0.0.0.0APP_HOSTi@  intAPP_PORTz12.0.0APP_VERSION.z@Comma-separated bearer tokens accepted by POST /api/v1/brief/run)descriptionBRIEF_SERVICE_API_KEYSzAmerica/Los_AngelesAPP_TIMEZONE   DAYS_TO_SHOW   SHOW_CONCURRENCYz0postgresql://user:pass@host:5432/city_briefs_opsDATABASE_URLzhttps://planner.maxify.itSCC_BASE_URLz3Bearer token for planner.maxify.it /api/* read APIsSCC_API_KEYzPerplexity Sonar API keyPERPLEXITY_API_KEYz	sonar-proPERPLEXITY_MODEL<   PERPLEXITY_TIMEOUT   PERPLEXITY_MAX_CONCURRENCYzOpenAI API key (gpt-4o)OPENAI_API_KEYzgpt-4oOPENAI_FACT_CHECK_MODELOPENAI_GENERATION_MODELOPENAI_TIMEOUTOPENAI_MAX_CONCURRENCYzAnthropic API key (Claude)ANTHROPIC_API_KEYzclaude-sonnet-4-6ANTHROPIC_RANKING_MODELZ   ANTHROPIC_TIMEOUTANTHROPIC_MAX_CONCURRENCYzYouTube Data API v3 keyYOUTUBE_API_KEYUCQTmZczX5kGRgaPIgpy6CyQYOUTUBE_CHANNEL_ID   YOUTUBE_MAX_VIDEOS   YOUTUBE_TIMEOUTYOUTUBE_MAX_CONCURRENCYz./voice_profilesVOICE_PROFILES_DIRz	max-aminiDEFAULT_COMEDIAN_IDzhttps://just2done.com/briefPUBLIC_BASE_URL INTERNAL_PUBLIC_BASE_URLz/brief-outputBRIEF_OUTPUT_DIRz(https://just2done.com/brief/og-cover.jpgOG_COVER_URLINTERNAL_OG_COVER_URLz	Max AminiOG_SITE_NAMEz#city-brief-alertsSLACK_ALERTS_CHANNELvreturnc                f    d                     d |                    d          D                       S )N,c              3  f   K   | ],}|                                 |                                 V  -d S )N)strip.0ss     1/workspace/show-city-briefing-agent/app/config.py	<genexpr>z'Settings._strip_keys.<locals>.<genexpr>f   s7      EEa17799E		EEEEEE    )joinsplit)clsrC   s     rL   _strip_keyszSettings._strip_keysc   s/     xxEE1773<<EEEEEErN   set[str]c                J    d | j                             d          D             S )Nc                    h | ]}||S  rV   rI   s     rL   	<setcomp>z-Settings.accepted_api_keys.<locals>.<setcomp>j   s    GGGaQGGGGrN   rF   )r   rP   selfs    rL   accepted_api_keyszSettings.accepted_api_keysh   s'    GG46<<SAAGGGGrN   dict[str, str]c                    | j         rdnd| j        rdnd| j        rdnd| j        rdnd| j        rdnd| j        rdnddS )u)   Names only — never values. Safe to log.z<set>z<unset>)scc_api_keyperplexity_api_keyopenai_api_keyanthropic_api_keyyoutube_api_keybrief_service_api_keys)r    r!   r'   r,   r1   rZ   rX   s    rL   credentials_summaryzSettings.credentials_summaryl   sm     '+&6E77I-1-D"S''))-)<Kgg),0,B!Q	*.*>MwwI151G&VggY
 
 	
rN   N)rC   r   rD   r   )rD   rS   )rD   r[   )4__name__
__module____qualname____doc__r   model_configr   __annotations__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   r3   r5   r7   r8   r9   r:   r;   r=   r>   r?   r@   rA   rB   r   classmethodrR   propertyrZ   rc   rV   rN   rL   r
   r
      s          &%!	  L  GHHK"'%V# # #     .L----L F  L     4L3333uI  K     $eC5OPPPPPPP'''''     &'''''  %1JKKKNKKKK#+++++#+++++N"##### #U34PQQQQQQQ#66666%&&&&& !52KLLLOLLLL88888O#$$$$$ 10000***** 9O8888 %'&&&&+++++BLBBBB!######L#### !54444 _-..F F F [ /.F H H H XH 	
 	
 	
 X	
 	
 	
rN   r
   zsettings loaded: %s)
__future__r   loggingtypingr   pydanticr   r   pydantic_settingsr   r   	getLoggerrd   loggerr
   settingsinforc   rV   rN   rL   <module>ru      s    " " " " " "        + + + + + + + + > > > > > > > >		8	$	$j
 j
 j
 j
 j
| j
 j
 j
Z 8:: !8#? @ @ @ @ @rN   