sop / json-generator-parser
Event-driven recursion free SAX-style parser for JSON fed by generator
Installs: 5
Dependents: 0
Suggesters: 0
Security: 0
Stars: 0
Watchers: 0
Forks: 0
Open Issues: 0
pkg:composer/sop/json-generator-parser
Requires
- php: >=8.2
Requires (Dev)
- friendsofphp/php-cs-fixer: 3.91.3
- phpunit/phpunit: ^11
README
A PHP library for event-driven recursion free SAX-style JSON parser fed by generator.
Rationale
Provide a JSON parser with lenient rules that accepts input from an LLM stream.
There are cases where you need a structured LLM response, but want to display output to the user as soon as there are token stream available. This library provides a listener interface, that is called as JSON is parsed.
As LLM's may generate a bit wonky JSON, this library has a non-strict option that permits various JSON errors, which wouldn't change the semantic meaning of the response.
Requirements
- PHP >=8.2
Installation
This library is available on Packagist.
composer require sop/json-generator-parser
Example
Here we receive a stream from LLM HTTP API. We assume that stream is already
processed such that $lines generator yields logical SSE lines.
$lines = ... // Generator that produces lines from HTTP SSE stream $input = (function (Generator $lines): Generator { foreach ($lines as $line) { // Just an example, no error checking nor validation if (!str_starts_with($line, 'data:')) { continue; } $json = trim(substr($line, 5)); $data = json_decode($json); // Yield content delta chunks if (!empty($data->choices[0]->delta->content)) { yield $data->choices[0]->delta->content; } } })($lines); $listener = new CallbackJSONListener( function (array $keys, mixed $value): void { // Here you can handle parsed values. // Keys contain all structural indices leading to the value. // eg. for `{"a":["x","y","z"]}` JSON the second array value would // have keys ["a", 1] and value "y" } ); $parser = new JSONGeneratorParser($listener, false); $parser->parse($input, true);
License
This project is licensed under the MIT License.