Skip to content

Info: chat /info és admin betöltés

Ez a dokumentum két dolgot mutat be: (1) az info a chatben – a /info slash parancs használata; (2) az info betöltését – az /admin/info API-n keresztül, hogy a tartalom elérhetővé váljon a /info válaszaiban.

Új (geo + általános tudás): tenant kapcsolók és tool-sorrend → 58-info-geo-and-general-knowledge.md (GET/PUT /admin/info/chat-settings).


Info a chatben

Mi az /info?

A chatben (POST /chat, POST /chat/stream, POST /api/v1/chat) a felhasználó slash parancsként küldi: /info + szóköz + kérdés vagy téma. Példa: "/info Pergel Attila", "/info mi az ÁSZF?". A rendszer az info módot választja; a válasz az adott tenant indexelt info elemekből (FAQ, segítség, szabályzat stb.) generálódik.

Nincs külön endpoint – ugyanaz a chat endpoint, a text mező elején lévő /info prefix határozza meg a módot.

Hitelesítés

  • Internal: JWT (POST /chat, POST /chat/stream) vagy X-API-Key (POST /api/v1/chat).
  • Widget: POST /chat, body: public_widget_token, session_id.

Példa kérés (POST /chat)

python
import requests

BASE_URL = "https://<your-api-host>"
JWT_TOKEN = "your-jwt-token"

url = f"{BASE_URL}/chat"
payload = {
    "channel": "internal",
    "text": "/info Hogyan kell regisztrálni?",
    "session_id": "my-session-123"
}
headers = {
    "Content-Type": "application/json",
    "Authorization": f"Bearer {JWT_TOKEN}"
}
response = requests.post(url, json=payload, headers=headers)
print(response.json())

Példa (POST /api/v1/chat)

python
payload = {
    "text": "/info mi a szállítási idő?",
    "session_id": "my-session-123"
}
headers = {
    "Content-Type": "application/json",
    "X-API-Key": "rak_your_api_key_here"
}
response = requests.post(f"{BASE_URL}/api/v1/chat", json=payload, headers=headers)
print(response.json())

Válasz

A válasz egy ResponseEnvelope (trace_id, mode, status_code, text, sources). A text az info tartalom alapján generált válasz; a sources az info kontextusra hivatkozhat. Ha nincs indexelt info vagy nincs releváns találat, a rendszer ezt jelezni fogja a válaszban.


Info betöltése (admin API)

Mi az info betöltés?

Az info elemek szöveges tartalmak (cím, leírás, content), amelyeket az admin API-n keresztül hozunk létre és indexelünk. Ha az indexelés kész (INDEXED), a chat /info válasza ezekből a tartalmakból ad választ.

Endpointok (prefix: /admin/info)

EndpointMethodLeírásSzerepkör
/admin/infoGETInfo elemek listája (query: limit, offset, scope, status, search)JWT, VIEWER is listázhat
/admin/info/GETEgy elem teljes tartalommal (szerkesztéshez)JWT
/admin/infoPOSTInfo elem létrehozása; mentés után PENDING index jobEDITOR, TENANT_ADMIN, SYSTEM_ADMIN
/admin/info/PUTInfo elem szerkesztése; mentés után PENDING index jobEDITOR, TENANT_ADMIN, SYSTEM_ADMIN
/admin/info/DELETEInfo elem törlése (és document_store chunkok)EDITOR, TENANT_ADMIN, SYSTEM_ADMIN
/admin/info/{item_id}/indexPOSTIndexelés kézi indítása (ha nincs már PENDING job)EDITOR, TENANT_ADMIN, SYSTEM_ADMIN
/admin/info/extract-filePOSTPDF / Word / TXT / MD → kinyert szöveg (multipart)EDITOR, TENANT_ADMIN, SYSTEM_ADMIN
/admin/info/generate-description/startPOSTAszinkron LLM: description + mintakérdésekEDITOR, TENANT_ADMIN, SYSTEM_ADMIN
/admin/info/generate-description/statusGETLLM job poll (job_id query)VIEWER+ (tenant saját job)
/admin/info/chat-settingsGETGeo + általános tudás flagokJWT (Info admin)
/admin/info/chat-settingsPUTFlagok mentéseJWT (Info admin)

GET /admin/info – lista

Query paraméterek: limit (default 100), offset, scope (internal/public), status (NOT_INDEXED, PENDING, PROCESSING, INDEXED, FAILED), search.

Válasz: { "items": [ ... ], "total": N }. Minden item: id, tenant_id, title, description, content (rövidítve 500 karig a listában), scope, is_active, indexing_status, created_at, updated_at, doc_id.

POST /admin/info – létrehozás

Request body:

json
{
  "title": "Gyakori kérdések",
  "description": "Regisztráció és bejelentkezés",
  "content": "Hogyan regisztrálok? A Regisztráció menüpontból...",
  "scope": "internal",
  "is_active": true
}
  • title: kötelező.
  • description: opcionális.
  • content: opcionális, max 100 000 karakter.
  • scope: "internal" vagy "public", default "internal".
  • is_active: default true.

Válasz: { "id": "uuid", "message": "Az indexelés hamarosan indul." }. Mentés után automatikusan PENDING index job kerül a sorba; az indexelés háttérben fut, az indexing_status majd INDEXED lesz.

PUT /admin/info/{item_id} – szerkesztés

Request body: title, description, content, scope, is_active (mind opcionális; csak a megadott mezők frissülnek). A content max 100 000 karakter. scope csak "internal" vagy "public".

Válasz: { "message": "Az indexelés hamarosan indul." } – új PENDING index job.

DELETE /admin/info/

Törli az info elemet és a hozzá tartozó chunkokat (doc_type=info). Válasz: { "message": "Deleted" }.

POST /admin/info/{item_id}/index

Indexelés kézi indítása. Ha már van PENDING job ehhez az elemhez, nem ad hozzá újat. Válasz: üzenet az indexelés indításáról.


Fájl feltöltés → tartalom (POST /admin/info/extract-file)

Az admin felületen a Fájl feltöltése gomb ezt az endpointot hívja: a feltöltött dokumentumból kinyeri a szöveget, amit az info elem content mezőjébe másolhatsz.

Hitelesítés: JWT (Authorization: Bearer ...). Szerepkör: EDITOR, TENANT_ADMIN vagy SYSTEM_ADMIN.

Kérés: multipart/form-data, mező: file.

Támogatott kiterjesztések: .pdf, .docx, .doc, .txt, .md, .markdown.

Korlátok:

  • Max fájlméret: 50 MB
  • A kinyert szöveg max 100 000 karakter (hosszabb esetén levágás + jelzés a szöveg végén)

Válasz (200):

json
{
  "filename": "aszf.pdf",
  "title_suggestion": "aszf",
  "content": "… kinyert szöveg …",
  "char_count": 12345
}
  • title_suggestion: a fájlnévből (kiterjesztés nélkül, _/- → szóköz).
  • content: a kinyert szöveg; ezt másold az űrlap content mezőjébe, vagy szerkeszd mentés előtt.

Hibák: 400 – hiányzó fájlnév, nem támogatott típus, üres kinyerés, túl nagy fájl.

Python példa – fájl kinyerés

python
import requests

BASE_URL = "https://<your-api-host>"
headers = {"Authorization": f"Bearer {JWT}"}

with open("aszf.pdf", "rb") as f:
    r = requests.post(
        f"{BASE_URL}/admin/info/extract-file",
        headers=headers,
        files={"file": ("aszf.pdf", f, "application/pdf")},
    )
print(r.json())

LLM leírás generálás (description mező)

A description mező segít a chat routingnak: mikor válassza ezt az info elemet. Az admin UI „LLM leírás generálása mentéskor” jelölőnégyzet mellett vagy külön gombbal indítható aszinkron LLM hívás.

Endpoint ID (token számlázás): info_description_generate — lásd /api/llm-models.

Előfeltétel: pozitív tenant token egyenleg; kimerült egyenleg → 402.

POST /admin/info/generate-description/start

Request body (JSON):

json
{
  "title": "ÁSZF",
  "content": "… a teljes info tartalom (kötelező) …"
}
  • content: kötelező, max 100 000 karakter.
  • title: opcionális; segíti az LLM-et.

Válasz (200):

json
{
  "job_id": "uuid",
  "message": "A leírás generálása elindult."
}

GET /admin/info/generate-description/status

Query: job_id (a start válaszából).

Válasz: { "status": "pending" | "done" | "error", "result"?: { "description": "…" }, "error"?: "…" }

  • done: a result.description tartalmazza a magyar leírást és a mintakérdések listáját (a chat routing számára).
  • error: LLM vagy feldolgozási hiba rövid üzenettel.
  • Lejárt vagy más tenant job → 404.

Flow: fájl / tartalom → LLM description → mentés → index

  1. Login – POST /auth/login.
  2. (Opcionális) Fájl kinyerés – POST /admin/info/extract-file → content + title_suggestion.
  3. (Opcionális) LLM description – POST …/generate-description/start → poll …/status → a description mező értéke.
  4. Info elem mentés – POST /admin/info vagy PUT /admin/info/{item_id} (title, description, content, scope).
  5. Indexelés – automatikus PENDING job; ellenőrzés GET /admin/info → indexing_status = INDEXED.
  6. Chat /info – POST /chat, text: /info ….

Python példa – LLM description poll

python
import time
import requests

BASE_URL = "https://<your-api-host>"
headers = {"Authorization": f"Bearer {JWT}", "Content-Type": "application/json"}

start = requests.post(
    f"{BASE_URL}/admin/info/generate-description/start",
    headers=headers,
    json={"title": "ÁSZF", "content": "1. A szolgáltatás használata…"},
).json()
job_id = start["job_id"]

for _ in range(60):
    st = requests.get(
        f"{BASE_URL}/admin/info/generate-description/status",
        headers=headers,
        params={"job_id": job_id},
    ).json()
    if st["status"] == "done":
        print(st["result"]["description"])
        break
    if st["status"] == "error":
        print("Hiba:", st.get("error"))
        break
    time.sleep(2)

Flow: létrehozás → indexelés → chat

  1. Login – POST /auth/login, JWT token.
  2. Info elem létrehozása – POST /admin/info (title, content, scope).
  3. Indexelés állapota – GET /admin/info; keressük az elem indexing_status mezőjét (PENDING → PROCESSING → INDEXED). INDEXED után a tartalom használható a /info chatben.
  4. Chat /info – POST /chat vagy POST /api/v1/chat, text: "/info <kérdés>".

Python példa: info létrehozás + lista

python
import requests

BASE_URL = "https://<your-api-host>"
token = "your-jwt-token"
headers = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}

# Létrehozás
r = requests.post(f"{BASE_URL}/admin/info", json={
    "title": "ÁSZF",
    "description": "Általános szerződési feltételek",
    "content": "1. A szolgáltatás használata...",
    "scope": "internal"
}, headers=headers)
data = r.json()
print("Created:", data.get("id"), data.get("message"))

# Lista (indexing_status ellenőrzés)
r2 = requests.get(f"{BASE_URL}/admin/info", headers=headers, params={"limit": 10})
items = r2.json().get("items", [])
for it in items:
    print(it["title"], "- status:", it.get("indexing_status"))

További információ