
    yjV+                        d dl Z d dlmZmZmZmZmZmZmZm	Z	m
Z
 d dlmZ d dlmZ d dlmZ d dlmZ d dlmZmZ d dlmZ d d	lmZ d d
lmZ d dlmZmZ d dlm Z  d dl!m"Z" d dl#m$Z$m%Z%m&Z& d dl'm(Z(  e j)        e*          Z+ eddg e e dd                    g          Z, ed           ed           ed           ed          fde-de-dz  de-dz  de-dz  dej.        f
dZ/e,0                    de1ej2                 d          e,0                    d e1ej2                 dd!"           ed           ed          efd#edej3        de-de-d$ef
d%                        Z4e,0                    d&e1ej2                 d           ed           ed           ee/           ed          efd#ede-de-d'ej.        d(e
d$efd)            Z5e,0                    d*eej2                 +           ed           ed           edd,-           e	d!d.-          efde-de-d/ej6        dz  d0e7dz  d$ef
d1            Z8e,9                    d2ej2        +           ed           ed           ed          efde-de-d3e-d$efd4            Z:e,;                    d2ej2        +           ed           ed           ed           edd5-          efde-de-d3e-d6ej<        d$ef
d7            Z=dS )8    N)		APIRouterBackgroundTasksBodyDependsFileFormPathQuery
UploadFile)Page)	apaginate)AsyncSession)flag_modified)crudschemas)settings)db)enqueue)FileTooLargeErrorResourceNotFoundException)require_auth)prometheus_metrics)FileUploadedEventMessageCreatedEventemit)!process_file_uploads_for_messagesz9/workspaces/{workspace_id}/sessions/{session_id}/messagesmessagesworkspace_id
session_id)workspace_namesession_name)prefixtagsdependencies.peer_idmetadataconfiguration
created_atreturnc                 <  K   ddl }ddlm} d}|rF	 |                    |          }n/# |j        $ r" t                              d|            d}Y nw xY wd}|rF	 |                    |          }n/# |j        $ r" t                              d|            d}Y nw xY wd}|ra	 |                    |                    dd                    }n6# t          t          f$ r" t                              d|            d}Y nw xY wt          j        | |||	          S )
z(Parse form data for file upload requestsr   N)datetimezFailed to parse metadata JSON: z$Failed to parse configuration JSON: Zz+00:00zFailed to parse created_at: )r%   r&   r'   r(   )jsonr+   loadsJSONDecodeErrorloggerwarningfromisoformatreplace
ValueErrorAttributeErrorr   MessageUploadCreate)	r%   r&   r'   r(   r-   r+   parsed_metadataparsed_configurationparsed_created_ats	            </DATA/AppData/hermes/projects/honcho/src/routers/messages.pyparse_upload_formr;   (   s      KKK!!!!!!O #	#"jj22OO# 	# 	# 	#NNGXGGHHH"OOO	#   (	(#'::m#<#<  # 	( 	( 	(NNQ-QQRRR#'   	(  %	% ( 6 6""311! ! N+ 	% 	% 	%NNF*FFGGG $	% & *$	   s3   ( )AAA2 2)BB&)C 0DD    )response_modelstatus_code/F)r>   r?   include_in_schemabackground_tasksr   c                 ^  K   	 t          j        ||j                   d{V }t          j        j        r#t          j        t          |                     t          t          t          |          t          d |D                       d|d         j                             fdt          ||j        d	
          D             }|                     t          |           |S # t           $ r3}t"                              d dt'          |                       d}~ww xY w)z Add new message(s) to a session.r   r    r!   Ncountr    c              3   $   K   | ]}|j         V  d S Ntoken_count.0messages     r:   	<genexpr>z.create_messages_for_session.<locals>.<genexpr>t   s%       U U!4 U U U U U U    apir    r!   message_counttotal_tokenssourcelast_message_idc                 t    g | ]4\  }}|j         |j        |j        |j        |j        |j        |j        d 	5S )	r    r!   
message_idcontent	peer_namer(   message_public_idseq_in_sessionr'   idrZ   r[   r(   	public_idr]   r'   )rL   rM   originalr   r   s      r:   
<listcomp>z/create_messages_for_session.<locals>.<listcomp>{   sd     
 
 
 " #/ *%j"?$.%0%,%6")"8!)!7
 

 
 
rO   T)strictz&Failed to create messages for session : )r   create_messagesr   r   METRICSENABLEDr   record_messages_createdlenr   r   sumr`   zipadd_taskr   r4   r0   r1   str)rB   r   r   r   r   created_messagespayloadses     ``    r:   create_messages_for_sessionrq   T   s     2!%!5&'#	"
 "
 "
 
 
 
 
 
 
 # 	6*+++   
 	+'!"233  U UDT U U UUU 0 4 >  		
 		
 		

 
 
 
 
 &) ("3D& & &
 
 
$ 	!!'8444   V
VVcRSffVVWWWs   C(C/ /
D,9.D''D,z/upload	form_datafilec                   K   |j         r:|j         t          j        k    r%t          d|j          dt          j         d          t	          |j        j        j        j                   d{V }d |D             }t          j
        ||           d{V }t          |          D ]=\  }	}
||	         d         }|
j                            |           t          |
d	           > |j                     d{V  fd
|D             }|                     t"          |           t$                              dt)          |                     t          j        j        r#t/          j        t)          |                     |r|r|d         d         }t3          d |D                       }t5          t7          j        t9          |d                   |j        |j        |j         t)          |          |	  	                   t5          t?          t)          |          |d|d         j                              |S )zbCreate messages from uploaded files. Files are converted to text and split into multiple messages.zFile size (z& bytes) exceeds maximum allowed size (z bytes))rs   r%   r&   r'   r(   Nc                     g | ]
}|d          S )message_create )rL   items     r:   rb   z-create_messages_with_file.<locals>.<listcomp>   s    KKK$t,-KKKrO   rD   file_metadatainternal_metadatac                 n    g | ]1}|j         |j        |j        |j        |j        |j        j        d 	2S rX   r^   )rL   rM   rr   r   r   s     r:   rb   z-create_messages_with_file.<locals>.<listcomp>   s`         +&!* *!,!(!2%4&4
	
 
	
  rO   zHBatch of %s messages created from file uploads and queued for processingrE   r   c              3   $   K   | ]}|j         V  d S rH   rI   rK   s     r:   rN   z,create_messages_with_file.<locals>.<genexpr>   s%      OO77.OOOOOOrO   file_id)	r    r!   r[   r}   filenamecontent_typefile_size_bytesrS   rT   file_uploadrQ   rR   )!sizer   MAX_FILE_SIZEr   r   r%   r&   r'   r(   r   re   	enumeraterz   updater   commitrl   r   r0   debugri   rf   rg   r   rh   rj   r   r   rm   r~   r   r   r`   )rB   r   r   rr   rs   r   all_message_datamessage_createsrn   irM   ry   ro   rT   s    ```          r:   create_messages_with_filer      s
      y 
TY!777j$)jj8Kajjj
 
 	

 ?!#-'         LK:JKKKO!1
 #	           011 4 4
7(+O<!((777g23333
")++      (  H gx000
LLR    
2&'''	
 	
 	
 	
  
, 
(+O<OO>NOOOOO+'#+M)455!. $	!"233)
 
 
	
 	
 	
 	+'!"233)$ 0 4 >  		
 		
 		
 rO   z/list)r>   z&Filtering options for the message list)descriptionz'Whether to reverse the order of resultsoptionsreversec           	      T  K   	 d}|rt          |d          r|j        }|i k    rd}t          j        | |||           d{V }t	          ||           d{V S # t
          $ rB}t                              d| dt          |                      t          d          |d}~ww xY w)zLGet all messages for a Session with optional filters. Results are paginated.Nfilters)r    r!   r   r   z#Failed to get messages for session rd   zSession not found)
hasattrr   r   get_messagesr   r4   r0   r1   rm   r   )r   r   r   r   r   r   messages_queryrp   s           r:   r   r      s     D 	ww	22 	oG"}}#0'#	 
  
  
 
 
 
 
 
 
 r>222222222 D D DSZSS3q66SSTTT'(;<<!CDs   AA 
B'%=B""B'z/{message_id}rY   c                    K   t          j        || ||           d{V }|3t                              d| d|            t	          d| d          |S )z*Get a single message by ID from a Session.)r    r!   rY   NzMessage z not found in session zMessage with ID z
 not found)r   get_messager0   r1   r   )r   r   rY   r   honcho_messages        r:   r   r     s        +
<jZ        N P*PPJPPQQQ'(Q:(Q(Q(QRRRrO   zUpdated message parametersrM   c           	        K   	 t          j        ||| ||           d{V }t                              d|           |S # t          $ rB}t                              d| dt          |                      t          d          |d}~ww xY w)zk
    Update the metadata of a message.

    This will overwrite any existing metadata for the message.
    )rM   r    r!   rY   NzMessage %s updated successfullyzFailed to update message rd   zMessage not found)r   update_messager0   r   r4   r1   rm   r   )r   r   rY   rM   r   updated_messagerp   s          r:   r   r   /  s      D $ 3'#!!
 !
 !
 
 
 
 
 
 
 	6
CCC D D DI:IIQIIJJJ'(;<<!CDs   ;A   
B
=BB)>loggingfastapir   r   r   r   r   r   r	   r
   r   fastapi_paginationr   !fastapi_pagination.ext.sqlalchemyr   sqlalchemy.ext.asyncior   sqlalchemy.orm.attributesr   srcr   r   
src.configr   src.dependenciesr   src.deriverr   src.exceptionsr   r   src.securityr   src.telemetryr   src.telemetry.eventsr   r   r   src.utils.filesr   	getLogger__name__r0   routerrm   r6   r;   postlistMessageMessageBatchCreaterq   r   
MessageGetboolr   getr   putMessageUpdater   rw   rO   r:   <module>r      s   
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 $ # # # # # 7 7 7 7 7 7 / / / / / / 3 3 3 3 3 3                           G G G G G G G G % % % % % % , , , , , , M M M M M M M M M M = = = = = =		8	$	$	F
NVVVWW
 
 
 4994:: $T

!T$ZZ	) ))Dj) :) d
	)
  ) ) ) )X RW_ 53GGW_-3RW    S		d3ii: :%:(: : 	:
 	: : :  HG:z YtGO'<#NN S		d3ii-4W5F-G-GtCyyd d%dd d *	d
 d 	d d d ONdN WT'/%:;;S		d3ii)-B* * * !5D   D DDD $&D D[D 	D D D <;D@ OGO<<S		d3iid3ii	   		   =<  OGO<<S		d3iid3ii%)T5& & & D DDD D "	D 	D D D =<D D DrO   