Spaces:
Sleeping
Sleeping
| 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: | |
| 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 | |
| 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=("spiralai", "spiralai"), share=True, server_name="0.0.0.0") | |