@besales/mcp 0.1.0 → 0.11.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +272 -17
- package/dist/auth/connection-store.d.ts +58 -0
- package/dist/auth/connection-store.js +208 -0
- package/dist/auth/connection-store.js.map +1 -0
- package/dist/auth/oauth-client.d.ts +27 -2
- package/dist/auth/oauth-client.js +62 -11
- package/dist/auth/oauth-client.js.map +1 -1
- package/dist/auth/session-workspace.d.ts +2 -0
- package/dist/auth/session-workspace.js +20 -0
- package/dist/auth/session-workspace.js.map +1 -0
- package/dist/auth/token-storage.d.ts +19 -5
- package/dist/auth/token-storage.js +11 -6
- package/dist/auth/token-storage.js.map +1 -1
- package/dist/cli.d.ts +2 -7
- package/dist/cli.js +111 -33
- package/dist/cli.js.map +1 -1
- package/dist/http/api-client.d.ts +4 -13
- package/dist/http/api-client.js +18 -18
- package/dist/http/api-client.js.map +1 -1
- package/dist/index.d.ts +8 -6
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/instructions/server-instructions.d.ts +15 -0
- package/dist/instructions/server-instructions.js +243 -0
- package/dist/instructions/server-instructions.js.map +1 -0
- package/dist/package-metadata.js +7 -1
- package/dist/package-metadata.js.map +1 -1
- package/dist/resources/concepts/feedback-sheets.md +77 -0
- package/dist/resources/concepts/sandbox.md +13 -0
- package/dist/resources/concepts/workbook-classification.md +241 -0
- package/dist/resources/docs/agent-behavior.md +393 -0
- package/dist/resources/docs/crm-integration.md +535 -0
- package/dist/resources/docs/files-and-uploads.md +295 -0
- package/dist/resources/docs/knowledge-base.md +521 -0
- package/dist/resources/docs/pipeline-builder.md +221 -0
- package/dist/resources/docs/pipeline-settings-deep.md +221 -0
- package/dist/resources/docs/platforms.md +513 -0
- package/dist/resources/docs/prompt-anatomy.md +298 -0
- package/dist/resources/docs/prompt-principles.md +289 -0
- package/dist/resources/registry.js +34 -12
- package/dist/resources/registry.js.map +1 -1
- package/dist/resources/workflows/compare-models.md +46 -0
- package/dist/resources/workflows/connect-crm-from-scratch.md +89 -0
- package/dist/resources/workflows/connect-datasource-from-scratch.md +92 -0
- package/dist/resources/workflows/extract-from-document.md +36 -0
- package/dist/resources/workflows/iterate-with-sandbox.md +31 -0
- package/dist/resources/workflows/platform-setup-from-scratch.md +113 -0
- package/dist/resources/workflows/production-readiness-check.md +41 -0
- package/dist/schemas/mcp-tools.json +2636 -182
- package/dist/server.js +2 -0
- package/dist/server.js.map +1 -1
- package/dist/tools/definitions/agent-design.d.ts +215 -0
- package/dist/tools/definitions/agent-design.js +643 -0
- package/dist/tools/definitions/agent-design.js.map +1 -0
- package/dist/tools/definitions/crm-platform.d.ts +211 -0
- package/dist/tools/definitions/crm-platform.js +1070 -0
- package/dist/tools/definitions/crm-platform.js.map +1 -0
- package/dist/tools/definitions/datasource.d.ts +40 -0
- package/dist/tools/definitions/datasource.js +196 -0
- package/dist/tools/definitions/datasource.js.map +1 -0
- package/dist/tools/definitions/knowledge.d.ts +215 -0
- package/dist/tools/definitions/knowledge.js +782 -0
- package/dist/tools/definitions/knowledge.js.map +1 -0
- package/dist/tools/definitions/model-comparison.d.ts +25 -0
- package/dist/tools/definitions/model-comparison.js +101 -0
- package/dist/tools/definitions/model-comparison.js.map +1 -0
- package/dist/tools/definitions/platform-setup.d.ts +412 -0
- package/dist/tools/definitions/platform-setup.js +738 -0
- package/dist/tools/definitions/platform-setup.js.map +1 -0
- package/dist/tools/definitions/session.d.ts +11 -0
- package/dist/tools/definitions/session.js +86 -0
- package/dist/tools/definitions/session.js.map +1 -0
- package/dist/tools/definitions/shared.d.ts +742 -0
- package/dist/tools/definitions/shared.js +773 -0
- package/dist/tools/definitions/shared.js.map +1 -0
- package/dist/tools/definitions.d.ts +873 -88
- package/dist/tools/definitions.js +14 -856
- package/dist/tools/definitions.js.map +1 -1
- package/dist/tools/registry.d.ts +3 -1
- package/dist/tools/registry.js +90 -11
- package/dist/tools/registry.js.map +1 -1
- package/dist/tools/result.d.ts +1 -1
- package/dist/tools/result.js +12 -4
- package/dist/tools/result.js.map +1 -1
- package/dist/utils/logger.js +2 -1
- package/dist/utils/logger.js.map +1 -1
- package/docs/host-setup.md +34 -15
- package/package.json +2 -2
- package/scripts/install-claude-desktop.js +89 -11
- package/scripts/mock-api-server.js +1 -1
- package/scripts/mock-credentials.js +49 -6
- package/dist/types/api-contract.gen.d.ts +0 -6975
- package/dist/types/api-contract.gen.js +0 -6
- package/dist/types/api-contract.gen.js.map +0 -1
|
@@ -0,0 +1,513 @@
|
|
|
1
|
+
# 11. Платформы (каналы связи)
|
|
2
|
+
|
|
3
|
+
> **Источник правды:** `ai-aniomaly/docs/ai-prompt-builder/11-platforms.md` — копия для MCP doc-bridge (v1.5 Increment 6b). Синкать при изменении оригинала.
|
|
4
|
+
>
|
|
5
|
+
> ⚠️ **MCP-контекст:** это доменная справка, написанная для людей/админ-UI. В MCP-сессии ты выполняешь те же операции **через besales_* tools**, а не через UI (drag-n-drop, клики в админке). Где текст ниже говорит «клиент/админ делает X через UI» — это «что должно получиться»; механику бери из tool (напр. загрузка файла → `besales_file_upload_request`; документ в knowledge → `besales_knowledge_document_upload`; сайт → `besales_knowledge_website_add`) + из workflow-ресурсов. Внутренние ссылки `[NN-name.md]` — относительные пути исходной доки, через MCP НЕ резолвятся: ищи `besales://docs/<slug>` или concept-resource.
|
|
6
|
+
|
|
7
|
+
## 1. Назначение
|
|
8
|
+
|
|
9
|
+
`Platform` — это «канал», через который бот общается с пользователями. Каждая платформа — один внешний account/bot/instance. Animaly поддерживает **11 типов** платформ (`PlatformType`): Telegram Bot, Telegram Personal, Wazzup (WhatsApp), Avito, Instagram DM, VKontakte, SmsGorod (SMS), Web Widget, Bitrix24 Bot, Salebot и **GetCourse**.
|
|
10
|
+
|
|
11
|
+
> Ранее в обзорной части документации фигурировало «10 каналов» — это устаревшая цифра. GetCourse — отдельный полноценный адаптер с собственным контроллером (`/api/getcourse/webhook/:platformId/:secret/...`), и его нужно учитывать при настройке.
|
|
12
|
+
|
|
13
|
+
## 2. Общая структура `Platform`
|
|
14
|
+
|
|
15
|
+
```json
|
|
16
|
+
{
|
|
17
|
+
"id": "uuid",
|
|
18
|
+
"type": "TelegramBot",
|
|
19
|
+
"name": "Главный Telegram-бот",
|
|
20
|
+
"isActive": true,
|
|
21
|
+
"isAiEnabled": true,
|
|
22
|
+
"timezone": "Europe/Moscow",
|
|
23
|
+
"offMessage": "Бот временно недоступен. Пожалуйста, попробуйте позже.",
|
|
24
|
+
"workspaceId": "<workspaceId>",
|
|
25
|
+
|
|
26
|
+
// Поля, специфичные для каждого type — см. ниже
|
|
27
|
+
"config": null,
|
|
28
|
+
"botToken": "...",
|
|
29
|
+
|
|
30
|
+
"isUserFilterEnabled": false,
|
|
31
|
+
"filteredUserIds": [],
|
|
32
|
+
|
|
33
|
+
"useDynamicVariables": false,
|
|
34
|
+
"clearDynamicVarsOnHistoryClear": true,
|
|
35
|
+
|
|
36
|
+
"responsibleAssigneeStrategy": "KEEP",
|
|
37
|
+
"fixedResponsibleId": null,
|
|
38
|
+
|
|
39
|
+
"sendToCrm": false,
|
|
40
|
+
"useCrossPlatformHistory": false,
|
|
41
|
+
|
|
42
|
+
"sendStartNoteToCrm": false,
|
|
43
|
+
"sendFailedNoteToCrm": false,
|
|
44
|
+
"sendOperatorTakeoverNoteToCrm": false,
|
|
45
|
+
"sendFinishAutoNoteToCrm": false,
|
|
46
|
+
|
|
47
|
+
"finishAutoEnabled": false,
|
|
48
|
+
"finishAutoDays": 7,
|
|
49
|
+
|
|
50
|
+
"dealMarkerType": "NONE",
|
|
51
|
+
"dealMarkerValue": null
|
|
52
|
+
}
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
### Общие поля (для всех платформ)
|
|
56
|
+
|
|
57
|
+
| Поле | Дефолт | Описание |
|
|
58
|
+
|---|---|---|
|
|
59
|
+
| `type` | — | enum `PlatformType`. Определяет, как платформа подключается. |
|
|
60
|
+
| `name` | null | Пользовательское название (для UI). |
|
|
61
|
+
| `isActive` | false | Включён ли канал. |
|
|
62
|
+
| `isAiEnabled` | true | Работает ли AI на этой платформе. Если `false` — все сообщения уходят оператору. |
|
|
63
|
+
| `timezone` | `"Europe/Moscow"` | Таймзона для расписаний и `{currentTime}`. |
|
|
64
|
+
| `offMessage` | `"Бот временно недоступен..."` | Что отвечать, если `isActive=false`. |
|
|
65
|
+
| `useDynamicVariables` | false | Можно ли использовать `ChatUser.dynamicVariables`. |
|
|
66
|
+
| `clearDynamicVarsOnHistoryClear` | true | Очищать ли динамические переменные при очистке истории. |
|
|
67
|
+
| `responsibleAssigneeStrategy` | `KEEP` | Стратегия выбора ответственного. |
|
|
68
|
+
| `sendToCrm` | false | Отправлять ли сообщения от бота в CRM (Bitrix24 Open Line, AmoCRM Chat API). |
|
|
69
|
+
| `useCrossPlatformHistory` | false | Использовать историю из всех платформ `UnifiedCustomer`. |
|
|
70
|
+
| `dealMarkerType` | `NONE` | Маркировка сделок: `NONE` / `TAG` / `CUSTOM_FIELD`. |
|
|
71
|
+
|
|
72
|
+
### Workspace-scoped API
|
|
73
|
+
|
|
74
|
+
Legacy endpoints `GET /api/platforms` и `POST /api/platforms` берут `workspaceId` из JWT.
|
|
75
|
+
Для экранов, где workspace выбран явно в UI, используется route-scoped вариант:
|
|
76
|
+
|
|
77
|
+
| Endpoint | Назначение |
|
|
78
|
+
|---|---|
|
|
79
|
+
| `GET /api/workspace/:workspaceId/platforms` | Список платформ выбранного workspace для текущего пользователя. |
|
|
80
|
+
| `POST /api/workspace/:workspaceId/platforms` | Создание платформы в выбранном workspace. |
|
|
81
|
+
|
|
82
|
+
Оба endpoint проверяют права пользователя в `:workspaceId` через `PermissionsService`:
|
|
83
|
+
`PLATFORM_READ` для чтения и `PLATFORM_CREATE` для создания. Это защищает сценарии, где
|
|
84
|
+
access token ещё содержит старый workspace, а интерфейс уже переключился на другой.
|
|
85
|
+
|
|
86
|
+
### CRM-заметки
|
|
87
|
+
|
|
88
|
+
| Поле | Дефолт | Описание |
|
|
89
|
+
|---|---|---|
|
|
90
|
+
| `sendStartNoteToCrm` | false | Отправлять ли заметку в CRM при первом контакте. |
|
|
91
|
+
| `startNoteTemplate` | null | Кастомный текст (null — дефолтный). |
|
|
92
|
+
| `sendFailedNoteToCrm` | false | Заметка при ошибке отправки. |
|
|
93
|
+
| `sendOperatorTakeoverNoteToCrm` | false | Заметка при вызове оператора. |
|
|
94
|
+
| `sendFinishAutoNoteToCrm` | false | Заметка при `FINISH_AUTO`. |
|
|
95
|
+
|
|
96
|
+
### Авто-завершение по неактивности
|
|
97
|
+
|
|
98
|
+
| Поле | Дефолт | Описание |
|
|
99
|
+
|---|---|---|
|
|
100
|
+
| `finishAutoEnabled` | false | Включить автозакрытие после N дней молчания. |
|
|
101
|
+
| `finishAutoDays` | 7 | Сколько дней молчания. |
|
|
102
|
+
|
|
103
|
+
## 3. Каталог платформ по типам
|
|
104
|
+
|
|
105
|
+
### 3.1. `TelegramBot` (Telegram через BotFather)
|
|
106
|
+
|
|
107
|
+
```json
|
|
108
|
+
{
|
|
109
|
+
"type": "TelegramBot",
|
|
110
|
+
"botToken": "<токен от @BotFather>",
|
|
111
|
+
"isActive": true,
|
|
112
|
+
"isAiEnabled": true,
|
|
113
|
+
"enableCleanupCommands": false
|
|
114
|
+
}
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
| Поле | Описание |
|
|
118
|
+
|---|---|
|
|
119
|
+
| `botToken` | Токен от @BotFather. **Обязательное** для активации. |
|
|
120
|
+
| `enableCleanupCommands` | По умолчанию `false`. Если `true` — Animaly через `setMyCommands` регистрирует у бота меню `/clean` (очистить историю чата) и `/delete` (удалить ChatUser-контакт). Используется только для **TelegramBot**-платформ; на других channel-типах backend отклоняет с 400 (typed validation). Команды реализованы через отдельный сервисный Cleanup Bot — клиент должен добавить себя как `WorkspaceTrustedIdentity` (по `telegram_user_id`/`telegram_username`) ещё ДО первого `/start`. |
|
|
121
|
+
|
|
122
|
+
**Поддерживает:** медиа (фото/видео/документы/аудио/voice/video_note), кнопки (INLINE/REPLY), группы (с ограничениями), polling/webhook, Markdown.
|
|
123
|
+
|
|
124
|
+
**Лимиты:** caption ≤1024, текст ≤4096, файлы ≤50MB.
|
|
125
|
+
|
|
126
|
+
### 3.2. `TelegramPersonal` (личный Telegram-аккаунт через MTProto)
|
|
127
|
+
|
|
128
|
+
```json
|
|
129
|
+
{
|
|
130
|
+
"type": "TelegramPersonal",
|
|
131
|
+
"isActive": true,
|
|
132
|
+
"isAiEnabled": true
|
|
133
|
+
}
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
Привязка через `TelegramPersonalAccount` (отдельная сущность):
|
|
137
|
+
|
|
138
|
+
```json
|
|
139
|
+
{
|
|
140
|
+
"phoneNumber": "+79991234567",
|
|
141
|
+
"apiId": 12345,
|
|
142
|
+
"apiHash": "<api hash>",
|
|
143
|
+
"sessionString": "<MTProto сессия>",
|
|
144
|
+
"status": "CONNECTED",
|
|
145
|
+
"dailyMessageLimit": 10,
|
|
146
|
+
"isActiveInCampaigns": true,
|
|
147
|
+
"sendingIntervalMinutes": 2,
|
|
148
|
+
"proxyId": "<Proxy.id>"
|
|
149
|
+
}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
**Поддерживает:** все медиа, voice, video_note, кнопки только REPLY (Telegram personal не поддерживает inline).
|
|
153
|
+
|
|
154
|
+
**Особенности:**
|
|
155
|
+
- Можно несколько аккаунтов на одну платформу (карусель для рассылок).
|
|
156
|
+
- `dailyMessageLimit` — анти-бан защита (default 10).
|
|
157
|
+
- `restrictionStatus` отслеживает баны Telegram.
|
|
158
|
+
- `messageOpenDelay` (`AgentBehavior`) применяется только здесь.
|
|
159
|
+
|
|
160
|
+
### 3.3. `Wazzup` (агрегатор каналов)
|
|
161
|
+
|
|
162
|
+
```json
|
|
163
|
+
{
|
|
164
|
+
"type": "Wazzup",
|
|
165
|
+
"wazzupCrmKey": "<ключ от Wazzup>",
|
|
166
|
+
"wazzupChannel": "WhatsApp",
|
|
167
|
+
"isActive": true
|
|
168
|
+
}
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
| `wazzupChannel` | Канал |
|
|
172
|
+
|---|---|
|
|
173
|
+
| `WhatsApp` | WhatsApp Business |
|
|
174
|
+
| `Avito` | Avito (через Wazzup) |
|
|
175
|
+
| `Instagram` | Instagram DM (через Wazzup) |
|
|
176
|
+
| `Vk` | ВКонтакте |
|
|
177
|
+
| `Telegram` | Telegram (через Wazzup) |
|
|
178
|
+
| `Viber` | Viber |
|
|
179
|
+
| `Max` | Max (Россия) |
|
|
180
|
+
| `TelegramPersonal` | Telegram Personal через Wazzup |
|
|
181
|
+
|
|
182
|
+
**Поддерживает:** WhatsApp шаблоны (WABA), медиа, кнопки (для Telegram-канала). На WhatsApp — лимит 24h-окна и approved templates.
|
|
183
|
+
|
|
184
|
+
### 3.4. `Avito` (Avito Messenger напрямую)
|
|
185
|
+
|
|
186
|
+
```json
|
|
187
|
+
{
|
|
188
|
+
"type": "Avito",
|
|
189
|
+
"config": {
|
|
190
|
+
"clientId": "<Avito Client ID>",
|
|
191
|
+
"clientSecret": "<...>",
|
|
192
|
+
"userId": "<Avito User ID>",
|
|
193
|
+
"accessToken": "<oauth token>",
|
|
194
|
+
"refreshToken": "<...>",
|
|
195
|
+
"expiresAt": "..."
|
|
196
|
+
},
|
|
197
|
+
"isActive": true
|
|
198
|
+
}
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
**Подключение (OAuth):** браузерная OAuth-авторизация Avito (`clientId` / `clientSecret` → `accessToken` / `refreshToken`); с OAuth Phase 2 доступно подключение через MCP setup-flow (Setup URL), код авторизации не проходит через чат. Поддерживает: текст, картинки. **Не поддерживает:** кнопки, документы, видео.
|
|
202
|
+
|
|
203
|
+
### 3.5. `Instagram` (Direct API через Facebook Graph)
|
|
204
|
+
|
|
205
|
+
```json
|
|
206
|
+
{
|
|
207
|
+
"type": "Instagram",
|
|
208
|
+
"instagramBusinessAccountId": "<IG account>",
|
|
209
|
+
"instagramPageId": "<Facebook Page>",
|
|
210
|
+
"instagramPageAccessToken": "<encrypted>",
|
|
211
|
+
"instagramTokenExpiresAt": "...",
|
|
212
|
+
"instagramUserAccessToken": "<encrypted>",
|
|
213
|
+
"instagramWebhookVerifyToken": "<token>",
|
|
214
|
+
|
|
215
|
+
"replyToInstagramComments": false,
|
|
216
|
+
"instagramCommentHandlingMode": "MENTIONS_ONLY",
|
|
217
|
+
"instagramCommentReplyMethod": "PRIVATE_DM",
|
|
218
|
+
"instagramCommentKeywords": null,
|
|
219
|
+
"replyToStoryMentions": false,
|
|
220
|
+
|
|
221
|
+
"isActive": true
|
|
222
|
+
}
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Особенности:**
|
|
226
|
+
- **24h-окно**: можно отвечать только в течение 24 часов после сообщения пользователя.
|
|
227
|
+
- Комментарии под постами обрабатываются отдельно (`instagramCommentHandlingMode`).
|
|
228
|
+
- Story Mentions/Replies — опционально.
|
|
229
|
+
|
|
230
|
+
**Подключение (OAuth):** канал подключается браузерной OAuth-авторизацией через Facebook Graph API (v21). Поток: `POST /api/instagram/auth/initiate` (под JWT) возвращает `authUrl` с подписанным HMAC-`state` → клиент подтверждает доступ в диалоге Facebook → `GET /api/instagram/auth/callback` обменивает `code` на токены и сохраняет `instagramPageAccessToken` / `instagramUserAccessToken`. Токены не вводятся вручную и не проходят через чат; тот же поток используется при подключении через MCP setup-flow (OAuth Phase 2).
|
|
231
|
+
|
|
232
|
+
### 3.6. `Salebot` (внешний агрегатор)
|
|
233
|
+
|
|
234
|
+
```json
|
|
235
|
+
{
|
|
236
|
+
"type": "Salebot",
|
|
237
|
+
"salebotApiKey": "<API key>",
|
|
238
|
+
"salebotProjectId": "<project id>",
|
|
239
|
+
"salebotGroupId": "<group/bot name>",
|
|
240
|
+
"isActive": true
|
|
241
|
+
}
|
|
242
|
+
```
|
|
243
|
+
|
|
244
|
+
Salebot сам подключает Telegram/VK/WhatsApp/etc. Animaly через API Salebot отправляет/принимает сообщения.
|
|
245
|
+
|
|
246
|
+
### 3.7. `SmsGorod` (SMS через сервис)
|
|
247
|
+
|
|
248
|
+
```json
|
|
249
|
+
{
|
|
250
|
+
"type": "SmsGorod",
|
|
251
|
+
"smsgorodApiKey": "<API key>",
|
|
252
|
+
"smsgorodChannel": "DIGIT",
|
|
253
|
+
"smsgorodSender": null,
|
|
254
|
+
"isActive": true
|
|
255
|
+
}
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
| `smsgorodChannel` | Описание |
|
|
259
|
+
|---|---|
|
|
260
|
+
| `DIGIT` | Цифровой номер отправителя (sender необязателен). |
|
|
261
|
+
| `CHAR` | Буквенное имя отправителя — `smsgorodSender` обязателен. |
|
|
262
|
+
|
|
263
|
+
**Лимиты:**
|
|
264
|
+
- Один SMS = 70 символов кириллицей или 160 латиницей.
|
|
265
|
+
- Длинные сообщения разбиваются провайдером.
|
|
266
|
+
- **Не поддерживает:** медиа, кнопки.
|
|
267
|
+
- Рекомендуется задать `AgentChat.maxResponseSymbols` (например, 140), чтобы LLM не генерировал слишком длинно.
|
|
268
|
+
|
|
269
|
+
### 3.8. `VKon` (VK сообщество)
|
|
270
|
+
|
|
271
|
+
```json
|
|
272
|
+
{
|
|
273
|
+
"type": "VKon",
|
|
274
|
+
"config": {
|
|
275
|
+
"groupId": "<community ID>",
|
|
276
|
+
"accessToken": "<community access token>",
|
|
277
|
+
"secret": "<callback secret>",
|
|
278
|
+
"confirmation": "<callback confirmation string>"
|
|
279
|
+
},
|
|
280
|
+
"isActive": true
|
|
281
|
+
}
|
|
282
|
+
```
|
|
283
|
+
|
|
284
|
+
**Поддерживает:** текст, медиа (фото/видео/аудио/документы), кнопки (как REPLY-клавиатура), карусели.
|
|
285
|
+
|
|
286
|
+
### 3.9. `WebWidget` (встраиваемый виджет на сайт)
|
|
287
|
+
|
|
288
|
+
```json
|
|
289
|
+
{
|
|
290
|
+
"type": "WebWidget",
|
|
291
|
+
"webWidgetAllowedOrigins": ["*"],
|
|
292
|
+
"webWidgetShowPageInfo": true,
|
|
293
|
+
"webWidgetRateLimitPerMinute": 20,
|
|
294
|
+
"webWidgetCustomization": {
|
|
295
|
+
"logo": "https://example.com/logo.png",
|
|
296
|
+
"colors": { "primary": "#7B61FF" },
|
|
297
|
+
"position": "bottom-right",
|
|
298
|
+
"buttonStyle": "rounded"
|
|
299
|
+
},
|
|
300
|
+
"webWidgetMarketingFieldMappings": {
|
|
301
|
+
"utm_source": "<crmFieldId>",
|
|
302
|
+
"utm_campaign": "<crmFieldId>",
|
|
303
|
+
"ymClientId": "<crmFieldId>",
|
|
304
|
+
"googleClientId": "<crmFieldId>"
|
|
305
|
+
},
|
|
306
|
+
"webWidgetEntryUrlVariableMapping": {
|
|
307
|
+
"variableName": "first_visit_url",
|
|
308
|
+
"regex": null
|
|
309
|
+
}
|
|
310
|
+
}
|
|
311
|
+
```
|
|
312
|
+
|
|
313
|
+
**Особенности:**
|
|
314
|
+
- Real-time через **Socket.IO** (не webhook).
|
|
315
|
+
- `webWidgetShowPageInfo=true` — добавляет в промпт URL текущей страницы.
|
|
316
|
+
- `webWidgetMarketingFieldMappings` — UTM/yaClientId/gaClientId автоматически отправляются в CRM-поля.
|
|
317
|
+
- Push-кампании **не поддерживаются** (нет инициатора со стороны бота).
|
|
318
|
+
- Особая логика follow-up через `webWidgetLastSeenAt` (см. [`08-follow-up.md`](08-follow-up.md)).
|
|
319
|
+
|
|
320
|
+
### 3.10. `Bitrix24Bot` (Bitrix24 Open Lines)
|
|
321
|
+
|
|
322
|
+
```json
|
|
323
|
+
{
|
|
324
|
+
"type": "Bitrix24Bot",
|
|
325
|
+
"bitrix24BotId": 42,
|
|
326
|
+
"bitrix24BotCode": "animaly_bot_<workspaceId>",
|
|
327
|
+
"bitrix24BotName": "BeSales AI",
|
|
328
|
+
"bitrix24OpenLineId": "5",
|
|
329
|
+
"isActive": true
|
|
330
|
+
}
|
|
331
|
+
```
|
|
332
|
+
|
|
333
|
+
Бот регистрируется в Bitrix24 и принимает сообщения из всех каналов Open Lines (Telegram/WhatsApp/VK/Viber/Avito).
|
|
334
|
+
|
|
335
|
+
**Особенности:**
|
|
336
|
+
- Live-проверка колонки CRM перед отправкой follow-up (см. [`08-follow-up.md`](08-follow-up.md), раздел 4.1).
|
|
337
|
+
- `hasExitedSilentMode` у `ChatUser` — лид/сделка активирована (попала в INCOMING/OUTGOING).
|
|
338
|
+
|
|
339
|
+
### 3.11. `GetCourse` (LMS GetCourse)
|
|
340
|
+
|
|
341
|
+
```json
|
|
342
|
+
{
|
|
343
|
+
"type": "GetCourse",
|
|
344
|
+
"getcourseAccountDomain": "school.getcourse.ru",
|
|
345
|
+
"getcourseSchoolApiKey": "<encrypted>",
|
|
346
|
+
"getcourseEmployeeUserId": 42,
|
|
347
|
+
"getcourseAvailableTransports": ["Site", "Email", "Telegram"],
|
|
348
|
+
"getcourseDefaultTransport": "Site",
|
|
349
|
+
"getcourseWebhookSecret": "<random32bytes>",
|
|
350
|
+
"getcourseDepartments": [
|
|
351
|
+
{ "id": 1, "label": "Отдел продаж" },
|
|
352
|
+
{ "id": 2, "label": "Поддержка" }
|
|
353
|
+
]
|
|
354
|
+
}
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
**Особенности:**
|
|
358
|
+
- **Single Platform** на школу с массивом активных транспортов (`Site`, `Email`, `SMS`, `Telegram`, `Facebook`, `VK`, `Chatium`, `WhatsApp`, `Viber`).
|
|
359
|
+
- Каждое сообщение знает свой транспорт (`ChatUsersMessages.getcourseTransport`).
|
|
360
|
+
- Reply-routing: куда написал — туда отвечаем (`ChatUser.lastGetcourseTransport`).
|
|
361
|
+
- Поддерживает GetCourse как CRM (отдельные `ActionGetCourse*` — см. [`04-triggers-and-actions.md`](04-triggers-and-actions.md)).
|
|
362
|
+
|
|
363
|
+
## 4. Сводная таблица возможностей
|
|
364
|
+
|
|
365
|
+
| Платформа | Кнопки | Медиа | Группы | Push-кампании | 24h-окно |
|
|
366
|
+
|---|---|---|---|---|---|
|
|
367
|
+
| `TelegramBot` | INLINE+REPLY | Все | Да | Да | — |
|
|
368
|
+
| `TelegramPersonal` | REPLY | Все | Да | Да | — |
|
|
369
|
+
| `Wazzup` (WhatsApp) | Inline (WABA) | Да | Да | Через WABA шаблоны | Да |
|
|
370
|
+
| `Wazzup` (Telegram) | Inline | Все | Да | Да | — |
|
|
371
|
+
| `Avito` | Нет | Картинки | Нет | Ограниченно | — |
|
|
372
|
+
| `Instagram` | Quick Replies | Изображения | Нет | Только в 24h-окне | Да |
|
|
373
|
+
| `Salebot` | Зависит от подключённого канала | Зависит | Зависит | Да | Зависит |
|
|
374
|
+
| `SmsGorod` | Нет | Нет | Нет | Да | — |
|
|
375
|
+
| `VKon` | REPLY-клавиатура | Все | Да | Да | — |
|
|
376
|
+
| `WebWidget` | Inline + popup | Да | Нет | **Нет** | — |
|
|
377
|
+
| `Bitrix24Bot` | Зависит от Open Line | Да | Зависит | Да | — |
|
|
378
|
+
| `GetCourse` | Нет (Inbox API ограничен) | Да | Нет | Да | — |
|
|
379
|
+
|
|
380
|
+
## 5. Стратегии ответственного (`responsibleAssigneeStrategy`)
|
|
381
|
+
|
|
382
|
+
| Значение | Поведение |
|
|
383
|
+
|---|---|
|
|
384
|
+
| `KEEP` | Сохранять текущего ответственного в CRM. |
|
|
385
|
+
| `ALWAYS_ONE` | Всегда `fixedResponsibleId`. |
|
|
386
|
+
| `RANDOM_OPERATOR` | Случайный оператор из списка `CrmOperator`. |
|
|
387
|
+
|
|
388
|
+
## 6. PipelineSettings — фильтрация существующих сделок
|
|
389
|
+
|
|
390
|
+
```json
|
|
391
|
+
{
|
|
392
|
+
"platformId": "<platformId>",
|
|
393
|
+
"filters": [
|
|
394
|
+
{
|
|
395
|
+
"fieldId": "PHONE",
|
|
396
|
+
"valueType": "SYSTEM_VARIABLE",
|
|
397
|
+
"value": "phone",
|
|
398
|
+
"action": "LINK"
|
|
399
|
+
}
|
|
400
|
+
]
|
|
401
|
+
}
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
`PipelineSettings` определяет, что делать, если в CRM уже есть сделка с тем же телефоном/email:
|
|
405
|
+
- `LINK` — привязать пользователя к существующей сделке.
|
|
406
|
+
- `IGNORE` — игнорировать (создать новую, или `isBotActive=false`).
|
|
407
|
+
|
|
408
|
+
## 7. Inline-пример: Telegram-бот для интернет-магазина
|
|
409
|
+
|
|
410
|
+
```json
|
|
411
|
+
{
|
|
412
|
+
"type": "TelegramBot",
|
|
413
|
+
"name": "Главный Telegram-бот",
|
|
414
|
+
"botToken": "<TOKEN>",
|
|
415
|
+
"isActive": true,
|
|
416
|
+
"isAiEnabled": true,
|
|
417
|
+
"timezone": "Europe/Moscow",
|
|
418
|
+
|
|
419
|
+
"useDynamicVariables": true,
|
|
420
|
+
"clearDynamicVarsOnHistoryClear": true,
|
|
421
|
+
|
|
422
|
+
"responsibleAssigneeStrategy": "RANDOM_OPERATOR",
|
|
423
|
+
"sendToCrm": false,
|
|
424
|
+
|
|
425
|
+
"sendStartNoteToCrm": true,
|
|
426
|
+
"startNoteTemplate": "Новый лид из Telegram-бота",
|
|
427
|
+
|
|
428
|
+
"sendOperatorTakeoverNoteToCrm": true,
|
|
429
|
+
|
|
430
|
+
"finishAutoEnabled": true,
|
|
431
|
+
"finishAutoDays": 14,
|
|
432
|
+
"sendFinishAutoNoteToCrm": true,
|
|
433
|
+
|
|
434
|
+
"dealMarkerType": "TAG",
|
|
435
|
+
"dealMarkerValue": "telegram-bot"
|
|
436
|
+
}
|
|
437
|
+
```
|
|
438
|
+
|
|
439
|
+
## 8. Inline-пример: SmsGorod для отправки уведомлений
|
|
440
|
+
|
|
441
|
+
```json
|
|
442
|
+
{
|
|
443
|
+
"type": "SmsGorod",
|
|
444
|
+
"name": "SMS-уведомления",
|
|
445
|
+
"smsgorodApiKey": "<KEY>",
|
|
446
|
+
"smsgorodChannel": "CHAR",
|
|
447
|
+
"smsgorodSender": "MyShop",
|
|
448
|
+
"isActive": true,
|
|
449
|
+
"isAiEnabled": false,
|
|
450
|
+
"timezone": "Europe/Moscow"
|
|
451
|
+
}
|
|
452
|
+
```
|
|
453
|
+
|
|
454
|
+
`isAiEnabled=false`: SMS-канал часто не для AI-диалога, а для исходящих уведомлений (через follow-up/кампании).
|
|
455
|
+
|
|
456
|
+
## 9. Inline-пример: Web Widget с UTM-маркетингом
|
|
457
|
+
|
|
458
|
+
```json
|
|
459
|
+
{
|
|
460
|
+
"type": "WebWidget",
|
|
461
|
+
"name": "Виджет на сайте",
|
|
462
|
+
"isActive": true,
|
|
463
|
+
"isAiEnabled": true,
|
|
464
|
+
"timezone": "Europe/Moscow",
|
|
465
|
+
|
|
466
|
+
"webWidgetAllowedOrigins": ["https://shop.example.com", "https://example.com"],
|
|
467
|
+
"webWidgetShowPageInfo": true,
|
|
468
|
+
"webWidgetRateLimitPerMinute": 30,
|
|
469
|
+
|
|
470
|
+
"webWidgetCustomization": {
|
|
471
|
+
"colors": { "primary": "#7B61FF", "background": "#FFFFFF" },
|
|
472
|
+
"position": "bottom-right"
|
|
473
|
+
},
|
|
474
|
+
|
|
475
|
+
"webWidgetMarketingFieldMappings": {
|
|
476
|
+
"utm_source": "<crmFieldId-utm_source>",
|
|
477
|
+
"utm_campaign": "<crmFieldId-utm_campaign>",
|
|
478
|
+
"ymClientId": "<crmFieldId-yandex_client_id>"
|
|
479
|
+
},
|
|
480
|
+
|
|
481
|
+
"webWidgetEntryUrlVariableMapping": {
|
|
482
|
+
"variableName": "first_visit_url"
|
|
483
|
+
}
|
|
484
|
+
}
|
|
485
|
+
```
|
|
486
|
+
|
|
487
|
+
## 10. Граничные случаи и валидация
|
|
488
|
+
|
|
489
|
+
| Правило | Что AI-сервису помнить |
|
|
490
|
+
|---|---|
|
|
491
|
+
| `botToken` обязателен для TelegramBot | Без него `isActive=true` всё равно не сработает. |
|
|
492
|
+
| `wazzupChannel` определяет фичи | На WhatsApp — лимит 24h, на Telegram через Wazzup — нет. |
|
|
493
|
+
| Avito — без кнопок и видео | Не предлагать. |
|
|
494
|
+
| Instagram — только в 24h-окне | Кампании пройдут только тем, кто писал недавно. |
|
|
495
|
+
| WebWidget — нет push-кампаний | Используется только в реальном времени. |
|
|
496
|
+
| SMS — `maxResponseSymbols` критично | LLM может генерировать длинные ответы; для SMS обязательно ограничить (например, 140). |
|
|
497
|
+
| `useCrossPlatformHistory=true` | Требует `UnifiedCustomer`-привязки клиентов. |
|
|
498
|
+
| `finishAutoEnabled=true` | Автозакрытие после `finishAutoDays` дней. Полезно для аналитики «потерянных», но не для активных воронок. |
|
|
499
|
+
| `dealMarkerType=TAG` | Создаёт тег в CRM (например, для атрибуции). |
|
|
500
|
+
| Telegram Personal лимиты | `dailyMessageLimit`, `sendingIntervalMinutes` — иначе бан. |
|
|
501
|
+
| `proxyId` для TG Personal | Желательно — Telegram быстро банит без прокси. |
|
|
502
|
+
|
|
503
|
+
## 11. Связь с другими подсистемами
|
|
504
|
+
|
|
505
|
+
| Подсистема | Связь |
|
|
506
|
+
|---|---|
|
|
507
|
+
| **Агенты** ([`01-agents.md`](01-agents.md)) | Все агенты привязаны к платформе. |
|
|
508
|
+
| **Поведение** ([`10-agent-behavior.md`](10-agent-behavior.md)) | Один `AgentBehavior` на платформу. |
|
|
509
|
+
| **Follow-up** ([`08-follow-up.md`](08-follow-up.md)) | WebWidget — особая логика. Bitrix24Bot — live-проверка. |
|
|
510
|
+
| **Кампании** ([`09-campaigns.md`](09-campaigns.md)) | Не все платформы поддерживают; разные лимиты. |
|
|
511
|
+
| **CRM** ([`12-crm-integration.md`](12-crm-integration.md)) | `sendToCrm`, `dealMarkerType`, `responsibleAssigneeStrategy`, `PlatformAmoChatConfig`. |
|
|
512
|
+
| **Переменные** ([`05-variables.md`](05-variables.md)) | `useDynamicVariables`, `webWidgetEntryUrlVariableMapping`. |
|
|
513
|
+
| **CustomVariable** | Привязаны к платформе через `platformId`. |
|