Make WordPress Core

Changeset 62101


Ignore:
Timestamp:
03/24/2026 12:39:00 PM (4 days ago)
Author:
flixos90
Message:

AI: Fix prompt lifecycle hooks not firing for wp_ai_client_prompt() flow.

This broke while porting over the relevant logic from the wp-ai-client package to Core.

With this changeset, the lifecycle hooks wp_ai_client_before_generate_result and wp_ai_client_after_generate_result fire as expected.

Props shadyvb, gziolo.
Fixes #64935.

Location:
trunk
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/wp-includes/ai-client/class-wp-ai-client-prompt-builder.php

    r62067 r62101  
    88 */
    99
     10use WordPress\AiClient\AiClient;
    1011use WordPress\AiClient\Builders\PromptBuilder;
    1112use WordPress\AiClient\Common\Exception\InvalidArgumentException;
     
    184185    public function __construct( ProviderRegistry $registry, $prompt = null ) {
    185186        try {
    186             $this->builder = new PromptBuilder( $registry, $prompt );
     187            $this->builder = new PromptBuilder( $registry, $prompt, AiClient::getEventDispatcher() );
    187188        } catch ( Exception $e ) {
    188             $this->builder = new PromptBuilder( $registry );
     189            $this->builder = new PromptBuilder( $registry, null, AiClient::getEventDispatcher() );
    189190            $this->error   = $this->exception_to_wp_error( $e );
    190191        }
  • trunk/tests/phpunit/tests/ai-client/wpAiClientPromptBuilder.php

    r62067 r62101  
    16011601
    16021602    /**
     1603     * Tests that the wrapped PromptBuilder receives the same event dispatcher as AiClient.
     1604     *
     1605     * @ticket 64935
     1606     */
     1607    public function test_prompt_builder_passes_ai_client_event_dispatcher_to_wrapped_builder() {
     1608        $builder = new WP_AI_Client_Prompt_Builder( AiClient::defaultRegistry(), 'Test prompt' );
     1609
     1610        $wrapped_dispatcher = $this->get_wrapped_prompt_builder_property_value( $builder, 'eventDispatcher' );
     1611
     1612        $this->assertSame( AiClient::getEventDispatcher(), $wrapped_dispatcher );
     1613        $this->assertInstanceOf( WP_AI_Client_Event_Dispatcher::class, $wrapped_dispatcher );
     1614    }
     1615
     1616    /**
     1617     * Tests that generate_text_result fires wp_ai_client_before_generate_result and wp_ai_client_after_generate_result in order.
     1618     *
     1619     * @ticket 64935
     1620     */
     1621    public function test_generate_text_result_fires_lifecycle_action_hooks() {
     1622        $result = new GenerativeAiResult(
     1623            'test-result',
     1624            array( new Candidate( new ModelMessage( array( new MessagePart( 'Generated text' ) ) ), FinishReasonEnum::stop() ) ),
     1625            new TokenUsage( 100, 50, 150 ),
     1626            $this->create_test_provider_metadata(),
     1627            $this->create_test_text_model_metadata()
     1628        );
     1629
     1630        $metadata = $this->createMock( ModelMetadata::class );
     1631        $metadata->method( 'getId' )->willReturn( 'test-model' );
     1632
     1633        $model = $this->create_mock_text_generation_model( $result, $metadata );
     1634
     1635        $hook_order = array();
     1636
     1637        add_action(
     1638            'wp_ai_client_before_generate_result',
     1639            static function () use ( &$hook_order ) {
     1640                $hook_order[] = 'before';
     1641            }
     1642        );
     1643        add_action(
     1644            'wp_ai_client_after_generate_result',
     1645            static function () use ( &$hook_order ) {
     1646                $hook_order[] = 'after';
     1647            }
     1648        );
     1649
     1650        $builder = new WP_AI_Client_Prompt_Builder( $this->registry, 'Test prompt' );
     1651        $builder->using_model( $model );
     1652
     1653        $actual_result = $builder->generate_text_result();
     1654
     1655        $this->assertSame( $result, $actual_result );
     1656        $this->assertSame( array( 'before', 'after' ), $hook_order );
     1657    }
     1658
     1659    /**
    16031660     * Tests generateImageResult method.
    16041661     *
Note: See TracChangeset for help on using the changeset viewer.