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