PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.9.97
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.9.97
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 / text.php
ai-engine / classes / queries Last commit date
base.php 2 years ago embed.php 2 years ago function.php 2 years ago image.php 2 years ago parameter.php 2 years ago text.php 2 years ago transcribe.php 2 years ago
text.php
501 lines
1 <?php
2
3 class Meow_MWAI_Query_Text extends Meow_MWAI_Query_Base implements JsonSerializable {
4 public int $maxTokens = 1024;
5 public float $temperature = 0.8;
6 public int $maxSentences = 15;
7 public ?string $stop = null;
8 public array $messages = [];
9 public ?string $context = null;
10 public ?string $newMessage = null;
11 public ?string $newImage = null;
12 public ?string $newImageData = null;
13 public ?string $promptEnding = null;
14 public bool $casuallyFineTuned = false;
15 public ?string $responseFormat = null;
16 public ?int $promptTokens = null;
17
18 public function __construct( ?string $prompt = '', int $maxTokens = 1024,
19 string $model = MWAI_FALLBACK_MODEL ) {
20 parent::__construct( $prompt );
21 $this->setModel( $model );
22 $this->setMaxTokens( $maxTokens );
23 }
24
25 #[\ReturnTypeWillChange]
26 public function jsonSerialize() {
27 return [
28 'class' => get_class( $this ),
29 'prompt' => $this->prompt,
30 'messages' => $this->messages,
31 'maxTokens' => $this->maxTokens,
32 'temperature' => $this->temperature,
33 'maxSentences' => $this->maxSentences,
34 'context' => $this->context,
35 'newMessage' => $this->newMessage,
36 'newImage' => $this->newImage,
37 'model' => $this->model,
38 'mode' => $this->mode,
39 'session' => $this->session,
40 'env' => $this->env,
41 'envId' => $this->envId,
42 'service' => $this->service,
43 'promptEnding' => $this->promptEnding,
44 'stop' => $this->stop,
45 'casuallyFineTuned' => $this->casuallyFineTuned,
46 ];
47 }
48
49 public function getPromptTokens( $refresh = false ): int {
50 if ( $this->promptTokens && !$refresh ) {
51 return $this->promptTokens;
52 }
53 $this->promptTokens = $this->estimateTokens( $this->messages );
54 return $this->promptTokens;
55 }
56
57 public function getLastPrompt(): string {
58 if ( empty( $this->messages ) ) {
59 return $this->prompt;
60 }
61 $last = $this->getLastMessage();
62 return $last;
63 }
64
65 // Quick and dirty token estimation
66 // Let's keep this synchronized with Helpers in JS
67 function estimateTokens( $promptOrMessages ): int
68 {
69 $text = "";
70 // https://github.com/openai/openai-cookbook/blob/main/examples/How_to_count_tokens_with_tiktoken.ipynb
71 if ( is_array( $promptOrMessages ) ) {
72 foreach ( $promptOrMessages as $message ) {
73 $role = $message['role'];
74 $content = $message['content'];
75 if ( is_array( $content ) ) {
76 foreach ( $content as $subMessage ) {
77 if ( $subMessage['type'] === 'text' ) {
78 $text .= $subMessage['text'];
79 }
80 }
81 }
82 else {
83 $text .= "=#=$role\n$content=#=\n";
84 }
85 }
86 }
87 else {
88 $text = $promptOrMessages;
89 }
90 $tokens = 0;
91 return apply_filters( 'mwai_estimate_tokens', (int)$tokens, $text, $this->model );
92 }
93
94 /**
95 * Make sure the maxTokens is not greater than the model's context length.
96 */
97 public function finalChecks() {
98 if ( empty( $this->model ) ) { return; }
99
100 // Make sure the number of messages is not too great.
101 if ( !empty( $this->maxSentences ) ) {
102 $context = array_shift( $this->messages );
103 if ( !empty( $this->messages ) ) {
104 $this->messages = array_slice( $this->messages, -$this->maxSentences );
105 }
106 else {
107 $this->messages = [];
108 }
109 if ( !empty( $context ) ) {
110 array_unshift( $this->messages, $context );
111 }
112
113 // NOTE: If nobody complains about this, we can probably get rid of everything
114 // related to the casuallyFineTuned. This was added on November 13th, 2023.
115 if ( $this->casuallyFineTuned ) {
116 error_log( 'AI Engine: The casuallyFineTuned parameter is deprecated.' );
117 }
118 }
119
120 // NOTE: Removed the checks related to the MaxTokens (as of November 8th)
121 // Let's see if we can remove this completely.
122
123 // Make sure the max tokens are respected.
124 // $realMax = 4096;
125 // $finetuneFamily = preg_match('/^([a-zA-Z]{0,32}):/', $this->model, $matches );
126 // $finetuneFamily = ( isset( $matches ) && count( $matches ) > 0 ) ? $matches[1] : 'N/A';
127 // $foundModel = null;
128 // $openai_models = Meow_MWAI_Engines_OpenAI::get_openai_models();
129 // foreach ( $openai_models as $currentModel ) {
130 // if ( $currentModel['model'] === $this->model || $currentModel['family'] === $finetuneFamily ) {
131 // $foundModel = $currentModel['name'];
132 // $realMax = $currentModel['maxTokens'];
133 // break;
134 // }
135 // }
136
137 // $estimatedTokens = $this->getPromptTokens();
138 // if ( !empty( $realMax ) && $estimatedTokens > $realMax ) {
139 // throw new Exception( "AI Engine: The prompt is too long! It contains about $estimatedTokens tokens (estimation). The $foundModel model only accepts a maximum of $realMax tokens. " );
140 // }
141 // $realMax = (int)($realMax - $estimatedTokens) - 16;
142 // if ( $this->maxTokens > $realMax ) {
143 // $this->maxTokens = $realMax;
144 // }
145 }
146
147 /**
148 * ID of the model to use.
149 * @param string $model ID of the model to use.
150 */
151 public function setModel( string $model ) {
152 $this->model = $model;
153 $this->mode = 'completion';
154 $found = false;
155 $openai_models = Meow_MWAI_Engines_OpenAI::get_openai_models();
156 foreach ( $openai_models as $currentModel ) {
157 if ( $currentModel['model'] === $this->model ) {
158 if ( $currentModel['mode'] ) {
159 $this->mode = $currentModel['mode'];
160 }
161 $found = true;
162 break;
163 }
164 }
165 if ( !$found ) {
166 // If the model can't be found, it's because it's probably a fine-tuned model. In the past (before August 2023),
167 // fine-tuned models were always based on GPT-3 (and therefore, using completion mode). From now on, they can be
168 // based on GPT-3.5 or 4 (and therefore, using chat mode). We need to detect that.
169 $baseModel = Meow_MWAI_Engines_OpenAI::get_finetune_base_model( $model );
170 if ( preg_match( '/^gpt-3.5|^gpt-4/', $baseModel ) ) {
171 $this->mode = 'chat';
172 }
173 }
174 }
175
176 /**
177 * Given a prompt, the model will return one or more predicted completions.
178 * It can also return the probabilities of alternative tokens at each position.
179 * @param string $prompt The prompt to generate completions.
180 */
181 public function setPrompt( $prompt ) {
182 parent::setPrompt( $prompt );
183 $this->validateMessages();
184 }
185
186 /**
187 * The type of return expected from the API. It can be either null or "json".
188 * @param int $maxResults The maximum number of completions.
189 */
190 public function setResponseFormat( $responseFormat ) {
191 if ( !empty( $responseFormat ) && $responseFormat !== 'json' ) {
192 throw new Exception( "AI Engine: The response format can only be null or json." );
193 }
194 $this->responseFormat = $responseFormat;
195 }
196
197 /**
198 * The prompt is used by models who uses Text Completion (and not Chat Completion).
199 * This returns the prompt if it's not a chat, otherwise it will build a prompt with
200 * all the messages nicely formatted.
201 */
202 public function getPrompt(): ?string {
203 // In the case it's really just a prompt.
204 if ( count( $this->messages ) === 1 ) {
205 $first = reset( $this->messages );
206 return $first['content'];
207 }
208
209 // In the case it's a chat that we need to convert into a prompt.
210 $first = reset( $this->messages );
211 $prompt = "";
212 if ( $first && $first['role'] === 'system' ) {
213 $prompt = $first['content'] . "\n\n";
214 }
215
216 // Casually Fine-Tuned or Prompt-Ending
217 if ( !empty( $this->promptEnding ) ) {
218 $last = end( $this->messages );
219 if ( $last && $last['role'] === 'user' ) {
220 $prompt = $last['content'] . $this->promptEnding;
221 }
222 return $prompt;
223 }
224
225 // Standard Completion
226 while ( $message = next( $this->messages ) ) {
227 $role = $message['role'];
228 $content = $message['content'];
229 if ( $role === 'system' ) {
230 $prompt .= "$content\n\n";
231 }
232 if ( $role === 'user' ) {
233 $prompt .= "User: $content\n";
234 }
235 if ( $role === 'assistant' ) {
236 $prompt .= "AI: $content\n";
237 }
238 }
239 $prompt .= "AI: ";
240 return $prompt;
241 }
242
243 /**
244 * Similar to the prompt, but focus on the new/last message.
245 * Only used when the model has a chat mode (and only used in messages).
246 * @param string $prompt The messages to generate completions.
247 */
248 public function setNewMessage( string $newMessage ): void {
249 $this->newMessage = $newMessage;
250 $this->validateMessages();
251 }
252
253 public function setNewImage( string $newImage ): void {
254 $this->newImage = $newImage;
255 $this->validateMessages();
256 }
257
258 public function setNewImageData( string $newImageData ): void {
259 $this->newImageData = $newImageData;
260 $this->validateMessages();
261 }
262
263 public function replace( $search, $replace ) {
264 $this->prompt = str_replace( $search, $replace, $this->prompt );
265 $this->validateMessages();
266 }
267
268 /**
269 * Similar to the prompt, but use an array of messages instead.
270 * @param string $prompt The messages to generate completions.
271 */
272 public function setMessages( array $messages ) {
273 $messages = array_map( function( $message ) {
274 if ( is_array( $message ) ) {
275 return [ 'role' => $message['role'], 'content' => $message['content'] ];
276 }
277 else if ( is_object( $message ) ) {
278 return [ 'role' => $message->role, 'content' => $message->content ];
279 }
280 else {
281 throw new InvalidArgumentException( 'Unsupported message type.' );
282 }
283 }, $messages );
284 $this->messages = $messages;
285 $this->validateMessages();
286 }
287
288 public function getLastMessage() {
289 if ( !empty( $this->messages ) ) {
290 $lastMessageIndex = count( $this->messages ) - 1;
291 $lastMessage = $this->messages[$lastMessageIndex];
292 if ( is_array( $lastMessage['content'] ) ) {
293 foreach( $lastMessage['content'] as $message ) {
294 if ( $message['type'] === 'text' ) {
295 return $message['text'];
296 }
297 }
298 }
299 else {
300 return $lastMessage['content'];
301 }
302 }
303 return null;
304 }
305
306 // Function that adds a message just before the last message
307 public function injectContext( string $content ): void {
308 if ( !empty( $this->messages ) ) {
309 $lastMessageIndex = count( $this->messages ) - 1;
310 $lastMessage = $this->messages[$lastMessageIndex];
311 $this->messages[$lastMessageIndex] = [ 'role' => 'system', 'content' => $content ];
312 array_push( $this->messages, $lastMessage );
313 }
314 $this->validateMessages();
315 }
316
317 /**
318 * The context that is used for the chat completion (mode === 'chat').
319 * @param string $context The context to use.
320 */
321 public function setContext( string $context ): void {
322 $this->context = apply_filters( 'mwai_ai_context', $context, $this );
323 $this->validateMessages();
324 }
325
326 private function getImageURL( $image ) {
327 if ( !empty( $this->newImage ) ) {
328 return $this->newImage;
329 }
330 if ( !empty( $this->newImageData ) ) {
331 return "data:image/jpeg;base64,{$this->newImageData}";
332 }
333 }
334
335
336 private function validateMessages(): void {
337 // Messages should end with either the prompt or, if exists, the newMessage.
338 $message = empty( $this->newMessage ) ? $this->prompt : $this->newMessage;
339 $content = $message;
340
341 // If there is an image, we need to adapt it to Vision.
342 $imageURL = $this->getImageURL( $this->newImage );
343 if ( !empty( $imageURL ) ) {
344 $content = [
345 [ "type" => "text", "text" => $message ],
346 [ "type" => "image_url", "image_url" => [ "url" => $imageURL ] ]
347 ];
348 }
349
350 if ( empty( $this->messages ) ) {
351 $this->messages = [ [ 'role' => 'user', 'content' => $content ] ];
352 }
353 else {
354 $last = &$this->messages[ count( $this->messages ) - 1 ];
355 if ( $last['role'] === 'user' ) {
356 $last['content'] = $content;
357 }
358 else {
359 array_push( $this->messages, [ 'role' => 'user', 'content' => $content ] );
360 }
361 }
362
363 // The main context must be first.
364 if ( !empty( $this->context ) ) {
365 if ( is_array( $this->messages ) && count( $this->messages ) > 0 ) {
366 if ( $this->messages[0]['role'] !== 'system' ) {
367 array_unshift( $this->messages, [ 'role' => 'system', 'content' => $this->context ] );
368 }
369 else {
370 $this->messages[0]['content'] = $this->context;
371 }
372 }
373 }
374 }
375
376 /**
377 * The maximum number of tokens to generate in the completion.
378 * The token count of your prompt plus max_tokens cannot exceed the model's context length.
379 * Most models have a context length of 2048 tokens (except for the newest models, which support 4096).
380 * @param float $prompt The maximum number of tokens.
381 */
382 public function setMaxTokens( int $maxTokens ): void {
383 $this->maxTokens = $maxTokens;
384 }
385
386 /**
387 * Set the sampling temperature to use. Higher values means the model will take more risks.
388 * Try 0.9 for more creative applications, and 0 for ones with a well-defined reply.
389 * @param float $temperature The temperature.
390 */
391 public function setTemperature( float $temperature ): void {
392 $temperature = floatval( $temperature );
393 if ( $temperature > 1 ) {
394 $temperature = 1;
395 }
396 if ( $temperature < 0 ) {
397 $temperature = 0;
398 }
399 $this->temperature = round( $temperature, 2 );
400 }
401
402 public function setMaxSentences( int $maxSentences ): void {
403 if ( !empty( $maxSentences ) ) {
404 $this->maxSentences = intval( $maxSentences );
405 $this->validateMessages();
406 }
407 }
408
409 public function setStop( string $stop ): void {
410 $this->stop = $stop;
411 }
412
413 private function convertKeys( $params )
414 {
415 $newParams = [];
416 foreach ( $params as $key => $value ) {
417 $newKey = '';
418 $capitalizeNextChar = false;
419 for ( $i = 0; $i < strlen( $key ); $i++ ) {
420 if ( $key[$i] == '_' ) {
421 $capitalizeNextChar = true;
422 }
423 else {
424 $newKey .= $capitalizeNextChar ? strtoupper($key[$i]) : $key[$i];
425 $capitalizeNextChar = false;
426 }
427 }
428 $newParams[$newKey] = $value;
429 }
430 return $newParams;
431 }
432
433 // Based on the params of the query, update the attributes
434 public function injectParams( array $params ): void
435 {
436 // Those are for the keys passed directly by the shortcode.
437 $params = $this->convertKeys( $params );
438
439 $acceptedValues = [ true, 1, '1' ];
440 if ( !empty( $params['model'] ) ) {
441 $this->setModel( $params['model'] );
442 }
443 if ( !empty( $params['casuallyFineTuned'] ) && in_array( $params['casuallyFineTuned'], $acceptedValues, true ) ) {
444 $this->promptEnding = "\n\n###\n\n";
445 $this->stop = "\n\n";
446 $this->casuallyFineTuned = true;
447 }
448 if ( !empty( $params['prompt'] ) ) {
449 $this->setPrompt( $params['prompt'] );
450 }
451 if ( !empty( $params['context'] ) ) {
452 $this->setContext( $params['context'] );
453 }
454 if ( !empty( $params['messages'] ) ) {
455 $this->setMessages( $params['messages'] );
456 }
457 if ( !empty( $params['newMessage'] ) ) {
458 $this->setNewMessage( $params['newMessage'] );
459 }
460 if ( !empty( $params['maxTokens'] ) && intval( $params['maxTokens'] ) > 0 ) {
461 $this->setMaxTokens( intval( $params['maxTokens'] ) );
462 }
463 if ( !empty( $params['maxMessages'] ) && intval( $params['maxMessages'] ) > 0 ) {
464 $this->setMaxSentences( intval( $params['maxMessages'] ) );
465 }
466 if ( !empty( $params['maxSentences'] ) && intval( $params['maxSentences'] ) > 0 ) {
467 $this->setMaxSentences( intval( $params['maxSentences'] ) );
468 }
469 if ( !empty( $params['temperature'] ) ) {
470 $this->setTemperature( $params['temperature'] );
471 }
472 if ( !empty( $params['stop'] ) ) {
473 $this->setStop( $params['stop'] );
474 }
475 if ( !empty( $params['maxResults'] ) ) {
476 $this->setMaxResults( $params['maxResults'] );
477 }
478 if ( !empty( $params['env'] ) ) {
479 $this->setEnv( $params['env'] );
480 }
481 if ( !empty( $params['session'] ) ) {
482 $this->setSession( $params['session'] );
483 }
484 // Should add the params related to Open AI and Azure
485 if ( !empty( $params['service'] ) ) {
486 $this->setService( $params['service'] );
487 }
488 if ( !empty( $params['apiKey'] ) ) {
489 $this->setApiKey( $params['apiKey'] );
490 }
491 if ( !empty( $params['botId'] ) ) {
492 $this->setBotId( $params['botId'] );
493 }
494 if ( !empty( $params['envId'] ) ) {
495 $this->setEnvId( $params['envId'] );
496 }
497 if ( !empty( $params['responseFormat'] ) ) {
498 $this->setResponseFormat( $params['responseFormat'] );
499 }
500 }
501 }