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