Веб-приложение для объяснения сложных тем, концепций, терминов или даже мемов простыми словами с помощью AI (Google Gemini). Реализовано полностью на FastAPI, включая обслуживание фронтенда и API.
Это приложение создано как демонстрация и Open Source проект. Вы можете использовать его как основу для своих идей!
- 🧠 Объяснение тем с помощью Google Gemini: Введите любой вопрос или тему и получите ответ.
- 🎯 Разные уровни объяснения: Выберите, как объяснить - "просто", "как подростку", "как 5-летнему", "кратко (TL;DR)", "через плюсы и минусы" или попросите AI придумать метафору.
- 🍕 Пользовательские аналогии: Предложите свою аналогию (например, "объясни на примере пиццы").
- 📝 Markdown и подсветка кода: Ответы форматируются с помощью Markdown, а блоки кода подсвечиваются с помощью
highlight.js
. - ✂️ Копирование кода: Удобная кнопка для копирования содержимого блоков кода.
- 💾 Сохранение ответов: Успешно сгенерированные и валидные ответы сохраняются в JSON-файлы для быстрого доступа и SEO.
- 🔍 Асинхронный поиск: Быстрый поиск по заголовкам и началу текста сохраненных объяснений.
- ⚙️ SEO-основы: Генерация отдельных страниц для каждого сохраненного объяснения,
sitemap.xml
иrobots.txt
. - 🚀 Полностью на FastAPI: Бэкенд, API и рендеринг HTML-страниц с помощью Jinja2 - всё в одном фреймворке.
- 🎨 Обновленный UI: Чистый, адаптивный интерфейс с поиском в шапке.
- Веб-фреймворк: FastAPI
- Шаблонизатор: Jinja2
- AI Модель: Google Gemini API (
google-genai
) - Markdown Рендеринг (Клиент): markdown-it
- Подсветка Кода (Клиент): highlight.js
- Асинхронность:
asyncio
,aiofiles
- Хранение данных: Файловая система (JSON-файлы)
- Запуск: Uvicorn
-
Клонируйте репозиторий:
git clone https://github.com/lrdcxdes/prosto-ponyatno-ai.git cd prosto-ponyatno-ai
-
Убедитесь, что у вас установлен Python 3.8+.
-
Создайте и активируйте виртуальное окружение (рекомендуется):
python -m venv venv # Linux/macOS source venv/bin/activate # Windows # venv\Scripts\activate
-
Установите зависимости:
pip install -r requirements.txt
-
Настройте переменные окружения:
- Переименуйте файл
.env.example
в.env
. - Откройте файл
.env
и вставьте ваш API-ключ от Google AI Studio (Gemini API):Вы можете получить ключ здесь: Google AI StudioGOOGLE_API_KEY="ВАШ_GOOGLE_GENERATIVE_AI_API_KEY"
- Переименуйте файл
-
Запустите приложение:
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
--reload
: Автоматический перезапуск сервера при изменении кода (удобно для разработки).
-
Откройте браузер и перейдите по адресу
http://localhost:8000
.
Основная конфигурация выполняется через файл .env
:
GOOGLE_API_KEY
: Обязательный API-ключ для доступа к Google Gemini API.
Приложение автоматически создает папку app/explanations
для хранения JSON-файлов с объяснениями.
- Главная страница (
/
):- Введите тему или вопрос в текстовое поле.
- Выберите желаемый стиль объяснения из выпадающего списка.
- Если выбран стиль "С моей аналогией...", введите вашу аналогию в появившееся поле.
- Нажмите кнопку "Объяснить!".
- Результат появится ниже с форматированием Markdown и подсветкой кода. Если объяснение было успешно сохранено, появится ссылка на его постоянную страницу.
- Поиск (в шапке):
- Начните вводить запрос (минимум 3 символа) в поле поиска.
- Появится выпадающий список с найденными сохраненными объяснениями.
- Кликните на результат, чтобы перейти на страницу этого объяснения.
- Страница объяснения (
/explanation/{slug}
):- Отображает конкретное сохраненное объяснение.
- Имеет уникальный URL, который можно добавить в закладки или поделиться.
prosto-ponyatno-ai/
├── app/
│ ├── main.py # Основной файл FastAPI (эндпоинты UI и API)
│ ├── services.py # Бизнес-логика (AI, файлы, поиск)
│ ├── models.py # Pydantic модели (запросы, ответы, хранение)
│ ├── core/
│ │ └── config.py # Загрузка конфигурации (.env)
│ ├── static/ # Статические файлы (CSS, JS)
│ │ ├── styles.css
│ │ └── script.js
│ ├── templates/ # Jinja2 HTML шаблоны
│ │ ├── index.html
│ │ └── explanation_page.html
│ └── explanations/ # Директория для хранения JSON файлов с объяснениями (создается автоматически)
│ └── .gitkeep
├── requirements.txt # Зависимости Python
├── .env.example # Пример файла переменных окружения
├── .gitignore
└── README.md # Этот файл
- Запрос пользователя (UI): Пользователь заполняет форму на главной странице (
index.html
). JavaScript (script.js
) отправляет POST-запрос на/api/explain
с темой и параметрами. - Обработка API (FastAPI): Эндпоинт
/api/explain
вmain.py
принимает запрос. - Сервисный слой (
services.py
):- Функция
get_or_create_explanation
генерируетslug
для запроса. - Проверяет, существует ли файл
app/explanations/{slug}.json
(кеш). - Если файл есть, читает и возвращает его содержимое.
- Если файла нет:
- Формирует промпт для Google Gemini API на основе темы и выбранного уровня/аналогии.
- Отправляет запрос к
generate_ai_explanation
. - Получает ответ от AI.
- Валидирует ответ: Проверяет на наличие ошибок, индикаторов неудачи, минимальную длину.
- Если ответ валиден: Генерирует метаданные (title, description), создает объект
StoredExplanation
и асинхронно сохраняет его в JSON-файл (save_explanation_to_file
). - Возвращает текст объяснения и
slug
. - Если ответ не валиден: Возвращает текст (ошибки или невалидный ответ) и
None
вместоslug
.
- Функция
- Ответ API: Эндпоинт
/api/explain
возвращает JSON с текстом объяснения иslug
(илиnull
, если сохранение не произошло). - Отображение (UI): JavaScript на главной странице получает ответ:
- Если
slug
есть, рендерит Markdown-текст с помощьюmarkdown-it
иhighlight.js
, добавляет кнопки копирования и показывает ссылку на/explanation/{slug}
. - Если
slug
равенnull
, показывает сообщение об ошибке или невалидный ответ.
- Если
- Страница объяснения (
/explanation/{slug}
):- GET-запрос обрабатывается в
main.py
. load_explanation_from_file
читает нужный JSON-файл.- Данные передаются в шаблон
explanation_page.html
. - JavaScript в шаблоне рендерит Markdown из переданного текста при загрузке страницы.
- GET-запрос обрабатывается в
- Поиск:
- JavaScript отправляет GET-запросы на
/api/search?q=...
по мере ввода вsearch-input
. - Эндпоинт
/api/search
вызываетsearch_explanations
, которая асинхронно ищет совпаденияq
в именах файлов (topic_raw
) и содержимом (explanation_text
) JSON-файлов. - Возвращается список найденных
slug
иtopic
. - JavaScript отображает результаты в виде ссылок.
- JavaScript отправляет GET-запросы на
Буду рад вашему участию! Если у вас есть идеи по улучшению, предложения или вы нашли баг:
- Issues: Пожалуйста, создайте Issue для обсуждения вашей идеи или проблемы.
- Pull Requests:
- Сделайте форк репозитория.
- Создайте новую ветку для вашей фичи (
git checkout -b feature/AmazingFeature
). - Сделайте ваши изменения.
- Закоммитьте изменения (
git commit -m 'Add some AmazingFeature'
). - Отправьте ветку в ваш форк (
git push origin feature/AmazingFeature
). - Создайте Pull Request.
Этот проект распространяется под лицензией MIT. Смотрите файл LICENSE
для подробностей (Вам нужно будет добавить файл LICENSE с текстом MIT лицензии в репозиторий).
- Переход на базу данных: Использовать БД (например, PostgreSQL с
pg_trgm
или SQLite для простоты) вместо JSON-файлов для более эффективного хранения и поиска. - Кеширование: Внедрить кеширование (например, с помощью Redis) для API-ответов.
- Оценка ответов: Добавить кнопки 👍/👎 для сбора обратной связи от пользователей.
- Улучшенный поиск: Полнотекстовый поиск, учет релевантности, исправление опечаток.
- Админ-панель: Простой интерфейс для управления сохраненными объяснениями.
- Тесты: Написание Unit и Integration тестов.
- Docker-контейнеризация: Упаковка приложения в Docker для легкого развертывания.
Надеюсь, этот проект будет полезен! Удачи!