| @@ -83,12 +83,21 @@ | ||
| 83 | 83 | 'gemini_api_key', |
| 84 | 84 | 'gemini_model', |
| 85 | 85 | 'openrouter_api_key', |
| 86 | 86 | 'openrouter_model', |
| 87 | + 'openai_compatible_base_url', | |
| 88 | + 'openai_compatible_api_key', | |
| 89 | + 'openai_compatible_model', | |
| 90 | + 'openai_compatible_timeout', | |
| 91 | + 'openai_compatible_supports_images', | |
| 92 | + 'openai_compatible_json_mode', | |
| 93 | + 'openai_compatible_price_per_million', | |
| 87 | 94 | 'max_tokens', |
| 88 | 95 | 'temperature', |
| 89 | 96 | 'cache_duration', |
| 90 | 97 | 'max_requests_per_minute', |
| 98 | + 'ai_daily_request_limit', | |
| 99 | + 'ai_paused', | |
| 91 | 100 | 'enable_logging', |
| 92 | 101 | 'debug_mode', |
| 93 | 102 | 'api_timeout', |
| 94 | 103 | 'retry_attempts', |
| @@ -805,8 +814,10 @@ | ||
| 805 | 814 | switch ($key) { |
| 806 | 815 | case 'openai_api_key': |
| 807 | 816 | case 'claude_api_key': |
| 808 | 817 | case 'openrouter_api_key': |
| 818 | + case 'openai_compatible_api_key': | |
| 819 | + case 'openai_compatible_model': | |
| 809 | 820 | if (!empty($value) && !is_string($value)) { |
| 810 | 821 | $validation['valid'] = false; |
| 811 | 822 | $validation['errors'][] = "{$key} must be a string"; |
| 812 | 823 | } |
| @@ -811,15 +822,29 @@ | ||
| 811 | 822 | $validation['errors'][] = "{$key} must be a string"; |
| 812 | 823 | } |
| 813 | 824 | break; |
| 814 | 825 | |
| 826 | + case 'openai_compatible_base_url': | |
| 827 | + // An unreachable or dangerous URL is refused with a reason | |
| 828 | + // rather than quietly stored (see Endpoint_URL_Validator). | |
| 829 | + if (!empty($value)) { | |
| 830 | + $validated = \ThinkRank\AI\Endpoint_URL_Validator::validate((string) $value); | |
| 831 | + if (is_wp_error($validated)) { | |
| 832 | + $validation['valid'] = false; | |
| 833 | + $validation['errors'][] = $validated->get_error_message(); | |
| 834 | + } | |
| 835 | + } | |
| 836 | + break; | |
| 837 | + | |
| 815 | 838 | case 'max_tokens': |
| 816 | 839 | case 'cache_duration': |
| 817 | 840 | case 'max_requests_per_minute': |
| 841 | + case 'ai_daily_request_limit': | |
| 818 | 842 | case 'seo_score_threshold': |
| 819 | 843 | case 'api_timeout': |
| 820 | 844 | case 'retry_attempts': |
| 821 | 845 | case 'data_retention_days': |
| 846 | + case 'openai_compatible_timeout': | |
| 822 | 847 | if (!is_numeric($value) || $value < 0) { |
| 823 | 848 | $validation['valid'] = false; |
| 824 | 849 | $validation['errors'][] = "{$key} must be a positive number"; |
| 825 | 850 | } |