Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
24 changes: 20 additions & 4 deletions inc/Abilities/SettingsAbilities.php
Original file line number Diff line number Diff line change
Expand Up @@ -110,10 +110,14 @@ private function registerUpdateSettings(): void {
'description' => 'Per-mode provider/model overrides keyed by mode id',
),
'max_turns' => array( 'type' => 'integer' ),
'wp_ai_client_connect_timeout' => array(
'wp_ai_client_connect_timeout' => array(
'type' => 'number',
'description' => 'Connection timeout in seconds for wp-ai-client provider requests.',
),
'wp_ai_client_request_timeout' => array(
'type' => 'number',
'description' => 'Full request timeout in seconds for wp-ai-client provider requests.',
),
'disabled_tools' => array( 'type' => 'object' ),
'ai_provider_keys' => array( 'type' => 'object' ),
'queue_tuning' => array(
Expand Down Expand Up @@ -357,7 +361,8 @@ public function executeGetSettings( array $input ): array {
'default_model' => $settings['default_model'] ?? '',
'mode_models' => $settings['mode_models'] ?? array(),
'max_turns' => $settings['max_turns'] ?? $defaults['max_turns'],
'wp_ai_client_connect_timeout' => $settings['wp_ai_client_connect_timeout'] ?? $defaults['wp_ai_client_connect_timeout'],
'wp_ai_client_connect_timeout' => $settings['wp_ai_client_connect_timeout'] ?? $defaults['wp_ai_client_connect_timeout'],
'wp_ai_client_request_timeout' => $settings['wp_ai_client_request_timeout'] ?? $defaults['wp_ai_client_request_timeout'],
'disabled_tools' => $settings['disabled_tools'] ?? array(),
'ai_provider_keys' => $masked_keys,
'queue_tuning' => wp_parse_args( $settings['queue_tuning'] ?? array(), $defaults['queue_tuning'] ),
Expand Down Expand Up @@ -463,8 +468,19 @@ public function executeUpdateSettings( array $input ): array {
}

if ( isset( $input['wp_ai_client_connect_timeout'] ) && is_numeric( $input['wp_ai_client_connect_timeout'] ) ) {
$all_settings['wp_ai_client_connect_timeout'] = max( 0.0, min( 300.0, (float) $input['wp_ai_client_connect_timeout'] ) );
$handled_keys[] = 'wp_ai_client_connect_timeout';
$all_settings['wp_ai_client_connect_timeout'] = max(
0.0,
min( PluginSettings::MAX_WP_AI_CLIENT_CONNECT_TIMEOUT, (float) $input['wp_ai_client_connect_timeout'] )
);
$handled_keys[] = 'wp_ai_client_connect_timeout';
}

if ( isset( $input['wp_ai_client_request_timeout'] ) && is_numeric( $input['wp_ai_client_request_timeout'] ) ) {
$all_settings['wp_ai_client_request_timeout'] = max(
0.0,
min( PluginSettings::MAX_WP_AI_CLIENT_REQUEST_TIMEOUT, (float) $input['wp_ai_client_request_timeout'] )
);
$handled_keys[] = 'wp_ai_client_request_timeout';
}

if ( isset( $input['disabled_tools'] ) ) {
Expand Down
1 change: 1 addition & 0 deletions inc/Api/Settings.php
Original file line number Diff line number Diff line change
Expand Up @@ -323,6 +323,7 @@ public static function handle_get_settings( $request ) {
'success' => true,
'data' => array(
'settings' => $result['settings'],
'defaults' => $result['defaults'] ?? array(),
'global_tools' => $result['global_tools'],
),
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@
import { useEffect } from '@wordpress/element';

/**
* Internal dependencies
* External dependencies
*/
import { useSettings, useUpdateSettings } from '@shared/queries/settings';
import { useFormState } from '@shared/hooks/useFormState';
Expand All @@ -24,6 +24,8 @@ const EMPTY_FORM = {
file_retention_days: 7,
chat_retention_days: 90,
chat_ai_titles_enabled: true,
wp_ai_client_connect_timeout: 15,
wp_ai_client_request_timeout: 300,
flows_per_page: 20,
jobs_per_page: 50,
queue_tuning: {
Expand Down Expand Up @@ -65,6 +67,10 @@ const GeneralTab = () => {
chunk_size: 10,
chunk_delay: 30,
};
const transportDefaults = {
connectTimeout: data?.defaults?.wp_ai_client_connect_timeout ?? 15,
requestTimeout: data?.defaults?.wp_ai_client_request_timeout ?? 300,
};

const form = useFormState( {
initialData: EMPTY_FORM,
Expand All @@ -87,6 +93,10 @@ const GeneralTab = () => {
data.settings.chat_retention_days ?? EMPTY_FORM.chat_retention_days,
chat_ai_titles_enabled:
data.settings.chat_ai_titles_enabled ?? EMPTY_FORM.chat_ai_titles_enabled,
wp_ai_client_connect_timeout:
data.settings.wp_ai_client_connect_timeout ?? transportDefaults.connectTimeout,
wp_ai_client_request_timeout:
data.settings.wp_ai_client_request_timeout ?? transportDefaults.requestTimeout,
flows_per_page:
data.settings.flows_per_page ?? EMPTY_FORM.flows_per_page,
jobs_per_page:
Expand Down Expand Up @@ -173,6 +183,70 @@ const GeneralTab = () => {
</td>
</tr>

<tr>
<th scope="row">AI connect timeout</th>
<td>
<fieldset>
<input
type="number"
id="wp_ai_client_connect_timeout"
value={ form.data.wp_ai_client_connect_timeout }
onChange={ ( e ) =>
updateField(
'wp_ai_client_connect_timeout',
clamp(
e.target.value,
0,
300,
transportDefaults.connectTimeout
)
)
}
min="0"
max="300"
className="small-text"
/>
<p className="description">
Seconds allowed to establish the provider
connection. Default:{ ' ' }
{ transportDefaults.connectTimeout }.
</p>
</fieldset>
</td>
</tr>

<tr>
<th scope="row">AI request timeout</th>
<td>
<fieldset>
<input
type="number"
id="wp_ai_client_request_timeout"
value={ form.data.wp_ai_client_request_timeout }
onChange={ ( e ) =>
updateField(
'wp_ai_client_request_timeout',
clamp(
e.target.value,
0,
900,
transportDefaults.requestTimeout
)
)
}
min="0"
max="900"
className="small-text"
/>
<p className="description">
Seconds allowed for the full non-streaming AI
response. Default:{ ' ' }
{ transportDefaults.requestTimeout }.
</p>
</fieldset>
</td>
</tr>

<tr>
<th scope="row">File retention (days)</th>
<td>
Expand Down
10 changes: 7 additions & 3 deletions inc/Core/PluginSettings.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,11 @@

class PluginSettings {

public const DEFAULT_MAX_TURNS = 25;
public const DEFAULT_WP_AI_CLIENT_CONNECT_TIMEOUT = 30.0;
public const DEFAULT_MAX_TURNS = 25;
public const DEFAULT_WP_AI_CLIENT_CONNECT_TIMEOUT = 15.0;
public const DEFAULT_WP_AI_CLIENT_REQUEST_TIMEOUT = 300.0;
public const MAX_WP_AI_CLIENT_CONNECT_TIMEOUT = 300.0;
public const MAX_WP_AI_CLIENT_REQUEST_TIMEOUT = 900.0;

private static ?array $cache = null;
private static array $agent_model_cache = array();
Expand Down Expand Up @@ -55,12 +58,13 @@ public static function getDefaultQueueTuning(): array {
/**
* Get centralized plugin defaults used by backend and admin UI.
*
* @return array{max_turns:int,wp_ai_client_connect_timeout:float,queue_tuning:array{concurrent_batches:int,batch_size:int,time_limit:int,chunk_size:int,chunk_delay:int}}
* @return array{max_turns:int,wp_ai_client_connect_timeout:float,wp_ai_client_request_timeout:float,queue_tuning:array{concurrent_batches:int,batch_size:int,time_limit:int,chunk_size:int,chunk_delay:int}}
*/
public static function getDefaults(): array {
return array(
'max_turns' => self::DEFAULT_MAX_TURNS,
'wp_ai_client_connect_timeout' => self::DEFAULT_WP_AI_CLIENT_CONNECT_TIMEOUT,
'wp_ai_client_request_timeout' => self::DEFAULT_WP_AI_CLIENT_REQUEST_TIMEOUT,
'queue_tuning' => self::getDefaultQueueTuning(),
);
}
Expand Down
Loading
Loading