Разработка AI-плагина для Bitrix24
Bitrix24 — популярная CRM в России и СНГ с возможностью расширений через Marketplace приложения. AI-плагин добавляет: суммаризацию звонков и писем, автоматическую заполнение полей CRM из разговора, генерацию коммерческих предложений, AI-подсказки менеджерам.
Архитектура Bitrix24 приложения
Bitrix24 приложения работают через:
- REST API (webhooks, OAuth 2.0)
- Placement — встраивание UI в интерфейс Bitrix24
- Events — реакция на события (новый лид, изменение сделки)
# webhook_handler.py — обработка событий Bitrix24
from flask import Flask, request, jsonify
from anthropic import Anthropic
import requests
app = Flask(__name__)
client = Anthropic()
BITRIX_URL = "https://your-domain.bitrix24.ru/rest"
BITRIX_TOKEN = "your-webhook-token"
def bitrix_api(method: str, params: dict) -> dict:
"""Вызов Bitrix24 REST API"""
response = requests.post(
f"{BITRIX_URL}/{BITRIX_TOKEN}/{method}/",
json=params,
)
return response.json().get("result", {})
@app.route("/webhook/call-ended", methods=["POST"])
def on_call_ended():
"""Обработчик завершения звонка"""
data = request.json
call_id = data.get("data", {}).get("CALL_ID")
crm_entity_id = data.get("data", {}).get("CRM_ENTITY_ID")
# Получаем транскрипцию звонка
call_info = bitrix_api("voximplant.statistic.get", {"CALL_ID": call_id})
transcript = call_info.get("TRANSCRIPT", "")
if not transcript:
return jsonify({"status": "no transcript"})
# AI-суммаризация
summary = summarize_call(transcript)
# Записываем в CRM как активность
bitrix_api("crm.activity.add", {
"fields": {
"OWNER_TYPE_ID": 2, # 2 = Contact, 3 = Company
"OWNER_ID": crm_entity_id,
"TYPE_ID": 6, # Звонок
"SUBJECT": "Суммаризация звонка (AI)",
"DESCRIPTION": summary["text"],
"DESCRIPTION_TYPE": 1,
}
})
# Извлекаем ключевые данные и обновляем поля сделки
if crm_entity_id:
updates = extract_crm_fields(transcript)
if updates:
bitrix_api("crm.deal.update", {
"id": crm_entity_id,
"fields": updates,
})
return jsonify({"status": "ok"})
def summarize_call(transcript: str) -> dict:
"""Суммаризует транскрипцию звонка"""
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=1024,
system="""Суммаризируй переговоры по продажам.
Формат:
- Краткое резюме (2-3 предложения)
- Ключевые договорённости
- Следующие шаги
- Возражения клиента""",
messages=[{
"role": "user",
"content": f"Транскрипция звонка:\n{transcript}"
}]
)
return {"text": response.content[0].text}
def extract_crm_fields(transcript: str) -> dict:
"""Извлекает данные для обновления полей CRM"""
import json
response = client.messages.create(
model="claude-haiku-4-5",
max_tokens=512,
messages=[{
"role": "user",
"content": f"""Извлеки данные из разговора для CRM.
Верни JSON: {{
"TITLE": "название сделки если упоминалось",
"OPPORTUNITY": число (бюджет если упоминался),
"COMMENTS": "важные заметки"
}}
Если поле не упоминалось — не включай его.
Разговор: {transcript[:2000]}"""
}]
)
text = response.content[0].text
try:
return json.loads(text[text.find("{"):text.rfind("}") + 1])
except Exception:
return {}
UI Placement — встраивание в карточку сделки
// placement.js — встроенный виджет в карточку CRM
BX24.init(function() {
// Кнопка "AI-анализ" в карточке сделки
BX24.placement.bind('CRM_DEAL_DETAIL_TAB', {
title: 'AI Помощник',
onClick: function() {
showAIPanel();
}
});
});
async function generateCommercialProposal(dealId) {
// Получаем данные сделки
const deal = await BX24.callMethod('crm.deal.get', { id: dealId });
// Запрос на генерацию КП
const response = await fetch('/ai/generate-proposal', {
method: 'POST',
body: JSON.stringify({ deal: deal.result }),
headers: { 'Content-Type': 'application/json' }
});
const result = await response.json();
// Вставляем КП в поле описания
await BX24.callMethod('crm.deal.update', {
id: dealId,
fields: { COMMENTS: result.proposal }
});
}
Генерация коммерческого предложения
@app.route("/ai/generate-proposal", methods=["POST"])
def generate_proposal():
deal = request.json.get("deal", {})
response = client.messages.create(
model="claude-sonnet-4-5",
max_tokens=2048,
system="""Ты — менеджер по продажам B2B компании.
Создавай профессиональные коммерческие предложения на основе данных сделки.""",
messages=[{
"role": "user",
"content": f"""Создай КП для клиента.
Данные сделки:
- Название: {deal.get('TITLE')}
- Клиент: {deal.get('COMPANY_ID')}
- Сумма: {deal.get('OPPORTUNITY')} {deal.get('CURRENCY_ID')}
- Комментарии: {deal.get('COMMENTS', '')}
Структура КП: приветствие, понимание задачи, предлагаемое решение, выгоды, стоимость, следующий шаг."""
}]
)
return jsonify({"proposal": response.content[0].text})
Практический кейс: отдел продаж 15 менеджеров
Боль: менеджеры тратили 25–40 мин после каждого звонка на заполнение CRM и составление писем-резюме.
Результат: AI автоматически записывает суммаризацию, обновляет поля, предлагает черновик КП.
Метрики: время заполнения CRM после звонка: 30 мин → 5 мин. Конверсия отправленных КП: +12% (качество выросло).
Сроки
- Webhook-обработчик + суммаризация звонков: 3–5 дней
- UI Placement в карточках CRM: 3–5 дней
- Генерация КП: 2–3 дня
- Публикация в Bitrix24 Marketplace: 1–2 недели (ревью)







