PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.3.96
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.3.96
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 / ai.php
ai-engine / classes Last commit date
modules 3 years ago admin.php 3 years ago ai.php 3 years ago answer.php 3 years ago api.php 3 years ago core.php 3 years ago init.php 3 years ago openai.php 3 years ago query.php 3 years ago queryembed.php 3 years ago queryimage.php 3 years ago querytext.php 3 years ago querytranscribe.php 3 years ago rest.php 3 years ago security.php 3 years ago ui.php 3 years ago
ai.php
259 lines
1 <?php
2
3 class Meow_MWAI_AI {
4 private $core = null;
5 private $localApiKey = null;
6 private $localService = null;
7 private $localAzureEndpoint = null;
8 private $localAzureApiKey = null;
9 private $localAzureDeployment = null;
10
11 public function __construct( $core ) {
12 $this->core = $core;
13 $this->localService = $this->core->get_option( 'openai_service' );
14 $this->localApiKey = $this->core->get_option( 'openai_apikey' );
15 $this->localAzureEndpoint = $this->core->get_option( 'openai_azure_endpoint' );
16 $this->localAzureApiKey = $this->core->get_option( 'openai_azure_apikey' );
17 $this->localAzureDeployment = $this->core->get_option( 'openai_azure_deployment' );
18 }
19
20 public function applyQueryParameters( $query ) {
21 if ( empty( $query->apiKey ) ) {
22 $query->apiKey = $this->localApiKey;
23 }
24 if ( empty( $query->service ) ) {
25 $query->service = $this->localService;
26 }
27 if ( $query->service === 'azure' ) {
28 if ( empty( $query->azureEndpoint ) ) {
29 $query->azureEndpoint = $this->localAzureEndpoint;
30 }
31 if ( empty( $query->azureApiKey ) ) {
32 $query->azureApiKey = $this->localAzureApiKey;
33 }
34 if ( empty( $query->azureDeployment ) ) {
35 $query->azureDeployment = $this->localAzureDeployment;
36 }
37 }
38 }
39
40 public function runTranscribe( $query ) {
41 $this->applyQueryParameters( $query );
42 $openai = new Meow_MWAI_OpenAI( $this->core );
43 $fields = array(
44 'prompt' => $query->prompt,
45 'model' => $query->model,
46 'response_format' => 'text',
47 'file' => basename( $query->url ),
48 'data' => file_get_contents( $query->url )
49 );
50 $modeEndpoint = $query->mode === 'translation' ? 'translations' : 'transcriptions';
51 $data = $openai->run( 'POST', '/audio/' . $modeEndpoint, null, $fields, false );
52 if ( empty( $data ) ) {
53 throw new Exception( 'Invalid data for transcription.' );
54 }
55 //$usage = $data['usage'];
56 //$this->core->record_tokens_usage( $query->model, $usage['prompt_tokens'] );
57 $answer = new Meow_MWAI_Answer( $query );
58 //$answer->setUsage( $usage );
59 $answer->setChoices( $data );
60 return $answer;
61 }
62
63 public function runEmbedding( $query ) {
64 $this->applyQueryParameters( $query );
65 $openai = new Meow_MWAI_OpenAI( $this->core );
66 $body = array( 'input' => $query->prompt, 'model' => $query->model );
67 $data = $openai->run( 'POST', '/embeddings', $body );
68 if ( empty( $data ) || !isset( $data['data'] ) ) {
69 throw new Exception( 'Invalid data for embedding.' );
70 }
71 $usage = $data['usage'];
72 $this->core->record_tokens_usage( $query->model, $usage['prompt_tokens'] );
73 $answer = new Meow_MWAI_Answer( $query );
74 $answer->setUsage( $usage );
75 $answer->setChoices( $data['data'] );
76 return $answer;
77 }
78
79 public function runCompletion( $query ) {
80 $this->applyQueryParameters( $query );
81 $url = "";
82 $headers = array(
83 'Content-Type' => 'application/json',
84 'Authorization' => 'Bearer ' . $query->apiKey,
85 );
86 $body = array(
87 "model" => $query->model,
88 "stop" => $query->stop,
89 "n" => $query->maxResults,
90 "max_tokens" => $query->maxTokens,
91 "temperature" => $query->temperature,
92 );
93
94 if ( $query->mode === 'chat' ) {
95 $url = 'https://api.openai.com/v1/chat/completions';
96 $body['messages'] = $query->messages;
97
98 // TODO: Let's follow closely the changes at Azure.
99 // Seems we need to specify an API version, otherwise it breaks.
100 if ( $query->service === 'azure' ) {
101 $url = trailingslashit( $query->azureEndpoint ) . 'openai/deployments/' .
102 $query->azureDeployment . '/chat/completions?api-version=2023-03-15-preview';
103 $headers = array(
104 'Content-Type' => 'application/json',
105 'api-key' => $query->azureApiKey,
106 );
107 }
108 }
109 else if ( $query->mode === 'completion' ) {
110 $url = 'https://api.openai.com/v1/completions';
111 $body['prompt'] = $query->prompt;
112 }
113 else {
114 throw new Exception( 'Unknown mode for query: ' . $query->mode );
115 }
116
117 $options = array(
118 "headers" => $headers,
119 "method" => "POST",
120 "timeout" => 120,
121 "body" => json_encode( $body ),
122 "sslverify" => false
123 );
124
125 try {
126 $response = wp_remote_get( $url, $options );
127 if ( is_wp_error( $response ) ) {
128 throw new Exception( $response->get_error_message() );
129 }
130 $response = wp_remote_retrieve_body( $response );
131 $data = json_decode( $response, true );
132
133 // Error handling
134 if ( isset( $data['error'] ) ) {
135 $message = $data['error']['message'];
136 // If the message contains "Incorrect API key provided: THE_KEY.", replace the key by "----".
137 if ( preg_match( '/API key provided(: .*)\./', $message, $matches ) ) {
138 $message = str_replace( $matches[1], '', $message );
139 }
140 throw new Exception( $message );
141 }
142 if ( !$data['model'] ) {
143 error_log( print_r( $data, 1 ) );
144 throw new Exception( "Got an unexpected response from OpenAI. Check your PHP Error Logs." );
145 }
146 $answer = new Meow_MWAI_Answer( $query );
147 try {
148 $usage = $this->core->record_tokens_usage(
149 $data['model'],
150 $data['usage']['prompt_tokens'],
151 $data['usage']['completion_tokens']
152 );
153 }
154 catch ( Exception $e ) {
155 error_log( $e->getMessage() );
156 }
157 $answer->setUsage( $usage );
158 $answer->setChoices( $data['choices'] );
159 return $answer;
160 }
161 catch ( Exception $e ) {
162 error_log( $e->getMessage() );
163 throw new Exception( 'Error while calling OpenAI: ' . $e->getMessage() );
164 }
165 }
166
167 // Request to DALL-E API
168 public function runCreateImages( $query ) {
169 $this->applyQueryParameters( $query );
170 $url = 'https://api.openai.com/v1/images/generations';
171 $options = array(
172 "headers" => "Content-Type: application/json\r\n" . "Authorization: Bearer " . $query->apiKey . "\r\n",
173 "method" => "POST",
174 "timeout" => 120,
175 "body" => json_encode( array(
176 "prompt" => $query->prompt,
177 "n" => $query->maxResults,
178 "size" => '1024x1024',
179 ) ),
180 "sslverify" => false
181 );
182
183 try {
184 $response = wp_remote_get( $url, $options );
185 if ( is_wp_error( $response ) ) {
186 throw new Exception( $response->get_error_message() );
187 }
188 $response = wp_remote_retrieve_body( $response );
189 $data = json_decode( $response, true );
190
191 // Error handling
192 if ( isset( $data['error'] ) ) {
193 $message = $data['error']['message'];
194 // If the message contains "Incorrect API key provided: THE_KEY.", replace the key by "----".
195 if ( preg_match( '/API key provided(: .*)\./', $message, $matches ) ) {
196 $message = str_replace( $matches[1], '', $message );
197 }
198 throw new Exception( $message );
199 }
200
201 $answer = new Meow_MWAI_Answer( $query );
202 $usage = $this->core->record_images_usage( "dall-e", "1024x1024", $query->maxResults );
203 $answer->setUsage( $usage );
204 $answer->setChoices( $data['data'] );
205 return $answer;
206 }
207 catch ( Exception $e ) {
208 error_log( $e->getMessage() );
209 throw new Exception( 'Error while calling OpenAI: ' . $e->getMessage() );
210 }
211 }
212
213 public function throwException( $message ) {
214 $message = apply_filters( 'mwai_ai_exception', $message );
215 throw new Exception( $message );
216 }
217
218 public function run( $query ) {
219 // Check if the query is allowed
220 $limits = $this->core->get_option( 'limits' );
221 $ok = apply_filters( 'mwai_ai_allowed', true, $query, $limits );
222 if ( $ok !== true ) {
223 $message = is_string( $ok ) ? $ok : 'Unauthorized query.';
224 $this->throwException( $message );
225 }
226
227 // Allow to modify the query
228 $query = apply_filters( 'mwai_ai_query', $query );
229 $query->checkFix();
230
231 // Run the query
232 $answer = null;
233 try {
234 if ( $query instanceof Meow_MWAI_QueryText ) {
235 $answer = $this->runCompletion( $query );
236 }
237 else if ( $query instanceof Meow_MWAI_QueryEmbed ) {
238 $answer = $this->runEmbedding( $query );
239 }
240 else if ( $query instanceof Meow_MWAI_QueryImage ) {
241 $answer = $this->runCreateImages( $query );
242 }
243 else if ( $query instanceof Meow_MWAI_QueryTranscribe ) {
244 $answer = $this->runTranscribe( $query );
245 }
246 else {
247 $this->throwException( 'Invalid query.' );
248 }
249 }
250 catch ( Exception $e ) {
251 $this->throwException( $e->getMessage() );
252 }
253
254 // Let's allow some modififications of the answer
255 $answer = apply_filters( 'mwai_ai_reply', $answer, $query );
256 return $answer;
257 }
258 }
259