adrienbrault/instructrice-bundle

Typed LLM Outputs with Symfony

Maintainers

👁 AdrienBrault

Package info

github.com/adrienbrault/instructrice-bundle

pkg:composer/adrienbrault/instructrice-bundle

Statistics

Installs: 699

Dependents: 0

Suggesters: 0

Stars: 3

Open Issues: 0

dev-main 2024-05-31 22:03 UTC

Suggests

None

Provides

None

Conflicts

None

Replaces

None

MIT d86ee665478022acf0ce57e5ea5bfba6a76f93cb

  • Adrien Brault <adrien.brault.woop@gmail.com>

This package is auto-updated.

Last update: 2026-06-29 02:14:58 UTC


README

Symfony bundle for the adrienbrault/instructrice library.

Install the bundle:

composer require adrienbrault/instructrice-bundle:@dev adrienbrault/instructrice:@dev

Configure api keys:

# config/packages/instructrice.yaml
instructrice:
 default: '%env(string:INSTRUCTRICE_DSN)%'
 #default: Ollama::HERMES2THETA_LLAMA3_8B
 anthropic:
 api_key: '%env(string:default::ANTHROPIC_API_KEY)%'
 anyscale:
 api_key: '%env(string:default::ANYSCALE_API_KEY)%'
 deepinfra:
 api_key: '%env(string:default::DEEPINFRA_API_KEY)%'
 fireworks:
 api_key: '%env(string:default::FIREWORKS_API_KEY)%'
 groq:
 api_key: '%env(string:default::GROQ_API_KEY)%'
 google:
 api_key: '%env(string:default::GEMINI_API_KEY)%'
 mistral:
 api_key: '%env(string:default::MISTRAL_API_KEY)%'
 ollama:
 api_key: '%env(string:default::OLLAMA_API_KEY)%'
 openai:
 api_key: '%env(string:default::OPENAI_API_KEY)%'
 perplexity:
 api_key: '%env(string:default::PERPLEXITY_API_KEY)%'
 together:
 api_key: '%env(string:default::TOGETHER_API_KEY)%'

Use instructrice:

use AdrienBrault\Instructrice\Instructrice;
use AdrienBrault\Instructrice\LLM\Provider\OpenAi;

public function controller(Instructrice $instructrice, HubInterface $hub)
{
 $sentiment = $instructrice->get(
 type: [
 'type' => 'string',
 'enum' => ['positive', 'neutral', 'negative'],
 ],
 'Pretty descent!',
 'Sentiment analysis',
 llm: OpenAi::GPT_4T,
 );
}

You can use Mercure to update your frontend while the LLM is completing JSON, using the onChunk callback:

use AdrienBrault\Instructrice\Instructrice;
use AdrienBrault\Instructrice\LLM\LLMChunk;
use AdrienBrault\Instructrice\LLM\Provider\OpenAi;
use Symfony\Component\Mercure\HubInterface;
use Symfony\Component\Mercure\Update;

public function controller(Instructrice $instructrice, HubInterface $hub)
{
 $context = 'web page html converted to markdown';
 $context = 'email html body converted to markdown';
 // See https://github.com/thephpleague/html-to-markdown
 // And I highly suggest making sure League\HTMLToMarkdown\Converter\TableConverter is enabled!

 $products = $instructrice->getList(
 Product::class,
 $context,
 'Find all the products!',
 llm: OpenAi::GPT_4T,
 onChunk: function (array $products, LLMChunk $chunk) use ($hub) {
 // FYI: $chunk->propertyPath
 // You could leverage that to only update each property once in the UI, instead of streaming every single character

 $hub->publish(new Update(
 'product_123',
 $this->renderView('product.stream.html.twig', [
 'products' => $products,
 ])
 ));
 },
 );
}