import json import os import re import requests import gradio as gr from bs4 import BeautifulSoup from spiralfilm import FilmCore, FilmConfig from logging import getLogger, DEBUG, StreamHandler logger = getLogger() logger.setLevel(DEBUG) handler = StreamHandler() handler.setLevel(DEBUG) logger.addHandler(handler) def greet(name): return "こんにちは " + name + "さん!! \n僕はパスカルくんだよ。よろしくね" def extract_texts(input_str): pattern = r"msg='([^']*)'" matches = re.findall(pattern, input_str) return list(map(lambda x: ''.join(x.split('\\n')), matches)) async def summarize(input_text: str, input_url: str): config = FilmConfig( "gpt-4-32k", api_type="azure", azure_deployment_id="gpt-4-32k", azure_api_version="2023-05-15", timeout=60.0, # これを入れないとtimeoutが頻繁に発生する ) config.get_apikey() if input_text: _prompt = f""" 以下の文章を要約してください。 {input_text} """ return await FilmCore( prompt=_prompt, system_prompt="あなたは優秀なライターです。", config=config ).run_async() if input_url: try: res = requests.get(input_url) soup = BeautifulSoup(res.text) url_content = soup.find('title').text + '\n' + soup.find('body').text _prompt = f""" 以下の文章を要約してください。 {url_content} """ except Exception as e: logger.error(e) raise gr.Error("WEBページの取得に失敗しました。") return await FilmCore( prompt=_prompt, system_prompt="あなたは優秀なライターです。", config=config ).run_async() else: raise gr.Error("LLMの実行に失敗しました。") def validate_input_form(input_text, input_url): input_value = input_text + input_url # Check if the text is not blank if len(input_value) < 1: raise gr.Error("テキストかURLを入力してください。") else: return async def chat(input_text, input_url): validate_input_form(input_text, input_url) summary = await summarize(input_text, input_url) logger.info(f"summary: {summary}") endpoint = os.environ.get("TWINROOM_API_BASE") payload = { "content": summary } headers = {'API-Key': os.environ.get("TWINROOM_API_KEY")} json_payload = json.dumps(payload) response = requests.post(endpoint, headers=headers, data=json_payload) response_msgs = extract_texts(response.text) result = '\n'.join(response_msgs) if input_url: result += f'\n{input_url}' return result with gr.Blocks() as iface: # UI gr.Markdown("# パスカルくん \n## 使い方 \nテキスト、もしくはURLにパスカルくんに分析させたい記事の内容やURLを入力して「Chats」ボタンを押すと回答が出力されます。 \n※テキスト、URLの両方に入力して実行した場合は、**URLが優先されます。** \n※テキスト、URLの両方が**空の場合は実行できません。** 必ずいずれかを入力してから実行してください。") with gr.Row(): with gr.Column(): input_text = gr.Textbox(label="テキスト") input_url = gr.Textbox(label="URL") chat_btn = gr.Button("Chats") with gr.Column(): output_text = gr.Textbox(label="回答") # Event handler chat_btn.click(fn=chat, inputs=[input_text, input_url], outputs=output_text) if __name__ == "__main__": iface.launch(auth=(os.environ.get("GRADIO_USER_NAME"), os.environ.get("GRADIO_PASSWORD")), share=True, server_name="0.0.0.0")