---
# System prepended metadata

title: GOCARE algorithm requirements

---

# GOCARE algorithm requirements

## 1. Hàm thêm template

### - Mô tả:
Thêm một template auto-reply vào hệ thống

### - Định nghĩa hàm:
```dart=
bool addTemplate(Map<String, dynamic> data);
```

### - Input:
```dart=
data = {
    "name": "Chẩn đoán COVID"
    "content": "Chào {{vocative}} {{name}},\nVới thông tin mà {{vocative}} cung cấp, có thể {{vocative}} đã bị COVID.",
    "triggers": [
        {
            "keyword": "sốt",
            "priority": 4,
        },
        {
            "keyword": "ho khan",
            "priority": 6,
        },
        {
           "keyword": "ho",
            "priority": 4, 
        },
        {
            "keyword": "mất vị giác",
            "priority": 9,
        }

    ],
    "arguments": [
        "name",
        "vocative"
    ],
    "threshold": 15,
}
```
### - Output:
true/false: Thêm thành công hoặc thất bại


## 2. Hàm get response

### - Mô tả:
- Tìm kiếm template thỏa mãn với **message** (tin nhắn của khách hàng)
- Trả về `null` nếu không tìm thấy template nào thỏa mãn có điểm số >= ***threshold***
- Nhiều template cùng thỏa mãn thì trả về template có điểm cao nhất

### - Định nghĩa hàm:
```dart=
String? getResponse(String message, Map<String, dynamic> arguments);
```

### - Input:
```dart=
message = "toi gan day bi mat vi giac, va nhieu luc bi ho khan nua. bac si tu van giup toi voi"
arguments = {
    "name": "Ngọc Ngô",
    "gender": "male",
    "age": null
}
```
### - Output:
```dart=
"Chào anh Ngọc Ngô,\nVới thông tin mà anh cung cấp, có thể anh đã bị COVID."
```

### - Quy tắc tính điểm:
- Chứa keyword nào thì cộng priority vào
- Nếu tồn tại 2 keyword chứa nhau (***ho khan*** và ***ho***) thì chỉ tính keyword có priority lớn hơn
- Ở mức demo:
    - chưa phân biệt hoa/thường, có dấu/không dấu => chuyển về thường & không dấu
    - chưa tính dựa trên số lượng của 1 từ khóa (chỉ tính tồn tại)
    - 

## 3. Hàm specify argument

### - Mô tả:
Xác định giá trị cho một argument từ các argument khác
Ở mức demo: Hàm do hệ thống implement cứng, không cho doanh nghiệp tùy chỉnh. Có thể dùng if-else, hoặc switch-case, hoặc xử lý bằng cấu trúc dữ liệu (càng tốt)

### - Định nghĩa hàm:
```dart=
String? specifyArgument(String neededKey, Map<String, dynamic> arguments);
```

### - Input:
```dart=
neededKey = "vocative"
arguments = {
    "name": "Ngọc Ngô",
    "gender": "male"
}
```
### - Output:
```dart=
anh
```