Skip to content

Commit ab38563

Browse files
committed
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. git-svn-id: https://develop.svn.wordpress.org/trunk@62101 602fd350-edb4-49c9-b593-d223f7449a82
1 parent a698ea6 commit ab38563

File tree

2 files changed

+60
-2
lines changed

2 files changed

+60
-2
lines changed

src/wp-includes/ai-client/class-wp-ai-client-prompt-builder.php

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
* @since 7.0.0
88
*/
99

10+
use WordPress\AiClient\AiClient;
1011
use WordPress\AiClient\Builders\PromptBuilder;
1112
use WordPress\AiClient\Common\Exception\InvalidArgumentException;
1213
use WordPress\AiClient\Common\Exception\TokenLimitReachedException;
@@ -183,9 +184,9 @@ class WP_AI_Client_Prompt_Builder {
183184
*/
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
}
191192

tests/phpunit/tests/ai-client/wpAiClientPromptBuilder.php

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1599,6 +1599,63 @@ public function test_generate_text_result() {
15991599
$this->assertTrue( $modalities[0]->isText() );
16001600
}
16011601

1602+
/**
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+
16021659
/**
16031660
* Tests generateImageResult method.
16041661
*

0 commit comments

Comments
 (0)