# api/courseware/activity_designer.py """ Activity & Assignment Designer:课堂活动、作业及评分标准(Rubric);从上传资料提取核心知识点。 """ from typing import Optional, List, Tuple from api.config import client, DEFAULT_MODEL, USE_WEAVIATE from api.courseware.rag import get_rag_context_with_refs, inject_refs_instruction from api.courseware.references import append_references_to_content from api.courseware.prompts import ACTIVITY_DESIGNER_SYSTEM, ACTIVITY_DESIGNER_USER_TEMPLATE def design_activities_and_assignments( topic: str, learning_objectives: Optional[str] = None, rag_context_override: Optional[str] = None, max_tokens: int = 2200, history: Optional[list] = None, ) -> str: """ 设计课堂活动、作业及 Rubric;支持从上传资料提取核心知识点并与目标一致。 """ query = f"{topic}\n{learning_objectives or ''}"[:1500] rag_context, refs = get_rag_context_with_refs(query, top_k=8, max_context_chars=5000) if rag_context_override: rag_context = rag_context_override ref_instruction = inject_refs_instruction(refs) user_content = ACTIVITY_DESIGNER_USER_TEMPLATE.format( topic=topic.strip() or "(未提供主题)", learning_objectives=(learning_objectives or "(未提供,请根据主题推断)").strip(), rag_context=rag_context or "(无检索到知识库摘录,将基于通用教学设计回答。)", ref_instruction=ref_instruction, ) messages = [{"role": "system", "content": ACTIVITY_DESIGNER_SYSTEM}] if history: for user_msg, assistant_msg in history[-10:]: if user_msg: messages.append({"role": "user", "content": user_msg}) if assistant_msg: messages.append({"role": "assistant", "content": assistant_msg}) messages.append({"role": "user", "content": user_content}) try: resp = client.chat.completions.create( model=DEFAULT_MODEL, messages=messages, temperature=0.5, max_tokens=max_tokens, timeout=90, ) out = (resp.choices[0].message.content or "").strip() except Exception as e: out = f"生成失败:{e}。请稍后重试。" if refs and "## References" not in out and "[Source:" not in out: out = append_references_to_content(out, refs) return out