o
    aKh1                     @   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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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"m#Z# d dl$m%Z%m&Z& d dlZd dl'Z'd dl(m(Z( d dl)Z)d dl*m+Z+ e)j,dde+dddZ-e-.dZ/e Z0ee_1eedZ2e
2dZ3dZ4dd Z5dd Z6dd Z7dd Z8dd  Z9d!d" Z:d#d$ Z;d%d& Z<e0=d'd(d) Z>e0?d*d+efd,d-Z@e0?d.d/efd0d1ZAdS )2    )	APIRouterHTTPExceptionRequestDepends)RedirectResponseN)OpenAI)ChatMessage
SpeechTextQuizMessageLineUserMedicineTextUserQuestion)loggeropenai_api_key)TfidfVectorizer)BeautifulSoup)	webdriver)Options)urljoinurlparse)datetime)Settings	localhosti@  rest)chroma_api_impl)hostportsettingsexcel_honbun)api_key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/sanwanet/gpt-api/chatbot_router4.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   r6   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_idr4   
audio_filefchunks3_keyr%   r%   r&   synthesize_speech7   s    
rN   c                  C   s0   t  } | d | d | d tj| dS )Nz
--headlessz--disable-gpuz--no-sandboxoptions)r   add_argumentr   ChromerO   r%   r%   r&   init_driverG   s
   


rS   c                 C   s   t | jt |jkS )N)r   netloc)base_urltest_urlr%   r%   r&   is_same_domainN   s   rW   c           	         s   t  }d}zY| D ]O}z1td|  || t|jd}|d}d}|D ]}|| 7 }q'|d| d| d7 }W q	 tyX } ztd| d	|  W Y d
}~q	d
}~ww |W |  S |  w )uX   url_list에 있는 각 페이지의 <section> 태그 HTML만 크롤링 (내부 링크 X) u   
🟢 크롤링 중: zhtml.parsersectionz<!-- z -->


u	   [에러] z: N)	rS   printr"   r   page_sourcefind_allprettify	Exceptionquit)	url_listdriverall_htmlurlsoupsections	page_htmlrY   er%   r%   r&   fetch_all_pages_with_seleniumQ   s(   

 ri   c                    sH   t jjd| d}|jd j}tj|gdd}|d d }d|}|S )Nztext-embedding-3-small)r*   r9   r      )query_embeddings	n_results	documentsrZ   )r<   
embeddingsr/   data	embedding
collectionqueryjoin)questionr4   query_embeddingresultsretrieved_docsexcel_contextr%   r%   r&   search_excel_contextn   s   
ry   c                    s   dddddddddddddddddddd	ddd
ddddddddddddddddddddddddddddd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 )u#   homepage_url을 선택하는 함수systemu   質問を分析し、回答を作成する際に必要な情報を持つURLを返す必要があります。質問を見てURLを選択してください。roler!   uT   最も情報がある可能性が高いURLを配列で返す必要があります。u   関数の戻り値のように、配列のみを返す必要があります。3つ以内のURLをリターンしてください。 例) ['https://sanwanet.co.jp/unique/history','https://sanwanet.co.jp/construction/government']uL   三和電業株式会社 会社概要 : https://sanwanet.co.jp/company/sanwauj   三和プラントエンジニアリング株式会社 会社概要 : https://sanwanet.co.jp/company/plantu]   三和エコ&エナジー株式会社 会社概要 : https://sanwanet.co.jp/company/ecoenergyuL   三和空調株式会社 会社概要 : https://sanwanet.co.jp/company/kuchou   三和科技（蘇州）有限公司 & 三和工程設備（蘇州）有限公司 & 三和技研（蘇州）有限公司 会社概要 : https://sanwanet.co.jp/company/yugenkoushiuF   三和電業グループ 沿革: https://sanwanet.co.jp/unique/historyuP   三和電業グループ 技術紹介 : https://sanwanet.co.jp/unique/technologyu<   企業の社会的責任 : https://sanwanet.co.jp/unique/csruF   三和会(会社の同好会) : https://sanwanet.co.jp/unique/sanwakaiuH   施工事例(官公庁) : https://sanwanet.co.jp/construction/governmentuB   施工事例(工場) : https://sanwanet.co.jp/construction/factoryuK   施工事例(研究施設) : https://sanwanet.co.jp/construction/laboratoryua   施工事例(病院・特養施設・福祉施設) : https://sanwanet.co.jp/construction/hospitaluI   施工事例(一般ビル) : https://sanwanet.co.jp/construction/buildinguF   施工事例(中国物件) : https://sanwanet.co.jp/construction/chinauM   施工事例(特別高圧) : https://sanwanet.co.jp/construction/high-voltageuC   施工事例(太陽光) : https://sanwanet.co.jp/construction/solaruN   ピックアッププロジェクト : https://sanwanet.co.jp/category/projectu-   採用情報 : https://sanwanet.co.jp/recruituseru	   質問 : r(   r)   r   )r<   r-   r.   r/   r0   r1   r!   )rt   r+   r4   r%   r%   r&   choose_hompage_url   s<   r~   c                    sl  |  ds
d|  } tt d t| I dH }t|}tt d tt d t|I dH }t| tt d tt d t| I dH }td|  tt d	 d
ddd
ddd
ddd
ddd
ddg}|r{|	d
d| d |r|	d
d| d |	d| d tt d t
jjjd|d}tt d |jd jj}td|  |S )un   GPT-4o를 사용해 https://sanwanet.co.jp/ 크롤링 데이터 + 웹 검색 정보를 포함한 답변 생성u	   御社のu   url 선택 시작Nu   url 선택 끝u   크롤링시작u   크롤링끝u   Excel 검색 시작zexcel_data : u   Excel 검색 끝rz   ux   あなたは「三和電業グループ」の会社紹介および就職希望者向けのチャットボットです。r{   uK   以下のルールに従って、ユーザーと会話してください。u   1.会話スタイル：SNS上のやり取りのように、親しみやすく、1回の返信は300文字以内に収めてください。u   3.情報の制限：返答に使用できるのは、提供されたURLとExcelファイルに含まれる情報のみとします。その他の情報は使用しないでください。u]   この制約のもと、ユーザーに寄り添いながら会話を進めてください。u   企業サイト情報
u0   Excelファイルに記載されている情報
r}   u   대답생성 시작r(   r)   u   대답생성 종료r   u   초기대답 : )
startswithr[   r   nowr~   astliteral_evalri   ry   appendr<   r-   r.   r/   r0   r1   r!   )rt   url_list_strra   website_data
excel_datar+   r4   initial_answerr%   r%   r&   generate_gpt_answer   sF   


r   z/healthc                      s
   ddiS )Nstatushealthyr%   r%   r%   r%   r&   health_check   s   r   z/sanwa/gpt/speechspeech_textc                    s6   | j }| j}|stdddt||I d H }d|iS )N  u   Text is required。status_codedetailrJ   )rH   
chat_tokenr   rN   )r   rH   r   rJ   r%   r%   r&   r>      s   r>   z/sanwa/gpt/ask_questionuser_questionc                    s2   | j  }|stdddt|I d H }d|iS )Nr   zQuestion is requiredr   r5   )rt   r2   r   r   )r   question_textgenerated_answerr%   r%   r&   ask_question	  s   
r   )Bfastapir   r   r   r   fastapi.responsesr   r,   r   reboto3rF   r?   schemasr   r	   r
   r   r   r   configr   r   jsonsklearn.feature_extraction.textr   loggingrequestsbs4r   numpynpseleniumr   !selenium.webdriver.chrome.optionsr   urllib.parser   r   r   r   chromadbchromadb.configr   
HttpClientchroma_clientget_collectionrq   routerr   r<   rC   rE   r6   rN   rS   rW   ri   ry   r~   r   r"   r   postr>   r   r%   r%   r%   r&   <module>   sb     



#&B

