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