PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.0.2
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.0.2
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 / query / base.php
ai-engine / classes / query Last commit date
assist-feedback.php 10 months ago assistant.php 10 months ago base.php 10 months ago dropped-file.php 11 months ago edit-image.php 1 year ago embed.php 10 months ago feedback.php 10 months ago function.php 1 year ago image.php 10 months ago parameter.php 1 year ago text.php 10 months ago transcribe.php 11 months ago
base.php
443 lines
1 <?php
2
3 class Meow_MWAI_Query_Base implements JsonSerializable {
4 // Environment
5 public ?string $session = null;
6 public ?string $chatId = null;
7 public string $scope = '';
8 private $core = null;
9
10 // Core Content
11 public ?string $instructions = null;
12 public array $messages = [];
13 public ?string $context = null;
14 public string $message = '';
15
16 // Parameters
17 public int $maxMessages = 15;
18 public int $maxResults = 1;
19 public ?string $model = null;
20 //public string $mode = ''; //TODO: Let's get rid of this thing from the past
21 public string $feature = 'completion';
22
23 // Functions
24 public array $functions = [];
25 public ?string $functionCall = null;
26
27 // MCP Servers
28 public array $mcpServers = [];
29
30 // Tools (for Responses API)
31 public array $tools = [];
32
33 // History strategy for Responses API
34 public ?string $historyStrategy = null;
35 public ?string $previousResponseId = null;
36
37 // Overrides for env
38 public array $envSettings = [];
39 public string $envId = '';
40 public ?string $apiKey = null;
41
42 // Seem to be only used by the Assistants, to get the current thread/discussion.
43 // Maybe we should try to move this to the assistant class, or use it as ExtraParams.
44 public ?string $botId = null;
45 // Identifier for ad-hoc/custom chatbots (distinct from registered botId)
46 public ?string $customId = null;
47
48 // Embeddings configuration
49 public ?string $embeddingsEnvId = null;
50
51 // Extra Parameters (used by specific services, or for statistics, etc)
52 public array $extraParams = [];
53
54 // Legacy/temporary properties to avoid PHP deprecation warnings
55 public $env = null; // Used temporarily in model-environment.php
56 public $_maxDepthConfigured = null; // Used in engines/core.php
57
58 // Options
59 // Engine will either upload or share an URL to the image, for Vision, for example.
60 // Having this here allows other services to override it if needed (Ollama needs it false).
61 public ?string $image_remote_upload = null;
62
63 #region Constructors, Serialization
64
65 public function __construct( $message = '' ) {
66 global $mwai_core;
67 if ( is_string( $message ) ) {
68 $this->set_message( $message );
69 }
70 $this->session = $mwai_core->get_session_id();
71 $this->core = $mwai_core;
72 $this->image_remote_upload = $this->core->get_option( 'image_remote_upload' );
73 }
74
75 #[\ReturnTypeWillChange]
76 public function jsonSerialize(): array {
77 $json = [
78 'message' => $this->message,
79 'instructions' => $this->instructions,
80
81 'ai' => [
82 'model' => $this->model,
83 'feature' => $this->feature,
84 ],
85
86 'system' => [
87 'class' => get_class( $this ),
88 'envId' => $this->envId,
89 'scope' => $this->scope,
90 'session' => $this->session,
91 'customId' => $this->customId,
92 'maxMessages' => $this->maxMessages,
93 ]
94 ];
95
96 if ( !empty( $this->context ) ) {
97 $json['context']['content'] = $this->context;
98 }
99
100 return $json;
101 }
102
103 #endregion
104
105 #region Functions
106
107 public function add_function( Meow_MWAI_Query_Function $function ): void {
108 $this->functions[] = $function;
109 $this->functionCall = 'auto';
110 }
111
112 public function set_functions( array $functions ): void {
113 $this->functions = $functions;
114 $this->functionCall = 'auto';
115 }
116
117 public function set_tools( array $tools ): void {
118 $this->tools = $tools;
119 }
120
121 public function set_mcp_servers( array $mcpServers ): void {
122 $this->mcpServers = $mcpServers;
123 }
124
125 #endregion
126
127 #region Helpers
128
129 public function replace( $search, $replace ) {
130 $this->message = str_replace( $search, $replace, $this->message );
131 }
132
133 #endregion
134
135 public function get_message(): string {
136 return $this->message;
137 }
138
139 public function get_in_tokens(): int {
140 $in_tokens = Meow_MWAI_Core::estimate_tokens(
141 $this->messages,
142 $this->message,
143 $this->context ?? ''
144 );
145 return $in_tokens;
146 }
147
148 /**
149 * The environment, like "chatbot", "imagesbot", "chatbot-007", "textwriter", etc...
150 * Used for statistics, mainly.
151 * @param string $env The environment.
152 */
153 public function set_scope( string $scope ): void {
154 $this->scope = $scope;
155 }
156
157 /**
158 * The environment ID for AI services.
159 * Used for statistics, mainly.
160 * @param string $envId The environment ID.
161 */
162 public function set_env_id( string $envId ): void {
163 $this->envId = $envId;
164 }
165
166 /**
167 * ID of the model to use.
168 * @param string $model ID of the model to use.
169 */
170 public function set_model( string $model ) {
171 $this->model = $model;
172 }
173
174 public function get_model() {
175 return $this->model;
176 }
177
178 /**
179 * The chat ID to use.
180 * @param string $chatId The chat ID.
181 */
182 public function set_chat_id( string $chatId ) {
183 $this->chatId = $chatId;
184 }
185
186 public function get_chat_id() {
187 return $this->chatId;
188 }
189
190 /**
191 * The instructions are used to define the personality of the AI, and to give it some context.
192 * @param string $instructions The instructions.
193 */
194 public function set_instructions( string $instructions ): void {
195 // Decode HTML entities in case the instructions were sanitized at the UI level
196 // and ended up encoded when reaching the server.
197 $instructions = html_entity_decode( $instructions );
198
199 $this->instructions = apply_filters( 'mwai_ai_context', $instructions, $this );
200 if ( $this->instructions !== $instructions ) {
201 Meow_MWAI_Logging::deprecated( '"mwai_ai_context" filter is deprecated. Please use "mwai_ai_instructions" instead.' );
202 }
203 $this->instructions = apply_filters( 'mwai_ai_instructions', $this->instructions, $this );
204 }
205
206 /**
207 * Given a message, the model will return one or more predicted completions.
208 * It can also return the probabilities of alternative tokens at each position.
209 * @param string $message The message to generate completions.
210 */
211 public function set_message( string $message ) {
212 $this->message = $message;
213 }
214
215 /**
216 * Similar to the prompt, but use an array of messages instead.
217 * @param string $messages The messages to generate completions.
218 */
219 public function set_messages( array $messages ) {
220 $messages = array_map( function ( $message ) {
221 if ( is_array( $message ) ) {
222 return [ 'role' => $message['role'], 'content' => $message['content'] ];
223 }
224 else if ( is_object( $message ) ) {
225 return [ 'role' => $message->role, 'content' => $message->content ];
226 }
227 else {
228 throw new InvalidArgumentException( 'Unsupported message type.' );
229 }
230 }, $messages );
231 $this->messages = $messages;
232 }
233
234 /**
235 * The context can be used to add additional information that is likely to be relevant to the model.
236 * @param string $context The context.
237 */
238 public function set_context( string $context ): void {
239 $this->context = $context;
240 }
241
242 /**
243 * The API key to use.
244 * @param string $apiKey The API key.
245 */
246 public function set_api_key( string $apiKey ) {
247 $this->apiKey = $apiKey;
248 }
249
250 /**
251 * The session ID to use.
252 * @param string $session The session ID.
253 */
254 public function set_session( string $session ) {
255 $this->session = $session;
256 }
257
258 /**
259 * The bot ID to use.
260 * @param string $botId The bot ID.
261 */
262 public function set_bot_id( string $botId ) {
263 $this->botId = $botId;
264 }
265
266 /**
267 * The custom ID to use for ad-hoc chatbots (shortcode/overrides).
268 * @param string $customId The custom chatbot ID.
269 */
270 public function set_custom_id( string $customId ) {
271 $this->customId = $customId;
272 }
273
274 /**
275 * The embeddings environment ID to use.
276 * @param string $embeddingsEnvId The embeddings environment ID.
277 */
278 public function set_embeddings_env_id( string $embeddingsEnvId ) {
279 $this->embeddingsEnvId = $embeddingsEnvId;
280 }
281
282 /**
283 * How many completions to generate for each prompt.
284 * Because this parameter generates many completions, it can quickly consume your token quota.
285 * Use carefully and ensure that you have reasonable settings for max_tokens and stop.
286 * @param float $maxResults Number of completions.
287 */
288 public function set_max_results( int $maxResults ) {
289 $this->maxResults = $maxResults;
290 }
291
292 /**
293 * Set the history strategy for Responses API.
294 * @param string $historyStrategy The history strategy ('internal', 'response_id', or null).
295 */
296 public function set_history_strategy( ?string $historyStrategy ) {
297 $this->historyStrategy = $historyStrategy;
298 }
299
300 /**
301 * Set the previous response ID for Responses API.
302 * @param string $previousResponseId The previous response ID.
303 */
304 public function set_previous_response_id( ?string $previousResponseId ) {
305 $this->previousResponseId = $previousResponseId;
306 }
307
308 /**
309 * This is run at the end of the process, to do some final checks.
310 */
311 public function final_checks() {
312 if ( !empty( $this->maxMessages ) ) {
313 $context = array_shift( $this->messages );
314 if ( !empty( $this->messages ) ) {
315 $this->messages = array_slice( $this->messages, -$this->maxMessages );
316 }
317 else {
318 $this->messages = [];
319 }
320 if ( !empty( $context ) ) {
321 array_unshift( $this->messages, $context );
322 }
323 }
324 }
325
326 public function set_max_messages( int $maxMessages ): void {
327 if ( !empty( $maxMessages ) ) {
328 $this->maxMessages = intval( $maxMessages );
329 }
330 }
331
332 protected function convert_keys( $params ) {
333 $newParams = [];
334 foreach ( $params as $key => $value ) {
335 $newKey = '';
336 $capitalizeNextChar = false;
337 for ( $i = 0; $i < strlen( $key ); $i++ ) {
338 if ( $key[$i] == '_' ) {
339 $capitalizeNextChar = true;
340 }
341 else {
342 $newKey .= $capitalizeNextChar ? strtoupper( $key[$i] ) : $key[$i];
343 $capitalizeNextChar = false;
344 }
345 }
346 $newParams[$newKey] = $value;
347 }
348 return $newParams;
349 }
350
351 public function toJson() {
352 return json_encode( $this );
353 }
354
355 #region Extra Params
356 public function setExtraParam( string $key, $value ): void {
357 $this->extraParams[$key] = $value;
358 }
359
360 public function getExtraParam( string $key ) {
361 // Only if it exists
362 if ( !isset( $this->extraParams[$key] ) ) {
363 return null;
364 }
365 $value = $this->extraParams[$key];
366 return $value;
367 }
368 #endregion Extra Params
369
370 // Based on the params of the query, update the attributes
371 public function inject_params( array $params ): void {
372 // Those are for the keys passed directly by the shortcode.
373 $params = $this->convert_keys( $params );
374
375 if ( !empty( $params['instructions'] ) ) {
376 $this->set_instructions( $params['instructions'] );
377 }
378 // Do not allow external params to clobber an already-set message
379 // The message is typically set via constructor (e.g., Chatbot newMessage).
380 // Some UIs may accidentally send a top-level 'message' param (e.g., from
381 // unrelated settings like verbosity defaults), which would override the
382 // real user input here. Only set it if it's not already set.
383 if ( !empty( $params['message'] ) && $this->message === '' ) {
384 $this->set_message( $params['message'] );
385 }
386 if ( !empty( $params['messages'] ) ) {
387 $this->set_messages( $params['messages'] );
388 }
389 if ( !empty( $params['maxMessages'] ) && intval( $params['maxMessages'] ) > 0 ) {
390 $this->set_max_messages( intval( $params['maxMessages'] ) );
391 }
392 if ( !empty( $params['maxResults'] ) ) {
393 $this->set_max_results( $params['maxResults'] );
394 }
395 if ( !empty( $params['scope'] ) ) {
396 $this->set_scope( $params['scope'] );
397 }
398 if ( !empty( $params['session'] ) ) {
399 $this->set_session( $params['session'] );
400 }
401 if ( !empty( $params['apiKey'] ) ) {
402 $this->set_api_key( $params['apiKey'] );
403 }
404 if ( !empty( $params['botId'] ) ) {
405 $this->set_bot_id( $params['botId'] );
406 }
407 if ( !empty( $params['customId'] ) ) {
408 $this->set_custom_id( $params['customId'] );
409 }
410 if ( !empty( $params['envId'] ) ) {
411 $this->set_env_id( $params['envId'] );
412 }
413 if ( !empty( $params['model'] ) ) {
414 $this->set_model( $params['model'] );
415 }
416 if ( !empty( $params['chatId'] ) ) {
417 $this->set_chat_id( $params['chatId'] );
418 }
419 if ( !empty( $params['tools'] ) && is_array( $params['tools'] ) ) {
420 $this->set_tools( $params['tools'] );
421 }
422 if ( isset( $params['historyStrategy'] ) ) {
423 $this->set_history_strategy( $params['historyStrategy'] );
424 }
425 if ( !empty( $params['previousResponseId'] ) ) {
426 $this->set_previous_response_id( $params['previousResponseId'] );
427 }
428 if ( !empty( $params['embeddingsEnvId'] ) ) {
429 $this->set_embeddings_env_id( $params['embeddingsEnvId'] );
430 }
431 if ( !empty( $params['mcpServers'] ) ) {
432 // Handle both JSON string and array formats
433 $mcpServers = $params['mcpServers'];
434 if ( is_string( $mcpServers ) ) {
435 $mcpServers = json_decode( $mcpServers, true );
436 }
437 if ( is_array( $mcpServers ) ) {
438 $this->set_mcp_servers( $mcpServers );
439 }
440 }
441 }
442 }
443