vireovocabulary / app.py
sofiamak's picture
Create app.py
8abdd3d verified
Raw History Blame Contribute Delete
2.74 kB
import os
import gradio as gr
from openai import OpenAI
# 从 Hugging Face Space 的 “Secrets” 读取
API_KEY = os.getenv("OPENAI_API_KEY")
if not API_KEY:
raise RuntimeError("Missing OPENAI_API_KEY secret. Set it in Settings → Variables & secrets.")
# 可改成你账号可用的模型名
MODEL_NAME = "gpt-4o-mini"
client = OpenAI(api_key=API_KEY)
SYSTEM_PROMPT = """You are an English vocabulary tutor.
Given a list of English target words/phrases, generate short, practical exercises
for each word. Keep the language simple and concise.
For EACH word, produce 3–5 exercises from the pool below:
1) Meaning multiple-choice (3 options, one correct).
2) Cloze sentence (with 3 options).
3) Synonym OR antonym (1 item).
4) Word form/use (e.g., noun→adj; collocation).
5) A simple example sentence (CEFR A2–B1).
After each word block, provide an Answer Key.
Keep formatting compact and copy-friendly.
"""
def build_user_prompt(words_raw: str) -> str:
raw = (words_raw or "").replace(",", ",")
items = []
for seg in raw.split(","):
for w in seg.splitlines():
w = w.strip()
if w:
items.append(w)
words = items[:12] # 限制数量,避免超长
if not words:
return ""
return (
"TARGET WORDS:\n- " + "\n- ".join(words) +
"\n\nFORMAT STRICTLY LIKE:\n"
"== word ==\n"
"1) ...\n2) ...\n3) ...\n4) ...(optional)\n5) ...(optional)\n"
"[Answer Key]: ...\n"
"Use plain English. Avoid overlong sentences. CEFR A2–B1."
)
def generate(words_raw: str, level: str):
prompt = build_user_prompt(words_raw)
if not prompt:
return "Please paste today’s English words (comma or newline separated)."
# 根据难度微调系统提示
level_hint = f"Target difficulty: {level}."
resp = client.chat.completions.create(
model=MODEL_NAME,
temperature=0.4,
max_tokens=1200,
messages=[
{"role": "system", "content": SYSTEM_PROMPT + "\n" + level_hint},
{"role": "user", "content": prompt},
],
)
return resp.choices[0].message.content
with gr.Blocks(title="English Vocab Trainer") as demo:
gr.Markdown("## 🧠 English Vocab Trainer\nPaste today’s words, choose level, click **Generate**.")
with gr.Row():
level = gr.Radio(choices=["A2", "B1", "B2"], value="A2", label="Difficulty")
words = gr.Textbox(lines=8, label="Today's words (comma or newline separated)", placeholder="serendipity\nobscure, diligent\ncome up with")
btn = gr.Button("Generate")
out = gr.Markdown()
btn.click(generate, inputs=[words, level], outputs=out)
if __name__ == "__main__":
demo.launch()