Новое Распределяем каналы MAX по категориям и территориям. Читать новость
Загружаем изображение…

🛠 Шаг 2. Сборка рабочего процесса в n8n



Ч.1. Как за час запустить оркестрацию с локальной LLM и n8n

Шаг 1. Событийно-управляемый триггер (Schedule Trigger)
- Trigger Interval: Weeks
- Trigger on Weekdays: Среда
- Trigger at Hour: 13

Шаг 2. Чтение DOCX (Read/Write Files from Disk)
- Operation: Read File(s) From Disk
- File(s) Selector: C:\Users\PC\Desktop\meetings\*.docx
- Options: Put Output File in Field → data

Шаг 3. Извлечение текста (DocuParse)
Community-узел (устанавливается через Settings → Community Nodes → n8n-nodes-liteparse-local)
- Operation: Parse Document
- Input Binary Field: data
- Output Format: Markdown

Шаг 4. Запрос к LM Studio (HTTP Request)
- Method: POST
- URL: http://127.0.0.1:1234/v1/chat/completions
- Headers: Content-Type: application/json
- Body (JSON): (см. полный код ниже)

Шаг 5. Обработка ответа и трансформация данных (Code)
В этом узле:
- Извлекается JSON-массив из ответа модели
- Сопоставляются исполнители и продуктовая линейка (справочные данные)
- Формируются исходящие интеграционные сообщения

Шаг 6. Отправка исходящих сообщений
- Operation: Send a Text Message
- Credentials: токен бота
- Parse Mode: HTML
- Retry on Fail: включить (3 попытки)
- Timeout: 120000 (2 минуты)

📝 Код трансформации данных (узел Code), вайбкодинг

// ===== 1. Получаем ответ от LM Studio =====
const lmResponse = $json;
if (!lmResponse) throw new Error('Нет ответа от LM Studio');

let rawText = '';
if (lmResponse.choices?.[0]?.message?.content) {
rawText = lmResponse.choices[0].message.content;
} else {
rawText = JSON.stringify(lmResponse);
}

// ===== 2. Убираем markdown =====
const jsonMatch = rawText.match(/```json\n([\s\S]*?)\n```/);
let tasks;
if (jsonMatch) {
try {
tasks = JSON.parse(jsonMatch[1]);
} catch (e) {
throw new Error('Ошибка парсинга JSON из markdown: ' + e.message);
}
} else {
const simpleMatch = rawText.match(/\[[\s\S]*\]/);
if (!simpleMatch) throw new Error('Не найден JSON-массив в ответе LM Studio');
try {
tasks = JSON.parse(simpleMatch[0]);
} catch (e) {
throw new Error('Ошибка парсинга JSON: ' + e.message);
}
}

if (!Array.isArray(tasks) || tasks.length === 0) {
throw new Error('Задачи не найдены');
}

// ===== 3. Справочные данные: специалисты =====
const specialists = [
{ name: "Имя_сотрудника_1", tg_id: "@tg_username_1" },
{ name: "Имя_сотрудника_2", tg_id: "@tg_username_2" },
// ... добавьте остальных
];

// ===== 4. Справочные данные: продукты =====
const courses = [
{ name: "Продукт_1", short: "П1" },
{ name: "Продукт_2", short: "П2" },
// ... добавьте остальные
];

// ===== 5. Формируем исходящие сообщения =====
const messages = tasks.flatMap(task => {
let assignees = [];
if (Array.isArray(task.assignee)) {
assignees = task.assignee;
} else if (typeof task.assignee === 'string') {
assignees = [task.assignee];
} else {
assignees = ['Не указан'];
}

return assignees.map(assigneeName => {
const specialist = specialists.find(s =>
assigneeName.toLowerCase().includes(s.name.toLowerCase()) ||
s.name.toLowerCase().includes(assigneeName.toLowerCase())
);
const mention = specialist
? `<a href="tg://user?id=${specialist.tg_id}">${specialist.name}</a>`
: assigneeName;

const courseName = task.course || '';
const course = courses.find(c =>
courseName.toLowerCase().includes(c.name.toLowerCase()) ||
c.name.toLowerCase().includes(courseName.toLowerCase())
);
const courseDisplay = course ? course.short : courseName || 'Не указан';

const taskText = task.task || task.title || task.задача || 'Задача без описания';
const deadline = task.deadline || task.срок || 'Не указан';

return {
chatId: 'Ваш_Chat_ID', // заменить
text: `📋 *Задача:* ${taskText}\n📚 *Курс:* ${courseDisplay}\n👤 Исполнитель: ${mention}\n📅 Дедлайн: ${deadline}`
};
});
});

return messages;


✅ Процесс запущен на постоянной основе.
Просмотры: 44
Открыть в MAX Сообщить о неточности

Сообщить о неточности

Опишите, что нужно исправить. Если есть источник, добавьте ссылку.

Вы покидаете datool.ru

Ссылка ведёт на внешний сайт. datool.ru не отвечает за его содержимое — проверьте адрес, прежде чем вводить пароли или платёжные данные.

Переход через 10 с

Перейти