
    r~j                       U d Z ddlmZ ddlmZmZ ddlmZmZmZ ddl	m
Z
mZmZ  G d de
          Z G d d	e
          Z G d
 de
          Z G d de
          Z G d de
          Z G d de
          Z G d de
          Z G d de
          Z G d de
          Z G d de
          Z G d de          Zed         Zed         Zed         ZdZd ed!<    G d" d#e
          Z G d$ d%e
          Zd&S )'u   Pydantic domain models.

These are the typed shapes passed between pipeline stages and the API layer.
They are deliberately independent of any DB row or external API response — the
providers and repositories convert to/from these.
    )annotations)datedatetime)AnyLiteralOptional)	BaseModel
ConfigDictFieldc                  ~    e Zd ZU dZ ed          Zded<   ded<   ded<   ded	<   d
Zded<   d
Zded<   d
Z	ded<   d
S )Showz@A show exactly DAYS_TO_SHOW days out (the orchestration target).allowextrastrshow_idr   	show_datecitycountryNOptional[str]venueOptional[int]capacity
ticket_url)
__name__
__module____qualname____doc__r
   model_config__annotations__r   r   r        c/Users/abstractioneditor2/ai-workstation/projects/automation/show-city-briefing-agent/app/models.pyr   r      s         JJ:G,,,LLLLOOOIIILLLE"H"""" $J$$$$$$r"   r   c                      e Zd ZU dZ ed          Zded<   ded<   ded<   ded	<   d
Zded<   d
Zded<   d
Z	ded<   d
Z
ded<   d
S )PastShowzDThe most recent past Max Amini show in the same city (ignore venue).r   r   r   r   r   r   r   r   Nr   r   r   r   tickets_soldzOptional[float]sold_pct)r   r   r   r   r
   r   r    r   r   r&   r'   r!   r"   r#   r%   r%       s         NN:G,,,LLLLOOOIIILLLE"H"""""&L&&&& $H$$$$$$r"   r%   c                      e Zd ZU dZded<   ded<   ded<    ee          Zded<    ee          Zded	<    ee          Z	ded
<    ee          Z
ded<    ee          Zded<    ee          Zded<   dS )VoiceProfileu   Loaded from voice_profiles/<comedian>.json — comedian IP guidance.

    Holds tone, persona, signature bits, topics to lean into and sensitivities
    to avoid. AI stages consume this in their prompts.
    r   comedian_iddisplay_namepersonadefault_factory	list[str]tonesignature_bitstopics_to_lean_intosensitivities_to_avoidzdict[str, list[str]]
vocabularydict[str, Any]r   N)r   r   r   r   r    r   listr0   r1   r2   r3   dictr4   r   r!   r"   r#   r)   r)   1   s           LLLeD111D1111 %d ; ; ;N;;;;%*U4%@%@%@@@@@(-d(C(C(CCCCC',uT'B'B'BJBBBB!E$777E777777r"   r)   c                      e Zd ZU ded<    ee          Zded<    ee          Zded<   dZded	<    ee          Z	ded
<    ee
          Zded<   dS )CityIntelligencer   r   r-   r/   points_of_prider3   Nr   local_conversation_todayaudience_competitorsr5   raw_provider_payload)r   r   r   r    r   r6   r:   r3   r;   r<   r7   r=   r!   r"   r#   r9   r9   E   s         III!&t!<!<!<O<<<<(-d(C(C(CCCCC.22222&+eD&A&A&AAAAA+05+F+F+FFFFFFFr"   r9   c                  N    e Zd ZU ded<   ded<   dZded<   dZded<   dZd	ed
<   dS )NewsItemr   titlesummaryNr   r   urlFboolis_competitor)r   r   r   r    r   rB   rD   r!   r"   r#   r?   r?   N   sW         JJJLLLDCMr"   r?   c                  T    e Zd ZU  ee          Zded<    ee          Zded<   dS )PerplexityNewsResultr-   zlist[NewsItem]recent_newscompetitor_warningsN)r   r   r   r   r6   rG   r    rH   r!   r"   r#   rF   rF   V   sO         "'%"="="=K====*/%*E*E*EEEEEEEr"   rF   c                  6    e Zd ZU ded<   dZded<   dZded<   dS )	VerifiedFactr   claimmediumz Literal['high', 'medium', 'low']
confidenceNr   source)r   r   r   r    rM   rN   r!   r"   r#   rJ   rJ   [   s=         JJJ3;J;;;; F      r"   rJ   c                  $    e Zd ZU ded<   ded<   dS )RemovedFactr   rK   removed_reasonN)r   r   r   r    r!   r"   r#   rP   rP   a   s'         JJJr"   rP   c                  T    e Zd ZU  ee          Zded<    ee          Zded<   dS )FactCheckResultr-   zlist[VerifiedFact]verified_factszlist[RemovedFact]removed_factsN)r   r   r   r   r6   rT   r    rU   r!   r"   r#   rS   rS   f   sN         ).t)D)D)DNDDDD',uT'B'B'BMBBBBBBr"   rS   c                  @    e Zd ZU dZded<   ded<   ded<   dZded<   dS )	GeneratedIdeaz&One of the 20 GPT-4o crowd-work ideas.r   r@   anglecity_specificityNr   	risk_note)r   r   r   r   r    rZ   r!   r"   r#   rW   rW   k   sG         00JJJJJJ#I######r"   rW   c                  :    e Zd ZU dZded<   dZded<   dZded<   dS )
RankedIdeaz9A GPT-4o idea after Claude's rank / filter pass (top 10).intrankNr   	reasoningsafety_notes)r   r   r   r   r    r_   r`   r!   r"   r#   r\   r\   t   sC         CCIII#I####"&L&&&&&&r"   r\   )pending
generating	generated	deploying	publishedfailed)runningokrf   partial)ra   rg   rh   rf   skipped)
hub_lookupprevious_show_lookuphistorical_sales_lookupvoice_profile_loadyoutube_transcriptsperplexity_cityperplexity_newsopenai_fact_checkopenai_generationclaude_rankinghtml_generationvps_deploymenturl_verificationog_verificationztuple[str, ...]STAGE_COLUMNSc                  v   e Zd ZU dZ ed          Zded<   ded<   ded<   ded	<   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<   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<   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!<   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(<   dS ))BriefRecordz Snapshot row from `city_briefs`.r   r   r   brief_idr   r   r   r   r   Nr   r   r   r   z	max-aminir*   Optional[datetime]generated_atpublished_atOptional[date]previous_show_dateprevious_show_venueprevious_tickets_soldzOptional[dict[str, Any]]city_intelligencezOptional[list[Any]]rG   rT   rU   generated_topicsranked_topics
crowd_workrH   
public_urlra   BriefStatusstatusgeneration_durationerror)r   r   r   r   r
   r   r    r   r   r*   r~   r   r   r   r   r   rG   rT   rU   r   r   r   rH   r   r   r   r   r!   r"   r#   r{   r{      s        **:G,,,LMMMLLLOOOIIILLLE"H"""""K""""'+L++++'+L++++)-----)-----+/////266666'+K++++*.N....)-M----,00000)-M----&*J****/33333 $J$$$$#F####)-----Er"   r{   c                  x   e Zd ZU dZ e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<   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<   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<   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<   dZd ed!<   dZd"ed#<   dZded$<   d%Zd&ed'<   dS )(	RunRecorduA   Snapshot row from `city_briefs_runs` — observability per stage.r   r   r   brief_run_idNr   r   r   r   ra   
StageStaterk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   vps_deployment_public_urlrw   rx   r}   
started_atcompleted_atrg   	RunStatusr   r   durationr   r   r]   retry_count)r   r   r   r   r
   r   r    r   r   rk   rl   rm   rn   ro   rp   rq   rr   rs   rt   ru   rv   r   rw   rx   r   r   r   r   r   r   r!   r"   r#   r   r      s        KK:G,,,L!G!!!! $I$$$$&J&&&&'00000*33333%.....&/////"+O++++"+O++++$-----$-----!*N****"+O++++!*N****/33333#,,,,,"+O++++%)J))))'+L++++!F!!!!"H""""EKr"   r   N)r   
__future__r   r   r   typingr   r   r   pydanticr	   r
   r   r   r%   r)   r9   r?   rF   rJ   rP   rS   rW   r\   r   r   r   ry   r    r{   r   r!   r"   r#   <module>r      s     # " " " " " # # # # # # # # ) ) ) ) ) ) ) ) ) ) 1 1 1 1 1 1 1 1 1 1
% % % % %9 % % %% % % % %y % % %"8 8 8 8 89 8 8 8(G G G G Gy G G G         y      F F F F F9 F F F
! ! ! ! !9 ! ! !    )   
C C C C Ci C C C
$ $ $ $ $I $ $ $' ' ' ' ' ' ' ' L 89	DE
"    $         )      @    	     r"   