platform-docs — uživatelská dokumentace + RAG corpus¶
Status: draft Verze spec: 0.1 Aktualizováno: 2026-05-15 Souvisí:
ai-rag.md,ai-chat.md,apps-autosync
1. Cíl¶
Postavit uživatelskou dokumentaci AVAX Platform v MkDocs (Material theme) co:
- Slouží jako single source of truth pro koncové uživatele — registrace firmy, instalace launcher2, návody k aplikacím (legal, mzdy, …), FAQ.
- Roste s katalogem — nové aplikace dostávají automaticky vlastní sekci (per-app sub-navigace).
- Napájí RAG corpus — markdown soubory se chunkují, embeddují a perzistují do
ai_documentsssource_type='platform_docs'/'app_docs'. AI asistent (platform-helper, per-app asistenti) má retrieval fallback nad dokumentací → odpovídá s [Source] referencemi. - Sjednocuje stávající dva světy: interní dev specs (
docs/spec/*,docs/context/*, …) a user-facing guides (nový obsah). Material theme navigation tabs rozdělí site na dvě top-level sekce.
Co spec NEPOPISUJE:
- Pre-existing auto-sync docs/apps/ z admin API (tools/sync_app_docs.py) — funguje, zůstává.
- Per-app technický spec (avax-legal pilot) — to je docs/spec/avax-legal.md.
- RAG implementace V1+V2 — docs/spec/ai-rag.md shipped. Toto spec přidá source_type rozšíření.
2. Architektura¶
┌────────────────────────────────────────────────────────────────────┐
│ Autor (Avaxis tým / AI / vendor) │
│ Edituje `docs/user-guide/**/*.md` v repu │
└─────────────────────────────────┬──────────────────────────────────┘
│ git push
▼
┌────────────────────────────────────────────────────────────────────┐
│ Gitea repo `avax-platform/master` │
│ Gitea Actions: workflow `docs.yml` (paths: docs/**, mkdocs.yml) │
└─────────────────────────────────┬──────────────────────────────────┘
│ act_runner
▼
┌────────────────────────────────────────────────────────────────────┐
│ Build steps: │
│ 1. `pip install mkdocs-material` + plugins │
│ 2. `mkdocs build` → `site/` static HTML │
│ 3. Sync na avaxdev nginx (rsync nebo S3 → mountpoint) │
│ 4. `python tools/sync_docs_corpus.py` → invokuje Celery task │
│ `ai.sync_docs_corpus` │
└─────────────────────────────────┬──────────────────────────────────┘
│
┌─────────────────────┴─────────────────────┐
▼ ▼
┌──────────────────────────┐ ┌─────────────────────────────┐
│ Hosting │ │ RAG corpus (ai_documents) │
│ Dev: avaxdev nginx │ │ source_type: │
│ Prod: docs.avaxis.cz │ │ - 'platform_docs' │
│ Static HTML serve │ │ (top-level user-guide/) │
│ Hybrid auth (nginx │ │ - 'app_docs' + app_id │
│ auth_request gate pro │ │ (apps/<slug>/) │
│ /advanced/**) │ │ Globally readable │
└──────────────────────────┘ └─────────────────────────────┘
3. Struktura docs/¶
docs/
├── index.md Hlavní landing (Co je AVAX)
│
├── user-guide/ NOVÝ — User-facing dokumentace
│ ├── index.md Úvod, struktura návodu
│ ├── zacatecnik/
│ │ ├── index.md
│ │ ├── registrace-firmy.md [public]
│ │ ├── instalace-launcheru.md [public]
│ │ ├── prvni-prihlaseni.md [public]
│ │ └── pridani-uzivatelu.md [auth]
│ ├── launcher/
│ │ ├── index.md
│ │ ├── prehled-rozhrani.md [public]
│ │ ├── katalog-aplikaci.md [public]
│ │ ├── chat.md [auth]
│ │ ├── ai-asistent.md [auth]
│ │ ├── synchronizace.md [auth]
│ │ ├── nastaveni.md [auth]
│ │ └── zalohovani.md [auth]
│ ├── apps/ Per-app uživatelské návody
│ │ ├── index.md Generated (link na všechny apps)
│ │ ├── avax-legal/
│ │ │ ├── index.md
│ │ │ ├── prvni-kroky.md
│ │ │ ├── vyhledavani-zakonu.md
│ │ │ ├── casova-osa.md
│ │ │ ├── ai-vyklad.md
│ │ │ └── faq.md
│ │ └── ... (budoucí apps stejnou strukturou)
│ ├── faq.md [public] Globální FAQ
│ └── reseni-problemu.md [public] Troubleshooting
│
├── apps/ AUTO-SYNC (existing, z admin API)
│ ├── index.md Tabulka apps z DB
│ ├── avax-legal-client.md Per-app metadata (slug, kategorie, ...)
│ └── ...
│
└── (existing dev sections: context/, workflow/, infrastructure/,
dev/, spec/, implementace.md zustavaji)
3.1 Frontmatter pro auth¶
Soubory s gated obsahem mají v YAML frontmatter:
---
title: AI asistent v launcheru
auth: required # public | required
audience: user # user | admin | vendor
---
auth: required → nginx auth_request redirect na login pokud chybí JWT cookie.
3.2 Per-app sub-section (auto-discovery)¶
docs/user-guide/apps/<slug>/ — vendor / Avaxis tým napíše ručně. Index page se vygeneruje automaticky:
tools/sync_app_docs.pyextend — pro každou app v admin API zkontroluje existencidocs/user-guide/apps/<slug>/index.md. Pokud neexistuje, vytvoří stub s placeholder hint-em.mkdocs.ymlnav neudržujeme ručně — používámemkdocs-awesome-navplugin (auto-generate z directory struktury +.nav.ymloverride per directory).
4. MkDocs config update¶
Stávající mkdocs.yml rozšíříme o:
theme:
features:
- navigation.tabs # Top-level tabs (existuje)
- navigation.tabs.sticky # Sticky při scroll
- navigation.path # Breadcrumb path
- search.suggest # Existuje
- search.highlight # Existuje
plugins:
- search:
lang: [cs, en] # Existuje
- awesome-nav # NOVÝ — auto-nav z dir struktury
nav:
- Úvod: index.md
# Top-level tab "Uživatel"
- Uživatelská příručka:
- Začátečník: user-guide/zacatecnik/
- Práce s launcherem: user-guide/launcher/
- Aplikace: user-guide/apps/
- FAQ: user-guide/faq.md
- Řešení problémů: user-guide/reseni-problemu.md
# Top-level tab "Vývoj" (existing content)
- Vývoj:
- Kontext: context/
- Workflow: workflow/
- Infrastruktura: infrastructure/
- Dev reference: dev/
- Implementace: implementace.md
- Specifikace: spec/
# Top-level tab "Aplikace" (existing auto-sync metadata)
- Aplikace (metadata): apps/
5. Hosting plan¶
Fáze 1 (dev) — avaxdev nginx¶
Static HTML serve z /srv/avax-docs/ (nginx alias). Build na avaxdev lokálně:
cd ~/avax-platform
./.venv/bin/pip install mkdocs-material mkdocs-awesome-nav
./.venv/bin/mkdocs build --site-dir /srv/avax-docs
Nginx config (/etc/nginx/sites-available/avax-docs):
server {
listen 80;
server_name docs.avaxdev.local; # zatim lokalni — pak docs.avaxis.cz
root /srv/avax-docs;
index index.html;
location / {
try_files $uri $uri/ $uri.html =404;
}
location ~ ^/advanced/ {
auth_request /auth/check;
error_page 401 = @login_redirect;
try_files $uri $uri/ $uri.html =404;
}
location = /auth/check {
internal;
proxy_pass http://127.0.0.1:8000/auth/me;
proxy_pass_request_body off;
proxy_set_header Content-Length "";
proxy_set_header Authorization "Bearer $cookie_avax_token";
}
location @login_redirect {
return 302 https://api.avaxis.cz/login?redirect=$request_uri;
}
}
Systemd timer pro rebuild při push do master (poll-based):
# /etc/systemd/system/avax-docs-build.timer
[Timer]
OnUnitActiveSec=5min # check master každých 5 min
Persistent=true
# avax-docs-build.service
ExecStart=/usr/local/bin/avax-docs-rebuild.sh
avax-docs-rebuild.sh:
cd ~/avax-platform
git pull --ff-only
if [[ $(git rev-parse HEAD) != $(cat /var/lib/avax-docs/last-build) ]]; then
./.venv/bin/mkdocs build --site-dir /srv/avax-docs
git rev-parse HEAD > /var/lib/avax-docs/last-build
# Trigger RAG sync
curl -s -X POST http://127.0.0.1:8000/admin/docs/resync \
-H "Authorization: Bearer $AVAX_SERVICE_TOKEN" || true
fi
Fáze 2 (production) — docs.avaxis.cz¶
DNS A-record na vm-gateway → nginx vhost → static serve z /srv/avax-docs/. Let's Encrypt SSL certbot.
CI/CD: Gitea Actions workflow .gitea/workflows/docs.yml (paths: docs/**, mkdocs.yml):
1. mkdocs build
2. SSH rsync site/ → vm-gateway /srv/avax-docs/
3. Trigger RAG resync přes /admin/docs/resync
6. RAG corpus integrace¶
6.1 Schema rozšíření (migrace 024)¶
# Migrace 024_ai_docs_corpus.py
op.add_column("ai_documents", sa.Column("source_type", sa.String(50),
nullable=False,
server_default="user_upload"))
op.add_column("ai_documents", sa.Column("source_path", sa.Text(),
nullable=True))
op.add_column("ai_documents", sa.Column("app_id", sa.UUID(as_uuid=True),
sa.ForeignKey("apps.id", ondelete="SET NULL"),
nullable=True))
op.create_check_constraint(
"ck_ai_documents_source_type", "ai_documents",
"source_type IN ('user_upload', 'platform_docs', 'app_docs')",
)
op.create_index("ix_ai_documents_source_type", "ai_documents",
["source_type"],
postgresql_where=sa.text("source_type != 'user_upload'"))
op.create_index("ix_ai_documents_app_corpus", "ai_documents",
["app_id", "source_type"],
postgresql_where=sa.text("source_type = 'app_docs'"))
source_type—'user_upload'(V1.5),'platform_docs'(top-level user-guide),'app_docs'(per-app guides).source_path— relativní cesta vdocs/(např.user-guide/launcher/ai-asistent.md) — pro deduplikaci při resync.app_id— pro'app_docs', vazba na konkrétní aplikaci.
6.2 Celery task ai.sync_docs_corpus¶
@celery_app.task(name="ai.sync_docs_corpus", bind=True)
def sync_docs_corpus_task(self) -> dict:
"""Pulluje markdown z docs/, embed-uje a perzistuje do ai_documents.
Idempotent — pro každý markdown najde existující doc by source_path,
porovná hash content, re-index pokud změna. Mazaná docs (source_path
už není v repu) jsou označená status='archived'.
"""
...
Workflow:
1. Iteruj docs/user-guide/**/*.md + docs/apps/**/*.md (NE dev specs)
2. Per soubor:
- source_path = relativní cesta
- source_type = 'platform_docs' pokud user-guide/launcher/ nebo user-guide/zacatecnik/; 'app_docs' pokud user-guide/apps/<slug>/; ignore apps/ (auto-sync metadata)
- app_id = resolve podle slug z directory (apps/avax-legal/)
- content_hash = sha256 markdown content
- Pokud existující ai_documents row s tímto source_path má stejný hash → skip
- Jinak: smaž staré chunks, INSERT/UPDATE row, status='uploaded', send_task ai.index_document
3. Archived: soubory v DB ale ne v repu → status='archived', is_active=false
Frontmatter auth: required → flag metadata={"auth": "required"} — retrieval respektuje (jen pro authed users).
6.3 retrieve_context extension¶
Stávající scope chain attached → global user. Extend:
1. ai_conversation_documents (per-conv attached docs) — KDYŽ JE
2. Owner per-user uploaded docs (user_upload) — KDYŽ JE
3. App docs (source_type='app_docs', app_id=conversation.app_id) — KDYŽ
konverzace má app_id (per-app asistent volání z avax-legal apod.)
4. Platform docs (source_type='platform_docs') — vždy fallback
V SQL retrieval query přidat OR filter na source_type + per-conversation app_id resolution:
async def _resolve_doc_ids(conv, user_id, db) -> list[str]:
"""Resolve doc IDs in priority order — vrátí první non-empty list."""
# 1. attached
attached = await _attached_docs(conv.id, db)
if attached:
return attached, "attached"
# 2. user uploaded
uploaded = await _user_docs(user_id, db)
if uploaded:
return uploaded, "user_upload"
# 3. app docs (jen pokud conv má app_id)
if conv.app_id:
app_docs = await _app_docs(conv.app_id, db)
if app_docs:
return app_docs, "app_docs"
# 4. platform docs fallback
platform = await _platform_docs(db)
return platform, "platform_docs"
6.4 Citation rendering¶
Sources z platform_docs mají kratší URL preview — UI klient render-uje s odkazem na MkDocs site:
{
"document_id": "uuid",
"chunk_index": 3,
"score": 0.87,
"source_type": "platform_docs",
"source_path": "user-guide/launcher/ai-asistent.md",
"site_url": "https://docs.avaxis.cz/user-guide/launcher/ai-asistent/",
"preview": "Tlačítko 📎 v AI panelu otevře file picker..."
}
Klik na citation → otevře MkDocs site v browseru.
7. Backend endpoint update¶
| Endpoint | Účel |
|---|---|
POST /admin/docs/resync |
Super_admin / service token. Trigger ai.sync_docs_corpus task. Vrátí task_id. |
GET /admin/docs/status |
Last sync time, počty docs per source_type, případně errors. |
GET /ai/documents?source_type=platform_docs |
Filtrované list — public přístup (read-only). User vidí seznam docs co AI může znát. |
8. Auth a security¶
- Public docs (frontmatter
auth: public) — bez restrikce, MkDocs static HTML, nginx serve. - Gated docs (
auth: required) — nginxauth_requestproxy na/auth/mecore-api. Vyžaduje JWT cookieavax_tokenz login flow. - Per-firma docs (
audience: company_admin) — V2, dnes všichni authed. - RAG indexace — všechny docs jsou indexované bez auth gate (corpus globální). Při retrieval respektujeme metadata: pokud
metadata.auth == "required"a user nemá session token, chunk skipnout.
9. Acceptance criteria¶
Phase 1 — site struktura (target 2026-05-22)¶
-
mkdocs-awesome-navplugin nainstalovaný v venv + vrequirements.txt -
mkdocs.ymlrozšířen o 2-tab navigation (Uživatel/Vývoj) -
docs/user-guide/index.md— landing page se 4 quick-link kartami -
docs/user-guide/zacatecnik/— 4 markdown soubory (registrace, instalace, login, uživatelé) -
docs/user-guide/launcher/— 6 markdown souborů s screenshoty -
docs/user-guide/apps/avax-legal/— 5 markdown souborů -
mkdocs serveběží lokálně, navigace funkční
Phase 2 — hosting dev (target 2026-05-25)¶
-
/srv/avax-docs/na avaxdev s static build - nginx vhost
docs.avaxdev.local(lokálně /etc/hosts pro test) - systemd timer
avax-docs-build.timerpoll master každých 5 min -
tools/avax-docs-rebuild.shscript
Phase 3 — RAG corpus (target 2026-05-28)¶
- Migrace 024:
ai_documents.source_type+source_path+app_id - Celery task
ai.sync_docs_corpus— iterace + hash compare + reindex queue -
POST /admin/docs/resyncendpoint -
retrieve_contextpriority chain rozšířená o app_docs + platform_docs - launcher2 citations: odkaz na
docs.avaxis.cz/...usource_type='platform_docs'
Phase 4 — production (target 2026-06-05)¶
- DNS
docs.avaxis.cz→ vm-gateway - Let's Encrypt SSL
- Gitea Actions workflow
.gitea/workflows/docs.yml— build + rsync deploy - nginx
auth_requestpro gated docs
10. Otevřené otázky¶
- Search v MkDocs vs RAG — Material search je full-text, RAG je semantic. Spolu nebo separátně v UI? Default search → AI button "zeptat se AI" otevře launcher2 chat s pre-fillem dotazu?
- Per-vendor docs ownership — pokud 3rd-party vendor (qwen-style) má vlastní apps, kdo edituje
docs/user-guide/apps/<slug>/? Vendor přes PR do avax-platform repa? Nebo separátní per-app docs repo se sync-em? - Versioned docs — pokud launcher2 v0.4 změní UI, staré screenshoty/instrukce zastarají. Mike (mkdocs versioning) nebo jen banner „aktualizováno YYYY-MM-DD"?
- CMS pro non-dev autora — Avaxis tým co píše návody. MkDocs vyžaduje git push. Alternativa: Decap CMS web-based editor v gated section.
- Screenshots — kde uložit —
docs/user-guide/launcher/images/nebo S3app-docs/? S3 šetří git repo size, ale ztratí offline preview v IDE. - Multi-jazyk — CZ je primární, EN pro vendory?
i18nmkdocs plugin. - Embedded video tutoriály — youtube embed v markdown? Vlastní hosting na S3?
11. Timeline¶
| Fáze | Status | Cíl |
|---|---|---|
| Spec draft | ✓ done | 2026-05-15 |
| Phase 1 — site struktura | ⏳ open | 2026-05-22 |
| Phase 2 — dev hosting | ⏳ open | 2026-05-25 |
| Phase 3 — RAG corpus | ⏳ open | 2026-05-28 |
| Phase 4 — production docs.avaxis.cz | ⏳ open | 2026-06-05 |
12. Související¶
ai-rag.md— V2 RAG schema (rozšíříme osource_type)ai-chat.md—/ai/chatflow (citations rendering)apps-gateway.md— per-app docs vs per-app container scopeapp-distribution.md— vendor docs ownershiptools/sync_app_docs.py— existing auto-sync admin metadata (zachováme)- mkdocs.yml root config — extend v Phase 1
- MkDocs Material: squidfunk.github.io/mkdocs-material
- mkdocs-awesome-nav: github.com/lukasgeiter/mkdocs-awesome-nav