import httpx from app.core.config import settings from app.services.school_level import school_level_label QUESTION_PROMPT = """你是一位{stage}老师。以下是从试卷 OCR 识别出的文字,可能含有噪声。 科目:{subject} 请整理出清晰的题目内容(保留题号、选项、公式),只输出题目正文,不要解释。 OCR 原文: {ocr_text} """ SOLUTION_PROMPT = """你是一位耐心的{stage}{subject}老师。请为以下题目给出详细解法。 要求:步骤清晰,语言适合{stage}学生理解,指出考点和易错点。 题目: {question_text} """ async def ollama_generate(prompt: str) -> str: url = f"{settings.OLLAMA_BASE_URL.rstrip('/')}/api/generate" payload = { "model": settings.OLLAMA_MODEL, "prompt": prompt, "stream": False, } async with httpx.AsyncClient(timeout=120.0) as client: response = await client.post(url, json=payload) response.raise_for_status() data = response.json() return (data.get("response") or "").strip() async def format_question(subject: str, ocr_text: str, school_level=None) -> str: stage = school_level_label(school_level) prompt = QUESTION_PROMPT.format(stage=stage, subject=subject, ocr_text=ocr_text) return await ollama_generate(prompt) async def generate_solution(subject: str, question_text: str, school_level=None) -> str: stage = school_level_label(school_level) prompt = SOLUTION_PROMPT.format( stage=stage, subject=subject, question_text=question_text ) return await ollama_generate(prompt)