pascal-kun / app.py
YKajima's picture
add textbox for additional order
5d4d634
raw
history blame
5.34 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 APIの呼び出しに失敗しました。")
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, additional_order):
validate_input_form(input_text, input_url)
summary = await summarize(input_text, input_url)
additional_prompt = f"【追加指示】: {additional_order}"
logger.info(f"summary: {summary}")
endpoint = os.environ.get("TWINROOM_API_BASE")
payload = {
"content": summary + additional_prompt
}
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を入力して「回答生成」ボタンを押すと回答が出力されます。 \n※テキスト、URLの両方に入力して実行した場合は、**URLが優先されます。** \n※テキスト、URLの両方が**空の場合は実行できません。** 必ずいずれかを入力してから実行してください。 \n※追加指示から、パスカルくんに追加で指示を与えることができます。 \n例)敬語で話してください")
with gr.Row():
with gr.Column():
input_text = gr.Textbox(label="テキスト")
input_url = gr.Textbox(label="URL")
additional_order = gr.Textbox(label="追加指示")
chat_btn = gr.Button("回答生成")
with gr.Column():
output_text = gr.Textbox(label="回答")
# Event handler
chat_btn.click(fn=chat, inputs=[input_text, input_url, additional_order], outputs=output_text)
gr.Markdown("## トラブルシューティング")
with gr.Accordion(label="「LLM APIの呼び出しに失敗しました。」というエラーが表示された場合", open=False):
gr.Markdown("### OpenAIサービス側で何らかのエラーが発生しています。1~2分ほど時間を置いてから再度お試しください。 \nそれでもエラーが解消されない場合は、入力しているテキスト量が大きすぎることが考えられます。 \n- テキストを入力して実行している場合は、入力文字数を減らしてからお試しください。 \n- URLを入力して実行している場合は、そのURLリンク先の内容を抜粋してテキスト入力欄にコピー&ペーストしてお試しください。")
with gr.Accordion(label="「WEBページの取得に失敗しました。」というエラーが表示された場合", open=False):
gr.Markdown("### 入力されたURLが対応しておりません。 \n大変お手数をおかけしますが別のURLを入力してお試しください。")
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")