
    ?if                        d Z ddlmZmZmZ ddlmZmZmZm	Z	 ddl
m
Z
mZ e G d d             Ze G d d             Ze G d	 d
             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Ze G d d             Z	 	 d&deded ed!ed"e	e   d#e	e   d$efd%Zy)'z"Data schemas for last30days skill.    )	dataclassfieldasdict)AnyDictListOptional)datetimetimezonec                      e Zd ZU dZdZee   ed<   dZee   ed<   dZ	ee
   ed<   dZee   ed<   dZee   ed<   dZee   ed<   dZee   ed	<   dZee   ed
<   dZee   ed<   dZee
   ed<   dZee
   ed<   deeef   fdZy)
EngagementzEngagement metrics.Nscorenum_commentsupvote_ratiolikesrepostsrepliesquotesviewssharesvolume	liquidityreturnc                 d   i }| j                   | j                   |d<   | j                  | j                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   | j
                  | j
                  |d<   | j                  | j                  |d<   | j                  | j                  |d<   | j                  | j                  |d	<   | j                  | j                  |d
<   | j                  | j                  |d<   |r|S d S )Nr   r   r   r   r   r   r   r   r   r   r   )r   r   r   r   r   r   r   r   r   r   r   selfds     Q/home/ubuntu/.openclaw/workspace/skills/last30days-official/scripts/lib/schema.pyto_dictzEngagement.to_dict    s   ::!AgJ( $ 1 1An( $ 1 1An::!AgJ<<#<<AiL<<#<<AiL;;"++AhK::!AgJ;;"++AhK;;"++AhK>>%!^^AkNq4    )__name__
__module____qualname____doc__r   r	   int__annotations__r   r   floatr   r   r   r   r   r   r   r   r   strr   r    r    r   r   r      s    E8C="&L(3-&$(L(5/(  E8C=!GXc]!!GXc]! FHSM   E8C= !FHSM  #FHUO"!%Ix% c3h  r    r   c                   `    e Zd ZU dZeed<   ee   ed<   eed<   eed<   eed<   deee	f   fdZ
y	)
CommentzReddit comment.r   dateauthorexcerpturlr   c                 v    | j                   | j                  | j                  | j                  | j                  dS )Nr   r,   r-   r.   r/   r1   r   s    r   r   zComment.to_dictD   s/    ZZIIkk||88
 	
r    N)r!   r"   r#   r$   r%   r&   r	   r(   r   r   r   r)   r    r   r+   r+   ;   s7    J
3-KL	H
c3h 
r    r+   c                   R    e Zd ZU dZdZeed<   dZeed<   dZeed<   de	e
ef   fdZy)		SubScoreszComponent scores.r   	relevancerecency
engagementr   c                 J    | j                   | j                  | j                  dS )Nr5   r6   r7   r9   r2   s    r   r   zSubScores.to_dictU   s!    ||//
 	
r    N)r!   r"   r#   r$   r5   r%   r&   r6   r7   r   r(   r   r)   r    r   r4   r4   N   s7    IsGSJ
c3h 
r    r4   c                   2   e Zd ZU dZeed<   eed<   eed<   eed<   dZee   ed<   dZeed	<   dZ	ee
   ed
<    ee      Zee   ed<    ee      Zee   ed<   dZeed<   dZeed<    ee      Zeed<   dZeed<    ee      Zee   ed<   deeef   fdZy)
RedditItemzNormalized Reddit item.idtitler/   	subredditNr,   lowdate_confidencer7   default_factorytop_commentscomment_insights      ?r5    why_relevantsubsr   r   
cross_refsr   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  r| j                  j                         nd | j                  D cg c]  }|j                          c}| j                  | j                  | j                  | j                  j                         | j                  d}| j                  r| j                  |d<   |S c c}w )N)r<   r=   r/   r>   r,   r@   r7   rC   rD   r5   rG   rH   r   rI   )r<   r=   r/   r>   r,   r@   r7   r   rC   rD   r5   rG   rH   r   rI   r   cr   s      r   r   zRedditItem.to_dicto   s    ''ZZ88II#337;$//113D262C2CDQQYY[D $ 5 5 --II%%'ZZ
 ??"ooAlO Es   8C6r!   r"   r#   r$   r(   r&   r,   r	   r@   r7   r   r   listrC   r   r+   rD   r5   r'   rG   r4   rH   r   r%   rI   r   r   r   r)   r    r   r;   r;   ]   s    !GJ	HND(3- OS '+J$+"'"=L$w-="'"=d3i=IuL#I6D)6E3N!$7JS	7c3h r    r;   c                       e Zd ZU dZeed<   eed<   eed<   eed<   dZee   ed<   dZeed	<   dZ	ee
   ed
<   dZeed<   dZeed<    ee      Zeed<   dZeed<    ee      Zee   ed<   deeef   fdZy)XItemzNormalized X item.r<   textr/   author_handleNr,   r?   r@   r7   rE   r5   rF   rG   rA   rH   r   r   rI   r   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  r| j                  j                         nd | j                  | j                  | j                  j                         | j                  d}| j                  r| j                  |d<   |S )N)r<   rQ   r/   rR   r,   r@   r7   r5   rG   rH   r   rI   )r<   rQ   r/   rR   r,   r@   r7   r   r5   rG   rH   r   rI   r   s     r   r   zXItem.to_dict   s    ''II88!//II#337;$//113D --II%%'ZZ
 ??"ooAlOr    )r!   r"   r#   r$   r(   r&   r,   r	   r@   r7   r   r5   r'   rG   r   r4   rH   r   r%   rN   rI   r   r   r   r   r)   r    r   rP   rP      s    G
I	HD(3- OS '+J$+IuL#I6D)6E3N!$7JS	7c3h r    rP   c                       e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZee   ed<   d	Zeed
<   dZ	e
ed<   dZeed<    ee      Zeed<   dZeed<    ee      Zee   ed<   deeef   fdZy)WebSearchItemz3Normalized web search item (no engagement metrics).r<   r=   r/   source_domainsnippetNr,   r?   r@   rE   r5   rF   rG   rA   rH   r   r   rI   r   c                 P   | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  j                         | j                  d}| j                  r| j                  |d<   |S )N)r<   r=   r/   rV   rW   r,   r@   r5   rG   rH   r   rI   )r<   r=   r/   rV   rW   r,   r@   r5   rG   rH   r   r   rI   r   s     r   r   zWebSearchItem.to_dict   s    ''ZZ88!//||II#33 --II%%'ZZ
 ??"ooAlOr    )r!   r"   r#   r$   r(   r&   r,   r	   r@   r5   r'   rG   r   r4   rH   r   r%   rN   rI   r   r   r   r   r)   r    r   rU   rU      s    =GJ	HLD(3- OS IuL#I6D)6E3N!$7JS	7c3h r    rU   c                       e Zd ZU dZeed<   eed<   eed<   eed<   dZee   ed<   dZeed	<   dZ	ee
   ed
<   dZeed<   dZeed<   dZeed<    ee      Zeed<   dZeed<    ee      Zee   ed<   deeef   fdZy)YouTubeItemzNormalized YouTube item.r<   r=   r/   channel_nameNr,   highr@   r7   rF   transcript_snippetffffff?r5   rG   rA   rH   r   r   rI   r   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  r| j                  j                         nd | j                  | j                  | j                  | j                  j                         | j                  d}| j                  r| j                  |d<   |S )N)r<   r=   r/   r[   r,   r@   r7   r]   r5   rG   rH   r   rI   )r<   r=   r/   r[   r,   r@   r7   r   r]   r5   rG   rH   r   rI   r   s     r   r   zYouTubeItem.to_dict   s    ''ZZ88 --II#337;$//113D"&"9"9 --II%%'ZZ
 ??"ooAlOr    )r!   r"   r#   r$   r(   r&   r,   r	   r@   r7   r   r]   r5   r'   rG   r   r4   rH   r   r%   rN   rI   r   r   r   r   r)   r    r   rZ   rZ      s    "GJ	HD(3-!OS!'+J$+  IuL#I6D)6E3N!$7JS	7c3h r    rZ   c                      e Zd ZU dZeed<   eed<   eed<   eed<   dZee   ed<   dZeed	<   dZ	ee
   ed
<   dZeed<    ee      Zee   ed<   dZeed<   dZeed<    ee      Zeed<   dZeed<    ee      Zee   ed<   deeef   fdZy)
TikTokItemzNormalized TikTok item.r<   rQ   r/   author_nameNr,   r\   r@   r7   rF   caption_snippetrA   hashtagsr^   r5   rG   rH   r   r   rI   r   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  r| j                  j                         nd | j                  | j                  | j                  | j                  | j                  j                         | j                  d}| j                  r| j                  |d<   |S N)r<   rQ   r/   rb   r,   r@   r7   rc   rd   r5   rG   rH   r   rI   r<   rQ   r/   rb   r,   r@   r7   r   rc   rd   r5   rG   rH   r   rI   r   s     r   r   zTikTokItem.to_dict      ''II88++II#337;$//113D#33 --II%%'ZZ
 ??"ooAlOr    r!   r"   r#   r$   r(   r&   r,   r	   r@   r7   r   rc   r   rN   rd   r   r5   r'   rG   r4   rH   r   r%   rI   r   r   r   r)   r    r   ra   ra      s    !G
I	HD(3-!OS!'+J$+OS5Hd3i5IuL#I6D)6E3N!$7JS	7c3h r    ra   c                      e Zd ZU dZeed<   eed<   eed<   eed<   dZee   ed<   dZeed	<   dZ	ee
   ed
<   dZeed<    ee      Zee   ed<   dZeed<   dZeed<    ee      Zeed<   dZeed<    ee      Zee   ed<   deeef   fdZy)InstagramItemzNormalized Instagram item.r<   rQ   r/   rb   Nr,   r\   r@   r7   rF   rc   rA   rd   r^   r5   rG   rH   r   r   rI   r   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  r| j                  j                         nd | j                  | j                  | j                  | j                  | j                  j                         | j                  d}| j                  r| j                  |d<   |S rf   rg   r   s     r   r   zInstagramItem.to_dict(  rh   r    ri   r)   r    r   rk   rk     s    $G
I	HD(3-!OS!'+J$+OS5Hd3i5IuL#I6D)6E3N!$7JS	7c3h r    rk   c                   <   e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZee   ed<   d	Zeed
<   dZ	ee
   ed<    ee      Zee   ed<    ee      Zee   ed<   dZeed<   dZeed<    ee      Zeed<   dZeed<    ee      Zee   ed<   deeef   fdZy)HackerNewsItemzNormalized Hacker News item.r<   r=   r/   hn_urlr-   Nr,   r\   r@   r7   rA   rC   rD   rE   r5   rF   rG   rH   r   r   rI   r   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  r| j                  j                         nd | j                  D cg c]  }|j                          c}| j                  | j                  | j                  | j                  j                         | j                  d}| j                  r| j                  |d<   |S c c}w )N)r<   r=   r/   ro   r-   r,   r@   r7   rC   rD   r5   rG   rH   r   rI   )r<   r=   r/   ro   r-   r,   r@   r7   r   rC   rD   r5   rG   rH   r   rI   rK   s      r   r   zHackerNewsItem.to_dictP  s    ''ZZ88kkkkII#337;$//113D262C2CDQQYY[D $ 5 5 --II%%'ZZ
  ??"ooAlO Es   DrM   r)   r    r   rn   rn   =  s    &GJ	HKKD(3-!OS!'+J$+"'"=L$w-="'"=d3i=IuL#I6D)6E3N!$7JS	7c3h r    rn   c                   F   e Zd ZU dZeed<   eed<   eed<   eed<    ee      Ze	e
   ed<   dZeed	<   d
Zee   ed<   d
Zee   ed<   dZeed<   d
Zee   ed<   d
Zee   ed<   dZeed<   dZeed<    ee      Zeed<   dZeed<    ee      Ze	e   ed<   deeef   fdZy
)PolymarketItemz-Normalized Polymarket prediction market item.r<   r=   questionr/   rA   outcome_pricesr   outcomes_remainingNprice_movementr,   r\   r@   r7   end_daterE   r5   rF   rG   rH   r   rI   r   c                    | j                   | j                  | j                  | j                  | j                  | j
                  | j                  | j                  | j                  | j                  r| j                  j                         nd | j                  | j                  | j                  | j                  j                         | j                  d}| j                   r| j                   |d<   |S )N)r<   r=   rs   r/   rt   ru   rv   r,   r@   r7   rw   r5   rG   rH   r   rI   )r<   r=   rs   r/   rt   ru   rv   r,   r@   r7   r   rw   r5   rG   rH   r   rI   r   s     r   r   zPolymarketItem.to_dictz  s    ''ZZ88"11"&"9"9"11II#337;$//113D --II%%'ZZ
" ??"ooAlOr    )r!   r"   r#   r$   r(   r&   r   rN   rt   r   tupleru   r%   rv   r	   r,   r@   r7   r   rw   r5   r'   rG   r4   rH   r   rI   r   r   r   r)   r    r   rr   rr   f  s    7GJM	H"'"=NDK=$(NHSM(D(3-!OS!'+J$+"Hhsm"IuL#I6D)6E3N!$7JS	7c3h r    rr   c                      e Zd ZU dZeed<   eed<   eed<   eed<   eed<   dZee   ed<   dZee   ed	<    e	e

      Zee   ed<    e	e

      Zee   ed<    e	e

      Zee   ed<    e	e

      Zee   ed<    e	e

      Zee   ed<    e	e

      Zee   ed<    e	e

      Zee   ed<    e	e

      Zee   ed<    e	e

      Zee   ed<    e	e

      Zee   ed<   dZeed<   dZee   ed<   dZ ee   ed<   dZ!ee   ed<   dZ"ee   ed<   dZ#ee   ed<   dZ$ee   ed<   dZ%ee   ed<   dZ&ee   ed<   dZ'ee   ed<   d Z(e)ed!<   dZ*ee+   ed"<   d#e,ee-f   fd$Z.e/d%e,ee-f   d#d fd&       Z0y)'ReportzFull research report.topic
range_fromrange_togenerated_atmodeNopenai_model_usedxai_model_usedrA   redditxwebyoutubetiktok	instagram
hackernews
polymarketbest_practicesprompt_packrF   context_snippet_mdreddit_errorx_error	web_erroryoutube_errortiktok_errorinstagram_errorhackernews_errorpolymarket_errorresolved_x_handleF
from_cachecache_age_hoursr   c                 @   i d| j                   d| j                  | j                  dd| j                  d| j                  d| j
                  d| j                  d| j                  D cg c]  }|j                          c}d	| j                  D cg c]  }|j                          c}d
| j                  D cg c]  }|j                          c}d| j                  D cg c]  }|j                          c}d| j                  D cg c]  }|j                          c}d| j                  D cg c]  }|j                          c}d| j                  D cg c]  }|j                          c}d| j                  D cg c]  }|j                          c}d| j                   d| j"                  d| j$                  }	| j&                  r| j&                  |	d<   | j(                  r| j(                  |	d<   | j*                  r| j*                  |	d<   | j,                  r| j,                  |	d<   | j.                  r| j.                  |	d<   | j0                  r| j0                  |	d<   | j2                  r| j2                  |	d<   | j4                  r| j4                  |	d<   | j6                  r| j6                  |	d<   | j8                  r| j8                  |	d<   | j:                  | j:                  |	d<   |	S c c}w c c}w c c}w c c}w c c}w c c}w c c}w c c}w )Nr|   range)fromtor   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   r   r   r   r   r   r   r   r   r   r   r   )
r   rr   wytighpr   s
             r   r   zReport.to_dict  s   
TZZ
mm
 D--
 DII
  !7!7
 d11
 DKK8qqyy{8
 tvv.!!))+.
 2AAIIK2
 T\\:		:
 DKK8qqyy{8
 @2"**,@
  @1199;@!
" @1199;@#
$ d11%
& 4++'
( !$"9"9)
, !!%)%;%;A!" $ 1 1An<<<<AiL>>!^^AkN!%!3!3Ao $ 1 1An#'#7#7A   $($9$9A !  $($9$9A !??"ooAlO+#'#7#7A E 9.2:8@@@s0   ,K8K=>L'LL9L"LLdatac                    |j                  di       }|j                  d|j                  dd            }|j                  d|j                  dd            }g }|j                  dg       D ]%  }d}|j                  d	      rt        dMi |d	   }|j                  d
g       D cg c]  }t        dMi | }	}|j                  d      rt        dMi |j                  di       n	t               }
|j	                  t        |d   |d   |d   |d   |j                  d      |j                  dd      ||	|j                  dg       |j                  dd      |j                  dd      |
|j                  dd      |j                  dg                    ( g }|j                  dg       D ]  }d}|j                  d	      rt        dMi |d	   }|j                  d      rt        dMi |j                  di       n	t               }
|j	                  t        |d   |d   |d   |d   |j                  d      |j                  dd      ||j                  dd      |j                  dd      |
|j                  dd      |j                  dg                     g }|j                  dg       D ]  }|j                  d      rt        dMi |j                  di       n	t               }
|j	                  t        |d   |d   |d   |j                  d d      |j                  d!d      |j                  d      |j                  dd      |j                  dd      |j                  dd      |
|j                  dd      |j                  dg       "              g }|j                  d#g       D ]	  }d}|j                  d	      rt        dMi |d	   }|j                  d      rt        dMi |j                  di       n	t               }
|j	                  t        |d   |d   |d   |j                  d$d      |j                  d      |j                  dd%      ||j                  d&d      |j                  dd'      |j                  dd      |
|j                  dd      |j                  dg       (              g }|j                  d)g       D ]'  }d}|j                  d	      rt        dMi |d	   }|j                  d      rt        dMi |j                  di       n	t               }
|j	                  t        |d   |j                  dd      |d   |j                  d*d      |j                  d      |j                  dd%      ||j                  d+d      |j                  d,g       |j                  dd'      |j                  dd      |
|j                  dd      |j                  dg       -             * g }|j                  d.g       D ]'  }d}|j                  d	      rt        dMi |d	   }|j                  d      rt        dMi |j                  di       n	t               }
|j	                  t        |d   |j                  dd      |d   |j                  d*d      |j                  d      |j                  dd%      ||j                  d+d      |j                  d,g       |j                  dd'      |j                  dd      |
|j                  dd      |j                  dg       -             * g }|j                  d/g       D ]P  }d}|j                  d	      rt        dMi |d	   }|j                  d
g       D cg c]  }t        dMi | }	}|j                  d      rt        dMi |j                  di       n	t               }
|j	                  t        |d   |d   |j                  dd      |j                  d0d      |j                  d1d      |j                  d      |j                  dd%      ||	|j                  dg       |j                  dd      |j                  dd      |
|j                  dd      |j                  dg       2             S g }|j                  d3g       D ]X  }d}|j                  d	      rt        dMi |d	   }|j                  d      rt        dMi |j                  di       n	t               }
|j	                  t        dMi d|d   d|d   d4|j                  d4d      d|d   d5|j                  d5g       d6|j                  d6d      d7|j                  d7      d|j                  d      d|j                  dd%      d	|d8|j                  d8      d|j                  dd      d|j                  dd      d|
d|j                  dd      d|j                  dg              [  | dMi d9|d9   d|d|d:|d:   d;|d;   d<|j                  d<      d=|j                  d=      d|d|d|d#|d)|d.|d/|d3|d>|j                  d>g       d?|j                  d?g       d@|j                  d@d      dA|j                  dA      dB|j                  dB      dC|j                  dC      dD|j                  dD      dE|j                  dE      dF|j                  dF      dG|j                  dG      dH|j                  dH      dI|j                  dI      dJ|j                  dJdK      dL|j                  dL      S c c}w c c}w )Nz:Create Report from serialized dict (handles cache format).r   r   r}   rF   r   r~   r   Nr7   rC   rH   r<   r=   r/   r>   r,   r@   r?   rD   r5   rE   rG   r   r   rI   )r<   r=   r/   r>   r,   r@   r7   rC   rD   r5   rG   rH   r   rI   r   rQ   rR   )r<   rQ   r/   rR   r,   r@   r7   r5   rG   rH   r   rI   r   rV   rW   )r<   r=   r/   rV   rW   r,   r@   r5   rG   rH   r   rI   r   r[   r\   r]   r^   )r<   r=   r/   r[   r,   r@   r7   r]   r5   rG   rH   r   rI   r   rb   rc   rd   )r<   rQ   r/   rb   r,   r@   r7   rc   rd   r5   rG   rH   r   rI   r   r   ro   r-   )r<   r=   r/   ro   r-   r,   r@   r7   rC   rD   r5   rG   rH   r   rI   r   rs   rt   ru   rv   rw   r|   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   r   Fr   r)   )getr   r+   r4   appendr;   rP   rU   rZ   ra   rk   rn   rr   )clsr   
range_datar}   r~   reddit_itemsr   engrL   commentsrH   x_itemsr   	web_itemsr   youtube_itemsr   tiktok_itemsr   ig_itemsr   hn_itemsr   pm_itemsr   s                            r   	from_dictzReport.from_dict  sK    XXgr*
^^FDHH\2,FG
>>$R(@A (B' 	ACuu\" 31\?3./eeNB.GH!HHH56UU6]91quuVR01	D
T7jeHK.UU6] !&7 ?%!"'92!>%%S1UU>26eeGQ'55r2! 	0 #r" 	ACuu\" 31\?356UU6]91quuVR01	DNN5T7vYeH0UU6] !&7 ?%%S1UU>26eeGQ'55r2 	* 	%$ 	A56UU6]91quuVR01	D]T7jeHeeOR8i,UU6] !&7 ?%%S1UU>26eeGQ'55r2 	$ )R( 	ACuu\" 31\?356UU6]91quuVR01	D  T7jeHUU>26UU6] !&7 @#$55)=r#B%%S1UU>26eeGQ'55r2" 	, (B' 	ACuu\" 31\?356UU6]91quuVR01	D
T7UU62&eHEE-4UU6] !&7 @ !&7 <z2.%%S1UU>26eeGQ'55r2! 	. ((;+ 	BCvvl# 42l#3468ffVn92rvvfb12)+DOOMd8VVFB'uIFF="5VVF^ "'8& A "'8" =
B/&&c2VVNB7ffWa(66,3 	. ,+ 	ACuu\" 31\?3./eeNB.GH!HHH56UU6]91quuVR01	DOONT7jEE%$uuXr*uuXr*UU6] !&7 @%!"'92!>%%S1UU>26eeGQ'55r2 	2 ,+ 	ACuu\" 31\?356UU6]91quuVR01	DOON T7j z2. eH	
  !uu%5r: $%55)=q#A  !uu%56 UU6] !"&7 @  z* %%S1 UU>26  eeGQ'  55r2! 	0  
w-
!
 
 n-	

 f
 #hh':;
  88$45
  
 
 
 "
  
 
  
  
   88$4b9!
" 3#
$  $xx(<bA%
& .1'
( HHY')
* hh{++
, ((?3-
. .1/
0 !HH%671
2 "XX&893
4 "XX&895
6 #hh':;7
8 xxe49
: !HH%67;
 	
o IR Is   $m#>m()1r!   r"   r#   r$   r(   r&   r   r	   r   r   rN   r   r   r;   r   rP   r   rU   r   rZ   r   ra   r   rk   r   rn   r   rr   r   r   r   r   r   r   r   r   r   r   r   r   r   boolr   r'   r   r   r   classmethodr   r)   r    r   r{   r{     s   JOM
I'+x}+$(NHSM($T:FD:40AtE{0$T:Cm	:!&t!<GT+<$T:FD:%*4%@ItM"@',T'BJ^$B',T'BJ^$B %d ;NDI;"48Kc8  "&L(3-&!GXc]!#Ix}##'M8C='"&L(3-&%)OXc])&*hsm*&*hsm*'+x}+J'+OXe_+-c3h -^ b
T#s(^ b
 b
 b
r    r{   Nr|   	from_dateto_dater   openai_model	xai_modelr   c           	          t        | ||t        j                  t        j                        j                         |||      S )z"Create a new report with metadata.)r|   r}   r~   r   r   r   r   )r{   r
   nowr   utc	isoformat)r|   r   r   r   r   r   s         r   create_reportr     s<     \\(,,/99;&  r    )NN)r$   dataclassesr   r   r   typingr   r   r   r	   r
   r   r   r+   r4   r;   rP   rU   rZ   ra   rk   rn   rr   r{   r(   r   r)   r    r   <module>r      s   ( 0 0 , , ' /  /  / d 
 
 
$ 
 
 
 # # #L   D   D ! ! !H # # #L # # #L % % %P ' ' 'T u
 u
 u
z	 #'#  	
 3- } r    