|
|
import os |
|
|
import json |
|
|
import gradio as gr |
|
|
from openai import OpenAI |
|
|
|
|
|
|
|
|
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") |
|
|
if not OPENAI_API_KEY: |
|
|
raise RuntimeError("OPENAI_API_KEY is not set. Add it in Settings → Variables and secrets.") |
|
|
|
|
|
client = OpenAI(api_key=OPENAI_API_KEY) |
|
|
MODEL = "gpt-4o" |
|
|
|
|
|
|
|
|
SAFEAREA_CSS = """ |
|
|
/* iOS/Androidのノッチ・ホームバー分の余白を動的に確保 */ |
|
|
html, body, #root, .gradio-container { |
|
|
padding-top: env(safe-area-inset-top); |
|
|
padding-bottom: env(safe-area-inset-bottom); |
|
|
padding-left: env(safe-area-inset-left); |
|
|
padding-right: env(safe-area-inset-right); |
|
|
/* 画面いっぱいに広げる */ |
|
|
min-height: 100dvh; |
|
|
box-sizing: border-box; |
|
|
} |
|
|
""" |
|
|
|
|
|
def summarize(text: str, length: str = "short") -> str: |
|
|
system = ( |
|
|
"あなたは日英の要約アシスタント。" |
|
|
"重要点の抽出、冗長排除、事実の改変の禁止。出力は日本語で。" |
|
|
f"長さの目安:{length}" |
|
|
) |
|
|
resp = client.chat.completions.create( |
|
|
model=MODEL, |
|
|
messages=[ |
|
|
{"role": "system", "content": system}, |
|
|
{"role": "user", "content": text} |
|
|
] |
|
|
) |
|
|
return resp.choices[0].message.content.strip() |
|
|
|
|
|
def translate(text: str, target_lang: str = "en", formality: str = "neutral") -> str: |
|
|
system = "あなたは一流の翻訳家。意味忠実・自然な文体・用語統一・固有名詞も丁寧に。" |
|
|
user = f"次の文を{target_lang}に翻訳。文体:{formality}\n\n{text}" |
|
|
resp = client.chat.completions.create( |
|
|
model=MODEL, |
|
|
messages=[ |
|
|
{"role": "system", "content": system}, |
|
|
{"role": "user", "content": user} |
|
|
] |
|
|
) |
|
|
return resp.choices[0].message.content.strip() |
|
|
|
|
|
|
|
|
with gr.Blocks(title="Summarize & Translate", css=SAFEAREA_CSS) as demo: |
|
|
gr.Markdown("# Summarize & Translate") |
|
|
with gr.Tab("Summarize"): |
|
|
txt = gr.Textbox(lines=8, label="本文") |
|
|
length = gr.Dropdown(["short", "medium", "long"], value="short", label="長さ") |
|
|
out = gr.Textbox(label="要約結果") |
|
|
btn = gr.Button("要約する") |
|
|
btn.click(fn=summarize, inputs=[txt, length], outputs=out) |
|
|
|
|
|
with gr.Tab("Translate"): |
|
|
txt2 = gr.Textbox(lines=8, label="本文") |
|
|
lang = gr.Dropdown(["ja", "en", "zh", "ko", "fr", "de"], value="en", label="言語") |
|
|
lform = gr.Dropdown(["neutral", "formal", "casual"], value="neutral", label="文体") |
|
|
out2 = gr.Textbox(label="翻訳結果") |
|
|
btn2 = gr.Button("翻訳する") |
|
|
btn2.click(fn=translate, inputs=[txt2, lang, lform], outputs=out2) |
|
|
|
|
|
if __name__ == "__main__": |
|
|
demo.launch() |
|
|
|