|  | 
| 11 | 11 | use WordPress\AiClient\Messages\DTO\Message; | 
| 12 | 12 | use WordPress\AiClient\Messages\DTO\MessagePart; | 
| 13 | 13 | use WordPress\AiClient\Messages\DTO\ModelMessage; | 
|  | 14 | +use WordPress\AiClient\Messages\Enums\MessagePartChannelEnum; | 
| 14 | 15 | use WordPress\AiClient\Messages\Enums\MessagePartTypeEnum; | 
| 15 | 16 | use WordPress\AiClient\Messages\Enums\MessageRoleEnum; | 
| 16 | 17 | use WordPress\AiClient\Providers\DTO\ProviderMetadata; | 
| @@ -189,6 +190,36 @@ public function testToText(): void | 
| 189 | 190 |         $this->assertEquals($text, $result->toText()); | 
| 190 | 191 |     } | 
| 191 | 192 | 
 | 
|  | 193 | +    /** | 
|  | 194 | +     * Tests toText method with both reasoning_content and content channels. | 
|  | 195 | +     * | 
|  | 196 | +     * @return void | 
|  | 197 | +     */ | 
|  | 198 | +    public function testToTextWithReasoningContent(): void | 
|  | 199 | +    { | 
|  | 200 | +        $reasoningContent = 'Let me think about this step by step...'; | 
|  | 201 | +        $actualContent = 'This is the final answer.'; | 
|  | 202 | + | 
|  | 203 | +        $message = new ModelMessage([ | 
|  | 204 | +            new MessagePart($reasoningContent, MessagePartChannelEnum::thought()), | 
|  | 205 | +            new MessagePart($actualContent, MessagePartChannelEnum::content()) | 
|  | 206 | +        ]); | 
|  | 207 | +        $candidate = new Candidate($message, FinishReasonEnum::stop()); | 
|  | 208 | +        $tokenUsage = new TokenUsage(10, 8, 18); | 
|  | 209 | + | 
|  | 210 | +        $result = new GenerativeAiResult( | 
|  | 211 | +            'result_with_reasoning', | 
|  | 212 | +            [$candidate], | 
|  | 213 | +            $tokenUsage, | 
|  | 214 | +            $this->createTestProviderMetadata(), | 
|  | 215 | +            $this->createTestModelMetadata() | 
|  | 216 | +        ); | 
|  | 217 | + | 
|  | 218 | +        // toText() should only return content from the 'content' channel, not 'thought' channel | 
|  | 219 | +        $this->assertEquals($actualContent, $result->toText()); | 
|  | 220 | +        $this->assertNotEquals($reasoningContent, $result->toText()); | 
|  | 221 | +    } | 
|  | 222 | + | 
| 192 | 223 |     /** | 
| 193 | 224 |      * Tests toText throws exception when no text content. | 
| 194 | 225 |      * | 
| @@ -430,6 +461,50 @@ public function testToTextsWithMultipleCandidates(): void | 
| 430 | 461 |         $this->assertEquals($texts, $result->toTexts()); | 
| 431 | 462 |     } | 
| 432 | 463 | 
 | 
|  | 464 | +    /** | 
|  | 465 | +     * Tests toTexts method with both reasoning_content and content channels. | 
|  | 466 | +     * | 
|  | 467 | +     * @return void | 
|  | 468 | +     */ | 
|  | 469 | +    public function testToTextsWithReasoningContent(): void | 
|  | 470 | +    { | 
|  | 471 | +        $reasoningContent1 = 'Let me think about the first question...'; | 
|  | 472 | +        $actualContent1 = 'This is the first answer.'; | 
|  | 473 | +        $reasoningContent2 = 'Now for the second question...'; | 
|  | 474 | +        $actualContent2 = 'This is the second answer.'; | 
|  | 475 | + | 
|  | 476 | +        $message1 = new ModelMessage([ | 
|  | 477 | +            new MessagePart($reasoningContent1, MessagePartChannelEnum::thought()), | 
|  | 478 | +            new MessagePart($actualContent1, MessagePartChannelEnum::content()) | 
|  | 479 | +        ]); | 
|  | 480 | +        $message2 = new ModelMessage([ | 
|  | 481 | +            new MessagePart($reasoningContent2, MessagePartChannelEnum::thought()), | 
|  | 482 | +            new MessagePart($actualContent2, MessagePartChannelEnum::content()) | 
|  | 483 | +        ]); | 
|  | 484 | + | 
|  | 485 | +        $candidates = [ | 
|  | 486 | +            new Candidate($message1, FinishReasonEnum::stop()), | 
|  | 487 | +            new Candidate($message2, FinishReasonEnum::stop()) | 
|  | 488 | +        ]; | 
|  | 489 | +        $tokenUsage = new TokenUsage(20, 15, 35); | 
|  | 490 | + | 
|  | 491 | +        $result = new GenerativeAiResult( | 
|  | 492 | +            'result_texts_with_reasoning', | 
|  | 493 | +            $candidates, | 
|  | 494 | +            $tokenUsage, | 
|  | 495 | +            $this->createTestProviderMetadata(), | 
|  | 496 | +            $this->createTestModelMetadata() | 
|  | 497 | +        ); | 
|  | 498 | + | 
|  | 499 | +        // toTexts() should only return content from the 'content' channel, not 'thought' channel | 
|  | 500 | +        $expectedTexts = [$actualContent1, $actualContent2]; | 
|  | 501 | +        $this->assertEquals($expectedTexts, $result->toTexts()); | 
|  | 502 | + | 
|  | 503 | +        // Verify reasoning content is not included | 
|  | 504 | +        $this->assertNotContains($reasoningContent1, $result->toTexts()); | 
|  | 505 | +        $this->assertNotContains($reasoningContent2, $result->toTexts()); | 
|  | 506 | +    } | 
|  | 507 | + | 
| 433 | 508 |     /** | 
| 434 | 509 |      * Tests toFiles method with multiple candidates. | 
| 435 | 510 |      * | 
|  | 
0 commit comments