# 觸發器

### 觸發器的定義

每個節點都是用JSON組成，什麼是JSO&#x4E;*(JavaScript Object Notation)*，你可當作是一個傳遞和儲存資料的結構。

舉例: { "key": "value" }, 我們將key取名叫"鍵"，value取名叫"值"。而每個節點儲存的方式為，節點名稱除了start名稱為start外，其餘都是uuid，所以假設有個節點叫97d860d4-5a7f-49e0-804a-7ce4891076bf，如果儲存在那個節點的資料為datas，可以參考以下格式。

```
{
  "start": {
    "username": "dmflow.chat"
  },
  "97d860d4-5a7f-49e0-804a-7ce4891076bf": {
    "datas": [
      {"id": "001", "name":"測試"},
      {"id": "002", "name":"測試2"}
    ]
  }
}
```

觸發器分為觸發流程和背景流程

* 觸發流程是檢查輸入的文字是否有錯誤以及可以呼叫預設的LLM(預設Gemini 2.0 flash)進行補充文字。
* 背景流程是當觸發流程抵達END且已經完成儲存、更新或刪除，所執行的流程。

### 觸發流程包含項目

* **IF**: 根據條件（conditions）引導流程進入 true 或 false 節點。
* **ASSIGN**: 將對話中獲取的內容儲存在特定欄位內。
* **RESPONSE**: 根據填寫的 Prompt 生成新的對話輸出（output），並可通過 ASSIGN 節點儲存。
* **ERROR**: 當輸入的欄位內容錯誤時，可以輸出ERROR節點，強制結束此對話。
* **STOREQUERY**: 填寫一段對話，從中擷取 JSON，JSON 包含文字、檔案或其他訊息。根據這些訊息使用 ASSIGN 節點進行保存。
* **ROW\_EXIST**: 用於檢查過濾完畢的資料是否存在
* **ME**: 將可以取得是哪位訪客調用這個觸發器。

**IF 節點**包含條件式，你可以透過條件式指向其他節點。

<figure><img src="/files/cPlxeS1q155VBGuNgnqD" alt=""><figcaption><p>IF節點</p></figcaption></figure>

**ASSIGN節點**可以覆蓋**鍵**或者新增**值**

<figure><img src="/files/nZlCHByaQstmYLIAitU2" alt=""><figcaption><p>ASSIGN節點</p></figcaption></figure>

**Response節點**，只能用於表單問答，**Fields**為抓取欄位，**Prompt**為提示詞，**Response**為詢問用戶。若你將**Response\_only**填寫為true，則不理會Fields的欄位，而是直接取得LLM回覆的回應。

舉例:&#x20;

Fields:\["姓名", "信箱"], Prompt: 請取得訪客填寫的姓名和信箱, Response: 您好，請填寫您的姓名和信箱方便我們連繫您。Response\_only=false。若取得姓名和信箱則會回填到Fields內，儲存格式為以下。

```
node['14387998-e5dc-4edd-b35d-6aa3e83832af'].username
node['14387998-e5dc-4edd-b35d-6aa3e83832af'].email
```

Prompt: 請幫我翻譯訪客的問題, Response: 您好，請填寫訪客的問題，我將幫你翻譯成中文。Response\_only=true。則會取得翻譯完的中文，儲存格式為以下。

```
node['14387998-e5dc-4edd-b35d-6aa3e83832af'].response
```

<figure><img src="/files/hSrCnstxC95R6ME6ykgq" alt=""><figcaption><p>Response節點</p></figcaption></figure>

**Error節點**，用於假設條件錯誤或格式錯誤會回覆訪客。**Response**填寫為何發生錯誤的原因即可。

<figure><img src="/files/zF0VcyO4RNcX61teWIlI" alt=""><figcaption><p>Error節點</p></figcaption></figure>

**StoreQuery節點**，用於保存暫時的用戶資訊包含詢問。每個節點下方都有**Output**可以參考這個節點可以取得那些資料。跟Me節點的差別只有Me節點會直接通過而StoreQuery會等待下次用戶回應。

<figure><img src="/files/KbbzocI8gEzwWJVnesrN" alt=""><figcaption><p><strong>StoreQuery節點</strong></p></figcaption></figure>

**RowExist節點**，用於過濾某些欄位查看該列表是否存在，**例如**: 找尋用戶信箱'<service@dmflow.chat>'是否存在。

**選擇表單**為自己選定該領域所包含的所有表。**是否不理會過濾碼**，預設為會檢查這個表單的權限，若**開啟不理會過濾碼**則是admin權限，無視訪客權限查找全部文檔。

<figure><img src="/files/WAo6IhmCIIxrFgePOU52" alt=""><figcaption><p><strong>RowExist節點</strong></p></figcaption></figure>

背景流程在觸發流程到達 END 且完成儲存、更新或刪除後執行。背景流程使用觸發流程產生的資料進行進一步處理。

### 參數說明

每個參數可以透過'{' 自動搜尋可填寫的參數。若是input則參數一定要放在雙大括號內{{xxx}}。若是textarea則參數可以透過{{xxx}} {{yyy}} 這樣方式渲染輸出。

### 其他函數使用

| 函數名稱                                                                                                    | 描述                              | 範例                                                                         |
| ------------------------------------------------------------------------------------------------------- | ------------------------------- | -------------------------------------------------------------------------- |
| hash(text: string)                                                                                      | 轉為hash數字                        | {{Utils.hash(''1234)}}=1914461635                                          |
| uuid()                                                                                                  | 可以產生uuid v7                     | {{Utils.uuid()}}=01960608-fab0-7045-8757-186afa41b41e                      |
| randomValue(length: number)                                                                             | 可以產生長度相等的亂數                     | {{Utils.randomValue(3)}}=L6s                                               |
| now(timezone: string)                                                                                   | 將當前時間轉成yyyy-MM-dd'T'HH:mm:ssXXX | {{Utils.now('+08:00')}}=2025-04-05T20:59:33+08:00                          |
| toSeconds(dataString: string)                                                                           | 將yyyy-MM-dd'T'HH:mm:ssXXX轉為秒數   | {{Utils.toSeconds('2025-04-05T00:00:00+08:00')}}=1743782400                |
| generateSignature(body: string, secret: string, algorithm: 'SHA256'\|'SHA1'\|'SHA384'\|'SHA512'\|'MD5') |                                 | {{Utils.generateSignature('test', '123', 'MD5')}}=9kN+nANEEEvn7U7PFW01EQ== |
| encrypt(decode:string)                                                                                  | 數值會跟不同的機器人和領域有所不同               | 無範例                                                                        |
| decrypt(encode:string)                                                                                  | 數值會跟不同的機器人和領域有所不同               | 無範例                                                                        |
| passwdVerify(originalPassword: string, encodedPassword: string)                                         | 用BCrypt加密後的密碼跟原始密碼比較            | 無範例                                                                        |
| passwdEncode(password: string)                                                                          | 使用BCrypt加密                      | 無範例                                                                        |
| atob(text: string)                                                                                      | Base64解碼                        | 無範例                                                                        |

### 背景流程預設項目

* HTTP: 調用外部HTTP資源
* IF: 與觸發流程相同，根據條件引導流程。
* ASSIGN: 與觸發流程相同，儲存內容。
* LOOPS: 根據指定欄位會進行迴圈。
* SEARCH: 可以指定表單撈出表單內的資料。
* INSERT: 插入新資料（新列(row)）。
* UPDATE: 修改指定的ID資料
* DELETE: 刪除指定的ID資料
* NATIVE\_UTILS: 用於使用我提供的功能，目前有將表單的檔案PresignedUrl的功能，讓第三方可以讀取。

### 測試

進入測試會以Server-Sent Events方式，讓你看到每一個節點的移動，你可以縮小並點選節點參數，可以看到該節點的參數。

<figure><img src="/files/QDSqnEQSICKJLLfcTjsf" alt=""><figcaption><p>測試觸發器</p></figcaption></figure>

### 注意

觸發器背景調用是調用第三方產品是使用租戶提供的密鑰，密鑰在資料庫都會加密保存，**若有疑問請勿使用**，觸發器除了測試的調用不會記錄，租戶可以自行查看觸發器的調用紀錄。

&#x20;


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.dmflow.chat/domain/formqa/trigger.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
