# ════════════════════════════════════════════════════════════
# qaagent67lite — 轻量级知识问答智能体 (BM25 + Wiki)
# ════════════════════════════════════════════════════════════
#
# 适用场景: 资料少 (< 500 文档) 的领域，如财务、清洁、行政等
# 与 qaagent67lambda 的区别:
#   lambda: 4 路并行 (BM25+Vector+Graph+Wiki) → 重量级，需要 embedding 服务
#   lite:   2 路融合 (BM25+Wiki) → 轻量级，纯 CPU，无外部依赖
#
# Lambda:
#   λ = Classify(q)
#       >> Par(BM25(q), WikiRead(q))
#       >> SimpleMerge(results)
#       >> LLM(context, question)
#
# 用法:
#   python3 -m agentpaas agent create --name lite-qa \
#     --config agentexample/qaagent67lite/agent-config.yml
#   python3 -m agentpaas chat lite-qa
#
# 部署:
#   1. 复制本目录到目标机器
#   2. 创建 instance.yml 指定 knowledge.baseDir
#   3. 将原始文件放入 {baseDir}/raw/
#   4. 运行 python scripts/setup.py  (一键: 提取→索引→Wiki编译)
#   5. agentpaas agent create + chat

agentId: qaagent67lite-v1
name: lite-qa
description: >
  轻量级知识问答智能体。BM25 关键词检索 + LLM Wiki 编译知识，
  无需向量数据库或 embedding 服务。适合小规模文档集 (< 500 个文件)。

type: react

model:
  provider: claude-code
  name: sonnet
  temperature: 0.3
  maxTokens: 4096
  fallback:
    - anthropic/claude-sonnet-4-20250514
    - ollama/qwen2.5:32b
    - dashscope/qwen-max

systemPrompt: |
  你是一个精准的领域知识问答助手 (lite-qa)。

  ## 工作原理
  你有两种知识来源:
  1. **BM25 检索** — 从原始文档中按关键词搜索相关片段
  2. **Wiki 编译知识** — LLM 预先编译的结构化 wiki 页面

  ## 工具

  **文档管理**:
  - IngestFiles: 导入文件到知识库 (提取文本 + 建 BM25 索引)
  - WikiIngest: 将文件编译到 Wiki (LLM 理解 → 写 wiki 页面)
  - ListKnowledge: 列出已索引的文件
  - WikiStatus: 查看 Wiki 统计和健康评分

  **查询**:
  - QueryKnowledge: BM25 关键词检索 + LLM 回答
  - WikiQuery: 从 Wiki 编译知识回答 (更精准)

  **维护**:
  - WikiLint: 检查 Wiki 健康 (矛盾/孤页/过期)
  - WikiGrow: 主动生长 Wiki (发现缺失概念)

  **辅助**:
  - ReadFile, ListFiles, SearchContent, Bash

  ## 工作流程
  - 用户问知识问题 → 先 WikiQuery 查编译知识 → 若不够再 QueryKnowledge 补充
  - 用户要导入文件 → IngestFiles (BM25索引) + WikiIngest (Wiki编译) 都做
  - 用户要维护 → WikiLint + WikiGrow

  ## 回答规则
  1. 只基于检索到的内容回答，不编造
  2. 每个要点标注来源
  3. 存在矛盾时说明
  4. 无相关信息时明确告知

react:
  maxSteps: 20
  observationEnabled: true
  toolTimeout: 120
  thinkTimeout: 300
  verbose: true

memory:
  enabled: true
  strategy: local
  size: 50
  ttl: 14400

mcp:
  localTools:
    # 文档管理
    - IngestFiles
    - ListKnowledge
    - RemoveKnowledge
    # Wiki 知识编译 (v2)
    - WikiIngest
    - WikiQuery
    - WikiLint
    - WikiSearch
    - WikiStatus
    - WikiGrow
    # BM25 检索
    - QueryKnowledge
    # 辅助
    - ReadFile
    - ListFiles
    - SearchContent
    - Bash
    # 完成
    - terminate
  policy:
    mode: auto

guard:
  dangerousCommandBlock: true
  highRiskConfirmation: false
  maxOutputLength: 50000
  retry: 0
  fallback: last

persona:
  name: lite-qa
  style: helpful-precise
  template: qaagent

runtime:
  engine: cek
  costBudget: 0.30
  maxSteps: 10000

# ═══ 知识库配置 ═══
# 部署时用 instance.yml 覆盖这些路径
knowledge:
  baseDir: ./knowledge
  rawDir: ./knowledge/raw
  processedDir: ./knowledge/processed
  indexFile: ./knowledge/rag_index.json
  keywordFile: ./knowledge/rag_index.keywords.json

# ═══ RAG 配置 (仅 BM25，无 Vector) ═══
rag:
  enabled: true
  chunkSize: 512
  chunkOverlap: 64
  chunkSeparator: "\n\n"
  topK: 8

# ═══ 检索配置 (Lite: BM25 + Wiki only) ═══
retrieval:
  mode: lite

  skills:
    bm25:
      enabled: true
      topK: 10
    embedding:
      enabled: false      # ← 关掉 Vector
    rerank:
      enabled: false      # ← 关掉 Rerank
    graph:
      enabled: false      # ← 关掉 Graph
    wiki:
      enabled: true

  # 简化的 weight profiles (只有 bm25 和 wiki)
  weights:
    fact:      {bm25: 1.0, wiki: 0.3}
    compare:   {bm25: 0.5, wiki: 0.9}
    process:   {bm25: 0.7, wiki: 0.8}
    person:    {bm25: 0.9, wiki: 0.5}
    temporal:  {bm25: 1.0, wiki: 0.2}
    default:   {bm25: 0.8, wiki: 0.6}

  orchestration:
    classifier:
      fastClassify: true
      llmFallback: false    # lite 模式不用 LLM 分类，省 token
    rrfK: 60
    parallel: false         # 只有 2 路，不需要并行

# ═══ Wiki 配置 ═══
wiki:
  dir: ./wiki
  relationsFile: ./wiki/relations.json
