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