o
    !g=(                     @   s  d dl mZmZmZmZ d dlmZ d dlZd dlmZ d dl	Z	d dl
Z
d dlZd dlZd dlZ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Zd dlZd dlZd dlZd dlmZ d dlZd dl Z d dl!m"Z" d dl#Z$d dlmZ d dl%Z&d d	l'm(Z( d d
l)m*Z* e Z+ee_,eedZ-dZ.e(j/e.d e(0 Z1e
2dZ3dZ4dd Z5dd Z6dd Z7dd Z8d1ddZ9dd Z:dd Z;dd  Z<d!d" Z=e+>d#d$d% Z?e+@d&d'efd(d)ZAe+@d*d+efd,d-ZBe+@d.d+efd/d0ZCdS )2    )	APIRouterHTTPExceptionRequestDepends)RedirectResponseN)OpenAI)ChatMessage
SpeechTextQuizMessageLineUserMedicineTextUserQuestion)loggeropenai_api_key)TfidfVectorizer)BeautifulSoup)genai)types)api_keyz'AIzaSyB0gBfm2dXJaxUoX-T40SDomM7f4vQkQQUs3z$shanri-ai-chatbot-for-text-to-speechc                    s8   dd | D }t jjjd|d}|jd jj }|S )Nc                 S   s   g | ]	}| d r|qS )content)get).0msg r    /home/air/api/chatbot_router5.py
<listcomp>*   s    zask_openai.<locals>.<listcomp>gpt-4omodelmessagesr   )openaichatcompletionscreatechoicesmessager   strip)r    valid_messagesresponseanswerr   r   r   
ask_openai)   s   r+   c                    s   t jjjdd| d}d| dt  d}t|d}| D ]}|| q W d    n1 s2w   Y  | dt  d}t	|t
| t| dt
 d	| S )
Nztts-1nova)r   voiceinputz
tmp/audio--z.mp3wbzhttps://z.s3.amazonaws.com/)clientaudiospeechr$   timeopen
iter_byteswrite	s3_clientupload_filebucket_nameosremove)textuser_idr)   
audio_filefchunks3_keyr   r   r   synthesize_speech3   s    
rC   c              
      s   z(ddi}t j| |dd}|  t|jd}|d}ddd	 |D }|W S  t jyD } ztd
|  W Y d}~dS d}~ww )u$   특정 URL에서 정보를 가져옴
User-AgentMozilla/5.0
   headerstimeouthtml.parserp
c                 S   s   g | ]}|  qS r   )get_text)r   rK   r   r   r   r   M       z&fetch_website_data.<locals>.<listcomp>u)   웹사이트 정보 가져오기 실패: N )	requestsr   raise_for_statusr   r=   find_alljoinRequestExceptionprint)urlrH   r)   soup
paragraphsr=   er   r   r   fetch_website_dataD   s   
rZ   c              
      s   zQddi}t j| |dd}|  t|jd}| h}|jdddD ]}|d	 }tj| |}|	| r9|
| q"d
}|D ]}	td|	  |t|	d 7 }q>|W S  t jym }
 ztd|
  W Y d}
~
d
S d}
~
ww )uE   홈페이지에서 내부 링크를 찾아 전체 페이지 크롤링rD   rE   rF   rG   rJ   aT)hrefr\   rO   u   크롤링 중: 

u   웹사이트 크롤링 실패: N)rP   r   rQ   r   r=   rR   urllibparseurljoin
startswithaddrU   rZ   rT   )base_urlrH   r)   rW   linksa_tagr\   full_urlall_textrV   rY   r   r   r   fetch_all_pagesU   s.   

rh        c                    sp   | d t | g  }||j  d dd }t|| d } fdd|D }d|d| S )uE   질문과 관련 있는 텍스트를 상위 20개 문장으로 제한rL   r      Nc                    s   g | ]} | qS r   r   )r   i	sentencesr   r   r   w   rN   z&find_relevant_text.<locals>.<listcomp>)splitr   fit_transformTtoarraynpargsortrS   )question	text_datamax_sentences
max_length
vectorizersimilaritiestop_indicestop_sentencesr   rm   r   find_relevant_texto   s   
r}   c                 C   sT   dddddddddddddddd| dg}t jjjd	|d
}|jd jjS )NsystemuK   以下の内容でこれらの部分を重点に修正してください。roler   uQ   企業名の代わりに弊社という表現を使った方がいいと思う。uH   本社のスタッフがお客様に言う感じにしてください。u^   ホームページに記載されている のような言葉は取り除いてください。u   数値に関する内容が出たら、マークダウン形式の表で作成して答えてくれ。数値情報がなければあえて表にする必要はない。userr   r   r   )
gpt_clientr"   r#   r$   r%   r&   r   )
raw_answerr    r)   r   r   r   refine_answer_with_gpt|   s   	r   c                 C   s8   t d}d|  d}tjjd|tjdgdd}|jS )Ngemini-1.5-prou  
    以下の内容を丁寧に修正してください。

    - 企業名の代わりに「弊社」という表現を使ってください。
    - 本社のスタッフがお客様に話しかける感じにしてください。
    - 「ホームページに記載されている」といった表現は削除してください。
    - 数値がある場合は、マークダウン形式の表で表示してください。

    以下が修正対象の文章です：
    z
    TEXT)response_modalitiesr   contentsconfig)r   GenerativeModelgemini_clientmodelsgenerate_contentr   GenerateContentConfigr=   )r   r   promptr)   r   r   r   refine_answer_with_gemini   s   
	r   c           	      C   s   t d}|rt| |nd}tjjdddigd|  d}t|j |jr&|jnd}dd	d
ddd
g}|r?|dd| d
 |rL|dd| d
 |d| d
 tjj	jd|d}|j
d jj}t|}|S )ua   GPT-4o를 사용해 ug-inc.net 크롤링 데이터 + 웹 검색 정보를 포함한 답변 생성https://segue-g.jp/rO   r   typeweb_search_previewzUnite & Grow )r   toolsr.   r~   u`   与えられた質問を見て、関連情報を取得して回答を作成してください。r   u?   回答に何を参照したかは言わないでください。uI   以下の企業公式サイトの情報を参考にしてください。
uC   以下のウェブ検索の情報を参考にしてください。
r   r   r   )rh   r}   r   	responsesr$   rU   output_textappendr"   r#   r%   r&   r   r   )	ru   website_datarelevant_textweb_search_responseweb_search_textr    r)   initial_answerrefined_answerr   r   r   generate_gpt_answer   s0   
r   c                 C   s   t d}|rt| |nd}ddg}|r|d|  |d|   d|}tjjd|tjtj	t
 d	gd
gdd}|j}t|}|S )Nr   rO   u{   以下の質問に対して、Google検索結果や公式サイトの情報をもとに丁寧に回答してください。u   ※ 回答には情報源のリンクや「ホームページに記載されている」などの表現を含めないでください。u"   [企業公式サイトの情報]:
u
   [質問]:
r]   r   )google_searchr   )r   r   r   )rh   r}   r   rS   r   r   r   r   r   ToolGoogleSearchRetrievalr=   r   )ru   r   r   prompt_partsfull_promptr)   r   r   r   r   r   generate_gemini_answer   s(   
	r   z/healthc                      s
   ddiS )Nstatushealthyr   r   r   r   r   health_check   s   r   z/api/speechspeech_textc                    s6   | j }| j}|stdddt||I d H }d|iS )N  zText is requiredstatus_codedetailr?   )r=   
chat_tokenr   rC   )r   r=   r   r?   r   r   r   r3      s   r3   z/api/gpt_questionuser_questionc                    ,   | j  }|stdddt|}d|iS Nr   zQuestion is requiredr   r*   )ru   r'   r   r   r   question_textgenerated_answerr   r   r   gpt_question     
r   z/api/gemini_questionc                    r   r   )ru   r'   r   r   r   r   r   r   gemini_question  r   r   )ri   rj   )Dfastapir   r   r   r   fastapi.responsesr   r!   r   reboto3r;   r4   	db_moduleschemasr   r	   r
   r   r   r   r   r   r   httpxjsonpandaspdPyPDF2sklearn.feature_extraction.textr   loggingrP   bs4r   urllib.parser^   numpyrs   googler   google.genair   routerr   r   API_KEY	configureClientr   r1   r8   r:   r+   rC   rZ   rh   r}   r   r   r   r   r   r   postr3   r   r   r   r   r   r   <module>   sb     



(


