| @@ -41,8 +41,9 @@ | ||
| 41 | 41 | // Encrypt API Keys on update |
| 42 | 42 | add_action('pre_update_option_' . Constants::AATXT_OPTION_FIELD_API_KEY_AZURE_COMPUTER_VISION, [self::$instance, 'encryptDataOnUpdate'], 10, 3); |
| 43 | 43 | add_action('pre_update_option_' . Constants::AATXT_OPTION_FIELD_API_KEY_AZURE_TRANSLATE_INSTANCE, [self::$instance, 'encryptDataOnUpdate'], 10, 3); |
| 44 | 44 | add_action('pre_update_option_' . Constants::AATXT_OPTION_FIELD_API_KEY_OPENAI, [self::$instance, 'encryptDataOnUpdate'], 10, 3); |
| 45 | + add_action('pre_update_option_' . Constants::AATXT_OPTION_FIELD_API_KEY_ANTHROPIC, [self::$instance, 'encryptDataOnUpdate'], 10, 3); | |
| 45 | 46 | |
| 46 | 47 | add_action('admin_notices', [self::$instance, 'encryptionErrorNotice']); |
| 47 | 48 | } |
| 48 | 49 | |
| @@ -276,8 +277,9 @@ | ||
| 276 | 277 | <select name="<?php echo esc_attr(Constants::AATXT_OPTION_FIELD_TYPOLOGY); ?>" |
| 277 | 278 | id="<?php echo esc_attr(Constants::AATXT_OPTION_FIELD_TYPOLOGY); ?>"> |
| 278 | 279 | <option value="<?php echo esc_attr(Constants::AATXT_OPTION_TYPOLOGY_DEACTIVATED); ?>"<?php echo esc_attr(self::selected($typology, Constants::AATXT_OPTION_TYPOLOGY_DEACTIVATED)); ?>><?php esc_html_e("Deactivated", 'auto-alt-text'); ?></option> |
| 279 | 280 | <option value="<?php echo esc_attr(Constants::AATXT_OPTION_TYPOLOGY_CHOICE_OPENAI); ?>"<?php echo esc_attr(self::selected($typology, Constants::AATXT_OPTION_TYPOLOGY_CHOICE_OPENAI)); ?>><?php esc_html_e("OpenAI's APIs", 'auto-alt-text'); ?></option> |
| 281 | + <option value="<?php echo esc_attr(Constants::AATXT_OPTION_TYPOLOGY_CHOICE_ANTHROPIC); ?>"<?php echo esc_attr(self::selected($typology, Constants::AATXT_OPTION_TYPOLOGY_CHOICE_ANTHROPIC)); ?>><?php esc_html_e("Antrhopic's APIs", 'auto-alt-text'); ?></option> | |
| 280 | 282 | <option value="<?php echo esc_attr(Constants::AATXT_OPTION_TYPOLOGY_CHOICE_AZURE); ?>"<?php echo esc_attr(self::selected($typology, Constants::AATXT_OPTION_TYPOLOGY_CHOICE_AZURE)); ?>><?php esc_html_e("Azure's APIs", 'auto-alt-text'); ?></option> |
| 281 | 283 | <option value="<?php echo esc_attr(Constants::AATXT_OPTION_TYPOLOGY_CHOICE_ARTICLE_TITLE); ?>"<?php echo esc_attr(self::selected($typology, Constants::AATXT_OPTION_TYPOLOGY_CHOICE_ARTICLE_TITLE)); ?>><?php esc_html_e("Title of the article (not AI)", 'auto-alt-text'); ?></option> |
| 282 | 284 | <option value="<?php echo esc_attr(Constants::AATXT_OPTION_TYPOLOGY_CHOICE_ATTACHMENT_TITLE); ?>"<?php echo esc_attr(self::selected($typology, Constants::AATXT_OPTION_TYPOLOGY_CHOICE_ATTACHMENT_TITLE)); ?>><?php esc_html_e("Title of the attachment (not AI)", 'auto-alt-text'); ?></option> |
| 283 | 285 | </select> |
| @@ -400,9 +402,36 @@ | ||
| 400 | 402 | |
| 401 | 403 | echo '</div>'; |
| 402 | 404 | endif; |
| 403 | 405 | |
| 404 | - echo '<div class="plugin-option type-article-title type-attachment-title type-openai type-azure">'; | |
| 406 | + echo '<div class="plugin-option type-anthropic">'; | |
| 407 | + echo '<label for="' . esc_attr(Constants::AATXT_OPTION_FIELD_API_KEY_ANTHROPIC) . '">' . esc_html__('Antrhopic API Key', 'auto-alt-text') . '</label>'; | |
| 408 | + echo '<p class="description">' . esc_html__("Enter your API Key", 'auto-alt-text') . '</p>'; | |
| 409 | + $apiKey = get_option(Constants::AATXT_OPTION_FIELD_API_KEY_ANTHROPIC); | |
| 410 | + echo '<input type="password" name="' . esc_attr(Constants::AATXT_OPTION_FIELD_API_KEY_ANTHROPIC) . '" value="' . esc_attr((Encryption::make())->decrypt($apiKey)) . '" />'; | |
| 411 | + echo '</div>'; | |
| 412 | + | |
| 413 | + $anthropicModel = self::anthropicModel(); | |
| 414 | + | |
| 415 | + echo '<div class="plugin-option type-anthropic">'; | |
| 416 | + echo '<label for="' . esc_attr(Constants::AATXT_OPTION_FIELD_MODEL_ANTHROPIC) . '">' . esc_html__('Model', 'auto-alt-text') . '</label>'; | |
| 417 | + | |
| 418 | + echo '<select name="' . esc_attr(Constants::AATXT_OPTION_FIELD_MODEL_ANTHROPIC) . '" id="' . esc_attr(Constants::AATXT_OPTION_FIELD_MODEL_ANTHROPIC) . '">'; | |
| 419 | + foreach(Constants::AATXT_OPTION_FIELD_MODEL_ANTHROPIC_OPTIONS as $key => $value) { | |
| 420 | + echo '<option value="' . esc_attr($key) . '" ' . esc_attr(self::selected($anthropicModel, $key)) . '>' . esc_html($value) . '</option>'; | |
| 421 | + } | |
| 422 | + echo '</select>'; | |
| 423 | + echo '</div>'; | |
| 424 | + | |
| 425 | + echo '<div class="plugin-option type-anthropic">'; | |
| 426 | + echo '<label for="' . esc_attr(Constants::AATXT_OPTION_FIELD_PROMPT_ANTHROPIC) . '">' . esc_html__('Prompt', 'auto-alt-text') . '</label>'; | |
| 427 | + echo '<p class="description">' . esc_html__("Enter a specific and detailed prompt according to your needs.", 'auto-alt-text') . '</p>'; | |
| 428 | + $defaultPrompt = sprintf(esc_html__("Act like an SEO expert and write an alt text of up to 125 characters for this image. Return only the complete alt text.", 'auto-alt-text'), Constants::AATXT_IMAGE_URL_TAG); | |
| 429 | + $prompt = get_option(Constants::AATXT_OPTION_FIELD_PROMPT_ANTHROPIC) ?: $defaultPrompt; | |
| 430 | + echo '<textarea name="' . esc_attr(Constants::AATXT_OPTION_FIELD_PROMPT_ANTHROPIC) . '" rows="5" cols="50">' . esc_textarea($prompt) . '</textarea>'; | |
| 431 | + echo '</div>'; | |
| 432 | + | |
| 433 | + echo '<div class="plugin-option type-article-title type-attachment-title type-openai type-azure type-anthropic">'; | |
| 405 | 434 | echo '<label for="' . esc_attr(Constants::AATXT_OPTION_FIELD_PRESERVE_EXISTING_ALT_TEXT) . '">' . esc_html__('Keep existing alt text', 'auto-alt-text') . '</label>'; |
| 406 | 435 | echo '<p class="description">' . esc_html__("If checked, the existing alt text of images will not be overwritten.", 'auto-alt-text') . '</p>'; |
| 407 | 436 | $preserveAltText = get_option(Constants::AATXT_OPTION_FIELD_PRESERVE_EXISTING_ALT_TEXT); |
| 408 | 437 | echo '<input type="checkbox" name="' . esc_attr(Constants::AATXT_OPTION_FIELD_PRESERVE_EXISTING_ALT_TEXT) . '" value="1" class="notRequired" ' . checked(1, $preserveAltText, false) . ' />'; |
| @@ -446,8 +475,11 @@ | ||
| 446 | 475 | register_setting('auto_alt_text_options', Constants::AATXT_OPTION_FIELD_ENDPOINT_AZURE_TRANSLATE_INSTANCE, [self::class, 'sanitizeUrl']); |
| 447 | 476 | register_setting('auto_alt_text_options', Constants::AATXT_OPTION_FIELD_REGION_AZURE_TRANSLATE_INSTANCE, [self::class, 'sanitizeText']); |
| 448 | 477 | register_setting('auto_alt_text_options', Constants::AATXT_OPTION_FIELD_LANGUAGE_AZURE_TRANSLATE_INSTANCE, [self::class, 'sanitizeText']); |
| 449 | 478 | register_setting('auto_alt_text_options', Constants::AATXT_OPTION_FIELD_PRESERVE_EXISTING_ALT_TEXT); |
| 479 | + register_setting('auto_alt_text_options', Constants::AATXT_OPTION_FIELD_API_KEY_ANTHROPIC); | |
| 480 | + register_setting('auto_alt_text_options', Constants::AATXT_OPTION_FIELD_PROMPT_ANTHROPIC, [self::class, 'sanitizeTextArea']); | |
| 481 | + register_setting('auto_alt_text_options', Constants::AATXT_OPTION_FIELD_MODEL_ANTHROPIC, [self::class, 'sanitizeText']); | |
| 450 | 482 | } |
| 451 | 483 | |
| 452 | 484 | /** |
| 453 | 485 | * @return string |
| @@ -461,12 +493,17 @@ | ||
| 461 | 493 | { |
| 462 | 494 | return get_option(Constants::AATXT_OPTION_FIELD_MODEL_OPENAI) ?: Constants::AATXT_GPT4O; |
| 463 | 495 | } |
| 464 | 496 | |
| 497 | + public static function anthropicModel(): string | |
| 498 | + { | |
| 499 | + return get_option(Constants::AATXT_OPTION_FIELD_MODEL_ANTHROPIC) ?: Constants::AATXT_CLAUDE_HAIKU_3_5; | |
| 500 | + } | |
| 501 | + | |
| 465 | 502 | /** |
| 466 | 503 | * @return string |
| 467 | 504 | */ |
| 468 | - public static function prompt(): string | |
| 505 | + public static function openAiPrompt(): string | |
| 469 | 506 | { |
| 470 | 507 | return get_option(Constants::AATXT_OPTION_FIELD_PROMPT_OPENAI); |
| 471 | 508 | } |
| 472 | 509 | |
| @@ -472,11 +509,28 @@ | ||
| 472 | 509 | |
| 473 | 510 | /** |
| 474 | 511 | * @return string |
| 475 | 512 | */ |
| 513 | + public static function anthropicPrompt(): string | |
| 514 | + { | |
| 515 | + return get_option(Constants::AATXT_OPTION_FIELD_PROMPT_ANTHROPIC); | |
| 516 | + } | |
| 517 | + | |
| 518 | + /** | |
| 519 | + * @return string | |
| 520 | + */ | |
| 476 | 521 | public static function apiKeyOpenAI(): string |
| 477 | 522 | { |
| 478 | 523 | $apiKey = get_option(Constants::AATXT_OPTION_FIELD_API_KEY_OPENAI); |
| 524 | + return (Encryption::make())->decrypt($apiKey); | |
| 525 | + } | |
| 526 | + | |
| 527 | + /** | |
| 528 | + * @return string | |
| 529 | + */ | |
| 530 | + public static function apiKeyAnthropic(): string | |
| 531 | + { | |
| 532 | + $apiKey = get_option(Constants::AATXT_OPTION_FIELD_API_KEY_ANTHROPIC); | |
| 479 | 533 | return (Encryption::make())->decrypt($apiKey); |
| 480 | 534 | } |
| 481 | 535 | |
| 482 | 536 | /** |