
    zg+                          d dl Z d dlmZmZ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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   G d de      Z! G d d      Z"y)    N)UnionDictTuple)datetimetimezone)run_code)settings)get_session)factCode
factSchemareportSchema)create_agent_promptfact_promptget_agent_prompt)Tool)AgentExecutor)MessagesPlaceholder)
ChatOpenAI)create_openai_functions_agent)textc                   4    e Zd ZdZdeeef   deeef   fdZy)
CustomToolz;Custom Tool Just For Override _to_args_and_kwargs function.
tool_inputreturnc                 4    t        |t              r|fi fS d|fS )N )
isinstancestr)selfr   s     +/var/www/html/chat-with-data/app/rag/rag.py_to_args_and_kwargszCustomTool._to_args_and_kwargs   s#    j#&="$$z>!    N)	__name__
__module____qualname____doc__r   r   r   r   r!   r   r"   r    r   r      s+    E"eCI.> "5PTCU "r"   r   c                       e Zd Zdededededededdfd	Zd
edefdZddedefdZddedededefdZ	dg fde
fdZd Zd Zd Zd Zy)RAGllmquerydb_userdb_passworddb_namedb_hostr   Nc                 X    || _         || _        || _        || _        || _        || _        y N)r)   r*   r+   r,   r-   r.   )r   r)   r*   r+   r,   r-   r.   s          r    __init__zRAG.__init__   s2     
&r"   	tool_namec           
      n  K   d| j                   t        dd| j                  t        dd}t	        ||j                  |      j                  d      |j                  |      j                  d      |j                  |      j                  d      d|j                  |      j                  d      	      S w)
NzAlways use this tool to fetch data from sql database. Always formate date fields like HH:MM:SS - DD/MM/YYYY. Always place important fields first or if user ask changes in any field then place that first.)descriptionfuncschemaz8Use this tool to fetch the past data from the fact file.)
gen_reportfact_reportr4   r5   Tr6   )namer4   r5   	coroutinereturn_directargs_schema)r7   r   r8   r   r   get)r   r2   tool_detailss      r    create_toolzRAG.create_tool-   s      l& X&&"
 %)))488G""9-11&9#''	266v>$((377A
 	
s   B3B5standaloneQuestiondatec                   K   d }d}t        t        j                  d      }|j                  t        d       t               |z  }t        dd      5 }	|	j                         }d d d        |j                  ||d|d	d
       d {   }
|
r	 t        |
j                  |       d {   }||dS # 1 sw Y   PxY w7 67 # t        $ r}t        |       Y d }~.d }~ww xY ww)N zgpt-4o-2024-08-06)api_keymodelT)strict6/var/www/html/chat-with-data/test/hotel_2023-06-08.txtr)factquestionz
fact-chain	callbacksrun_name)inputconfig)rA   data)r   r	   
OPENAI_KEYwith_structured_outputr   r   openreadainvoker   content	Exceptionprint)r   r@   rA   rL   kwargsrP   factDatar)   	factChainfactFileresultes               r    r8   zRAG.fact_reportE   s      !4!4;NO""84"8MC'	 JSQU]}}H R !((xM_/`u~  KW  iX(  Y  Y%fnnT:: t,, RQ Y
 ; asf   AC#B2#$C#B>C#C (C )C -C#2B;7C# C 	C CC#C  C#
reportNamesqlQueryfromDatetoDatec                 n   K   |dk(  r| j                  ||      }n| j                  |      }|||||dS w)Nlodging_statistics)	sql_query)r_   r`   ra   rb   rP   )
log_reportexecute_raw_query)r   r_   r`   ra   rb   rL   rY   rP   s           r    r7   zRAG.gen_report^   sE     --??8V4D))H)=D(X(]cmqrrs   35chat_historyc           	        K   || _         t        t               t        d      g      }| j	                  d       d {   | j	                  d       d {   g}t        t        | j                  ||      |d      }d	}d	}t        d
d      5 }|j                         }d d d        t        dd      5 }	|	j                         }d d d        |j                  | j                  |||t        j                         j                  d      d|dd       d {   }
d|
j                  d      t        j                   t"        j$                        j'                         dS 7 $7 # 1 sw Y   xY w# 1 sw Y   xY w7 gw)Nrh   )variable_name)system_messageextra_prompt_messagesr7   r8   )r)   toolspromptT)agentrm   return_intermediate_stepsrC   z0/var/www/html/chat-with-data/test/fullSchema.txtrH   rG   z%Y-%m-%d)rN   rh   contextrI   rA   
SuperAgentrK   )rO   botoutput)tz)roleanswer	timestamp)rL   r   r   r   r?   r   r   r)   rS   rT   rU   r*   r   todaystrftimer=   nowr   utcrx   )r   rL   rh   rn   rm   ro   r6   rI   filer\   responses              r    rU   zRAG.ainvokeg   s    "$4D4F^q  AO  _P  ^Q  R''55''668 /DHHERXY&*

 DcJdYY[F KJCPT\==?D Q \flvz  EM  ES  ES  EU  E^  E^  _i  Ej  (l  BK  Xd  ue  f  f(,,x*@x||_g_k_kOlOvOvOxyy! 66 KJPP fs_   <FE"FE%9FE(!F5E4AFF A
F%F(E1-F4E=9Fc                 F    t        |t              r|j                         S |S r0   )r   r   	isoformat)r   values     r    serialize_valuezRAG.serialize_value|   s    eX&??$$r"   c                    t               }	 |j                  t        |            }|j                         }|j	                         }|D cg c]1  }t        ||      D ci c]  \  }}|| j                  |       c}}3 }	}}}|	|j                          S c c}}w c c}}}w # t        $ r(}
t        d|
        Y d }
~
|j                          y d }
~
ww xY w# |j                          w xY w)NzAn error occurred: )
r
   executer   fetchallkeyszipr   closerW   rX   )r   re   sessionresult_proxy
result_setcolumn_namesrowcolumnr   result_as_dictr^   s              r    rg   zRAG.execute_raw_query   s    -	"??4	?;L &..0J (,,.L
 &%C KNl\_J`aJ`--e44J`a%   " MMO b  	's+, MMO	 MMOsN   A B% B B<BB% BB% %	C.C<C CC C+c                 l   	 ||dg dd}t        t        j                         ddt        j                  d}t        j                  d||      }t        |j                                |j                  sy 	 | j                  |j                               S # t        $ r}t        |       Y d }~y d }~ww xY w)	Nlistingnew)startendmodeselected_hotel
factReport12112)HotelidCurrent_versionAuthorizationzLhttps://mtstaging.lodgingsystem.com/ls-api/Factreports/getlodgingStatsReport)jsonheaders)	rX   r	   TOKENrequestspostr   okrW   
parse_data)r   r   r   rP   r   r~   r^   s          r    rf   zRAG.log_report   s    	!"$#D (..!"& (G
  }}^H
 (--/";; 
 x}}//  	!H	s   A2B 	B3B..B3c                    |d   }|d   }g }|D ]o  }i }t        |j                               }t        |      D ]3  \  }}	|	j                  dd      }
|t	        |      k  r	||   ||
<   /d||
<   5 |j                  |       q |S )Ncolumnsr]   .rC   )listvalues	enumeratereplacelenappend)r   rP   r   resultsparsed_resultsr]   r   result_valuesir   cols              r    r   zRAG.parse_data   s    y/x. FC 1M&w/	6nnS,s=)),Q/CH!CH 0 !!#&  r"   r0   )NNNNN)r#   r$   r%   r   r   r1   r   r?   r8   r7   r   rU   r   rg   rf   r   r   r"   r    r(   r(      s      	
    "
# 
* 
0-3 -S -2s# ss sTW sgj s )-" z4 z*
@08r"   r(   )#r   typingr   r   r   r   r   app.utils.extrar   app.config.applicationr	   app.model.sql_connectionr
   app.schemas.chat_schemar   r   r   app.utils.promptsr   r   r   langchain.toolsr   langchain.agentsr   langchain.prompts.chatr   !langchain_openai.chat_models.baser   ,langchain.agents.openai_functions_agent.baser   
sqlalchemyr   r   r(   r   r"   r    <module>r      sP     % % ' $ + 0 F F P P   * 6 8 V " "v vr"   