
    4g(              	       j   d dl Z d dlZd dlZd dlZd dlmZ d dlmZmZ d dl	m
Z
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 m!Z!m"Z"  e         e
       Z#e#jI                  edgddgdg       i Z% e jL                  d      Z' e jL                  d      Z( e jL                  d      Z)e(re)re's e*d       ee(      Z+ G d de      Z,de-de,fdZ. G d de      Z/ ed      fde-fdZ0de-fdZ1de,de-de-fd Z2e#jg                  d!      d"e/fd#       Z4e#jg                  d$       ed%d&'       ed%d('       ed%d)'      fde-dee-   dee-   fd*       Z5e#jm                  d+      d,ede-fd-       Z7e#jg                  d.       ee0       ed%      fde-d/efd0       Z8y)1    N)uuid4)ListOptional)
FastAPI	WebSocketDepends
UploadFileFileHTTPExceptionHeaderstatusWebSocketDisconnectBody)HTMLResponse)CORSMiddleware)	BaseModel)load_dotenv)PineconeServerlessSpec)extract_text_from_pdfextract_text_from_fileextract_text_from_image*T)allow_originsallow_credentialsallow_methodsallow_headersOPENAI_API_KEYPINECONE_API_KEYPINECONE_ENVIRONMENTzBOPENAI_API_KEY, PINECONE_API_KEY, or PINECONE_ENVIRONMENT not set.)api_keyc                   @    e Zd ZU eed<   g Zee   ed<    G d d      Zy)UserDatausernamechat_historyc                       e Zd ZdZy)UserData.ConfigTN)__name__
__module____qualname__arbitrary_types_allowed     /opt/aibudy/backend/main.pyConfigr'   /   s    "&r-   r/   N)r(   r)   r*   str__annotations__r%   r   r/   r,   r-   r.   r#   r#   +   s    M L$s) ' 'r-   r#   r$   returnc                 J    | t         vrt        |       t         | <   t         |    S )Nr$   )usersr#   r4   s    r.   get_userr6   2   s"    u"H5h?r-   c                       e Zd ZU eed<   y)LoginRequestr$   N)r(   r)   r*   r0   r1   r,   r-   r.   r8   r8   7   s    Mr-   r8   
x_usernamec                 H   K   | st        t        j                  d      | S w)NzInvalid usernamestatus_codedetail)r   r   HTTP_401_UNAUTHORIZED)r9   s    r.   get_current_usernamer?   :   s*     44%
 	
 s    "c           	          d|  }t         j                         j                         }||vr6t        d|         t         j	                  |ddt        dt                     t         j                  |      S )z,Get or create a Pinecone index for the user.zuser-index-z&Creating new Pinecone index for user: i   	euclideanaws)cloudregion)name	dimensionmetricspec)pclist_indexesnamesprintcreate_indexr   r    Index)r$   
index_name
index_lists      r.   get_or_create_user_indexrQ   B   sx     xj)J "((*J#6xjAB
+	 	 	
 88Jr-   userpayloadURIc                    	 t        | j                        }t        j                  j	                  d|gddi      }t        t                     }| j                  |d}|j                  ||d   j                  |fg       t        d| j                   d	|        y # t        $ r}t        d
|        t        d      d }~ww xY w)Nmultilingual-e5-large
input_typepassage)inputs
parameters)rR   rT   r   )vectorszVector upserted for user z with URI: "Error updating user vector store: 7An error occurred while updating the user vector store.)rQ   r$   rI   	inferenceembedr0   r   upsertvaluesrL   	Exception)rR   rS   rT   index
embeddings	vector_idmetadataes           r.   update_user_vector_storerh   X   s    S(7 \\''#9i ( 

 L	 MM
 	y*Q-*>*>IJK)$--C5IJ S21#67QRRSs   BB 	C&B??Cz/loginlogin_requestc                 x    t        dt        j                          | j                  }t	        |       dd| diS )Nzpython version: messagezUser z logged in.)rL   sysversionr$   r6   )ri   r$   s     r.   loginrn   z   s=    	S[[M
*+%%HXxj455r-   z/consume_browser.test)examplezYour payload data herezhttp://example.com/your-uric                    K   	 t        |       }t        |||       ddiS # t        $ r }t        d|        t	        dd      d }~ww xY ww)Nrk   zUser vector updated.r\     r]   r;   )r6   rh   rb   rL   r   )rR   rS   rT   user_objrg   s        r.   consume_browserrt      s\     oD> 7C8122 o21#674mnnos$   A  A	A	AA		Az/ws/{username}	websocketc                   K   | j                          d {    t        |      }	 	 	 | j                          d {   }|dk(  r| j                          d {    y t	        |j
                        }	 t        j                  j                  d|gddi      }	 |j                  |d   j                  ddd      }g }|d   D ]&  }	|j                  d|	j                  ddh      i       ( d}
|D ]8  }|d   d   j!                  d      r|
d|d   d   z   dz   z  }
|
d|d   d   z   z  }
: | j#                  |
       d {    7 17 7 # t        $ r }t        d|        t        dd	
      d }~ww xY w# t        $ r }t        d|        t        dd
      d }~ww xY w7 f# t$        $ r t        d       Y y w xY w# t        $ r }t        d|        t        dd
      d }~ww xY ww)NTcloserV   rW   query)modelrY   rZ   zError embedding data: rr   z+An error occurred while embedding the data.r;   r      F)vectortop_kinclude_valuesinclude_metadatazError querying Pinecone index: z4An error occurred while querying the Pinecone index.matchesrf   rT    httpz3<br><a target="_blank" style="color: green;" href="z">z<br>zWebSocket connection closedzGENERAL PINECONE FAIL z5An error occurred during the WebSocket communication.)acceptr6   receive_textrw   rQ   r$   rI   r^   r_   rb   rL   r   rx   ra   appendget
startswith	send_textr   )ru   r$   rR   datarc   xrg   resultsserializable_resultsmatchreturn_strings              r.   websocket_endpointr      sY    



HDAm;&3355 7?#//+++ 1?o**5 $v('$ + A
x#kk t{{',)-	 * G (*$$Y/ E(// #EIIj5'$B1  !#- DA}U+66v>%+^abcmanotau)ux|)||!tq}U/C%CCMD  ))-888q 	  6 , ! o21#67'C@mnno ! x;A3?@'C@vwwx, 9& 34  m&qc*+4kllms   G/EG/G F) E
F) EF) G/F) 5%E "E; =BF)  F'F) G G/
F) F) 	E8E33E88F) ;	F$FF$$F) )G =G >G/?G  G 	G,G''G,,G/z/uploadfilec                   K   	 t        |       }	 |j                          d {   }t        |      dkD  rt        dd      	 dt                }t        |d	      5 }|j                  |       d d d        h d
}|j                  }|j                  d      d   j                         }	|	|vrt        dd      |	dv r	 t        |       d {   }
n-|	dv r	 t        |       d {   }
n	 t        |       d {   }
t        j                   |       	 t#        ||
|       ddiS 7 # t        $ r }t        d|        t        dd      d }~ww xY w# 1 sw Y   xY w7 # t        $ r }t        d|        t        dd      d }~ww xY w7 # t        $ r }t        d|        t        dd      d }~ww xY w7 # t        $ r }t        d|        t        dd      d }~ww xY w# t        $ r }t        d|        t        dd      d }~ww xY w# t        $ r#}t        d|        t        dd|       d }~ww xY ww)Ni  P i  z#File size exceeds the limit of 5MB.r;   zError reading the file: rr   z)An error occurred while reading the file.z/tmp/wb>   jpgpdfpngtxtdocxjpeg.zUnsupported file type.)r   r   r   z&Error extracitng text from the image: z7An error occurred while extracting text from the image.)r   z!Error extracting text from file: z6An error occurred while extracting text from the file.r\   r]   rk   z)File uploaded and processed successfully.zError processing file: )r6   readlenr   rb   rL   r   openwritefilenamesplitlowerr   r   r   osremoverh   )r$   r   rs   file_to_tmprg   filename_tmpfallowed_extensionsr   	extensionextracted_texts              r.   upload_filer      s    
:SH%	e $		+K;/1#<abb 2 uwi(,% 	!GGK 	! G==NN3'+113	..C8PQQ,,w'>|'L!L '!v'<\'J!J
v'=l'K!K 			,	s$X~xH
 FGGc ,  	e,QC01C8cdd	e
	! 	! "M w>qcBC#<uvvw "K v9!=>#<tuuv "L v9!=>#<tuuv  	s6qc:;C8qrr	s  S's+,6MaS4QRRSs:  IH D* D'D* H E/AH ?E$ E"E$ H F &F'F +H -G  ;F><G   H G, #H &I'D* *	E3EEH EH "E$ $	F-FFH F 	F;F66F;;H >G   	G)	G$$G))H ,	H5HHH 	I!H??II)9r   rl   jsonhtmluuidr   typingr   r   fastapir   r   r   r	   r
   r   r   r   r   r   fastapi.responsesr   fastapi.middleware.corsr   pydanticr   dotenvr   pineconer   r   extract_toolsr   r   r   appadd_middlewarer5   getenvr   r   r    
ValueErrorrI   r#   r0   r6   r8   r?   rQ   rh   postrn   rt   ru   r   r   r,   r-   r.   <module>r      s:   	 
    !   + 2   - ` ` i   %%%   	+,299/0  ryy!78 3>
Y
ZZ &''y 's x 
9  28 3  s  ,S8 Sc S SD (6 6 6 
S&)!#/GHc+HIo
oc]o 
#o o   Em	 EmS Em !EmN )01Cy>S>S
>S >Sr-   