PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.4.8
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.4.8
3.5.7 3.5.6 3.5.5 3.5.4 3.5.3 3.5.2 3.5.1 3.5.0 3.4.9 3.4.8 3.4.7 0.2.1 1.6.91 0.2.2 1.6.92 0.2.3 1.6.93 0.2.4 1.6.94 0.2.5 1.6.95 0.2.6 1.6.96 0.2.7 1.6.97 0.2.8 1.6.98 0.2.9 1.6.99 0.3.0 1.7.0 0.3.1 1.7.1 0.3.2 1.7.2 0.3.3 1.7.3 0.3.4 1.7.4 0.3.5 1.7.5 0.3.6 1.7.6 0.4.0 1.7.7 0.4.1 1.7.8 0.4.2 1.7.9 0.4.3 1.8.0 0.4.4 1.8.1 0.4.5 1.8.2 0.4.6 1.8.3 0.4.7 1.8.4 0.4.8 1.8.5 0.4.9 1.8.6 0.5.0 1.8.7 0.5.1 1.8.8 0.5.2 1.8.9 0.5.3 1.9.0 0.5.4 1.9.1 0.5.5 1.9.2 0.5.6 1.9.3 0.5.7 1.9.4 0.5.8 1.9.5 0.5.9 1.9.6 0.6.0 1.9.7 0.6.1 1.9.8 0.6.2 1.9.81 0.6.3 1.9.82 0.6.4 1.9.83 0.6.5 1.9.84 0.6.6 1.9.85 0.6.7 1.9.86 0.6.8 1.9.87 0.6.9 1.9.88 0.7.0 1.9.89 0.7.1 1.9.90 0.7.2 1.9.91 0.7.3 1.9.92 0.7.4 1.9.93 0.7.5 1.9.94 0.7.6 1.9.95 0.7.7 1.9.96 0.7.8 1.9.97 0.7.9 1.9.98 0.8.0 1.9.99 0.8.1 2.0.0 0.8.2 2.0.1 0.8.3 2.0.2 0.8.4 2.0.3 0.8.5 2.0.4 0.8.6 2.0.5 0.8.7 2.0.6 0.8.8 2.0.7 0.8.9 2.0.8 0.9.0 2.0.9 0.9.2 2.1.0 0.9.3 2.1.1 0.9.4 2.1.2 0.9.5 2.1.3 0.9.6 2.1.4 0.9.7 2.1.5 0.9.8 2.1.6 0.9.81 2.1.7 0.9.82 2.1.8 0.9.83 2.1.9 0.9.84 2.2.0 0.9.85 2.2.1 0.9.86 2.2.2 0.9.87 2.2.3 0.9.88 2.2.4 0.9.89 2.2.5 0.9.9 2.2.51 0.9.91 2.2.52 0.9.92 2.2.53 0.9.93 2.2.54 0.9.94 2.2.56 0.9.95 2.2.57 0.9.96 2.2.6 0.9.97 2.2.60 0.9.98 2.2.61 0.9.99 2.2.62 1.0.0 2.2.63 1.0.01 2.2.70 1.0.1 2.2.80 1.0.2 2.2.81 1.0.3 2.2.90 1.0.4 2.2.91 1.0.5 2.2.92 1.0.6 2.2.93 1.0.7 2.2.94 1.0.8 2.2.95 1.0.9 2.3.0 1.1.0 2.3.1 1.1.1 2.3.2 1.1.2 2.3.3 1.1.3 2.3.4 1.1.4 2.3.5 1.1.5 2.3.6 1.1.6 2.3.7 1.1.7 2.3.8 1.1.8 2.3.9 1.1.9 2.4.0 1.2.0 2.4.1 1.2.1 2.4.2 1.2.2 2.4.3 1.2.21 2.4.4 1.2.3 2.4.5 1.2.30 2.4.6 1.3.0 2.4.7 1.3.1 2.4.8 1.3.2 2.4.9 1.3.3 2.5.0 1.3.31 2.5.1 1.3.32 2.5.2 1.3.33 2.5.3 1.3.34 2.5.4 1.3.35 2.5.5 1.3.36 2.5.6 1.3.37 2.5.7 1.3.38 2.5.8 1.3.39 2.5.9 1.3.40 2.6.0 1.3.41 2.6.1 1.3.42 2.6.2 1.3.43 2.6.3 1.3.44 2.6.5 1.3.45 2.6.6 1.3.46 2.6.7 1.3.47 2.6.8 1.3.48 2.6.9 1.3.49 2.7.0 1.3.50 2.7.1 1.3.51 2.7.2 1.3.52 2.7.3 1.3.53 2.7.4 1.3.54 2.7.5 1.3.56 2.7.6 1.3.57 2.7.7 1.3.58 2.7.8 1.3.59 2.7.9 1.3.60 2.8.0 1.3.61 2.8.1 1.3.62 2.8.2 1.3.63 2.8.3 1.3.64 2.8.4 1.3.65 2.8.5 1.3.66 2.8.6 1.3.67 2.8.7 1.3.68 2.8.8 1.3.69 2.8.9 1.3.70 2.9.0 1.3.71 2.9.1 1.3.72 2.9.2 1.3.73 2.9.3 1.3.74 2.9.4 1.3.75 2.9.5 1.3.76 2.9.6 1.3.77 2.9.7 1.3.78 2.9.8 1.3.79 2.9.9 1.3.80 3.0.0 1.3.81 3.0.1 1.3.82 3.0.2 1.3.83 3.0.3 1.3.84 3.0.4 1.3.85 3.0.5 1.3.86 3.0.6 1.3.87 3.0.7 1.3.88 3.0.8 1.3.89 3.0.9 1.3.90 3.1.0 1.3.91 3.1.1 1.3.92 3.1.2 1.3.93 3.1.3 1.3.94 3.1.4 1.3.95 3.1.5 1.3.96 3.1.6 1.3.97 3.1.7 1.3.98 3.1.8 1.3.99 3.1.9 1.4.0 3.2.0 1.4.1 3.2.1 1.4.2 3.2.2 1.4.3 3.2.3 1.4.4 3.2.4 1.4.5 3.2.5 1.4.6 3.2.6 1.4.7 3.2.7 1.4.8 3.2.8 1.4.9 3.2.9 1.5.0 3.3.0 1.5.1 3.3.1 1.5.2 3.3.2 1.5.3 3.3.3 1.5.4 3.3.4 1.5.5 3.3.5 1.5.6 3.3.6 1.5.7 3.3.7 1.5.8 3.3.8 1.5.9 3.3.9 1.6.0 3.4.0 1.6.1 3.4.1 1.6.2 3.4.2 1.6.3 3.4.3 1.6.5 3.4.4 1.6.51 3.4.5 1.6.52 3.4.6 1.6.53 1.6.54 1.6.55 1.6.56 1.6.57 1.6.58 1.6.59 1.6.60 1.6.61 1.6.62 1.6.63 1.6.64 1.6.65 1.6.66 1.6.67 1.6.68 trunk 1.6.69 0.0.1 1.6.70 0.0.2 1.6.71 0.0.3 1.6.72 0.0.4 1.6.73 0.0.5 1.6.74 0.0.6 1.6.75 0.0.7 1.6.76 0.0.8 1.6.77 0.0.9 1.6.78 0.1.0 1.6.79 0.1.1 1.6.81 0.1.2 1.6.82 0.1.3 1.6.83 0.1.4 1.6.84 0.1.5 1.6.85 0.1.6 1.6.86 0.1.7 1.6.87 0.1.8 1.6.88 0.1.9 1.6.89 0.2.0 1.6.90
ai-engine / classes / querytext.php
ai-engine / classes Last commit date
modules 3 years ago admin.php 3 years ago ai.php 3 years ago answer.php 3 years ago api.php 3 years ago core.php 3 years ago init.php 3 years ago openai.php 3 years ago query.php 3 years ago queryembed.php 3 years ago queryimage.php 3 years ago querytext.php 3 years ago querytranscribe.php 3 years ago rest.php 3 years ago security.php 3 years ago
querytext.php
336 lines
1 <?php
2
3 class Meow_MWAI_QueryText extends Meow_MWAI_Query {
4 public $maxTokens = 1024;
5 public $temperature = 0.8;
6 public $isChat = false;
7 public $stop = null;
8 public $messages = [];
9 public $context = null;
10 public $newMessage = null;
11 public $promptEnding = null;
12 public $casuallyFineTuned = false;
13
14 public function __construct( $prompt = '', $maxTokens = 1024, $model = 'gpt-3.5-turbo' ) {
15 parent::__construct( $prompt );
16 $this->setModel( $model );
17 $this->setMaxTokens( $maxTokens );
18 }
19
20 public function getLastPrompt() {
21 if ( empty( $this->messages ) ) {
22 return $this->prompt;
23 }
24 $lastMessage = end( $this->messages );
25 return $lastMessage['content'];
26 }
27
28 // Quick and dirty token estimation
29 // Let's keep this synchronized with Helpers in JS
30 function estimateTokens( $content )
31 {
32 $text = "";
33 // https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb
34 if ( is_array( $content ) ) {
35 foreach ( $content as $message ) {
36 $name = "";
37 $role = $message['role'];
38 $content = $message['content'];
39 $text .= "=#=$role\n$content=#=\n";
40 }
41 }
42 else {
43 $text = $content;
44 }
45 $tokens = 0;
46 return apply_filters( 'mwai_estimate_tokens', (int)$tokens, $text, $this->model );
47 }
48
49 /**
50 * Make sure the maxTokens is not greater than the model's context length.
51 */
52 public function checkFix() {
53 if ( empty( $this->model ) ) { return; }
54 $realMax = 4096;
55 $finetuneFamily = preg_match('/^([a-zA-Z]{0,32}):/', $this->model, $matches );
56 $finetuneFamily = ( isset( $matches ) && count( $matches ) > 0 ) ? $matches[1] : 'N/A';
57 $foundModel = null;
58 foreach ( MWAI_OPENAI_MODELS as $currentModel ) {
59 if ( $currentModel['model'] === $this->model || $currentModel['family'] === $finetuneFamily ) {
60 $foundModel = $currentModel['name'];
61 $realMax = $currentModel['maxTokens'];
62 break;
63 }
64 }
65 $estimatedTokens = $this->estimateTokens( $this->messages );
66 if ( $estimatedTokens > $realMax ) {
67 throw new Exception( "The prompt is too long! It contains about $estimatedTokens tokens (estimation). The model $foundModel only accepts a maximum of $realMax tokens. " );
68 }
69 $realMax = (int)($realMax - $estimatedTokens) - 16;
70 if ( $this->maxTokens > $realMax ) {
71 $this->maxTokens = $realMax;
72 }
73 }
74
75 /**
76 * ID of the model to use.
77 * @param string $model ID of the model to use.
78 */
79 public function setModel( $model ) {
80 $this->model = $model;
81 $this->mode = 'completion';
82 foreach ( MWAI_OPENAI_MODELS as $currentModel ) {
83 if ( $currentModel['model'] === $this->model ) {
84 if ( $currentModel['mode'] ) {
85 $this->mode = $currentModel['mode'];
86 }
87 break;
88 }
89 }
90 }
91
92 /**
93 * Given a prompt, the model will return one or more predicted completions.
94 * It can also return the probabilities of alternative tokens at each position.
95 * @param string $prompt The prompt to generate completions.
96 */
97 public function setPrompt( $prompt ) {
98 parent::setPrompt( $prompt );
99 $this->validateMessages();
100 }
101
102 /**
103 * The prompt is used by models who uses Text Completion (and not Chat Completion).
104 * This returns the prompt if it's not a chat, otherwise it will build a prompt with
105 * all the messages nicely formatted.
106 */
107 public function getPrompt() {
108 if ( !$this->isChat ) {
109 return $this->prompt;
110 }
111
112 $first = reset( $this->messages );
113 $prompt = "";
114 if ( $first && $first['role'] === 'system' ) {
115 $prompt = $first['content'] . "\n\n";
116 }
117
118 // Casually Fine-Tuned or Prompt-Ending
119 if ( !empty( $this->promptEnding ) ) {
120 $last = end( $this->messages );
121 if ( $last && $last['role'] === 'user' ) {
122 $prompt = $last['content'] . $this->promptEnding;
123 }
124 return $prompt;
125 }
126
127 // Standard Completion
128 while ( $message = next( $this->messages ) ) {
129 $role = $message['role'];
130 $content = $message['content'];
131 if ( $role === 'system' ) {
132 $prompt .= "$content\n\n";
133 }
134 if ( $role === 'user' ) {
135 $prompt .= "User: $content\n";
136 }
137 if ( $role === 'assistant' ) {
138 $prompt .= "AI: $content\n";
139 }
140 }
141 $prompt .= "AI: ";
142 return $prompt;
143 }
144
145 /**
146 * Similar to the prompt, but focus on the new/last message.
147 * Only used when the model has a chat mode (and only used in messages).
148 * @param string $prompt The messages to generate completions.
149 */
150 public function setNewMessage( $newMessage ) {
151 $this->newMessage = $newMessage;
152 $this->validateMessages();
153 }
154
155 public function replace( $search, $replace ) {
156 $this->prompt = str_replace( $search, $replace, $this->prompt );
157 $this->validateMessages();
158 }
159
160 public function setIsChat( $isChat ) {
161 $this->isChat = $isChat;
162 }
163
164 /**
165 * Similar to the prompt, but use an array of messages instead.
166 * @param string $prompt The messages to generate completions.
167 */
168 public function setMessages( $messages ) {
169 $messages = array_map( function( $message ) {
170 return [ 'role' => $message['role'], 'content' => $message['content'] ];
171 }, $messages );
172 $this->messages = $messages;
173 $this->validateMessages();
174 }
175
176 public function getLastMessage() {
177 if ( !empty( $this->messages ) ) {
178 $lastMessageIndex = count( $this->messages ) - 1;
179 $lastMessage = $this->messages[$lastMessageIndex];
180 return $lastMessage['content'];
181 }
182 return null;
183 }
184
185 // Function that adds a message just before the last message
186 public function injectContext( $content ) {
187 if ( !empty( $this->messages ) ) {
188 $lastMessageIndex = count( $this->messages ) - 1;
189 $lastMessage = $this->messages[$lastMessageIndex];
190 $this->messages[$lastMessageIndex] = [ 'role' => 'system', 'content' => $content ];
191 array_push( $this->messages, $lastMessage );
192 }
193 $this->validateMessages();
194 }
195
196 /**
197 * The context that is used for the chat completion (mode === 'chat').
198 * @param string $context The context to use.
199 */
200 public function setContext( $context ) {
201 $this->context = apply_filters( 'mwai_ai_context', $context, $this );
202 $this->validateMessages();
203 }
204
205 private function validateMessages() {
206 // Messages should end with either the prompt or, if exists, the newMessage.
207 $message = empty( $this->newMessage ) ? $this->prompt : $this->newMessage;
208 if ( empty( $this->messages ) ) {
209 $this->messages = [ [ 'role' => 'user', 'content' => $message ] ];
210 }
211 else {
212 $last = &$this->messages[ count( $this->messages ) - 1 ];
213 if ( $last['role'] === 'user' ) {
214 $last['content'] = $message;
215 }
216 else {
217 array_push( $this->messages, [ 'role' => 'user', 'content' => $message ] );
218 }
219 }
220
221 // The main context must be first.
222 if ( !empty( $this->context ) ) {
223 if ( is_array( $this->messages ) && count( $this->messages ) > 0 ) {
224 if ( $this->messages[0]['role'] !== 'system' ) {
225 array_unshift( $this->messages, [ 'role' => 'system', 'content' => $this->context ] );
226 }
227 else {
228 $this->messages[0]['content'] = $this->context;
229 }
230 }
231 }
232 }
233
234 /**
235 * The maximum number of tokens to generate in the completion.
236 * The token count of your prompt plus max_tokens cannot exceed the model's context length.
237 * Most models have a context length of 2048 tokens (except for the newest models, which support 4096).
238 * @param float $prompt The maximum number of tokens.
239 */
240 public function setMaxTokens( $maxTokens ) {
241 $this->maxTokens = intval( $maxTokens );
242 }
243
244 /**
245 * Set the sampling temperature to use. Higher values means the model will take more risks.
246 * Try 0.9 for more creative applications, and 0 for ones with a well-defined answer.
247 * @param float $temperature The temperature.
248 */
249 public function setTemperature( $temperature ) {
250 $temperature = floatval( $temperature );
251 if ( $temperature > 1 ) {
252 $temperature = 1;
253 }
254 if ( $temperature < 0 ) {
255 $temperature = 0;
256 }
257 $this->temperature = round( $temperature, 2 );
258 }
259
260 /**
261 * Up to 4 sequences where the API will stop generating further tokens.
262 * The returned text will not contain the stop sequence.
263 * @param float $stop The stop.
264 */
265 public function setStop( $stop ) {
266 if ( !empty( $stop ) ) {
267 $this->stop = $stop;
268 }
269 }
270
271 // Based on the params of the query, update the attributes
272 public function injectParams( $params ) {
273 if ( isset( $params['model'] ) ) {
274 $this->setModel( $params['model'] );
275 }
276 if ( isset( $params['casually_fine_tuned'] ) && $params['casually_fine_tuned'] === true ) {
277 $this->promptEnding = "\\n\\n###\\n\\n";
278 $this->stop = "\\n\\n";
279 $this->casuallyFineTuned = true;
280 }
281 if ( isset( $params['casuallyFineTuned'] ) && $params['casuallyFineTuned'] === true ) {
282 $this->promptEnding = "\\n\\n###\\n\\n";
283 $this->stop = "\\n\\n";
284 $this->casuallyFineTuned = true;
285 }
286 if ( isset( $params['prompt'] ) ) {
287 $this->setPrompt( $params['prompt'] );
288 }
289 if ( isset( $params['context'] ) ) {
290 $this->setContext( $params['context'] );
291 }
292 if ( isset( $params['messages'] ) ) {
293 $this->setMessages( $params['messages'] );
294 }
295 if ( isset( $params['new_message'] ) ) {
296 $this->setNewMessage( $params['newMessage'] );
297 }
298 if ( isset( $params['newMessage'] ) ) {
299 $this->setNewMessage( $params['newMessage'] );
300 }
301 if ( isset( $params['max_tokens'] ) && intval( $params['max_tokens'] ) > 0 ) {
302 $this->setMaxTokens( intval( $params['max_tokens'] ) );
303 }
304 if ( isset( $params['maxTokens'] ) && intval( $params['maxTokens'] ) > 0 ) {
305 $this->setMaxTokens( intval( $params['maxTokens'] ) );
306 }
307 if ( isset( $params['temperature'] ) ) {
308 $this->setTemperature( $params['temperature'] );
309 }
310 if ( isset( $params['stop'] ) ) {
311 $this->setStop( $params['stop'] );
312 }
313 if ( isset( $params['max_results'] ) ) {
314 $this->setMaxResults( $params['max_results'] );
315 }
316 if ( isset( $params['maxResults'] ) ) {
317 $this->setMaxResults( $params['maxResults'] );
318 }
319 if ( isset( $params['env'] ) ) {
320 $this->setEnv( $params['env'] );
321 }
322 if ( isset( $params['session'] ) ) {
323 $this->setSession( $params['session'] );
324 }
325 // Should add the params related to Open AI and Azure
326 if ( isset( $params['service'] ) ) {
327 $this->setService( $params['service'] );
328 }
329 if ( isset( $params['api_key'] ) ) {
330 $this->setApiKey( $params['apiKey'] );
331 }
332 if ( isset( $params['apiKey'] ) ) {
333 $this->setApiKey( $params['apiKey'] );
334 }
335 }
336 }