Ë
    ‰wØiß]  ã                   óX  — U d dl Z d dlZd dlZd dlZd dlZd dlmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZmZmZ d dlmZ d dlmZmZ d dlZd dlmZ d dlmZ  e«       Z G d	„ d
e«      Z G d„ de«      Z G d„ de«      Zi Ze
e ef   e!d<   i Z"e
ee f   e!d<    ejF                  dd«      Z$ e%de$› �«       e$r e ee$¬«      «      ndZ& ejN                  d«      Z(dZ)ejT                  jW                  ejT                  jY                  e-«      dd«      Z.	  e/e.d¬«      5 Z0e0jc                  «       je                  «       Z3ddd«       d ejj                  «       jm                  d«      › d�e3z   Z3 ejF                  dejT                  jW                  ejT                  jY                  e-«      dd «      «      Z7	 g Z8e9e    e!d!<    e: ejv                  e7«      «      D ]¼  Z<ejT                  jW                  e7e<«      Z=ejT                  j}                  e=«      sŒ; e:d"„  ejv                  e=«      D «       «      Z?e<› d#�Z@e?D � cg c]
  } | e@k7  sŒ	| ‘Œ c} ZAe@e?v sŒze8j…                  e@› d$�«       eAD ]  ZCe8j…                  d%eC› �«       Œ eArŒ¬e8j…                  d«       Œ¾ e8re3d&d'jW                  e8«      z   z  Z3 e%d(e3› �«       d)d*d+d,d-d.d/d0id1d2œid-gd3œd4œgZDd5ZEd6ZFd7e d8e fd9„ZGd:e
e ef   d8e
e ef   fd;„ZHd*eHiZIe
e e	f   e!d<<   d=ZJd8e fd>„ZKd?ed8ee    fd@„ZLdAe d8ee   fdB„ZMdfdC„ZNdDee
e ef      d8eOfdE„ZPdFe d8eOfdG„ZQdHeOdIeOdJeOdKeRdLeSd8e
e ef   fdM„ZTdgd?edNe
e ef   dOe d8dfdP„ZUd?edQe dRed8dfdS„ZVdTZWdUZXdDee
e ef      d8ee
e ef      fdV„ZYd?edWe d8dfdX„ZZej·                  dY«      dZed8dfd[„«       Z\d?ed\e
e ef   d8dfd]„Z]ej½                  d^«      d_„ «       Z_ej½                  d`«      dae fdb„«       Z`ejÃ                  dc«      ddebfde„«       Zcy# 1 sw Y   �ŒÉxY w# e4$ r dZ3Y �ŒÖw xY wc c} w # e4$ r Y �Œ~w xY w)hé    N)ÚdatetimeÚtimezone)ÚAnyÚCallableÚDictÚListÚOptional)Ú	APIRouterÚ	WebSocketÚWebSocketDisconnect)ÚAsyncOpenAI)Ú	BaseModelÚ
ConfigDict)Ú	traceable)Úwrap_openaic                   ó"   — e Zd ZU eed<   eed<   y)ÚHistoryItemÚtitleÚtextN©Ú__name__Ú
__module__Ú__qualname__ÚstrÚ__annotations__© ó    ú6/root/rosshost/parking-map/parking-api/routers/chat.pyr   r      s   … ØƒJØ
„Ir   r   c                   ó6   — e Zd ZU eed<   eed<   eed<   eed<   y)ÚPendingCallÚidÚcall_idÚnameÚ	argumentsNr   r   r   r   r    r       s   … ØƒGØƒLØ
ƒIØ„Nr   r    c                   ó”   — e Zd ZU  ed¬«      Zg Zeeee	f      e
d<   i Zeeef   e
d<   dZee
d<   dZee   e
d<   d	Zee
d
<   dZee
d<   y)ÚSessionT)Úarbitrary_types_allowedÚmessagesÚhistoryFÚcancel_requestedNÚ	websocketç        Úlast_activer   Úoutput_tokens_used)r   r   r   r   Úmodel_configr(   r   r   r   r   r   r)   r   r*   Úboolr+   r	   r   r-   Úfloatr.   Úintr   r   r   r&   r&      sf   … Ù°dÔ;€Là%'€Hˆd�4˜˜S˜‘>Ñ"Ó'Ø&(€GˆT�#�{Ð"Ñ#Ó(Ø"Ð�dÓ"Ø%)€Iˆx˜	Ñ"Ó)Ø€K�ÓØÐ˜Ôr   r&   ÚsessionsÚwebsocket_to_sessionÚOPENAI_API_KEYÚ zOPENAI_API_KEY: )Úapi_keyÚcl100k_baseé   z..zsystem_prompt.mdúutf-8©Úencodingz°You are an AI assistant on Ross Klein's portfolio website. Answer questions about Ross's background, skills, experience, and projects conversationally. Be concise and friendly.zToday's date is z%Y-%m-%dú.Ú	NOTES_DIRÚnotesÚ_notes_linesc              #   óD   K  — | ]  }|j                  d «      sŒ|–— Œ y­w)ú.mdN)Úendswith)Ú.0Úfs     r   ú	<genexpr>rF   M   s    è ø€ ò  
Ø°1·:±:¸eÕ3DŒAñ 
ùs   ‚ ™ rB   z -z    z

# Available Notes

ú
zSYSTEM_PROMPT: ÚfunctionÚ
read_notesz=Read the contents of one or more note files about Ross Klein.ÚobjectÚ	filenamesÚarrayÚtypeÚstringzMNote filenames to read (without .md extension), e.g. ['experience', 'skills'])rM   ÚitemsÚdescription)rM   Ú
propertiesÚrequired)rM   r#   rP   Ú
parametersé2   iPÃ  r#   Úreturnc                 óª   — | j                  d«      r| dd n| }|j                  d«      d   }t        j                  j	                  t
        ||dz   «      S )u�  Resolve a note filename (without .md) to its full path.

    Files live under notes/{section}/{name}.md where the section is the
    first underscore-delimited token of the filename.
    e.g. 'experience'              â†’ notes/experience/experience.md
         'experience_amazon'       â†’ notes/experience/experience_amazon.md
         'projects_sheets_agent'   â†’ notes/projects/projects_sheets_agent.md
    rB   NéýÿÿÿÚ_r   )rC   ÚsplitÚosÚpathÚjoinr>   )r#   ÚstemÚsections      r   Ú
_note_pathr_   x   sI   € ð Ÿ™ eÔ,ˆ4��‰9°$€DØ�j‰j˜‹o˜aÑ €GÜ�7‰7�<‰<œ	 7¨D°5©LÓ9Ð9r   Úargsc              ƒ   ó`  K  — | j                  dg «      }i }|D ]O  }|j                  d«      r|d d n|}t        |«      }	 t        |d¬«      5 }|j	                  «       ||<   d d d «       ŒQ |S # 1 sw Y   ŒxY w# t
        $ r d|› d�||<   Y Œtt        $ r}d|› d	|› d�||<   Y d }~Œ�d }~ww xY w­w)
NrK   rB   rW   r:   r;   z[Note not found: ú]z[Error reading z: )ÚgetrC   r_   ÚopenÚreadÚFileNotFoundErrorÚ	Exception)r`   rK   Úresultsr#   r]   r[   ÚfhÚexcs           r   Ú_read_notesrk   †   sÉ   è ø€ Ø—‘˜ bÓ)€IØ €GØò 	=ˆØ ŸM™M¨%Ô0ˆt�C�R‰y°dˆÜ˜$Óˆð	=Ü�d WÔ-ð *°Ø "§¡£	�˜‘÷*øð		=ð €N÷*ð *ûä ò 	8Ø/°¨v°QÐ7ˆG�D‹MÜò 	=Ø-¨d¨V°2°c°U¸!Ð<ˆG�DŽMûð	=üsS   ‚=B.Á A9ÁA-Á!A9Á)B.Á-A6	Á2A9Á9B+ÂB.ÂB+ÂB&Â!B.Â&B+Â+B.ÚHANDLER_REGISTRYi  c                  ó<   — t        t        j                  «       «      S ©N)r   ÚuuidÚuuid4r   r   r   Ú
_new_tokenrq   ¡   s   € ÜŒt�z‰z‹|ÓÐr   Úwsc                 ó,   — t         j                  | «      S rn   )r4   rc   )rr   s    r   Ú
_get_tokenrt   ¤   s   € Ü×#Ñ# BÓ'Ð'r   Útokenc                 ó,   — t         j                  | «      S rn   )r3   rc   )ru   s    r   Ú_get_sessionrw   §   s   € Ü�<‰<˜ÓÐr   c                  ó"  — t        j                   «       t        z
  } t        j                  «       D ��cg c]  \  }}|j                  | k  sŒ|‘Œ }}}|D ]  }t        j                  |d «       Œ |rt        dt        |«      › d�«       y y c c}}w )Nz[chat] swept z expired session(s))ÚtimeÚSESSION_TTL_SECONDSr3   rO   r-   ÚpopÚprintÚlen)ÚcutoffÚtÚsÚexpireds       r   Ú_sweep_sessionsr‚   ª   s}   € Ü�Y‰Y‹[Ô.Ñ.€FÜ%Ÿ^™^Ó-×H‘T�Q˜°·±ÀÓ1GŠqÐH€GÑHØò ˆÜ�‰�Q˜ÕðáÜ�œc '›l˜^Ð+>Ð?Õ@ð ùó Is   ³BÁBr(   c           
      ó®   — d}| D ]M  }dD ]A  }|j                  |d«      }|sŒ|t        t        j                  t	        |«      «      «      z  }ŒC |dz  }ŒO |S )Nr   ©ÚroleÚcontentr6   é   )rc   r}   Útiktoken_encodingÚencoder   )r(   ÚtotalÚmsgÚfieldÚvals        r   Ú_count_tokensrŽ   ¶   sk   € Ø€EØò ˆØ(ò 	AˆEØ—'‘'˜% Ó$ˆCÚØœÔ.×5Ñ5´c¸#³hÓ?Ó@Ñ@‘ð	Að 	�‰
‰ðð €Lr   r   c                 óX   — | r't        t        j                  t        | «      «      «      S dS )Nr   )r}   rˆ   r‰   r   )r   s    r   Ú_count_text_tokensr�   À   s$   € Ù7;Œ3Ô ×'Ñ'¬¨D«	Ó2Ó3ÐBÀÐBr   Ú	input_tokÚ
output_tokÚaccurate_totalÚhas_accurateÚelapsedc                 óZ   — |r|dkD  r|n| |z   }|dkD  r||z  nd}| ||t        |d«      d dœS )Nr   r,   é   )Úinput_tokensÚoutput_tokensÚtotal_tokensÚtokens_per_secondÚreasoning_tokens)Úround)r‘   r’   r“   r”   r•   rŠ   Útpss          r   Ú_build_usagerŸ   Ç   sI   € á*¨~ÀÒ/A‰NÀyÐS]ÑG]€EØ")¨A¢+ˆ*�wÒ
°3€Cà!Ø#ØÜ" 3¨›]Ø ñð r   ÚusageÚphasec              ƒ   ó.  K  — t        | «      }|sy t        |«      }|r|j                  sy 	 |j                  j                  d||t	        j
                  t        j                  «      j                  «       dœ«      ƒ d {  –—†  y 7 Œ# t        $ r Y y w xY w­w)Nr    )rM   r¡   r    Ú	timestamp)
rt   rw   r+   Ú	send_jsonr   Únowr   ÚutcÚ	isoformatrg   )rr   r    r¡   ru   Úsessions        r   Ú_send_usager©   Ó   sŠ   è ø€ Ü�r‹N€EÙØÜ˜5Ó!€GÙ˜'×+Ò+ØðØ×Ñ×)Ñ)ØØØÜ!Ÿ™¤h§l¡lÓ3×=Ñ=Ó?ñ	+
ó ÷ 	ò 	ùô ò Ùðüs;   ‚)B¬AB Á>BÁ?B ÂBÂB Â	BÂBÂBÂBÚitem_idÚitemc           
   ƒ   ón  K  — t        | «      }|sy t        |«      }|r|j                  sy 	 |j                  j                  d||j                  |j
                  |j                  t        j                  t        j                  «      j                  «       dœ«      ƒ d {  –—†  y 7 Œ# t        $ r Y y w xY w­w)NÚchat©rM   rª   r   r   r…   r£   )rt   rw   r+   r¤   r   r   r   r¥   r   r¦   r§   rg   )rr   rª   r«   ru   r¨   s        r   Ú
_send_chatr¯   è   sœ   è ø€ Ü�r‹N€EÙØÜ˜5Ó!€GÙ˜'×+Ò+Øð
Ø×Ñ×)Ñ)ØØØ—Z‘ZØ—I‘IØ—J‘JÜ!Ÿ™¤h§l¡lÓ3×=Ñ=Ó?ñ+
ó ÷ 	ò 	ùô ò Ùðüs;   ‚)B5¬A2B& ÂB$ÂB& Â#B5Â$B& Â&	B2Â/B5Â1B2Â2B5éd   é
   c           
      ó&  ‡
— | s| S g }| d d  Š
‰
r"‰
d   j                  d«      dk(  r‰
d   g}‰
dd  Š
t        ‰
«      D ��cg c]  \  }}|j                  d«      dk(  sŒ|‘Œ }}}t        |«      t        kD  r
|t            nd}|d d  }t        ‰
«      D ]w  \  }}|j                  d«      dv }|rFt	        ˆ
fd„t        |dz   t        ‰
«      «      D «       «      }	|	t        k  sŒO|j                  |«       Œa||k\  sŒg|j                  |«       Œy |S c c}}w )	Nr   r…   Úsystemé   ÚuserrM   )Úfunction_callÚfunction_call_outputc              3   óR   •K  — | ]  }‰|   j                  d «      dk(  sŒd–— Œ  y­w)r…   rµ   r´   N)rc   )rD   ÚjÚrests     €r   rF   z!_build_context.<locals>.<genexpr>  s'   øè ø€ Òb AÀDÈÁGÇKÁKÐPVÓDWÐ[aÓDaœaÑbùs   ƒ' ')rc   Ú	enumerater}   Ú	MAX_TURNSÚsumÚrangeÚ
TOOL_TURNSÚappend)r(   r³   ÚiÚmÚuser_indicesÚregular_cutoffÚresultr‹   Úis_toolÚusers_afterrº   s             @r   Ú_build_contextrÈ     s  ø€ ÙØˆà#%€FØ‘Aˆ;€DÙ��Q‘—‘˜FÓ# xÒ/Ø�q‘'�ˆØ�A�Bˆxˆä"+¨D£/×M™$˜!˜Q°Q·U±U¸6³]ÀfÓ5L’AÐM€LÑMÜ14°\Ó1BÄYÒ1N�\¤9 *Ò-ÐTU€Nà‘AˆY€FÜ˜D“/ò #‰ˆˆ3Ø—'‘'˜&“/Ð%NÐNˆÙÜÓb¬¨q°1©u´c¸$³iÓ)@ÔbÓbˆKØœZÓ'Ø—‘˜cÕ"à�NÓ"Ø—‘˜cÕ"ð#ð €Mùó Ns   ¿DÁDÚuser_contentc              ƒ   ó  ‡ ‡%‡&‡'‡(K  — t        ‰ «      }|sy t        |«      }|sy |j                  }|j                  Š'd|_        |s|j                  dt        dœ«       |j                  d|dœ«       t        d|¬«      ‰'dt        t        j                  «       dz  «      › �<   t        s5|j                  r(	 |j                  j                  dd	d
œ«      ƒ d {  –—†  y y |j                  t        k\  r5|j                  r(	 |j                  j                  ddd
œ«      ƒ d {  –—†  y y 	 t!        |«      }d}d}d}t        j                  «       }	d}
d}d}|�ròg }g }dt        t        j                  «       dz  «      › �}t        dd¬«      }i Š(g }dt"        dt$        fˆ'ˆ(fd„Š%dt$        dt$        fˆ(fd„Š&dt"        dd fˆ%ˆ&ˆ'ˆ fd„}t        j&                  j)                  ddddœt+        |«      t,        dd¬«      4 ƒd {  –—† }|2 3 d {  –—† }|j                  r}|j                  rl	 |j                  j                  d|ddj/                  |«      dz   dt1        j2                  t4        j6                  «      j9                  «       dœ«      ƒ d {  –—†  d} �n|
dz  }
|j:                  d k(  rYt=        |d!d«      }|rJ|j                  |«       dj/                  |«      |_        tA        ‰ ||«      ƒ d {  –—†  |tC        |«      z  }|j:                  d"k(  r.t=        |d#d«      }|r|g}||_        tA        ‰ ||«      ƒ d {  –—†  |j:                  d$v r�|j:                  d%k(  r"t=        |d&d «      }d'|rt=        |d#d«      ndz   }nt=        |d!d«      }|rA ‰%t=        |dd «      «      }‰(|   d(xx   |z  cc<   |tC        |«      z  } ||«      ƒ d {  –—†  |j:                  d)k(  rŒ ‰%t=        |dd «      «      } ||«      ƒ d {  –—†  ‰(jE                  |i «      }|rU||vrQ|jE                  d(d«      jG                  «       s |jE                  d*d«      jG                  «       r|j                  |«       |j:                  d+k(  rit=        |d,d «      }|rZt=        |d-d «      d.k(  rJ|j                  tI        t=        |d/d«      t=        |d0d«      t=        |d1d«      t=        |d2d3«      ¬4«      «       |j:                  d5k(  rgt=        |d6d «      }|rt=        |d7d «      nd }|rGt=        |d8|«      }t=        |d9|«      }t=        |d:|«      }tK        |«      }|xj                  |z  c_        |
tL        z  dk(  s�ŒbtO        t        j                  «       |	z
  d;«      }tQ        ‰ tS        |||||«      «      ƒ d {  –—†  �Œ¦d d d «      ƒd {  –—†  |‰'|<   |D ]3  } ‰&|«      }|jG                  «       sŒ|j                  dd<|› d=�dœ«       Œ5 dj/                  |«      jG                  «       }|rô|tT        k  rë|D ]A  } |j                  d.| jV                  | jX                  | jZ                  | j\                  d>œ«       ŒC |D ]š  } t^        jE                  | jZ                  «      }!	 ta        jb                  | j\                  xs d3«      }"|!r |!|"«      ƒ d {  –—† ndd?| jZ                  › �i}#|j                  d@| jX                  ta        jf                  |#«      dAœ«       Œœ |dz  }n8|r|j                  d|dœ«       tA        ‰ dBt        dd¬«      «      ƒ d {  –—†  d}|r�ŒòtO        t        j                  «       |	z
  d;«      }tQ        ‰ tS        |||||«      dC¬D«      ƒ d {  –—†  y 7 �Œµ# t        $ r Y y w xY w7 �Œ# t        $ r Y y w xY w7 �Œ´7 �Œ¬7 �Œ+# t        $ r Y �Œ5w xY w7 �ŒÚ7 �Œ’7 �Œ7 �Œ×7 �Œ36 �Œ27 �Œ'# 1 ƒd {  –—†7  sw Y   �Œ8xY w# t`        jd                  $ r i }"Y �Œ^w xY w7 �ŒU7 ŒÖ7 ŒŽ# t        $ rb}$|rV|j                  rE	 |j                  j                  ddE|$› �d
œ«      ƒ d {  –—†7   n# t        $ r Y nw xY wY d }$~$y Y d }$~$y Y d }$~$y Y d }$~$y d }$~$ww xY w­w)FNFr³   r„   rµ   ©r   r   zuser-iè  Úerrorz2OpenAI client not initialised. Set OPENAI_API_KEY.©rM   ÚmessagezPThis session has reached its token limit. Please refresh to start a new session.r   Tz
assistant-Ú	assistantr6   rª   rU   c                 óŒ   •— | �t        | «      nd}‰j                  |dddœ«       |‰vrt        dd¬«      ‰|<   d‰|   _        |S )Nr6   )Úsummaryr†   ÚthinkingrË   )r   Ú
setdefaultr   r   )rª   Únidr)   Úreasoning_entriess     €€r   Ú_ensure_reasoningz#_run_llm.<locals>._ensure_reasoningd  sQ   ø€ Ø&-Ð&9”c˜'”l¸r�Ø!×,Ñ,¨S¸bÈRÑ2PÔQØ˜gÑ%Ü#.°ZÀbÔ#I�G˜C‘LØ%/�˜‘Ô"Ø�
r   rÔ   c                 ó  •— ‰j                  | i «      }g }|j                  d«      r"|j                  |d   j                  «       «       |j                  d«      r"|j                  |d   j                  «       «       dj                  |«      S )NrÑ   r†   ú

)rc   rÀ   Ústripr\   )rÔ   ÚentryÚpartsrÕ   s      €r   Ú_reasoning_textz!_run_llm.<locals>._reasoning_textl  su   ø€ Ø)×-Ñ-¨c°2Ó6�Ø�Ø—9‘9˜YÔ'Ø—L‘L  yÑ!1×!7Ñ!7Ó!9Ô:Ø—9‘9˜YÔ'Ø—L‘L  yÑ!1×!7Ñ!7Ó!9Ô:Ø—{‘{ 5Ó)Ð)r   c              “   ór   •K  —  ‰| «      } ‰|«      ‰|   _         t        ‰|‰|   «      ƒ d {  –—†  y 7 Œ­wrn   )r   r¯   )rª   rÔ   rÖ   rÜ   r)   rr   s     €€€€r   Ú_push_reasoningz!_run_llm.<locals>._push_reasoningu  s8   øè ø€ Ù'¨Ó0�Ù$3°CÓ$8�˜‘Ô!Ü   S¨'°#©,Ó7×7Ò7ús   ƒ,7¯5°7zgpt-5.4ÚlowÚauto)ÚeffortrÑ   )ÚmodelÚ	reasoningÚinputÚtoolsÚstoreÚ
truncationr­   z

[Cancelled]r®   r´   zresponse.output_text.deltaÚdeltazresponse.output_text.doner   )ú%response.reasoning_summary_part.addedz%response.reasoning_summary_text.deltaré   ÚpartrØ   rÑ   z$response.reasoning_summary_text.doner†   zresponse.output_item.doner«   rM   r¶   r!   r"   r#   r$   z{})r!   r"   r#   r$   zresponse.completedÚresponser    r˜   r™   rš   gü©ñÒMbP?z<thinking>
z
</thinking>)rM   r!   r"   r#   r$   zUnknown tool: r·   )rM   r"   ÚoutputÚcompleteÚfinal)r¡   zLLM error: )4rt   rw   r(   r)   r*   rÀ   ÚSYSTEM_PROMPTr   r2   ry   Úclientr+   r¤   rg   r.   ÚSESSION_OUTPUT_TOKEN_LIMITrŽ   r   r   Ú	responsesÚstreamrÈ   ÚTOOLSr\   r   r¥   r   r¦   r§   rM   Úgetattrr   r¯   r�   rc   rÙ   r    r0   ÚUSAGE_UPDATE_FREQUENCYÚmaxr©   rŸ   ÚMAX_TOOL_ITERATIONSr!   r"   r#   r$   rl   ÚjsonÚloadsÚJSONDecodeErrorÚdumps))rr   rÉ   ru   r¨   Úconversationr‘   r’   r“   r”   ÚstartÚchunk_counterÚiteration_activeÚtool_iterationsÚsegmentsÚpending_callsÚ
message_idÚassistant_itemÚcompleted_reasoning_idsrÞ   ró   Úchunkrè   rî   rê   rÔ   rÚ   r«   Úresp_objr    r•   r   Ú
final_textÚcallÚhandlerr`   rÅ   rj   rÖ   rÜ   r)   rÕ   s)   `                                    @@@@r   Ú_run_llmr  (  sÈ  üè ø€ Ü�r‹N€EÙØÜ˜5Ó!€GÙØà×#Ñ#€LØ�o‰o€GØ$€GÔñ Ø×Ñ X¼-ÑHÔIà×Ñ °LÑAÔBÜ1<À6ÐP\Ô1]€Gˆe”CœŸ	™	› dÑ*Ó+Ð,Ð-Ñ.åØ×ÒðØ×'Ñ'×1Ñ1Ø#ØSñ3ó ÷ ð ñ 	à×!Ñ!Ô%?Ò?Ø×ÒðØ×'Ñ'×1Ñ1Ø#Øqñ3ó ÷ ð ñ 	ðrÜ! ,Ó/ˆ	Øˆ
ØˆØˆÜ—	‘	“ˆØˆàÐØˆÚØ"$ˆHØ/1ˆMØ%¤c¬$¯)©)«+¸Ñ*<Ó&=Ð%>Ð?ˆJÜ(¨{ÀÔDˆNà;=ÐØ13Ð#ð¬3ð ´3ö ð*¤Sð *¬Sõ *ð8¬sð 8°t÷ 8ð 8ô
 ×'Ñ'×.Ñ.ØØ%*°vÑ>Ü$ \Ó2ÜØØ!ð /ó ÷ Tzð Tzð Ø#)÷ Lzð Lz˜%Ø×/Ò/Ø"×,Ò,ð
%Ø&-×&7Ñ&7×&AÑ&AØ,2Ø/9Ø-8Ø,.¯G©G°HÓ,=Ð@QÑ,QØ,7Ü19·±¼h¿l¹lÓ1K×1UÑ1UÓ1WñC"ó '#÷ !#ð !#ð ,1Ð(Úà! QÑ&�Mà—z‘zÐ%AÒAÜ '¨¨w¸Ó ;˜Ù Ø$ŸO™O¨EÔ2Ø24·'±'¸(Ó2C˜NÔ/Ü",¨R°¸^Ó"L×LÐLØ&Ô*<¸UÓ*CÑC˜Jà—z‘zÐ%@Ò@Ü '¨¨v°rÓ :˜Ù Ø(- w˜HØ27˜NÔ/Ü",¨R°¸^Ó"L×LÐLà—z‘zÐ%wÑwØ Ÿ:™:Ð)PÒPÜ#*¨5°&¸$Ó#?˜DØ$*É4¬g°d¸FÀBÔ.GÐUWÑ$X™Eä$+¨E°7¸BÓ$?˜EÙ Ù"3´G¸EÀ9ÈdÓ4SÓ"T˜CØ-¨cÑ2°9Ó=ÀÑFÓ=Ø&Ô*<¸UÓ*CÑC˜JÙ"1°#Ó"6×6Ð6à—z‘zÐ%KÒKÙ/´¸¸yÈ$Ó0OÓP˜Ù-¨cÓ2×2Ð2Ø 1× 5Ñ 5°c¸2Ó >˜Ù 3Ð.EÑ#EØ$Ÿy™y¨°BÓ7×=Ñ=Ô?À5Ç9Á9ÈYÐXZÓC[×CaÑCaÔCcØ 7× >Ñ >¸sÔ Cà—z‘zÐ%@Ò@Ü& u¨f°dÓ;˜Ù¤G¨D°&¸$Ó$?À?Ò$RØ)×0Ñ0´Ü#*¨4°°rÓ#:Ü(/°°iÀÓ(DÜ%,¨T°6¸2Ó%>Ü*1°$¸ÀTÓ*Jô	2ô ð —z‘zÐ%9Ò9Ü#*¨5°*¸dÓ#C˜ÙDL¤¨°'¸4Ô @ÐRV˜Ù Ü(/°°~ÀyÓ(Q˜IÜ)0°¸ÈÓ)T˜JÜ-4°U¸NÈNÓ-[˜NÜ+/°Ó+?˜LØ#×6Ò6¸*ÑDÕ6à$Ô'=Ñ=ÀÔBÜ"%¤d§i¡i£k°EÑ&9¸5Ó"A˜Ü)¨"¬l¸9ÀjÐR`ÐbnÐpwÓ.xÓy×yÒy÷iTz÷ Tzðp #1ˆG�JÑð /ò n�Ù& sÓ+�Ø—:‘:•<Ø ×'Ñ'°È<ÐX\ÐW]Ð]jÐIkÑ(lÕmðnð
 Ÿ™ Ó*×0Ñ0Ó2ˆJá Ô3FÒ!Fà)ò �DØ ×'Ñ'Ø /Ø"Ÿg™gØ#'§<¡<Ø $§	¡	Ø%)§^¡^ñ)õ ðð *ò �DÜ.×2Ñ2°4·9±9Ó=�Gð"Ü#Ÿz™z¨$¯.©.Ò*@¸DÓA˜ñ 5<¡7¨4£=×0Ð0À'È^Ð\`×\eÑ\eÐ[fÐKgÐAh�FØ ×'Ñ'Ø 6Ø#'§<¡<Ü"&§*¡*¨VÓ"4ñ)õ ðð   1Ñ$‘ñ Ø ×'Ñ'°ÈÑ(TÔUÜ   Z´À;ÐUWÔ1XÓY×YÐYØ#(Ð ó} ô@ ”d—i‘i“k EÑ)¨5Ó1ˆÜ˜"œl¨9°jÀ.ÐR^Ð`gÓhÐpwÔx×xÑxð}úô ò ØØðúðúô ò ØØðúðZTzùðLzùð!#úô $-ò %Ú $ð%úð Mùð Mùð 7ùð 3ùð8 zùðY $*ùðTzù÷ Tz÷ Tzò Tzûôb  ×/Ñ/ò "Ø!›ð"úà0ùð Zøð 	yùäò Ù�w×(Ò(ðØ×'Ñ'×1Ñ1¸7ÐQ\Ð]`Ð\aÐObÑ2cÓd×dÒdøÜò ÙðúÜô eô )Œ7ûðüs0  ‡B-bÂ5!^ Ã^Ã^ Ã!bÃ=!^  Ä^Ä^  Ä#bÄ&C` Ç;^/Ç<` Ç?_È_È^2È_È
_È$A&^8Ê
^5Ê^8ÊA_Ë._Ë/A
_Ì9_Ì:B_Ï_Ï	1_Ï:_Ï;E'_Õ$=_Ö!_Ö"_Ö(` Ö3_Ö4&` ×B.` Ú
#_3Ú-` Ú:`Ú;B ` Ü;`Ü<` Ý?` Þ`Þ` Þ
bÞ^ Þ	^ÞbÞ^ÞbÞ^  Þ 	^,Þ)bÞ+^,Þ,bÞ/` Þ2_Þ5^8Þ8	_ß_ß_ß_ß_ß_ß_ß_ß_ß` ß_0ß#_&ß$_0ß+` ß3`à` à`à` à` à` à	bàa<à.$aáaáaáa<á	a%á"a<á$a%á%a<á(bá<bâbz/wsr+   c              ƒ   ó¨  K  — | j                  «       ƒ d {  –—†  d }	 | j                  «       ƒ d {  –—† }d }	 t        j                  |«      }|r|j	                  d«      nd }t        «        |r|t        vr0t        «       }t        t        j                  «       ¬«      t        |<   n t        j                  «       t        |   _        | t        |   _        |t        | <   | j                  d|dœ«      ƒ d {  –—†  |r8t        |t         «      r(|j	                  d«      dk(  rt#        | |«      ƒ d {  –—†  	 | j                  «       ƒ d {  –—† }	 t        j                  |«      }t#        | |«      ƒ d {  –—†  ŒC7 �Œb7 �ŒJ# t        j
                  $ r Y �Œ1w xY w7 Œ¢7 Œj7 ŒS7 Œ+# t        j
                  $ r*}| j                  dd|› �d	œ«      ƒ d {  –—†7   Y d }~Œad }~ww xY w# t$        $ r Y nw xY w	 |r|t        v rd t        |   _        t        j'                  | d «       y # |r|t        v rd t        |   _        t        j'                  | d «       w xY w­w)
NÚsession_token)r-   r¨   )rM   r  rM   r­   rÌ   zInvalid JSON: rÍ   )ÚacceptÚreceive_textrù   rú   rc   rû   r‚   r3   rq   r&   ry   r-   r+   r4   r¤   Ú
isinstanceÚdictÚ_handle_messager   r{   )r+   r  ÚrawÚinitialÚdatar‹   rj   s          r   Úwebsocket_endpointr  	  s  è ø€ à
×
Ñ
Ó
×ÐØ#'€Mð(2à×*Ñ*Ó,×,ˆØ,0ˆð	Ü—j‘j “oˆGÙ<C˜GŸK™K¨Ô8ÈˆMô 	Ôá ´XÑ =Ü&›LˆMÜ&-¼$¿)¹)»+Ô&FŒH�]Ò#ä26·)±)³+ŒH�]Ñ#Ô/à,5Œ�ÑÔ)Ø*7Ô˜YÑ'à×!Ñ!¨9À}Ñ"UÓV×VÐVñ ”z '¬4Ô0°W·[±[ÀÓ5HÈFÒ5RÜ! )¨WÓ5×5Ð5àØ"×/Ñ/Ó1×1ˆDð`Ü—j‘j Ó&�Ü% i°Ó5×5Ð5ð	 ð= ùð
 -úô
 ×#Ñ#ò 	Úð	úð 	Wøð 6øð 2øð 6ùÜ×'Ñ'ò `Ø×)Ñ)°7ÈÐX[ÐW\ÐG]Ñ*^Ó_×_Ö_ûð`ûô ò ÙðúØá˜]¬hÑ6Ø04ŒH�]Ñ#Ô-Ü× Ñ  ¨DÕ1øñ ˜]¬hÑ6Ø04ŒH�]Ñ#Ô-Ü× Ñ  ¨DÕ1üsð   ‚I–E8—IžG  ±E;²G  ¹*E> Á#BG  Ã5FÃ69G  Ä/FÄ0G  ÅFÅ	G  Å$F  Å2FÅ3F  Å7G  Å8IÅ;G  Å>FÆG  ÆFÆG  ÆG  ÆG  ÆF  Æ GÆ3GÇGÇGÇG  ÇGÇG  Ç 	G,Ç)H Ç+G,Ç,H Ç0/IÈ0IÉIr‹   c              ƒ   ód  K  — t        | «      }|s| j                  dddœ«      ƒ d {  –—†  y t        |«      }|s| j                  dddœ«      ƒ d {  –—†  y t        j                  «       |_        |j                  d«      }|dk(  r2|j                  dd«      }t        j                  t        | |«      «       y |d	k(  r<d
|_	        |j                  r(	 |j                  j                  dddœ«      ƒ d {  –—†  y y | j                  dd|› �dœ«      ƒ d {  –—†  y 7 Œñ7 ŒÉ7 Œ*# t        $ r Y y w xY w7 Œ­w)NrÌ   zNo session. Please reconnect.rÍ   z$Session not found. Please reconnect.rM   r­   r†   r6   ÚstopTÚstoppedÚ	CancelledzUnknown message type: )rt   r¤   rw   ry   r-   rc   ÚasyncioÚcreate_taskr  r*   r+   rg   )rr   r‹   ru   r¨   Úmsg_typer†   s         r   r  r  9  s/  è ø€ Ü�r‹N€EÙØ�l‰l GÐ8WÑXÓY×YÐYØÜ˜5Ó!€GÙØ�l‰l GÐ8^Ñ_Ó`×`Ð`ØäŸ)™)›+€GÔØ�w‰w�v‹€Hà�6ÒØ—'‘'˜) RÓ(ˆÜ×ÑœH R¨Ó1Õ2à	�VÒ	Ø#'ˆÔ Ø×ÒðØ×'Ñ'×1Ñ1¸9ÐQ\Ñ2]Ó^×^Ñ^ð ð �l‰l GÐ:PÐQYÐPZÐ8[Ñ\Ó]×]Ñ]ð/ 	Zøð 	aøð _ùÜò Ùðúð 	^úsd   ‚%D0§D¨)D0ÁDÁA>D0Ã!D Ã2DÃ3D Ã7D0ÄD.ÄD0ÄD0ÄD Ä	D+Ä(D0Ä*D+Ä+D0z/healthc               ƒ   ó.   K  — dt        t        «      dœS ­w)NÚok)Ústatusr3   )r}   r3   r   r   r   Úhealthr"  Y  s   è ø€ à¬¬H«Ñ6Ð6ùs   ‚z/historyr  c           	   ƒ   óä   K  — t        | «      }|sdg iS |j                  j                  «       D ��cg c]-  \  }}||j                  |j                  |j                  dk(  dœ‘Œ/ }}}d|iS c c}}w ­w)NrO   rÒ   )r!   r…   r   Ú
isThinking)rw   r)   rO   r   r   )r  r¨   rª   r«   rO   s        r   Úget_historyr%  ^  s€   è ø€ ä˜=Ó)€GÙØ˜ˆ}Ðð %Ÿ_™_×2Ñ2Ó4÷ñ ˆG�Tð Ø—J‘JØ—I‘IØŸ*™*¨
Ñ2ó		
ð€Eñ ð �UÐÐùóùs   ‚/A0±2A*Á#A0z/clear-historyÚbodyc              ƒ   óØ   K  — | j                  d«      }|r|t        vrdddœS t        |   j                  j                  «        t        |   j                  j                  «        dddœS ­w)Nr  rÌ   zSession not found)r!  rÎ   r   zHistory cleared)rc   r3   r(   Úclearr)   )r&  ru   s     r   Úclear_historyr)  o  sb   è ø€ à�H‰H�_Ó%€EÙ�E¤Ñ)Ø!Ð.AÑBÐBÜˆU�O×Ñ×"Ñ"Ô$ÜˆU�O×Ñ×!Ñ!Ô#ØÐ'8Ñ9Ð9ùs   ‚A(A*)rU   N)Úupdate)dr  rù   rZ   ry   ro   r   r   Útypingr   r   r   r   r	   Úfastapir
   r   r   Úopenair   Úpydanticr   r   ÚtiktokenÚ	langsmithr   Úlangsmith.wrappersr   Úrouterr   r    r&   r3   r   r   r4   Úgetenvr5   r|   rð   Úget_encodingrˆ   rö   r[   r\   ÚdirnameÚ__file__Ú_PROMPT_PATHrd   Ú_fre   rÙ   rï   rf   r¥   Ústrftimer>   r@   ÚlistÚsortedÚlistdirÚ_sectionÚ_section_dirÚisdirÚ_section_filesÚ_mainÚ_subsrÀ   Ú_subrô   rø   rñ   r_   rk   rl   rz   rq   rt   rw   r‚   r2   rŽ   r�   r0   r1   rŸ   r©   r¯   r¼   r¿   rÈ   r  r+   r  r  rc   r"  r%  Úpostr  r)  )rE   s   0r   ú<module>rE     sœ  ðÜ Û Û 	Û Û ß 'ß 6Õ 6ç =Ñ =Ý ß *Û Ý Ý *Ù	‹€ô�)ô ô�)ô ô ˆiô  ð  "€ˆ$ˆs�Gˆ|Ñ
Ó !Ø-/Ð �d˜9 c˜>Ñ*Ó /à�—‘Ð+¨RÓ0€Ù Ð˜Ð(Ð)Ô *Ù=K‰‘[¨Ô8Ô	9ÐQU€Ø)�H×)Ñ)¨-Ó8Ð àÐ à�w‰w�|‰|˜BŸG™GŸO™O¨HÓ5°tÐ=OÓP€ðÙ	ˆl WÔ	-ð *°ØŸ™›	Ÿ™Ó)ˆ÷*ð # < 8§<¡<£>×#:Ñ#:¸:Ó#FÐ"GÀqÐIÈMÑY€àˆB�I‰IØØ‡G�G‡L�L�—‘—‘ Ó*¨D°'Ó:ó€	ð
	Ø €L�$�s‘)Ó Ù˜:˜2Ÿ:™: iÓ0Ó1ò (ˆØ—w‘w—|‘| I¨xÓ8ˆØ�w‰w�}‰}˜\Ô*ØÙñ  
Ø!�r—z‘z ,Ó/ô 
ó 
ˆð �*˜CÐ ˆØ*Ö9�q¨a°5«j’Ò9ˆØ�NÒ"Ø×Ñ 5 '¨ Ô-Øò 3�Ø×#Ñ# d¨4¨& MÕ2ð3âØ×#Ñ# BÕ'ð(ñ ØÐ4°t·y±yÀÓ7NÑNÑNˆñ ˆ˜�Ð'Ô (ð ØØVààØ#Ø$ hÐ/ð8ñ	ð	ð %˜ñ
ñ	ð	€ð, Ð Ø#Ð ð:�Sð :˜Só :ð˜D  c ™Nð ¨t°C¸°H©~ó ð" �+ð)Ð �$�s˜H�}Ñ%ó ð Ð ð�Có ð(�9ð ( ¨#¡ó (ð˜ð  ¨Ñ 1ó óAð˜D  c¨3 h¡Ñ0ð °Só ðC˜Sð C Só Cð
˜Cð 
¨Sð 
À#ð 
Ø#ð
Ø.3ð
Ø8<¸SÀ#¸X¹ó
ñ˜)ð ¨D°°c°©Nð À3ð ÐVZó ð*˜ð ¨Sð ¸ð Èó ð> €	Ø€
ð˜T $ s¨C x¡.Ñ1ð °d¸4ÀÀSÀ¹>Ñ6Jó ð:[�yð [°ð [¸ó [ðB ×Ñ�%Óð,2¨	ð ,2°dò ,2ó ð,2ð^^˜ið ^¨d°3¸°8©nð ^Àó ^ð@ ‡�ˆIÓñ7ó ð7ð ‡�ˆJÓð Sò ó ðð  ‡�ÐÓð:˜dò :ó ñ:÷q*ñ *ûàò ð	#ó ðüò. :øð ò 	Úð	úsa   Ä
P ÄP Ä9P Æ0BP  È5
PÉ PÉP  É1P  É>,P  Ð P
ÐP ÐPÐPÐP  Ð P)Ð(P)