PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.3.31
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.3.31
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 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
217 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 $usage = $this->core->record_tokens_usage( $data['model'], $data['usage']['prompt_tokens'],
112 $data['usage']['completion_tokens'] );
113 $answer->setUsage( $usage );
114 $answer->setChoices( $data['choices'] );
115 return $answer;
116 }
117 catch ( Exception $e ) {
118 error_log( $e->getMessage() );
119 throw new Exception( 'Error while calling OpenAI: ' . $e->getMessage() );
120 }
121 }
122
123 // Request to DALL-E API
124 public function runCreateImages( $query ) {
125 if ( empty( $query->apiKey ) ) {
126 $query->apiKey = $this->localApiKey;
127 }
128 $url = 'https://api.openai.com/v1/images/generations';
129 $options = array(
130 "headers" => "Content-Type: application/json\r\n" . "Authorization: Bearer " . $query->apiKey . "\r\n",
131 "method" => "POST",
132 "timeout" => 120,
133 "body" => json_encode( array(
134 "prompt" => $query->prompt,
135 "n" => $query->maxResults,
136 "size" => '1024x1024',
137 ) ),
138 "sslverify" => false
139 );
140
141 try {
142 $response = wp_remote_get( $url, $options );
143 if ( is_wp_error( $response ) ) {
144 throw new Exception( $response->get_error_message() );
145 }
146 $response = wp_remote_retrieve_body( $response );
147 $data = json_decode( $response, true );
148
149 // Error handling
150 if ( isset( $data['error'] ) ) {
151 $message = $data['error']['message'];
152 // If the message contains "Incorrect API key provided: THE_KEY.", replace the key by "----".
153 if ( preg_match( '/API key provided(: .*)\./', $message, $matches ) ) {
154 $message = str_replace( $matches[1], '', $message );
155 }
156 throw new Exception( $message );
157 }
158
159 $answer = new Meow_MWAI_Answer( $query );
160 $usage = $this->core->record_images_usage( "dall-e", "1024x1024", $query->maxResults );
161 $answer->setUsage( $usage );
162 $answer->setChoices( $data['data'] );
163 return $answer;
164 }
165 catch ( Exception $e ) {
166 error_log( $e->getMessage() );
167 throw new Exception( 'Error while calling OpenAI: ' . $e->getMessage() );
168 }
169 }
170
171 public function throwException( $message ) {
172 $message = apply_filters( 'mwai_ai_exception', $message );
173 throw new Exception( $message );
174 }
175
176 public function run( $query ) {
177
178 // Check if the query is allowed
179 $limits = $this->core->get_option( 'limits' );
180 $ok = apply_filters( 'mwai_ai_allowed', true, $query, $limits );
181 if ( $ok !== true ) {
182 $message = is_string( $ok ) ? $ok : 'Unauthorized query.';
183 $this->throwException( $message );
184 }
185
186 // Allow to modify the query
187 $query = apply_filters( 'mwai_ai_query', $query );
188
189 // Run the query
190 $answer = null;
191 try {
192 if ( $query instanceof Meow_MWAI_QueryText ) {
193 $answer = $this->runCompletion( $query );
194 }
195 else if ( $query instanceof Meow_MWAI_QueryEmbed ) {
196 $answer = $this->runEmbedding( $query );
197 }
198 else if ( $query instanceof Meow_MWAI_QueryImage ) {
199 $answer = $this->runCreateImages( $query );
200 }
201 else if ( $query instanceof Meow_MWAI_QueryTranscribe ) {
202 $answer = $this->runTranscribe( $query );
203 }
204 else {
205 $this->throwException( 'Invalid query.' );
206 }
207 }
208 catch ( Exception $e ) {
209 $this->throwException( $e->getMessage() );
210 }
211
212 // Let's allow some modififications of the answer
213 $answer = apply_filters( 'mwai_ai_reply', $answer, $query );
214 return $answer;
215 }
216 }
217