"""
知识库管理相关 Prompt

包含知识库管理 prompt（供 KnowHub Server 调用）。
"""

# ===== 去重相关 =====

DEDUP_RELATION_PROMPT = """你是知识库管理专家。请判断【新知识】与【相似知识列表】中每条知识的关系。

【新知识】
Task: {new_task}
Content: {new_content}

【相似知识列表】（向量召回 top-10，按相似度排序）
{existing_list}
格式: [序号] ID: xxx | Task: xxx | Content: xxx

【关系类型定义】
- duplicate: task 和 content 语义完全相同，无新增信息 → 新知识应 rejected
- subset: task语义一致，新知识的content信息完全被某条已有知识覆盖 → 新知识应 rejected
- superset: task语义一致，新知识包含某条已有知识的全部信息，且有额外内容 → 新知识应 approved
- conflict: 同一 task 下给出相互矛盾的结论 → 新知识应 approved
- complement: 描述同一 task 的不同方面，互补 → 新知识应 approved
- none: task 语义不同，或无实质关系 → 新知识应 approved，不写入 relations

【判断步骤】
第一步：逐条比较新知识的 task 与列表中每条知识的 task 语义是否一致。
- task 语义一致 = 两者描述的是同一个问题或目标（即使措辞不同）
- task 语义不同 = 描述的是不同的问题、不同的工具、不同的场景
- 如果 task 语义不同，该条关系直接判定为 none，**不再看 content**
- 只有 task 语义一致时，才进入第二步比较 content

第二步：对 task 语义一致的知识，比较 content，判断具体关系类型（duplicate/subset/superset/conflict/complement）。

**规则**：
1. 如果以上类型无法准确描述，可自定义关系类型（英文小写下划线），并自行决定 approved/rejected
2. final_decision 为 rejected 时，relations 中必须至少有一条关系说明拒绝原因（type 不能为 none）

【输出格式】（严格 JSON，不要其他内容）

示例1 - 无关知识（task 不同）：
{{
  "final_decision": "approved",
  "relations": []
}}

示例2 - 重复知识：
{{
  "final_decision": "rejected",
  "relations": [
    {{
      "old_id": "knowledge-xxx",
      "type": "duplicate",
      "reverse_type": "duplicate"
    }}
  ]
}}

示例3 - 互补知识：
{{
  "final_decision": "approved",
  "relations": [
    {{
      "old_id": "knowledge-xxx",
      "type": "complement",
      "reverse_type": "complement"
    }}
  ]
}}

"""


# ===== 工具分析相关 =====

TOOL_ANALYSIS_PROMPT = """\
分析以下知识条目，判断是否涉及"图像创作或解构任务中使用的工具"。

工具范畴（包括但不限于）：
- AI 生图平台/模型：Midjourney、Stable Diffusion、DALL-E、Flux、ComfyUI
- SD 插件/节点：ControlNet、IP-Adapter、InstantID、DWPose、DSINE
- 图像处理库：rembg、PIL/Pillow、OpenCV、scikit-image
- LoRA/checkpoint 模型、ComfyUI 自定义节点、AI 绘图辅助工具

知识条目：
task: {task}
content: {content}

要求：
- 如果涉及上述工具，提取每个工具的信息并以 JSON 格式返回。
- 如果不涉及任何工具，返回 {{"has_tools": false}}。
- 只输出 JSON，不要输出其他内容。

输出格式：
{{
  "has_tools": true,
  "tools": [
    {{
      "name": "工具名称（原名）",
      "slug": "小写英文短名，空格换下划线，如 controlnet、ip_adapter",
      "category": "image_gen | image_process | model | plugin | workflow | other",
      "version": "版本号或 null",
      "description": "一句话功能介绍",
      "usage": "核心用法",
      "scenarios": ["应用场景1", "应用场景2"],
      "input": "输入类型描述或 null",
      "output": "输出类型描述或 null",
      "source": "来源/文档链接或 null",
      "status": "未接入"
    }}
  ]
}}
"""


# ===== 检索重排序相关 =====

RERANK_PROMPT_TEMPLATE = """你是知识检索专家。根据用户查询，从候选知识中选出最相关的 {top_k} 条。

用户查询："{query}"

候选知识：
{candidates_text}

请输出最相关的 {top_k} 个知识 ID，按相关性从高到低排序，用逗号分隔。
只输出 ID，不要其他内容。"""


# ===== 知识进化相关 =====

KNOWLEDGE_EVOLVE_PROMPT_TEMPLATE = """你是一个 AI Agent 知识库管理员。请根据反馈建议，对现有的知识内容进行重写进化。

【原知识内容】:
{old_content}

【实战反馈建议】:
{feedback}

【重写要求】:
1. 融合知识：将反馈中的避坑指南、新参数或修正后的选择逻辑融入原知识，使其更具通用性和准确性。
2. 保持结构：如果原内容有特定格式（如 Markdown、代码示例等），请保持该格式。
3. 语言：简洁直接，使用中文。
4. 禁止：严禁输出任何开场白、解释语或额外的 Markdown 标题，直接返回重写后的正文。
"""


# ===== 知识瘦身相关 =====

KNOWLEDGE_SLIM_PROMPT_TEMPLATE = """你是一个 AI Agent 知识库管理员。以下是当前知识库的全部条目，请执行瘦身操作：

【任务】:
1. 识别语义高度相似或重复的知识，将它们合并为一条更精炼、更通用的知识。
2. 合并时保留 helpful 最高的那条的 ID（helpful 取各条之和）。
3. 对于独立的、无重复的知识，保持原样不动。

【当前知识库】:
{entries_text}

【输出格式要求】:
严格按以下格式输出每条知识，条目之间用 === 分隔：
ID: <保留的id>
TYPES: <逗号分隔的type列表>
HELPFUL: <合并后的helpful计数>
HARMFUL: <合并后的harmful计数>
SCORE: <评分>
TASK: <任务描述>
CONTENT: <合并后的知识内容>
===

最后输出合并报告：
REPORT: 原有 X 条，合并后 Y 条，精简了 Z 条。

禁止输出任何开场白或解释。"""


# ===== 消息提取相关 =====

MESSAGE_EXTRACT_PROMPT_TEMPLATE = """你是一个知识提取专家。请从以下 Agent 对话历史中提取有价值的知识。

【对话历史】:
{messages_text}

【提取要求】:
1. 识别对话中的关键知识点（工具使用经验、问题解决方案、最佳实践、踩坑经验等）
2. 每条知识必须包含：
   - task: 任务场景描述（在什么情况下，要完成什么目标）
   - content: 核心知识内容（具体可操作的方法、注意事项）
   - types: 知识类型（从 strategy/tool/user_profile/usecase/definition/plan 中选择）
   - score: 评分 1-5（根据知识的价值和可操作性）
3. 只提取有实际价值的知识，不要提取泛泛而谈的内容，一次就成功或比较简单的经验就不要记录了。
4. 如果没有值得提取的知识，返回空列表

【输出格式】:
严格按以下 JSON 格式输出，每条知识之间用逗号分隔：
[
  {{
    "task": "任务场景描述",
    "content": "核心知识内容",
    "types": ["strategy"],
    "score": 4
  }},
  {{
    "task": "另一个任务场景",
    "content": "另一个知识内容",
    "types": ["tool"],
    "score": 5
  }}
]

如果没有知识，输出: []

**注意**：只记录经过多次尝试、或经过用户指导才成功的知识，一次就成功或比较简单的经验就不要记录了。

禁止输出任何解释或额外文本，只输出 JSON 数组。"""


# ===== 语义路由相关（原有的，保留）=====

KNOWLEDGE_SEMANTIC_ROUTE_PROMPT_TEMPLATE = """你是一个知识检索专家。根据用户的当前任务需求，从下列原子知识元数据中挑选出最相关的最多 {routing_k} 个知识 ID。
任务需求："{query_text}"

可选知识列表：
{routing_data}

请直接输出 ID 列表，用逗号分隔（例如: knowledge-20260302-001, research-20260302-002）。若无相关项请输出 "None"。
"""
