---
title: 'Modellszolgáltatás (LLM)'
url: 'https://wiki.teletypegames.org/hu/infrastructure/llm'
markdown: 'https://wiki.teletypegames.org/hu/infrastructure/llm.md'
lang: hu
date: '2026-10-21'
description: 'Egy hely a szerveren, ahol kis nyelvi modellek futnak, bármelyik stacknek, amelyiknek kell. Az OpenAI chat API-t beszéli, így bármely OpenAI-kompatibilis kliens működik vele. Csak az interstack docker-hálózatról érhető el, az internetről nem. Repó: git.teletypegames.org/infra/llm Cím: http://llm…'
taxonomy:
  tag:
    - howto
---

# Modellszolgáltatás (LLM)

> Egy hely a szerveren, ahol kis nyelvi modellek futnak, bármelyik stacknek, amelyiknek kell. Az OpenAI chat API-t beszéli, így bármely OpenAI-kompatibilis kliens működik vele. Csak az `interstack` docker-hálózatról érhető el, az internetről nem.

- **Repó:** [git.teletypegames.org/infra/llm](https://git.teletypegames.org/infra/llm)
- **Cím:** `http://llm:8080` az `interstack`-en

# Hívás

```
POST http://llm:8080/v1/chat/completions
Authorization: Bearer <kulcs>
{"model": "qwen3.5-0.8b", "messages": [...], "stream": true}
```

Minden kérés megnevezi a modelljét: alapértelmezett nincs, a `model` nélküli kérés 400-at kap. A `GET /v1/models` listázza a modelleket és hogy be vannak-e töltve; a `GET /health`-hez nem kell kulcs.

| Modell | `model` | Ki használja |
|---|---|---|
| Qwen3.5 0.8B | `qwen3.5-0.8b` | a SERMO Lapis-ACP-je a [Teletype BBS](https://wiki.teletypegames.org/hu/services/teletype-bbs)-ben, és bármelyik stack: általános kis modell, angolul és JSON-ban jó, magyarul csak nagyjából; gondolkodó mód kikapcsolva; induláskor betöltődik |
| Gemma 3 270M instruct | `gemma-3-270m` | most senki (2026 októberéig a SERMO modellje): a leggyorsabb, de a példáin túli kérdéseknél kiesik a szerepből; az első kérésére töltődik be |

# Modellek

A szerver a llama.cpp `llama-server`-e router-módban: modellenként igény szerint indít egy llama-servert. A modellek a repó `server/models.ini`-jének szekciói, a szolgáltatás image-ébe sütve; a szekció neve a kérés `model`-je, a kulcsai a llama-server hosszú kapcsolói (`hf-repo`, `c`, `parallel`, ...). A GGUF-ot az első betöltéskor tölti le a Hugging Face-ről, és egy volume-ban tartja.

- A `load-on-startup = true` modell a szolgáltatás indulásakor betöltődik (a Qwen3.5, hogy a SERMO-nak ne kelljen várnia). A többi az első kérésére.
- Egyszerre legfeljebb két modell van betöltve; a harmadik a legrégebben használtat üríti.
- Egy memóriakeret (2,5 GB) fedi az összes betöltött modellt (a fenti kettő együtt kb. 2 GB), és a szerver CPU-ján is osztoznak. Nagyobb modellhez nagyobb keret kell, és a hosszú kérései lassítják a többit.

Új modell = egy új szekció a `server/models.ini`-ben és egy push: a deploy új image-et épít, és azzal indítja újra a szolgáltatást.

# Kulcsok

Router-módban HTTP-n modellt is lehet betölteni és üríteni, ezért a szolgáltatás kulcsot kér. A stack `.env`-jében az `LLM_API_KEYS` tartja az elfogadott kulcsokat, hívónként egyet, így egy hívó külön letiltható.

| Hívó | A kulcsa |
|---|---|
| [Teletype BBS](https://wiki.teletypegames.org/hu/services/teletype-bbs) | `SERMO_LLM_API_KEY` a `teletype-bbs` stack `.env`-jében |

Új hívó új kulcsot kap (`openssl rand -hex 24`), az `LLM_API_KEYS` végére.

# Üzembe helyezés

A stack a `/srv/stacks/llm`-ben él, ami nem git checkout. A masterre pusholt, a `compose.yaml`-t vagy a `server/`-t érintő változást a Woodpecker telepíti, ugyanúgy, mint az [FTP-szervert](https://wiki.teletypegames.org/hu/infrastructure/ftp-server): a pipeline csak meghívja a szervert SSH-n, saját kulccsal, amely egyetlen fix parancshoz van kötve (`ci-deploy llm`, az `infra/host-config`-ban). A szerver maga klónozza a mastert, a compose-fájlt a szabályai szerint ellenőrzi (nincs extra jogosultság, docker socket, publikus port), bemásolja a `compose.yaml`-t és a `server/`-t, és lefuttatja a `docker compose up -d --build`-et. A `.env` és a modell-volume marad. A pipeline nem kap hoszt-volume-ot.

'; var prevLevel = 2; for (var i = 0; i < headings.length; i++) { var h = headings\[i\]; var text = h.textContent.trim(); var slug = text.toLowerCase() .replace(/\[áàâä\]/g,'a').replace(/\[éèêë\]/g,'e').replace(/\[íìîï\]/g,'i') .replace(/\[óòôöő\]/g,'o').replace(/\[úùûüű\]/g,'u') .replace(/\[^a-z0-9\]+/g, '-').replace(/^-|-$/g, ''); if (!slug) slug = 'heading-' + i; if (used\[slug\]) { slug += '-' + i; } used\[slug\] = true; h.id = slug; var level = parseInt(h.tagName.charAt(1)); var cls = level > 2 ? ' class="toc-child"' : ''; html += '- [' + text + '](#'%20+%20slug%20+%20')
'; } html += '
'; toc.innerHTML = html; // Scroll-spy: highlight current heading var links = toc.querySelectorAll('a'); var ids = \[\]; for (var j = 0; j < links.length; j++) ids.push(links\[j\].getAttribute('href').slice(1)); function updateActive() { var current = ''; for (var k = 0; k < ids.length; k++) { var el = document.getElementById(ids\[k\]); if (el && el.getBoundingClientRect().top <= 80) current = ids\[k\]; } for (var m = 0; m < links.length; m++) { links\[m\].parentNode.classList.toggle('active', links\[m\].getAttribute('href') === '#' + current); } } window.addEventListener('scroll', updateActive, { passive: true }); updateActive(); })();

---

## Navigation

- Parent: [Infrastruktúra](https://wiki.teletypegames.org/hu/infrastructure.md)
- Previous: [Központi belépés (Authentik)](https://wiki.teletypegames.org/hu/infrastructure/idp.md)
- Next: [Matomo](https://wiki.teletypegames.org/hu/infrastructure/matomo.md)
