
    _ggK+                        d dl mZmZmZ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Zd dl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 d dlmZ d dlmZmZm Z m!Z! d dl"m#Z#  e       Z$ e       Z% e         ejL                  d       Z' e( ejL                  d            dz   Z) e( ejL                  d            dz   Z* e       Z+e$jY                  d       ed       ed       ed       ed       ed       ed       ee%      fde(dee(   de-de.dee-   de(de	fd       Z/e$jY                  d       ed       ed       ed       ed       ed       e ejL                  d             ed       ed       ed       ed       ed       ed       ed       ee%      fde(dee(   de-de.dee(   d ee(   d!ee-   d"ee-   dee-   dee(   d#ee(   d$ee(   d%ee(   de	fd&       Z0d' Z1y)(    )Form	APIRouterDependsHTTPExceptionstatusRequest)
HTTPBearerHTTPAuthorizationCredentials)JSONResponse)load_dotenvN)ListOptional)OpenAI)text)HybridSearch)*)UserFolder	DocumentsChatHistoryCOLLECTION_NAMEDB_PATH/STORAGE_PATHz/text.   querydoc_id	folder_idhybrid_weighttop_klimitscredentialsc           	        K   t        j                         }|j                  }t        j                  ||      }		 |j                  t              j                  t        j                  |	j                  k(        j                  t        j                  |k(        j                         }
|r]|j                  t              j                  t        j                  |k(        j                         }|st        dd      S |j                  }|
st        dd      S t        t         |	j"                  |
j                        }|j%                        }|j'                  | |||      }d }d }g }|rMt)        t+        j,                  |d   d         d         dz   |d   d	   f}|d d D ]W  }t+        j,                  |d         }|d
   dk(  r
|d k(  r|d   }|d
   dk(  s6|d k(  s<|d   }t.        j1                  dd|      }Y dj3                  d |D              }|D ]  }|d	   j5                  dd      |d	<   |d	   j5                  dd      |d	<   |d	   j5                  dd      |d	<   |d	   j5                  dd      |d	<   |j7                  t)        t+        j,                  |d         d         dz   |d	   d        nd}d}t9        dd|i      S # t:        $ r}t=        ddt?        |             d }~ww xY ww)NDocument not found.  Folder does not exist.alphar    r   metadatapage_number   contenttypeimagepathtablehtml\\t(?![hd]) 
c              3   &   K   | ]	  }|d      ywr,   N .0results     )/var/www/html/answerous/routers/search.py	<genexpr>zsearch_text.<locals>.<genexpr>\   s     #S&F9$5#S   	z  )page_numr,    
chunk_data  Something went wrong: status_codedetail) dbaseSessionLocalr"   authget_current_userr   r   filteruser_idr   firstr   r   errorResponsesanitized_namer   collection_name	user_codeget_document_uuidsearchintjsonloadsresubjoinreplaceappendsuccessReponse	Exceptionr   str)r   r   r   r   r    r!   r"   dbtokenuserfolderdocumentfilenamehsdocument_uuidsearch_resultsimg_pathr1   rB   citationr:   r)   passagees                           r;   search_textrm      s    . 
			B##E  U+DDW&!((4<<)GHOOPVP`P`dmPmnttvxx	*11)2B2Bf2LMSSUH$) 
 $22 (  ot~~v?T?TUB 00:M  YYum=W\Y]NHDJ

>!+<Z+H I- XY\]]_mno_pqz_{|,Ra0 AF#zz&*<=H'0Xt^#+F#3'0T4Z'/!vvnc4@A ))#SN#SS, F )/y(9(A(A$(LF9%(.y(9(A(A$(LF9%(.y(9(A(A$(LF9%(.y(9(A(A$(LF9%%%$'

6*3E(F}(U$VYZ$Z#))#4'   "j)   W6LSQRVH4UVVWsO   7K1B?K 9K1:K K1C K K C+K K1	K.K))K..K1z/answerg      ?OPENAI_MODELr+   llmprompttemperaturetop_pemailr)   query_responsec                 v  K   t        j                         }|j                  }t        j                  ||      }|j                         }d|cxk  rdkD  rn nd}d|cxk  rdkD  rn nd}	 |j                  t              j                  t        j                  |j                  k(        j                  t        j                  |k(        j                         }|r|rt        j                  |      }t        |      j                  dd      }|j                  t               j                  t         j"                  |k(  t%        d| d            j                         }nC|j                  t               j                  t         j"                  |k(        j                         }|st'        dd	      S |j(                  }nd
}|st'        dd	      S |
r|j                  t*              j                  t*        j,                  |
k(        j                  t*        j.                  |j.                  k(        j                         }|st'        dd	      S t1        | |||j(                  ||||||||j                  |      \  }}}}}|\  }}t3        d
|||d      S y # t4        $ r}t7        ddt        |             d }~ww xY ww)Nr      r+   '"zJSON_CONTAINS(doc_metadata, 'z')r$   r%   rA   r&   zUser does not exist.)full_resultr@   r,   rC   rD   rE   )rH   rI   r"   rJ   rK   stripr   r   rL   rM   r   rN   rV   rW   r_   r[   r   r   r   rO   rP   r   rs   org_idanswer_queryr]   r^   r   )r   r   r   r   ro   rp   rq   rr   r    r!   rs   r)   rt   r"   r`   ra   rb   rc   json_filter_strrd   re   	chat_useranswerri   r1   rj   rk   r@   r,   rl   s                                 r;   search_answerr   |   s    " 
			B##E  U+D\\^FK!E~A~+W&!((4<<)GHOOPVP`P`dmPmnttv::h/"%h-"7"7S"A88I.55$$.88ILM %' 
 88I.55i6F6F&6PQWWY$) 
 $22H ( 
 HHTN11$**2EFMMdkk]a]h]hNhiooq	 (. 
 BNeU]_cekezez  |B  CF  GM  NY  Z_  `e  fs  t}  tE  tE  FT  BU=FHdHg(0%Hg)(.(WU    W6LSQRVH4UVVWsQ   A'J9*EJ -J9.J 
J9A<J J9AJ J9	J6J11J66J9c                 
   t        t        |j                  |      }|j                  |      }|j	                  | ||
|	      }d }d }|rt        t        j                  |d   d         d         dz   |d   d   f}|d d D ]W  }t        j                  |d         }|d   dk(  r
|d k(  r|d	   }|d   d
k(  s6|d k(  s<|d   }t        j                  dd|      }Y dj                  d |D              }nd}d}|sd}d|  d| d| d|  d	}t        j                  d      }d|dg}|r%t        |t              rt        j                  |      }|r|j                  |       	 t         j"                  j$                  j'                  ||      }|j(                  d   j*                  j,                  }t1        j2                         }	 t5        |||| |t        t        j                  |d   d         d         dz   ||      }|j7                  |       |j9                          |j;                  |       |||||fS # t.        $ r}d| }Y d }~d }~ww xY w# t.        $ r(}|j=                          t?        d|        Y d }~Nd }~ww xY w)Nr'   r   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   r3   r4   c              3   &   K   | ]	  }|d      ywr6   r7   r8   s     r;   r<   zanswer_query.<locals>.<genexpr>   s     K&F9-Kr=   rA   aU  
        You are a bot-assistant that answers the above question. When answering this question, use the following rules:
        - always answer in English language;
        - use ONLY the information from the sources below;
        - answer briefly in just a few sentences, strictly in accordance with the sources, and do not make any assumptions;
        - reference the source if you use it in the answer, e.g. [#1] or [#2][#4];
        - if there is no information on the question in the sources: say that you can't find the answer and ask the user to try to reformulate the question.
        zThe question is z?===z===
    The sources are z 
    And again, the question is z?
    rn   rb   )roler,   )modelmessageszError occurred: )rM   r   rg   r   rh   rj   query_promptrt   ) r   rQ   rR   rS   rT   rU   rV   rW   rX   rY   rZ   osgetenv
isinstancer_   extendopenai_clientchatcompletionscreatechoicesmessager,   r^   rH   rI   r   addcommitrefreshrollbackprint)r   pdf_namerb   folder_namer   ro   rp   rq   rr   r    r   chat_user_idquery_responsesrf   rg   rh   ri   r1   rj   r:   r)   rk   r   	gpt_modelmessage_dataresponsechat_responserl   r`   chat_historys                                 r;   r|   r|      s   	ot~~{	CB ((2M YYum=uYUNHD

>!#4Z#@A-PQTUUWefgWhirWst$Ra( 	9Fzz&"45H(Xt^#F+(T4Z'vvnc48	9 ))KNKK 	 )tF8 <I   %w 'L
 		.)I L1L :os;**_5O,/ %%1188! 9 
 !((+33;; 
			B&"$+&TZZq(9*(EF}UVYZZ),	 	|
		


< 
 (D(G;;-  /*1#./$  &
 $%%&s2   AH6 A-I 6	I?I		I	JI==J)2fastapir   r   r   r   r   r   fastapi.securityr	   r
   fastapi.responsesr   dotenvr   r   rV   typingr   r   openair   
sqlalchemyr   dependencies.HybridSearchr   dependencies.helperdb_config.databasedatabaserH   db_config.modelsr   r   r   r   db_config.authrJ   routersecurityr   rQ   r_   	DB_FOLDERUPLOAD_FOLDERr   postrU   floatrm   r   r|   r7       r;   <module>r      s   L L E *  	  !   2 ! " A A  
< RYY012			)$%c)	IBIIn-.s2h Wc J#Y98t*070A]W]WSM]W ]W 	]W
 C=]W ]W .]W ]W@ Yc J#Y9d >!:;!%a78 J:"4j$(J070AEWEWSMEW EW 	EW
 
#EW SMEW #EW C=EW C=EW SMEW C=EW smEW SMEW .EW EWPR<r   