♻ update
This commit is contained in:
+72
-3
@@ -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` — удаляет все `<img>` теги из результата
|
||||
- `strip_links` — удаляет `<a>` теги, сохраняя текст ссылок
|
||||
- **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
|
||||
|
||||
### Добавлено
|
||||
|
||||
|
||||
Reference in New Issue
Block a user