PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 1.3.52
AI Engine – The Chatbot, AI Framework & MCP for WordPress v1.3.52
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 / querytext.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
querytext.php
240 lines
1 <?php
2
3 use Rahul900day\Gpt3Encoder\Encoder;
4
5 class Meow_MWAI_QueryText extends Meow_MWAI_Query {
6 public $maxTokens = 1024;
7 public $temperature = 0.8;
8 public $stop = null;
9 public $messages = [];
10 public $context = null;
11
12 public function __construct( $prompt = '', $maxTokens = 1024, $model = 'gpt-3.5-turbo' ) {
13 parent::__construct( $prompt );
14 $this->setModel( $model );
15 $this->setMaxTokens( $maxTokens );
16 }
17
18 // Quick and dirty token estimation
19 // Let's keep this synchronized with Helpers in JS
20 function estimateTokens( $content )
21 {
22 $text = $content;
23 if ( is_array( $content ) ) {
24 foreach ( $content as $message ) {
25 $text .= $message['content'];
26 }
27 }
28
29 // Approximation (fast, no lib)
30 $asciiCount = 0;
31 $nonAsciiCount = 0;
32 for ($i = 0; $i < mb_strlen( $text ); $i++) {
33 $char = mb_substr( $text, $i, 1 );
34 if ( ord($char) < 128 ) {
35 $asciiCount++;
36 }
37 else {
38 $nonAsciiCount++;
39 }
40 }
41 $asciiTokens = $asciiCount / 3.5;
42 $nonAsciiTokens = $nonAsciiCount * 2.5;
43 $tokens = $asciiTokens + $nonAsciiTokens;
44
45 // More exact (slower, and lib)
46 try {
47 $token_array = Encoder::encode( $text );
48 if ( !empty( $token_array ) ) {
49 $tokens = count( $token_array );
50 }
51 }
52 catch ( Exception $e ) {
53 error_log( $e->getMessage() );
54 }
55
56 return (int)$tokens;
57 }
58
59 /**
60 * Make sure the maxTokens is not greater than the model's context length.
61 */
62 public function checkFix() {
63 if ( empty( $this->model ) ) { return; }
64 $realMax = 4096;
65 $finetuneFamily = preg_match('/^([a-zA-Z]{0,32}):/', $this->model, $matches );
66 $finetuneFamily = ( isset( $matches ) && count( $matches ) > 0 ) ? $matches[1] : 'N/A';
67 $foundModel = null;
68 foreach ( MWAI_OPENAI_MODELS as $currentModel ) {
69 if ( $currentModel['model'] === $this->model || $currentModel['family'] === $finetuneFamily ) {
70 $foundModel = $currentModel['name'];
71 $realMax = $currentModel['maxTokens'];
72 break;
73 }
74 }
75 $estimatedTokens = $this->estimateTokens( $this->messages );
76 if ( $estimatedTokens > $realMax ) {
77 throw new Exception( "The prompt is too long! It contains about $estimatedTokens tokens (estimation). The model $foundModel only accepts a maximum of $realMax tokens. " );
78 }
79 $realMax = (int)(($realMax - $estimatedTokens) * 0.95);
80 if ( $this->maxTokens > $realMax ) {
81 $this->maxTokens = $realMax;
82 }
83 }
84
85 /**
86 * ID of the model to use.
87 * @param string $model ID of the model to use.
88 */
89 public function setModel( $model ) {
90 $this->model = $model;
91 if ( $model === 'gpt-3.5-turbo') {
92 $this->mode = 'chat';
93 }
94 else {
95 $this->mode = 'completion';
96 }
97 }
98
99 /**
100 * Given a prompt, the model will return one or more predicted completions.
101 * It can also return the probabilities of alternative tokens at each position.
102 * @param string $prompt The prompt to generate completions.
103 */
104 public function setPrompt( $prompt ) {
105 parent::setPrompt( $prompt );
106 $this->validateMessages();
107 }
108
109 /**
110 * Similar to the prompt, but use an array of messages instead.
111 * @param string $prompt The messages to generate completions.
112 */
113 public function setMessages( $messages ) {
114 $messages = array_map( function( $message ) {
115 return [ 'role' => $message['role'], 'content' => $message['content'] ];
116 }, $messages );
117 $this->messages = $messages;
118 $this->validateMessages();
119 }
120
121 public function getLastMessage() {
122 if ( !empty( $this->messages ) ) {
123 return $this->messages[count( $this->messages ) - 1];
124 }
125 return null;
126 }
127
128 // Function that adds a message just before the last message
129 public function injectContext( $content ) {
130 if ( !empty( $this->messages ) ) {
131 $lastMessage = $this->getLastMessage();
132 $lastMessageIndex = count( $this->messages ) - 1;
133 $this->messages[$lastMessageIndex] = [ 'role' => 'system', 'content' => $content ];
134 array_push( $this->messages, $lastMessage );
135 }
136 $this->validateMessages();
137 }
138
139 /**
140 * The context that is used for the chat completion (mode === 'chat').
141 * @param string $context The context to use.
142 */
143 public function setContext( $context ) {
144 $this->context = apply_filters( 'mwai_ai_context', $context, $this );
145 $this->validateMessages();
146 }
147
148 private function validateMessages() {
149 if ( empty( $this->messages ) ) {
150 $this->messages = [];
151 if ( !empty( $this->prompt ) ) {
152 array_push( $this->messages, [ 'role' => 'user', 'content' => $this->prompt ] );
153 }
154 }
155 if ( !empty( $this->context ) ) {
156 if ( is_array( $this->messages ) && count( $this->messages ) > 0 ) {
157 if ( $this->messages[0]['role'] !== 'system' ) {
158 array_unshift( $this->messages, [ 'role' => 'system', 'content' => $this->context ] );
159 }
160 else {
161 $this->messages[0]['content'] = $this->context;
162 }
163 }
164 }
165 }
166
167 /**
168 * The maximum number of tokens to generate in the completion.
169 * The token count of your prompt plus max_tokens cannot exceed the model's context length.
170 * Most models have a context length of 2048 tokens (except for the newest models, which support 4096).
171 * @param float $prompt The maximum number of tokens.
172 */
173 public function setMaxTokens( $maxTokens ) {
174 $this->maxTokens = intval( $maxTokens );
175 }
176
177 /**
178 * Set the sampling temperature to use. Higher values means the model will take more risks.
179 * Try 0.9 for more creative applications, and 0 for ones with a well-defined answer.
180 * @param float $temperature The temperature.
181 */
182 public function setTemperature( $temperature ) {
183 $temperature = floatval( $temperature );
184 if ( $temperature > 1 ) {
185 $temperature = 1;
186 }
187 if ( $temperature < 0 ) {
188 $temperature = 0;
189 }
190 $this->temperature = $temperature;
191 }
192
193 /**
194 * Up to 4 sequences where the API will stop generating further tokens.
195 * The returned text will not contain the stop sequence.
196 * @param float $stop The stop.
197 */
198 public function setStop( $stop ) {
199 if ( !empty( $stop ) ) {
200 $this->stop = $stop;
201 }
202 }
203
204 // Based on the params of the query, update the attributes
205 public function injectParams( $params ) {
206 if ( isset( $params['model'] ) ) {
207 $this->setModel( $params['model'] );
208 }
209 if ( isset( $params['prompt'] ) ) {
210 $this->setPrompt( $params['prompt'] );
211 }
212 if ( isset( $params['messages'] ) ) {
213 $this->setMessages( $params['messages'] );
214 }
215 if ( isset( $params['context'] ) ) {
216 $this->setContext( $params['context'] );
217 }
218 if ( isset( $params['maxTokens'] ) ) {
219 $this->setMaxTokens( $params['maxTokens'] );
220 }
221 if ( isset( $params['temperature'] ) ) {
222 $this->setTemperature( $params['temperature'] );
223 }
224 if ( isset( $params['stop'] ) ) {
225 $this->setStop( $params['stop'] );
226 }
227 if ( isset( $params['apiKey'] ) ) {
228 $this->setApiKey( $params['apiKey'] );
229 }
230 if ( isset( $params['maxResults'] ) ) {
231 $this->setMaxResults( $params['maxResults'] );
232 }
233 if ( isset( $params['env'] ) ) {
234 $this->setEnv( $params['env'] );
235 }
236 if ( isset( $params['session'] ) ) {
237 $this->setSession( $params['session'] );
238 }
239 }
240 }