pascal-kun / app.py
YKajima's picture
fix markdown
672506d
raw
history blame
3.89 kB
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")