From 33a2b61f49e178dd6ca475bda6f613f8473e4bcb Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sun, 23 Jun 2024 21:39:15 +0200 Subject: [PATCH 01/81] feat: initial bundle setup --- .gitignore | 1 + LICENSE | 19 + README.md | 70 + composer.json | 26 + composer.lock | 2103 +++++++++++++++++ src/DependencyInjection/Configuration.php | 31 + src/DependencyInjection/LlmChainExtension.php | 36 + src/LlmChainBundle.php | 11 + src/Resources/config/services.php | 48 + 9 files changed, 2345 insertions(+) create mode 100644 .gitignore create mode 100644 LICENSE create mode 100644 README.md create mode 100644 composer.json create mode 100644 composer.lock create mode 100644 src/DependencyInjection/Configuration.php create mode 100644 src/DependencyInjection/LlmChainExtension.php create mode 100644 src/LlmChainBundle.php create mode 100644 src/Resources/config/services.php diff --git a/.gitignore b/.gitignore new file mode 100644 index 000000000..22d0d82f8 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +vendor diff --git a/LICENSE b/LICENSE new file mode 100644 index 000000000..99fed694e --- /dev/null +++ b/LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2024 Christopher Hertel + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is furnished +to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 000000000..8cf706024 --- /dev/null +++ b/README.md @@ -0,0 +1,70 @@ +# LLM Chain Bundle + +Symfony integration bundle for [php-llm/llm-chain](https://github.com/php-llm/llm-chain) library. + +## Installation + +```bash +composer require php-llm/llm-chain-bundle:@dev php-llm/llm-chain:@dev +``` + +## Example Configuration + +```yaml +# config/packages/llm_chain.yaml +llm_chain: + openai: + api_key: '%env(OPENAI_API_KEY)%' + model: 'gpt-4o' + temperature: 1.0 +``` + +## Usage + +Use the tool chain service to leverage tool calling with GPT: +```php +use PhpLlm\LlmChain\Message\Message; +use PhpLlm\LlmChain\Message\MessageBag; +use PhpLlm\LlmChain\ToolChain; + + +final class MyService +{ + public function __construct( + private ToolChain $toolChain + ) { + } + + public function processMessage(string $message): void + { + $messages = $this->loadMessageBad(); + $message = Message::ofUser($message); + + $response = $this->toolChain->call($message, $messages); + + $messages[] = $message; + $messages[] = Message::ofAssistant($response); + + $this->saveMessages($messages); + } +} +``` +Extend the tool chain service to add your own tools: +```php +use PhpLlm\LlmChain\ToolBox\AsTool; +use Symfony\Component\Clock\ClockInterface; + +#[AsTool('clock', 'Provides the current date and time')] +final class Clock +{ + public function __construct( + private readonly ClockInterface $clock, + ) { + } + + public function __invoke(): string + { + return $this->clock->now()->format('Y-m-d H:i:s'); + } +} +``` diff --git a/composer.json b/composer.json new file mode 100644 index 000000000..e6a957165 --- /dev/null +++ b/composer.json @@ -0,0 +1,26 @@ +{ + "name": "php-llm/llm-chain-bundle", + "type": "symfony-bundle", + "description": "Symfony integration bundle for php-llm/llm-chain", + "license": "MIT", + "authors": [ + { + "name": "Christopher Hertel", + "email": "mail@christopher-hertel.de" + } + ], + "require": { + "php": ">=8.1", + "php-llm/llm-chain": "dev-main", + "symfony/framework-bundle": "^6.4 || ^7.0", + "symfony/config": "^6.4 || ^7.0", + "symfony/dependency-injection": "^6.4 || ^7.0" + }, + "autoload": { + "psr-4": { + "PhpLlm\\LlmChainBundle\\": "src/" + } + }, + "minimum-stability": "dev", + "prefer-stable": true +} diff --git a/composer.lock b/composer.lock new file mode 100644 index 000000000..e53248dee --- /dev/null +++ b/composer.lock @@ -0,0 +1,2103 @@ +{ + "_readme": [ + "This file locks the dependencies of your project to a known state", + "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", + "This file is @generated automatically" + ], + "content-hash": "bbd22bc3104033205c4a586b46a6b3ab", + "packages": [ + { + "name": "php-llm/llm-chain", + "version": "dev-main", + "source": { + "type": "git", + "url": "https://github.com/php-llm/llm-chain.git", + "reference": "0f13fae978d2ec02c82826c06e1816b073a70fe4" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-llm/llm-chain/zipball/0f13fae978d2ec02c82826c06e1816b073a70fe4", + "reference": "0f13fae978d2ec02c82826c06e1816b073a70fe4", + "shasum": "" + }, + "require": { + "php": "^8.1", + "psr/cache": "^3.0", + "psr/log": "^3.0", + "symfony/http-client": "^6.3 || ^7.0" + }, + "require-dev": { + "php-cs-fixer/shim": "^3.35", + "phpstan/phpstan": "^1.10", + "phpunit/phpunit": "^10.4", + "probots-io/pinecone-php": "^0.0.3", + "symfony/console": "^6.4 || ^7.0" + }, + "suggest": { + "probots-io/pinecone-php": "For using the Pinecone client." + }, + "default-branch": true, + "type": "library", + "autoload": { + "psr-4": { + "PhpLlm\\LlmChain\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Christopher Hertel", + "email": "mail@christopher-hertel.de" + } + ], + "description": "PHP component with tooling around LLMs.", + "support": { + "issues": "https://github.com/php-llm/llm-chain/issues", + "source": "https://github.com/php-llm/llm-chain/tree/main" + }, + "time": "2024-06-03T20:12:58+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" + }, + { + "name": "psr/container", + "version": "2.0.2", + "source": { + "type": "git", + "url": "https://github.com/php-fig/container.git", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/container/zipball/c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "reference": "c71ecc56dfe541dbd90c5360474fbc405f8d5963", + "shasum": "" + }, + "require": { + "php": ">=7.4.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "2.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Container\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common Container Interface (PHP FIG PSR-11)", + "homepage": "https://github.com/php-fig/container", + "keywords": [ + "PSR-11", + "container", + "container-interface", + "container-interop", + "psr" + ], + "support": { + "issues": "https://github.com/php-fig/container/issues", + "source": "https://github.com/php-fig/container/tree/2.0.2" + }, + "time": "2021-11-05T16:47:00+00:00" + }, + { + "name": "psr/event-dispatcher", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/event-dispatcher.git", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/event-dispatcher/zipball/dbefd12671e8a14ec7f180cab83036ed26714bb0", + "reference": "dbefd12671e8a14ec7f180cab83036ed26714bb0", + "shasum": "" + }, + "require": { + "php": ">=7.2.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\EventDispatcher\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "http://www.php-fig.org/" + } + ], + "description": "Standard interfaces for event handling.", + "keywords": [ + "events", + "psr", + "psr-14" + ], + "support": { + "issues": "https://github.com/php-fig/event-dispatcher/issues", + "source": "https://github.com/php-fig/event-dispatcher/tree/1.0.0" + }, + "time": "2019-01-08T18:20:26+00:00" + }, + { + "name": "psr/log", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/log.git", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/log/zipball/fe5ea303b0887d5caefd3d431c3e61ad47037001", + "reference": "fe5ea303b0887d5caefd3d431c3e61ad47037001", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "3.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Log\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for logging libraries", + "homepage": "https://github.com/php-fig/log", + "keywords": [ + "log", + "psr", + "psr-3" + ], + "support": { + "source": "https://github.com/php-fig/log/tree/3.0.0" + }, + "time": "2021-07-14T16:46:02+00:00" + }, + { + "name": "symfony/cache", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache.git", + "reference": "760294dc7158372699dccd077965c16c328f8719" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache/zipball/760294dc7158372699dccd077965c16c328f8719", + "reference": "760294dc7158372699dccd077965c16c328f8719", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/cache": "^2.0|^3.0", + "psr/log": "^1.1|^2|^3", + "symfony/cache-contracts": "^2.5|^3", + "symfony/deprecation-contracts": "^2.5|^3.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/dependency-injection": "<6.4", + "symfony/http-kernel": "<6.4", + "symfony/var-dumper": "<6.4" + }, + "provide": { + "psr/cache-implementation": "2.0|3.0", + "psr/simple-cache-implementation": "1.0|2.0|3.0", + "symfony/cache-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "cache/integration-tests": "dev-master", + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "psr/simple-cache": "^1.0|^2.0|^3.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Cache\\": "" + }, + "classmap": [ + "Traits/ValueWrapper.php" + ], + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides extended PSR-6, PSR-16 (and tags) implementations", + "homepage": "https://symfony.com", + "keywords": [ + "caching", + "psr6" + ], + "support": { + "source": "https://github.com/symfony/cache/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/cache-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/cache-contracts.git", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/cache-contracts/zipball/df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "reference": "df6a1a44c890faded49a5fca33c2d5c5fd3c2197", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/cache": "^3.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Cache\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to caching", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/cache-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/config", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/config.git", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/config/zipball/2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "reference": "2210fc99fa42a259eb6c89d1f724ce0c4d62d5d2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/filesystem": "^7.1", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "symfony/finder": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "require-dev": { + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Config\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Helps you find, load, combine, autofill and validate configuration values of any kind", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/config/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/dependency-injection", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/dependency-injection.git", + "reference": "77c636dfd86c0b60c5d184b2fd2ddf8dd11c309c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/dependency-injection/zipball/77c636dfd86c0b60c5d184b2fd2ddf8dd11c309c", + "reference": "77c636dfd86c0b60c5d184b2fd2ddf8dd11c309c", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/service-contracts": "^3.5", + "symfony/var-exporter": "^6.4|^7.0" + }, + "conflict": { + "ext-psr": "<1.1|>=2", + "symfony/config": "<6.4", + "symfony/finder": "<6.4", + "symfony/yaml": "<6.4" + }, + "provide": { + "psr/container-implementation": "1.1|2.0", + "symfony/service-implementation": "1.1|2.0|3.0" + }, + "require-dev": { + "symfony/config": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\DependencyInjection\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows you to standardize and centralize the way objects are constructed in your application", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/dependency-injection/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/deprecation-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/deprecation-contracts.git", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "reference": "0e0d29ce1f20deffb4ab1b016a7257c4f1e789a1", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "files": [ + "function.php" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "A generic function and convention to trigger deprecation notices", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/error-handler", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/error-handler.git", + "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", + "reference": "e9b8bbce0b4f322939332ab7b6b81d8c11da27dd", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/var-dumper": "^6.4|^7.0" + }, + "conflict": { + "symfony/deprecation-contracts": "<2.5", + "symfony/http-kernel": "<6.4" + }, + "require-dev": { + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\ErrorHandler\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools to manage errors and ease debugging PHP code", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/error-handler/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/event-dispatcher", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher.git", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "reference": "9fa7f7a21beb22a39a8f3f28618b29e50d7a55a7", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/event-dispatcher-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/dependency-injection": "<6.4", + "symfony/service-contracts": "<2.5" + }, + "provide": { + "psr/event-dispatcher-implementation": "1.0", + "symfony/event-dispatcher-implementation": "2.0|3.0" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/service-contracts": "^2.5|^3", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\EventDispatcher\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/event-dispatcher/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/event-dispatcher-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/event-dispatcher-contracts.git", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/8f93aec25d41b72493c6ddff14e916177c9efc50", + "reference": "8f93aec25d41b72493c6ddff14e916177c9efc50", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/event-dispatcher": "^1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\EventDispatcher\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to dispatching event", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/filesystem", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/filesystem.git", + "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/802e87002f919296c9f606457d9fa327a0b3d6b2", + "reference": "802e87002f919296c9f606457d9fa327a0b3d6b2", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-mbstring": "~1.8" + }, + "require-dev": { + "symfony/process": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Filesystem\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides basic utilities for the filesystem", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/filesystem/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/finder", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/finder.git", + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/finder/zipball/fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "reference": "fbb0ba67688b780efbc886c1a0a0948dcf7205d6", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/filesystem": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Finder\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Finds files and directories via an intuitive fluent interface", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/finder/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/framework-bundle", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/framework-bundle.git", + "reference": "79a20497022b8853416e20c836ee150b754c332a" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/framework-bundle/zipball/79a20497022b8853416e20c836ee150b754c332a", + "reference": "79a20497022b8853416e20c836ee150b754c332a", + "shasum": "" + }, + "require": { + "composer-runtime-api": ">=2.1", + "ext-xml": "*", + "php": ">=8.2", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^7.1", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/filesystem": "^7.1", + "symfony/finder": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/polyfill-mbstring": "~1.0", + "symfony/routing": "^6.4|^7.0" + }, + "conflict": { + "doctrine/persistence": "<1.3", + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/asset": "<6.4", + "symfony/asset-mapper": "<6.4", + "symfony/clock": "<6.4", + "symfony/console": "<6.4", + "symfony/dom-crawler": "<6.4", + "symfony/dotenv": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/lock": "<6.4", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/mime": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/scheduler": "<6.4.4|>=7.0.0,<7.0.4", + "symfony/security-core": "<6.4", + "symfony/security-csrf": "<6.4", + "symfony/serializer": "<6.4", + "symfony/stopwatch": "<6.4", + "symfony/translation": "<6.4", + "symfony/twig-bridge": "<6.4", + "symfony/twig-bundle": "<6.4", + "symfony/validator": "<6.4", + "symfony/web-profiler-bundle": "<6.4", + "symfony/workflow": "<6.4" + }, + "require-dev": { + "doctrine/persistence": "^1.3|^2|^3", + "dragonmantank/cron-expression": "^3.1", + "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", + "seld/jsonlint": "^1.10", + "symfony/asset": "^6.4|^7.0", + "symfony/asset-mapper": "^6.4|^7.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/dotenv": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/html-sanitizer": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/lock": "^6.4|^7.0", + "symfony/mailer": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/notifier": "^6.4|^7.0", + "symfony/polyfill-intl-icu": "~1.0", + "symfony/process": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/scheduler": "^6.4.4|^7.0.4", + "symfony/security-bundle": "^6.4|^7.0", + "symfony/semaphore": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/string": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/twig-bundle": "^6.4|^7.0", + "symfony/type-info": "^7.1", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/web-link": "^6.4|^7.0", + "symfony/workflow": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "type": "symfony-bundle", + "autoload": { + "psr-4": { + "Symfony\\Bundle\\FrameworkBundle\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a tight integration between Symfony components and the Symfony full-stack framework", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/framework-bundle/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-04T06:40:14+00:00" + }, + { + "name": "symfony/http-client", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client.git", + "reference": "1ec24a54d1885b11e862d6ddab31bd6749720d20" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client/zipball/1ec24a54d1885b11e862d6ddab31bd6749720d20", + "reference": "1ec24a54d1885b11e862d6ddab31bd6749720d20", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/http-client-contracts": "^3.4.1", + "symfony/service-contracts": "^2.5|^3" + }, + "conflict": { + "php-http/discovery": "<1.15", + "symfony/http-foundation": "<6.4" + }, + "provide": { + "php-http/async-client-implementation": "*", + "php-http/client-implementation": "*", + "psr/http-client-implementation": "1.0", + "symfony/http-client-implementation": "3.0" + }, + "require-dev": { + "amphp/amp": "^2.5", + "amphp/http-client": "^4.2.1", + "amphp/http-tunnel": "^1.0", + "amphp/socket": "^1.1", + "guzzlehttp/promises": "^1.4|^2.0", + "nyholm/psr7": "^1.0", + "php-http/httplug": "^1.0|^2.0", + "psr/http-client": "^1.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0", + "symfony/stopwatch": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides powerful methods to fetch HTTP resources synchronously or asynchronously", + "homepage": "https://symfony.com", + "keywords": [ + "http" + ], + "support": { + "source": "https://github.com/symfony/http-client/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/http-client-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-client-contracts.git", + "reference": "20414d96f391677bf80078aa55baece78b82647d" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/20414d96f391677bf80078aa55baece78b82647d", + "reference": "20414d96f391677bf80078aa55baece78b82647d", + "shasum": "" + }, + "require": { + "php": ">=8.1" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\HttpClient\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to HTTP clients", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/http-client-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/http-foundation", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-foundation.git", + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/74d171d5b6a1d9e4bfee09a41937c17a7536acfa", + "reference": "74d171d5b6a1d9e4bfee09a41937c17a7536acfa", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.1", + "symfony/polyfill-php83": "^1.27" + }, + "conflict": { + "doctrine/dbal": "<3.6", + "symfony/cache": "<6.4" + }, + "require-dev": { + "doctrine/dbal": "^3.6|^4", + "predis/predis": "^1.1|^2.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/rate-limiter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpFoundation\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Defines an object-oriented layer for the HTTP specification", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-foundation/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/http-kernel", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/http-kernel.git", + "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/fa8d1c75b5f33b1302afccf81811f93976c6e26f", + "reference": "fa8d1c75b5f33b1302afccf81811f93976c6e26f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/log": "^1|^2|^3", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/error-handler": "^6.4|^7.0", + "symfony/event-dispatcher": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/polyfill-ctype": "^1.8" + }, + "conflict": { + "symfony/browser-kit": "<6.4", + "symfony/cache": "<6.4", + "symfony/config": "<6.4", + "symfony/console": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/doctrine-bridge": "<6.4", + "symfony/form": "<6.4", + "symfony/http-client": "<6.4", + "symfony/http-client-contracts": "<2.5", + "symfony/mailer": "<6.4", + "symfony/messenger": "<6.4", + "symfony/translation": "<6.4", + "symfony/translation-contracts": "<2.5", + "symfony/twig-bridge": "<6.4", + "symfony/validator": "<6.4", + "symfony/var-dumper": "<6.4", + "twig/twig": "<3.0.4" + }, + "provide": { + "psr/log-implementation": "1.0|2.0|3.0" + }, + "require-dev": { + "psr/cache": "^1.0|^2.0|^3.0", + "symfony/browser-kit": "^6.4|^7.0", + "symfony/clock": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/css-selector": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/dom-crawler": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/finder": "^6.4|^7.0", + "symfony/http-client-contracts": "^2.5|^3", + "symfony/process": "^6.4|^7.0", + "symfony/property-access": "^7.1", + "symfony/routing": "^6.4|^7.0", + "symfony/serializer": "^7.1", + "symfony/stopwatch": "^6.4|^7.0", + "symfony/translation": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\HttpKernel\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides a structured process for converting a Request into a Response", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/http-kernel/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-04T06:52:15+00:00" + }, + { + "name": "symfony/polyfill-ctype", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-ctype.git", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-ctype/zipball/0424dff1c58f028c451efff2045f5d92410bd540", + "reference": "0424dff1c58f028c451efff2045f5d92410bd540", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-ctype": "*" + }, + "suggest": { + "ext-ctype": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Ctype\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Gert de Pagter", + "email": "BackEndTea@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for ctype functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "ctype", + "polyfill", + "portable" + ], + "support": { + "source": "https://github.com/symfony/polyfill-ctype/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T15:07:36+00:00" + }, + { + "name": "symfony/polyfill-mbstring", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "provide": { + "ext-mbstring": "*" + }, + "suggest": { + "ext-mbstring": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Mbstring\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for the Mbstring extension", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-19T12:30:46+00:00" + }, + { + "name": "symfony/polyfill-php83", + "version": "v1.30.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-19T12:35:24+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "shasum": "" + }, + "require": { + "php": ">=8.1", + "psr/container": "^1.1|^2.0", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "ext-psr": "<1.1|>=2" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "3.5-dev" + }, + "thanks": { + "name": "symfony/contracts", + "url": "https://github.com/symfony/contracts" + } + }, + "autoload": { + "psr-4": { + "Symfony\\Contracts\\Service\\": "" + }, + "exclude-from-classmap": [ + "/Test/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Generic abstractions related to writing services", + "homepage": "https://symfony.com", + "keywords": [ + "abstractions", + "contracts", + "decoupling", + "interfaces", + "interoperability", + "standards" + ], + "support": { + "source": "https://github.com/symfony/service-contracts/tree/v3.5.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-04-18T09:32:20+00:00" + }, + { + "name": "symfony/var-dumper", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-dumper.git", + "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/deb2c2b506ff6fdbb340e00b34e9901e1605f293", + "reference": "deb2c2b506ff6fdbb340e00b34e9901e1605f293", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/console": "<6.4" + }, + "require-dev": { + "ext-iconv": "*", + "symfony/console": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/process": "^6.4|^7.0", + "symfony/uid": "^6.4|^7.0", + "twig/twig": "^3.0.4" + }, + "bin": [ + "Resources/bin/var-dump-server" + ], + "type": "library", + "autoload": { + "files": [ + "Resources/functions/dump.php" + ], + "psr-4": { + "Symfony\\Component\\VarDumper\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides mechanisms for walking through any arbitrary PHP variable", + "homepage": "https://symfony.com", + "keywords": [ + "debug", + "dump" + ], + "support": { + "source": "https://github.com/symfony/var-dumper/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/var-exporter", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/var-exporter.git", + "reference": "db82c2b73b88734557cfc30e3270d83fa651b712" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/var-exporter/zipball/db82c2b73b88734557cfc30e3270d83fa651b712", + "reference": "db82c2b73b88734557cfc30e3270d83fa651b712", + "shasum": "" + }, + "require": { + "php": ">=8.2" + }, + "require-dev": { + "symfony/property-access": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\VarExporter\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Allows exporting any serializable PHP data structure to plain PHP code", + "homepage": "https://symfony.com", + "keywords": [ + "clone", + "construct", + "export", + "hydrate", + "instantiate", + "lazy-loading", + "proxy", + "serialize" + ], + "support": { + "source": "https://github.com/symfony/var-exporter/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + } + ], + "packages-dev": [], + "aliases": [], + "minimum-stability": "dev", + "stability-flags": { + "php-llm/llm-chain": 20 + }, + "prefer-stable": true, + "prefer-lowest": false, + "platform": { + "php": ">=8.1" + }, + "platform-dev": [], + "plugin-api-version": "2.6.0" +} diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php new file mode 100644 index 000000000..47b2b23ef --- /dev/null +++ b/src/DependencyInjection/Configuration.php @@ -0,0 +1,31 @@ +getRootNode(); + + $rootNode + ->children() + ->arrayNode('openai') + ->children() + ->scalarNode('api_key')->isRequired()->end() + ->scalarNode('model')->isRequired()->end() + ->floatNode('temperature')->defaultValue(0.5)->end() + ->end() + ->end() + ->end() + ; + + return $treeBuilder; + } +} diff --git a/src/DependencyInjection/LlmChainExtension.php b/src/DependencyInjection/LlmChainExtension.php new file mode 100644 index 000000000..08a31c61a --- /dev/null +++ b/src/DependencyInjection/LlmChainExtension.php @@ -0,0 +1,36 @@ +load('services.php'); + + $configuration = new Configuration(); + $config = $this->processConfiguration($configuration, $configs); + + $container->setParameter('llm_chain.openai.api_key', $config['openai']['api_key']); + $container->setParameter('llm_chain.openai.model', $config['openai']['model']); + $container->setParameter('llm_chain.openai.temperature', $config['openai']['temperature']); + + $container->registerAttributeForAutoconfiguration(AsTool::class, static function (ChildDefinition $definition, AsTool $attribute): void { + $definition->addTag('llm_chain.tool', [ + 'name' => $attribute->name, + 'description' => $attribute->description, + 'method' => $attribute->method, + ]); + }); + } +} diff --git a/src/LlmChainBundle.php b/src/LlmChainBundle.php new file mode 100644 index 000000000..a392c7e17 --- /dev/null +++ b/src/LlmChainBundle.php @@ -0,0 +1,11 @@ +services() + ->defaults() + ->autowire() + ->autoconfigure() + + // chains + ->set(ToolChain::class) + ->set(ChatChain::class) + ->alias(LlmChainInterface::class, ChatChain::class) + + // openai + ->set(ChatModel::class) + ->args([ + '$model' => '%llm_chain.openai.model%', + '$temperature' => '%llm_chain.openai.temperature%', + ]) + ->set(Embeddings::class) + ->set(OpenAIClient::class) + ->args([ + '$apiKey' => '%llm_chain.openai.api_key%', + ]) + + // tools + ->set(Registry::class) + ->args([ + '$tools' => tagged_iterator('llm_chain.tool'), + ]) + ->set(ToolAnalyzer::class) + ->set(ParameterAnalyzer::class) + ; +}; From 770bc124acb1c04cbac0e020d0d53439920543b1 Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sun, 18 Aug 2024 22:48:18 +0200 Subject: [PATCH 02/81] feat: extend config to support different runtimes --- README.md | 59 +++++++++++++-- src/DependencyInjection/Configuration.php | 34 +++++++-- src/DependencyInjection/LlmChainExtension.php | 73 ++++++++++++++++++- src/Resources/config/services.php | 43 +++++++---- 4 files changed, 182 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 8cf706024..fc342df9b 100644 --- a/README.md +++ b/README.md @@ -13,25 +13,72 @@ composer require php-llm/llm-chain-bundle:@dev php-llm/llm-chain:@dev ```yaml # config/packages/llm_chain.yaml llm_chain: + runtimes: + azure_gpt: + type: 'azure' + base_url: '%env(AZURE_OPENAI_BASEURL)%' + deployment: '%env(AZURE_OPENAI_GPT)%' + api_key: '%env(AZURE_OPENAI_KEY)%' + version: '%env(AZURE_OPENAI_VERSION)%' + azure_embeddings: + type: 'azure' + base_url: '%env(AZURE_OPENAI_BASEURL)%' + deployment: '%env(AZURE_OPENAI_EMBEDDINGS)%' + api_key: '%env(AZURE_OPENAI_KEY)%' + version: '%env(AZURE_OPENAI_VERSION)%' openai: - api_key: '%env(OPENAI_API_KEY)%' - model: 'gpt-4o' - temperature: 1.0 + type: 'openai' + api_key: '%env(OPENAI_API_KEY)%' + llms: + azure_gpt: + runtime: 'azure_gpt' + original_gpt: + runtime: 'openai' + embeddings: + azure_embeddings: + runtime: 'azure_embeddings' + original_embeddings: + runtime: 'openai' ``` ## Usage +### Simple Chat + +Use the simple chat service to leverage GPT: +```php +use PhpLlm\LlmChain\Chat; + +final readonly class MyService +{ + public function __construct( + private Chat $chat, + ) { + } + + public function submit(string $message): string + { + $messages = new MessageBag(); + $messages[] = Message::forSystem('Speak like a pirate.'); + $messages[] = Message::ofUser($message); + + return $this->chat->send($message); + } +} +``` + +### Tool Chain + Use the tool chain service to leverage tool calling with GPT: ```php use PhpLlm\LlmChain\Message\Message; use PhpLlm\LlmChain\Message\MessageBag; use PhpLlm\LlmChain\ToolChain; - -final class MyService +final readonly class MyService { public function __construct( - private ToolChain $toolChain + private ToolChain $toolChain, ) { } diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 47b2b23ef..636dddfe5 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -16,11 +16,35 @@ public function getConfigTreeBuilder(): TreeBuilder $rootNode ->children() - ->arrayNode('openai') - ->children() - ->scalarNode('api_key')->isRequired()->end() - ->scalarNode('model')->isRequired()->end() - ->floatNode('temperature')->defaultValue(0.5)->end() + ->arrayNode('runtimes') + ->normalizeKeys(false) + ->useAttributeAsKey('name') + ->arrayPrototype() + ->children() + ->enumNode('type')->values(['openai', 'azure'])->isRequired()->end() + ->scalarNode('api_key')->isRequired()->end() + ->scalarNode('base_url')->end() + ->scalarNode('deployment')->end() + ->scalarNode('version')->end() + ->end() + ->end() + ->end() + ->arrayNode('llms') + ->normalizeKeys(false) + ->useAttributeAsKey('name') + ->arrayPrototype() + ->children() + ->scalarNode('runtime')->end() + ->end() + ->end() + ->end() + ->arrayNode('embeddings') + ->normalizeKeys(false) + ->useAttributeAsKey('name') + ->arrayPrototype() + ->children() + ->scalarNode('runtime')->end() + ->end() ->end() ->end() ->end() diff --git a/src/DependencyInjection/LlmChainExtension.php b/src/DependencyInjection/LlmChainExtension.php index 08a31c61a..a61b52fb0 100644 --- a/src/DependencyInjection/LlmChainExtension.php +++ b/src/DependencyInjection/LlmChainExtension.php @@ -4,12 +4,20 @@ namespace PhpLlm\LlmChainBundle\DependencyInjection; +use PhpLlm\LlmChain\EmbeddingModel; +use PhpLlm\LlmChain\LanguageModel; +use PhpLlm\LlmChain\OpenAI\Model\Embeddings; +use PhpLlm\LlmChain\OpenAI\Model\Gpt; +use PhpLlm\LlmChain\OpenAI\Runtime; +use PhpLlm\LlmChain\OpenAI\Runtime\Azure as AzureRuntime; +use PhpLlm\LlmChain\OpenAI\Runtime\OpenAI as OpenAIRuntime; use PhpLlm\LlmChain\ToolBox\AsTool; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; +use Symfony\Component\DependencyInjection\Reference; final class LlmChainExtension extends Extension { @@ -21,9 +29,26 @@ public function load(array $configs, ContainerBuilder $container): void $configuration = new Configuration(); $config = $this->processConfiguration($configuration, $configs); - $container->setParameter('llm_chain.openai.api_key', $config['openai']['api_key']); - $container->setParameter('llm_chain.openai.model', $config['openai']['model']); - $container->setParameter('llm_chain.openai.temperature', $config['openai']['temperature']); + foreach ($config['runtimes'] as $name => $runtime) { + $this->processRuntimeConfig($name, $runtime, $container); + } + if (1 === count($config['runtimes'])) { + $container->setAlias(Runtime::class, 'llm_chain.runtime.'.$name); + } + + foreach ($config['llms'] as $name => $llm) { + $this->processLlmConfig($name, $llm, $container); + } + if (1 === count($config['llms'])) { + $container->setAlias(LanguageModel::class, 'llm_chain.llm.'.$name); + } + + foreach ($config['embeddings'] as $name => $embeddings) { + $this->processEmbeddingsConfig($name, $embeddings, $container); + } + if (1 === count($config['embeddings'])) { + $container->setAlias(EmbeddingModel::class, 'llm_chain.embeddings.'.$name); + } $container->registerAttributeForAutoconfiguration(AsTool::class, static function (ChildDefinition $definition, AsTool $attribute): void { $definition->addTag('llm_chain.tool', [ @@ -33,4 +58,46 @@ public function load(array $configs, ContainerBuilder $container): void ]); }); } + + private function processRuntimeConfig(string $name, array $runtime, ContainerBuilder $container): void + { + if ('openai' === $runtime['type']) { + $definition = new ChildDefinition(OpenAIRuntime::class); + $definition + ->replaceArgument('$apiKey', $runtime['api_key']); + + $container->setDefinition('llm_chain.runtime.'.$name, $definition); + + return; + } + + if ('azure' === $runtime['type']) { + $definition = new ChildDefinition(AzureRuntime::class); + $definition + ->replaceArgument('$baseUrl', $runtime['base_url']) + ->replaceArgument('$deployment', $runtime['deployment']) + ->replaceArgument('$key', $runtime['api_key']) + ->replaceArgument('$apiVersion', $runtime['version']); + + $container->setDefinition('llm_chain.runtime.'.$name, $definition); + } + } + + private function processLlmConfig(string $name, array $llm, ContainerBuilder $container): void + { + $definition = new ChildDefinition(Gpt::class); + $definition + ->replaceArgument('$runtime', new Reference('llm_chain.runtime.'.$llm['runtime'])); + + $container->setDefinition('llm_chain.llm.'.$name, $definition); + } + + private function processEmbeddingsConfig(string $name, mixed $embeddings, ContainerBuilder $container): void + { + $definition = new ChildDefinition(Embeddings::class); + $definition + ->replaceArgument('$runtime', new Reference('llm_chain.runtime.'.$embeddings['runtime'])); + + $container->setDefinition('llm_chain.embeddings.'.$name, $definition); + } } diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php index 13f0c0b53..af2449ebe 100644 --- a/src/Resources/config/services.php +++ b/src/Resources/config/services.php @@ -4,15 +4,17 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; -use PhpLlm\LlmChain\ChatChain; -use PhpLlm\LlmChain\LlmChainInterface; -use PhpLlm\LlmChain\OpenAI\ChatModel; -use PhpLlm\LlmChain\OpenAI\Embeddings; -use PhpLlm\LlmChain\OpenAI\OpenAIClient; +use PhpLlm\LlmChain\Chat; +use PhpLlm\LlmChain\OpenAI\Model\Embeddings; +use PhpLlm\LlmChain\OpenAI\Model\Gpt; +use PhpLlm\LlmChain\OpenAI\Runtime; +use PhpLlm\LlmChain\RetrievalChain; use PhpLlm\LlmChain\ToolBox\ParameterAnalyzer; use PhpLlm\LlmChain\ToolBox\Registry; use PhpLlm\LlmChain\ToolBox\ToolAnalyzer; use PhpLlm\LlmChain\ToolChain; +use PhpLlm\LlmChain\OpenAI\Runtime\Azure as AzureRuntime; +use PhpLlm\LlmChain\OpenAI\Runtime\OpenAI as OpenAIRuntime; return static function (ContainerConfigurator $container) { $container->services() @@ -21,20 +23,35 @@ ->autoconfigure() // chains + ->set(Chat::class) + ->set(RetrievalChain::class) ->set(ToolChain::class) - ->set(ChatChain::class) - ->alias(LlmChainInterface::class, ChatChain::class) - // openai - ->set(ChatModel::class) + // runtimes + ->set(AzureRuntime::class) + ->abstract() ->args([ - '$model' => '%llm_chain.openai.model%', - '$temperature' => '%llm_chain.openai.temperature%', + '$baseUrl' => abstract_arg('Base URL for Azure API'), + '$deployment' => abstract_arg('Deployment for Azure API'), + '$apiVersion' => abstract_arg('API version for Azure API'), + '$key' => abstract_arg('API key for Azure API'), + ]) + ->set(OpenAIRuntime::class) + ->abstract() + ->args([ + '$apiKey' => abstract_arg('API key for OpenAI API'), + ]) + + // models + ->set(Gpt::class) + ->abstract() + ->args([ + '$runtime' => service(Runtime::class), ]) ->set(Embeddings::class) - ->set(OpenAIClient::class) + ->abstract() ->args([ - '$apiKey' => '%llm_chain.openai.api_key%', + '$runtime' => service(Runtime::class), ]) // tools From 01e5d8eeff2ef0ddc396d5003ebc69192d701c87 Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sun, 18 Aug 2024 23:30:29 +0200 Subject: [PATCH 03/81] feat: make runtime config on model optional with single runtime --- src/DependencyInjection/LlmChainExtension.php | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/src/DependencyInjection/LlmChainExtension.php b/src/DependencyInjection/LlmChainExtension.php index a61b52fb0..47752a174 100644 --- a/src/DependencyInjection/LlmChainExtension.php +++ b/src/DependencyInjection/LlmChainExtension.php @@ -85,18 +85,20 @@ private function processRuntimeConfig(string $name, array $runtime, ContainerBui private function processLlmConfig(string $name, array $llm, ContainerBuilder $container): void { + $runtime = isset($llm['runtime']) ? 'llm_chain.runtime.'.$llm['runtime'] : Runtime::class; + $definition = new ChildDefinition(Gpt::class); - $definition - ->replaceArgument('$runtime', new Reference('llm_chain.runtime.'.$llm['runtime'])); + $definition->replaceArgument('$runtime', new Reference($runtime)); $container->setDefinition('llm_chain.llm.'.$name, $definition); } private function processEmbeddingsConfig(string $name, mixed $embeddings, ContainerBuilder $container): void { + $runtime = isset($embeddings['runtime']) ? 'llm_chain.runtime.'.$embeddings['runtime'] : Runtime::class; + $definition = new ChildDefinition(Embeddings::class); - $definition - ->replaceArgument('$runtime', new Reference('llm_chain.runtime.'.$embeddings['runtime'])); + $definition->replaceArgument('$runtime', new Reference($runtime)); $container->setDefinition('llm_chain.embeddings.'.$name, $definition); } From d3b078fa1d99411ab2e8d929d65318f1fc955c69 Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sun, 25 Aug 2024 22:21:32 +0200 Subject: [PATCH 04/81] feat: add store config with ChromaDB --- src/DependencyInjection/Configuration.php | 9 ++++++++ src/DependencyInjection/LlmChainExtension.php | 21 +++++++++++++++++++ src/Resources/config/services.php | 16 ++++++++++++-- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 636dddfe5..0fa682230 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -47,6 +47,15 @@ public function getConfigTreeBuilder(): TreeBuilder ->end() ->end() ->end() + ->arrayNode('stores') + ->normalizeKeys(false) + ->useAttributeAsKey('name') + ->arrayPrototype() + ->children() + ->scalarNode('engine')->isRequired()->end() + ->scalarNode('collection_name')->end() + ->end() + ->end() ->end() ; diff --git a/src/DependencyInjection/LlmChainExtension.php b/src/DependencyInjection/LlmChainExtension.php index 47752a174..107be82d5 100644 --- a/src/DependencyInjection/LlmChainExtension.php +++ b/src/DependencyInjection/LlmChainExtension.php @@ -11,6 +11,9 @@ use PhpLlm\LlmChain\OpenAI\Runtime; use PhpLlm\LlmChain\OpenAI\Runtime\Azure as AzureRuntime; use PhpLlm\LlmChain\OpenAI\Runtime\OpenAI as OpenAIRuntime; +use PhpLlm\LlmChain\Store\ChromaDb\Store as ChromaDbStore; +use PhpLlm\LlmChain\Store\StoreInterface; +use PhpLlm\LlmChain\Store\VectorStoreInterface; use PhpLlm\LlmChain\ToolBox\AsTool; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ChildDefinition; @@ -50,6 +53,14 @@ public function load(array $configs, ContainerBuilder $container): void $container->setAlias(EmbeddingModel::class, 'llm_chain.embeddings.'.$name); } + foreach ($config['stores'] as $name => $store) { + $this->processStoreConfig($name, $store, $container); + } + if (1 === count($config['stores'])) { + $container->setAlias(VectorStoreInterface::class, 'llm_chain.store.'.$name); + $container->setAlias(StoreInterface::class, 'llm_chain.store.'.$name); + } + $container->registerAttributeForAutoconfiguration(AsTool::class, static function (ChildDefinition $definition, AsTool $attribute): void { $definition->addTag('llm_chain.tool', [ 'name' => $attribute->name, @@ -102,4 +113,14 @@ private function processEmbeddingsConfig(string $name, mixed $embeddings, Contai $container->setDefinition('llm_chain.embeddings.'.$name, $definition); } + + private function processStoreConfig(string $name, mixed $stores, ContainerBuilder $container): void + { + if ('chroma-db' === $stores['engine']) { + $definition = new ChildDefinition(ChromaDbStore::class); + $definition->replaceArgument('$collectionName', $stores['collection_name']); + + $container->setDefinition('llm_chain.store.'.$name, $definition); + } + } } diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php index af2449ebe..ab9f356ba 100644 --- a/src/Resources/config/services.php +++ b/src/Resources/config/services.php @@ -5,16 +5,18 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; use PhpLlm\LlmChain\Chat; +use PhpLlm\LlmChain\DocumentEmbedder; use PhpLlm\LlmChain\OpenAI\Model\Embeddings; use PhpLlm\LlmChain\OpenAI\Model\Gpt; use PhpLlm\LlmChain\OpenAI\Runtime; +use PhpLlm\LlmChain\OpenAI\Runtime\Azure as AzureRuntime; +use PhpLlm\LlmChain\OpenAI\Runtime\OpenAI as OpenAIRuntime; use PhpLlm\LlmChain\RetrievalChain; use PhpLlm\LlmChain\ToolBox\ParameterAnalyzer; use PhpLlm\LlmChain\ToolBox\Registry; use PhpLlm\LlmChain\ToolBox\ToolAnalyzer; use PhpLlm\LlmChain\ToolChain; -use PhpLlm\LlmChain\OpenAI\Runtime\Azure as AzureRuntime; -use PhpLlm\LlmChain\OpenAI\Runtime\OpenAI as OpenAIRuntime; +use PhpLlm\LlmChain\Store\ChromaDb\Store as ChromaDbStore; return static function (ContainerConfigurator $container) { $container->services() @@ -54,6 +56,16 @@ '$runtime' => service(Runtime::class), ]) + // stores + ->set(ChromaDbStore::class) + ->abstract() + ->args([ + '$collectionName' => abstract_arg('Name of ChromaDB collection'), + ]) + + // embedder + ->set(DocumentEmbedder::class) + // tools ->set(Registry::class) ->args([ From 12aefbe9100de465c46ba9e8ec74ff1368e32a30 Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Mon, 26 Aug 2024 22:47:04 +0200 Subject: [PATCH 05/81] feat: add support for azure ai search store --- README.md | 62 +++++++++++-------- src/DependencyInjection/Configuration.php | 6 +- src/DependencyInjection/LlmChainExtension.php | 12 ++++ src/Resources/config/services.php | 12 +++- 4 files changed, 63 insertions(+), 29 deletions(-) diff --git a/README.md b/README.md index fc342df9b..da4386cb3 100644 --- a/README.md +++ b/README.md @@ -13,32 +13,42 @@ composer require php-llm/llm-chain-bundle:@dev php-llm/llm-chain:@dev ```yaml # config/packages/llm_chain.yaml llm_chain: - runtimes: - azure_gpt: - type: 'azure' - base_url: '%env(AZURE_OPENAI_BASEURL)%' - deployment: '%env(AZURE_OPENAI_GPT)%' - api_key: '%env(AZURE_OPENAI_KEY)%' - version: '%env(AZURE_OPENAI_VERSION)%' - azure_embeddings: - type: 'azure' - base_url: '%env(AZURE_OPENAI_BASEURL)%' - deployment: '%env(AZURE_OPENAI_EMBEDDINGS)%' - api_key: '%env(AZURE_OPENAI_KEY)%' - version: '%env(AZURE_OPENAI_VERSION)%' - openai: - type: 'openai' - api_key: '%env(OPENAI_API_KEY)%' - llms: - azure_gpt: - runtime: 'azure_gpt' - original_gpt: - runtime: 'openai' - embeddings: - azure_embeddings: - runtime: 'azure_embeddings' - original_embeddings: - runtime: 'openai' + runtimes: + azure_gpt: + type: 'azure' + base_url: '%env(AZURE_OPENAI_BASEURL)%' + deployment: '%env(AZURE_OPENAI_GPT)%' + api_key: '%env(AZURE_OPENAI_KEY)%' + version: '%env(AZURE_OPENAI_VERSION)%' + azure_embeddings: + type: 'azure' + base_url: '%env(AZURE_OPENAI_BASEURL)%' + deployment: '%env(AZURE_OPENAI_EMBEDDINGS)%' + api_key: '%env(AZURE_OPENAI_KEY)%' + version: '%env(AZURE_OPENAI_VERSION)%' + openai: + type: 'openai' + api_key: '%env(OPENAI_API_KEY)%' + llms: + azure_gpt: + runtime: 'azure_gpt' + original_gpt: + runtime: 'openai' + embeddings: + azure_embeddings: + runtime: 'azure_embeddings' + original_embeddings: + runtime: 'openai' + stores: + chroma_db: + type: 'chroma-db' + collection_name: '%env(CHROMA_COLLECTION)%' + azure_search: + type: 'azure-search' + api_key: '%env(AZURE_SEARCH_KEY)%' + endpoint: '%env(AZURE_SEARCH_ENDPOINT)%' + index_name: '%env(AZURE_SEARCH_INDEX)%' + api_version: '2024-07-01' ``` ## Usage diff --git a/src/DependencyInjection/Configuration.php b/src/DependencyInjection/Configuration.php index 0fa682230..54cf3aeb8 100644 --- a/src/DependencyInjection/Configuration.php +++ b/src/DependencyInjection/Configuration.php @@ -52,8 +52,12 @@ public function getConfigTreeBuilder(): TreeBuilder ->useAttributeAsKey('name') ->arrayPrototype() ->children() - ->scalarNode('engine')->isRequired()->end() + ->enumNode('engine')->values(['chroma-db', 'azure-search'])->isRequired()->end() ->scalarNode('collection_name')->end() + ->scalarNode('api_key')->end() + ->scalarNode('endpoint')->end() + ->scalarNode('index_name')->end() + ->scalarNode('api_version')->end() ->end() ->end() ->end() diff --git a/src/DependencyInjection/LlmChainExtension.php b/src/DependencyInjection/LlmChainExtension.php index 107be82d5..736c6faa2 100644 --- a/src/DependencyInjection/LlmChainExtension.php +++ b/src/DependencyInjection/LlmChainExtension.php @@ -11,6 +11,7 @@ use PhpLlm\LlmChain\OpenAI\Runtime; use PhpLlm\LlmChain\OpenAI\Runtime\Azure as AzureRuntime; use PhpLlm\LlmChain\OpenAI\Runtime\OpenAI as OpenAIRuntime; +use PhpLlm\LlmChain\Store\Azure\SearchStore as AzureSearchStore; use PhpLlm\LlmChain\Store\ChromaDb\Store as ChromaDbStore; use PhpLlm\LlmChain\Store\StoreInterface; use PhpLlm\LlmChain\Store\VectorStoreInterface; @@ -122,5 +123,16 @@ private function processStoreConfig(string $name, mixed $stores, ContainerBuilde $container->setDefinition('llm_chain.store.'.$name, $definition); } + + if ('azure-search' === $stores['engine']) { + $definition = new ChildDefinition(AzureSearchStore::class); + $definition + ->replaceArgument('$endpointUrl', $stores['endpoint']) + ->replaceArgument('$apiKey', $stores['api_key']) + ->replaceArgument('$indexName', $stores['index_name']) + ->replaceArgument('$apiVersion', $stores['api_version']); + + $container->setDefinition('llm_chain.store.'.$name, $definition); + } } } diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php index ab9f356ba..bb5bca4e6 100644 --- a/src/Resources/config/services.php +++ b/src/Resources/config/services.php @@ -11,11 +11,12 @@ use PhpLlm\LlmChain\OpenAI\Runtime; use PhpLlm\LlmChain\OpenAI\Runtime\Azure as AzureRuntime; use PhpLlm\LlmChain\OpenAI\Runtime\OpenAI as OpenAIRuntime; -use PhpLlm\LlmChain\RetrievalChain; +use PhpLlm\LlmChain\Store\Azure\SearchStore; use PhpLlm\LlmChain\ToolBox\ParameterAnalyzer; use PhpLlm\LlmChain\ToolBox\Registry; use PhpLlm\LlmChain\ToolBox\ToolAnalyzer; use PhpLlm\LlmChain\ToolChain; +use PhpLlm\LlmChain\Store\Azure\SearchStore as AzureSearchStore; use PhpLlm\LlmChain\Store\ChromaDb\Store as ChromaDbStore; return static function (ContainerConfigurator $container) { @@ -26,7 +27,6 @@ // chains ->set(Chat::class) - ->set(RetrievalChain::class) ->set(ToolChain::class) // runtimes @@ -57,6 +57,14 @@ ]) // stores + ->set(AzureSearchStore::class) + ->abstract() + ->args([ + '$endpointUrl' => abstract_arg('Endpoint URL for Azure AI Search API'), + '$apiKey' => abstract_arg('API key for Azure AI Search API'), + '$indexName' => abstract_arg('Name of Azure AI Search index'), + '$apiVersion' => abstract_arg('API version for Azure AI Search API'), + ]) ->set(ChromaDbStore::class) ->abstract() ->args([ From 6c2669089f7d1300d93685725acff584c7fb6384 Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Sat, 21 Sep 2024 14:27:48 +0200 Subject: [PATCH 06/81] Use better example + typo fix --- README.md | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index da4386cb3..5a1423815 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,7 @@ final readonly class MyService public function processMessage(string $message): void { - $messages = $this->loadMessageBad(); + $messages = $this->loadMessageBag(); $message = Message::ofUser($message); $response = $this->toolChain->call($message, $messages); @@ -109,19 +109,13 @@ final readonly class MyService Extend the tool chain service to add your own tools: ```php use PhpLlm\LlmChain\ToolBox\AsTool; -use Symfony\Component\Clock\ClockInterface; -#[AsTool('clock', 'Provides the current date and time')] -final class Clock +#[AsTool('company_name', 'Provides the name of your company')] +final class CompanyName { - public function __construct( - private readonly ClockInterface $clock, - ) { - } - public function __invoke(): string { - return $this->clock->now()->format('Y-m-d H:i:s'); + return 'ACME Corp.' } } ``` From 2f04f8e8e114eb0c95279fcc6b5689335019c6eb Mon Sep 17 00:00:00 2001 From: Oskar Stark Date: Sat, 21 Sep 2024 14:38:31 +0200 Subject: [PATCH 07/81] Require `llm-php/llm-chain` --- composer.lock | 1240 +++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 1158 insertions(+), 82 deletions(-) diff --git a/composer.lock b/composer.lock index e53248dee..5eebaee0d 100644 --- a/composer.lock +++ b/composer.lock @@ -6,35 +6,93 @@ ], "content-hash": "bbd22bc3104033205c4a586b46a6b3ab", "packages": [ + { + "name": "doctrine/deprecations", + "version": "1.1.3", + "source": { + "type": "git", + "url": "https://github.com/doctrine/deprecations.git", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/doctrine/deprecations/zipball/dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "reference": "dfbaa3c2d2e9a9df1118213f3b8b0c597bb99fab", + "shasum": "" + }, + "require": { + "php": "^7.1 || ^8.0" + }, + "require-dev": { + "doctrine/coding-standard": "^9", + "phpstan/phpstan": "1.4.10 || 1.10.15", + "phpstan/phpstan-phpunit": "^1.0", + "phpunit/phpunit": "^7.5 || ^8.5 || ^9.5", + "psalm/plugin-phpunit": "0.18.4", + "psr/log": "^1 || ^2 || ^3", + "vimeo/psalm": "4.30.0 || 5.12.0" + }, + "suggest": { + "psr/log": "Allows logging deprecations via PSR-3 logger implementation" + }, + "type": "library", + "autoload": { + "psr-4": { + "Doctrine\\Deprecations\\": "lib/Doctrine/Deprecations" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "A small layer on top of trigger_error(E_USER_DEPRECATED) or PSR-3 logging with options to disable all deprecations or selectively for packages.", + "homepage": "https://www.doctrine-project.org/", + "support": { + "issues": "https://github.com/doctrine/deprecations/issues", + "source": "https://github.com/doctrine/deprecations/tree/1.1.3" + }, + "time": "2024-01-30T19:34:25+00:00" + }, { "name": "php-llm/llm-chain", "version": "dev-main", "source": { "type": "git", "url": "https://github.com/php-llm/llm-chain.git", - "reference": "0f13fae978d2ec02c82826c06e1816b073a70fe4" + "reference": "bf26c67213320e9b02692de1ae0f2708938cc83f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/php-llm/llm-chain/zipball/0f13fae978d2ec02c82826c06e1816b073a70fe4", - "reference": "0f13fae978d2ec02c82826c06e1816b073a70fe4", + "url": "https://api.github.com/repos/php-llm/llm-chain/zipball/bf26c67213320e9b02692de1ae0f2708938cc83f", + "reference": "bf26c67213320e9b02692de1ae0f2708938cc83f", "shasum": "" }, "require": { - "php": "^8.1", + "php": ">=8.1", + "phpdocumentor/reflection-docblock": "^5.4", "psr/cache": "^3.0", "psr/log": "^3.0", - "symfony/http-client": "^6.3 || ^7.0" + "symfony/http-client": "^6.4 || ^7.1", + "symfony/property-access": "^7.1", + "symfony/property-info": "^7.1", + "symfony/serializer": "^7.1", + "symfony/type-info": "^7.1", + "symfony/uid": "^7.1" }, "require-dev": { - "php-cs-fixer/shim": "^3.35", - "phpstan/phpstan": "^1.10", - "phpunit/phpunit": "^10.4", - "probots-io/pinecone-php": "^0.0.3", - "symfony/console": "^6.4 || ^7.0" + "codewithkyrian/chromadb-php": "^0.2.1", + "php-cs-fixer/shim": "^3.64", + "phpstan/phpstan": "^1.12", + "phpunit/phpunit": "^11.3", + "probots-io/pinecone-php": "^1.0", + "symfony/clock": "^6.4 || ^7.1", + "symfony/console": "^6.4 || ^7.1", + "symfony/var-dumper": "^6.4 || ^7.1" }, "suggest": { - "probots-io/pinecone-php": "For using the Pinecone client." + "codewithkyrian/chromadb-php": "For using the ChromaDB as retrieval vector store.", + "probots-io/pinecone-php": "For using the Pinecone as retrieval vector store.", + "symfony/clock": "For using the clock tool." }, "default-branch": true, "type": "library", @@ -53,12 +111,234 @@ "email": "mail@christopher-hertel.de" } ], - "description": "PHP component with tooling around LLMs.", + "description": "A slim PHP component with tooling around LLMs.", "support": { "issues": "https://github.com/php-llm/llm-chain/issues", "source": "https://github.com/php-llm/llm-chain/tree/main" }, - "time": "2024-06-03T20:12:58+00:00" + "time": "2024-09-21T07:53:34+00:00" + }, + { + "name": "phpdocumentor/reflection-common", + "version": "2.2.0", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionCommon.git", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionCommon/zipball/1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "reference": "1d01c49d4ed62f25aa84a747ad35d5a16924662b", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-2.x": "2.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "Common reflection classes used by phpdocumentor to reflect the code structure", + "homepage": "http://www.phpdoc.org", + "keywords": [ + "FQSEN", + "phpDocumentor", + "phpdoc", + "reflection", + "static analysis" + ], + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionCommon/issues", + "source": "https://github.com/phpDocumentor/ReflectionCommon/tree/2.x" + }, + "time": "2020-06-27T09:03:43+00:00" + }, + { + "name": "phpdocumentor/reflection-docblock", + "version": "5.4.1", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/ReflectionDocBlock.git", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "reference": "9d07b3f7fdcf5efec5d1609cba3c19c5ea2bdc9c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.1", + "ext-filter": "*", + "php": "^7.4 || ^8.0", + "phpdocumentor/reflection-common": "^2.2", + "phpdocumentor/type-resolver": "^1.7", + "phpstan/phpdoc-parser": "^1.7", + "webmozart/assert": "^1.9.1" + }, + "require-dev": { + "mockery/mockery": "~1.3.5", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-mockery": "^1.1", + "phpstan/phpstan-webmozart-assert": "^1.2", + "phpunit/phpunit": "^9.5", + "vimeo/psalm": "^5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "5.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + }, + { + "name": "Jaap van Otterdijk", + "email": "opensource@ijaap.nl" + } + ], + "description": "With this component, a library can provide support for annotations via DocBlocks or otherwise retrieve information that is embedded in a DocBlock.", + "support": { + "issues": "https://github.com/phpDocumentor/ReflectionDocBlock/issues", + "source": "https://github.com/phpDocumentor/ReflectionDocBlock/tree/5.4.1" + }, + "time": "2024-05-21T05:55:05+00:00" + }, + { + "name": "phpdocumentor/type-resolver", + "version": "1.8.2", + "source": { + "type": "git", + "url": "https://github.com/phpDocumentor/TypeResolver.git", + "reference": "153ae662783729388a584b4361f2545e4d841e3c" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpDocumentor/TypeResolver/zipball/153ae662783729388a584b4361f2545e4d841e3c", + "reference": "153ae662783729388a584b4361f2545e4d841e3c", + "shasum": "" + }, + "require": { + "doctrine/deprecations": "^1.0", + "php": "^7.3 || ^8.0", + "phpdocumentor/reflection-common": "^2.0", + "phpstan/phpdoc-parser": "^1.13" + }, + "require-dev": { + "ext-tokenizer": "*", + "phpbench/phpbench": "^1.2", + "phpstan/extension-installer": "^1.1", + "phpstan/phpstan": "^1.8", + "phpstan/phpstan-phpunit": "^1.1", + "phpunit/phpunit": "^9.5", + "rector/rector": "^0.13.9", + "vimeo/psalm": "^4.25" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-1.x": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "phpDocumentor\\Reflection\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mike van Riel", + "email": "me@mikevanriel.com" + } + ], + "description": "A PSR-5 based resolver of Class names, Types and Structural Element Names", + "support": { + "issues": "https://github.com/phpDocumentor/TypeResolver/issues", + "source": "https://github.com/phpDocumentor/TypeResolver/tree/1.8.2" + }, + "time": "2024-02-23T11:10:43+00:00" + }, + { + "name": "phpstan/phpdoc-parser", + "version": "1.30.1", + "source": { + "type": "git", + "url": "https://github.com/phpstan/phpdoc-parser.git", + "reference": "51b95ec8670af41009e2b2b56873bad96682413e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/phpstan/phpdoc-parser/zipball/51b95ec8670af41009e2b2b56873bad96682413e", + "reference": "51b95ec8670af41009e2b2b56873bad96682413e", + "shasum": "" + }, + "require": { + "php": "^7.2 || ^8.0" + }, + "require-dev": { + "doctrine/annotations": "^2.0", + "nikic/php-parser": "^4.15", + "php-parallel-lint/php-parallel-lint": "^1.2", + "phpstan/extension-installer": "^1.0", + "phpstan/phpstan": "^1.5", + "phpstan/phpstan-phpunit": "^1.1", + "phpstan/phpstan-strict-rules": "^1.0", + "phpunit/phpunit": "^9.5", + "symfony/process": "^5.2" + }, + "type": "library", + "autoload": { + "psr-4": { + "PHPStan\\PhpDocParser\\": [ + "src/" + ] + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "description": "PHPDoc parser with support for nullable, intersection and generic types", + "support": { + "issues": "https://github.com/phpstan/phpdoc-parser/issues", + "source": "https://github.com/phpstan/phpdoc-parser/tree/1.30.1" + }, + "time": "2024-09-07T20:13:05+00:00" }, { "name": "psr/cache", @@ -1608,27 +1888,24 @@ "time": "2024-05-31T15:07:36+00:00" }, { - "name": "symfony/polyfill-mbstring", - "version": "v1.30.0", + "name": "symfony/polyfill-intl-grapheme", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-mbstring.git", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" + "url": "https://github.com/symfony/polyfill-intl-grapheme.git", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", - "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "url": "https://api.github.com/repos/symfony/polyfill-intl-grapheme/zipball/b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", + "reference": "b9123926e3b7bc2f98c02ad54f6a4b02b91a8abe", "shasum": "" }, "require": { - "php": ">=7.1" - }, - "provide": { - "ext-mbstring": "*" + "php": ">=7.2" }, "suggest": { - "ext-mbstring": "For best performance" + "ext-intl": "For best performance" }, "type": "library", "extra": { @@ -1642,7 +1919,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Mbstring\\": "" + "Symfony\\Polyfill\\Intl\\Grapheme\\": "" } }, "notification-url": "https://packagist.org/downloads/", @@ -1659,17 +1936,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill for the Mbstring extension", + "description": "Symfony polyfill for intl's grapheme_* functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", - "mbstring", + "grapheme", + "intl", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-grapheme/tree/v1.31.0" }, "funding": [ { @@ -1685,24 +1963,27 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:30:46+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/polyfill-php83", - "version": "v1.30.0", + "name": "symfony/polyfill-intl-normalizer", + "version": "v1.31.0", "source": { "type": "git", - "url": "https://github.com/symfony/polyfill-php83.git", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" + "url": "https://github.com/symfony/polyfill-intl-normalizer.git", + "reference": "3833d7255cc303546435cb650316bff708a1c75c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", - "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "url": "https://api.github.com/repos/symfony/polyfill-intl-normalizer/zipball/3833d7255cc303546435cb650316bff708a1c75c", + "reference": "3833d7255cc303546435cb650316bff708a1c75c", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=7.2" + }, + "suggest": { + "ext-intl": "For best performance" }, "type": "library", "extra": { @@ -1716,7 +1997,7 @@ "bootstrap.php" ], "psr-4": { - "Symfony\\Polyfill\\Php83\\": "" + "Symfony\\Polyfill\\Intl\\Normalizer\\": "" }, "classmap": [ "Resources/stubs" @@ -1736,16 +2017,18 @@ "homepage": "https://symfony.com/contributors" } ], - "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "description": "Symfony polyfill for intl's Normalizer class and related functions", "homepage": "https://symfony.com", "keywords": [ "compatibility", + "intl", + "normalizer", "polyfill", "portable", "shim" ], "support": { - "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + "source": "https://github.com/symfony/polyfill-intl-normalizer/tree/v1.31.0" }, "funding": [ { @@ -1761,47 +2044,45 @@ "type": "tidelift" } ], - "time": "2024-06-19T12:35:24+00:00" + "time": "2024-09-09T11:45:10+00:00" }, { - "name": "symfony/routing", - "version": "v7.1.1", + "name": "symfony/polyfill-mbstring", + "version": "v1.30.0", "source": { "type": "git", - "url": "https://github.com/symfony/routing.git", - "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" + "url": "https://github.com/symfony/polyfill-mbstring.git", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", - "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", + "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/fd22ab50000ef01661e2a31d850ebaa297f8e03c", + "reference": "fd22ab50000ef01661e2a31d850ebaa297f8e03c", "shasum": "" }, "require": { - "php": ">=8.2", - "symfony/deprecation-contracts": "^2.5|^3" + "php": ">=7.1" }, - "conflict": { - "symfony/config": "<6.4", - "symfony/dependency-injection": "<6.4", - "symfony/yaml": "<6.4" + "provide": { + "ext-mbstring": "*" }, - "require-dev": { - "psr/log": "^1|^2|^3", - "symfony/config": "^6.4|^7.0", - "symfony/dependency-injection": "^6.4|^7.0", - "symfony/expression-language": "^6.4|^7.0", - "symfony/http-foundation": "^6.4|^7.0", - "symfony/yaml": "^6.4|^7.0" + "suggest": { + "ext-mbstring": "For best performance" }, "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, "autoload": { + "files": [ + "bootstrap.php" + ], "psr-4": { - "Symfony\\Component\\Routing\\": "" - }, - "exclude-from-classmap": [ - "/Tests/" - ] + "Symfony\\Polyfill\\Mbstring\\": "" + } }, "notification-url": "https://packagist.org/downloads/", "license": [ @@ -1809,24 +2090,25 @@ ], "authors": [ { - "name": "Fabien Potencier", - "email": "fabien@symfony.com" + "name": "Nicolas Grekas", + "email": "p@tchwork.com" }, { "name": "Symfony Community", "homepage": "https://symfony.com/contributors" } ], - "description": "Maps an HTTP request to a set of configuration variables", + "description": "Symfony polyfill for the Mbstring extension", "homepage": "https://symfony.com", "keywords": [ - "router", - "routing", - "uri", - "url" + "compatibility", + "mbstring", + "polyfill", + "portable", + "shim" ], "support": { - "source": "https://github.com/symfony/routing/tree/v7.1.1" + "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.30.0" }, "funding": [ { @@ -1842,20 +2124,515 @@ "type": "tidelift" } ], - "time": "2024-05-31T14:57:53+00:00" + "time": "2024-06-19T12:30:46+00:00" }, { - "name": "symfony/service-contracts", - "version": "v3.5.0", + "name": "symfony/polyfill-php83", + "version": "v1.30.0", "source": { "type": "git", - "url": "https://github.com/symfony/service-contracts.git", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + "url": "https://github.com/symfony/polyfill-php83.git", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", - "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "url": "https://api.github.com/repos/symfony/polyfill-php83/zipball/dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "reference": "dbdcdf1a4dcc2743591f1079d0c35ab1e2dcbbc9", + "shasum": "" + }, + "require": { + "php": ">=7.1" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Php83\\": "" + }, + "classmap": [ + "Resources/stubs" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill backporting some PHP 8.3+ features to lower PHP versions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "shim" + ], + "support": { + "source": "https://github.com/symfony/polyfill-php83/tree/v1.30.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-06-19T12:35:24+00:00" + }, + { + "name": "symfony/polyfill-uuid", + "version": "v1.31.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/polyfill-uuid.git", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/polyfill-uuid/zipball/21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "reference": "21533be36c24be3f4b1669c4725c7d1d2bab4ae2", + "shasum": "" + }, + "require": { + "php": ">=7.2" + }, + "provide": { + "ext-uuid": "*" + }, + "suggest": { + "ext-uuid": "For best performance" + }, + "type": "library", + "extra": { + "thanks": { + "name": "symfony/polyfill", + "url": "https://github.com/symfony/polyfill" + } + }, + "autoload": { + "files": [ + "bootstrap.php" + ], + "psr-4": { + "Symfony\\Polyfill\\Uuid\\": "" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Symfony polyfill for uuid functions", + "homepage": "https://symfony.com", + "keywords": [ + "compatibility", + "polyfill", + "portable", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/polyfill-uuid/tree/v1.31.0" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-09T11:45:10+00:00" + }, + { + "name": "symfony/property-access", + "version": "v7.1.4", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-access.git", + "reference": "6c709f97103355016e5782d0622437ae381012ad" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-access/zipball/6c709f97103355016e5782d0622437ae381012ad", + "reference": "6c709f97103355016e5782d0622437ae381012ad", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/property-info": "^6.4|^7.0" + }, + "require-dev": { + "symfony/cache": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyAccess\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides functions to read and write from/to an object or array using a simple string notation", + "homepage": "https://symfony.com", + "keywords": [ + "access", + "array", + "extraction", + "index", + "injection", + "object", + "property", + "property-path", + "reflection" + ], + "support": { + "source": "https://github.com/symfony/property-access/tree/v7.1.4" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-08-30T16:12:47+00:00" + }, + { + "name": "symfony/property-info", + "version": "v7.1.3", + "source": { + "type": "git", + "url": "https://github.com/symfony/property-info.git", + "reference": "88a279df2db5b7919cac6f35d6a5d1d7147e6a9b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/property-info/zipball/88a279df2db5b7919cac6f35d6a5d1d7147e6a9b", + "reference": "88a279df2db5b7919cac6f35d6a5d1d7147e6a9b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/string": "^6.4|^7.0", + "symfony/type-info": "^7.1" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<5.2", + "phpdocumentor/type-resolver": "<1.5.1", + "symfony/dependency-injection": "<6.4", + "symfony/serializer": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^5.2", + "phpstan/phpdoc-parser": "^1.0", + "symfony/cache": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/serializer": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\PropertyInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Kévin Dunglas", + "email": "dunglas@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts information about PHP class' properties using metadata of popular sources", + "homepage": "https://symfony.com", + "keywords": [ + "doctrine", + "phpdoc", + "property", + "symfony", + "type", + "validator" + ], + "support": { + "source": "https://github.com/symfony/property-info/tree/v7.1.3" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-07-26T07:36:36+00:00" + }, + { + "name": "symfony/routing", + "version": "v7.1.1", + "source": { + "type": "git", + "url": "https://github.com/symfony/routing.git", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/routing/zipball/60c31bab5c45af7f13091b87deb708830f3c96c0", + "reference": "60c31bab5c45af7f13091b87deb708830f3c96c0", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3" + }, + "conflict": { + "symfony/config": "<6.4", + "symfony/dependency-injection": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "psr/log": "^1|^2|^3", + "symfony/config": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/expression-language": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Routing\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Maps an HTTP request to a set of configuration variables", + "homepage": "https://symfony.com", + "keywords": [ + "router", + "routing", + "uri", + "url" + ], + "support": { + "source": "https://github.com/symfony/routing/tree/v7.1.1" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "symfony/serializer", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/serializer.git", + "reference": "71d6e1f70f00752d1469d0f5e83b0a51716f288b" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/serializer/zipball/71d6e1f70f00752d1469d0f5e83b0a51716f288b", + "reference": "71d6e1f70f00752d1469d0f5e83b0a51716f288b", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/deprecation-contracts": "^2.5|^3", + "symfony/polyfill-ctype": "~1.8" + }, + "conflict": { + "phpdocumentor/reflection-docblock": "<3.2.2", + "phpdocumentor/type-resolver": "<1.4.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-access": "<6.4", + "symfony/property-info": "<6.4", + "symfony/type-info": "<7.1.5", + "symfony/uid": "<6.4", + "symfony/validator": "<6.4", + "symfony/yaml": "<6.4" + }, + "require-dev": { + "phpdocumentor/reflection-docblock": "^3.2|^4.0|^5.0", + "phpstan/phpdoc-parser": "^1.0", + "seld/jsonlint": "^1.10", + "symfony/cache": "^6.4|^7.0", + "symfony/config": "^6.4|^7.0", + "symfony/console": "^6.4|^7.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/error-handler": "^6.4|^7.0", + "symfony/filesystem": "^6.4|^7.0", + "symfony/form": "^6.4|^7.0", + "symfony/http-foundation": "^6.4|^7.0", + "symfony/http-kernel": "^6.4|^7.0", + "symfony/messenger": "^6.4|^7.0", + "symfony/mime": "^6.4|^7.0", + "symfony/property-access": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3", + "symfony/type-info": "^7.1.5", + "symfony/uid": "^6.4|^7.0", + "symfony/validator": "^6.4|^7.0", + "symfony/var-dumper": "^6.4|^7.0", + "symfony/var-exporter": "^6.4|^7.0", + "symfony/yaml": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Serializer\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Fabien Potencier", + "email": "fabien@symfony.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Handles serializing and deserializing data structures, including object graphs, into array structures or other formats like XML and JSON.", + "homepage": "https://symfony.com", + "support": { + "source": "https://github.com/symfony/serializer/tree/v7.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T12:13:15+00:00" + }, + { + "name": "symfony/service-contracts", + "version": "v3.5.0", + "source": { + "type": "git", + "url": "https://github.com/symfony/service-contracts.git", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", + "reference": "bd1d9e59a81d8fa4acdcea3f617c581f7475a80f", "shasum": "" }, "require": { @@ -1927,6 +2704,249 @@ ], "time": "2024-04-18T09:32:20+00:00" }, + { + "name": "symfony/string", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/string.git", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/string/zipball/d66f9c343fa894ec2037cc928381df90a7ad4306", + "reference": "d66f9c343fa894ec2037cc928381df90a7ad4306", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-ctype": "~1.8", + "symfony/polyfill-intl-grapheme": "~1.0", + "symfony/polyfill-intl-normalizer": "~1.0", + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.5" + }, + "require-dev": { + "symfony/emoji": "^7.1", + "symfony/error-handler": "^6.4|^7.0", + "symfony/http-client": "^6.4|^7.0", + "symfony/intl": "^6.4|^7.0", + "symfony/translation-contracts": "^2.5|^3.0", + "symfony/var-exporter": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "files": [ + "Resources/functions.php" + ], + "psr-4": { + "Symfony\\Component\\String\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to strings and deals with bytes, UTF-8 code points and grapheme clusters in a unified way", + "homepage": "https://symfony.com", + "keywords": [ + "grapheme", + "i18n", + "string", + "unicode", + "utf-8", + "utf8" + ], + "support": { + "source": "https://github.com/symfony/string/tree/v7.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-20T08:28:38+00:00" + }, + { + "name": "symfony/type-info", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/type-info.git", + "reference": "9f6094aa900d2c06bd61576a6f279d4ac441515f" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/type-info/zipball/9f6094aa900d2c06bd61576a6f279d4ac441515f", + "reference": "9f6094aa900d2c06bd61576a6f279d4ac441515f", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "psr/container": "^1.1|^2.0" + }, + "conflict": { + "phpstan/phpdoc-parser": "<1.0", + "symfony/dependency-injection": "<6.4", + "symfony/property-info": "<6.4" + }, + "require-dev": { + "phpstan/phpdoc-parser": "^1.0", + "symfony/dependency-injection": "^6.4|^7.0", + "symfony/property-info": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\TypeInfo\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Mathias Arlaud", + "email": "mathias.arlaud@gmail.com" + }, + { + "name": "Baptiste LEDUC", + "email": "baptiste.leduc@gmail.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Extracts PHP types information.", + "homepage": "https://symfony.com", + "keywords": [ + "PHPStan", + "phpdoc", + "symfony", + "type" + ], + "support": { + "source": "https://github.com/symfony/type-info/tree/v7.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-19T21:48:23+00:00" + }, + { + "name": "symfony/uid", + "version": "v7.1.5", + "source": { + "type": "git", + "url": "https://github.com/symfony/uid.git", + "reference": "8c7bb8acb933964055215d89f9a9871df0239317" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/symfony/uid/zipball/8c7bb8acb933964055215d89f9a9871df0239317", + "reference": "8c7bb8acb933964055215d89f9a9871df0239317", + "shasum": "" + }, + "require": { + "php": ">=8.2", + "symfony/polyfill-uuid": "^1.15" + }, + "require-dev": { + "symfony/console": "^6.4|^7.0" + }, + "type": "library", + "autoload": { + "psr-4": { + "Symfony\\Component\\Uid\\": "" + }, + "exclude-from-classmap": [ + "/Tests/" + ] + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Grégoire Pineau", + "email": "lyrixx@lyrixx.info" + }, + { + "name": "Nicolas Grekas", + "email": "p@tchwork.com" + }, + { + "name": "Symfony Community", + "homepage": "https://symfony.com/contributors" + } + ], + "description": "Provides an object-oriented API to generate and represent UIDs", + "homepage": "https://symfony.com", + "keywords": [ + "UID", + "ulid", + "uuid" + ], + "support": { + "source": "https://github.com/symfony/uid/tree/v7.1.5" + }, + "funding": [ + { + "url": "https://symfony.com/sponsor", + "type": "custom" + }, + { + "url": "https://github.com/fabpot", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", + "type": "tidelift" + } + ], + "time": "2024-09-17T09:16:35+00:00" + }, { "name": "symfony/var-dumper", "version": "v7.1.1", @@ -2085,14 +3105,70 @@ } ], "time": "2024-05-31T14:57:53+00:00" + }, + { + "name": "webmozart/assert", + "version": "1.11.0", + "source": { + "type": "git", + "url": "https://github.com/webmozarts/assert.git", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/webmozarts/assert/zipball/11cb2199493b2f8a3b53e7f19068fc6aac760991", + "reference": "11cb2199493b2f8a3b53e7f19068fc6aac760991", + "shasum": "" + }, + "require": { + "ext-ctype": "*", + "php": "^7.2 || ^8.0" + }, + "conflict": { + "phpstan/phpstan": "<0.12.20", + "vimeo/psalm": "<4.6.1 || 4.6.2" + }, + "require-dev": { + "phpunit/phpunit": "^8.5.13" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.10-dev" + } + }, + "autoload": { + "psr-4": { + "Webmozart\\Assert\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Bernhard Schussek", + "email": "bschussek@gmail.com" + } + ], + "description": "Assertions to validate method input/output with nice error messages.", + "keywords": [ + "assert", + "check", + "validate" + ], + "support": { + "issues": "https://github.com/webmozarts/assert/issues", + "source": "https://github.com/webmozarts/assert/tree/1.11.0" + }, + "time": "2022-06-03T18:03:27+00:00" } ], "packages-dev": [], "aliases": [], "minimum-stability": "dev", - "stability-flags": { - "php-llm/llm-chain": 20 - }, + "stability-flags": [], "prefer-stable": true, "prefer-lowest": false, "platform": { From fad354c1c05b0f8b3ab75f0303b4a679d33cea4a Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 21 Sep 2024 17:55:38 +0200 Subject: [PATCH 08/81] feat: introducing profiler --- src/DataCollector.php | 69 +++++++++ src/DependencyInjection/LlmChainExtension.php | 18 +++ src/Resources/config/services.php | 10 +- src/Resources/views/data_collector.html.twig | 131 ++++++++++++++++++ src/Resources/views/icon.svg | 16 +++ src/TraceableLanguageModel.php | 37 +++++ src/TraceableToolRegistry.php | 36 +++++ 7 files changed, 316 insertions(+), 1 deletion(-) create mode 100644 src/DataCollector.php create mode 100644 src/Resources/views/data_collector.html.twig create mode 100644 src/Resources/views/icon.svg create mode 100644 src/TraceableLanguageModel.php create mode 100644 src/TraceableToolRegistry.php diff --git a/src/DataCollector.php b/src/DataCollector.php new file mode 100644 index 000000000..651614e40 --- /dev/null +++ b/src/DataCollector.php @@ -0,0 +1,69 @@ + + */ + private readonly array $llms; + + /** + * @param iterable $llms + */ + public function __construct( + #[AutowireIterator('llm_chain.traceable_llm')] + iterable $llms, + private TraceableToolRegistry $toolRegistry, + ) { + $this->llms = $llms instanceof \Traversable ? iterator_to_array($llms) : $llms; + } + + public function collect(Request $request, Response $response, ?\Throwable $exception = null): void + { + $llmCalls = []; + foreach ($this->llms as $llm) { + $llmCalls[$llm->getName()] = $llm->calls; + } + + $this->data = [ + 'tools' => $this->toolRegistry->getMap(), + 'llm_calls' => $llmCalls, + 'tool_calls' => $this->toolRegistry->calls, + ]; + } + + public static function getTemplate(): string + { + return '@LlmChain/data_collector.html.twig'; + } + + + public function getLlmCalls(): array + { + return $this->data['llm_calls'] ?? []; + } + + public function getLlmCallCount(): int + { + return array_sum(array_map('count', $this->data['llm_calls'] ?? [])); + } + + public function getTools(): array + { + return $this->data['tools'] ?? []; + } + + public function getToolCalls(): array + { + return $this->data['tool_calls'] ?? []; + } +} diff --git a/src/DependencyInjection/LlmChainExtension.php b/src/DependencyInjection/LlmChainExtension.php index 736c6faa2..a42b1994a 100644 --- a/src/DependencyInjection/LlmChainExtension.php +++ b/src/DependencyInjection/LlmChainExtension.php @@ -16,9 +16,13 @@ use PhpLlm\LlmChain\Store\StoreInterface; use PhpLlm\LlmChain\Store\VectorStoreInterface; use PhpLlm\LlmChain\ToolBox\AsTool; +use PhpLlm\LlmChainBundle\DataCollector; +use PhpLlm\LlmChainBundle\TraceableLanguageModel; +use PhpLlm\LlmChainBundle\TraceableToolRegistry; use Symfony\Component\Config\FileLocator; use Symfony\Component\DependencyInjection\ChildDefinition; use Symfony\Component\DependencyInjection\ContainerBuilder; +use Symfony\Component\DependencyInjection\Definition; use Symfony\Component\DependencyInjection\Extension\Extension; use Symfony\Component\DependencyInjection\Loader\PhpFileLoader; use Symfony\Component\DependencyInjection\Reference; @@ -69,6 +73,11 @@ public function load(array $configs, ContainerBuilder $container): void 'method' => $attribute->method, ]); }); + + if (false === $container->getParameter('kernel.debug')) { + $container->removeDefinition(DataCollector::class); + $container->removeDefinition(TraceableToolRegistry::class); + } } private function processRuntimeConfig(string $name, array $runtime, ContainerBuilder $container): void @@ -103,6 +112,15 @@ private function processLlmConfig(string $name, array $llm, ContainerBuilder $co $definition->replaceArgument('$runtime', new Reference($runtime)); $container->setDefinition('llm_chain.llm.'.$name, $definition); + + if ($container->getParameter('kernel.debug')) { + $traceable = new Definition(TraceableLanguageModel::class); + $traceable->setDecoratedService('llm_chain.llm.'.$name); + $traceable->addTag('llm_chain.traceable_llm'); + $traceable->setArgument('$llm', new Reference('llm_chain.llm.'.$name.'.debug.inner')); + $traceable->setArgument('$name', $name); + $container->setDefinition('llm_chain.llm.'.$name.'.debug', $traceable); + } } private function processEmbeddingsConfig(string $name, mixed $embeddings, ContainerBuilder $container): void diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php index bb5bca4e6..a547fe840 100644 --- a/src/Resources/config/services.php +++ b/src/Resources/config/services.php @@ -11,13 +11,15 @@ use PhpLlm\LlmChain\OpenAI\Runtime; use PhpLlm\LlmChain\OpenAI\Runtime\Azure as AzureRuntime; use PhpLlm\LlmChain\OpenAI\Runtime\OpenAI as OpenAIRuntime; -use PhpLlm\LlmChain\Store\Azure\SearchStore; use PhpLlm\LlmChain\ToolBox\ParameterAnalyzer; use PhpLlm\LlmChain\ToolBox\Registry; +use PhpLlm\LlmChain\ToolBox\RegistryInterface; use PhpLlm\LlmChain\ToolBox\ToolAnalyzer; use PhpLlm\LlmChain\ToolChain; use PhpLlm\LlmChain\Store\Azure\SearchStore as AzureSearchStore; use PhpLlm\LlmChain\Store\ChromaDb\Store as ChromaDbStore; +use PhpLlm\LlmChainBundle\DataCollector; +use PhpLlm\LlmChainBundle\TraceableToolRegistry; return static function (ContainerConfigurator $container) { $container->services() @@ -79,7 +81,13 @@ ->args([ '$tools' => tagged_iterator('llm_chain.tool'), ]) + ->alias(RegistryInterface::class, Registry::class) ->set(ToolAnalyzer::class) ->set(ParameterAnalyzer::class) + + // profiler + ->set(DataCollector::class) + ->set(TraceableToolRegistry::class) + ->decorate(Registry::class) ; }; diff --git a/src/Resources/views/data_collector.html.twig b/src/Resources/views/data_collector.html.twig new file mode 100644 index 000000000..65b8415a5 --- /dev/null +++ b/src/Resources/views/data_collector.html.twig @@ -0,0 +1,131 @@ +{% extends '@WebProfiler/Profiler/layout.html.twig' %} + +{% block toolbar %} + {% set icon %} + {{ include('@LlmChain/icon.svg', { y: 18 }) }} + {{ collector.llmCallCount }} + + calls + + {% endset %} + + {% set text %} +
+
+ LLM Calls + {{ collector.llmCallCount }} +
+
+ Tool Calls + {{ collector.toolCalls|length }} +
+
+ {% endset %} + + {{ include('@WebProfiler/Profiler/toolbar_item.html.twig', { 'link': true }) }} +{% endblock %} + +{% block menu %} + + {{ include('@LlmChain/icon.svg', { y: 16 }) }} + LlmChain + {{ collector.llmCallCount }} + +{% endblock %} + +{% block panel %} +

LlmChain

+
+
+
+ {{ collector.llmCallCount }} + LLM Calls +
+
+
+
+
+ {{ collector.tools|length }} + Registered Tools +
+
+ {{ collector.toolCalls|length }} + Tool Calls +
+
+
+

LLM Calls

+ {% if collector.llmCallCount %} +
+ {% for llm, calls in collector.llmCalls %} +
+

{{ llm }} {{ calls|length }}

+
+ {% for call in calls %} + + + + + + + + + + + + + + + + + + + + +
Call {{ loop.index }}
Messages +
    + {% for message in call.messages %} +
  1. + {{ message.role.value|title }}: + {{ message.hasFunctionCall ? dump(message.functionCall) : message.content }} +
  2. + {% endfor %} +
+
Options{{ dump(call.options) }}
Response{{ dump(call.response) }}
+ {% endfor %} +
+
+ {% endfor %} +
+ {% else %} +
+

No LLM calls were made.

+
+ {% endif %} +

Tool Calls

+ {% if collector.toolCalls|length %} + {% for call in collector.toolCalls %} + + + + + + + + + + + + + + + + +
{{ call.name }}
Arguments{{ call.arguments }}
Response{{ call.response }}
+ {% endfor %} + {% else %} +
+

No tool calls were made.

+
+ {% endif %} +{% endblock %} diff --git a/src/Resources/views/icon.svg b/src/Resources/views/icon.svg new file mode 100644 index 000000000..56f1a6c08 --- /dev/null +++ b/src/Resources/views/icon.svg @@ -0,0 +1,16 @@ + + + + + + LLM + diff --git a/src/TraceableLanguageModel.php b/src/TraceableLanguageModel.php new file mode 100644 index 000000000..22983e93d --- /dev/null +++ b/src/TraceableLanguageModel.php @@ -0,0 +1,37 @@ +llm->call($messages, $options); + + $this->calls[] = [ + 'messages' => clone $messages, + 'options' => $options, + 'response' => $response, + ]; + + return $response; + } + + public function getName(): string + { + return $this->name; + } +} diff --git a/src/TraceableToolRegistry.php b/src/TraceableToolRegistry.php new file mode 100644 index 000000000..fd26a9080 --- /dev/null +++ b/src/TraceableToolRegistry.php @@ -0,0 +1,36 @@ +toolRegistry->getMap(); + } + + public function execute(string $name, string $arguments): string + { + $response = $this->toolRegistry->execute($name, $arguments); + + $this->calls[] = [ + 'name' => $name, + 'arguments' => $arguments, + 'response' => $response, + ]; + + return $response; + } +} From a5458280b931e468f8f7629c8a645b0b62ed923f Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 21 Sep 2024 18:22:58 +0200 Subject: [PATCH 09/81] docs: fix examples & introduce profiler (#4) --- README.md | 16 +++++++++------- profiler.png | Bin 0 -> 196424 bytes 2 files changed, 9 insertions(+), 7 deletions(-) create mode 100644 profiler.png diff --git a/README.md b/README.md index 5a1423815..3f6d85539 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ Symfony integration bundle for [php-llm/llm-chain](https://github.com/php-llm/ll composer require php-llm/llm-chain-bundle:@dev php-llm/llm-chain:@dev ``` -## Example Configuration +## Configuration ```yaml # config/packages/llm_chain.yaml @@ -51,7 +51,7 @@ llm_chain: api_version: '2024-07-01' ``` -## Usage +## Features ### Simple Chat @@ -72,7 +72,7 @@ final readonly class MyService $messages[] = Message::forSystem('Speak like a pirate.'); $messages[] = Message::ofUser($message); - return $this->chat->send($message); + return $this->chat->send($messages); } } ``` @@ -95,11 +95,9 @@ final readonly class MyService public function processMessage(string $message): void { $messages = $this->loadMessageBag(); - $message = Message::ofUser($message); - - $response = $this->toolChain->call($message, $messages); + $messages[] = Message::ofUser($message); - $messages[] = $message; + $response = $this->toolChain->call($messages); $messages[] = Message::ofAssistant($response); $this->saveMessages($messages); @@ -119,3 +117,7 @@ final class CompanyName } } ``` + +### Profiler + +![Profiler](./profiler.png) diff --git a/profiler.png b/profiler.png new file mode 100644 index 0000000000000000000000000000000000000000..dd1aaf0196038ed7e18551d706045067628bdc67 GIT binary patch literal 196424 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 % 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 A761SM literal 0 HcmV?d00001 From a31f428144052c54eced2932c56cdabb3a70681a Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 21 Sep 2024 20:57:20 +0200 Subject: [PATCH 10/81] feat: adopt universal chain rework (#5) --- src/Resources/config/services.php | 12 ++++-------- src/Resources/views/data_collector.html.twig | 4 ++-- src/TraceableLanguageModel.php | 13 ++++++++++++- src/TraceableToolRegistry.php | 9 +++++---- 4 files changed, 23 insertions(+), 15 deletions(-) diff --git a/src/Resources/config/services.php b/src/Resources/config/services.php index a547fe840..68ffe0d01 100644 --- a/src/Resources/config/services.php +++ b/src/Resources/config/services.php @@ -4,7 +4,7 @@ namespace Symfony\Component\DependencyInjection\Loader\Configurator; -use PhpLlm\LlmChain\Chat; +use PhpLlm\LlmChain\Chain; use PhpLlm\LlmChain\DocumentEmbedder; use PhpLlm\LlmChain\OpenAI\Model\Embeddings; use PhpLlm\LlmChain\OpenAI\Model\Gpt; @@ -15,7 +15,6 @@ use PhpLlm\LlmChain\ToolBox\Registry; use PhpLlm\LlmChain\ToolBox\RegistryInterface; use PhpLlm\LlmChain\ToolBox\ToolAnalyzer; -use PhpLlm\LlmChain\ToolChain; use PhpLlm\LlmChain\Store\Azure\SearchStore as AzureSearchStore; use PhpLlm\LlmChain\Store\ChromaDb\Store as ChromaDbStore; use PhpLlm\LlmChainBundle\DataCollector; @@ -27,9 +26,9 @@ ->autowire() ->autoconfigure() - // chains - ->set(Chat::class) - ->set(ToolChain::class) + // high level feature + ->set(Chain::class) + ->set(DocumentEmbedder::class) // runtimes ->set(AzureRuntime::class) @@ -73,9 +72,6 @@ '$collectionName' => abstract_arg('Name of ChromaDB collection'), ]) - // embedder - ->set(DocumentEmbedder::class) - // tools ->set(Registry::class) ->args([ diff --git a/src/Resources/views/data_collector.html.twig b/src/Resources/views/data_collector.html.twig index 65b8415a5..72cbc754a 100644 --- a/src/Resources/views/data_collector.html.twig +++ b/src/Resources/views/data_collector.html.twig @@ -76,7 +76,7 @@ {% for message in call.messages %}
  • {{ message.role.value|title }}: - {{ message.hasFunctionCall ? dump(message.functionCall) : message.content }} + {{ message.hasToolCalls ? dump(message.toolCalls) : message.content }}
  • {% endfor %} @@ -114,7 +114,7 @@ Arguments - {{ call.arguments }} + {{ dump(call.arguments) }} Response diff --git a/src/TraceableLanguageModel.php b/src/TraceableLanguageModel.php index 22983e93d..3f964bb0e 100644 --- a/src/TraceableLanguageModel.php +++ b/src/TraceableLanguageModel.php @@ -6,6 +6,7 @@ use PhpLlm\LlmChain\LanguageModel; use PhpLlm\LlmChain\Message\MessageBag; +use PhpLlm\LlmChain\Response\Response; final class TraceableLanguageModel implements LanguageModel { @@ -17,7 +18,7 @@ public function __construct( ) { } - public function call(MessageBag $messages, array $options = []): array + public function call(MessageBag $messages, array $options = []): Response { $response = $this->llm->call($messages, $options); @@ -30,6 +31,16 @@ public function call(MessageBag $messages, array $options = []): array return $response; } + public function hasToolSupport(): bool + { + return $this->llm->hasToolSupport(); + } + + public function hasStructuredOutputSupport(): bool + { + return $this->llm->hasStructuredOutputSupport(); + } + public function getName(): string { return $this->name; diff --git a/src/TraceableToolRegistry.php b/src/TraceableToolRegistry.php index fd26a9080..67fe8b192 100644 --- a/src/TraceableToolRegistry.php +++ b/src/TraceableToolRegistry.php @@ -4,6 +4,7 @@ namespace PhpLlm\LlmChainBundle; +use PhpLlm\LlmChain\Response\ToolCall; use PhpLlm\LlmChain\ToolBox\Registry; use PhpLlm\LlmChain\ToolBox\RegistryInterface; @@ -21,13 +22,13 @@ public function getMap(): array return $this->toolRegistry->getMap(); } - public function execute(string $name, string $arguments): string + public function execute(ToolCall $toolCall): string { - $response = $this->toolRegistry->execute($name, $arguments); + $response = $this->toolRegistry->execute($toolCall); $this->calls[] = [ - 'name' => $name, - 'arguments' => $arguments, + 'name' => $toolCall->name, + 'arguments' => $toolCall->arguments, 'response' => $response, ]; From 218a0677084524e4073fb028ffc79a8dda31cc49 Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 21 Sep 2024 21:08:55 +0200 Subject: [PATCH 11/81] docs: update after chain rework (#6) --- README.md | 39 ++++++++------------------------------- 1 file changed, 8 insertions(+), 31 deletions(-) diff --git a/README.md b/README.md index 3f6d85539..c7c4d03ff 100644 --- a/README.md +++ b/README.md @@ -51,9 +51,9 @@ llm_chain: api_version: '2024-07-01' ``` -## Features +## Usage -### Simple Chat +### Chain Service Use the simple chat service to leverage GPT: ```php @@ -62,7 +62,7 @@ use PhpLlm\LlmChain\Chat; final readonly class MyService { public function __construct( - private Chat $chat, + private Chain $chain, ) { } @@ -72,39 +72,14 @@ final readonly class MyService $messages[] = Message::forSystem('Speak like a pirate.'); $messages[] = Message::ofUser($message); - return $this->chat->send($messages); + return $this->chain->call($messages); } } ``` -### Tool Chain +### Register Tools -Use the tool chain service to leverage tool calling with GPT: -```php -use PhpLlm\LlmChain\Message\Message; -use PhpLlm\LlmChain\Message\MessageBag; -use PhpLlm\LlmChain\ToolChain; - -final readonly class MyService -{ - public function __construct( - private ToolChain $toolChain, - ) { - } - - public function processMessage(string $message): void - { - $messages = $this->loadMessageBag(); - $messages[] = Message::ofUser($message); - - $response = $this->toolChain->call($messages); - $messages[] = Message::ofAssistant($response); - - $this->saveMessages($messages); - } -} -``` -Extend the tool chain service to add your own tools: +You can register tools by using the `AsTool` attribute and enable the chain to execute it: ```php use PhpLlm\LlmChain\ToolBox\AsTool; @@ -120,4 +95,6 @@ final class CompanyName ### Profiler +The profiler panel provides insights into the chain's execution: + ![Profiler](./profiler.png) From 0c0def2f65e5a77883d071e87c1aac84f66e0df1 Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 21 Sep 2024 21:41:01 +0200 Subject: [PATCH 12/81] feat: improved chain and tool rendering in profiler (#7) --- src/Resources/views/data_collector.html.twig | 41 +++++++++++++++++--- src/TraceableToolRegistry.php | 9 ++--- 2 files changed, 39 insertions(+), 11 deletions(-) diff --git a/src/Resources/views/data_collector.html.twig b/src/Resources/views/data_collector.html.twig index 72cbc754a..83227f23e 100644 --- a/src/Resources/views/data_collector.html.twig +++ b/src/Resources/views/data_collector.html.twig @@ -33,6 +33,18 @@ {% endblock %} +{% macro tool_calls(toolCalls) %} + Tool call(s): +
      + {% for toolCall in toolCalls %} +
    • + {{ toolCall.name }}({{ toolCall.arguments|map((value, key) => "#{key}: #{value}")|join(', ') }}) + (ID: {{ toolCall.id }}) +
    • + {% endfor %} +
    +{% endmacro %} + {% block panel %}

    LlmChain

    @@ -76,7 +88,14 @@ {% for message in call.messages %}
  • {{ message.role.value|title }}: - {{ message.hasToolCalls ? dump(message.toolCalls) : message.content }} + {% if message.hasToolCalls and 'assistant' == message.role.value %} + {{ _self.tool_calls(message.toolCalls) }} + {% elseif message.hasToolCalls and 'tool' == message.role.value %} + Result of tool call with ID {{ message.toolCalls[0].id }}
    + {{ message.content|nl2br }} + {% else %} + {{ message.content|nl2br }} + {% endif %}
  • {% endfor %} @@ -84,11 +103,17 @@ Options - {{ dump(call.options) }} + +
      + {% for key, value in call.options %} +
    • {{ key }}: {{ dump(value) }}
    • + {% endfor %} +
    + Response - {{ dump(call.response) }} + {{ call.response.hasToolCalls ? _self.tool_calls(call.response.toolCalls) : call.response.content }} @@ -108,17 +133,21 @@ - + + + + + - + - +
    {{ call.name }}{{ call.call.name }}
    ID{{ call.call.id }}
    Arguments{{ dump(call.arguments) }}{{ dump(call.call.arguments) }}
    Response{{ call.response }}{{ call.result|nl2br }}
    diff --git a/src/TraceableToolRegistry.php b/src/TraceableToolRegistry.php index 67fe8b192..e3e12cb53 100644 --- a/src/TraceableToolRegistry.php +++ b/src/TraceableToolRegistry.php @@ -24,14 +24,13 @@ public function getMap(): array public function execute(ToolCall $toolCall): string { - $response = $this->toolRegistry->execute($toolCall); + $result = $this->toolRegistry->execute($toolCall); $this->calls[] = [ - 'name' => $toolCall->name, - 'arguments' => $toolCall->arguments, - 'response' => $response, + 'call' => $toolCall, + 'result' => $result, ]; - return $response; + return $result; } } From a89525398efca22e25c220736cead2c17e9049ee Mon Sep 17 00:00:00 2001 From: Christopher Hertel Date: Sat, 21 Sep 2024 23:12:18 +0200 Subject: [PATCH 13/81] feat: improving tool rendering in profiler (#8) --- README.md | 16 ++++- src/Resources/views/data_collector.html.twig | 76 ++++++++++++++++++-- 2 files changed, 85 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index c7c4d03ff..7f036f13e 100644 --- a/README.md +++ b/README.md @@ -79,7 +79,21 @@ final readonly class MyService ### Register Tools -You can register tools by using the `AsTool` attribute and enable the chain to execute it: +To use existing tools, you can register them as a service: +```yaml +services: + _defaults: + autowire: true + autoconfigure: true + + PhpLlm\LlmChain\ToolBox\Tool\Clock: ~ + PhpLlm\LlmChain\ToolBox\Tool\OpenMeteo: ~ + PhpLlm\LlmChain\ToolBox\Tool\SerpApi: + $apiKey: '%env(SERP_API_KEY)%' + PhpLlm\LlmChain\ToolBox\Tool\Wikipedia: ~ +``` + +Custom tools can be registered by using the `AsTool` attribute: ```php use PhpLlm\LlmChain\ToolBox\AsTool; diff --git a/src/Resources/views/data_collector.html.twig b/src/Resources/views/data_collector.html.twig index 83227f23e..ff25c3801 100644 --- a/src/Resources/views/data_collector.html.twig +++ b/src/Resources/views/data_collector.html.twig @@ -12,12 +12,20 @@ {% set text %}
    - LLM Calls - {{ collector.llmCallCount }} + Configured LLMs + {{ collector.llmCalls|length }}
    - Tool Calls - {{ collector.toolCalls|length }} + LLM Calls + {{ collector.llmCallCount }} +
    +
    + Registered Tools + {{ collector.tools|length }} +
    +
    + Tool Calls + {{ collector.toolCalls|length }}
    {% endset %} @@ -34,7 +42,7 @@ {% endblock %} {% macro tool_calls(toolCalls) %} - Tool call(s): + Tool call{{ toolCalls|length > 1 ? 's' }}: