# DataMeta 管理智能体技术文档

## 1. 概述

DataMeta 管理智能体是一个基于 n8n 构建的智能对话系统，用于管理元数据（DataMeta）和数据标签（DataLabel）的增删改查操作。该智能体采用**主 Agent + 子 Agent**的架构设计，通过自然语言交互实现元数据的全生命周期管理。

### 1.1 基本信息

| 属性       | 值                                                     |
| -------- | ----------------------------------------------------- |
| 主工作流名称   | DataMeta管理智能体                                         |
| 主工作流 ID  | `74AYpVBKwYt8fhjx7rMzc`                               |
| 子工作流名称   | 新增元数据子Agent                                           |
| 子工作流 ID  | `Uv2FXcr80GtxBGxv`                                    |
| AI 模型    | DeepSeek                                              |
| API 基础地址 | `https://company.citupro.com:18183`                   |
| 访问地址     | `https://n8n.citupro.com/webhook/datameta-agent/chat` |

### 1.2 功能清单

| 功能      | 描述            | 处理节点                         |
| ------- | ------------- | ---------------------------- |
| 新增元数据   | 多轮对话引导收集信息并创建 | 子工作流 Add Metadata Agent      |
| 查询元数据列表 | 分页查询，支持筛选     | CRUD Agent → list_datameta   |
| 获取元数据详情 | 按 ID 查询详细信息   | CRUD Agent → get_datameta    |
| 更新元数据   | 修改现有元数据字段     | CRUD Agent → update_datameta |
| 删除元数据   | 按 ID 删除（需确认）  | CRUD Agent → delete_datameta |
| 查看标签列表  | 获取可用标签        | CRUD Agent → list_labels     |

---

## 2. 系统架构

### 2.1 整体架构图

![221782da-259e-444c-a9fc-6815bf7ee507](file:///C:/Users/Administrator/Pictures/Typedown/221782da-259e-444c-a9fc-6815bf7ee507.png)

### 2.2 意图分类与路由流程

```mermaid
flowchart LR
    subgraph Input
        direction LR
        UI["💬 用户消息"]
    end

    subgraph Classification
        direction LR
        IC["🧠 Intent Classifier"]
        MEM["📝 历史对话记忆"]
    end

    subgraph Routing
        direction LR
        SW{"🔀 Switch"}
    end

    subgraph Outputs
        direction LR
        O1["📤 新增元数据子流程"]
        O2["🤖 CRUD Agent"]
        O3["🤖 默认CRUD Agent"]
    end

    UI --> IC
    MEM --> IC
    IC -->|意图标签| SW
    SW -->|包含 add_metadata| O1
    SW -->|包含 other_operations| O2
    SW -->|其他/默认| O3

    style Input fill:#e3f2fd
    style Classification fill:#f3e5f5
    style Routing fill:#fff8e1
    style Outputs fill:#e8f5e9
```

### 2.3 新增元数据多轮对话流程

```mermaid
sequenceDiagram
    participant U as 👤 用户
    participant M as 🧠 主Agent
    participant S as 🤖 子Agent
    participant API as 🌐 后端API

    U->>M: "我想新增一个元数据"
    M->>M: Intent Classifier 识别为 add_metadata
    M->>S: 调用子工作流 (user_message, session_id)

    S->>U: "请输入元数据的中文名称"
    U->>M: "订单状态"
    M->>S: 继续对话流程

    S->>API: translate_name(node_name: "订单状态")
    API-->>S: "order_status"
    S->>U: "英文名称已翻译为: order_status，请选择数据类型"

    U->>M: "varchar"
    M->>S: 继续对话流程
    S->>U: "是否启用该元数据？"

    U->>M: "启用"
    M->>S: 继续对话流程
    S->>U: "请选择分类: 系统类/应用类/DataOps"

    U->>M: "应用类"
    M->>S: 继续对话流程

    Note over S: 继续收集: 归属、描述、标签...

    S->>U: "请确认以上信息"
    U->>M: "确认"
    M->>S: 提交创建

    S->>API: add_datameta(name_zh, name_en, data_type, ...)
    API-->>S: 创建成功，ID: 2325
    S->>U: "✅ 元数据创建成功！ID: 2325"
```

---

## 3. 节点配置详解

### 3.1 主工作流节点

#### 3.1.1 Chat Trigger

| 配置项        | 值                                      |
| ---------- | -------------------------------------- |
| 节点类型       | `@n8n/n8n-nodes-langchain.chatTrigger` |
| 版本         | 1.1                                    |
| Webhook ID | `datameta-agent`                       |
| 公开访问       | `true`                                 |

**UI 配置：**

```json
{
  "title": "DataMeta管理助手",
  "subtitle": "我可以帮您管理元数据，支持查询、新增、更新、删除和标签管理",
  "inputPlaceholder": "请输入您的需求，例如：查看所有元数据"
}
```

**输出数据结构：**

```json
{
  "chatInput": "用户输入的消息",
  "sessionId": "会话唯一标识"
}
```

#### 3.1.2 Intent Classifier (意图分类器)

| 配置项    | 值                                |
| ------ | -------------------------------- |
| 节点类型   | `@n8n/n8n-nodes-langchain.agent` |
| 版本     | 1.7                              |
| 最大迭代次数 | 3                                |

**输入配置：**

```
promptType: define
text: ={{ $json.chatInput }}
```

**系统提示语 (System Message)：**

```
你是一个意图分类器。分析用户的输入，判断用户的意图类型。

## 重要：多轮对话上下文

你有记忆功能，可以看到之前的对话历史。如果用户之前表达了新增元数据的意图，并且当前正在进行新增元数据的多轮对话流程中（例如：用户正在回答中文名、英文名、数据类型、状态、分类等问题），那么当前输入应该继续被分类为 add_metadata。

**判断是否在新增元数据流程中的依据：**
- 之前的对话中用户说过"新增"、"添加"、"创建"元数据
- 系统正在询问元数据的各个字段（中文名、英文名、数据类型、状态、分类、归属、描述、标签）
- 用户的当前输入是在回答这些字段的值
- **系统展示了元数据信息汇总并询问确认**
- **用户正在回应确认请求（无论是确认、否认还是修改）**

**特别注意：确认阶段的用户回复**
如果对话历史中系统最近展示了"元数据信息汇总"并询问"请确认以上信息是否正确"，那么用户的任何回复都应该分类为 add_metadata，包括：
- 确认类："确认"、"正确"、"没问题"、"可以"
- 否认类："不正确"、"有问题"、"不对"、"错了"
- 修改类："修改xxx"、"把xxx改成xxx"、"xxx不对"

## 意图分类

请将用户意图分类为以下类型之一：

1. **add_metadata** - 用户想要新增、添加、创建元数据，或者正在新增元数据的多轮对话流程中
   - 关键词：新增、添加、创建、新建、录入
   - 或者：用户正在回答新增元数据流程中的问题
   - 或者：用户正在确认/修改元数据信息汇总

2. **other_operations** - 其他所有操作
   - 查询、列出、搜索元数据
   - 查看元数据详情
   - 更新、修改已存在的元数据（不是新增流程中的修改）
   - 删除元数据
   - 查看标签
   - 其他任何操作

## 输出格式

你必须严格按照以下JSON格式输出，不要输出任何其他内容：

{"intent": "add_metadata"}

或

{"intent": "other_operations"}

只输出JSON，不要有任何解释或其他文字。
```

#### 3.1.3 Intent Switch (意图路由)

| 配置项  | 值                       |
| ---- | ----------------------- |
| 节点类型 | `n8n-nodes-base.switch` |
| 版本   | 3.4                     |
| 模式   | rules                   |

**路由规则：**

| 输出端口 | 名称    | 条件                                         | 目标节点                          |
| ---- | ----- | ------------------------------------------ | ----------------------------- |
| 0    | 新增元数据 | `$json.output` contains "add_metadata"     | Execute Add Metadata Workflow |
| 1    | 其他操作  | `$json.output` contains "other_operations" | CRUD Agent                    |
| 2    | 默认    | fallback                                   | CRUD Agent                    |

**完整配置：**

```json
{
  "mode": "rules",
  "rules": {
    "values": [
      {
        "conditions": {
          "conditions": [
            {
              "leftValue": "={{ $json.output }}",
              "rightValue": "add_metadata",
              "operator": { "type": "string", "operation": "contains" }
            }
          ],
          "combinator": "and"
        },
        "renameOutput": true,
        "outputKey": "新增元数据"
      },
      {
        "conditions": {
          "conditions": [
            {
              "leftValue": "={{ $json.output }}",
              "rightValue": "other_operations",
              "operator": { "type": "string", "operation": "contains" }
            }
          ],
          "combinator": "and"
        },
        "renameOutput": true,
        "outputKey": "其他操作"
      }
    ]
  },
  "options": {
    "fallbackOutput": "extra",
    "renameFallbackOutput": "默认"
  }
}
```

#### 3.1.4 Execute Add Metadata Workflow (执行子工作流)

| 配置项     | 值                                |
| ------- | -------------------------------- |
| 节点类型    | `n8n-nodes-base.executeWorkflow` |
| 版本      | 1.3                              |
| 子工作流 ID | `Uv2FXcr80GtxBGxv`               |
| 等待完成    | `true`                           |

**参数传递配置：**

```json
{
  "workflowInputs": {
    "mappingMode": "defineBelow",
    "value": {
      "user_message": "={{ $('Chat Trigger').item.json.chatInput }}",
      "session_id": "={{ $('Chat Trigger').item.json.sessionId }}"
    }
  }
}
```

#### 3.1.5 Prepare CRUD Input (准备 CRUD 输入)

| 配置项   | 值                    |
| ----- | -------------------- |
| 节点类型  | `n8n-nodes-base.set` |
| 版本    | 3.4                  |
| 节点 ID | `prepare-crud-input` |

**用途：** 在 Intent Switch 路由到 CRUD Agent 之前，从 Chat Trigger 提取原始用户输入和会话 ID，确保 CRUD Agent 收到的是用户的实际请求，而不是 Intent Classifier 的输出。

**配置：**

```json
{
  "mode": "manual",
  "duplicateItem": false,
  "assignments": {
    "assignments": [
      {
        "id": "chatInput",
        "name": "chatInput",
        "value": "={{ $('Chat Trigger').item.json.chatInput }}",
        "type": "string"
      },
      {
        "id": "sessionId",
        "name": "sessionId",
        "value": "={{ $('Chat Trigger').item.json.sessionId }}",
        "type": "string"
      }
    ]
  },
  "options": {}
}
```

> **为什么需要这个节点？**
> 
> Intent Switch 接收的输入是 Intent Classifier 的输出（如 `{"intent": "other_operations"}`）。如果直接将这个输出传递给 CRUD Agent，CRUD Agent 会收到意图分类结果而不是用户的实际请求，导致无法正确执行查询、更新等操作。
> 
> 通过 `Prepare CRUD Input` 节点，我们显式地从 Chat Trigger 获取原始的 `chatInput` 和 `sessionId`，确保 CRUD Agent 总是收到正确的用户消息。

#### 3.1.6 CRUD Agent

| 配置项    | 值                                |
| ------ | -------------------------------- |
| 节点类型   | `@n8n/n8n-nodes-langchain.agent` |
| 版本     | 1.7                              |
| 最大迭代次数 | 25                               |

**输入配置：**

```
promptType: define
text: ={{ $json.chatInput }}
```

> **注意：** CRUD Agent 的 `text` 参数从 `Prepare CRUD Input` 节点获取 `$json.chatInput`，而不是直接从 Chat Trigger 获取。这是因为 CRUD Agent 的上游节点是 `Prepare CRUD Input`。

**系统提示语 (System Message)：**

```
你是一个元数据管理智能体，负责帮助用户管理DataMeta（元数据）和DataLabel（数据标签）。

## 你的职责

根据用户的意图，选择合适的工具来完成任务：

### 1. 查询元数据列表
- 当用户想要**查看、列出、搜索**元数据时
- 使用 `list_datameta` 工具
- 可以按关键词、分类等条件筛选

### 2. 获取元数据详情
- 当用户想要**查看某个具体元数据的详细信息**时
- 使用 `get_datameta` 工具
- 需要提供元数据ID

### 3. 更新元数据
- 当用户想要**修改、更新**现有元数据时
- 使用 `update_datameta` 工具
- 需要提供元数据ID和要修改的字段

### 4. 删除元数据
- 当用户想要**删除**元数据时
- 使用 `delete_datameta` 工具
- 需要提供元数据ID
- 删除前请确认用户意图

### 5. 查看标签列表
- 当用户想要**查看可用的标签**时
- 使用 `list_labels` 工具

## 回复要求

- 请用中文回复用户
- 清晰地展示操作结果
- 如果操作失败，解释原因并提供建议
```

### 3.2 子工作流节点

#### 3.2.1 Execute Workflow Trigger

| 配置项  | 值                                       |
| ---- | --------------------------------------- |
| 节点类型 | `n8n-nodes-base.executeWorkflowTrigger` |
| 版本   | 1.1                                     |

**输入参数定义：**

```json
{
  "inputSource": "workflowInputs",
  "workflowInputs": {
    "values": [
      { "name": "user_message", "type": "string" },
      { "name": "session_id", "type": "string" }
    ]
  }
}
```

#### 3.2.2 Add Metadata Agent

| 配置项    | 值                                |
| ------ | -------------------------------- |
| 节点类型   | `@n8n/n8n-nodes-langchain.agent` |
| 版本     | 1.7                              |
| 最大迭代次数 | 25                               |

**输入配置：**

```
promptType: define
text: ={{ $json.user_message }}
```

**系统提示语 (System Message)：**

```
你是一个专门负责新增元数据的助手。你的任务是通过多轮对话收集用户输入的元数据信息，然后创建新的元数据。

## 信息收集流程

按以下顺序依次收集信息：

### 步骤1：收集中文名称（必填）
- 询问用户："请输入元数据的中文名称"
- 记录 name_zh

### 步骤2：自动翻译英文名称并等待确认
- 获取中文名称后，立即调用 translate_name 工具进行翻译
- 展示翻译结果给用户："英文名称已自动翻译为: xxx"
- **重要：必须等待用户确认或提供修改后的英文名**
- 询问用户："请确认英文名称是否正确，或输入您希望使用的英文名称"
- 用户可能的回复：
  - "确认"、"好的"、"可以"、"没问题" → 使用翻译结果
  - 提供新的英文名称 → 使用用户提供的名称
- 确认后记录 name_en，然后才进入步骤3

### 步骤3：收集数据类型（必填）
- 询问用户："请选择数据类型，常见类型有: varchar, integer, string, number, boolean, date"
- **等待用户输入**
- 记录 data_type

### 步骤4：收集使用状态（可选）
- 询问用户："是否启用该元数据？请回复"启用"或"禁用"（默认启用）"
- **等待用户回复**
- 用户可能的回复：
  - "启用"、"是"、"默认"、"确认" → status = true
  - "禁用"、"否" → status = false
- 确认后记录 status

### 步骤5：选择分类（可选）
- 询问用户："请选择元数据分类：系统类 / 应用类 / DataOps，或输入"跳过""
- **等待用户回复**
- 用户可能的回复：
  - "系统类"、"应用类"、"DataOps" → 记录对应分类
  - "跳过"、"无"、"不选" → 留空
- 确认后记录 category

### 步骤6：输入制作单位/归属部门（可选）
- 询问用户："请输入制作单位/归属部门，或输入"跳过""
- **等待用户回复**
- 用户可能的回复：
  - 具体部门名称 → 记录部门名称
  - "跳过"、"无"、"不填" → 留空
- 确认后记录 affiliation

### 步骤7：输入描述（可选）
- 询问用户："请输入元数据描述，或输入"跳过""
- **等待用户回复**
- 用户可能的回复：
  - 具体描述内容 → 记录描述
  - "跳过"、"无"、"不填" → 留空
- 确认后记录 describe

### 步骤8：选择标签（可选）
- 先调用 list_labels 获取可用标签列表
- 展示标签选项给用户（显示ID和名称）
- 询问用户："请选择要添加的标签（输入标签ID，多个用逗号分隔），或输入"跳过""
- **等待用户回复**
- 用户可能的回复：
  - 标签ID（如 "51" 或 "51,59,82"） → 记录标签ID数组
  - "跳过"、"无"、"不选" → 留空
- 确认后记录 tag

### 步骤9：确认并提交
- 展示所有收集到的信息汇总给用户确认
- **等待用户确认**
- **用户回复处理：**
  - 如果用户回复"确认"、"正确"、"没问题"、"可以"、"提交" → 调用 add_datameta 工具提交
  - 如果用户回复"不正确"、"有问题"、"不对"、"需要修改" → 询问用户"请告诉我您要修改哪个字段？"
  - 如果用户指定了要修改的字段（如"修改中文名"、"把数据类型改成integer"） → 直接询问该字段的新值
  - 修改完成后，重新展示更新后的信息汇总，再次询问确认

### 步骤10：处理返回结果

**情况1：完全匹配（已存在）**
- 如果返回信息包含"已存在"或"完全匹配"
- 从返回信息中提取已存在的元数据ID
- 调用 get_datameta 获取详情并展示给用户
- 告知用户："该元数据已存在，无需重复创建"

**情况2：疑似重复**
- 如果返回信息包含"疑似重复"
- 展示新创建的元数据信息
- 提示用户："元数据已创建成功，但发现疑似重复的元数据，已创建审核记录。"
- 询问用户："是否需要前往审核页面处理？"
- 如果用户需要审核，提供链接：https://company.citupro.com:18183/dataReview

**情况3：成功创建**
- 展示新创建的元数据完整信息
- 告知用户创建成功

## 回复要求
- 请用中文回复用户
- 在多轮对话中记住用户已提供的所有字段，不要重复询问
- 如果用户一次性提供了多个字段，直接记录并继续下一步
```

---

## 4. Simple Memory 配置

### 4.1 主工作流 Memory

#### Simple Memory Intent (意图分类器记忆)

| 配置项           | 值                                             |
| ------------- | --------------------------------------------- |
| 节点类型          | `@n8n/n8n-nodes-langchain.memoryBufferWindow` |
| 版本            | 1.3                                           |
| 上下文窗口长度       | 20                                            |
| Session ID 类型 | customKey                                     |
| Session Key   | `=intent-{{ $json.sessionId }}`               |

**用途：** 记住用户的对话历史，以便 Intent Classifier 能够识别用户是否正在进行新增元数据的多轮对话流程。

**关键配置：**

```json
{
  "contextWindowLength": 20,
  "sessionIdType": "customKey",
  "sessionKey": "=intent-{{ $json.sessionId }}"
}
```

> **重要**：Session Key 使用 `intent-` 前缀以区分不同 Agent 的记忆空间。

#### Simple Memory CRUD (CRUD Agent 记忆)

| 配置项           | 值                                             |
| ------------- | --------------------------------------------- |
| 节点类型          | `@n8n/n8n-nodes-langchain.memoryBufferWindow` |
| 版本            | 1.3                                           |
| 上下文窗口长度       | 20                                            |
| Session ID 类型 | customKey                                     |
| Session Key   | `=crud-{{ $json.sessionId }}`                 |

**用途：** 记住用户在执行查询、更新、删除等操作时的上下文。

**关键配置：**

```json
{
  "contextWindowLength": 20,
  "sessionIdType": "customKey",
  "sessionKey": "=crud-{{ $json.sessionId }}"
}
```

> **重要：Memory 隔离机制**
> 
> `Simple Memory Intent` 和 `Simple Memory CRUD` 必须使用不同的 sessionKey 前缀（`intent-` 和 `crud-`），以确保两个 Agent 的对话记忆完全隔离。
> 
> **问题背景：** 如果两个 Memory 使用相同的 sessionKey，Intent Classifier 输出的意图分类结果（如 `{"intent": "other_operations"}`）会被存入记忆。当 CRUD Agent 读取记忆时，会读到这个不相关的意图分类结果，导致 CRUD Agent 无法正确理解用户的实际请求。
> 
> **解决方案：** 通过添加前缀（`intent-` 或 `crud-`），使得即使在同一个 session 中，两个 Agent 的记忆也完全独立，互不干扰。

### 4.2 子工作流 Memory

#### Simple Memory Sub (子 Agent 记忆)

| 配置项           | 值                                             |
| ------------- | --------------------------------------------- |
| 节点类型          | `@n8n/n8n-nodes-langchain.memoryBufferWindow` |
| 版本            | 1.3                                           |
| 上下文窗口长度       | 20                                            |
| Session ID 类型 | customKey                                     |
| Session Key   | `={{ $json.session_id }}`                     |

**用途：** 使用从主工作流传递的 `session_id` 作为会话标识，保持多轮对话的上下文连续性。

**关键配置：**

```json
{
  "contextWindowLength": 20,
  "sessionIdType": "customKey",
  "sessionKey": "={{ $json.session_id }}"
}
```

---

## 5. HTTP 工具配置

### 5.1 主工作流工具

#### list_datameta (查询元数据列表)

| 配置项          | 值                                                      |
| ------------ | ------------------------------------------------------ |
| 方法           | POST                                                   |
| URL          | `https://company.citupro.com:18183/api/meta/node/list` |
| Content-Type | application/json                                       |

**工具描述：**

```
查询元数据列表。可选参数：current(页码,默认1), size(每页数量,默认10), name_zh(中文名筛选), name_en(英文名筛选), category(分类筛选)
```

**请求体配置 (JSON 表达式)：**

```javascript
={{ JSON.stringify({ 
  current: $fromAI('current', '页码', 'number') || 1, 
  size: $fromAI('size', '每页数量', 'number') || 10, 
  name_zh: $fromAI('name_zh', '中文名筛选', 'string') || '', 
  name_en: $fromAI('name_en', '英文名筛选', 'string') || '', 
  category: $fromAI('category', '分类筛选', 'string') || '' 
}) }}
```

#### get_datameta (获取元数据详情)

| 配置项          | 值                                                      |
| ------------ | ------------------------------------------------------ |
| 方法           | POST                                                   |
| URL          | `https://company.citupro.com:18183/api/meta/node/edit` |
| Content-Type | application/json                                       |

**工具描述：**

```
Get metadata details by ID. Required: id (metadata ID as number).
```

**请求体参数：**
| 参数名 | 说明 |
|--------|------|
| id | 元数据 ID |

#### update_datameta (更新元数据)

| 配置项          | 值                                                        |
| ------------ | -------------------------------------------------------- |
| 方法           | POST                                                     |
| URL          | `https://company.citupro.com:18183/api/meta/node/update` |
| Content-Type | application/json                                         |

**工具描述：**

```
Update existing metadata. Required: id (metadata ID as number). Optional: data_type (new data type like varchar, string, integer).
```

**请求体参数：**
| 参数名 | 说明 |
|--------|------|
| id | 元数据 ID (必填) |
| data_type | 新的数据类型 (可选) |

#### delete_datameta (删除元数据)

| 配置项          | 值                                                        |
| ------------ | -------------------------------------------------------- |
| 方法           | POST                                                     |
| URL          | `https://company.citupro.com:18183/api/meta/node/delete` |
| Content-Type | application/json                                         |

**工具描述：**

```
Delete metadata by ID. Required: id (metadata ID as number to delete).
```

**请求体参数：**
| 参数名 | 说明 |
|--------|------|
| id | 要删除的元数据 ID |

#### list_labels (查询标签列表)

| 配置项          | 值                                                           |
| ------------ | ----------------------------------------------------------- |
| 方法           | POST                                                        |
| URL          | `https://company.citupro.com:18183/api/interface/labellist` |
| Content-Type | application/json                                            |

**工具描述：**

```
Query available data labels list. Returns label ID, Chinese name, English name.
```

**请求体参数 (固定值)：**
| 参数名 | 值 |
|--------|-----|
| current | 1 |
| size | 10 |

### 5.2 子工作流工具

#### translate_name (翻译名称)

| 配置项          | 值                                                        |
| ------------ | -------------------------------------------------------- |
| 方法           | POST                                                     |
| URL          | `https://company.citupro.com:18183/api/system/translate` |
| Content-Type | application/json                                         |

**工具描述：**

```
Translate Chinese name to English name. Required: node_name (Chinese name to translate). Returns translated English name.
```

**请求体参数：**
| 参数名 | 说明 |
|--------|------|
| node_name | 要翻译的中文名称 |

#### add_datameta (新增元数据)

| 配置项          | 值                                                     |
| ------------ | ----------------------------------------------------- |
| 方法           | POST                                                  |
| URL          | `https://company.citupro.com:18183/api/meta/node/add` |
| Content-Type | application/json                                      |

**工具描述：**

```
Add new metadata. Required: name_zh (Chinese name), data_type. Optional: name_en, status (default true), category (one of: 系统类, 应用类, DataOps), affiliation, describe, tag (array of tag IDs).
```

**请求体参数：**
| 参数名 | 必填 | 说明 |
|--------|------|------|
| name_zh | ✅ | 中文名称 |
| data_type | ✅ | 数据类型 |
| name_en | ❌ | 英文名称 |
| status | ❌ | 启用状态 (默认 true) |
| category | ❌ | 分类 (系统类/应用类/DataOps) |
| affiliation | ❌ | 归属部门 |
| describe | ❌ | 描述 |
| tag | ❌ | 标签 ID 数组 |

#### list_labels (查询标签列表 - 子工作流)

| 配置项          | 值                                                           |
| ------------ | ----------------------------------------------------------- |
| 方法           | POST                                                        |
| URL          | `https://company.citupro.com:18183/api/interface/labellist` |
| Content-Type | application/json                                            |

**工具描述：**

```
Query available labels list filtered by DataOps category. Returns label ID, Chinese name, English name.
```

**请求体参数 (固定值)：**
| 参数名 | 值 | 说明 |
|--------|-----|------|
| current | 1 | 页码 |
| size | 50 | 每页数量 |
| category_filter | DataOps | 分类过滤，只返回 DataOps 类别的标签 |

> **说明**：子工作流中的 `list_labels` 工具添加了 `category_filter` 参数，只返回 DataOps 分类下的标签，便于用户在新增元数据时选择相关标签。

---

## 6. DeepSeek 模型配置

### 6.1 模型实例

| 实例名称                       | 用途                      | Temperature |
| -------------------------- | ----------------------- | ----------- |
| DeepSeek Chat Model        | Intent Classifier 意图分类  | 0.3         |
| DeepSeek Chat Model CRUD   | CRUD Agent 操作执行         | 0.7         |
| DeepSeek Chat Model (子工作流) | Add Metadata Agent 新增流程 | 0.7         |

### 6.2 凭证配置

```json
{
  "credentials": {
    "deepSeekApi": {
      "id": "N8PgEL20Nk88KXMp",
      "name": "DeepSeek account"
    }
  }
}
```

---

## 7. 工作流设置

### 7.1 主工作流设置

```json
{
  "executionOrder": "v1",
  "binaryMode": "separate",
  "availableInMCP": false,
  "callerPolicy": "workflowsFromSameOwner"
}
```

### 7.2 子工作流设置

```json
{
  "executionOrder": "v1",
  "saveDataErrorExecution": "all",
  "saveDataSuccessExecution": "all",
  "saveManualExecutions": true,
  "saveExecutionProgress": true,
  "callerPolicy": "any",
  "availableInMCP": false
}
```

**关键配置说明：**

- `callerPolicy: "any"` - 允许任何工作流调用此子工作流

---

## 8. 连接关系图

### 8.1 主工作流连接

```mermaid
graph LR
    subgraph Trigger["触发层"]
        CT["Chat Trigger"]
    end

    subgraph Intent["意图识别层"]
        IC["Intent Classifier"]
        DSM1["DeepSeek Model"]
        SMI["Simple Memory Intent"]
    end

    subgraph Routing["路由层"]
        SW["Intent Switch"]
    end

    subgraph DataPrep["数据准备层"]
        PCI["Prepare CRUD Input"]
    end

    subgraph Execution["执行层"]
        EW["Execute Add Metadata Workflow"]
        CA["CRUD Agent"]
        DSM2["DeepSeek Model CRUD"]
        SMC["Simple Memory CRUD"]
    end

    subgraph Tools["工具层"]
        T1["list_datameta"]
        T2["get_datameta"]
        T3["update_datameta"]
        T4["delete_datameta"]
        T5["list_labels"]
    end

    CT -->|main| IC
    DSM1 -->|ai_languageModel| IC
    SMI -->|ai_memory| IC
    IC -->|main| SW
    SW -->|"output[0]"| EW
    SW -->|"output[1]"| PCI
    SW -->|"output[2]"| PCI
    PCI -->|main| CA
    DSM2 -->|ai_languageModel| CA
    SMC -->|ai_memory| CA
    T1 -->|ai_tool| CA
    T2 -->|ai_tool| CA
    T3 -->|ai_tool| CA
    T4 -->|ai_tool| CA
    T5 -->|ai_tool| CA
```

### 8.2 子工作流连接

```mermaid
graph LR
    subgraph Trigger["触发层"]
        EWT["Execute Workflow Trigger"]
    end

    subgraph Agent["Agent 层"]
        AMA["Add Metadata Agent"]
        DSM["DeepSeek Model"]
        SMS["Simple Memory Sub"]
    end

    subgraph Tools["工具层"]
        ST1["translate_name"]
        ST2["add_datameta"]
        ST3["list_labels"]
        ST4["get_datameta"]
    end

    EWT -->|main| AMA
    DSM -->|ai_languageModel| AMA
    SMS -->|ai_memory| AMA
    ST1 -->|ai_tool| AMA
    ST2 -->|ai_tool| AMA
    ST3 -->|ai_tool| AMA
    ST4 -->|ai_tool| AMA
```

---

## 9. API 端点汇总

| 端点                         | 方法   | 用途      |
| -------------------------- | ---- | ------- |
| `/api/meta/node/list`      | POST | 查询元数据列表 |
| `/api/meta/node/edit`      | POST | 获取元数据详情 |
| `/api/meta/node/add`       | POST | 新增元数据   |
| `/api/meta/node/update`    | POST | 更新元数据   |
| `/api/meta/node/delete`    | POST | 删除元数据   |
| `/api/interface/labellist` | POST | 获取标签列表  |
| `/api/system/translate`    | POST | 翻译中文名称  |

---

## 10. 测试验证

### 10.1 功能测试结果

| 测试场景  | 输入示例                    | 期望路由         | 测试结果 |
| ----- | ----------------------- | ------------ | ---- |
| 新增元数据 | "我想新增一个元数据"             | → 子工作流       | ✅ 通过 |
| 查询列表  | "查看所有元数据"               | → CRUD Agent | ✅ 通过 |
| 查看详情  | "查看ID为2158的元数据"         | → CRUD Agent | ✅ 通过 |
| 更新元数据 | "把ID为2158的数据类型改成bigint" | → CRUD Agent | ✅ 通过 |
| 删除元数据 | "删除ID为2325的元数据"         | → CRUD Agent | ✅ 通过 |
| 查看标签  | "查看可用的标签列表"             | → CRUD Agent | ✅ 通过 |

### 10.2 多轮对话测试

| 步骤  | 用户输入                 | 系统响应           | 状态  |
| --- | -------------------- | -------------- | --- |
| 1   | "我想新增一个元数据，中文名叫订单状态" | 自动翻译英文名，询问数据类型 | ✅   |
| 2   | "varchar"            | 记录，询问是否启用      | ✅   |
| 3   | "启用"                 | 记录，询问分类        | ✅   |
| 4   | "应用类"                | 记录，询问归属        | ✅   |
| 5   | "跳过"                 | 询问描述           | ✅   |
| 6   | "用于记录订单的当前状态"        | 展示标签列表，询问选择    | ✅   |
| 7   | "跳过"                 | 展示信息汇总，请求确认    | ✅   |
| 8   | "确认，提交创建"            | 创建成功，返回 ID     | ✅   |

---

## 11. 注意事项

### 11.1 架构设计要点

1. **意图分类与路由分离**：使用 Switch 节点进行明确的路由控制，而非依赖 AI Agent 自行选择工具
2. **子工作流独立性**：新增元数据流程封装在独立的子工作流中，便于维护和扩展
3. **会话状态管理**：通过 `session_id` 在主工作流和子工作流之间传递会话标识，保持多轮对话的连续性

### 11.2 配置注意事项

1. **子工作流必须激活**：被 Execute Workflow 调用的子工作流需要处于激活状态
2. **callerPolicy 设置**：子工作流的 `callerPolicy` 需设置为 `"any"` 以允许外部调用
3. **Memory Session Key**：子工作流的 Simple Memory 必须使用 `customKey` 类型，并绑定传入的 `session_id`

### 11.3 扩展建议

1. 可以添加更多的意图分类类型，如"批量操作"、"数据导出"等
2. 可以为其他复杂操作创建独立的子工作流
3. 可以添加用户权限验证节点

---

## 12. 版本信息

| 项目       | 版本                                         |
| -------- | ------------------------------------------ |
| 文档版本     | 1.1                                        |
| 创建日期     | 2026-02-05                                 |
| 最后更新     | 2026-02-05                                 |
| 主工作流版本   | 159+                                       |
| 子工作流版本   | 18                                         |
| n8n 节点版本 | Agent 1.7, Switch 3.4, Memory 1.3, Set 3.4 |

### 12.1 更新日志

**v1.1 (2026-02-05)**

- 新增 `Prepare CRUD Input` 节点，解决 CRUD Agent 接收到 Intent Classifier 输出而非用户原始输入的问题
- 修改 Simple Memory 的 sessionKey 配置，添加 `intent-` 和 `crud-` 前缀以隔离不同 Agent 的对话记忆
- 更新架构图和连接图以反映新的节点结构

**v1.0 (2026-02-05)**

- 初始版本发布
