Spaces:
Sleeping
Sleeping
Download app.py from sofiamak/vireovocabulary: direct link, hf CLI and curl.
- Browser
- Download file 2.74 kB
-
https://huggingface.co/spaces/sofiamak/vireovocabulary/resolve/main/app.py
- Command line
-
hf download hf://spaces/sofiamak/vireovocabulary/app.py
-
curl -L -o app.py https://huggingface.co/spaces/sofiamak/vireovocabulary/resolve/main/app.py
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() |