"""Prompt templates for government document entity and relationship extraction.

The system prompt can be generated dynamically via ``build_system_prompt()``
to reflect the current entity/relationship type definitions in the graph.
The static ``ENTITY_EXTRACTION_SYSTEM`` is kept as the default fallback.

Three-layer prompt architecture:
1. **Base rules** (always included): common rules + phase_0 governance + phase_1 matters
2. **Core extension rules** (when phase_0 new entities present): Policy/Task/Project/
   System/DataResource/Budget/Indicator/Industry disambiguation & extraction rules
3. **Scene enhancement rules** (when phase_3 enabled via scene): Person/Event/Mechanism/
   Standard/Infrastructure/Technology extraction rules
"""

from __future__ import annotations

from typing import Any

from app.core.graph_schema_loader import get_schema

# ---------------------------------------------------------------------------
# Entity-name sets used by the prompt builder to decide which rule blocks
# to inject.  Kept as module-level constants for clarity and reuse.
# ---------------------------------------------------------------------------

_PHASE1_ENTITIES = {"Matter", "Condition", "Material", "TimeLimit", "TargetGroup"}

_CORE_EXTENSION_ENTITIES = {
    "Policy", "Task", "Project", "System",
    "DataResource", "Indicator", "Budget", "Industry",
}

_SCENE_ENHANCEMENT_ENTITIES = {
    "Person", "Event", "Mechanism", "Standard",
    "Infrastructure", "Technology",
}

# ---------------------------------------------------------------------------
# Rule blocks — injected conditionally into the dynamic prompt
# ---------------------------------------------------------------------------

_PHASE1_RULES = """
## 事项图抽取规则
- **Matter 粒度控制**：满足以下至少一项才抽取为 Matter：可回答"由谁办理"、可回答"需要什么材料"、可回答"有什么条件"、可回答"多久办完"、可被文件/条款明确规范。不要将过于宏观的概念、过于细碎的动作或无稳定办理语义的短语作为 Matter
- **Condition**：必须是明确可判断的适用/资格/前置条件
- **Material**：保留 is_required 和 format_requirement 属性
- **TimeLimit**：必须包含数字和单位；duration 优先解析为数值字符串，unit 统一为"工作日/自然日/月/年"，context 描述起算条件
- **TargetGroup 与 Organization 的区别**：TargetGroup 表示适用对象"类型"（如"企业法人"），不是具体机构或个人
- **HANDLED_BY 与 ISSUED_BY 的区别**：ISSUED_BY 是文件发布机构，HANDLED_BY 是事项办理机构
- **APPLIES_TO_REGION (Matter→Region)**：仅在事项存在独立于文件的显式地域约束时才抽取
- **不要求每次输出都包含全部事项类实体**：仅输出有明确证据支持的实体与关系，不要虚构"""

_CORE_EXTENSION_RULES = """
## 核心公文图抽取规则
- **Policy vs Document**：仅当文档包含多条可独立引用的政策措施时才抽取 Policy；若文档整体即为一条政策，不额外抽取 Policy 实体
- **Task vs Project**：Task 是可分配的具体工作项（有责任方/截止时间），Project 是有独立建设周期和预算的具名项目。不要将宏观目标或战略方向作为 Task
- **Project vs System**：Project 是建设过程（如"智慧城市一期工程"），System 是建成后的运行态 IT 系统/平台（如"一体化政务服务平台"）
- **Indicator vs Standard**：Indicator 仅限可量化 KPI/目标值/统计指标（如"GDP增速6%"、"办件量同比提升20%"）；Standard 仅限规范性标准/标准文件/技术标准（如"GB/T 39786-2021"、"政务服务'好差评'标准"）。不允许两者同时承接"考核"与"规范"双重语义
- **Event vs Document(纪要)**：Event 是活动事件本身（如"市政府第五次常务会议"），Document 是活动产生的文件载体（如"会议纪要"）。两者可共存但需区分
- **Task**：必须是可分配的具体工作项，不是宏观目标或战略口号
- **Budget**：必须包含可识别的资金金额或预算科目（如"安排资金500万元"、"纳入年度财政预算"），不要将"加大投入"等模糊表述作为 Budget
- **Industry**：必须是具体产业/行业名称（如"新能源汽车产业"、"软件和信息技术服务业"），不要将"实体经济"等泛称作为 Industry
- **DataResource**：必须是具名数据库/数据集/数据目录（如"人口基础信息数据库"、"公共数据资源目录"），不要将"数据"泛称作为 DataResource"""

_SCENE_ENHANCEMENT_RULES = """
## 办公扩展层抽取规则

### 易混淆类型辨析（必须遵循）
- **Person vs Organization**：Person 是自然人（如"张三""李局长"），Organization 是机构法人（如"市发改委"）。机构名称中包含的人名（如"某某工作室"）属于 Organization，不是 Person
- **Person vs Position**：仅抽取具名人物为 Person（如"市长张三"），不要将职务头衔本身（如"市长""处长"）作为 Person 实体
- **Event vs Document**：Event 是活动/会议/仪式本身（如"市政府第五次常务会议"），Document 是活动产生的文件载体（如"会议纪要"）。两者可共存但类型不同
- **Mechanism vs Task**：Mechanism 是长期制度安排（如"联席会议制度"），Task 是一次性或有截止时间的工作项。若有"定期""制度""长效"等关键词倾向 Mechanism
- **Mechanism vs Standard**：Mechanism 是组织运作规则（如"考核通报机制"），Standard 是规范性技术/管理标准（如"GB/T 39786-2021"）
- **Infrastructure vs System**：Infrastructure 是物理/网络基础设施（如"电子政务外网""市民服务中心"），System 是建成后的软件平台/应用系统（如"一体化政务服务平台"）。两者可关联（System 部署在 Infrastructure 上）但类型不同

### 抽取规则
- **Person**：抽取在文中履行职务行为的人员（如"签发人""主持人""分管领导"）。属性中尽可能补充 serving_org（所在机构）和 position（职务）。注意：同名公职人员可能是不同人，系统通过 name+serving_org+position 组合区分身份
- **Event**：抽取具名会议、活动、仪式等事件（如"市政府第五次常务会议"、"招商引资推介会"）。属性中补充 event_date（日期）和 event_type（类型，如"会议""培训""检查"）
- **Mechanism**：抽取制度性工作机制（如"联席会议制度"、"定期通报机制"、"挂钩帮扶机制"），必须是有组织架构支撑的制度安排，不是一次性动作
- **Standard**：抽取规范性标准或标准文件（如"政务服务'好差评'工作标准"、"GB/T 39786-2021"）。与 Indicator 互斥——不允许同一概念同时作为指标和标准
- **Infrastructure**：抽取基础设施或公共设施（如"政务云平台"、"电子政务外网"、"市民服务中心"），必须是可标识的设施实体
- **Technology**：抽取具名技术或技术体系（如"区块链"、"人工智能"、"大数据"），不要抽取过于泛化的表述"""


# ── Default static prompt (fallback) ────────────────────────────────────────

ENTITY_EXTRACTION_SYSTEM = """你是一个政务公文实体关系抽取专家。请从给定的公文文本中抽取实体和关系。

## 实体类型
1. Organization: 政府机关、主管部门、责任部门（使用规范全称，如"XX市人民政府"而非"市政府"）
2. Region: 行政地域、适用地域（如"全省"、"北京市朝阳区"）
3. PolicyTheme: 稳定的政策主题/专项领域（如"营商环境优化"、"乡村振兴"、"数字政府建设"，高层级概括）
4. Matter: 可独立办理或规范的具体行政事项（如"政府采购供应商资格审查"、"建设用地审批"、"差旅报销"）
5. Condition: 事项适用条件、资格条件、前置条件（如"注册资本不低于100万元"、"具有相关资质证书"）
6. Material: 申请材料、报送材料（如"营业执照副本"、"项目可行性研究报告"）
7. TimeLimit: 时限要求、办理周期、有效期（如"自受理之日起20个工作日内"、"有效期3年"）
8. TargetGroup: 适用对象类型（如"企业法人"、"中小企业"、"申请人"），不是具体机构或个人
9. Policy: 可独立引用的政策措施（仅当文档包含多条独立政策时才抽取）
10. Task: 可分配的具体工作项（有责任方/截止时间）
11. Project: 有独立建设周期和预算的具名项目
12. System: 运行态IT系统/平台
13. DataResource: 具名数据库/数据集/数据目录
14. Indicator: 可量化KPI/目标值/统计指标
15. Budget: 含可识别资金金额或预算科目的财政安排
16. Industry: 具体产业/行业名称

## 关系类型
- Document -[ISSUED_BY]-> Organization（文件由某机构发布）
- Document -[APPLIES_TO_REGION]-> Region（文件适用于某地域）
- Document -[BELONGS_TO_THEME]-> PolicyTheme（文件属于某政策主题）
- Document -[BASED_ON]-> Document（文件依据某上位文件制定，如"根据《XX法》"、"依据国发〔2024〕X号"）
- Document -[AMENDS]-> Document（文件修订某文件，如"对《XX办法》作如下修改"）
- Document -[REPEALS]-> Document（文件废止某文件，如"《XX规定》同时废止"）
- Document -[REFERENCES]-> Document（普通引用关系，通过文号如"X发〔YYYY〕NN号"识别）
- Document -[GOVERNS]-> Matter（文件规范某事项）
- Matter -[HAS_CONDITION]-> Condition（事项具有适用条件）
- Matter -[REQUIRES_MATERIAL]-> Material（事项要求材料）
- Matter -[HAS_TIME_LIMIT]-> TimeLimit（事项具有时限要求）
- Matter -[APPLIES_TO_TARGET]-> TargetGroup（事项适用于某对象类型）
- Matter -[HANDLED_BY]-> Organization（事项由某机构办理）
- Matter -[APPLIES_TO_REGION]-> Region（事项适用于某地域，仅在事项有独立于文件的显式地域约束时才使用）
- Document -[CONTAINS_POLICY]-> Policy（文件包含政策措施）
- Document -[DEPLOYS_TASK]-> Task（文件部署工作任务）
- Document -[APPROVES_PROJECT]-> Project（文件批准项目）
- Task -[LEAD_BY]-> Organization（任务由某机构牵头）
- Task -[ASSISTED_BY]-> Organization（任务由某机构配合）
- Policy -[ASSIGNED_TO]-> Organization（政策责任单位）
- Project -[IMPLEMENTED_BY]-> Organization（项目实施单位）
- System -[OPERATED_BY]-> Organization（系统运营单位）
- Organization -[SUBORDINATE_TO]-> Organization（机构隶属关系）
- Organization -[COOPERATES_WITH]-> Organization（机构合作关系）
- Policy -[RELATES_TO_THEME]-> PolicyTheme（政策关联主题）
- Task -[IMPLEMENTS]-> Policy（任务落实政策）
- Project -[LOCATED_IN]-> Region（项目所在区域）
- Project -[SUPPORTED_BY]-> Policy（项目获政策支持）
- Budget -[FUNDS]-> Project（预算资助项目）
- Budget -[FUNDS]-> Task（预算资助任务）
- System -[MANAGES]-> DataResource（系统管理数据资源）
- Indicator -[EVALUATES]-> Task（指标考核任务）
- Indicator -[EVALUATES]-> Project（指标考核项目）

## 输出格式
请以 JSON 格式输出，结构如下：
{
  "entities": [
    {"type": "Organization", "name": "XX省人民政府", "properties": {}},
    {"type": "Region", "name": "全省", "properties": {}},
    {"type": "PolicyTheme", "name": "营商环境优化", "properties": {"description": "优化营商环境相关政策"}},
    {"type": "Matter", "name": "政府采购供应商资格审查", "properties": {"description": "供应商参与政府采购的资格审查程序", "matter_type": "行政审批"}},
    {"type": "Condition", "name": "注册资本不低于100万元", "properties": {"condition_type": "资格条件"}},
    {"type": "Material", "name": "营业执照副本", "properties": {"is_required": true}},
    {"type": "TimeLimit", "name": "自受理之日起20个工作日内", "properties": {"duration": "20", "unit": "工作日", "context": "自受理之日起"}}
  ],
  "relations": [
    {"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "ISSUED_BY", "target_type": "Organization", "target_name": "XX省人民政府"},
    {"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "GOVERNS", "target_type": "Matter", "target_name": "政府采购供应商资格审查"},
    {"source_type": "Matter", "source_name": "政府采购供应商资格审查", "relation": "REQUIRES_MATERIAL", "target_type": "Material", "target_name": "营业执照副本"},
    {"source_type": "Matter", "source_name": "政府采购供应商资格审查", "relation": "HAS_TIME_LIMIT", "target_type": "TimeLimit", "target_name": "自受理之日起20个工作日内"}
  ],
  "referenced_doc_numbers": ["国发〔2024〕15号"]
}

## 重要规则
- **CURRENT_DOC 代表当前文档本身**，在 relations 中必须使用 CURRENT_DOC 将文档与实体连接
- **每个抽取的实体都应至少有一条关系连接到 CURRENT_DOC 或其他已抽取实体**
- **文件间关系判断优先级**（按顺序判断，优先使用高优关系，REFERENCES仅为兜底）：
  1. 明确"根据""依据""依照""按照" → **BASED_ON**
  2. 明确"修改""修订""调整某文件" → **AMENDS**
  3. 明确"废止""同时废止""停止执行" → **REPEALS**
  4. 仅普通提及其他文件，且无法判断治理语义 → **REFERENCES**（兜底）
- **REFERENCES 仅作为兜底关系**，当文号被提及但无明确的依据/修订/废止语义时才使用
- 机关名称请使用规范全称
- PolicyTheme 应为高层级政策领域概括，不要照抄文件标题；每个文档最多抽取 1-3 个最核心的 PolicyTheme
- 同一实体只输出一次
- 文号格式识别：如"X发〔YYYY〕NN号"、"X政〔YYYY〕第NN号"等
- 如果某类实体在文中未出现，对应列表留空
- 只输出 JSON，不要输出其他内容

## 事项图抽取规则
- **Matter 粒度控制**：满足以下至少一项才抽取为 Matter：可回答"由谁办理"、可回答"需要什么材料"、可回答"有什么条件"、可回答"多久办完"、可被文件/条款明确规范。不要将过于宏观的概念（如"行政管理"）、过于细碎的动作（如"填写附件"）或无稳定办理语义的短语（如"统筹协调"）作为 Matter
- **Condition**：必须是明确的适用/资格/前置条件，具体可判断，不抽取模糊目标或一般性描述
- **Material**：保留 is_required（是否必需）和 format_requirement（格式要求）属性
- **TimeLimit**：必须包含数字和单位的明确时间限制；duration 优先解析为数值字符串，unit 统一为"工作日/自然日/月/年"，context 描述起算条件
- **TargetGroup 与 Organization 的区别**：TargetGroup 表示适用对象的"类型"（如"企业法人"、"中小企业"），不是具体机构或个人。具体机关/单位归为 Organization
- **HANDLED_BY 与 ISSUED_BY 的区别**：ISSUED_BY 表示文件发布机构，HANDLED_BY 表示事项办理机构。同一机构可以同时出现在两个关系中，但语义不可混淆
- **APPLIES_TO_REGION (Matter→Region)**：仅在事项本身存在独立于文件的显式地域约束时才抽取；若事项未单独声明地域范围，默认继承文件的适用地域，不重复创建 Matter→Region 关系
- **不要求每次输出都包含全部事项类实体**：仅输出有明确证据支持的实体与关系。若文档中不存在明确的事项、条件、材料、时限或适用对象，不要为了凑齐类型而虚构

## 核心公文图抽取规则
- **Policy vs Document**：仅当文档包含多条可独立引用的政策措施时才抽取 Policy；若文档整体即为一条政策，不额外抽取 Policy 实体
- **Task vs Project**：Task 是可分配的具体工作项（有责任方/截止时间），Project 是有独立建设周期和预算的具名项目
- **Project vs System**：Project 是建设过程，System 是运行态 IT 系统/平台
- **Indicator vs Standard**：Indicator 仅限可量化 KPI/目标值/统计指标；Standard 仅限规范性标准文件
- **Task**：必须是可分配的具体工作项，不是宏观目标
- **Budget**：必须包含可识别的资金金额或预算科目
- **Industry**：必须是具体产业/行业名称"""


ENTITY_EXTRACTION_USER = """以下是公文的元数据和正文内容，请抽取实体和关系。

## 公文元数据
- 标题：{title}
- 文号：{doc_number}
- 发文机关：{issuing_org}
- 文种：{doc_type}
- 签发人：{signer}
- 主题词：{subject_words}

## 公文正文
{content}"""


# ── Dynamic prompt builder ──────────────────────────────────────────────────


def build_system_prompt(
    entity_types: list[dict[str, Any]],
    rel_types: list[dict[str, Any]],
) -> str:
    """Generate the entity-extraction system prompt from type definitions.

    The prompt is assembled in three layers:
    1. Base rules (always) — common extraction rules
    2. Core extension rules — when Policy/Task/Project/… are in the type list
    3. Scene enhancement rules — when Person/Event/Mechanism/… are present

    Falls back to the static default if either list is empty.
    """
    if not entity_types or not rel_types:
        return ENTITY_EXTRACTION_SYSTEM

    # ── build entity & relationship sections ────────────────────────────────
    entity_lines: list[str] = []
    for i, et in enumerate(entity_types, 1):
        entity_lines.append(f"{i}. {et['name']}: {et.get('description', '')}")
    entity_section = "\n".join(entity_lines)

    rel_lines: list[str] = []
    for rt in rel_types:
        src = ", ".join(rt.get("source_labels") or ["*"])
        tgt = ", ".join(rt.get("target_labels") or ["*"])
        desc = rt.get("description", "")
        rel_lines.append(f"- {src} -[{rt['name']}]-> {tgt}（{desc}）")
    rel_section = "\n".join(rel_lines)

    # ── detect which rule blocks to inject ──────────────────────────────────
    entity_names = {et["name"] for et in entity_types}
    has_phase1 = bool(entity_names & _PHASE1_ENTITIES)
    has_core_extension = bool(entity_names & _CORE_EXTENSION_ENTITIES)
    has_scene_enhancement = bool(entity_names & _SCENE_ENHANCEMENT_ENTITIES)

    # ── conditional example snippets ────────────────────────────────────────
    phase1_example = ""
    if has_phase1:
        phase1_example = """,
    {{"type": "Matter", "name": "政府采购供应商资格审查", "properties": {{"description": "供应商参与政府采购的资格审查程序", "matter_type": "行政审批"}}}},
    {{"type": "Material", "name": "营业执照副本", "properties": {{"is_required": true}}}},
    {{"type": "TimeLimit", "name": "自受理之日起20个工作日内", "properties": {{"duration": "20", "unit": "工作日", "context": "自受理之日起"}}}}"""

    core_ext_example = ""
    if has_core_extension:
        core_ext_example = """,
    {{"type": "Policy", "name": "优化营商环境若干措施", "properties": {{"summary": "包含企业开办、行政审批等多项优化措施"}}}},
    {{"type": "Task", "name": "推进政务服务标准化", "properties": {{"responsible_org": "市行政审批局"}}}},
    {{"type": "Project", "name": "智慧城市一期工程", "properties": {{"budget_amount": "5000万元"}}}}"""

    scene_example = ""
    if has_scene_enhancement:
        scene_example = """,
    {{"type": "Person", "name": "张三", "properties": {{"serving_org": "XX市人民政府", "position": "副市长"}}}},
    {{"type": "Event", "name": "市政府第五次常务会议", "properties": {{"event_date": "2024-03-15", "event_type": "会议"}}}}"""

    # relationship examples
    phase1_rel_example = ""
    if has_phase1:
        phase1_rel_example = """,
    {{"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "GOVERNS", "target_type": "Matter", "target_name": "政府采购供应商资格审查"}},
    {{"source_type": "Matter", "source_name": "政府采购供应商资格审查", "relation": "REQUIRES_MATERIAL", "target_type": "Material", "target_name": "营业执照副本"}}"""

    core_ext_rel_example = ""
    if has_core_extension:
        core_ext_rel_example = """,
    {{"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "CONTAINS_POLICY", "target_type": "Policy", "target_name": "优化营商环境若干措施"}},
    {{"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "DEPLOYS_TASK", "target_type": "Task", "target_name": "推进政务服务标准化"}},
    {{"source_type": "Task", "source_name": "推进政务服务标准化", "relation": "LEAD_BY", "target_type": "Organization", "target_name": "XX市行政审批局"}}"""

    scene_rel_example = ""
    if has_scene_enhancement:
        scene_rel_example = """,
    {{"source_type": "Person", "source_name": "张三", "relation": "SERVES_IN", "target_type": "Organization", "target_name": "XX市人民政府"}},
    {{"source_type": "Event", "source_name": "市政府第五次常务会议", "relation": "CHAIRED_BY", "target_type": "Person", "target_name": "张三"}}"""

    # ── assemble conditional rule blocks ────────────────────────────────────
    extra_rules = ""
    if has_phase1:
        extra_rules += _PHASE1_RULES
    if has_core_extension:
        extra_rules += _CORE_EXTENSION_RULES
    if has_scene_enhancement:
        extra_rules += _SCENE_ENHANCEMENT_RULES

    return f"""你是一个政务公文实体关系抽取专家。请从给定的公文文本中抽取实体和关系。

## 实体类型
{entity_section}

## 关系类型
{rel_section}

## 输出格式
请以 JSON 格式输出，结构如下：
{{
  "entities": [
    {{"type": "Organization", "name": "XX省人民政府", "properties": {{}}}},
    {{"type": "Region", "name": "全省", "properties": {{}}}},
    {{"type": "PolicyTheme", "name": "营商环境优化", "properties": {{"description": "优化营商环境相关政策"}}}}{phase1_example}{core_ext_example}{scene_example}
  ],
  "relations": [
    {{"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "ISSUED_BY", "target_type": "Organization", "target_name": "XX省人民政府"}},
    {{"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "APPLIES_TO_REGION", "target_type": "Region", "target_name": "全省"}},
    {{"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "BELONGS_TO_THEME", "target_type": "PolicyTheme", "target_name": "营商环境优化"}},
    {{"source_type": "Document", "source_name": "CURRENT_DOC", "relation": "BASED_ON", "target_type": "Document", "target_name": "国发〔2024〕15号"}}{phase1_rel_example}{core_ext_rel_example}{scene_rel_example}
  ],
  "referenced_doc_numbers": ["国发〔2024〕15号"]
}}

## 重要规则
- **CURRENT_DOC 代表当前文档本身**，在 relations 中必须使用 CURRENT_DOC 将文档与实体连接
- **每个抽取的实体都应至少有一条关系连接到 CURRENT_DOC 或其他已抽取实体**
- **文件间关系判断优先级**（按顺序判断，优先使用高优关系，REFERENCES仅为兜底）：
  1. 明确"根据""依据""依照""按照" → **BASED_ON**
  2. 明确"修改""修订""调整某文件" → **AMENDS**
  3. 明确"废止""同时废止""停止执行" → **REPEALS**
  4. 仅普通提及其他文件，且无法判断治理语义 → **REFERENCES**（兜底）
- **REFERENCES 仅作为兜底关系**，当文号被提及但无明确的依据/修订/废止语义时才使用
- 机关名称请使用规范全称
- PolicyTheme 应为高层级政策领域概括，不要照抄文件标题；每个文档最多抽取 1-3 个最核心的 PolicyTheme
- 同一实体只输出一次
- 文号格式识别：如"X发〔YYYY〕NN号"、"X政〔YYYY〕第NN号"等
- 如果某类实体在文中未出现，对应列表留空
- 只输出 JSON，不要输出其他内容{extra_rules}"""


# ── Scene-aware prompt builder ──────────────────────────────────────────────


def build_scene_system_prompt(scene_type: str = "") -> str:
    """Build the extraction system prompt based on a document scene type.

    Resolves entity/relationship types via the scene-based type sets in
    :class:`~app.core.graph_schema_loader.GraphSchema`.  If *scene_type* is
    empty or unrecognised, falls back to the default active-phases set.

    Parameters
    ----------
    scene_type:
        Document scene identifier (e.g. ``"leader_speech_city"``,
        ``"digital_gov_project"``).  Empty string → default active set.

    Returns
    -------
    str
        Fully assembled system prompt string.
    """
    schema = get_schema()

    if scene_type:
        entity_types = schema.entity_types_for_scene(scene_type)
        rel_types = schema.rel_types_for_scene(scene_type)
    else:
        entity_types = schema.entity_types
        rel_types = schema.relationship_types

    return build_system_prompt(entity_types, rel_types)
