Темный режим

AI SyncData Workflow

1. Обзор workflow

Workflow для обработки данных опросов сотрудников и генерации аналитических инсайтов.

Названиеai/syncdata
База данныхPostgreSQL (raw_survey_data, questions, translations, employees, surveys)
Основные функцииАнализ ответов, расчет средних значений, генерация инсайтов и рекомендаций
Webhook-узлы2 основных workflow (short и long версии)

2. Основной workflow (short)

Обработка данных опроса и генерация кратких инсайтов и рекомендаций.

Цепочка выполнения:

  1. Execute Workflow Trigger

    Запускает workflow с параметрами:

    • departments_ids - ID отдела (number)
    • survey_token - токен опроса (string)
  2. Edit Fields1

    Подготавливает параметры для запросов:

    query.survey_token = $json.survey_token
    query.departmentId = $json.departments_ids
  3. Find companyID by company token

    Получает ID компании и опроса по токену:

    SELECT "surveyId", "companyId"
    FROM surveys
    WHERE "token" = $1;

    Параметр: $1 = survey_token

  4. Merge1

    Объединяет данные из Edit Fields1 и Find companyID.

  5. Postgres get metrics

    Получает сырые данные ответов на опрос:

    SELECT 
        "paramNameMetric", "value", "userId", 
        "questionId", "comment"
    FROM "raw_survey_data"
    WHERE "surveyId" = $1
    AND ("departmentId" = $2 OR $2 = 1);

    Параметры:

    • $1 = surveyId
    • $2 = departmentId (если 1 - игнорируется фильтр по отделу)

  6. Make average value for question

    Python-код для агрегации данных:

    Основная логика:

    1. Группировка ответов по questionId
    2. Фильтрация некорректных и пустых ответов
    3. Учет пользователей с комментариями (без оценок)
    4. Расчет средних значений по пользователям
    5. Подсчет процента без ответов
    6. Сбор комментариев
    7. Специальная обработка вопроса с ID 123 (пропуск расчета среднего)

    Структура результата:

    {
      "questionId": number,
      "paramNameMetric": string,
      "totalUserCount": number,
      "noAnswerCount": number,
      "noAnswerPercentage": number,
      "comments": string[],
      "averageValue": number (optional)
    }
  7. Postgres find questions names

    Получает названия вопросов и переводы метрик:

    SELECT 
        q."questionId", q."questionRussian", 
        q."paramNameMetric", t."ru" AS "paramNameMetricRu"
    FROM questions q
    LEFT JOIN translations t ON q."paramNameMetric" = t."key";
  8. If

    Проверяет, нужно ли считать сотрудников отдела или всей компании:

    Условие: $json.query.departmentId != 1
  9. Ветка 1 (departmentId != 1):

    1. Postgres employees count

      Считает активных сотрудников отдела:

      SELECT COUNT(*) AS active_employees_count
      FROM employees e
      WHERE e."departmentId" = $1 
      AND e."status" = 'active';
  10. Ветка 2 (departmentId == 1):

    1. Postgres employees count2

      Считает всех респондентов опроса:

      SELECT total_respondents_count as active_employees_count
      FROM surveys
      WHERE "surveyId" = $1;
  11. Merge

    Объединяет данные вопросов с агрегированными ответами.

  12. Merge2

    Добавляет информацию о количестве сотрудников.

  13. Make insight promt

    Генерирует промт для AI с инсайтами:

    Особенности:

    • Формирует детализированный контент по каждому вопросу
    • Учитывает статистику ответов и комментарии
    • Запрашивает инсайты с приоритезацией (important/critical/normal)
    • Формат ответа - JSON с полями text, priority, paramNameMetric, questions, type
  14. Make advice promt

    Генерирует промт для AI с рекомендациями:

    Особенности:

    • Группирует вопросы по paramNameMetric
    • Для каждой метрики формирует отдельный запрос
    • Запрашивает конкретные рекомендации по улучшению
    • Формат ответа аналогичен инсайтам (type=advice)
  15. Merge4

    Объединяет промты для инсайтов и рекомендаций.

  16. HTTP deepseek1

    Отправляет запросы на генерацию AI:

    POST https://api.hroom.ai/webhook/ai/syncdata/gen
    Body: {
      survey_token: $json.query.survey_token,
      departmentId: $json.query.departmentId,
      surveyId: $json.surveyId,
      companyId: $json.companyId,
      request: $json.request
    }

Особенности обработки данных:

  • Специальная обработка вопроса с ID 123 (без расчета среднего)
  • Разделение пользователей на ответивших, не ответивших и оставивших комментарии
  • Поддержка как отдела, так и всей компании (departmentId=1)
  • Использование переводов для метрик вопросов

3. Дополнительный workflow (long)

Генерация расширенных версий инсайтов и рекомендаций на основе AI.

Цепочка выполнения:

  1. Webhook1

    Принимает POST-запрос с параметрами:

    • headers.authorization - токен опроса
    • body.ai_data_id - ID данных для расширения
  2. Edit Fields

    Извлекает параметры:

    token = $json.headers.authorization
    ai_data_id = $json.body.ai_data_id
  3. Find companyID by company token1

    Проверяет токен компании:

    SELECT "companyId"
    FROM companies
    WHERE "token" = $1;
  4. Postgres

    Получает исходные AI-данные для расширения:

    SELECT * 
    FROM raw_ai_data 
    WHERE "id" = $1;
  5. Postgres get metrics 1

    Получает данные опроса для выбранных вопросов:

    SELECT 
        "paramNameMetric", "value", "userId", 
        "questionId", "comment"
    FROM "raw_survey_data"
    WHERE "surveyId" = $1
    AND ("departmentId" = $2 OR $2 = 1)
    AND "questionId" = ANY(ARRAY(SELECT jsonb_array_elements_text($3::jsonb)::integer));

    Параметр $3 - массив ID вопросов из исходных данных

  6. Make average value for question1

    Аналогичная агрегация данных как в основном workflow.

  7. Postgres find questions names1

    Получает названия только для нужных вопросов.

  8. If1

    Аналогичное ветвление для подсчета сотрудников.

  9. Switch

    Разделяет обработку для инсайтов и рекомендаций:

    Условия:
    1. $json.type == "insight" → Make insight long
    2. $json.type == "advice" → Make advice long
  10. Ветка 1 (insight):

    1. Make insight long

      Генерирует расширенную версию инсайта:

      Особенности:

      • Использует короткий инсайт как основу
      • Добавляет детализированную аналитику
      • Форматирует ответ в HTML с тегами для читаемости
      • Объем ~5000 символов
  11. Ветка 2 (advice):

    1. Make advice long

      Генерирует расширенную версию рекомендации:

      Особенности:

      • Группирует по метрикам (paramNameMetric)
      • Предоставляет конкретные инструкции по улучшению
      • Использует HTML-форматирование с списками
      • Объем ~5000 символов на метрику
  12. HTTP deepseek

    Отправляет запрос на генерацию расширенного контента:

    POST https://api.hroom.ai/webhook/ai/syncdata/deepseek/long
    Body: {
      survey_token: $json.headers.authorization,
      request: $json.request,
      ai_data_id: $json.body.ai_data_id
    }
  13. Respond to Webhook

    Возвращает сгенерированный контент.

Отличия от основного workflow:

  • Работает только с выбранными вопросами из исходных данных
  • Генерирует более детализированный контент
  • Использует HTML-форматирование для лучшей читаемости
  • Принимает ID существующих данных для расширения

4. Общие компоненты

Структура БД

Таблица raw_survey_data

  • surveyId - ID опроса
  • departmentId - ID отдела
  • questionId - ID вопроса
  • userId - ID пользователя
  • value - значение ответа
  • comment - текстовый комментарий
  • paramNameMetric - метрика вопроса

Таблица questions

  • questionId - ID вопроса
  • questionRussian - текст вопроса
  • paramNameMetric - ключ метрики

Таблица translations

  • key - ключ перевода
  • ru - русский перевод

Таблица employees

  • departmentId - ID отдела
  • status - статус сотрудника

Таблица surveys

  • surveyId - ID опроса
  • token - токен доступа
  • companyId - ID компании
  • total_respondents_count - общее количество респондентов

Особенности обработки данных

  • Специальная обработка вопроса с ID 123 (без расчета среднего)
  • Раздельный учет пользователей с оценками, без ответов и с комментариями
  • Поддержка как отдела, так и всей компании (departmentId=1)
  • Использование параметризованных запросов для безопасности