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'e Z(ee_)eedZ*e
*dZ+dZ,dd Z-dd Z.dd Z/dd Z0dd Z1dd Z2dd Z3dd Z4e(5dd d! Z6e(7d"d#efd$d%Z8e(7d&d'efd(d)Z9dS )*    )	APIRouterHTTPExceptionRequestDepends)RedirectResponseN)OpenAI)ChatMessage
SpeechTextQuizMessageLineUserMedicineTextUserQuestion)loggeropenai_api_key)TfidfVectorizer)BeautifulSoup)	webdriver)Options)urljoinurlparse)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/V2/gptbackup/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_speech*   s    
rE   c                  C   s0   t  } | d | d | d tj| dS )Nz
--headlessz--disable-gpuz--no-sandboxoptions)r   add_argumentr   ChromerF   r   r   r   init_driverK   s
   


rJ   c                 C   s   t | jt |jkS )N)r   netloc)base_urltest_urlr   r   r   is_same_domainR   s   rN   c           	         s   t  }d}z_| D ]U}z7td|  || td t|jd}|jdd}d}|D ]}|| 7 }q-|d| d| d	7 }W q	 t	y^ } 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)rJ   printr   r6   sleepr   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_seleniumU   s*   

 rc   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   r3   r$   r%   r&   r'   r(   r   )
raw_answerr"   r+   r   r   r   refine_answer_with_gpt   s   	rj   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을 선택하는 함수rd   u   質問を分析し、回答を作成する際に必要な情報を持つURLを返す必要があります。質問を見てURLを選択してください。re   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.htmlrg   u	   質問 : r   r    r   rh   )questionr"   r+   r   r   r   choose_hompage_url   s,   rl   c           
         s&  |  ds
d|  } t| I dH }t|}t|I dH }td| d  tdt|  tjj	dddigd	|  d
}|j
rA|j
nd}td|  ddddddddddddg}|rh|dd| d |ru|dd| d |d| d tjjj	d|d}|jd jj}t|}	|	S )ua   GPT-4o를 사용해 ug-inc.net 크롤링 데이터 + 웹 검색 정보를 포함한 답변 생성u	   御社のNu   크롤링 데이터 u#   여기까지가 데이터입니다.zurl_list : r   typeweb_search_previewu#   株式会社 セグエグループ )r!   toolsr0   rO   u   웹 검색결과: rd   u`   与えられた質問を見て、関連情報を取得して回答を作成してください。re   u   回答を生成するときに、企業公式サイトの情報とウェブ検索の情報が同じ情報を持っている場合は、それを参照してください。uc   情報の内容が異なる場合は、企業公式サイトの情報を優先してください。u?   回答に何を参照したかは言わないでください。uI   以下の企業公式サイトの情報を参考にしてください。
uC   以下のウェブ検索の情報を参考にしてください。
rg   r    r   )
startswithrl   astliteral_evalrc   rS   strr3   	responsesr&   output_textappendr$   r%   r'   r(   r   rj   )
rk   url_list_strrZ   website_dataweb_search_responseweb_search_textr"   r+   initial_answerrefined_answerr   r   r   generate_gpt_answer   s@   

	r}   z/healthc                      s
   ddiS )Nstatushealthyr   r   r   r   r   health_check   s   r   z/apiV2_2/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detailrA   )r?   
chat_tokenr   rE   )r   r?   r   rA   r   r   r   r5      s   r5   z/apiV2_2/ask_questionuser_questionc                    s2   | j  }|stdddt|I d H }d|iS )Nr   zQuestion is requiredr   r,   )rk   r)   r   r}   )r   question_textgenerated_answerr   r   r   ask_question   s   
r   ):fastapir   r   r   r   fastapi.responsesr   r#   r   reboto3r=   r6   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   rq   routerr   r3   r:   r<   r-   rE   rJ   rN   rc   rj   rl   r}   r   r   postr5   r   r   r   r   r   <module>   sP     


!,<

