PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.0.8
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.0.8
3.6.2 3.6.1 3.6.0 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 / assistant.php
ai-engine / classes / queries Last commit date
assistant.php 2 years ago 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
assistant.php
289 lines
1 <?php
2
3 class Meow_MWAI_Query_Assistant extends Meow_MWAI_Query_Base implements JsonSerializable {
4 public array $messages = [];
5 public ?string $newMessage = null;
6 public ?string $newImage = null;
7 public ?string $newImageData = null;
8 public ?string $responseFormat = null;
9 public ?int $promptTokens = null;
10 public ?int $completionTokens = null;
11
12 public ?string $chatId = null;
13 public ?string $assistantId = null;
14 public ?string $threadId = null;
15
16 public function __construct( ?string $prompt = '' ) {
17 parent::__construct( $prompt );
18 $this->mode = "assistant";
19 }
20
21 #[\ReturnTypeWillChange]
22 public function jsonSerialize() {
23 return [
24 'class' => get_class( $this ),
25 'newMessage' => $this->newMessage,
26 'newImage' => $this->newImage,
27 'model' => $this->model,
28 'session' => $this->session,
29 'env' => $this->env,
30 'envId' => $this->envId,
31 'chatId' => $this->chatId,
32 'assistantId' => $this->assistantId,
33 'threadId' => $this->threadId,
34 'service' => $this->service,
35 ];
36 }
37
38 public function get_prompt_tokens( $refresh = false ): int {
39 if ( $this->promptTokens && !$refresh ) {
40 return $this->promptTokens;
41 }
42 $this->promptTokens = Meow_MWAI_Core::estimate_tokens( $this->messages );
43 return $this->promptTokens;
44 }
45
46 public function get_last_prompt(): string {
47 if ( empty( $this->messages ) ) {
48 return $this->prompt;
49 }
50 $last = $this->get_last_message();
51 return $last;
52 }
53
54 /**
55 * Given a prompt, the model will return one or more predicted completions.
56 * It can also return the probabilities of alternative tokens at each position.
57 * @param string $prompt The prompt to generate completions.
58 */
59 public function set_prompt( $prompt ) {
60 parent::set_prompt( $prompt );
61 $this->validate_messages();
62 }
63
64 /**
65 * The type of return expected from the API. It can be either null or "json".
66 * @param int $maxResults The maximum number of completions.
67 */
68 public function set_response_format( $responseFormat ) {
69 if ( !empty( $responseFormat ) && $responseFormat !== 'json' ) {
70 throw new Exception( "AI Engine: The response format can only be null or json." );
71 }
72 $this->responseFormat = $responseFormat;
73 }
74
75 /**
76 * The prompt is used by models who uses Text Completion (and not Chat Completion).
77 * This returns the prompt if it's not a chat, otherwise it will build a prompt with
78 * all the messages nicely formatted.
79 */
80 public function get_prompt(): ?string {
81 // In the case it's really just a prompt.
82 if ( count( $this->messages ) === 1 ) {
83 $first = reset( $this->messages );
84 return $first['content'];
85 }
86
87 // In the case it's a chat that we need to convert into a prompt.
88 $first = reset( $this->messages );
89 $prompt = "";
90 if ( $first && $first['role'] === 'system' ) {
91 $prompt = $first['content'] . "\n\n";
92 }
93
94 // Standard Completion
95 while ( $message = next( $this->messages ) ) {
96 $role = $message['role'];
97 $content = $message['content'];
98 if ( $role === 'system' ) {
99 $prompt .= "$content\n\n";
100 }
101 if ( $role === 'user' ) {
102 $prompt .= "User: $content\n";
103 }
104 if ( $role === 'assistant' ) {
105 $prompt .= "AI: $content\n";
106 }
107 }
108 $prompt .= "AI: ";
109 return $prompt;
110 }
111
112 /**
113 * Similar to the prompt, but focus on the new/last message.
114 * Only used when the model has a chat mode (and only used in messages).
115 * @param string $prompt The messages to generate completions.
116 */
117 public function set_new_message( string $newMessage ): void {
118 $this->newMessage = $newMessage;
119 $this->validate_messages();
120 }
121
122 public function set_new_image( string $newImage ): void {
123 $this->newImage = $newImage;
124 $this->validate_messages();
125 }
126
127 public function set_new_image_data( string $newImageData ): void {
128 $this->newImageData = $newImageData;
129 $this->validate_messages();
130 }
131
132 public function setAssistantId( string $assistantId ): void {
133 $this->assistantId = $assistantId;
134 }
135
136 public function setChatId( string $chatId ): void {
137 $this->chatId = $chatId;
138 }
139
140 public function setThreadId( string $threadId ): void {
141 $this->threadId = $threadId;
142 }
143
144 public function replace( $search, $replace ) {
145 $this->prompt = str_replace( $search, $replace, $this->prompt );
146 $this->validate_messages();
147 }
148
149 /**
150 * Similar to the prompt, but use an array of messages instead.
151 * @param string $prompt The messages to generate completions.
152 */
153 public function set_messages( array $messages ) {
154 return;
155 $messages = array_map( function( $message ) {
156 if ( is_array( $message ) ) {
157 return [ 'role' => $message['role'], 'content' => $message['content'] ];
158 }
159 else if ( is_object( $message ) ) {
160 return [ 'role' => $message->role, 'content' => $message->content ];
161 }
162 else {
163 throw new InvalidArgumentException( 'Unsupported message type.' );
164 }
165 }, $messages );
166 $this->messages = $messages;
167 $this->validate_messages();
168 }
169
170 public function get_last_message() {
171 if ( !empty( $this->messages ) ) {
172 $lastMessageIndex = count( $this->messages ) - 1;
173 $lastMessage = $this->messages[$lastMessageIndex];
174 if ( is_array( $lastMessage['content'] ) ) {
175 foreach( $lastMessage['content'] as $message ) {
176 if ( $message['type'] === 'text' ) {
177 return $message['text'];
178 }
179 }
180 }
181 else {
182 return $lastMessage['content'];
183 }
184 }
185 return null;
186 }
187
188 // Function that adds a message just before the last message
189 public function inject_context( string $content ): void {
190 if ( !empty( $this->messages ) ) {
191 $lastMessageIndex = count( $this->messages ) - 1;
192 $lastMessage = $this->messages[$lastMessageIndex];
193 $this->messages[$lastMessageIndex] = [ 'role' => 'system', 'content' => $content ];
194 array_push( $this->messages, $lastMessage );
195 }
196 $this->validate_messages();
197 }
198
199 private function getImageURL( $image ) {
200 if ( !empty( $this->newImage ) ) {
201 return $this->newImage;
202 }
203 if ( !empty( $this->newImageData ) ) {
204 return "data:image/jpeg;base64,{$this->newImageData}";
205 }
206 }
207
208 private function validate_messages(): void {
209 // Messages should end with either the prompt or, if exists, the newMessage.
210 $message = empty( $this->newMessage ) ? $this->prompt : $this->newMessage;
211 $content = $message;
212
213 // If there is an image, we need to adapt it to Vision.
214 $imageURL = $this->getImageURL( $this->newImage );
215 if ( !empty( $imageURL ) ) {
216 $content = [
217 [ "type" => "text", "text" => $message ],
218 [ "type" => "image_url", "image_url" => [ "url" => $imageURL ] ]
219 ];
220 }
221
222 if ( empty( $this->messages ) ) {
223 $this->messages = [ [ 'role' => 'user', 'content' => $content ] ];
224 }
225 else {
226 $last = &$this->messages[ count( $this->messages ) - 1 ];
227 if ( $last['role'] === 'user' ) {
228 $last['content'] = $content;
229 }
230 else {
231 array_push( $this->messages, [ 'role' => 'user', 'content' => $content ] );
232 }
233 }
234 }
235
236 // Based on the params of the query, update the attributes
237 public function inject_params( array $params ): void
238 {
239 // Those are for the keys passed directly by the shortcode.
240 $params = $this->convert_keys( $params );
241
242 if ( !empty( $params['model'] ) ) {
243 $this->set_model( $params['model'] );
244 }
245 if ( !empty( $params['prompt'] ) ) {
246 $this->set_prompt( $params['prompt'] );
247 }
248 if ( !empty( $params['messages'] ) ) {
249 $this->set_messages( $params['messages'] );
250 }
251 if ( !empty( $params['newMessage'] ) ) {
252 $this->set_new_message( $params['newMessage'] );
253 }
254 if ( !empty( $params['maxResults'] ) ) {
255 $this->set_max_results( $params['maxResults'] );
256 }
257 if ( !empty( $params['env'] ) ) {
258 $this->set_env( $params['env'] );
259 }
260 if ( !empty( $params['session'] ) ) {
261 $this->set_session( $params['session'] );
262 }
263 // Should add the params related to Open AI and Azure
264 if ( !empty( $params['service'] ) ) {
265 $this->set_service( $params['service'] );
266 }
267 if ( !empty( $params['apiKey'] ) ) {
268 $this->set_api_key( $params['apiKey'] );
269 }
270 if ( !empty( $params['botId'] ) ) {
271 $this->set_bot_id( $params['botId'] );
272 }
273 if ( !empty( $params['envId'] ) ) {
274 $this->set_env_id( $params['envId'] );
275 }
276 if ( !empty( $params['chatId'] ) ) {
277 $this->setChatId( $params['chatId'] );
278 }
279 if ( !empty( $params['assistantId'] ) ) {
280 $this->setAssistantId( $params['assistantId'] );
281 }
282 if ( !empty( $params['threadId'] ) ) {
283 $this->setThreadId( $params['threadId'] );
284 }
285 if ( !empty( $params['responseFormat'] ) ) {
286 $this->set_response_format( $params['responseFormat'] );
287 }
288 }
289 }