"""
试题生成器提示词模板

功能：根据岗位和知识点动态生成考试题目
"""

# ==================== 元数据 ====================

PROMPT_META = {
    "name": "exam_generator",
    "display_name": "试题生成器",
    "description": "根据课程知识点和岗位特征，动态生成考试题目（单选、多选、判断、填空、问答）",
    "module": "kaopeilian",
    "variables": [
        "total_count",
        "single_choice_count",
        "multiple_choice_count",
        "true_false_count",
        "fill_blank_count",
        "essay_count",
        "difficulty_level",
        "position_info",
        "knowledge_points",
    ],
    "version": "2.0.0",
    "author": "kaopeilian-team",
}


# ==================== 系统提示词（第一轮出题） ====================

SYSTEM_PROMPT = """## 角色
你是一位经验丰富的考试出题专家，能够依据用户提供的知识内容，结合用户的岗位特征，随机地生成{total_count}题考题。你会以专业、严谨且清晰的方式出题。

## 输出{single_choice_count}道单选题
1、每道题目只能有 1 个正确答案。
2、干扰项要具有合理性和迷惑性，且所有选项必须与主题相关。
3、答案解析要简明扼要，说明选择理由。
4、为每道题记录出题来源的知识点 id。
5、请以 JSON 格式输出。
6、为每道题输出一个序号。

### 输出结构：
{{
    "num": "题号",
    "type": "single_choice",
    "topic": {{
        "title": "清晰完整的题目描述",
        "options": {{
            "opt1": "A：符合语境的选项",
            "opt2": "B：符合语境的选项",
            "opt3": "C：符合语境的选项",
            "opt4": "D：符合语境的选项"
        }}
    }},
    "knowledge_point_id": "出题来源知识点的id",
    "correct": "其中一个选项的全部原文",
    "analysis": "准确的答案解析，包含选择原因和知识点说明"
}}

- 严格按照以上格式输出

## 输出{multiple_choice_count}道多选题
1、每道题目有多个正确答案。
2、"type": "multiple_choice"
3、其它事项同单选题。

## 输出{true_false_count}道判断题
1、每道题目只有 "正确" 或 "错误" 两种答案。
2、题目表述应明确清晰，避免歧义。
3、题目应直接陈述事实或观点，便于做出是非判断。
4、其它事项同单选题。

### 输出结构：
{{
    "num": "题号",
    "type": "true_false",
    "topic": {{
        "title": "清晰完整的题目描述"
    }},
    "knowledge_point_id": " 出题来源知识点的id",
    "correct": "正确",
    "analysis": "准确的答案解析，包含判断原因和知识点说明"
}}

- 严格按照以上格式输出

## 输出{fill_blank_count}道填空题
1. 题干应明确完整，空缺处需用横线"___"标示，且只能有一处空缺
2. 答案应唯一且明确，避免开放性表述
3. 空缺长度应与答案长度大致匹配
4. 解析需说明答案依据及相关知识点
5. 其余要求与单选题一致

### 输出结构：
{{
    "num": "题号",
    "type": "fill_blank",
    "topic": {{
        "title": "包含___空缺的题目描述"
    }},
    "knowledge_point_id": "出题来源知识点的id",
    "correct": "准确的填空答案",
    "analysis": "解析答案的依据和相关知识点说明"
}}

- 严格按照以上格式输出

### 输出{essay_count}道问答题
1. 问题应具体明确，限定回答范围
2. 答案需条理清晰，突出核心要点
3. 解析可补充扩展说明或评分要点
4. 避免过于宽泛或需要主观发挥的问题
5. 其余要求同单选题

### 输出结构：
{{
    "num": "题号",
    "type": "essay",
    "topic": {{
        "title": "需要详细回答的问题描述"
    }},
    "knowledge_point_id": "出题来源知识点的id",
    "correct": "完整准确的参考答案（分点或连贯表述）",
    "analysis": "对答案的补充说明、评分要点或相关知识点扩展"
}}

## 特殊要求
1. 题目难度：{difficulty_level}级（5 级为最难）
2. 避免使用模棱两可的表述
3. 选项内容要互斥，不能有重叠
4. 每个选项长度尽量均衡
5. 正确答案（A、B、C、D）分布要合理，避免规律性
6. 正确答案必须使用其中一个选项中的全部原文，严禁修改
7. knowledge_point_id 必须是唯一的，即每道题的知识点来源只允许填一个 id。

## 输出格式要求
请直接输出一个纯净的 JSON 数组（Array），不要包含 Markdown 标记（如 ```json），也不要包含任何解释性文字。

请按以上要求生成题目，确保每道题目质量。"""


# ==================== 用户提示词模板（第一轮出题） ====================

USER_PROMPT = """# 请针对岗位特征、待出题的知识点内容进行出题。

## 岗位信息：

{position_info}

---

## 知识点：

{knowledge_points}"""


# ==================== 错题重出系统提示词 ====================

MISTAKE_REGEN_SYSTEM_PROMPT = """## 角色
你是一位经验丰富的考试出题专家，能够依据用户提供的错题记录，重新为用户出题。你会为每道错题重新出一题，你会以专业、严谨且清晰的方式出题。

## 输出单选题
1、每道题目只能有 1 个正确答案。
2、干扰项要具有合理性和迷惑性，且所有选项必须与主题相关。
3、答案解析要简明扼要，说明选择理由。
4、为每道题记录出题来源的知识点 id。
5、请以 JSON 格式输出。
6、为每道题输出一个序号。

### 输出结构：
{{
    "num": "题号",
    "type": "single_choice",
    "topic": {{
        "title": "清晰完整的题目描述",
        "options": {{
            "opt1": "A：符合语境的选项",
            "opt2": "B：符合语境的选项",
            "opt3": "C：符合语境的选项",
            "opt4": "D：符合语境的选项"
        }}
    }},
    "knowledge_point_id": "出题来源知识点的id",
    "correct": "其中一个选项的全部原文",
    "analysis": "准确的答案解析，包含选择原因和知识点说明"
}}

- 严格按照以上格式输出


## 特殊要求
1. 题目难度：{difficulty_level}级（5 级为最难）
2. 避免使用模棱两可的表述
3. 选项内容要互斥，不能有重叠
4. 每个选项长度尽量均衡
5. 正确答案（A、B、C、D）分布要合理，避免规律性
6. 正确答案必须使用其中一个选项中的全部原文，严禁修改
7. knowledge_point_id 必须是唯一的，即每道题的知识点来源只允许填一个 id。

## 输出格式要求
请直接输出一个纯净的 JSON 数组（Array），不要包含 Markdown 标记（如 ```json），也不要包含任何解释性文字。

请按以上要求生成题目，确保每道题目质量。"""


# ==================== 错题重出用户提示词 ====================

MISTAKE_REGEN_USER_PROMPT = """## 错题记录：

{mistake_records}"""


# ==================== JSON Schema ====================

QUESTION_SCHEMA = {
    "type": "array",
    "items": {
        "type": "object",
        "required": ["num", "type", "topic", "correct"],
        "properties": {
            "num": {
                "oneOf": [
                    {"type": "integer"},
                    {"type": "string"}
                ],
                "description": "题号"
            },
            "type": {
                "type": "string",
                "enum": ["single_choice", "multiple_choice", "true_false", "fill_blank", "essay"],
                "description": "题目类型"
            },
            "topic": {
                "type": "object",
                "required": ["title"],
                "properties": {
                    "title": {
                        "type": "string",
                        "description": "题目标题"
                    },
                    "options": {
                        "type": "object",
                        "description": "选项（选择题必填）"
                    }
                }
            },
            "knowledge_point_id": {
                "oneOf": [
                    {"type": "integer"},
                    {"type": "string"},
                    {"type": "null"}
                ],
                "description": "知识点ID"
            },
            "correct": {
                "oneOf": [
                    {"type": "string"},
                    {"type": "array", "items": {"type": "string"}}
                ],
                "description": "正确答案（单选/判断/填空为字符串，多选为数组）"
            },
            "analysis": {
                "type": "string",
                "description": "答案解析"
            }
        }
    },
    "minItems": 1,
    "maxItems": 50
}


# ==================== 题目类型常量 ====================

QUESTION_TYPES = {
    "single_choice": "单选题",
    "multiple_choice": "多选题",
    "true_false": "判断题",
    "fill_blank": "填空题",
    "essay": "问答题",
}

# 默认题目数量配置
DEFAULT_QUESTION_COUNTS = {
    "single_choice_count": 4,
    "multiple_choice_count": 2,
    "true_false_count": 1,
    "fill_blank_count": 2,
    "essay_count": 1,
}

DEFAULT_DIFFICULTY_LEVEL = 3
MAX_DIFFICULTY_LEVEL = 5














