- Created `quick-replies.blade.php` for managing quick replies. - Added `settings.blade.php` for admin settings management. - Implemented `ticket-show.blade.php` to display ticket details. - Introduced `timeline-card.blade.php` component for displaying timeline information. Enhance quick reply management functionality - Developed `quick-reply-manager.blade.php` for creating and editing quick replies. - Integrated Livewire for dynamic interaction and validation. Implement settings page for AI configuration - Created `settings-page.blade.php` for managing AI settings, including prompts and provider instances. - Added functionality for managing models and embeddings. Add ticket show functionality with real-time updates - Implemented ticket details view with processing status and tool call logs. - Added support for displaying article suggestions and error messages. Create unit tests for AI classifier and domain info tool - Added `AIClassifierServiceTest.php` to validate AI classifier functionality. - Implemented `DomainInfoToolTest.php` for domain parameter validation. - Created `OxxaClientTest.php` to test API interactions and password hashing.
85 lines
2.7 KiB
PHP
85 lines
2.7 KiB
PHP
<?php
|
|
|
|
namespace Tests\Unit;
|
|
|
|
use App\DTOs\ArticleCandidateDTO;
|
|
use App\Services\AIClassifierService;
|
|
use App\Services\AppSettingsService;
|
|
use App\Services\ClassifierPromptBuilder;
|
|
use App\Services\Llm\LlmClientInterface;
|
|
use App\Services\LlmJsonDecoder;
|
|
use App\Services\ToolCallRequestValidator;
|
|
use Tests\TestCase;
|
|
|
|
class AIClassifierServiceTest extends TestCase
|
|
{
|
|
public function test_it_returns_validated_domain_tool_call_from_llm_json(): void
|
|
{
|
|
$client = new class implements LlmClientInterface
|
|
{
|
|
public string $prompt = '';
|
|
|
|
public function embed(string $text): array
|
|
{
|
|
return [];
|
|
}
|
|
|
|
public function generate(string $prompt, array $options = []): string
|
|
{
|
|
$this->prompt = $prompt;
|
|
|
|
return json_encode([
|
|
'article_id' => 42,
|
|
'confidence' => 0.91,
|
|
'explanation' => 'Past bij domeininformatie.',
|
|
'tool_call' => [
|
|
'action' => 'domain_inf',
|
|
'parameters' => ['sld' => 'Example', 'tld' => 'NL'],
|
|
'reason' => 'Domeinstatus is nodig.',
|
|
],
|
|
]);
|
|
}
|
|
};
|
|
|
|
$settings = new class extends AppSettingsService
|
|
{
|
|
public function getPrompt(string $key, ?string $default = null): ?string
|
|
{
|
|
return 'Select best article.';
|
|
}
|
|
|
|
public function get(string $key, ?string $default = null): ?string
|
|
{
|
|
return $default;
|
|
}
|
|
};
|
|
|
|
$service = new AIClassifierService(
|
|
$client,
|
|
$settings,
|
|
new ClassifierPromptBuilder,
|
|
new LlmJsonDecoder,
|
|
new ToolCallRequestValidator
|
|
);
|
|
$result = $service->rank('Hoe staat example.nl ingesteld?', [
|
|
new ArticleCandidateDTO(
|
|
articleId: 42,
|
|
title: 'Domein controleren',
|
|
content: 'Controleer domeininformatie.',
|
|
distance: 0.12,
|
|
note: 'Gebruik domain_inf wanneer een volledig domein genoemd wordt.',
|
|
allowedActions: ['domain_inf'],
|
|
),
|
|
]);
|
|
|
|
$this->assertSame(42, $result->articleId);
|
|
$this->assertSame([
|
|
'action' => 'domain_inf',
|
|
'parameters' => ['sld' => 'example', 'tld' => 'nl'],
|
|
'reason' => 'Domeinstatus is nodig.',
|
|
], $result->toolCall);
|
|
$this->assertStringContainsString('Allowed actions: ["domain_inf"]', $client->prompt);
|
|
$this->assertStringContainsString('Internal note for support assistant', $client->prompt);
|
|
}
|
|
}
|