Skip to content

Commit a2d1cf1

Browse files
Merge pull request #16 from Guiziweb/feat/graceful-no-platform-fallback
feat(resolver): tolerate missing AI platform at install time with clear runtime error
2 parents 4f05f40 + 62c9fd7 commit a2d1cf1

7 files changed

Lines changed: 59 additions & 5 deletions

File tree

composer.json

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
"api-platform/symfony": "^4.3",
1919
"league/commonmark": "^2.8",
2020
"sylius/sylius": "^2.0",
21-
"symfony/ai-platform": "dev-main as 0.8.x-dev",
21+
"symfony/ai-platform": "^0.8",
2222
"symfony/framework-bundle": "^7.3",
2323
"symfony/rate-limiter": "^7.3",
2424
"twig/markdown-extra": "^3.24",
@@ -39,8 +39,9 @@
3939
"friends-of-behat/symfony-extension": "^2.6",
4040
"friends-of-behat/variadic-extension": "^1.6",
4141
"nyholm/psr7": "^1.8",
42-
"symfony/ai-bundle": "dev-main as 0.8.x-dev",
43-
"symfony/ai-open-ai-platform": "dev-main as 0.8.x-dev",
42+
"symfony/ai-agent": "^0.8",
43+
"symfony/ai-bundle": "^0.8",
44+
"symfony/ai-open-ai-platform": "^0.8",
4445
"phpstan/phpstan": "^1.12",
4546
"phpstan/phpstan-doctrine": "^1.3",
4647
"phpstan/phpstan-webmozart-assert": "^1.2",
@@ -60,6 +61,7 @@
6061
"symfony/webpack-encore-bundle": "^2.2"
6162
},
6263
"suggest": {
64+
"symfony/ai-bundle": "Required to enable AI features (declares Platform services from ai.yaml config)",
6365
"symfony/ai-open-ai-platform": "To use OpenAI as AI provider",
6466
"symfony/ai-anthropic-platform": "To use Anthropic Claude as AI provider",
6567
"symfony/ai-mistral-platform": "To use Mistral as AI provider"

config/services.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ services:
1414

1515
Guiziweb\SyliusGridAssistantPlugin\Resolver\GridQueryResolver:
1616
arguments:
17+
$platform: '@?Symfony\AI\Platform\PlatformInterface'
1718
$model: '%guiziweb.grid_assistant.model%'
1819

1920
Guiziweb\SyliusGridAssistantPlugin\Twig\Extension\GridAssistantExtension:

src/Processor/GridQueryProcessor.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
namespace Guiziweb\SyliusGridAssistantPlugin\Processor;
66

7+
use Guiziweb\SyliusGridAssistantPlugin\Resolver\GridQueryConfigurationException;
78
use Guiziweb\SyliusGridAssistantPlugin\Resolver\GridQueryResolverException;
89
use Guiziweb\SyliusGridAssistantPlugin\Resolver\GridQueryResolverInterface;
910
use Guiziweb\SyliusGridAssistantPlugin\Schema\GridSchemaBuilderInterface;
@@ -54,6 +55,10 @@ public function process(string $query, string $gridCode, string $routeName, arra
5455

5556
try {
5657
$resolved = $this->queryResolver->resolve($query, $gridCode);
58+
} catch (GridQueryConfigurationException $e) {
59+
$this->aiLogger->warning('[GridAssistant] Configuration error', ['error' => $e->getMessage()]);
60+
61+
throw new GridQueryProcessorException($e->getMessage(), 0, $e);
5762
} catch (GridQueryResolverException $e) {
5863
$this->aiLogger->warning('[GridAssistant] Resolver error', ['error' => $e->getMessage()]);
5964

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Guiziweb\SyliusGridAssistantPlugin\Resolver;
6+
7+
final class GridQueryConfigurationException extends GridQueryResolverException
8+
{
9+
}

src/Resolver/GridQueryResolver.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
* @param non-empty-string $model
2121
*/
2222
public function __construct(
23-
private PlatformInterface $platform,
23+
private ?PlatformInterface $platform,
2424
private string $model,
2525
private GridSchemaBuilderInterface $schemaBuilder,
2626
private GridToolSchemaFactoryInterface $schemaFactory,
@@ -31,6 +31,10 @@ public function __construct(
3131

3232
public function resolve(string $query, string $gridCode): ResolvedGridQuery
3333
{
34+
if (null === $this->platform) {
35+
throw new GridQueryConfigurationException('No AI platform configured. Run: composer require symfony/ai-bundle symfony/ai-openai-platform (or another bridge: symfony/ai-gemini-platform, symfony/ai-anthropic-platform, symfony/ai-mistral-platform), then configure ai.platform.<provider> in config/packages/ai.yaml.');
36+
}
37+
3438
$gridSchema = $this->schemaBuilder->buildSchema($gridCode);
3539
$parametersSchema = $this->schemaFactory->buildParameters($gridSchema);
3640

src/Resolver/GridQueryResolverException.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@
44

55
namespace Guiziweb\SyliusGridAssistantPlugin\Resolver;
66

7-
final class GridQueryResolverException extends \RuntimeException
7+
class GridQueryResolverException extends \RuntimeException
88
{
99
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Guiziweb\SyliusGridAssistantPlugin\Tests\Unit\Resolver;
6+
7+
use Guiziweb\SyliusGridAssistantPlugin\Resolver\GridQueryConfigurationException;
8+
use Guiziweb\SyliusGridAssistantPlugin\Resolver\GridQueryResolver;
9+
use Guiziweb\SyliusGridAssistantPlugin\Schema\GridSchemaBuilderInterface;
10+
use Guiziweb\SyliusGridAssistantPlugin\Toolbox\GridToolSchemaFactoryInterface;
11+
use PHPUnit\Framework\TestCase;
12+
use Psr\Clock\ClockInterface;
13+
use Psr\Log\LoggerInterface;
14+
15+
final class GridQueryResolverTest extends TestCase
16+
{
17+
public function testThrowsWhenNoPlatformIsConfigured(): void
18+
{
19+
$resolver = new GridQueryResolver(
20+
null,
21+
'gpt-4o',
22+
$this->createMock(GridSchemaBuilderInterface::class),
23+
$this->createMock(GridToolSchemaFactoryInterface::class),
24+
$this->createMock(LoggerInterface::class),
25+
$this->createMock(ClockInterface::class),
26+
);
27+
28+
$this->expectException(GridQueryConfigurationException::class);
29+
$this->expectExceptionMessageMatches('/No AI platform configured/');
30+
31+
$resolver->resolve('any query', 'sylius_admin_order');
32+
}
33+
}

0 commit comments

Comments
 (0)