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); } }