<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>GBNF — Inferownia</title><link>https://inferownia.pl/tags/gbnf/</link><description>Inferownia — polski hub wiedzy o lokalnym AI: uruchamianie modeli językowych na własnym sprzęcie, kwantyzacja, inferencja, małe modele, fine-tuning i RAG.</description><language>pl-PL</language><copyright>&#169; 2026 Inferownia</copyright><lastBuildDate>Mon, 06 Jul 2026 00:00:00 +0200</lastBuildDate><atom:link href="https://inferownia.pl/tags/gbnf/index.xml" rel="self" type="application/rss+xml"/><item><title>Wymuszanie JSON-a w llama.cpp: gramatyki GBNF</title><link>https://inferownia.pl/poradniki/gbnf-json/</link><pubDate>Mon, 06 Jul 2026 00:00:00 +0200</pubDate><category>inferencja</category><guid>https://inferownia.pl/poradniki/gbnf-json/</guid><description>Prosisz model o czysty JSON, a dostajesz esej, blok w markdownie i przecinek w złym miejscu. Gramatyki GBNF w llama.cpp odbierają mu wybór: model może wypluć tylko te tokeny, które pasują do reguł. Rozbieramy, jak to działa na poziomie samplera.</description><content:encoded><![CDATA[<p>Znasz ten moment. Piszesz w prompcie wielkimi literami „ODPOWIEDZ WYŁĄCZNIE POPRAWNYM
JSON-em, BEZ ŻADNEGO KOMENTARZA&quot;, dorzucasz przykład, błagalnie dodajesz „no proszę&quot;,
a model i tak zaczyna od „Oczywiście! Oto Twój JSON:&quot;, opakowuje go w blok <code>```json</code>,
gdzieś w środku gubi cudzysłów, a na końcu dorzuca jeszcze zdanie, że gdyby coś, to chętnie
pomoże dalej. Twój <code>json.loads()</code> wybucha, a ty siedzisz i parsujesz to regexpem jak jaskiniowiec.
To częsty punkt zapalny — rozjechany nawias, ucięty cudzysłów i podpis w stylu
„przecież prosiłem grzecznie&quot;.</p>
<p>No i tu jest cały myk: prośba w prompcie to prośba. Model może ją spełnić albo nie, bo prompt
to tylko sugestia w tekście. A gramatyka GBNF to coś zupełnie innego — to kaganiec założony na
sampler. Nie mówisz modelowi „bądź tak miły i zwróć JSON&quot;. Ty mu fizycznie <strong>nie pozwalasz</strong>
wygenerować tokenu, który by JSON-a psuł. Różnica jak między „proszę, nie wychodź poza linie&quot;
a kartką do kolorowania, w której poza liniami po prostu nie ma gdzie pociągnąć kredką.</p>
<h2 id="o-co-chodzi-z-gbnf">O co chodzi z GBNF</h2>
<p>GBNF (GGML BNF) to format gramatyki formalnej, którym <code>llama.cpp</code> ogranicza — po angielsku
<em>constrain</em> — to, co model może wygenerować.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Nazwa zdradza rodowód: to wariant
BNF-a, tej samej notacji, którą od dekad opisuje się składnię języków programowania. Piszesz
zestaw reguł „co po czym może stać&quot;, a silnik pilnuje, żeby wyjście trzymało się tych reguł
znak po znaku, token po tokenie.</p>
<p>W praktyce masz dwie drogi do tego samego celu. Albo piszesz gramatykę GBNF ręcznie i podajesz
ją flagą <code>--grammar</code> (wprost jako string) lub <code>--grammar-file</code> (z pliku).<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> Albo, jeśli
myślisz kategoriami JSON Schema, podajesz schemat flagą <code>-j</code> / <code>--json-schema</code> — a <code>llama.cpp</code>
sam przemieli go wewnętrznie na GBNF funkcją <code>json_schema_to_grammar</code>.<sup id="fnref1:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> Do tego jest
bliźniacza para <code>-jf</code> / <code>--json-schema-file</code>, gdy schemat wolisz trzymać w pliku. Efekt
końcowy ten sam: pod spodem i tak rządzi gramatyka.</p>
<div class="callout">
  <span class="callout__label">Dlaczego to ważne dla lokalnego LLM</span>
<p>Najważniejsza rzecz, którą trzeba zrozumieć, i zarazem najczęstszy mit: schemat ani gramatyka
<strong>nie trafiają do promptu</strong>. Model nie widzi w kontekście ani jednej reguły — nie dostaje
few-shota, nie dostaje instrukcji „pamiętaj o cudzysłowach&quot;. Ograniczenie działa wyłącznie na
poziomie samplera, przy każdym kolejnym generowanym tokenie.<sup id="fnref1:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> To dlatego działa nawet
na małym modelu, który normalnie olewa prośby o format: nie prosisz go o współpracę, tylko
zamykasz mu wszystkie złe drzwi.</p>
</div>
<h2 id="jak-to-w-ogóle-działa-pod-maską">Jak to w ogóle działa pod maską?</h2>
<p>Skoro model niczego nie widzi w prompcie, to skąd wie, że ma trzymać się formatu? Nie wie.
I to jest piękne. Cała robota dzieje się piętro niżej, w samplerze — komponencie, który po
każdym przejściu przez sieć wybiera następny token z rozkładu prawdopodobieństw.</p>
<p>Przypomnij sobie, jak model generuje. Sieć wypluwa <strong>logity</strong> — po jednej liczbie na każdy
token ze słownika, im wyższa, tym „chętniej&quot; model by go postawił. Normalnie sampler bierze
tę tablicę kandydatów (<code>llama_token_data_array</code>) i losuje z niej według reguł temperatury,
top-p i reszty pokręteł, które rozgryzaliśmy <a href="/poradniki/flagi-llama-cpp/">tutaj</a>. Gramatyka
wciska się dokładnie w to miejsce, tuż przed losowaniem. Funkcja <code>llama_grammar_apply_impl</code>
przechodzi po całej tablicy kandydatów i każdemu tokenowi, który <strong>nie pasuje</strong> do gramatyki,
ustawia logit na <code>-inf</code>.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> Minus nieskończoność to wyrok: taki token ma po
softmaksie prawdopodobieństwo zero, więc sampler nie ma prawa go wybrać, choćby model bardzo
chciał. To właśnie <strong>maskowanie logitów</strong> — zerowanie szans tokenów niezgodnych z regułami.</p>
<p>A skąd gramatyka wie, co „pasuje&quot; akurat teraz? Trzyma stan. I to nie jeden stan, tylko cały
zbiór jednoczesnych stosów — klasyczny automat ze stosem (<em>pushdown automaton</em>). Każdy stos
to jedna możliwa ścieżka przez gramatykę, zgodna z tym, co model wygenerował do tej pory.
Token przeżywa tylko wtedy, gdy pasuje do terminala na szczycie <strong>któregokolwiek</strong> z aktywnych
stosów — jeśli nie pasuje do żadnego, dostaje <code>-inf</code> i wypada.<sup id="fnref1:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> Kiedy token już
zostanie wybrany, <code>llama_grammar_accept</code> przesuwa stan gramatyki po zaakceptowanych znakach,
stosy się aktualizują, część ścieżek umiera, część zostaje — i cała zabawa leci od nowa przy
następnym tokenie.<sup id="fnref2:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>Wyobraź sobie to jak korytarz z bramkami. Model na każdym kroku pcha się we wszystkie drzwi
naraz, a gramatyka trzyma przy każdych strażnika, który przepuszcza tylko wtedy, gdy za drzwiami
jest legalna kontynuacja. Model nie musi znać planu budynku — i tak nie skręci w ślepy zaułek,
bo tamtędy fizycznie nie da się przejść.</p>
<h2 id="składnia-w-pigułce">Składnia w pigułce</h2>
<p>GBNF wygląda znajomo dla każdego, kto liznął kiedyś opis gramatyki. Reguła to
<code>nonterminal ::= sekwencja</code>. Klocki, z których się to składa:<sup id="fnref2:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<ul>
<li><strong>Terminale</strong> — literały w cudzysłowach (<code>&quot;1&quot;</code>, <code>&quot;true&quot;</code>) albo zakresy znaków w nawiasach
kwadratowych (<code>[0-9]</code>, <code>[a-zA-Z]</code>), z negacją przez <code>^</code> (<code>[^&quot;]</code> = cokolwiek poza cudzysłowem).</li>
<li><strong>Operatory powtórzeń</strong> — <code>*</code> (zero lub więcej), <code>+</code> (jeden lub więcej), <code>?</code> (opcjonalnie),
oraz precyzyjne <code>{m}</code>, <code>{m,}</code>, <code>{m,n}</code> (dokładnie / co najmniej / od–do).</li>
<li><strong>Alternatywy</strong> przez <code>|</code> i <strong>grupowanie</strong> przez <code>( )</code> — dokładnie jak w regexpach.</li>
<li><strong>Unicode</strong> w komplecie, z ucieczkami <code>\xXX</code> (8-bit), <code>\uXXXX</code> (16-bit) i <code>\UXXXXXXXX</code>
(32-bit), więc polskie znaki czy emoji nie są problemem.</li>
</ul>
<p>Jest też smaczek, którego regexp nie ma: GBNF potrafi dopasowywać po konkretnych <strong>tokenach
tokenizera</strong>, nie po znakach. <code>&lt;[1000]&gt;</code> to token o ID 1000, <code>&lt;think&gt;</code> to token o dokładnym
tekście <code>think</code>, a <code>!&lt;...&gt;</code> to negacja.<sup id="fnref3:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Przydaje się, gdy chcesz np. sterować
sekcjami <code>&lt;think&gt;...&lt;/think&gt;</code> u modeli rozumujących — operujesz wtedy na realnych tokenach,
a nie zgadujesz, jak model potnie tekst.</p>
<p>Jedna pułapka na start: nazwy nieterminali piszemy <strong>małymi literami z myślnikami</strong>
(<code>item-name-kv</code>), nie <code>camelCase</code> i nie z podkreślnikami. Tak jest w oficjalnych przykładach
i tego się trzymaj.<sup id="fnref4:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<h2 id="mały-przykład-od-zera">Mały przykład od zera</h2>
<p>Powiedzmy, że chcesz z modelu wyciągnąć obiekt z polem <code>name</code> (tekst) i <code>age</code> (liczba).
Minimalna gramatyka, w duchu przykładu z oficjalnego README:<sup id="fnref5:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-fallback" data-lang="fallback"><span class="line"><span class="cl">root   ::= &#34;{&#34; ws &#34;\&#34;name\&#34;:&#34; ws string &#34;,&#34; ws &#34;\&#34;age\&#34;:&#34; ws number ws &#34;}&#34;
</span></span><span class="line"><span class="cl">string ::= &#34;\&#34;&#34; char{1,100} &#34;\&#34;&#34;
</span></span><span class="line"><span class="cl">char   ::= [^&#34;\\]
</span></span><span class="line"><span class="cl">number ::= [0-9]+
</span></span><span class="line"><span class="cl">ws     ::= [ \t\n]*
</span></span></code></pre></div><p>Czyta się to prawie jak zdanie: korzeń to klamra, w środku pole <code>name</code> ze stringiem od 1 do
100 znaków, przecinek, pole <code>age</code> z liczbą, klamra zamykająca — a <code>ws</code> to opcjonalne białe
znaki, żeby model mógł sobie ładnie wciąć. Podajesz to modelowi i już na poziomie samplera
nie ma opcji, żeby zaczął od „Oto JSON:&quot;. Pierwszy token, który wolno postawić, to <code>{</code>.
Kropka. Cała reszta korytarza jest zamknięta.</p>
<p>Odpalasz to najprościej tak — gramatyka wprost w linii poleceń:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">llama-cli -m qwen2.5-7b-instruct-q4_k_m.gguf <span class="se">\
</span></span></span><span class="line"><span class="cl">  --grammar <span class="s1">&#39;root ::= &#34;{&#34; &#34;\&#34;ok\&#34;:&#34; (&#34;true&#34; | &#34;false&#34;) &#34;}&#34;&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -p <span class="s2">&#34;Czy 7 jest liczbą pierwszą? Odpowiedz.&#34;</span> -no-cnv
</span></span></code></pre></div><p>Albo, gdy myślisz schematami, oddajesz robotę konwerterowi. <code>--json-schema '{}'</code> przyjmie
dowolny JSON, a węższy schemat zawęzi wyjście:<sup id="fnref2:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">llama-cli -m qwen2.5-7b-instruct-q4_k_m.gguf <span class="se">\
</span></span></span><span class="line"><span class="cl">  --json-schema <span class="s1">&#39;{&#34;type&#34;:&#34;object&#34;,&#34;properties&#34;:{&#34;pierwsza&#34;:{&#34;type&#34;:&#34;boolean&#34;}},&#34;required&#34;:[&#34;pierwsza&#34;]}&#39;</span> <span class="se">\
</span></span></span><span class="line"><span class="cl">  -p <span class="s2">&#34;Czy 7 jest liczbą pierwszą?&#34;</span> -no-cnv
</span></span></code></pre></div><h2 id="--grammar-czy---json-schema-to-nie-to-samo"><code>--grammar</code> czy <code>--json-schema</code>? To nie to samo</h2>
<p>Łatwo je pomylić, bo cel jest jeden, ale wejście zupełnie inne. Ściągawka:</p>
<table>
	<thead>
			<tr>
					<th></th>
					<th><code>--grammar</code> / <code>--grammar-file</code></th>
					<th><code>-j</code> / <code>--json-schema</code> (+ <code>-jf</code> z pliku)</th>
			</tr>
	</thead>
	<tbody>
			<tr>
					<td>Co podajesz</td>
					<td>gotowy GBNF, napisany ręcznie</td>
					<td>schemat JSON Schema (json-schema.org)</td>
			</tr>
			<tr>
					<td>Kto pisze gramatykę</td>
					<td>ty</td>
					<td><code>json_schema_to_grammar</code>, automatycznie</td>
			</tr>
			<tr>
					<td>Kiedy sięgać</td>
					<td>dowolna struktura, nie tylko JSON</td>
					<td>masz już schemat, myślisz „typami&quot;</td>
			</tr>
			<tr>
					<td>Złożone <code>$ref</code></td>
					<td>ogarnia, bo piszesz wprost</td>
					<td>patrz niżej — jest haczyk</td>
			</tr>
	</tbody>
</table>
<p>Mechanizm wykonawczy w obu wypadkach ten sam: pod spodem i tak powstaje GBNF, który maskuje
logity. To dwa różne wejścia do tej samej maszyny.</p>
<p>I ten haczyk z <code>$ref</code>: jeśli twój schemat JSON Schema wciąga zewnętrzne referencje (<code>$ref</code> do
innych plików), <code>--json-schema</code> może się na tym wyłożyć. Oficjalna dokumentacja radzi wtedy
wygenerować GBNF <strong>offline</strong> skryptem <code>examples/json_schema_to_grammar.py</code>, zapisać do pliku
i podać go przez <code>--grammar-file</code>.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup> Rozdzielasz konwersję od inferencji — najpierw
w spokoju robisz gramatykę, potem karmisz nią model.</p>
<h2 id="gramatyka-pilnuje-składni-nie-sensu">Gramatyka pilnuje składni, nie sensu</h2>
<p>Zanim uwierzysz, że rozwiązałeś wszystkie problemy świata — jedno trzeźwiące zastrzeżenie.
Gramatyka gwarantuje ci poprawną <strong>składnię</strong>, nie <strong>semantykę</strong>. Wymusisz, że <code>age</code> to
liczba — ale nic nie broni modelowi wpisać tam <code>999</code>, jeśli akurat tak mu wyjdzie z rozkładu.
Wymusisz strukturę odpowiedzi RAG-owej — ale nie to, że treść w polach będzie prawdziwa;
o samym łączeniu wyszukiwania z generacją pisaliśmy <a href="/poradniki/rag-lokalnie/">tutaj</a>.
GBNF ogranicza dopuszczalne <strong>sekwencje tokenów</strong>, a nie sens tego, co w nich siedzi. To
kaganiec na formę, nie na głupoty. Walidację wartości i logikę trzymaj po swojej stronie,
tak jak trzymałeś ją zawsze.</p>
<h2 id="zrób-to-sam-przez-serwer">Zrób to sam: przez serwer</h2>
<p>Na co dzień najwygodniej pchać to przez <code>llama-server</code>. Endpoint <code>/completion</code> przyjmuje
w body te same dwa parametry co CLI: <code>grammar</code> (tekst GBNF) oraz <code>json_schema</code> (schemat JSON),
oba domyślnie puste.<sup id="fnref:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup> Odpalasz serwer raz:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">llama-server -m qwen2.5-7b-instruct-q4_k_m.gguf -ngl all -c <span class="m">8192</span> --port <span class="m">8080</span>
</span></span></code></pre></div><p>i strzelasz do niego z gramatyką w środku:</p>
<div class="highlight"><pre tabindex="0" class="chroma"><code class="language-bash" data-lang="bash"><span class="line"><span class="cl">curl -s http://localhost:8080/completion -d <span class="s1">&#39;{
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;prompt&#34;: &#34;Wygeneruj kartę postaci.&#34;,
</span></span></span><span class="line"><span class="cl"><span class="s1">  &#34;grammar&#34;: &#34;root ::= \&#34;{\&#34; \&#34;\\\&#34;imie\\\&#34;:\&#34; \&#34;\\\&#34;\&#34; [a-zA-Z]+ \&#34;\\\&#34;\&#34; \&#34;}\&#34;&#34;
</span></span></span><span class="line"><span class="cl"><span class="s1">}&#39;</span>
</span></span></code></pre></div><p>Jak wsadzisz gramatykę z błędem składni, serwer nie udaje, że jest dobrze — odbija żądanie
z HTTP 400 i komunikatem <code>Failed to parse grammar</code>.<sup id="fnref1:5"><a href="#fn:5" class="footnote-ref" role="doc-noteref">5</a></sup> To dobra wiadomość: literówkę
w regule wyłapiesz od razu, na etapie parsowania, a nie po godzinie zastanawiania się, czemu
wyjście wygląda dziwnie. Gotowe przykłady GBNF — w tym pełną gramatykę dla tablicy obiektów
JSON — znajdziesz w katalogu <code>grammars/</code> w repo <code>ggml-org/llama.cpp</code>.<sup id="fnref6:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>Bo cała ta zabawa sprowadza się do jednej zmiany perspektywy. Przestajesz błagać model
o dobry format i zaczynasz mu ten format wytyczać — nie słowami w prompcie, których i tak
może nie usłuchać, tylko ścianami korytarza, którymi go prowadzisz. Model dalej myśli, co
chce. Po prostu wyjściem z tego myślenia jest już tylko ta jedna furtka, którą sam mu
zostawiłeś otwartą.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Pełna składnia GBNF (reguły <code>nonterminal ::=</code>, terminale, zakresy znaków, operatory powtórzeń, dopasowanie po tokenach <code>&lt;[...]&gt;</code>), przykładowa gramatyka JSON oraz uwaga, że schemat/gramatyka nie trafiają do promptu — <a href="https://github.com/ggml-org/llama.cpp/blob/master/grammars/README.md">grammars/README.md, ggml-org/llama.cpp</a>.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref2:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref3:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref4:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref5:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref6:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Definicje i teksty pomocy flag <code>--grammar</code>, <code>--grammar-file</code>, <code>-j</code>/<code>--json-schema</code>, <code>-jf</code>/<code>--json-schema-file</code> oraz konwersja przez <code>json_schema_to_grammar</code> — <a href="https://github.com/ggml-org/llama.cpp/blob/master/common/arg.cpp">common/arg.cpp, ggml-org/llama.cpp</a>.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref2:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Sygnatury <code>llama_grammar_apply_impl</code> (nakłada ograniczenia gramatyki na tablicę kandydatów tokenów / logity) i <code>llama_grammar_accept</code> (przesuwa stan po zaakceptowanym znaku), potwierdzające mechanizm stosów pushdown i maskowanie logitów — <a href="https://github.com/ggml-org/llama.cpp/blob/master/src/llama-grammar.h">src/llama-grammar.h, ggml-org/llama.cpp</a>.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref2:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Opis flag <code>--grammar</code>/<code>--grammar-file</code>/<code>--json-schema</code> w narzędziu CLI oraz rekomendacja <code>--grammar</code> + <code>examples/json_schema_to_grammar.py</code> dla schematów z zewnętrznymi <code>$ref</code> — <a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/cli/README.md">tools/cli/README.md, ggml-org/llama.cpp</a>.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:5">
<p>Parametry <code>grammar</code> i <code>json_schema</code> w body żądania <code>/completion</code> (domyślnie puste) oraz zachowanie przy błędnej gramatyce (HTTP 400, <code>Failed to parse grammar</code>) — <a href="https://github.com/ggml-org/llama.cpp/blob/master/tools/server/README.md">tools/server/README.md, ggml-org/llama.cpp</a>.&#160;<a href="#fnref:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a>&#160;<a href="#fnref1:5" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></content:encoded></item></channel></rss>