diff --git a/changelog.md b/changelog.md index f2c26ae..190d462 100644 --- a/changelog.md +++ b/changelog.md @@ -1,4 +1,4 @@ -## [0.4.5-beta] - 2026-09-26 +## [0.4.6-beta] - 2026-09-26 ### Добавлено @@ -23,7 +23,76 @@ --- -## [0.4.4-beta] - 2026-09-25 +## [0.4.5-beta] - 2026-09-25 + +### Добавлено + +- **ConvertOptions**: Четыре новые опции конвертации для гибкой настройки вывода: + - `include_title` — добавляет заголовок страницы как H1 (`# Title`) в начало документа + - `include_frontmatter` — добавляет YAML-шапку с метаданными (`title`, `source`, `bytes`, `tokens`) + - `strip_images` — удаляет все `` теги из результата + - `strip_links` — удаляет `` теги, сохраняя текст ссылок +- **Two-Level Cache Architecture**: Двухуровневая система кэширования для экономии кредитов и снижения нагрузки: + - **Уровень 1 — Raw HTML**: сырой HTML кэшируется на 30 минут (ключ: `convert:html:{normalized_url}`) + - **Уровень 2 — Final Markdown**: финальный результат кэшируется на 5 минут (ключ: `convert:result:{url}:{params_hash}`) + - Хэш параметров (SHA-256) обеспечивает уникальный ключ для каждой комбинации опций +- **Smart Credit Deduction**: Кредиты списываются **только** при реальном HTTP-запросе к внешнему сайту. При попадании в любой уровень кэша — конвертация бесплатна. +- **Frontend Conversion Options**: UI-контролы для всех 4 опций конвертации: + - Чекбоксы `Include Title`, `Include Frontmatter`, `Strip Images`, `Strip Links` + - Опции передаются в API через `POST /api/convert` в теле запроса + - Состояние опций сохраняется между конвертациями в рамках сессии +- **CachedHTML DTO**: Новая структура `dto.CachedHTML` для хранения сырого HTML с метаданными (`html`, `title`, `fetched_at`) в Redis. + +### Изменено + +- **ConverterService**: Полная переработка метода `ConvertURLToMarkdown()`: + - **ШАГ 1**: Проверка кэша финального результата (URL + параметры) + - **ШАГ 2**: Проверка кэша сырого HTML (только URL) + - **ШАГ 3**: Readability-парсинг выполняется **один раз** для обоих сценариев (кэш и свежий fetch) + - **ШАГ 4**: Конвертация HTML→Markdown с учётом текущих опций + - **ШАГ 5**: Списание кредитов **только** если `fromCache == false` (реальный fetch) + - **ШАГ 6**: Сохранение результата в оба уровня кэша +- **API Contract**: Тело запроса `POST /api/convert` расширено — добавлены опциональные поля: + ```json + { + "url": "https://example.com", + "include_title": true, + "include_frontmatter": false, + "strip_images": false, + "strip_links": false + } + ``` +- **Cache Key Generation**: Ключ кэша финального результата теперь включает хэш параметров — изменение любой опции генерирует новый ключ, не перезаписывая предыдущие результаты. +- **Readability Optimization**: Устранён дубль вызова `readability.FromReader()` — парсинг основного контента и извлечение заголовка выполняются строго один раз, независимо от источника HTML (кэш или fetch). + +### Производительность + +- **Credit Savings**: Повторная конвертация того же URL с другими опциями **не списывает кредиты** — сырой HTML берётся из кэша, конвертируется заново бесплатно. +- **Reduced External Requests**: При попадании в HTML-кэш (TTL 30 мин) внешний HTTP-запрос не выполняется — экономия времени (30+ секунд) и снижение нагрузки на целевые сайты. +- **Single Readability Pass**: Оптимизация CPU — `readability` вызывается один раз вместо двух при свежем fetch. +- **Compact Cache Keys**: Хэш параметров (8 байт SHA-256 → 16 hex-символов) вместо полной сериализации опций — компактные ключи Redis. + +### UX Улучшения + +- **Instant Re-conversion**: При изменении опций (например, включение `strip_images`) результат появляется мгновенно — HTML уже в кэше, нужна только быстрая конвертация. +- **No Surprise Charges**: Пользователь может экспериментировать с опциями для одного URL без страха потратить кредиты — списание происходит только при первом fetch. +- **Flexible Output**: Пользователь настраивает формат вывода под свои нужды: + - Для LLM: `strip_images: true` + `strip_links: true` — чистый текст без мусора + - Для документации: `include_frontmatter: true` — метаданные для статических генераторов + - Для быстрого чтения: `include_title: true` — заголовок сразу виден + +### Сценарии кэширования + +| Сценарий | Result Cache | HTML Cache | Fetch | Кредиты | Readability | +|----------|:------------:|:----------:|:-----:|:-------:|:-----------:| +| Первый запрос | ❌ | ❌ | ✅ | −1 | 1× | +| Повтор с теми же опциями | ✅ | ✅ | ❌ | 0 | 0× | +| Повтор с другими опциями | ❌ | ✅ | ❌ | 0 | 1× | +| После истечения HTML cache (30 мин) | ❌ | ❌ | ✅ | −1 | 1× | + +--- + +## [0.4.4-beta] - 2026-09-24 ### Добавлено @@ -56,7 +125,7 @@ --- -## [0.4.3-beta] - 2026-09-25 +## [0.4.3-beta] - 2026-09-23 ### Добавлено