PluginProbe
BotWriter – AI Writer & SEO Content Generator / 3.2.8
BotWriter – AI Writer & SEO Content Generator v3.2.8
3.4.10 3.4.9 3.4.8 3.4.7 3.4.6 3.4.4 3.4.2 3.4.1 3.4.0 3.3.9 3.3.8 3.3.7 3.3.6 3.3.5 3.3.4 3.3.3 3.3.2 3.3.1 3.3.0 3.2.8 trunk 1.3.0 1.3.1 1.3.2 1.3.3 All 51 releases
botwriter / includes / models.php

models.php in BotWriter – AI Writer & SEO Content Generator 3.2.8, at includes/models.php

183 lines 5.4 KB
No matching file
Up and down to move Enter to open Esc to close
Raw Download Zip
1 <?php
2 /**
3 * BotWriter Models Manager
4 *
5 * Handles loading, storing and updating AI provider models from JSON.
6 * Models are stored in WordPress options and can be updated dynamically.
7 *
8 * @package BotWriter
9 */
10
11 if (!defined('ABSPATH')) {
12 exit;
13 }
14
15 /**
16 * Option name for storing models data
17 */
18 define('BOTWRITER_MODELS_OPTION', 'botwriter_models_data');
19
20 /**
21 * Get the models data, initializing from JSON if needed
22 *
23 * @return array The models data structure
24 */
25 function botwriter_get_models_data() {
26 $models_data = get_option(BOTWRITER_MODELS_OPTION);
27
28 // If no data exists, load from default JSON file
29 if (empty($models_data)) {
30 $models_data = botwriter_load_default_models();
31 if ($models_data) {
32 update_option(BOTWRITER_MODELS_OPTION, $models_data);
33 }
34 }
35
36 return $models_data;
37 }
38
39 /**
40 * Load models from the default JSON file
41 *
42 * @return array|false The models data or false on failure
43 */
44 function botwriter_load_default_models() {
45 $json_file = plugin_dir_path(dirname(__FILE__)) . 'models-default.json';
46
47 if (!file_exists($json_file)) {
48 return false;
49 }
50
51 $json_content = file_get_contents($json_file);
52 if ($json_content === false) {
53 return false;
54 }
55
56 $models_data = json_decode($json_content, true);
57 if (json_last_error() !== JSON_ERROR_NONE) {
58 return false;
59 }
60
61 return $models_data;
62 }
63
64 /**
65 * Get models for a specific provider
66 *
67 * @param string $provider The provider name (openai, anthropic, google, etc.)
68 * @return array The models grouped structure for select options
69 */
70 function botwriter_get_provider_models($provider) {
71 $models_data = botwriter_get_models_data();
72
73 if (empty($models_data['providers'][$provider])) {
74 return [];
75 }
76
77 $provider_data = $models_data['providers'][$provider];
78 $result = [];
79
80 // Add grouped models (our curated list)
81 if (!empty($provider_data['groups'])) {
82 foreach ($provider_data['groups'] as $group_name => $models) {
83 $result[$group_name] = $models;
84 }
85 }
86
87 // Add all_models if present (from API discovery)
88 if (!empty($provider_data['all_models'])) {
89 $result['*** ALL MODELS ***'] = [];
90 foreach ($provider_data['all_models'] as $model) {
91 $model_id = $model['id'];
92 $model_name = isset($model['name']) && $model['name'] !== $model['id']
93 ? $model['name'] . ' (' . $model['id'] . ')'
94 : $model['id'];
95 $result['*** ALL MODELS ***'][$model_id] = $model_name;
96 }
97 }
98
99 return $result;
100 }
101
102 /**
103 * Get the default model for a provider
104 *
105 * @param string $provider The provider name
106 * @return string The default model ID
107 */
108 function botwriter_get_provider_default_model($provider) {
109 $models_data = botwriter_get_models_data();
110
111 if (empty($models_data['providers'][$provider]['default'])) {
112 return '';
113 }
114
115 return $models_data['providers'][$provider]['default'];
116 }
117
118 /**
119 * Update the all_models list for a provider
120 *
121 * @param string $provider The provider name
122 * @param array $models Array of models with 'id' and 'name' keys
123 * @return bool True on success
124 */
125 function botwriter_update_provider_all_models($provider, $models) {
126 $models_data = botwriter_get_models_data();
127
128 if (empty($models_data['providers'][$provider])) {
129 return false;
130 }
131
132 // Update the all_models list
133 $models_data['providers'][$provider]['all_models'] = $models;
134 $models_data['updated'] = current_time('Y-m-d');
135
136 return update_option(BOTWRITER_MODELS_OPTION, $models_data);
137 }
138
139 /**
140 * Reset models to default from JSON file
141 *
142 * @return bool True on success
143 */
144 function botwriter_reset_models_to_default() {
145 delete_option(BOTWRITER_MODELS_OPTION);
146 return botwriter_get_models_data() !== false;
147 }
148
149 /**
150 * Render a model select dropdown for a provider
151 *
152 * @param string $provider The provider name
153 * @param string $field_name The form field name
154 * @param string $current_value The currently selected value
155 * @param array $extra_attrs Extra HTML attributes
156 */
157 function botwriter_render_model_select($provider, $field_name, $current_value, $extra_attrs = []) {
158 $models = botwriter_get_provider_models($provider);
159 $default = botwriter_get_provider_default_model($provider);
160
161 if (empty($current_value)) {
162 $current_value = $default;
163 }
164
165 $attrs_str = '';
166 foreach ($extra_attrs as $key => $value) {
167 $attrs_str .= ' ' . esc_attr($key) . '="' . esc_attr($value) . '"';
168 }
169
170 echo '<select name="' . esc_attr($field_name) . '" class="form-select model-select" data-provider="' . esc_attr($provider) . '"' . $attrs_str . ' style="max-width: 400px;">';
171
172 foreach ($models as $group_name => $group_models) {
173 echo '<optgroup label="' . esc_attr($group_name) . '">';
174 foreach ($group_models as $model_id => $model_name) {
175 $selected = selected($current_value, $model_id, false);
176 echo '<option value="' . esc_attr($model_id) . '"' . $selected . '>' . esc_html($model_name) . '</option>';
177 }
178 echo '</optgroup>';
179 }
180
181 echo '</select>';
182 }
183