# 觸發器

### 觸發器的定義

每個節點都是用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="https://3496017944-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQmub5EsobLbLj4OPaUUl%2Fuploads%2FJbXJuN9jyh5ODB9Jyhls%2Fimage.png?alt=media&#x26;token=5466251a-f001-4d35-b4b7-158b4b385f6a" alt=""><figcaption><p>IF節點</p></figcaption></figure>

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

<figure><img src="https://3496017944-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQmub5EsobLbLj4OPaUUl%2Fuploads%2FJ2XC325fYVENcxyyuC6u%2Fimage.png?alt=media&#x26;token=4bad26d5-7111-4401-adce-4e6bb24794cc" 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="https://3496017944-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQmub5EsobLbLj4OPaUUl%2Fuploads%2FVvKrs6auNt6dLtNCa9bH%2Fimage.png?alt=media&#x26;token=64055fdd-dc92-43d6-954b-d604160ffba8" alt=""><figcaption><p>Response節點</p></figcaption></figure>

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

<figure><img src="https://3496017944-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQmub5EsobLbLj4OPaUUl%2Fuploads%2Fr8eyyUSpzte4SeTqcYcf%2Fimage.png?alt=media&#x26;token=e93f6684-ebdb-4de8-a055-3008662a81cb" alt=""><figcaption><p>Error節點</p></figcaption></figure>

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

<figure><img src="https://3496017944-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQmub5EsobLbLj4OPaUUl%2Fuploads%2FrfXcRamE6RC31hAbReTU%2Fimage.png?alt=media&#x26;token=8cc9c328-b25a-406a-8b90-93768284f739" alt=""><figcaption><p><strong>StoreQuery節點</strong></p></figcaption></figure>

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

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

<figure><img src="https://3496017944-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQmub5EsobLbLj4OPaUUl%2Fuploads%2FghrZsNoAssGXKBhQZCjG%2Fimage.png?alt=media&#x26;token=04851eea-1225-46cc-abd8-d33533738a21" 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="https://3496017944-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FQmub5EsobLbLj4OPaUUl%2Fuploads%2FfGH6wek5VMzRBiGdQGCJ%2Fimage.png?alt=media&#x26;token=13a3e5c5-9f91-4aa1-adc4-009bdbb601b1" alt=""><figcaption><p>測試觸發器</p></figcaption></figure>

### 注意

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

&#x20;
