🗺 Plan-11: Генеральный план EastPay v2 — от текущей точки до финальной версии
Версия: 1.0 | Дата: 2026-02-11 Автор: AI-архитектор | Статус: На утверждении
📍 Текущая точка (Baseline)
Что имеем
| Компонент | Текущее состояние | Проблемы |
|---|---|---|
| n8n Workflow | 1153 строк JSON, 5 веток (text/voice/photo/video/start) | Базовый system prompt inline, нет RAG, нет error handling |
| LLM | OpenRouter gpt-4o-mini |
Слабая модель для сложных финансовых диалогов |
| Memory | Simple Memory (RAM, 50 сообщений) | Теряется при перезагрузке n8n |
| Tools | 5 штук: get_rates, calculate_deal, create_order, get_locations, log_chat |
Нет RAG-поиска, нет tool descriptions |
| System Prompt | Inline в JSON, ~20 строк, базовый | Не используется v3 промпт (136 строк) |
| Supabase | 12 таблиц, pgvector установлен, documents пустая |
Нет HNSW индекса, нет match_documents RPC |
| Edge Functions | 2 штуки: invite-user, logger-service |
Нет embed, нет sync-chat-to-telegram |
| Telegram Bot | Webhook → n8n, Welcome с ссылкой на сайт | Нет Mini App кнопки (web_app), нет /help, /menu |
| Промпт | v3 написан (136 строк), но не интегрирован в n8n | Живёт только в docs/Promts |
Что уже сделано (предыдущие сессии)
- Техническая документация (1355 строк, Section 12: RAG)
- Раздел 12 с полной RAG-архитектурой
- match_documents RPC спроектирован
- Embedding pipeline описан
- Roadmap обновлён (RAG → Phase 2)
🎯 Финальная цель
Telegram-бот EastPay, который:
- Понимает голос, текст, фото, видео
- Имеет долгосрочную память (Supabase)
- Использует RAG для ответов на вопросы о компании
- Говорит по-человечески (v4 промпт)
- Открывает Mini App внутри бота
- Синхронизирует чат с ЛК менеджера
- Имеет follow-up и ретеншн-систему
📐 Архитектура: финальная картина
flowchart TB
subgraph TG["📱 Telegram"]
USER["👤 Клиент"]
BOT["🤖 EastPay Bot"]
MINIAPP["📲 Mini App (React)"]
end
subgraph N8N["⚙️ n8n Workflow"]
TRIGGER["Telegram Trigger\n(Webhook)"]
SWITCH["Switch\n(text/voice/photo/video/start/command)"]
RAG_NODE["RAG Retrieval\n(Supabase RPC)"]
AGENT["AI Agent\n(GPT-4o)"]
MEMORY["Supabase Memory\n(messages table)"]
TOOLS["Tools:\nrates, deal, order,\nlocations, log, rag_search"]
SEND["Send to Telegram"]
SAVE["Save to messages"]
end
subgraph SUPA["🗄 Supabase"]
DB_TABLES["clients, orders,\nlocations, daily_rates"]
MESSAGES["messages\n(chat history)"]
DOCUMENTS["documents\n(embeddings + RAG)"]
EDGE_FN["Edge Functions:\nembed, sync-chat,\nrate-alert"]
CRON["pg_cron:\nrate-check, follow-up"]
end
USER -->|"text/voice/photo"| BOT
BOT -->|"webhook"| TRIGGER
TRIGGER --> SWITCH
SWITCH -->|"text"| RAG_NODE
RAG_NODE -->|"context + query"| AGENT
AGENT <-->|"read/write"| MEMORY
AGENT <-->|"call"| TOOLS
TOOLS <-->|"SQL/RPC"| DB_TABLES
AGENT --> SEND
SEND -->|"reply"| BOT
AGENT --> SAVE
SAVE -->|"insert"| MESSAGES
BOT <-->|"web_app"| MINIAPP
MINIAPP <-->|"API"| SUPA
EDGE_FN <-->|"embed/notify"| DOCUMENTS
CRON -->|"scheduled"| EDGE_FN
📋 ЭТАПЫ РЕАЛИЗАЦИИ
ЭТАП 0: Промпт v4 + n8n Hardening
Цель: Поднять качество диалога с «бот в обменнике» до «живой эксперт финансового консьержа»
0.1. Создать промпт v4 на базе v3
Файл: docs/Promts/4-version-promt.md
Что добавить к v3:
| Блок | Что добавляем | Почему |
|---|---|---|
| RAG-инструкции | Блок "Перед ответом проверь базу знаний через rag_search_tool" |
v3 не знает про RAG |
| Tool descriptions | Расширенные описания для каждого из 6 инструментов | LLM лучше использует инструменты с детальными описаниями |
| Контекст клиента | Шаблон {{ telegram_username }}, {{ first_name }} |
Персонализация |
| Фазы квалификации | Слить v2 §4 (алгоритм) + v3 §8 (runbook) | Сейчас в v3 пустое "без изменений" |
| Compliance v2 | Конкретные пороги: <$1000 = упрощённый, >$5000 = полный KYC | v3 пустое "без изменений" |
| Escape-вентили | "Если не знаешь — скажи 'уточню у коллег'" | Снижает галлюцинации |
| Multi-turn | "Не задавай все вопросы сразу, максимум 1-2 за сообщение" | UX |
Структура финального промпта:
§0 РОЛЬ (v3 без изменений)
§1 ЧЕЛОВЕЧЕСКИЙ СТИЛЬ (v3 §1)
§2 ПОЗИЦИОНИРОВАНИЕ (v3 §2)
§3 КАТЕГОРИИ ИНТЕНТОВ (v3 §3 + развёрнутые примеры)
§4 COMPLIANCE (v2 §3 + конкретные пороги)
§5 ДАННЫЕ ДЛЯ СБОРА (v2 §4)
§6 ИНСТРУМЕНТЫ — детальные описания (НОВОЕ)
- get_rates_tool: описание + формат вызова + формат ответа
- calculate_deal_tool: аналогично
- create_order_tool: + обязательные поля + валидация
- get_locations_tool: + что делать, если города нет
- log_chat_tool: + когда вызывать (тихо, после каждого этапа)
- rag_search_tool: НОВЫЙ — когда и зачем искать в базе знаний
§7 ПРАВИЛА КУРСА (v3 §7)
§8 RUNBOOK (v2 §4 алгоритм, слитый с v3 §8)
§9 ШАБЛОНЫ ФРАЗ (v3 §9)
§10 ПРИМЕРЫ (v3 §10 + 3 новых сценария)
§11 ИМЯ/ОБРАЩЕНИЕ (v3 §11)
§12 ДАТА/ВРЕМЯ (v3 §12)
§13 CRITICAL (v3 §13 + RAG правило)
0.2. Модернизировать n8n Workflow
Файл: n8n/Telegram AI Agent Base.json → n8n/Telegram AI Agent v2.json
| # | Изменение | Деталь |
|---|---|---|
| 1 | System Prompt → v4 | Заменить 20-строчный inline prompt на полный v4 (используем n8n expression для подстановки {{ $now }}, telegram_id, first_name) |
| 2 | LLM → GPT-4o | openai/gpt-4o вместо openai/gpt-4o-mini (финансовые диалоги требуют мощной модели) |
| 3 | +Error Handler | Добавить Error Trigger → Telegram "Извините, произошла ошибка. Менеджер свяжется с вами." |
| 4 | +Typing indicator | sendChatAction("typing") перед AI Agent |
| 5 | Switch → +commands | Добавить ветки для /help, /menu, /rates, /status |
| 6 | Welcome Message | Заменить ссылку на сайт → web_app кнопка Mini App |
| 7 | Tool descriptions | Добавить description к каждому toolName в JSON |
0.3. Добавить команды бота
| Команда | Действие |
|---|---|
/start |
Welcome + Mini App кнопка + inline keyboard |
/help |
"Я помогу с обменом валют. Напишите город и сумму." |
/rates |
Быстрый вызов get_rates_tool → форматированный ответ |
/menu |
Inline keyboard: Курсы / Обмен / Поддержка / Mini App |
/status |
Статус последней заявки клиента |
ЭТАП 1: Supabase — фундамент данных
Цель: Подготовить БД для персистентной памяти и RAG
1.1. Миграции БД
-- 1. Таблица conversations
CREATE TABLE conversations (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
client_id UUID REFERENCES clients(id),
telegram_chat_id BIGINT NOT NULL,
status TEXT DEFAULT 'active', -- active | archived | escalated
started_at TIMESTAMPTZ DEFAULT now(),
last_message_at TIMESTAMPTZ DEFAULT now(),
metadata JSONB DEFAULT '{}'
);
-- 2. Таблица messages (персистентная память)
CREATE TABLE messages (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
conversation_id UUID REFERENCES conversations(id),
role TEXT NOT NULL CHECK (role IN ('user', 'assistant', 'system', 'manager')),
content TEXT NOT NULL,
metadata JSONB DEFAULT '{}',
created_at TIMESTAMPTZ DEFAULT now()
);
CREATE INDEX idx_messages_conversation ON messages(conversation_id, created_at);
CREATE INDEX idx_messages_role ON messages(role);
-- 3. Расширение documents
ALTER TABLE documents
ADD COLUMN IF NOT EXISTS created_at TIMESTAMPTZ DEFAULT now(),
ADD COLUMN IF NOT EXISTS updated_at TIMESTAMPTZ DEFAULT now(),
ADD COLUMN IF NOT EXISTS source TEXT DEFAULT 'manual',
ADD COLUMN IF NOT EXISTS is_active BOOLEAN DEFAULT true,
ADD COLUMN IF NOT EXISTS category TEXT;
-- 4. HNSW индекс
CREATE INDEX idx_documents_embedding_hnsw
ON documents
USING hnsw (embedding vector_cosine_ops)
WITH (m = 16, ef_construction = 64);
-- 5. Full-text search column
ALTER TABLE documents ADD COLUMN IF NOT EXISTS fts tsvector
GENERATED ALWAYS AS (to_tsvector('russian', coalesce(content, ''))) STORED;
CREATE INDEX idx_documents_fts ON documents USING gin(fts);
1.2. RPC Functions
-- match_documents (семантический поиск)
CREATE OR REPLACE FUNCTION match_documents(
query_embedding vector(1536),
match_threshold float DEFAULT 0.78,
match_count int DEFAULT 5,
filter_category text DEFAULT NULL
)
RETURNS TABLE (id bigint, content text, metadata jsonb, similarity float)
LANGUAGE plpgsql AS $$
BEGIN
RETURN QUERY
SELECT d.id, d.content, d.metadata,
1 - (d.embedding <=> query_embedding) AS similarity
FROM documents d
WHERE d.is_active = true
AND 1 - (d.embedding <=> query_embedding) > match_threshold
AND (filter_category IS NULL OR d.metadata->>'category' = filter_category)
ORDER BY d.embedding <=> query_embedding
LIMIT match_count;
END;
$$;
-- save_chat_message
CREATE OR REPLACE FUNCTION save_chat_message(
p_telegram_chat_id BIGINT,
p_role TEXT,
p_content TEXT,
p_metadata JSONB DEFAULT '{}'
)
RETURNS UUID
LANGUAGE plpgsql AS $$
DECLARE
v_conversation_id UUID;
v_message_id UUID;
BEGIN
-- Найти или создать conversation
SELECT id INTO v_conversation_id
FROM conversations
WHERE telegram_chat_id = p_telegram_chat_id AND status = 'active'
ORDER BY last_message_at DESC LIMIT 1;
IF v_conversation_id IS NULL THEN
INSERT INTO conversations (telegram_chat_id)
VALUES (p_telegram_chat_id)
RETURNING id INTO v_conversation_id;
END IF;
-- Сохранить сообщение
INSERT INTO messages (conversation_id, role, content, metadata)
VALUES (v_conversation_id, p_role, p_content, p_metadata)
RETURNING id INTO v_message_id;
-- Обновить timestamp
UPDATE conversations SET last_message_at = now()
WHERE id = v_conversation_id;
RETURN v_message_id;
END;
$$;
-- get_conversation_history
CREATE OR REPLACE FUNCTION get_conversation_history(
p_telegram_chat_id BIGINT,
p_limit INT DEFAULT 20
)
RETURNS TABLE (role TEXT, content TEXT, created_at TIMESTAMPTZ)
LANGUAGE plpgsql AS $$
BEGIN
RETURN QUERY
SELECT m.role, m.content, m.created_at
FROM messages m
JOIN conversations c ON c.id = m.conversation_id
WHERE c.telegram_chat_id = p_telegram_chat_id
AND c.status = 'active'
ORDER BY m.created_at DESC
LIMIT p_limit;
END;
$$;
1.3. RLS Policies
ALTER TABLE conversations ENABLE ROW LEVEL SECURITY;
ALTER TABLE messages ENABLE ROW LEVEL SECURITY;
-- Service role full access (для n8n)
CREATE POLICY "service_role_all_conversations" ON conversations
FOR ALL USING (auth.role() = 'service_role');
CREATE POLICY "service_role_all_messages" ON messages
FOR ALL USING (auth.role() = 'service_role');
ЭТАП 2: RAG Pipeline (3-4 дня)
Цель: Наполнить базу знаний и подключить семантический поиск
2.1. Edge Function embed
Путь: supabase/functions/embed/index.ts
Логика:
1. Получает document_id из pgmq очереди
2. Загружает content из documents
3. Вызывает OpenAI text-embedding-3-small
4. Записывает embedding в documents.embedding
5. Обновляет updated_at
2.2. Наполнение Knowledge Base
| # | Категория | Контент | Кол-во |
|---|---|---|---|
| 1 | company_info |
О компании, миссия, преимущества, легальность | ~5 |
| 2 | service_docs |
Описания услуг: обмен, перестановка, ВЭД, инвойсы | ~5 |
| 3 | rate_context |
Как читать курсы, что такое спред, фиксация | ~3 |
| 4 | location_info |
Описания хабов: Москва, Дубай, Пхукет, СПб | ~5 |
| 5 | compliance |
AML правила, KYC, лимиты, требования по документам | ~4 |
| 6 | faq |
Частые вопросы клиентов + ответы | ~8 |
| Итого | ~30 |
2.3. Триггер auto-embedding
-- Триггер: при INSERT/UPDATE documents → отправить в pgmq
CREATE OR REPLACE FUNCTION queue_document_for_embedding()
RETURNS TRIGGER AS $$
BEGIN
PERFORM pgmq.send('embed_queue', jsonb_build_object(
'document_id', NEW.id,
'action', TG_OP
));
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER trg_documents_embed
AFTER INSERT OR UPDATE OF content ON documents
FOR EACH ROW EXECUTE FUNCTION queue_document_for_embedding();
2.4. pg_cron для обработки очереди
SELECT cron.schedule(
'process-embed-queue',
'*/1 * * * *', -- каждую минуту
$$SELECT net.http_post(
url := 'https://cvzsgjksswowqgfxvrsb.supabase.co/functions/v1/embed',
headers := '{"Authorization": "Bearer <SERVICE_ROLE_KEY>"}'::jsonb
);$$
);
ЭТАП 3: n8n ↔ Supabase Memory + RAG
Цель: Заменить Simple Memory на Supabase, подключить RAG
3.1. Заменить Simple Memory
БЫЛО:
Simple Memory (RAM, 50 messages, теряется)
СТАЛО:
n8n Code Node «Load History»:
→ RPC get_conversation_history(telegram_chat_id, 20)
→ Форматируем в [{role, content}]
→ Передаём в AI Agent как chat history
3.2. Сохранение сообщений
БЫЛО:
Ничего не сохраняется (только log_chat_tool иногда)
СТАЛО:
ДО AI Agent:
→ Supabase Insert: save_chat_message(chat_id, 'user', user_input)
ПОСЛЕ AI Agent:
→ Supabase Insert: save_chat_message(chat_id, 'assistant', ai_output)
3.3. RAG Node в workflow
НОВЫЙ NODE (Code Node) перед AI Agent:
1. Получить user_input
2. Вызвать OpenAI Embeddings (text-embedding-3-small)
3. Вызвать Supabase RPC match_documents(embedding, 0.78, 3)
4. Если результаты есть:
context = results.map(r => r.content).join('\n---\n')
Добавить к systemMessage:
"Контекст из базы знаний:\n{context}"
5. Передать обогащённый prompt в AI Agent
3.4. Новый tool: rag_search_tool
{
"name": "rag_search_tool",
"type": "n8n-nodes-base.supabaseTool",
"parameters": {
"operation": "invokeFunction",
"functionName": "match_documents",
"functionParameters": {
"query_embedding": "/* embedded query */",
"match_threshold": 0.78,
"match_count": 3,
"filter_category": "={{ $json.category || null }}"
}
}
}
Альтернатива: Если n8n Supabase Tool не поддерживает vector → использовать HTTP Request node с Supabase REST API.
ЭТАП 4: Telegram Bot Architecture
Цель: Профессиональный бот с правильными UX-паттернами
4.1. BotFather Setup
/setcommands:
start - Начать работу с EastPay
help - Как я могу помочь
rates - Актуальные курсы
menu - Главное меню
status - Статус заявки
support - Связаться с менеджером
4.2. Welcome Message — полная переработка
БЫЛО:
<b>EAST PAY</b>
Обмен валют и зарубежные платежи.
[Совершить обмен] → eastpaycripto.ru
[Чат с поддержкой] → @eastpay_support
СТАЛО:
<b>Привет! Я — AI-ассистент EastPay 💼</b>
Помогу с обменом валют, платежами и переводами
в Москве, Дубае, Пхукете и других городах.
Просто напишите, что вам нужно. Например:
«Какой курс USDT в Москве?»
[🏦 Открыть приложение] ← web_app кнопка
[💬 Написать менеджеру] ← @eastpay_support
[📊 Актуальные курсы] ← callback /rates
4.3. Inline Keyboard Menus
// Главное меню (по команде /menu)
{
inline_keyboard: [
[{ text: "📊 Курсы валют", callback_data: "cmd_rates" }],
[{ text: "💱 Обменять", callback_data: "cmd_exchange" }],
[{ text: "📋 Мои заявки", callback_data: "cmd_orders" }],
[{ text: "🏦 Открыть приложение", web_app: { url: MINI_APP_URL } }],
[{ text: "👤 Поддержка", url: "https://t.me/eastpay_support" }]
]
}
4.4. Webhook Hardening
| Мера | Реализация |
|---|---|
| IP Whitelist | Разрешить только IP Telegram (149.154.160.0/20, 91.108.4.0/22) |
| Secret Token | Сгенерировать X-Telegram-Bot-Api-Secret-Token |
| HTTPS only | n8n webhook → HTTPS с валидным сертификатом |
| Rate Limiting | n8n limiter: max 30 req/min на chat_id |
| Retry Logic | На ошибку AI Agent → retry 1 раз → если опять ошибка → "скоро свяжемся" |
4.5. Error Handling в n8n
НОВЫЙ FLOW:
Error Trigger → Code Node (форматирование) →
→ Telegram: "Произошла техническая ошибка. Менеджер свяжется с вами."
→ Supabase: log error в messages (role: 'system')
→ (опционально) Telegram notification менеджеру
ЭТАП 5: Mini App v2 — React
Цель: Полноценное приложение внутри Telegram
5.1. Стек
React + Vite + TypeScript
Tailwind v4 + Shadcn/UI
Supabase SDK (@supabase/supabase-js)
Telegram Web App API
5.2. Экраны
| Экран | Функции |
|---|---|
| Главная | Курсы в реальном времени (Realtime), быстрый обмен |
| Калькулятор | Выбор пары → ввод суммы → расчёт → кнопка "Оформить" |
| Заявки | Список orders с фильтрами и статусами |
| Чат | История переписки с ботом (Realtime на messages) |
| Профиль | Данные клиента, предпочтения, уведомления |
5.3. Telegram Web App API Integration
// hooks/useTelegram.ts
export function useTelegram() {
const tg = window.Telegram?.WebApp;
return {
tg,
user: tg?.initDataUnsafe?.user,
themeParams: tg?.themeParams,
expand: () => tg?.expand(),
close: () => tg?.close(),
ready: () => tg?.ready(),
mainButton: tg?.MainButton,
backButton: tg?.BackButton,
};
}
5.4. Валидация initData (КРИТИЧНО для безопасности!)
// Edge Function: validate-telegram-init
import { createHmac } from 'node:crypto';
function validateInitData(initData: string, botToken: string): boolean {
const params = new URLSearchParams(initData);
const hash = params.get('hash');
params.delete('hash');
const dataCheckString = [...params.entries()]
.sort(([a], [b]) => a.localeCompare(b))
.map(([k, v]) => `${k}=${v}`)
.join('\n');
const secretKey = createHmac('sha256', 'WebAppData')
.update(botToken)
.digest();
const calculatedHash = createHmac('sha256', secretKey)
.update(dataCheckString)
.digest('hex');
return calculatedHash === hash;
}
ЭТАП 6: Синхронизация и Realtime
Цель: Связать все компоненты в единую систему
6.1. Edge Function sync-chat-to-telegram
Триггер: INSERT в messages WHERE role = 'manager'
Действие: Отправить сообщение клиенту в Telegram через Bot API
6.2. Realtime подписки
| Канал | Подписчик | Событие |
|---|---|---|
messages |
Mini App Chat | INSERT → показать новое сообщение |
daily_rates |
Mini App Rates | UPDATE → обновить курсы |
orders |
Mini App Orders | UPDATE → обновить статус заявки |
6.3. Edge Function rate-alert-notifier
pg_cron (каждые 30 минут):
→ Проверить daily_rates: изменение > 3%
→ Найти клиентов с подпиской на уведомления
→ Отправить Telegram message: "Курс X изменился на Y%"
ЭТАП 7: AI Agent v2 — Follow-up & Retention
Цель: Бот, который сам инициирует контакт
7.1. pg_cron Follow-up Jobs
| Job | Расписание | Логика |
|---|---|---|
check-stale-conversations |
Каждый час | conversations, где last_message_at < 2 часа и status = active → отправить напоминание |
retention-d1 |
Ежедневно 10:00 | Клиенты, сделавшие первый обмен вчера → "Как прошло?" |
retention-d7 |
Ежедневно 10:00 | Клиенты без активности 7 дней → "Актуальные курсы: ..." |
retention-d30 |
Еженедельно | Клиенты без активности 30 дней → специальное предложение |
7.2. Антиспам
-- user_preferences таблица
CREATE TABLE user_preferences (
id UUID PRIMARY KEY DEFAULT gen_random_uuid(),
client_id UUID REFERENCES clients(id) UNIQUE,
notifications_enabled BOOLEAN DEFAULT true,
preferred_pairs TEXT[] DEFAULT '{}',
preferred_cities TEXT[] DEFAULT '{}',
daily_message_limit INT DEFAULT 50,
created_at TIMESTAMPTZ DEFAULT now()
);
7.3. Команда /stop
/stop → user_preferences.notifications_enabled = false
→ "Уведомления отключены. Напишите /start, чтобы снова включить."
ЭТАП 8: Production Hardening
Цель: Стабильная работа в проде
| # | Задача |
|---|---|
| 1 | Настроить Supabase Realtime для messages, daily_rates, orders |
| 2 | Мониторинг: Edge Function errors → alert в Telegram менеджера |
| 3 | Бэкап: pg_dump ежедневно |
| 4 | Rate limits: AI Agent max 5 req/min на user |
| 5 | Логирование: все tool calls → logger-service Edge Function |
| 6 | Тестирование: 20+ сценариев диалога через pinData |
| 7 | KPI dashboard для менеджеров (Refine панель) |
📊 Порядок реализации (сводка)
gantt
title EastPay v2 — Master Plan
dateFormat YYYY-MM-DD
axisFormat %d.%m
section Этап 0: Промпт + n8n
Промпт v4 :e0a, 2026-02-12, 2d
n8n Workflow v2 :e0b, after e0a, 2d
Команды бота :e0c, after e0a, 1d
section Этап 1: Supabase фундамент
Миграции (conversations, messages) :e1a, after e0b, 2d
RPC Functions :e1b, after e1a, 1d
RLS Policies :e1c, after e1b, 1d
section Этап 2: RAG Pipeline
Edge Function embed :e2a, after e1c, 2d
Наполнение KB (30 docs) :e2b, after e2a, 2d
pgmq + auto-embed trigger :e2c, after e2a, 1d
section Этап 3: n8n Integration
Supabase Memory :e3a, after e2b, 2d
RAG Node в workflow :e3b, after e3a, 2d
section Этап 4: Telegram Bot
BotFather + Welcome v2 :e4a, after e0c, 1d
Webhook Hardening :e4b, after e3b, 1d
Error Handling :e4c, after e4b, 1d
section Этап 5: Mini App v2
React Setup + Auth :e5a, after e4c, 3d
Экраны (Rates, Calculator) :e5b, after e5a, 3d
Чат + Realtime :e5c, after e5b, 2d
section Этап 6: Синхронизация
sync-chat Edge Function :e6a, after e5c, 2d
Realtime подписки :e6b, after e6a, 1d
rate-alert-notifier :e6c, after e6b, 1d
section Этап 7: Retention
pg_cron follow-up :e7a, after e6c, 2d
Антиспам + preferences :e7b, after e7a, 2d
section Этап 8: Production
Мониторинг + тесты :e8a, after e7b, 3d
🔑 Ключевые решения для обсуждения
[!IMPORTANT] Следующие решения требуют вашего подтверждения:
LLM модель: GPT-4o (рекомендую) vs GPT-4o-mini (текущий) vs другая?
- GPT-4o: лучше для финансовых диалогов, дороже (~$5/1M input tokens)
- GPT-4o-mini: дешевле (~$0.15/1M), но хуже с нюансами
Ответ: GPT-5.1 лушче
Mini App URL: Какой домен?
app.eastpay.ru? Netlify? Supabase Hosting?
Ответ: Netlify да, домен уже там, можно сделать app.eastpay.online
- Telegram Bot Token: Используем текущего бота
EastPayили создаём нового для тестирования?
Ответ: используем текущего
- Knowledge Base: Есть ли готовые тексты (FAQ, описания услуг) или нужно генерировать?
Ответ: нет, но нужно будет сгенерировать нам (дам больше материалов)
- n8n hosting: Где развёрнут n8n? Self-hosted? n8n Cloud? (Влияет на webhook URL)
Ответ: n8n на нашем Self-hosted уже развернут
- Приоритет: Начинаем с Этапа 0 (промпт + n8n) или с Этапа 1 (Supabase)?
Ответ: начинаем с Этапа 0 (промпт + n8n)
📎 Связанные документы
| Документ | Что содержит |
|---|---|
| EastPay-Legacy-Logic-and-AI-Agent-Strategy.md | Полная техническая спецификация (1355 строк) |
| 3-version-promt.md | Текущий лучший промпт (v3) |
| Telegram AI Agent Base.json | Текущий n8n workflow |
| Supabase Project | cvzsgjksswowqgfxvrsb (EastPay, ap-south-1, ACTIVE) |