Skip to content

Symfony integration bundle for php-llm/llm-chain library.

License

Notifications You must be signed in to change notification settings

php-llm/llm-chain-bundle

Folders and files

NameName
Last commit message
Last commit date
Mar 7, 2025
Mar 20, 2025
Mar 20, 2025
Sep 28, 2024
Sep 22, 2024
Jun 24, 2024
Mar 7, 2025
Mar 20, 2025
Mar 20, 2025
Sep 22, 2024
Sep 28, 2024
Dec 12, 2024
Mar 7, 2025

Repository files navigation

LLM Chain Bundle

Symfony integration bundle for php-llm/llm-chain library.

Installation

composer require php-llm/llm-chain-bundle

Configuration

Simple Example with OpenAI

# config/packages/llm_chain.yaml
llm_chain:
    platform:
        openai:
            api_key: '%env(OPENAI_API_KEY)%'
    chain:
        default:
            model:
                name: 'GPT'

Advanced Example with Anthropic, Azure, Google and multiple chains

# config/packages/llm_chain.yaml
llm_chain:
    platform:
        anthropic:
            api_key: '%env(ANTHROPIC_API_KEY)%'
        azure:
            # multiple deployments possible
            gpt_deployment:
                base_url: '%env(AZURE_OPENAI_BASEURL)%'
                deployment: '%env(AZURE_OPENAI_GPT)%'
                api_key: '%env(AZURE_OPENAI_KEY)%'
                api_version: '%env(AZURE_GPT_VERSION)%'
        google:
            api_key: '%env(GOOGLE_API_KEY)%'
    chain:
        rag:
            platform: 'llm_chain.platform.azure.gpt_deployment'
            structured_output: false # Disables support for "output_structure" option, default is true
            model:
                name: 'GPT'
                version: 'gpt-4o-mini'
            system_prompt: 'You are a helpful assistant that can answer questions.' # The default system prompt of the chain
            include_tools: true # Include tool definitions at the end of the system prompt 
            tools:
                # Referencing a service with #[AsTool] attribute
                - 'PhpLlm\LlmChain\Chain\Toolbox\Tool\SimilaritySearch'
                
                # Referencing a service without #[AsTool] attribute
                - service: 'App\Chain\Tool\CompanyName'
                  name: 'company_name'
                  description: 'Provides the name of your company'
                  method: 'foo' # Optional with default value '__invoke'
                
                # Referencing a chain => chain in chain 🤯
                - service: 'llm_chain.chain.research'
                  name: 'wikipedia_research'
                  description: 'Can research on Wikipedia'
                  is_chain: true
        research:
            platform: 'llm_chain.platform.anthropic'
            model:
                name: 'Claude'
            tools: # If undefined, all tools are injected into the chain, use "tools: false" to disable tools.
                - 'PhpLlm\LlmChain\Chain\Toolbox\Tool\Wikipedia'
            fault_tolerant_toolbox: false # Disables fault tolerant toolbox, default is true
    store:
        # also azure_search, mongodb and pinecone are supported as store type
        chroma_db:
            # multiple collections possible per type
            default:
                collection: 'my_collection'
    embedder:
        default:
            # platform: 'llm_chain.platform.anthropic'
            # store: 'llm_chain.store.chroma_db.default'
            model:
                name: 'Embeddings'
                version: 'text-embedding-ada-002'

Usage

Chain Service

Use the Chain service to leverage GPT:

use PhpLlm\LlmChain\ChainInterface;
use PhpLlm\LlmChain\Model\Message\Message;
use PhpLlm\LlmChain\Model\Message\MessageBag;

final readonly class MyService
{
    public function __construct(
        private ChainInterface $chain,
    ) {
    }
    
    public function submit(string $message): string
    {
        $messages = new MessageBag(
            Message::forSystem('Speak like a pirate.'),
            Message::ofUser($message),
        );

        return $this->chain->call($messages);
    }
}

Register Tools

To use existing tools, you can register them as a service:

services:
    _defaults:
        autowire: true
        autoconfigure: true

    PhpLlm\LlmChain\Chain\Toolbox\Tool\Clock: ~
    PhpLlm\LlmChain\Chain\Toolbox\Tool\OpenMeteo: ~
    PhpLlm\LlmChain\Chain\Toolbox\Tool\SerpApi:
        $apiKey: '%env(SERP_API_KEY)%'
    PhpLlm\LlmChain\Chain\Toolbox\Tool\SimilaritySearch: ~
    PhpLlm\LlmChain\Chain\Toolbox\Tool\Tavily:
      $apiKey: '%env(TAVILY_API_KEY)%'
    PhpLlm\LlmChain\Chain\Toolbox\Tool\Wikipedia: ~
    PhpLlm\LlmChain\Chain\Toolbox\Tool\YouTubeTranscriber: ~

Custom tools can be registered by using the #[AsTool] attribute:

use PhpLlm\LlmChain\Chain\Toolbox\Attribute\AsTool;

#[AsTool('company_name', 'Provides the name of your company')]
final class CompanyName
{
    public function __invoke(): string
    {
        return 'ACME Corp.'
    }
}

The chain configuration by default will inject all known tools into the chain.

To disable this behavior, set the tools option to false:

llm_chain:
    chain:
        my_chain:
            tools: false

To inject only specific tools, list them in the configuration:

llm_chain:
    chain:
        my_chain:
            tools:
                - 'PhpLlm\LlmChain\Chain\Toolbox\Tool\SimilaritySearch'

Profiler

The profiler panel provides insights into the chain's execution:

Profiler