o
    fhC:                     @   s*  d dl Z d dlZd dlZddlmZ ddlmZmZmZ d dl	Z	d dl
Z
d dlZd dlmZmZmZ d dlmZ eeZdded	efd
dZdedefddZddedefddZdefddZdded	efddZdedeeeef df fddZddedefddZddlmZ defddZdS )     N   )GROQ_API_KEY)perform_web_searchget_search_summaryget_structured_search_results)AsyncGeneratorDictAny)BeautifulSoup querysearch_contextc              
   C   s  zd}dt  dd}| }|rd| d|  d}dd	d
d|d
gdddd}td|  tdt|  tj|||dd}td|j  |jdkrw| }d|v rot|d dkro|d d d d }| W S t	d W dS z| }	|	
di 
dd}
t	d|	  d|
 W W S    d |j d!|j  Y W S  ty } zt	d"t|  d#t| W  Y d$}~S d$}~ww )%z5
    Query Groq API with optional search context
    /https://api.groq.com/openai/v1/chat/completionsBearer application/jsonAuthorizationzContent-Typen
Based on the following search information and user query, provide a comprehensive response:

Search Context: 

User Query: 

Please provide a detailed, helpful response that incorporates relevant information from the search context while directly answering the user's question.
systemYou are a helpful AI assistant. When provided with search context, use it to enhance your responses while ensuring accuracy and relevance.rolecontentuserzgemma2-9b-itffffff?   )messagesmodeltemperature
max_tokensz	API URL: zEnhanced query length:    headersjsontimeoutzResponse status:    choicesr   messager   zNo choices found in responsezNo response generatederrorzUnknown errorzGroq API error details: zGroq API Error: 
API Error : zException in query_groq: Exception: N)r   loggerinfolenrequestspoststatus_coder%   stripr*   gettext	Exceptionstr)r   r   urlr$   enhanced_querydataresponseresponse_jsonr)   
error_data	error_msge rA   ]/var/www/eduai.edurigo.com/doc_train/edurigo_ai/my_career/testing/advanced_chatbot/chatbot.py
query_groq   s\   



rC   returnc                    s&   g d}|    t fdd|D S )z<
    Determine if a query would benefit from web search
    )currentlatestrecentnewstodaynowweatherstockpriceupdatetrendingzwhat iszwho iszwhen didzwhere iszhow tobesttopcomparevsversus
differencetutorialguidelearnexplainc                 3   s    | ]}| v V  qd S )NrA   ).0	indicatorquery_lowerrA   rB   	<genexpr>c   s    z should_search.<locals>.<genexpr>)lowerany)r   search_indicatorsrA   r\   rB   should_searchV   s   rb   Tenable_searchc                 C   s   t d|  d | r|  dkrdS tsdS ttdk r%dtt dS t d	td
d  d d}|r]t| r]t d t| dd}|r]t|dkr]d|}t dt| d t| |S )z@
    Generate response with optional web search integration
    z&Generate response called with query: ''r    Please provide a valid question. GROQ_API_KEY not found in config
   $GROQ_API_KEY seems invalid (length: )Using API key: N...*Query identified as benefiting from search   num_resultsr   
Search context gathered:  characters)	r.   r/   r4   r   r0   rb   r   joinrC   )r   rc   r   search_resultsrA   rA   rB   generate_responsee   s    


ru   c                 C   s   t d|  d | r|  dkrdg fS g }t| r1t d t| dd}t dt| d	 d}|rDt|d
krDd|dd }t| |}||fS )zV
    Generate response and return both the response and search results separately
    z2Generate response with search results for query: 'rd   r   re   Performing web search...   rn   Search completed. Found  resultsr   rp   Nrm   )r.   r/   r4   rb   r   r0   rs   rC   )r   rt   r   ai_responserA   rA   rB   %generate_response_with_search_results   s   

r{   c                 C  s  z3d}dt  dd}| }|rd| d|  d}dd	d
d|d
gddddd}td|  t 4 I dH }|j|||dd4 I dH }|jdkr| I dH }td|j d|  d|j d| V  	 W d  I dH  W d  I dH  W dS d}	|j	
d2 zz3 dH W }
|	|
d7 }	d|	v r|	dd\}}	| }|dr|dd }|dkr W d  I dH  W d  I dH  W dS |rz&t|}d|v rt|d d kr|d d  d!i }d"|v r|d" V  W n
 tjy   Y qw d|	v sq6 W d  I dH  n1 I dH sw   Y  W d  I dH  W dS 1 I dH s.w   Y  W dS  ty[ } ztd#t|  d$t| V  W Y d}~dS d}~ww )%z0
    Query Groq API with streaming response
    r   r   r   r   r   r   r   r   r   r   r   zllama3-8b-8192r   r   T)r   r   r    r!   streamz Starting streaming API call to: Nr"   r#   r'   r+   r,   r   zutf-8rp   r   zdata:    z[DONE]r(   r   deltar   z Exception in query_groq_stream: r-   )r   r.   r/   aiohttpClientSessionr2   statusr6   r*   r   iter_chunkeddecodesplitr4   
startswithr%   loadsr0   r5   JSONDecodeErrorr7   r8   )r   r   r9   r$   r:   r;   sessionr<   
error_textbufferchunklinedata_strdata_objr~   r@   rA   rA   rB   query_groq_stream   s   





,4!r   c           
      C  sl  t d|  d | r|  dkrdddV  dS g }g }t| rlt d t }|dt| d	I dH }g }t|d
D ]\}}| d|d  d|d  }|	| q=t dt
| dt
| d d||dV  d}|rg }t|dd D ]!\}}|	d|d
  d|dd d|dd d|d   qzd|}t| |2 z3 dH W }	d|	dV  q6 dS )z
    Generate streaming response and return both the response chunks and structured search results
    Updated to match the non-streaming method's search result structure
    z<Generate streaming response with search results for query: 'rd   r   response_chunkre   )typer;   Nrv   rw   r   z. r      
🔗 URL: r9   rx   z formatted results and z structured resultsrt   )r   r;   structured_datarm   Source r,   titlezNo title

Content: snippetz
No snippet
URL: 

)r.   r/   r4   rb   asyncioget_event_looprun_in_executorr   	enumerateappendr0   r5   rs   r   )
r   rt   structured_search_resultsloopiresultformatted_resultr   context_itemsr   rA   rA   rB   ,generate_response_with_search_results_stream   sJ   

 

r   c                 C  s  t d|  d | r|  dkrdV  dS tsdV  dS ttdk r/dtt d	V  dS t d
tdd  d d}|rpt| rpt d t }|dt	| dI dH }|rpt|dkrpd
|}t dt| d t| |2 z	3 dH W }|V  qu6 dS )zJ
    Generate streaming response with optional web search integration
    z0Generate streaming response called with query: 'rd   r   re   Nrf   rg   rh   ri   rj   rk   rl   rm   r   rp   rq   rr   )r.   r/   r4   r   r0   rb   r   r   r   r   rs   r   )r   rc   r   r   rt   r   rA   rA   rB   generate_response_stream&  s2   


r   )search_enginec                 C   s  t d|  d | r|  dkrdg fS g }t| rqt d tj| dd}|rft|dD ]7\}}d	|j  d
|j	 d|j
 d|j d|j ddtdtdt|jd   d|jdd}|| q.t dt| d d}|rg }t|dd D ]M\}}|d}	d|	d v r|	d dd  nd}
t|	dkr|	d nd}t|	dkr|	d dd nd}|d|d  d|
 d| d|  qd|}t| |}||fS ) zI
    Generate response with LLM and return structured search results
    z.Generate response with LLM search for query: 'rd   r   re   rv   rw   rn   r   [u   ] 🔍 rp   r   u   
🌐 Domain: u   
📊 Relevance: u   ⭐z (z.2fri   rx   ry   Nrm   u   🔍r      u	   🔗 URL:r   r,   r   r   r   )r.   r/   r4   rb   r   search_multiple_enginesr   sourceupperr   r   r9   domainminmaxintrelevance_scorer   r0   r   replacers   rC   )r   rt   raw_resultsr   r   r   r   r   
result_strlinesr   r   r9   rz   rA   rA   rB   !generate_response_with_llm_searchK  sF   

&$(

r   )r   )T)r1   loggingr%   configr   search_toolr   r   r   r   r   typingr   r   r	   bs4r
   	getLogger__name__r.   r8   rC   boolrb   ru   r{   r   r   r   r   r   rA   rA   rA   rB   <module>   s(    
G"Q:#