
    }jD6                     2   d dl Z d dlmZmZmZmZmZ d dlmZm	Z	m
Z
mZmZ d dlmZ d dl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 d dlmZmZm Z m!Z!m"Z" d dl#m$Z$ d dl%m&Z&m'Z'm(Z(m)Z)m*Z* d dl+m,Z,m-Z.  G d de          Z/ G d d          Z0d Z1dS )    N)	Annotated	TypedDictSequenceLiteralAny)BaseMessageHumanMessageSystemMessage	AIMessageToolMessage)add_messages)
StateGraphSTARTEND)ToolNode)tool)
ChatOpenAI)settings)BASE_SYSTEM_TEMPLATE)MAX_TOKEN_LIMIT(HOTEL_RETRIEVE_DOCUMENTATION_DESCRIPTIONHUMAN_ESCALATION_DESCRIPTION#GET_RESERVATION_DETAILS_DESCRIPTION GET_AVAILABLE_ADDONS_DESCRIPTION)HotelRAGService)AgentRetrieverResponseGetReservationDetailsArgsGetAvailableAddonsArgsHumanEscalationArgsHotelAgentResponse)get_reservationget_available_addonsc                   6    e Zd ZU eee         ef         ed<   dS )
AgentStatemessagesN)__name__
__module____qualname__r   r   r   r   __annotations__     K/var/www/html/ls-pms-bot-apis/app/services/hotel_langgraph_agent_service.pyr$   r$      s-         -|;<<<<<<r+   r$   c            	          e Zd ZeZd Zdee         fdZd Zdee         de	fdZ
ddee         d	e	dee         fd
ZdefdZdededef         fdZd ZdedefdZdedefdZdee         deeeedz  f         fdZdededefdZdee         dz  dededee         fdZ	 	 ddedee         dz  dedz  defdZdS )HotelLangGraphAgentServicec                 *   d | _         t          t          j        dt          j        d          | _        |                                 | _        | j                            | j        ddt                    | _
        |                                 | _        d S )Ng      ?F)modeltemperatureopenai_api_key	streamingT)toolsparallel_tool_callsstrictresponse_format)reservation_detailsr   r   	LLM_MODELOPENAI_API_KEYllm_build_toolsr4   
bind_toolsr    llm_with_tools_build_graphgraphselfs    r,   __init__z#HotelLangGraphAgentService.__init__#   s    04 $#2	
 
 
 &&((
"h11* $.	 2 
 
 &&((


r+   returnc                 .    t          t                    gS )Ncontent)r
   r   rA   s    r,   get_agent_promptz+HotelLangGraphAgentService.get_agent_prompt8   s    &:;;;<<r+   c                     t          t          t          d          dt          f fd            }t          t          t
                    dt          f fd            }t          t          t                    dt          dt          fd	            }t          t          t          d          dt          fd
            }||||gS )NT)descriptionargs_schemareturn_directrD   c                    K   j         pi } t          d|            |                     d          }|                     d          }|                     d          }|                     d          }|r|sdS t          |          t          |          d}|t          |          |d<   |t          |          |d<   t	          d	i | d {V }t          d|           |S )
Ndetailsemailconfirmation_numberhotel_idsub_hotel_idz<No reservation details are available for this guest session.)rP   rO   resultr*   )r8   printgetstrr!   )rN   rO   rP   rQ   rR   lookup_kwargsrS   rB   s          r,   get_reservation_detailszHHotelLangGraphAgentService._build_tools.<locals>.get_reservation_details<   s      .4"G)W%%%KK((E")++.C"D"D{{:..H";;~66L V 3 VUU (++>'?'?U M #,/MMj)'03L0A0An-*;;];;;;;;;;F(F###Mr+   )rJ   rK   c                  >  K   j         pi } |                     d          }|                     d          }|st          j        ddi          S t	          t          |          |t          |          nd            d {V }t          j        |t
                    S )NrQ   rR   errorz`Hotel ID is missing from this guest session, so available products and add-ons cannot be loaded.)rQ   rR   )default)r8   rU   jsondumpsfetch_available_addonsrV   )rN   rQ   rR   rS   rB   s       r,   r"   zEHotelLangGraphAgentService._build_tools.<locals>.get_available_addonsZ   s      
 .4"G{{:..H";;~66L zR   2X2>2JS...PT        F :fc2222r+   queryquestionc                    K   | |g}t                      }|                    |d           d {V }|sdS |                    |          S )N   )kz7No relevant hotel information was found for this query.)r   _safe_retrieve_batchformat_documents)r_   r`   all_queriesrag_service	documentss        r,   retrieve_documentationzGHotelLangGraphAgentService._build_tools.<locals>.retrieve_documentations   sj      
 !(+K)++K)>>{a>PPPPPPPPI QPP//	:::r+   c                 6   K   t          j        d| dd          S )NTz;Guest request has been escalated to a hotel representative.)	escalatedstaff_querymessage)r\   r]   )r_   s    r,   human_escalationzAHotelLangGraphAgentService._build_tools.<locals>.human_escalation   s/       :!%#(\   r+   )
r   r   r   rV   r   r   r   r   r   r   )rB   rX   r"   ri   rn   s   `    r,   r<   z'HotelLangGraphAgentService._build_tools;   s6   	;1

 

 


	s 	 	 	 	 	

 


	2 
8.

 

 

	3C 	3 	3 	3 	3 	3	

 

	3* 
@.

 

 

	; 	;s 	; 	; 	;	

 

	; 
4+

 

 


	# 	 	 	

 


	 ## 	
 	
r+   r%   c                    	 | j                             |          S # t          $ r d}|D ]}|j        }t	          |t
                    r|t          |          z  }1t	          |t                    rV|D ]S}t	          |t                    r<|	                    d          }t	          |t
                    r|t          |          z  }Tt          d|dz            cY S w xY w)Nr   text   rb   )r;   get_num_tokens_from_messages	ExceptionrG   
isinstancerV   lenlistdictrU   max)rB   r%   total_charsmsgrG   itemrp   s          r,   _num_tokens_from_messagesz4HotelLangGraphAgentService._num_tokens_from_messages   s    	,888BBB 	, 	, 	,K 	9 	9+gs++ 93w<</KK.. 9 ' 9 9%dD11 9#'88F#3#3D)$44 9 +s4yy 8q+*+++++	,s    B>CCr   historyquestion_tokenc                    |sg S g }|D ]`}t          |t                    st          |                    d          p|                    d          pd                                          }|                    d          p|                    d          pd}t          |t                    r|                                s|dv r$|                    t          |                     |dv r%|                    t          |                     |d	v rQ|                                	                    d
          r|nd| }|                    t          |                     b|sg S |                     |          }t          d| j        |z
            }	|r8||	k    r2|                    d           |                     |          }|r||	k    2|S )Ntyperole rp   rG   >   userhumanrF   >   aibot	assistant>   adminsystemhotel_adminzadmin:zAdmin: r   )rt   rw   rV   rU   lowerstripappendr	   r   
startswithr
   r|   rx   r   pop)
rB   r}   r~   
normalizedr{   r   rp   
admin_texttoken_countmax_alloweds
             r,   _history_to_base_messagesz4HotelLangGraphAgentService._history_to_base_messages   s    	I(*
 	E 	EDdD)) txx''A488F+;+;ArBBHHJJD88F##@txx	':':@bDdC(( 

 (((!!,t"<"<"<====333!!)D"9"9"9::::;;;%)ZZ\\%<%<X%F%F\TTL\VZL\L\
!!-
"C"C"CDDD 	I44Z@@!T1NBCC 	E[;66NN188DDK  	E[;66 r+   statec                    K   |                                  }|                    |d                    | j                            |ddi           d {V }d|giS )Nr%   run_name
HotelAgent)config)rH   extendr>   ainvoke)rB   r   r%   responses       r,   
call_agentz%HotelLangGraphAgentService.call_agent   s      ((**j)***,44- 5 
 
 
 
 
 
 
 
 XJ''r+   r4   c                 V    |d         }|d         }t          |dd           rdS t          S )Nr%   
tool_callsr4   )getattrr   )rB   r   r%   last_messages       r,   should_continuez*HotelLangGraphAgentService.should_continue   s3    $|<t44 	7
r+   c                 p   t          t                    }|                    d| j                   |                    dt	          | j                             |                    t          d           |                    d| j	                   |                    dd           |
                                S )Nagentr4   )r   r$   add_noder   r   r4   add_edger   add_conditional_edgesr   compile)rB   workflows     r,   r?   z'HotelLangGraphAgentService._build_graph   s    j))'4?333'8DJ#7#7888%)))&&w0DEEE'7+++!!!r+   rG   c                 <   |dS t          |t                    r|S t          |t                    rg }|D ]}t          |t                    r|                    |           -t          |t                    r?|                    d          }t          |t                    r|                    |           d                    |          S t          |t                    r.|                    d          }t          |t                    r|ndS t          |          S )Nr   rp   )rt   rV   rv   r   rw   rU   join)rB   rG   partsr{   rp   s        r,   _normalize_contentz-HotelLangGraphAgentService._normalize_content   s   ?2gs## 	Ngt$$ 		"E + +dC(( +LL&&&&d++ +88F++D!$,, +T***775>>!gt$$ 	9;;v&&D%dC00844b87||r+   c                    |                      |                                          }|sdddS |                    d          r	 t          j        |          }t          |t                    rdt          |                    d          t                    r|                    dd          ndt          |                    dd                    dS n# t          $ r Y nw xY w|ddS )Nr   F)answerrk   {r   rk   )r   r   r   r\   loadsrt   rw   rU   rV   boolrs   )rB   rG   rp   parseds       r,   _parse_final_answerz.HotelLangGraphAgentService._parse_final_answer   s   &&w//5577 	6 u555??3 		D))fd++ >HT\I]I]_b>c>c"k&**Xr":":":ik%)&**[%*H*H%I%I  
     U333s   BC 
C C Nc                 "   d}d}d}|D ]}t          |dd          pg }|D ]}t          |t                    r|                    d          nt          |dd          }|dv rd}D|dk    rd}t          |t                    r|                    d          nt          |di           pi }	t          |	t                    r|	                    d	          nd}
t          |
t                    r(|
                                r|
                                }t          |t                    rt          |dd          pd
}|dv rd};|dk    rd}|                     |j                  }	 t          j
        |          }|                    d          }t          |t                    r(|                                r|                                }# t          $ r. |                                r|s|                                }Y w xY w|||fS )z:Return (used_retrieve, used_escalation, escalation_query).FNr   name>   r"   ri   rX   Trn   argsr_   r   rl   )r   rt   rw   rU   rV   r   r   r   rG   r\   r   rs   )rB   r%   used_retrieveused_escalationescalation_queryrm   r   	tool_callr   r   r_   rawpayloadrl   s                 r,   _extract_tool_usagez.HotelLangGraphAgentService._extract_tool_usage
  sQ    #	; #	;G ,==CJ' 9 9	0:9d0K0Kqy}}V,,,QXYbdjlpQqQq   
 %)MM///&*O4>y$4O4Oy9==000U\]fhnprUsUsUywyD1;D$1G1GQDHHW---TE!%-- 9%++-- 9+0;;==(';// ;w55;   
 %)MM///&*O11'/BBC;"&*S//&-kk-&@&@%k377 CK<M<M<O<O C/:/@/@/B/B,$ ; ; ;99;; ;/? ;/2yy{{,; o/???s   'A&G4HHr   r   c                     |rdS |rdS dS )Nsupport_escalationlookup_answerr   r*   )rB   r   r   s      r,   _resolve_eventz)HotelLangGraphAgentService._resolve_event7  s"     	('' 	#"?xr+   r_   r   c                     g }|pg D ],}t          |t                    r|                    |           -|                    d|d           |r|                    d|d           |S )Nr   )r   rp   r   )rt   rw   r   )rB   r}   r_   r   updatedr{   s         r,   _build_historyz)HotelLangGraphAgentService._build_history>  s    Mr 	% 	%D$%% %t$$$66777 	;NND&99:::r+   r8   c                   K   || _         |                     t          |          g          }|                     |pg |          }|                    t          |                     | j                            d|i           d {V }|                    d          pg }|                     |          \  }}	}
| 	                    ||	          }d }t          |          D ],}t          |t                    rt          |dd           s|} n-|                     |rt          |dd          nd          }|                    dd          }||                     |||          d}|d	k    r|
r|
|d
<   ||dS )NrF   )r~   r%   r   rG   r   r   )r   r}   r   r   )eventdata)r8   r|   r	   r   r   r@   r   rU   r   r   reversedrt   r   r   r   r   )rB   r_   r}   r8   r~   history_messagesrS   r%   r   r   r   r   last_airm   r   answer_textr   s                    r,   r   z!HotelLangGraphAgentService.answerI  s      $7 77e9T9T9T8UVV99'-RXf9ggU ; ; ;<<<z)):7G*HIIIIIIII::j))/R;?;S;ST\;];]8(8##M?CC)) 	 	G'9-- gg|UY6Z6Z !))W*\''9b*I*I*IZ\]]jj2.. "**7E;GG
 
 (((-=('7D#$ 
 
 	
r+   )r   )NN)r&   r'   r(   r   rC   rv   r   rH   r<   intr|   rw   r   r$   r   r   r   r   r?   r   rV   r   r   r   tupler   r   r   r   r   r*   r+   r,   r.   r.       sT       %O) ) )*=${"3 = = = =W
 W
 W
r,${2C , , , , ," d S Y]^iYj    B(j ( ( ( (Z GGSL4I    
" 
" 
"# #    (43 44 4 4 4 4$+@H[,A +@eDRVX[^bXbLbFc +@ +@ +@ +@ZD 4 C    	d4j4&7 	 	S 	UYZ^U_ 	 	 	 	 &*+/	%
 %
%
 dd"%
 "D[	%

 
%
 %
 %
 %
 %
 %
r+   r.   c                      t                      S )N)r.   r*   r+   r,   get_hotel_langgraph_servicer   q  s    %'''r+   )2r\   typingr   r   r   r   r   langchain_core.messagesr   r	   r
   r   r   langgraph.graph.messager   langgraph.graphr   r   r   langgraph.prebuiltr   langchain_core.toolsr   langchain_openair   app.core.configr   app.core.promptsr   app.core.constantsr   r   r   r   r   app.services.hotel_rag_servicer   app.models.chatr   r   r   r   r    app.utils.extrar!   r"   r^   r$   r.   r   r*   r+   r,   <module>r      s    ? ? ? ? ? ? ? ? ? ? ? ? ? ? d d d d d d d d d d d d d d 0 0 0 0 0 0 2 2 2 2 2 2 2 2 2 2 ' ' ' ' ' ' % % % % % % ' ' ' ' ' ' $ $ $ $ $ $ 1 1 1 1 1 1              ; : : : : :              \ [ [ [ [ [ [ [= = = = = = = =N
 N
 N
 N
 N
 N
 N
 N
b
( ( ( ( (r+   