docs: код-ревью ассистента + правки (поиск *_sub_user, per-call таймаут) в HISTORY и ASSISTANT_ARCHITECTURE

This commit is contained in:
Repinoid
2026-10-12 08:13:36 +03:00
parent de121ccb35
commit 72ef2f6a18
2 changed files with 84 additions and 2 deletions
+11 -2
View File
@@ -1,6 +1,7 @@
# AI-ассистент документации Nubes — полная документация
Дата: 2026-10-07
Обновлено: 2026-10-12 (правки: поиск `*_sub_user`, per-call таймаут ЛЛМ; коммит `12d29ee`).
Статус: **работает на проде** (`https://tf-docs.nodejsk8s.dev.nubes.ru/nubes-test/`).
Репозитории: `tf_docs` (backend), `tf_provider` (виджет + сборка сайта).
@@ -117,6 +118,7 @@ tf_docs (Node.js, кластер nodejsk8s) [orchestrator.js]
| `rate_limited` | 429 | превышен лимит (заголовок `Retry-After`) |
| `busy` | 503 | семафор исчерпан (`Retry-After: 5`) |
| `bad_llm_output` | 502 | LLM не выдал обязательные заголовки |
| `llm_timeout` | 504 | вызов ЛЛМ превысил `ASSIST_LLM_TIMEOUT_MS` (с 2026-10-12) |
| `index_unavailable` | 503 | не удалось загрузить индекс |
---
@@ -131,7 +133,7 @@ tf_docs (Node.js, кластер nodejsk8s) [orchestrator.js]
| `LLM_MODEL` | `gpt-oss-120b` | модель |
| `ASSIST_MAX_CONCURRENT` | `4` | семафор одновременных вызовов ЛЛМ |
| `ASSIST_TOTAL_DEADLINE_MS` | `40000` | общий бюджет запроса |
| `ASSIST_LLM_TIMEOUT_MS` | `25000` | таймаут одного вызова ЛЛМ |
| `ASSIST_LLM_TIMEOUT_MS` | `25000` | таймаут одного вызова ЛЛМ; применяется с 2026-10-12 (код `llm_timeout` → 504) |
| `ASSIST_RATE_PER_WINDOW` | `6` | лимит запросов на IP |
| `ASSIST_RATE_WINDOW_MS` | `60000` | окно rate-limit |
| `ASSIST_REPLICAS` | `1` | делитель лимита на реплики |
@@ -176,7 +178,9 @@ tf_docs (Node.js, кластер nodejsk8s) [orchestrator.js]
- руководство (`_manual`) — ×0.6;
- служебная (`30_registry`) — ×0.4.
- **Подресурс → родитель**: `nubes_postgres_database` при поиске дополняется
токеном `postgres` (`resourceBaseSegment`).
токеном `postgres` (`resourceBaseSegment`). Суффиксы-подресурсы перебираются по
убыванию длины (`KNOWN_RESOURCE_SUBS`); иначе короткий `_user` затенял `_sub_user`
(`nubes_s3_sub_user` → `s3_sub` вместо `s3`) — исправлено 2026-10-12.
- **Предтокенизация**: токены всех 823 документов считаются один раз при загрузке
индекса (поиск ~6 мс вместо ~1.2 с).
- **Списки**: `listResourceTypes()` (56 `nubes_*`) и `resourcePages()` (35 страниц)
@@ -189,6 +193,9 @@ tf_docs (Node.js, кластер nodejsk8s) [orchestrator.js]
- **Повторы этапа 2**: до 2 попыток, при обрезке ответа и транзиентных ошибках ЛЛМ
(кроме отмены клиентом) — с удвоением бюджета.
- **Дедлайн 40 с**: `AbortController` прерывает вызовы ЛЛМ.
- **Таймаут одного вызова ЛЛМ**: `ASSIST_LLM_TIMEOUT_MS` (25 с, с 2026-10-12) —
реализован в `llmChat`; покрывает вызов целиком, включая чтение тела. Отдаётся
кодом `llm_timeout` (504) и отличается от отмены клиентом (`aborted`, 499).
- **Отмена при закрытии соединения**: `req.on('close')` → abort (если нет других
держащих).
- **Кэш индекса**: TTL 10 мин; при сбое загрузки — работаем на свежем кэше.
@@ -241,9 +248,11 @@ tf_docs (Node.js, кластер nodejsk8s) [orchestrator.js]
| 3 | 61/62 | 1 | + шаблон для вопросов вне документации |
| 4 | **62/62** | **0** | — |
| 5 | 61/62 | 1 | клиентский сбой сети (не бэкенд) |
| 2026-10-12 | **62/62** | **0** | после правок (поиск `_sub_user` + per-call таймаут); файл `tests/RESULTS_AFTER_FIX.{json,md}` |
Задержки (5-й прогон): p50 7.7 с, p95 23 с, max 40.8 с — доминирует LLM
(`gpt-oss-120b` под нагрузкой), наш код ≈ 6 мс поиск + кэш.
Задержки (2026-10-12): p50 5.9 с, p95 10.8 с, max 12.4 с.
Разбор: `llm_project/tests/ANALYSIS_bad_llm_output.md`.