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