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