PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 0.2.5
AI Engine – The Chatbot, AI Framework & MCP for WordPress v0.2.5
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 / 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 queryimage.php 3 years ago querytext.php 3 years ago rest.php 3 years ago ui.php 3 years ago
ai.php
179 lines
1 <?php
2
3 class Meow_MWAI_AI {
4 private $core = null;
5 private $apiKey = null;
6
7 public function __construct( $core ) {
8 $this->core = $core;
9 $this->apiKey = $this->core->get_option( 'openai_apikey' );
10 }
11
12 // Record usage of the API on a monthly basis
13 public function record_usage( $model, $prompt_tokens, $completion_tokens ) {
14 if ( !$model || !$prompt_tokens || !$completion_tokens ) {
15 throw new Exception( 'Missing parameters for record_usage.' );
16 }
17 $usage = $this->core->get_option( 'openai_usage' );
18 $month = date( 'Y-m' );
19 if ( !isset( $usage[$month] ) ) {
20 $usage[$month] = array();
21 }
22 if ( !isset( $usage[$month][$model] ) ) {
23 $usage[$month][$model] = array(
24 'prompt_tokens' => 0,
25 'completion_tokens' => 0,
26 'total_tokens' => 0
27 );
28 }
29 $usage[$month][$model]['prompt_tokens'] += $prompt_tokens;
30 $usage[$month][$model]['completion_tokens'] += $completion_tokens;
31 $usage[$month][$model]['total_tokens'] += $prompt_tokens + $completion_tokens;
32 $this->core->update_option( 'openai_usage', $usage );
33 return [
34 'prompt_tokens' => $prompt_tokens,
35 'completion_tokens' => $completion_tokens,
36 'total_tokens' => $prompt_tokens + $completion_tokens
37 ];
38 }
39
40 public function record_image_usage( $model, $resolution, $images ) {
41 if ( !$model || !$resolution || !$images ) {
42 throw new Exception( 'Missing parameters for record_dalle_usage.' );
43 }
44 $usage = $this->core->get_option( 'openai_usage' );
45 $month = date( 'Y-m' );
46 if ( !isset( $usage[$month] ) ) {
47 $usage[$month] = array();
48 }
49 if ( !isset( $usage[$month][$model] ) ) {
50 $usage[$month][$model] = array(
51 'resolution' => array(),
52 'images' => 0
53 );
54 }
55 if ( !isset( $usage[$month][$model]['resolution'][$resolution] ) ) {
56 $usage[$month][$model]['resolution'][$resolution] = 0;
57 }
58 $usage[$month][$model]['resolution'][$resolution] += $images;
59 $usage[$month][$model]['images'] += $images;
60 $this->core->update_option( 'openai_usage', $usage );
61 return [
62 'resolution' => $resolution,
63 'images' => $images
64 ];
65 }
66
67 public function runTextQuery( $query ) {
68 $apiKey = $this->apiKey;
69 if ( !empty( $query->apiKey ) ) {
70 $apiKey = $query->apiKey;
71 }
72 $url = 'https://api.openai.com/v1/completions';
73 $options = array(
74 "headers" => "Content-Type: application/json\r\n" . "Authorization: Bearer " . $apiKey . "\r\n",
75 "method" => "POST",
76 "timeout" => 60,
77 "body" => json_encode( array(
78 "model" => $query->model,
79 "prompt" => $query->prompt,
80 "stop" => $query->stop,
81 "n" => $query->maxResults,
82 "max_tokens" => $query->maxTokens,
83 "temperature" => $query->temperature,
84 ) ),
85 "sslverify" => false
86 );
87
88 try {
89 $response = wp_remote_get( $url, $options );
90 if ( is_wp_error( $response ) ) {
91 throw new Exception( $response->get_error_message() );
92 }
93 $response = wp_remote_retrieve_body( $response );
94 $data = json_decode( $response, true );
95
96 // Error handling
97 if ( isset( $data['error'] ) ) {
98 $message = $data['error']['message'];
99 // If the message contains "Incorrect API key provided: THE_KEY.", replace the key by "----".
100 if ( preg_match( '/API key provided(: .*)\./', $message, $matches ) ) {
101 $message = str_replace( $matches[1], '', $message );
102 }
103 throw new Exception( $message );
104 }
105 $answer = new Meow_MWAI_Answer( $query );
106 $usage = $this->record_usage( $data['model'], $data['usage']['prompt_tokens'],
107 $data['usage']['completion_tokens'] );
108 $answer->setUsage( $usage );
109 $answer->setChoices( $data['choices'] );
110 return $answer;
111 }
112 catch ( Exception $e ) {
113 error_log( $e->getMessage() );
114 throw new Exception( 'Error while calling OpenAI: ' . $e->getMessage() );
115 }
116 }
117
118 // Request to DALL-E API
119 public function runImageQuery( $query ) {
120 $apiKey = $this->apiKey;
121 if ( !empty( $query->apiKey ) ) {
122 $apiKey = $query->apiKey;
123 }
124 $url = 'https://api.openai.com/v1/images/generations';
125 $options = array(
126 "headers" => "Content-Type: application/json\r\n" . "Authorization: Bearer " . $apiKey . "\r\n",
127 "method" => "POST",
128 "timeout" => 60,
129 "body" => json_encode( array(
130 "prompt" => $query->prompt,
131 "n" => $query->maxResults,
132 "size" => '1024x1024',
133 ) ),
134 "sslverify" => false
135 );
136
137 try {
138 $response = wp_remote_get( $url, $options );
139 if ( is_wp_error( $response ) ) {
140 throw new Exception( $response->get_error_message() );
141 }
142 $response = wp_remote_retrieve_body( $response );
143 $data = json_decode( $response, true );
144
145 // Error handling
146 if ( isset( $data['error'] ) ) {
147 $message = $data['error']['message'];
148 // If the message contains "Incorrect API key provided: THE_KEY.", replace the key by "----".
149 if ( preg_match( '/API key provided(: .*)\./', $message, $matches ) ) {
150 $message = str_replace( $matches[1], '', $message );
151 }
152 throw new Exception( $message );
153 }
154
155 $answer = new Meow_MWAI_Answer( $query );
156 $usage = $this->record_image_usage( "dall-e", "1024x1024", $query->maxResults );
157 $answer->setUsage( $usage );
158 $answer->setChoices( $data['data'] );
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 public function run( $query ) {
168 if ( $query instanceof Meow_MWAI_QueryText ) {
169 return $this->runTextQuery( $query );
170 }
171 else if ( $query instanceof Meow_MWAI_QueryImage ) {
172 return $this->runImageQuery( $query );
173 }
174 else {
175 throw new Exception( 'Invalid query.' );
176 }
177 }
178 }
179