Автоматическая генерация пайплайнов обработки данных с помощью искусственного интеллекта
AI Data Engineer — это интеллектуальная платформа для автоматизации создания ETL/ELT пайплайнов. Приложение анализирует ваши данные, предлагает оптимальные решения для хранения и генерирует готовый к развертыванию код с полной документацией.
Демо видео https://youtu.be/m3G6qj2mIEs
- Возможности
- Технологический стек
- Архитектура приложения
- Предварительные требования
- Установка
- Переменные окружения
- Запуск приложения
- Структура проекта
- Ключевые компоненты
- API маршруты
- Настройка базы данных
- Развертывание
- Разработка
- Устранение неполадок
- Лицензия
- Умный анализ данных: Автоматическое профилирование файлов (CSV, JSON, XML, Excel) с определением типов данных, временных полей и статистики
- AI-рекомендации: Интеллектуальный выбор оптимального хранилища данных (PostgreSQL, ClickHouse, HDFS) на основе анализа
- Визуальный конструктор: Пошаговая настройка подключений к источникам и целевым системам с интуитивным интерфейсом
- Маппинг полей: Гибкое сопоставление полей источника и цели с поддержкой 1:1 маппинга и ручной настройки
- Генерация кода: Автоматическое создание DDL скриптов, Airflow DAG, конфигурационных файлов и документации
- AI-помощник: Встроенный чат-ассистент с поддержкой Markdown для помощи на каждом этапе
- Управление проектами: Сохранение и загрузка проектов с полной историей настроек
- Поддержка форматов: CSV, JSON, XML, Excel (XLSX, XLS)
- Интеграции: PostgreSQL, ClickHouse, Kafka, HDFS, локальные файлы
- Режимы загрузки: Append, Merge, Upsert с настройкой дедупликации
- Расписания: Hourly, Daily, Weekly с поддержкой cron-выражений
- Партиционирование: По дате, по ключу, с настройкой watermark
- Экспорт: ZIP-архив с готовым к развертыванию кодом и документацией
- Next.js 14 - React-фреймворк с App Router
- React 18 - UI библиотека
- TypeScript 5 - Типизация
- Tailwind CSS 4 - Утилитарный CSS-фреймворк
- shadcn/ui - Компонентная библиотека
- Radix UI - Примитивы для доступных компонентов
- Lucide React - Иконки
- React Markdown - Рендеринг Markdown
- Google Gemini AI - LLM для анализа данных и генерации рекомендаций
- Next.js API Routes - Серверные эндпоинты
- Supabase - PostgreSQL база данных и аутентификация
- Neon - Serverless PostgreSQL (альтернатива)
- JSZip - Генерация ZIP-архивов
- date-fns - Работа с датами
- Zod - Валидация схем
- React Hook Form - Управление формами
``` ┌─────────────────────────────────────────────────────────────┐ │ Frontend (Next.js) │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Главная │ │ Проекты │ │ Помощь │ │ │ │ страница │ │ (демо) │ │ │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ Пошаговый конструктор (6 шагов) │ │ │ │ 1. Старт → 2. Загрузка → 3. Рекомендации → │ │ │ │ 4. Пайплайн → 5. Обзор → 6. Экспорт │ │ │ └──────────────────────────────────────────────────────┘ │ │ │ │ ┌──────────────────────────────────────────────────────┐ │ │ │ AI-помощник (чат) │ │ │ │ - Контекстная помощь на каждом шаге │ │ │ │ - Markdown поддержка │ │ │ │ - История диалогов │ │ │ └──────────────────────────────────────────────────────┘ │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ API Routes (Backend) │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ /api/profile │ │ /api/llm/ │ │ /api/generate│ │ │ │ Анализ файлов│ │ chat │ │ /spec, /zip │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ │ │ │ ┌──────────────┐ │ │ │ /api/projects│ Управление проектами │ │ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────┐ │ Внешние сервисы │ │ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ │ │ Google Gemini│ │ Supabase │ │ Neon │ │ │ │ AI │ │ PostgreSQL │ │ PostgreSQL │ │ │ └──────────────┘ └──────────────┘ └──────────────┘ │ └─────────────────────────────────────────────────────────────┘ ```
- Загрузка файла → Профилирование (первые 10MB для CSV/XML/Excel, полностью для JSON)
- Анализ LLM → Gemini AI анализирует структуру и предлагает рекомендации
- Конфигурация → Пользователь настраивает маппинг, расписание, режим загрузки
- Генерация → Создание DDL, ETL кода, конфигов, документации
- Экспорт → ZIP-архив с готовым проектом
- Сохранение → Проект сохраняется в Supabase/Neon для последующего доступа
Перед установкой убедитесь, что у вас установлены:
- Node.js >= 18.17.0 (скачать)
- npm >= 9.0.0 или yarn >= 1.22.0 или pnpm >= 8.0.0
- Git (скачать)
- Google Gemini API Key (получить)
- Supabase проект (создать) или Neon проект (создать)
```bash git clone https://github.com/erickufk/ai-data-engineer-app.git cd ai-data-engineer-app ```
Выберите ваш пакетный менеджер:
```bash
npm install
yarn install
pnpm install ```
Создайте файл .env.local в корне проекта:
```bash cp .env.example .env.local ```
Заполните переменные окружения (см. раздел Переменные окружения)
Выполните SQL-скрипты для создания таблиц (см. раздел Настройка базы данных)
Создайте файл .env.local со следующими переменными:
```env
GEMINI_API_KEY=your_gemini_api_key_here
SUPABASE_URL=https://your-project.supabase.co SUPABASE_ANON_KEY=your_supabase_anon_key SUPABASE_SERVICE_ROLE_KEY=your_supabase_service_role_key NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co NEXT_PUBLIC_SUPABASE_ANON_KEY=your_supabase_anon_key NEXT_PUBLIC_DEV_SUPABASE_REDIRECT_URL=http://localhost:3000
SUPABASE_POSTGRES_URL=postgresql://postgres:[password]@[host]:5432/postgres SUPABASE_POSTGRES_PRISMA_URL=postgresql://postgres:[password]@[host]:5432/postgres?pgbouncer=true SUPABASE_POSTGRES_URL_NON_POOLING=postgresql://postgres:[password]@[host]:5432/postgres SUPABASE_POSTGRES_USER=postgres SUPABASE_POSTGRES_PASSWORD=your_password SUPABASE_POSTGRES_DATABASE=postgres SUPABASE_POSTGRES_HOST=your-project.supabase.co
DATABASE_URL=postgresql://user:password@host/database POSTGRES_URL=postgresql://user:password@host/database POSTGRES_PRISMA_URL=postgresql://user:password@host/database?pgbouncer=true POSTGRES_URL_NON_POOLING=postgresql://user:password@host/database POSTGRES_USER=user POSTGRES_PASSWORD=password POSTGRES_DATABASE=database POSTGRES_HOST=host NEON_PROJECT_ID=your_neon_project_id ```
```env
SENTRY_DSN=your_sentry_dsn
NEXT_PUBLIC_VERCEL_ANALYTICS_ID=your_analytics_id ```
- Перейдите на Google AI Studio
- Войдите с Google аккаунтом
- Нажмите "Get API Key"
- Создайте новый API ключ
- Скопируйте ключ в
GEMINI_API_KEY
- Создайте проект на supabase.com
- Перейдите в Settings → API
- Скопируйте:
- Project URL →
SUPABASE_URLиNEXT_PUBLIC_SUPABASE_URL - anon public →
SUPABASE_ANON_KEYиNEXT_PUBLIC_SUPABASE_ANON_KEY - service_role →
SUPABASE_SERVICE_ROLE_KEY
- Project URL →
- Перейдите в Settings → Database
- Скопируйте Connection String →
SUPABASE_POSTGRES_URL
- Создайте проект на neon.tech
- Скопируйте Connection String из дашборда
- Вставьте в
DATABASE_URLи другиеPOSTGRES_*переменные
```bash npm run dev
yarn dev
pnpm dev ```
Приложение будет доступно по адресу: http://localhost:3000
```bash
npm run build
npm run start ```
```bash npm run lint ```
``` ai-data-engineer-app/ ├── app/ # Next.js App Router │ ├── api/ # API Routes (Backend) │ │ ├── generate/ # Генерация артефактов │ │ │ ├── artifacts/ # Генерация файлов проекта │ │ │ ├── spec/ # Генерация спецификации │ │ │ └── zip/ # Создание ZIP-архива │ │ ├── llm/ # LLM интеграция │ │ │ ├── chat/ # Чат с AI-помощником │ │ │ └── suggestions/ # Быстрые подсказки │ │ ├── profile/ # Профилирование файлов │ │ └── projects/ # CRUD операции с проектами │ ├── projects/ # Страница проектов (демо) │ ├── globals.css # Глобальные стили │ ├── layout.tsx # Корневой layout │ └── page.tsx # Главная страница │ ├── components/ # React компоненты │ ├── ui/ # shadcn/ui компоненты │ │ ├── button.tsx │ │ ├── card.tsx │ │ ├── dialog.tsx │ │ └── ... # 40+ UI компонентов │ ├── header.tsx # Шапка приложения │ ├── pipeline-canvas.tsx # Визуальный редактор пайплайна │ └── visual-constructor/ # Конструктор пайплайна │ ├── step-constructor.tsx # Главный компонент конструктора │ ├── source-config.tsx # Настройка источника │ ├── target-config.tsx # Настройка цели │ ├── field-mapping.tsx # Маппинг полей │ ├── schedule-config.tsx # Настройка расписания │ ├── unified-ai-chat.tsx # AI-помощник │ ├── system-presets.ts # Пресеты систем │ └── file-preview-analysis.tsx # Анализ файлов │ ├── lib/ # Утилиты и типы │ ├── types.ts # TypeScript типы │ ├── utils.ts # Вспомогательные функции │ ├── llm-service.ts # Сервис для работы с LLM │ └── dummy-data.ts # Тестовые данные │ ├── hooks/ # React хуки │ ├── use-mobile.tsx # Определение мобильного устройства │ └── use-toast.ts # Уведомления │ ├── public/ # Статические файлы │ ├── .env.local # Переменные окружения (не в git) ├── .env.example # Пример переменных окружения ├── .gitignore # Git ignore файл ├── next.config.mjs # Конфигурация Next.js ├── package.json # Зависимости проекта ├── tsconfig.json # Конфигурация TypeScript ├── tailwind.config.ts # Конфигурация Tailwind CSS └── README.md # Документация (этот файл) ```
Основной компонент приложения с пошаговым мастером создания пайплайна:
- Шаг 0: Старт - Создание проекта и выбор типа источника
- Шаг 1: Загрузка - Загрузка файлов или настройка подключений
- Шаг 2: Рекомендации - AI-анализ и выбор хранилища
- Шаг 3: Пайплайн - Визуальное построение пайплайна
- Шаг 4: Обзор - Просмотр сгенерированных артефактов
- Шаг 5: Экспорт - Скачивание ZIP-архива
Пошаговый конструктор для настройки ETL пайплайна:
- Шаг 1: Источник - Выбор и настройка источника данных
- Шаг 2: Цель - Выбор и настройка целевой системы
- Шаг 3: Маппинг - Сопоставление полей источника и цели
- Шаг 4: Расписание - Настройка режима загрузки и расписания
Интеллектуальный чат-ассистент:
- Контекстная помощь на каждом шаге
- Поддержка Markdown для форматированных ответов
- Быстрые подсказки (Quick Suggestions)
- История диалогов
Компонент для профилирования и анализа данных:
- Определение типов данных
- Статистика по полям
- Анализ качества данных
- Обнаружение дубликатов
- Визуализация распределений
Интерфейс для сопоставления полей:
- Drag & Drop для маппинга
- 1:1 автоматический маппинг
- Ручное создание целевых полей
- Валидация маппинга
Профилирование загруженных файлов
Request: ```typescript FormData { files: File[] originalSize: string sampledBytes: string isFullFile: string } ```
Response: ```typescript { format: string columns: string[] inferredTypes: Record<string, string> sampleRowsCount: number timeFields: string[] schemaConfidence: number sampleInfo?: { samplingStrategy: string sampledBytes: number originalSize: number percent: number } } ```
Чат с AI-помощником
Request: ```typescript { messages: Array<{ role: "user" | "assistant" content: string }> context?: { currentStep: number sourcePreset?: SystemPreset targetPreset?: SystemPreset // ... другие контекстные данные } } ```
Response: ```typescript { response: string } ```
Быстрые подсказки для AI-помощника
Request: ```typescript { context: { currentStep: number sourcePreset?: SystemPreset targetPreset?: SystemPreset } } ```
Response: ```typescript { suggestions: string[] } ```
Генерация спецификации пайплайна
Request: ```typescript { projectMeta: { name: string description: string } ingest: { mode: "file" | "constructor" fileProfile?: FileProfile constructorSpec?: ConstructorSpec } recommendation: Recommendation pipeline: { nodes: Node[] edges: Edge[] } } ```
Response: ```typescript { reportDraft: string artifacts: Array<{ name: string content: string type: string }> } ```
Создание ZIP-архива с проектом
Request: ```typescript { pipelineSpec: PipelineSpec reportDraft: string } ```
Response: ``` application/zip (binary) ```
CRUD операции с проектами
GET - Получить все проекты POST - Создать новый проект PUT - Обновить проект DELETE - Удалить проект
-
Создайте проект на supabase.com
-
Выполните SQL-скрипт для создания таблицы проектов:
```sql -- Создание таблицы проектов CREATE TABLE IF NOT EXISTS projects ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name TEXT NOT NULL, description TEXT, status TEXT DEFAULT 'draft', source_preset JSONB, target_preset JSONB, source_config JSONB, target_config JSONB, field_mapping JSONB, schedule JSONB, load_mode TEXT, pipeline_nodes JSONB, pipeline_edges JSONB, file_profile JSONB, recommendation JSONB, artifacts_preview JSONB, report_draft TEXT, created_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(), updated_at TIMESTAMP WITH TIME ZONE DEFAULT NOW() );
-- Индекс для быстрого поиска по имени CREATE INDEX IF NOT EXISTS idx_projects_name ON projects(name);
-- Индекс для фильтрации по статусу CREATE INDEX IF NOT EXISTS idx_projects_status ON projects(status);
-- Индекс для сортировки по дате создания CREATE INDEX IF NOT EXISTS idx_projects_created_at ON projects(created_at DESC);
-- Функция для автоматического обновления updated_at CREATE OR REPLACE FUNCTION update_updated_at_column() RETURNS TRIGGER AS $$ BEGIN NEW.updated_at = NOW(); RETURN NEW; END; $$ LANGUAGE plpgsql;
-- Триггер для автоматического обновления updated_at CREATE TRIGGER update_projects_updated_at BEFORE UPDATE ON projects FOR EACH ROW EXECUTE FUNCTION update_updated_at_column();
-- Row Level Security (опционально, для мультитенантности) ALTER TABLE projects ENABLE ROW LEVEL SECURITY;
-- Политика: все пользователи могут читать все проекты CREATE POLICY "Allow public read access" ON projects FOR SELECT USING (true);
-- Политика: все пользователи могут создавать проекты CREATE POLICY "Allow public insert access" ON projects FOR INSERT WITH CHECK (true);
-- Политика: все пользователи могут обновлять проекты CREATE POLICY "Allow public update access" ON projects FOR UPDATE USING (true);
-- Политика: все пользователи могут удалять проекты CREATE POLICY "Allow public delete access" ON projects FOR DELETE USING (true); ```
- Настройте переменные окружения (см. раздел Переменные окружения)
-
Создайте проект на neon.tech
-
Подключитесь к базе данных через psql или любой PostgreSQL клиент:
```bash psql postgresql://user:password@host/database ```
-
Выполните тот же SQL-скрипт, что и для Supabase (см. выше)
-
Настройте переменные окружения
- Установите Vercel CLI:
```bash npm install -g vercel ```
- Войдите в Vercel:
```bash vercel login ```
- Разверните проект:
```bash vercel ```
-
Настройте переменные окружения в Vercel Dashboard:
- Перейдите в Settings → Environment Variables
- Добавьте все переменные из
.env.local
-
Для production деплоя:
```bash vercel --prod ```
Создайте Dockerfile:
```dockerfile FROM node:18-alpine AS base
FROM base AS deps WORKDIR /app COPY package.json package-lock.json ./ RUN npm ci
FROM base AS builder WORKDIR /app COPY --from=deps /app/node_modules ./node_modules COPY . . RUN npm run build
FROM base AS runner WORKDIR /app
ENV NODE_ENV production
RUN addgroup --system --gid 1001 nodejs RUN adduser --system --uid 1001 nextjs
COPY --from=builder /app/public ./public COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static
USER nextjs
EXPOSE 3000
ENV PORT 3000
CMD ["node", "server.js"] ```
Соберите и запустите:
```bash docker build -t ai-data-engineer . docker run -p 3000:3000 --env-file .env.local ai-data-engineer ```
- Установите Netlify CLI:
```bash npm install -g netlify-cli ```
- Разверните:
```bash netlify deploy --prod ```
- Компоненты: Используйте функциональные компоненты с TypeScript
- Стили: Tailwind CSS с утилитарными классами
- Состояние: React hooks (useState, useEffect, useCallback)
- Типизация: Строгая типизация с TypeScript
-
Откройте
components/visual-constructor/system-presets.ts -
Добавьте новый пресет:
```typescript export const systemPresets: SystemPreset[] = [ // ... существующие пресеты { id: "my-system", name: "My System", type: "source", // или "target" icon: Database, description: "Описание системы", configFields: [ { name: "host", label: "Host", type: "text", required: true, placeholder: "localhost", }, // ... другие поля ], }, ] ```
- Обновите типы в
lib/types.tsесли необходимо
- Создайте файл в
app/api/your-route/route.ts:
```typescript import { NextRequest, NextResponse } from "next/server"
export async function POST(request: NextRequest) { try { const body = await request.json()
// Ваша логика
return NextResponse.json({ success: true })
} catch (error) { return NextResponse.json( { error: "Internal Server Error" }, { status: 500 } ) } } ```
```bash
npm run lint
npx tsc --noEmit ```
Решение:
- Убедитесь, что файл
.env.localсуществует в корне проекта - Проверьте, что
GEMINI_API_KEYуказан в.env.local - Перезапустите dev сервер:
npm run dev
Решение:
- Проверьте правильность DATABASE_URL в
.env.local - Убедитесь, что база данных доступна
- Проверьте, что таблица
projectsсоздана (см. Настройка базы данных)
Решение: ```bash
rm -rf node_modules package-lock.json npm install ```
Решение:
- Проверьте формат файла (поддерживаются: CSV, JSON, XML, Excel)
- Убедитесь, что файл не поврежден
- Для больших файлов (>10MB) анализируется только первые 10MB (кроме JSON)
Решение:
- Проверьте GEMINI_API_KEY
- Убедитесь, что у вас есть квота на Gemini API
- Проверьте консоль браузера на наличие ошибок
Решение:
- Проверьте, что все шаги пройдены корректно
- Убедитесь, что пайплайн содержит хотя бы один узел
- Проверьте консоль браузера на наличие ошибок
Этот проект создан с помощью v0.app и развернут на Vercel.
Если у вас возникли вопросы или проблемы:
- Проверьте раздел Устранение неполадок
- Откройте Issue на GitHub
- Свяжитесь с командой разработки
- Поддержка дополнительных источников данных (MongoDB, Redis, S3)
- Интеграция с dbt для трансформаций
- Визуализация данных и дашборды
- Мониторинг и алертинг пайплайнов
- Версионирование пайплайнов
- Collaborative editing (совместная работа)
- CI/CD интеграция
- Тестирование пайплайнов
Создано с ❤️ с помощью v0.app