# Детальная инструкция по настройке n8n workflow для дизайн-блога

## 🔧 МОДУЛЬ 1: Schedule Trigger (Планировщик запуска)

### Создание модуля:
1. **Откройте n8n** в браузере
2. **Создайте новый workflow** (кнопка "New workflow")
3. **Найдите Schedule Trigger**:
   - Нажмите на "+" в левом меню
   - В поиске введите "Schedule"
   - Выберите "Schedule Trigger"
4. **Перетащите** модуль на canvas

### Настройка параметров:
1. **Дважды кликните** на модуль Schedule Trigger
2. **В открывшемся окне найдите**:
   - **Trigger Rules**: выберите `Interval`
   - **Interval**: 
     - Поле "Field": выберите `hours`
     - Поле "Value": введите `6`
3. **Нажмите "Save"**

### Позиция модуля:
- Разместите модуль в левой части canvas (координаты примерно 0, 0)

---

## 🤖 МОДУЛЬ 2: LangChain Code (Генерация контента)

### Создание модуля:
1. **Найдите LangChain Code**:
   - Нажмите на "+" 
   - В поиске введите "LangChain Code"
   - Выберите "LangChain Code"
2. **Перетащите** модуль правее Schedule Trigger

### Настройка Inputs/Outputs:
1. **Дважды кликните** на LangChain Code
2. **Перейдите на вкладку "Inputs"**:
   - Убедитесь, что галочка "Main" стоит ✅
3. **Перейдите на вкладку "Outputs"**:
   - Убедитесь, что галочка "Main" стоит ✅
4. **Перейдите на вкладку "Parameters"**:
   - **Code Mode**: выберите `Execute`

### Настройка Credentials:
1. **В разделе "Credentials"** найдите "OpenAI API"
2. **Если credentials нет**:
   - Нажмите "Create New"
   - Выберите "OpenAI"
   - Введите ваш OpenAI API ключ
   - Назовите: `OpenAi`
   - Нажмите "Save"
3. **Выберите созданный credential**

### Код для вставки:
```javascript
import { ChatOpenAI } from '@langchain/openai';
import { PromptTemplate } from '@langchain/core/prompts';
import { StringOutputParser } from '@langchain/core/output_parsers';

// Получаем API ключ из credentials
const openAiKey = $credentials.openAiApi.apiKey;

const llm = new ChatOpenAI({
  modelName: 'gpt-3.5-turbo',
  temperature: 0.8,
  maxTokens: 200,
  openAIApiKey: openAiKey
});

const prompt = PromptTemplate.fromTemplate(
  `Ты креативный редактор дизайн-блога о современном интерьере.
  
Создай уникальный контент для поста:

ТРЕБОВАНИЯ:
- ТЕМА: максимум 8 слов, современная и привлекательная
- ОПИСАНИЕ: 2-3 предложения, вдохновляющие и полезные
- Используй актуальные тренды дизайна 2024-2025

ФОРМАТ:
ТЕМА: [твоя тема]
ОПИСАНИЕ: [твое описание]`
);

const chain = prompt.pipe(llm).pipe(new StringOutputParser());

try {
  const raw = await chain.invoke({});
  const lines = raw.split('\\n').filter(line => line.trim() !== '');
  
  let tema = '';
  let opisanie = '';
  
  for (const line of lines) {
    if (line.startsWith('ТЕМА:')) {
      tema = line.replace('ТЕМА:', '').trim();
    } else if (line.startsWith('ОПИСАНИЕ:')) {
      opisanie = line.replace('ОПИСАНИЕ:', '').trim();
    }
  }
  
  // Fallback значения
  if (!tema) tema = 'Современный дизайн интерьера';
  if (!opisanie) opisanie = 'Стильное оформление современного дома. Минималистичный подход к созданию уютного пространства.';
  
  // Создаем промпт для генерации изображения
  const imagePrompt = `Modern interior design: ${tema.toLowerCase()}, minimalist style, bright natural lighting, contemporary furniture, clean lines, neutral colors, professional photography, 8k resolution`;
  
  return [{
    json: {
      tema: tema,
      opisanie: opisanie,
      imagePrompt: imagePrompt,
      timestamp: new Date().toISOString()
    }
  }];
  
} catch (error) {
  console.error('Ошибка в LangChain:', error);
  return [{
    json: {
      tema: 'Современный дизайн интерьера',
      opisanie: 'Стильное оформление современного дома. Минималистичный подход к созданию уютного пространства.',
      imagePrompt: 'Modern interior design: contemporary home, minimalist style, bright natural lighting, 8k resolution',
      timestamp: new Date().toISOString(),
      error: error.message
    }
  }];
}
```

### Финальные действия:
1. **Скопируйте код** выше
2. **Вставьте в поле "Add Code"**
3. **Нажмите "Save"**

---

## 🎨 МОДУЛЬ 3: Replicate SDXL (Генерация изображения)

### Создание модуля:
1. **Найдите HTTP Request**:
   - Нажмите на "+"
   - В поиске введите "HTTP Request"
   - Выберите "HTTP Request"
2. **Перетащите** модуль правее LangChain Code
3. **Переименуйте** в "Replicate SDXL"

### Настройка HTTP Request:
1. **Дважды кликните** на модуль
2. **Основные параметры**:
   - **Method**: выберите `POST`
   - **URL**: введите `https://api.replicate.com/v1/predictions`

### Настройка Authentication:
1. **Authentication**: выберите `Generic Credential Type`
2. **Generic Auth Type**: выберите `Http Header Auth`
3. **Credential for HTTP Header Auth**:
   - Нажмите "Create New"
   - **Name**: `ReplicateApi`
   - **Header Name**: `Authorization`
   - **Header Value**: `Token YOUR_REPLICATE_TOKEN` (замените на ваш токен)
   - Нажмите "Save"

### Настройка Headers:
1. **Send Headers**: включите ✅
2. **Header Parameters**:
   - Нажмите "Add Parameter"
   - **Name**: `Authorization`
   - **Value**: `=Token {{ $credentials.httpHeaderAuth.token }}`

### Настройка Body:
1. **Send Body**: включите ✅
2. **Body Content Type**: выберите `JSON`
3. **JSON Body** (скопируйте точно):
```json
={{ JSON.stringify({
  version: 'ac732df83cea7fff18b8472768c88ad041fa750ff7682a21affe81863cbe77e4',
  input: {
    prompt: $json.imagePrompt,
    width: 1024,
    height: 1024,
    num_inference_steps: 50,
    guidance_scale: 7.5,
    negative_prompt: 'blurry, low quality, distorted, ugly, bad composition'
  }
}) }}
```

4. **Нажмите "Save"**

---

## ⏰ МОДУЛЬ 4: Wait 20s (Пауза для обработки)

### Создание модуля:
1. **Найдите Wait**:
   - Нажмите на "+"
   - В поиске введите "Wait"
   - Выберите "Wait"
2. **Перетащите** модуль правее Replicate SDXL

### Настройка параметров:
1. **Дважды кликните** на модуль
2. **Параметры**:
   - **Amount**: введите `20`
   - **Unit**: выберите `seconds`
3. **Нажмите "Save"**

---

## 📥 МОДУЛЬ 5: Fetch Result (Получение результата)

### Создание модуля:
1. **Найдите HTTP Request**:
   - Нажмите на "+"
   - В поиске введите "HTTP Request"
   - Выберите "HTTP Request"
2. **Перетащите** модуль правее Wait
3. **Переименуйте** в "Fetch Result"

### Настройка HTTP Request:
1. **Дважды кликните** на модуль
2. **Основные параметры**:
   - **Method**: выберите `GET`
   - **URL**: `={{ $('Replicate SDXL').first().json.urls.get }}`

### Настройка Authentication:
1. **Authentication**: выберите `Generic Credential Type`
2. **Generic Auth Type**: выберите `Http Header Auth`
3. **Credential**: выберите ранее созданный `ReplicateApi`

### Настройка Headers:
1. **Send Headers**: включите ✅
2. **Header Parameters**:
   - Нажмите "Add Parameter"
   - **Name**: `Authorization`
   - **Value**: `=Token {{ $credentials.httpHeaderAuth.token }}`

3. **Нажмите "Save"**

---

## ✅ МОДУЛЬ 6: If Success? (Проверка успешности)

### Создание модуля:
1. **Найдите If**:
   - Нажмите на "+"
   - В поиске введите "If"
   - Выберите "If"
2. **Перетащите** модуль правее Fetch Result
3. **Переименуйте** в "If Success?"

### Настройка условий:
1. **Дважды кликните** на модуль
2. **Conditions**:
   - **Left Value**: `={{ $json.status }}`
   - **Operation**: выберите `equals`
   - **Right Value**: `succeeded`

### Дополнительные настройки:
1. **В разделе "Options"**:
   - **Case Sensitive**: включите ✅
   - **Type Validation**: выберите `strict`
2. **Combinator**: оставьте `and`

3. **Нажмите "Save"**

---

## 📱 МОДУЛЬ 7: Telegram Photo (Отправка в Telegram)

### Создание модуля:
1. **Найдите Telegram**:
   - Нажмите на "+"
   - В поиске введите "Telegram"
   - Выберите "Telegram"
2. **Перетащите** модуль правее If Success?

### Настройка Credentials:
1. **Перед настройкой создайте Telegram бота**:
   - Откройте Telegram
   - Найдите @BotFather
   - Отправьте `/newbot`
   - Следуйте инструкциям
   - Скопируйте полученный токен

2. **В n8n создайте credential**:
   - **Credential for Telegram**: нажмите "Create New"
   - **Access Token**: вставьте токен бота
   - **Name**: `TelegramBot`
   - Нажмите "Save"

### Настройка параметров:
1. **Дважды кликните** на модуль Telegram
2. **Основные параметры**:
   - **Operation**: выберите `Send Photo`
   - **Chat ID**: `@YOUR_CHANNEL_NAME` (замените на ваш канал)
   - **Photo**: `={{ $json.output[0] }}`

3. **Additional Fields**:
   - Нажмите "Add Field"
   - Выберите "Caption"
   - **Caption**: `={{ $('LangChain Code').first().json.tema + '\n\n' + $('LangChain Code').first().json.opisanie }}`

4. **Нажмите "Save"**

---

## 🔗 СОЕДИНЕНИЕ МОДУЛЕЙ

### Пошаговое соединение:
1. **Schedule Trigger → LangChain Code**:
   - Наведите на Schedule Trigger
   - Потяните от правого кружка к LangChain Code

2. **LangChain Code → Replicate SDXL**:
   - Наведите на LangChain Code
   - Потяните от правого кружка к Replicate SDXL

3. **Replicate SDXL → Wait 20s**:
   - Соедините аналогично

4. **Wait 20s → Fetch Result**:
   - Соедините аналогично

5. **Fetch Result → If Success?**:
   - Соедините аналогично

6. **If Success? → Telegram Photo**:
   - Наведите на If Success?
   - Потяните от **ВЕРХНЕГО** кружка (True) к Telegram Photo

---

## 🧪 ТЕСТИРОВАНИЕ

### Тест отдельных модулей:
1. **Нажмите на Schedule Trigger**
2. **Нажмите "Test step"**
3. **Проверьте результат**
4. **Повторите для каждого модуля**

### Тест всего workflow:
1. **Нажмите кнопку "Execute Workflow"**
2. **Дождитесь завершения**
3. **Проверьте результаты в каждом модуле**

---

## 🚀 АКТИВАЦИЯ

### Включение автоматического режима:
1. **В правом верхнем углу** переключите "Inactive" на "Active"
2. **Workflow начнет работать** каждые 6 часов

### Важные проверки:
- ✅ Все credentials созданы и работают
- ✅ Telegram канал существует и бот добавлен
- ✅ API ключи действительны
- ✅ Все модули успешно тестируются

---

## 🔧 TROUBLESHOOTING

### Частые ошибки:
1. **"Cannot find module"** - проверьте, что LangChain включен в n8n
2. **"Invalid API key"** - проверьте все API ключи
3. **"Chat not found"** - убедитесь, что бот добавлен в канал
4. **"Timeout"** - увеличьте время ожидания в Wait модуле

### Если что-то не работает:
1. **Проверьте логи** в каждом модуле
2. **Тестируйте модули по отдельности**
3. **Убедитесь в корректности всех полей**