A2X 系统设计文档

本文档包含系统整体视图。各模块详细设计见:


系统整体视图

1. 流程逻辑说明

A2X Registry 由以下模块组成,围绕核心数据结构 分类树服务注册表 协同工作:

模块 职责 状态
注册模块 (a2x_registry/register/) 服务注册/注销/查询,管理三类服务(Generic + A2A + Skill),输出 service.json
构建模块 (a2x_registry/a2x/build/) 从服务列表自动构建层次化分类树
搜索模块 (a2x_registry/a2x/search/) 基于分类树执行两阶段 LLM 递归检索
增量构建 (a2x_registry/a2x/incremental/) 将增量新服务插入已有分类树 待实现
向量基线 (a2x_registry/vector/) ChromaDB 向量检索(对比基线)
传统基线 (a2x_registry/traditional/) MCP 全上下文基线(对比基线)
后端 (a2x_registry/backend/) FastAPI,路由 + 服务编排
前端 (ui/frontend/) React + D3.js 可视化 + 管理面板(仅源码克隆,不在 pip wheel 内)

数据流

  • 注册模块管理服务生命周期 → 输出 service.json → 构建模块、向量基线、传统基线消费
  • 构建模块输出分类树(taxonomy.json + class.json)→ 搜索模块使用
  • 注册模块检测 service.json 变更 → 通过回调触发向量索引增量同步
  • 注册模块跟踪 taxonomy 状态 → 搜索模块查询前检查分类树是否可用

2. 对外调用接口

模块 输入 输出
注册 配置文件 / HTTP API / CLI service.json + taxonomy 状态
构建 service.json 分类树(taxonomy.json + class.json)
搜索 查询 + 分类树 服务列表 + 搜索统计
增量构建 新服务 + 分类树 更新后的分类树
向量基线 查询 + service.json 服务列表
传统基线 查询 + service.json 服务列表

3. 逻辑视图

graph TB
    subgraph INPUT[输入源]
        UC([user_config.json])
        AC([api_config.json])
        SK([skills/])
        CLI([CLI])
        API([HTTP API])
    end

    subgraph REG[注册模块]
        RS[RegistryService]
    end

    UC --> RS
    AC --> RS
    SK --> RS
    CLI --> RS
    API --> RS
    RS --> SJ[(service.json)]

    subgraph A2X[A2X 检索]
        BUILD[构建] --> TAX[(分类树)]
        TAX --> SEARCH[搜索]
    end

    subgraph BASELINE[对比基线]
        VEC[向量检索]
        TRAD[传统检索]
    end

    SJ --> BUILD
    SJ --> VEC
    SJ --> TRAD

    QRY([用户查询]) --> SEARCH
    QRY --> VEC
    QRY --> TRAD
    SEARCH --> RES([服务列表])
    VEC --> RES
    TRAD --> RES

    RS -.->|taxonomy 状态| SEARCH
    RS -.->|变更回调| VEC

    NEW([增量新服务]) --> INCR[增量构建]
    TAX <--> INCR

    style TAX fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
    style SJ fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
    style RS fill:#fff3e0,stroke:#ff9800
    style BUILD fill:#fff3e0,stroke:#ff9800
    style SEARCH fill:#e8f5e9,stroke:#4caf50
    style VEC fill:#e8f5e9,stroke:#4caf50
    style TRAD fill:#e8f5e9,stroke:#4caf50
    style INCR fill:#e3f2fd,stroke:#2196f3

4. 顺序图

4a. 远程使用(Web UI / HTTP API → FastAPI 后端)

sequenceDiagram
    participant U as 用户 / Web UI
    participant BE as 后端 (FastAPI)
    participant REG as RegistryService
    participant B as TaxonomyBuilder
    participant T as 分类树
    participant S as A2XSearch
    participant V as 向量索引

    Note over REG,V: 启动阶段
    BE->>REG: startup()
    REG->>REG: 加载配置 + 并行抓取 Agent Card
    REG-->>BE: service.json 就绪
    BE->>V: 向量索引初始同步

    Note over U,T: 构建阶段
    U->>BE: POST /api/datasets/{ds}/build
    BE->>B: TaxonomyBuilder.build() (后台线程)
    B->>T: 生成 taxonomy.json + class.json
    U->>BE: GET /api/datasets/{ds}/build/stream
    BE-->>U: SSE 实时日志

    Note over U,S: 搜索阶段
    U->>BE: POST /api/search
    BE->>REG: check_taxonomy_state()
    REG-->>BE: available
    BE->>S: A2XSearch.search(query)
    S->>T: 读取分类结构
    S-->>BE: 服务列表
    BE-->>U: JSON 响应

    Note over U,REG: 注册变更
    U->>BE: POST /api/datasets/{ds}/services/generic
    BE->>REG: register_generic(req)
    REG->>REG: 更新 _entries → 写 api_config.json → 写 service.json
    REG-->>V: 变更回调 → 增量同步
    REG->>REG: taxonomy → STALE
    BE-->>U: RegisterResponse
    Note right of REG: 需重新 build 后<br/>A2X 搜索才可用

4b. 本地使用(CLI → 直接调用 Python 接口)

sequenceDiagram
    participant U as 用户终端
    participant CLI as __main__.py
    participant REG as RegistryService
    participant ST as RegistryStore
    participant FS as 文件系统

    Note over CLI,FS: 每次 CLI 调用都经历:解析参数 → startup → 执行命令

    rect rgb(232, 234, 246)
        Note over CLI,FS: 注册服务
        U->>CLI: python -m a2x_registry.register register-generic ds --name N --desc D
        CLI->>REG: RegistryService(database_dir)
        CLI->>REG: startup()
        REG->>ST: load_user_config + load_api_config + load_skills
        ST->>FS: 读取配置文件
        REG->>REG: 合并 + 并行抓取 Agent Card URL
        CLI->>REG: register_generic(req)
        REG->>REG: 锁内更新 _entries
        REG->>ST: save_api_entry()
        ST->>FS: 写 api_config.json
        REG->>ST: write_service_json()
        ST->>FS: 写 service.json
        REG-->>CLI: RegisterResponse
        CLI-->>U: 输出结果
    end

    rect rgb(200, 230, 201)
        Note over CLI,FS: 构建分类树
        U->>CLI: python -m a2x_registry.a2x.build --service-path database/ds/service.json
        Note right of CLI: 独立进程,直接读取<br/>service.json 构建分类树
        CLI->>FS: 读取 service.json
        CLI->>FS: 写 taxonomy.json + class.json + build_config.json
        CLI-->>U: 构建完成
    end

    rect rgb(255, 243, 224)
        Note over CLI,FS: 查询服务
        U->>CLI: python -m a2x_registry.register list ds --mode admin
        CLI->>REG: RegistryService(database_dir)
        CLI->>REG: startup()
        CLI->>REG: list_entries(ds)
        REG-->>CLI: List[RegistryEntry]
        CLI-->>U: 表格输出
    end

    rect rgb(255, 205, 210)
        Note over CLI,FS: 注销服务
        U->>CLI: python -m a2x_registry.register deregister ds service_id
        CLI->>REG: RegistryService(database_dir)
        CLI->>REG: startup()
        CLI->>REG: deregister(ds, service_id)
        REG->>ST: remove_api_entry()
        ST->>FS: 更新 api_config.json
        REG->>ST: write_service_json()
        ST->>FS: 更新 service.json
        REG-->>CLI: DeregisterResponse
        CLI-->>U: 输出结果
    end

5. 类图

classDiagram
    class RegistryService {
        +startup() Dict
        +register_generic(req) RegisterResponse
        +register_a2a(req) RegisterResponse
        +register_skill(dataset, zip) SkillResponse
        +deregister(dataset, id) DeregisterResponse
        +list_services(dataset) List~dict~
        +check_taxonomy_state(dataset) TaxonomyState
    }

    class TaxonomyBuilder {
        -config: AutoHierarchicalConfig
        +build(resume: str) void
    }

    class A2XSearch {
        -categories: Dict
        -classes: Dict
        -services: Dict
        +search(query) Tuple~List, SearchStats~
    }

    class VectorSearch {
        -chroma_store: ChromaStore
        +search(query, top_k) List
    }

    class TraditionalSearch {
        -services: List
        +search(query) List
    }

    class LLMClient {
        <<a2x_registry.common.llm_client>>
        +call(messages, temperature, max_tokens) LLMResponse
        +call_batch(prompts, system_prompt, max_workers) List
    }

    class IncrementalBuilder {
        <<待实现>>
        +add_service(service) List~str~
        +remove_service(service_id) bool
    }

    RegistryService ..> TaxonomyBuilder : service.json → build
    TaxonomyBuilder ..> A2XSearch : taxonomy → search
    RegistryService ..> VectorSearch : 变更回调
    TaxonomyBuilder ..> LLMClient : uses
    A2XSearch ..> LLMClient : uses
    IncrementalBuilder ..> LLMClient : uses

6. 目录结构

a2x_registry/        # pip 包根(随 wheel 发布)
├── common/          # 共享工具(models, llm_client, paths, errors, feature_flags, evaluation, naming)
├── a2x/             # A2X 分类树检索(build / search / evaluation / incremental)—— 需 [vector] extras
├── vector/          # 向量基线(ChromaDB 索引 / search / evaluation)—— 需 [vector] extras
├── traditional/     # 传统基线(全上下文 search / evaluation)—— 需 [vector] extras
├── register/        # 服务注册(generic / a2a / skill)
└── backend/         # FastAPI 后端(routers: dataset, build, search, provider)

ui/                  # 仅源码克隆可用,不在 pip wheel 内
├── launcher.py      # 集成启动器:后端 + Vite dev / 静态托管
└── frontend/        # React + Vite + Tailwind + D3.js