[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"docs-recipes\u002Fai-assistant":3,"docs-tabs-recipes\u002Fai-assistant":6},{"content":4,"lastmod":5},"# AI-ассистент с OpenAI\n\n🧠 **Сложность:** advanced | **Скоупы:** crm, task | **Стек:** Node.js, openai SDK\n\n## Что делаем\nСоздаём интеллектуального помощника, который анализирует историю сделки в CRM (активности, таймлайн) с помощью GPT и предлагает следующее действие. На основе рекомендации ассистент автоматически создаёт задачу с конкретным описанием. Это ускоряет работу менеджеров и повышает конверсию сделок.\n\n## Необходимо\n- API-ключ Вайбкод с правами `crm, task`\n- OpenAI API Key\n- Node.js 18+\n- Пакеты: `openai`\n\n## Полный код\n```javascript\n\u002F\u002F ai-crm-assistant.js\n\u002F\u002F AI-ассистент: анализирует сделку и создаёт задачу с рекомендацией\n\nimport OpenAI from 'openai';\n\nconst API_KEY = process.env.VIBE_API_KEY;\nconst BASE_URL = process.env.VIBE_BASE_URL;\nconst OPENAI_API_KEY = process.env.OPENAI_API_KEY;\n\nconst openai = new OpenAI({ apiKey: OPENAI_API_KEY });\n\nconst HEADERS = {\n  'X-Api-Key': API_KEY,\n  'Content-Type': 'application\u002Fjson',\n};\n\n\u002F\u002F Получаем данные сделки через Entity API\nasync function getDeal(dealId) {\n  const response = await fetch(`${BASE_URL}\u002Fv1\u002Fdeals\u002F${dealId}`, {\n    headers: { 'X-Api-Key': API_KEY },\n  });\n\n  const { data } = await response.json();\n  return data;\n}\n\n\u002F\u002F Получаем активности сделки через Entity API\nasync function getDealActivities(dealId) {\n  const response = await fetch(`${BASE_URL}\u002Fv1\u002Factivities\u002Fsearch`, {\n    method: 'POST',\n    headers: HEADERS,\n    body: JSON.stringify({\n      filter: {\n        ownerTypeId: 2, \u002F\u002F Сделка\n        ownerId: dealId,\n      },\n      select: ['id', 'subject', 'description', 'typeId', 'createdAt', 'completed'],\n      sort: { createdAt: 'desc' },\n    }),\n  });\n\n  const { data } = await response.json();\n  return data || [];\n}\n\n\u002F\u002F Отправляем контекст сделки в GPT для анализа\nasync function analyzeWithGPT(deal, activities) {\n  \u002F\u002F Формируем текстовое описание истории сделки\n  const activitiesText = activities\n    .map((item) => {\n      const status = item.completed ? 'завершено' : 'в работе';\n      return `- [${item.createdAt}] ${item.subject} (${status})`;\n    })\n    .join('\\n');\n\n  const prompt = `Ты — опытный менеджер по продажам. Проанализируй сделку и предложи конкретное следующее действие.\n\nСделка:\n- Название: ${deal.title}\n- Стадия: ${deal.stageId}\n- Сумма: ${deal.amount} ${deal.currency}\n- Дата создания: ${deal.createdAt}\n\nИстория активностей:\n${activitiesText || 'Активностей пока нет'}\n\nОтветь в формате JSON:\n{\n  \"analysis\": \"краткий анализ текущей ситуации (2-3 предложения)\",\n  \"nextAction\": \"конкретное следующее действие\",\n  \"taskTitle\": \"заголовок задачи для менеджера\",\n  \"taskDescription\": \"подробное описание задачи\",\n  \"priority\": \"high\u002Fmedium\u002Flow\",\n  \"deadlineDays\": число дней на выполнение\n}`;\n\n  const completion = await openai.chat.completions.create({\n    model: 'gpt-4o',\n    messages: [{ role: 'user', content: prompt }],\n    response_format: { type: 'json_object' },\n    temperature: 0.3,\n  });\n\n  return JSON.parse(completion.choices[0].message.content);\n}\n\n\u002F\u002F Создаём задачу через Entity API\nasync function createTask(recommendation, dealId, responsibleId) {\n  const deadline = new Date();\n  deadline.setDate(deadline.getDate() + (recommendation.deadlineDays || 3));\n\n  const priorityMap = { high: 2, medium: 1, low: 0 };\n\n  const response = await fetch(`${BASE_URL}\u002Fv1\u002Ftasks`, {\n    method: 'POST',\n    headers: HEADERS,\n    body: JSON.stringify({\n      title: `[AI] ${recommendation.taskTitle}`,\n      description: [\n        recommendation.taskDescription,\n        '',\n        '---',\n        `Анализ AI: ${recommendation.analysis}`,\n        `Сделка ID: ${dealId}`,\n      ].join('\\n'),\n      responsibleId: responsibleId,\n      priority: priorityMap[recommendation.priority] || 1,\n      deadline: deadline.toISOString(),\n      ufCrmTask: [`D_${dealId}`], \u002F\u002F Привязка к сделке\n    }),\n  });\n\n  const { data } = await response.json();\n  return data;\n}\n\n\u002F\u002F Основная функция: анализ сделки и создание задачи\nasync function processDeal(dealId) {\n  console.log(`\\n📋 Загружаем сделку #${dealId}...`);\n  const deal = await getDeal(dealId);\n\n  if (!deal) {\n    console.error('Сделка не найдена');\n    return;\n  }\n\n  console.log(`   Название: ${deal.title}`);\n  console.log(`   Стадия: ${deal.stageId}, Сумма: ${deal.amount}`);\n\n  console.log('📜 Загружаем историю активностей...');\n  const activities = await getDealActivities(dealId);\n  console.log(`   Найдено активностей: ${activities.length}`);\n\n  console.log('🧠 Анализируем с помощью GPT...');\n  const recommendation = await analyzeWithGPT(deal, activities);\n\n  console.log('\\n💡 Рекомендация AI:');\n  console.log(`   Анализ: ${recommendation.analysis}`);\n  console.log(`   Действие: ${recommendation.nextAction}`);\n  console.log(`   Приоритет: ${recommendation.priority}`);\n\n  console.log('\\n📝 Создаём задачу...');\n  const task = await createTask(recommendation, dealId, deal.assignedById);\n  console.log(`   Задача создана, ID: ${task.id}`);\n}\n\n\u002F\u002F Запуск: передаём ID сделки аргументом\nconst dealId = process.argv[2];\nif (!dealId) {\n  console.log('Использование: node ai-crm-assistant.js \u003CDEAL_ID>');\n  process.exit(1);\n}\n\nprocessDeal(dealId).catch(console.error);\n```\n\n## Как это работает\n1. Скрипт принимает ID сделки и загружает её данные через Entity API (`GET \u002Fv1\u002Fdeals\u002F:id`).\n2. Далее через Entity API (`POST \u002Fv1\u002Factivities\u002Fsearch`) запрашиваются активности сделки — звонки, письма, встречи, комментарии.\n3. Вся информация о сделке и её истории формируется в промпт и отправляется в GPT-4o с запросом на анализ и рекомендацию.\n4. GPT возвращает структурированный JSON с анализом ситуации, рекомендованным действием и параметрами задачи.\n5. На основе ответа GPT автоматически создаётся задача через Entity API (`POST \u002Fv1\u002Ftasks`), привязанная к сделке.\n6. Задача назначается ответственному менеджеру из сделки с дедлайном и приоритетом по рекомендации AI.\n\n## Что можно улучшить\n- Запускать анализ автоматически при смене стадии сделки (через polling или webhooks)\n- Добавить память: сохранять предыдущие рекомендации и учитывать их при следующем анализе\n- Использовать Function Calling в OpenAI для более точного управления действиями (создание звонков, писем)\n- Добавить Slack\u002FTelegram уведомление менеджеру с кратким описанием рекомендации\n","2026-06-24",{}]