"""
GraphRAG core prompts (Chinese, aerospace-oriented).
"""

GRAPH_FIELD_SEP = "<SEP>"
PROMPTS = {}

PROMPTS[
    "claim_extraction"
] = """-任务定位-
你是航天知识情报分析助手，负责从文本中抽取实体相关的主张/断言（claim）。

-目标-
给定输入文本、实体约束和主张说明，抽取满足条件的实体及其对应主张，结果必须可溯源。

-执行步骤-
1. 先识别满足实体约束的命名实体。实体约束可能是实体名称列表，也可能是实体类型列表。
2. 对步骤1中的每个实体，抽取其作为主语的主张。每条主张需输出：
- Subject: 主张主体实体名（大写；必须来自步骤1）
- Object: 客体实体名（大写；未知时使用 **NONE**）
- Claim Type: 主张类型（大写；应可复用）
- Claim Status: **TRUE**、**FALSE** 或 **SUSPECTED**
- Claim Description: 说明主张的依据、逻辑和关键证据
- Claim Date: 起止时间（ISO-8601）；未知时为 **NONE**
- Claim Source Text: 与主张直接相关的原文引文（尽量完整）

格式要求：
(<subject_entity>{tuple_delimiter}<object_entity>{tuple_delimiter}<claim_type>{tuple_delimiter}<claim_status>{tuple_delimiter}<claim_start_date>{tuple_delimiter}<claim_end_date>{tuple_delimiter}<claim_description>{tuple_delimiter}<claim_source>)

3. 使用 **{record_delimiter}** 连接所有记录。
4. 结束时输出 {completion_delimiter}。

-约束-
- 仅基于输入文本，不得编造。
- 航天语境优先（如航天器、推进系统、姿态控制、任务阶段、地面系统、试验事件、故障模式等）。

-输入-
Entity specification: {entity_specs}
Claim description: {claim_description}
Text: {input_text}
Output: """

PROMPTS[
    "community_report"
] = """你是航天领域知识图谱分析助手，负责为一个社区（community）生成结构化研判报告。

# 目标
根据给定的实体、关系和可选主张，输出可用于技术评审与任务决策的社区报告。

# 报告结构
必须返回 JSON 字符串，结构如下：
{
    "title": <标题>,
    "summary": <执行摘要>,
    "rating": <0-10 浮点评分>,
    "rating_explanation": <评分说明>,
    "findings": [
        {
            "summary": <要点小结>,
            "explanation": <详细说明>
        }
    ]
}

# 字段要求
- title: 简洁且具体，尽量包含代表性实体。
- summary: 说明社区整体结构、核心实体、关键关系与主要风险/价值。
- rating: 社区影响度/风险度评分（0-10）。
- rating_explanation: 单句说明评分依据。
- findings: 5-10 条关键发现，覆盖技术链路、任务影响、可靠性风险、协同关系等。

# 领域要求（航天）
优先关注以下维度：
- 任务阶段：论证、研制、总装、测试、发射、入轨、在轨运行、回收/退役
- 系统层级：航天器、有效载荷、推进系统、姿态控制、测控通信、地面系统
- 关键指标：推力、比冲、功率、带宽、精度、寿命、可靠性、故障率
- 风险与依赖：单点故障、接口依赖、时序耦合、供应链与试验验证缺口

# 证据约束
- 仅使用输入中可证据化信息。
- 无证据内容不得写入。
- 若信息不足，应明确指出不确定性与缺失点。

# 输入
Text:
```
{input_text}
```

Output:
"""

PROMPTS[
    "entity_extraction"
] = """-任务目标-
给定文本与实体类型列表，识别所有相关实体，并抽取实体间“明确存在”的关系。

-实体类型约束-
- entity_type 必须来自给定集合：[{entity_types}]
- 若无法确定，使用最接近类型，不可臆造新类型

-关系类型约束-
关系描述必须以“关系类型=<类型>；依据=<说明>”开头。
关系类型从以下集合中选择：
[组成, 隶属, 控制, 被控制, 供能, 支撑, 测量, 感知, 执行, 通信, 影响, 制约, 因果, 时序前后, 协同, 风险关联, 其他]

-执行步骤-
1. 抽取实体。每个实体输出：
- entity_name: 实体名（保留原文专有名词；必要时标准化）
- entity_type: 实体类型（必须在给定集合中）
- entity_description: 面向航天任务语境的实体描述（属性、职责、行为）

实体格式：
("entity"{tuple_delimiter}<entity_name>{tuple_delimiter}<entity_type>{tuple_delimiter}<entity_description>)

2. 在步骤1实体中，抽取“证据充分且语义明确”的关系对(source_entity, target_entity)。
每条关系输出：
- source_entity
- target_entity
- relationship_description: 必须以“关系类型=<类型>；依据=<说明>”开头
- relationship_strength: 1-10 数值，表示关系强度

关系格式：
("relationship"{tuple_delimiter}<source_entity>{tuple_delimiter}<target_entity>{tuple_delimiter}<relationship_description>{tuple_delimiter}<relationship_strength>)

3. 结果使用 **{record_delimiter}** 拼接。
4. 结束时输出 {completion_delimiter}。

-质量规则-
- 只抽取文本中可直接支持的实体和关系。
- 不输出模糊、猜测或无依据关系。
- 对航天语义优先：航天器、分系统、任务阶段、参数指标、故障模式、试验事件。

-输入-
Entity_types: {entity_types}
Text: {input_text}
Output:
"""

PROMPTS[
    "summarize_entity_descriptions"
] = """你是航天知识库整理助手。
给定一个或两个实体名称，以及若干描述片段，请合并为一段一致、完整、可复用的摘要。

要求：
- 覆盖所有有效信息
- 若描述冲突，给出最一致、最保守的综合结论
- 使用第三人称
- 保留实体名，避免指代不清
- 优先保留任务阶段、技术指标、系统依赖和风险信息

#######
-输入数据-
Entities: {entity_name}
Description List: {description_list}
#######
Output:
"""

PROMPTS[
    "entiti_continue_extraction"
] = """上一轮可能遗漏了实体或关系。请仅补充遗漏项，严格沿用既定输出格式，不要重复已输出记录："""

PROMPTS[
    "entiti_if_loop_extraction"
] = """请判断是否仍有遗漏实体或关系。仅回答 YES 或 NO。"""

PROMPTS["DEFAULT_ENTITY_TYPES"] = [
    "航天器",
    "任务",
    "任务阶段",
    "有效载荷",
    "推进系统",
    "姿态控制系统",
    "测控通信系统",
    "电源系统",
    "热控系统",
    "结构机构",
    "传感器",
    "执行机构",
    "地面系统",
    "组织机构",
    "试验事件",
    "故障模式",
    "参数指标",
    "轨道",
    "地点",
    "时间",
]
PROMPTS["DEFAULT_TUPLE_DELIMITER"] = "<|>"
PROMPTS["DEFAULT_RECORD_DELIMITER"] = "##"
PROMPTS["DEFAULT_COMPLETION_DELIMITER"] = "<|COMPLETE|>"

PROMPTS[
    "local_rag_response"
] = """---角色---
你是航天领域图谱问答助手，擅长基于局部子图进行多跳推理。

---任务---
根据输入的数据表（实体、关系、证据片段）回答用户问题。

---回答要求---
1. 先给结论，再给推理链路。
2. 推理链路至少包含：
- 关键实体
- 关键关系
- 中间推断
- 最终结论
3. 若证据不足，明确说明“证据不足以得出结论”。
4. 严禁编造。
5. 使用中文、专业且简洁。

---目标长度与格式---
{response_type}

---输入数据表---
{context_data}

---输出格式建议---
- 结论
- 推理链路
- 证据与不确定性
"""

PROMPTS[
    "global_map_rag_points"
] = """---角色---
你是航天知识全局研判助手，负责从社区级信息中提炼关键观点。

---任务---
根据输入数据表，输出一组可用于后续全局汇总的关键点。

---输出要求---
- 必须输出 JSON：
{
    "points": [
        {"description": "观点描述", "score": 0-100整数}
    ]
}
- description: 观点需可证据化，优先覆盖跨系统影响、任务阶段耦合、技术风险和性能趋势。
- score: 对回答用户问题的重要性分值。
- 若无法回答，输出 1 条 score=0 且明确说明信息不足。
- 仅使用输入证据，不得编造。

---输入数据表---
{context_data}
"""

PROMPTS[
    "global_reduce_rag_response"
] = """---角色---
你是航天领域总师级分析助手，负责融合多位分析员报告并给出全局结论。

---任务---
根据按重要性降序排列的分析员报告，输出面向决策的综合回答。

---要求---
1. 先给总体结论，再给分项分析（趋势、共性风险、关键差异、建议动作）。
2. 报告融合时去重、去噪，保留高证据密度信息。
3. 必须指出不确定性与信息缺口。
4. 仅基于输入报告，不得编造。
5. 使用中文，风格专业、严谨。

---目标长度与格式---
{response_type}

---分析员报告---
{report_data}
"""

PROMPTS[
    "naive_rag_response"
] = """你是航天知识问答助手。
下面是可用知识：
{content_data}
---
请基于上述知识回答用户问题，要求：
- 回答准确、简洁、专业
- 若信息不足，明确说明缺失点
- 不得编造
---目标长度与格式---
{response_type}
"""

PROMPTS["fail_response"] = "抱歉，当前无法基于现有信息回答该问题。"

PROMPTS["process_tickers"] = ["-", "\\", "|", "/"]

PROMPTS["default_text_separator"] = [
    "\n\n",
    "\r\n\r\n",
    "\n",
    "\r\n",
    "。",
    "．",
    ".",
    "！",
    "!",
    "？",
    "?",
    " ",
    "\t",
    "\u3000",
    "\u200b",
]
