PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.2.2
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.2.2
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 / engines / core.php
ai-engine / classes / engines Last commit date
core.php 2 years ago factory.php 2 years ago google.php 2 years ago huggingface.php 2 years ago openai.php 2 years ago openrouter.php 2 years ago
core.php
200 lines
1 <?php
2
3 class Meow_MWAI_Engines_Core {
4 protected $core = null;
5 public $env = null;
6 public $envId = null;
7 public $envType = null;
8
9 public function __construct( $core, $env ) {
10 $this->core = $core;
11 $this->env = $env;
12 $this->envId = $env['id'];
13 $this->envType = $env['type'];
14 }
15
16 public function run( $query, $streamCallback = null ) {
17
18 // Check if the query is allowed.
19 $limits = $this->core->get_option( 'limits' );
20 $allowed = apply_filters( 'mwai_ai_allowed', true, $query, $limits );
21 if ( $allowed !== true ) {
22 $message = is_string( $allowed ) ? $allowed : 'Unauthorized query.';
23 throw new Exception( $message );
24 }
25
26 // Allow to modify the query before it is sent. It should not be a Meow_MWAI_Query_Embed.
27 if ( !( $query instanceof Meow_MWAI_Query_Embed ) ) {
28 $query = apply_filters( 'mwai_ai_query', $query );
29 }
30
31 // Important as it makes sure everything is consolidated in the query and the engine.
32 $this->final_checks( $query );
33
34 // Run the query
35 $reply = null;
36 if ( $query instanceof Meow_MWAI_Query_Text ) {
37 $reply = $this->run_completion_query( $query, $streamCallback );
38 }
39 else if ( $query instanceof Meow_MWAI_Query_Assistant ) {
40 $reply = null;
41 $reply = apply_filters( 'mwai_ai_query_assistant', $reply, $query );
42 if ( $reply === null ) {
43 throw new Exception( 'Assistants are not supported in this version of AI Engine.' );
44 }
45 }
46 else if ( $query instanceof Meow_MWAI_Query_Embed ) {
47 $reply = $this->run_embedding_query( $query );
48 }
49 else if ( $query instanceof Meow_MWAI_Query_Image ) {
50 $reply = $this->run_images_query( $query );
51 }
52 else if ( $query instanceof Meow_MWAI_Query_Transcribe ) {
53 $reply = $this->run_transcribe_query( $query );
54 }
55 else {
56 throw new Exception( 'Unknown query type.' );
57 }
58
59 // Allow to modify the reply before it is sent.
60 $reply = apply_filters( 'mwai_ai_reply', $reply, $query );
61
62 return $reply;
63 }
64
65 public function retrieve_model_info( $model ) {
66 $models = $this->get_models();
67 foreach ( $models as $currentModel ) {
68 if ( $currentModel['model'] === $model ) {
69 return $currentModel;
70 }
71 }
72 return false;
73 }
74
75 public function final_checks( Meow_MWAI_Query_Base $query ) {
76 $query->final_checks();
77 //$found = false;
78
79 // Check if the model is available, except if it's an assistant
80 if ( !( $query instanceof Meow_MWAI_Query_Assistant ) ) {
81 // TODO: Avoid checking on the finetuned models for now.
82 if ( substr( $query->model, 0, 3 ) === 'ft:' ) {
83 return;
84 }
85 $model_info = $this->retrieve_model_info( $query->model );
86 if ( $model_info === false ) {
87 throw new Exception( "AI Engine: The model '{$query->model}' is not available." );
88 }
89 if ( isset( $model_info['mode'] ) ) {
90 $query->mode = $model_info['mode'];
91 }
92 }
93 }
94
95 // Streamline the messages:
96 // - Concatenate consecutive model messages into a single message for the model role
97 // - Make sure the first message is a user message
98 // - Make sure the last message is a user message
99 protected function streamline_messages( $messages, $systemRole = 'assistant', $messageType = 'content' )
100 {
101 $processedMessages = [];
102 $lastRole = '';
103 $concatenatedText = '';
104
105 // Determine the way to access message content based on messageType
106 $getContent = function( $message ) use ( $messageType ) {
107 if ( $messageType == 'parts' ) {
108 return $message['parts'][0]['text'];
109 }
110 else { // Default to 'content'
111 return $message['content'];
112 }
113 };
114
115 // Set content to a message depending on the messageType
116 $setContent = function( &$message, $content ) use ( $messageType ) {
117 if ( $messageType == 'parts' ) {
118 $message['parts'] = [['text' => $content]];
119 }
120 else { // Default to 'content'
121 $message['content'] = $content;
122 }
123 };
124
125 // Concatenate consecutive model messages into a single message for the model role
126 foreach ( $messages as $message ) {
127 if ( $message['role'] == $systemRole ) {
128 if ( $lastRole == $systemRole ) {
129 $concatenatedText .= "\n" . $getContent( $message );
130 }
131 else {
132 if ( $concatenatedText !== '' ) {
133 $newMessage = [ 'role' => $systemRole ];
134 $setContent( $newMessage, $concatenatedText );
135 $processedMessages[] = $newMessage;
136 }
137 $concatenatedText = $getContent( $message );
138 }
139 }
140 else {
141 if ( $lastRole == $systemRole ) {
142 $newMessage = [ 'role' => $systemRole ];
143 $setContent( $newMessage, $concatenatedText );
144 $processedMessages[] = $newMessage;
145 $concatenatedText = '';
146 }
147 $processedMessages[] = $message;
148 }
149 $lastRole = $message['role'];
150 }
151 if ( $lastRole == $systemRole && $concatenatedText !== '' ) {
152 $newMessage = [ 'role' => $systemRole ];
153 $setContent( $newMessage, $concatenatedText );
154 $processedMessages[] = $newMessage;
155 }
156
157 // Make sure the last message is a user message, if not, throw an exception
158 if ( end( $processedMessages )['role'] !== 'user' ) {
159 throw new Exception( 'The last message must be a user message.' );
160 }
161
162 // Make sure the first message is a user message, if not, add an empty user message
163 if ( $processedMessages[0]['role'] !== 'user' ) {
164 $newMessage = [ 'role' => 'user' ];
165 $setContent( $newMessage, '' );
166 array_unshift( $processedMessages, $newMessage );
167 }
168
169 return $processedMessages;
170 }
171
172 public function get_models() {
173 throw new Exception( 'Not implemented.' );
174 }
175
176 public function retrieve_models() {
177 throw new Exception( 'Not implemented.' );
178 }
179
180 public function run_completion_query( Meow_MWAI_Query_Base $query, $streamCallback = null ) : Meow_MWAI_Reply {
181 throw new Exception( 'Not implemented.' );
182 }
183
184 public function run_embedding_query( Meow_MWAI_Query_Base $query ) {
185 throw new Exception( 'Not implemented.' );
186 }
187
188 public function run_images_query( Meow_MWAI_Query_Base $query ) {
189 throw new Exception( 'Not implemented.' );
190 }
191
192 public function run_transcribe_query( Meow_MWAI_Query_Base $query ) {
193 throw new Exception( 'Not implemented.' );
194 }
195
196 public function get_price( Meow_MWAI_Query_Base $query, Meow_MWAI_Reply $reply ) {
197 throw new Exception( 'Not implemented.' );
198 }
199 }
200