diff --git a/groq-ai-product-text.php b/groq-ai-product-text.php index e139ced..623d277 100644 --- a/groq-ai-product-text.php +++ b/groq-ai-product-text.php @@ -2,7 +2,7 @@ /** * Plugin Name: SitiAI Product Teksten * Description: Genereer productteksten met diverse AI-aanbieders rechtstreeks vanuit WooCommerce. - * Version: 1.4.0 + * Version: 1.4.1 * Author: SitiAI * Text Domain: siti-ai-product-content-generator * Domain Path: /languages diff --git a/includes/Admin/class-groq-ai-settings-page.php b/includes/Admin/class-groq-ai-settings-page.php index f0fc26b..b675f3b 100644 --- a/includes/Admin/class-groq-ai-settings-page.php +++ b/includes/Admin/class-groq-ai-settings-page.php @@ -542,6 +542,14 @@ class Groq_AI_Product_Text_Settings_Page { 'groq_ai_product_text_prompts' ); + add_settings_field( + 'groq_ai_max_output_tokens', + __( 'Max output tokens', GROQ_AI_PRODUCT_TEXT_DOMAIN ), + [ $this, 'render_max_output_tokens_field' ], + 'groq-ai-product-text-prompts', + 'groq_ai_product_text_prompts' + ); + add_settings_field( 'groq_ai_context_fields', __( 'Standaard productcontext', GROQ_AI_PRODUCT_TEXT_DOMAIN ), @@ -1455,6 +1463,25 @@ class Groq_AI_Product_Text_Settings_Page { plugin->get_settings(); + $value = isset( $settings['max_output_tokens'] ) ? absint( $settings['max_output_tokens'] ) : 2048; + $value = max( 128, min( 8192, $value ) ); + ?> + +

+ +

+ plugin->get_settings(); $values = isset( $settings['context_fields'] ) ? $settings['context_fields'] : $this->plugin->get_default_context_fields(); diff --git a/includes/Providers/class-groq-ai-abstract-openai-provider.php b/includes/Providers/class-groq-ai-abstract-openai-provider.php index e8ca7fd..c3e4212 100644 --- a/includes/Providers/class-groq-ai-abstract-openai-provider.php +++ b/includes/Providers/class-groq-ai-abstract-openai-provider.php @@ -80,11 +80,20 @@ abstract class Groq_AI_Abstract_OpenAI_Provider implements Groq_AI_Provider_Inte ], ]; + $max_tokens = isset( $args['max_tokens'] ) ? absint( $args['max_tokens'] ) : 0; + if ( $max_tokens <= 0 ) { + $max_tokens = isset( $settings['max_output_tokens'] ) ? absint( $settings['max_output_tokens'] ) : 0; + } + if ( $max_tokens <= 0 ) { + $max_tokens = 2048; + } + $max_tokens = max( 128, min( 8192, $max_tokens ) ); + $request_body = [ 'model' => $model, 'messages' => $messages, 'temperature' => isset( $args['temperature'] ) ? (float) $args['temperature'] : 0.7, - 'max_tokens' => 1024, + 'max_tokens' => $max_tokens, ]; if ( ! empty( $args['response_format'] ) ) { @@ -122,6 +131,10 @@ abstract class Groq_AI_Abstract_OpenAI_Provider implements Groq_AI_Provider_Inte $content = trim( $body['choices'][0]['message']['content'] ); $usage = isset( $body['usage'] ) && is_array( $body['usage'] ) ? $body['usage'] : []; + $finish_reason = isset( $body['choices'][0]['finish_reason'] ) ? sanitize_text_field( (string) $body['choices'][0]['finish_reason'] ) : ''; + if ( '' !== $finish_reason ) { + $usage['finish_reason'] = $finish_reason; + } return [ 'content' => $content, diff --git a/includes/Providers/class-groq-ai-provider-google.php b/includes/Providers/class-groq-ai-provider-google.php index 1f7ed21..ff6465f 100644 --- a/includes/Providers/class-groq-ai-provider-google.php +++ b/includes/Providers/class-groq-ai-provider-google.php @@ -144,6 +144,15 @@ class Groq_AI_Provider_Google implements Groq_AI_Provider_Interface { ]; } + $max_tokens = isset( $args['max_tokens'] ) ? absint( $args['max_tokens'] ) : 0; + if ( $max_tokens <= 0 ) { + $max_tokens = isset( $settings['max_output_tokens'] ) ? absint( $settings['max_output_tokens'] ) : 0; + } + if ( $max_tokens <= 0 ) { + $max_tokens = 2048; + } + $max_tokens = max( 128, min( 8192, $max_tokens ) ); + $payload = [ 'contents' => [ [ @@ -153,7 +162,7 @@ class Groq_AI_Provider_Google implements Groq_AI_Provider_Interface { ], 'generationConfig' => [ 'temperature' => isset( $args['temperature'] ) ? (float) $args['temperature'] : 0.7, - 'maxOutputTokens' => 1024, + 'maxOutputTokens' => $max_tokens, ], ]; @@ -196,6 +205,10 @@ class Groq_AI_Provider_Google implements Groq_AI_Provider_Interface { $content = trim( implode( "\n\n", array_filter( $texts ) ) ); $usage = isset( $body['usageMetadata'] ) && is_array( $body['usageMetadata'] ) ? $body['usageMetadata'] : []; + $finish_reason = isset( $body['candidates'][0]['finishReason'] ) ? sanitize_text_field( (string) $body['candidates'][0]['finishReason'] ) : ''; + if ( '' !== $finish_reason ) { + $usage['finish_reason'] = $finish_reason; + } return [ 'content' => $content, diff --git a/includes/Services/Settings/class-groq-ai-settings-manager.php b/includes/Services/Settings/class-groq-ai-settings-manager.php index b02a2b7..0675a7b 100644 --- a/includes/Services/Settings/class-groq-ai-settings-manager.php +++ b/includes/Services/Settings/class-groq-ai-settings-manager.php @@ -32,6 +32,7 @@ class Groq_AI_Settings_Manager { 'model' => '', 'store_context' => '', 'default_prompt' => '', + 'max_output_tokens' => 2048, 'groq_api_key' => '', 'openai_api_key' => '', 'google_api_key' => '', @@ -87,6 +88,7 @@ class Groq_AI_Settings_Manager { 'model' => '', 'store_context' => '', 'default_prompt' => '', + 'max_output_tokens' => 2048, 'groq_api_key' => '', 'openai_api_key' => '', 'google_api_key' => '', @@ -129,6 +131,10 @@ class Groq_AI_Settings_Manager { $image_limit = isset( $input['image_context_limit'] ) ? $this->sanitize_image_context_limit_value( $input['image_context_limit'] ) : $defaults['image_context_limit']; + $max_output_tokens = isset( $input['max_output_tokens'] ) ? absint( $input['max_output_tokens'] ) : absint( $defaults['max_output_tokens'] ); + // Keep within sane bounds across providers. + $max_output_tokens = max( 128, min( 8192, $max_output_tokens ) ); + $context_fields = $this->normalize_context_fields( $context_posted ? $raw_input['context_fields'] : $defaults['context_fields'] ); if ( 'none' === $image_mode ) { @@ -142,6 +148,7 @@ class Groq_AI_Settings_Manager { 'model' => $model, 'store_context' => sanitize_textarea_field( $input['store_context'] ), 'default_prompt' => sanitize_textarea_field( $input['default_prompt'] ), + 'max_output_tokens' => $max_output_tokens, 'groq_api_key' => sanitize_text_field( $input['groq_api_key'] ), 'openai_api_key' => sanitize_text_field( $input['openai_api_key'] ), 'google_api_key' => sanitize_text_field( $input['google_api_key'] ),