o
    fgK+                     @   sL  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T 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&d Z'e(e&dd Z)e(e&dd Z*e Z+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(de	fddZ/e$,dedededededee&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'd(Z0d)d* Z1dS )+    )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              
      s8  t  }|j}t||}	z|ttj|	jktj	|k
 }
|r=|ttj|k
 }|s:tddW S |j}|
sEtddW S tt|	j|
j}||}|j| |||d}d }d }g }|rtt|d d d d |d d	 f}|d d D ],}t|d }|d
 dkr|d kr|d }|d
 dkr|d kr|d }tdd|}q~ddd |D }|D ]?}|d	 dd|d	< |d	 dd|d	< |d	 dd|d	< |d	 dd|d	< |tt|d d d |d	 d qnd}d}tdd|iW S  ty } ztddt| dd }~ww )NDocument not found.  Folder does not exist.alphar   r   metadatapage_number   contenttypeimagepathtablehtml\\t(?![hd]) 
c                 s       | ]}|d  V  qdS r*   N .0resultr5   r5   -/var/www/html/answerous_api/routers/search.py	<genexpr>\       zsearch_text.<locals>.<genexpr>	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_pathr/   r@   citationr8   r'   passageer5   r5   r9   search_text   sp   (
*
rk   z/answerg      ?OPENAI_MODELr)   llmprompttemperaturetop_pemailr'   query_responsec                    s  t  }|j}t||}| }d|  krdkr n nd}d|  kr*dkr.n nd}z|ttj	|j	ktj
|k }|r|rit|}t|dd}|ttj|ktd| d }n|ttj|k }|s~tdd	W S |j}nd
}|stdd	W S |
r|ttj|
ktj|jk }|stdd	W S t| |||j||||||||j	|\}}}}}|\}}td
|||dW S W d S  ty } ztddt| dd }~ww )Nr      r)   '"zJSON_CONTAINS(doc_metadata, 'z')r"   r#   r?   r$   zUser does not exist.)full_resultr>   r*   rA   rB   rC   )rF   rG   r!   rH   rI   stripr   r   rJ   rK   r   rL   rT   rU   r]   rY   r   r   r   rM   rN   r   rq   org_idanswer_queryr[   r\   r   )r   r   r   r   rm   rn   ro   rp   r   r    rq   r'   rr   r!   r^   r_   r`   ra   json_filter_strrb   rc   	chat_useranswerrg   r/   rh   ri   r>   r*   rj   r5   r5   r9   search_answer|   sh   (

(.
r}   c                 C   s@  t t|j|}||}|j| ||
|	d}d }d }|rntt|d d d d |d d f}|d d D ],}t|d }|d dkrM|d krM|d	 }|d d
krb|d krb|d }t	dd|}q6d
dd |D }nd}d}|svd}d|  d| d| d|  d	}td}d|dg}|rt|trt|}|r|| ztjjj||d}|jd jj}W n ty } zd| }W Y d }~nd }~ww t }z)t|||| |tt|d d d d ||d}|| |  || W n ty } z|  td|  W Y d }~nd }~ww |||||fS )Nr%   r   r'   r(   r)   r*   r+   r,   r-   r.   r/   r0   r1   r2   c                 s   r3   r4   r5   r6   r5   r5   r9   r:      r;   zanswer_query.<locals>.<genexpr>r?   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?
    rl   r`   )roler*   )modelmessageszError occurred: )rK   r   re   r   rf   rh   query_promptrr   ) r   rO   rP   rQ   rR   rS   rT   rU   rV   rW   rX   osgetenv
isinstancer]   extendopenai_clientchatcompletionscreatechoicesmessager*   r\   rF   rG   r   addcommitrefreshrollbackprint)r   pdf_namer`   folder_namer   rm   rn   ro   rp   r   r   chat_user_idquery_responsesrd   re   rf   rg   r/   rh   r8   r'   ri   r   	gpt_modelmessage_dataresponsechat_responserj   r^   chat_historyr5   r5   r9   ry      s~   
*	




ry   )2fastapir   r   r   r   r   r   fastapi.securityr   r	   fastapi.responsesr
   dotenvr   r   rT   typingr   r   openair   
sqlalchemyr   dependencies.HybridSearchr   dependencies.helperdb_config.databasedatabaserF   db_config.modelsr   r   r   r   db_config.authrH   routersecurityr   rO   r]   	DB_FOLDERUPLOAD_FOLDERr   postrS   floatrk   r}   ry   r5   r5   r5   r9   <module>   s     `	
H