o
     \h+                     @   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( e Z)ee_*eedZ+e
+dZ,dZ-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4dd Z5e)6d d!d" Z7e)8d#d$efd%d&Z9e)8d'd(efd)d*Z:dS )+    )	APIRouterHTTPExceptionRequestDepends)RedirectResponseN)OpenAI)ChatMessage
SpeechTextQuizMessageLineUserMedicineTextUserQuestion)loggeropenai_api_key)TfidfVectorizer)BeautifulSoup)	webdriver)Options)urljoinurlparse)datetime)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/segue/gpt/backup/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   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_speech+   s    
rF   c                  C   s0   t  } | d | d | d tj| dS )Nz
--headlessz--disable-gpuz--no-sandboxoptions)r   add_argumentr   ChromerG   r   r   r   init_driverL   s
   


rK   c                 C   s   t | jt |jkS )N)r   netloc)base_urltest_urlr   r   r   is_same_domainS   s   rO   c           	         s   t  }d}zZ| D ]P}z2td|  || t|jd}|jdd}d}|D ]}|| 7 }q(|d| d| d7 }W q	 tyY } ztd	| d
|  W Y d}~q	d}~ww |W |  S |  w )uV   url_list에 있는 각 페이지의 sections_group HTML만 크롤링 (내부 링크 X) u   
🟢 크롤링 중: zhtml.parsersections_group)class_z<!-- z -->
z

u	   [에러] z: N)	rK   printr   r   page_sourcefind_allprettify	Exceptionquit)	url_listdriverall_htmlurlsoupsections	page_htmlsectioner   r   r   fetch_all_pages_with_seleniumV   s(   
 rb   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   r4   r%   r&   r'   r(   r)   r   )
raw_answerr#   r,   r   r   r   refine_answer_with_gpt   s   	ri   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g}t jjjd|d}|jd jjS )u#   homepage_url을 선택하는 함수rc   u   質問を分析し、回答を作成する際に必要な情報を持つURLを返す必要があります。質問を見てURLを選択してください。rd   uT   最も情報がある可能性が高いURLを配列で返す必要があります。u   関数の戻り値のように、配列のみを返す必要があります。 例) ['https://segue-g.jp/company/boardmember/index.html','https://segue-g.jp/ir/results/settle.html']u9   企業理念 : https://segue-g.jp/company/sdgs/index.htmlu,   IR 情報 : https://segue-g.jp/ir/index.htmluJ   財務、業績報告、売上 : https://segue-g.jp/ir/results/settle.htmlu5   株式情報 : https://segue-g.jp/ir/stock/index.htmluH   当社の強み : https://segue-g.jp/ir/investor/strong_point/index.htmluA   成長戦略 : https://segue-g.jp/ir/investor/strategy/index.htmlu:   会社概要 : https://segue-g.jp/company/basic/index.htmlu:   企業理念 : https://segue-g.jp/company/brand/index.htmlu6   沿革 : https://segue-g.jp/company/history/index.htmluA   役員一覧  : https://segue-g.jp/company/boardmember/index.htmlu5   事業紹介 : https://segue-g.jp/business/index.htmlrf   u	   質問 : r    r!   r   rg   )questionr#   r,   r   r   r   choose_hompage_url   s,   rk   c                    s  |  ds
d|  } tt d t| I dH }t|}tt d tt d t|I dH }tt d ddd	dd
d	g}|rP|dd| d	 |d| d	 tt d t	j
jjd|d}tt d |jd jj}tt d t|}tt d |S )ua   GPT-4o를 사용해 ug-inc.net 크롤링 데이터 + 웹 검색 정보를 포함한 답변 생성u	   御社のu   url 선택 시작Nu   url 선택 끝u   크롤링시작u   크롤링끝rc   u`   与えられた質問を見て、関連情報を取得して回答を作成してください。rd   u?   回答に何を参照したかは言わないでください。uI   以下の企業公式サイトの情報を参考にしてください。
rf   u   대답생성 시작r    r!   u   대답생성 종료r   u   답변 정리 시작u   답변 정리 종료)
startswithrS   r   nowrk   astliteral_evalrb   appendr4   r%   r&   r'   r(   r)   r   ri   )rj   url_list_strrY   website_datar#   r,   initial_answerrefined_answerr   r   r   generate_gpt_answer   s6   

ru   z/healthc                      s
   ddiS )Nstatushealthyr   r   r   r   r   health_check   s   rx   z/api2/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detailrB   )r@   
chat_tokenr   rF   )ry   r@   r~   rB   r   r   r   r6      s   r6   z/api2/ask_questionuser_questionc                    s2   | j  }|stdddt|I d H }d|iS )Nrz   zQuestion is requiredr{   r-   )rj   r*   r   ru   )r   question_textgenerated_answerr   r   r   ask_question  s   
r   );fastapir   r   r   r   fastapi.responsesr   r$   r   reboto3r>   r7   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   rn   r   routerr   r4   r;   r=   r.   rF   rK   rO   rb   ri   rk   ru   r   rx   postr6   r   r   r   r   r   <module>   sR     


!+C

