PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.3.3
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.3.3
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 / reply.php
ai-engine / classes Last commit date
engines 2 years ago modules 2 years ago queries 2 years ago admin.php 2 years ago api.php 2 years ago core.php 2 years ago init.php 3 years ago reply.php 2 years ago rest.php 2 years ago
reply.php
244 lines
1 <?php
2
3 class Meow_MWAI_Reply implements JsonSerializable {
4 public $id = null;
5 public $result = '';
6 public $results = [];
7 public $usage = [
8 'prompt_tokens' => 0,
9 'completion_tokens' => 0,
10 'total_tokens' => 0,
11 'price' => null,
12 ];
13 public $query = null;
14 public $type = 'text';
15
16 // This is when models return a message that needs to be executed (functions, tools, etc)
17 public $needFeedbacks = [];
18
19 public function __construct( $query = null ) {
20 $this->query = $query;
21 }
22
23 #[\ReturnTypeWillChange]
24 public function jsonSerialize() {
25 $isEmbedding = false;
26 $embeddingsDimensions = null;
27 $embedddingsMessage = null;
28 if ( is_array( $this->results ) && count( $this->results ) > 0 ) {
29 $isEmbedding = is_array( $this->results[0] );
30 if ( $isEmbedding ) {
31 $embeddingsDimensions = count( $this->results[0] );
32 $embedddingsMessage = "A $embeddingsDimensions-dimensional embedding was returned.";
33 }
34 }
35 $data = [
36 'result' => $isEmbedding ? $embedddingsMessage : $this->result,
37 'results' => $isEmbedding ? [] : $this->results,
38 'usage' => $this->usage,
39 'system' => [
40 'class' => get_class( $this ),
41 ]
42 ];
43 if ( !empty( $this->needFeedbacks ) ) {
44 $data['needFeedbacks'] = $this->needFeedbacks;
45 }
46 return $data;
47 }
48
49 public function set_usage( $usage ) {
50 $this->usage = $usage;
51 }
52
53 public function set_id( $id ) {
54 $this->id = $id;
55 }
56
57 public function set_type( $type ) {
58 $this->type = $type;
59 }
60
61 public function get_total_tokens() {
62 return $this->usage['total_tokens'];
63 }
64
65 public function get_in_tokens( $query = null ) {
66 $in_tokens = $this->usage['prompt_tokens'];
67 if ( empty( $in_tokens ) && $query ) {
68 $in_tokens = $query->get_in_tokens();
69 }
70 return $in_tokens;
71 }
72
73 public function get_out_tokens() {
74 $out_tokens = $this->usage['completion_tokens'];
75 if ( empty( $out_tokens ) ) {
76 $out_tokens = Meow_MWAI_Core::estimate_tokens( $this->result );
77 }
78 return $out_tokens;
79 }
80
81 public function get_price() {
82 // If it's not set return null, but it can be 0
83 if ( !isset( $this->usage['price'] ) ) {
84 return null;
85 }
86 return $this->usage['price'];
87 }
88
89 public function get_units() {
90 if ( isset( $this->usage['total_tokens'] ) ) {
91 return $this->usage['total_tokens'];
92 }
93 else if ( isset( $this->usage['images'] ) ) {
94 return $this->usage['images'];
95 }
96 else if ( isset( $this->usage['seconds'] ) ) {
97 return $this->usage['seconds'];
98 }
99 return null;
100 }
101
102 public function get_type() {
103 return $this->type;
104 }
105
106 public function set_reply( $reply ) {
107 $this->result = $reply;
108 $this->results[] = [ $reply ];
109 }
110
111 public function replace( $search, $replace ) {
112 $this->result = str_replace( $search, $replace, $this->result );
113 $this->results = array_map( function( $result ) use ( $search, $replace ) {
114 return str_replace( $search, $replace, $result );
115 }, $this->results );
116 }
117
118 private function extract_arguments( $funcArgs ) {
119 $finalArgs = [];
120 if ( is_string( $funcArgs ) ) {
121 $arguments = trim( str_replace( "\n", "", $funcArgs ) );
122 if ( substr( $arguments, 0, 1 ) == '{' ) {
123 $arguments = json_decode( $arguments, true );
124 $finalArgs = $arguments;
125 }
126 }
127 else if ( is_array( $funcArgs ) ) {
128 $finalArgs = $funcArgs;
129 }
130 return $finalArgs;
131 }
132
133 /**
134 * Set the choices from OpenAI as the results.
135 * The last (or only) result is set as the result.
136 * @param array $choices ID of the model to use.
137 */
138 public function set_choices( $choices, $rawMessage = null) {
139 $this->results = [];
140 if ( is_array( $choices ) ) {
141 foreach ( $choices as $choice ) {
142
143 // It's chat completion
144 if ( isset( $choice['message'] ) ) {
145
146 // It's text content
147 if ( isset( $choice['message']['content'] ) ) {
148 $content = trim( $choice['message']['content'] );
149 $this->results[] = $content;
150 $this->result = $content;
151 }
152
153 // It's a tool call (OpenAI-style and Anthropic-style)
154 $needFeedbacks = [];
155 if ( isset( $choice['message']['tool_calls'] ) ) {
156 $tools = $choice['message']['tool_calls'];
157 foreach ( $tools as $tool ) {
158 if ( $tool['type'] === 'function' ) {
159 $needFeedbacks[] = [
160 'toolId' => $tool['id'],
161 'mode' => 'interactive',
162 'type' => 'tool_call',
163 'name' => trim( $tool['function']['name'] ),
164 'arguments' => $this->extract_arguments( $tool['function']['arguments'] ),
165 // Represent the original message that triggered the function call
166 'rawMessage' => $rawMessage ? $rawMessage : $choice['message'],
167 ];
168 }
169 }
170 }
171
172 // If it's a function call (Open-AI style; usually for a final execution)
173 if ( isset( $choice['message']['function_call'] ) ) {
174 $content = $choice['message']['function_call'];
175 $needFeedbacks[] = [
176 'toolId' => null,
177 'mode' => 'static',
178 'type' => 'function_call',
179 'name' => trim( $choice['message']['function_call']['name'] ),
180 'arguments' => $this->extract_arguments( $tool['message']['function_call']['arguments'] ),
181 'rawMessage' => $rawMessage ? $rawMessage : $choice['message'],
182 ];
183 }
184
185 // Resolve the original function from the query
186 if ( !empty( $needFeedbacks ) ) {
187 foreach ( $needFeedbacks as &$needFeedback ) {
188 if ( $needFeedback['type'] !== 'function_call' && $needFeedback['type'] !== 'tool_call' ) {
189 continue;
190 }
191 foreach ( $this->query->functions as $function ) {
192 if ( $function->name == $needFeedback['name'] ) {
193 $needFeedback['function'] = $function;
194 break;
195 }
196 }
197 }
198 }
199
200 $this->needFeedbacks = $needFeedbacks;
201 }
202
203 // It's text completion
204 else if ( isset( $choice['text'] ) ) {
205
206 // TODO: Assistants return an array (so actually not really a text completion)
207 // We should probably make this clearer and analyze all the outputs from different endpoints.
208 if ( is_array( $choice['text'] ) ) {
209 $text = trim( $choice['text']['value'] );
210 $this->results[] = $text;
211 $this->result = $text;
212 }
213 else {
214 $text = trim( $choice['text'] );
215 $this->results[] = $text;
216 $this->result = $text;
217 }
218 }
219
220 // It's url/image
221 else if ( isset( $choice['url'] ) ) {
222 $url = trim( $choice['url'] );
223 $this->results[] = $url;
224 $this->result = $url;
225 }
226
227 // It's embedding
228 else if ( isset( $choice['embedding'] ) ) {
229 $content = $choice['embedding'];
230 $this->results[] = $content;
231 $this->result = $content;
232 }
233 }
234 }
235 else {
236 $this->result = $choices;
237 $this->results[] = $choices;
238 }
239 }
240
241 public function toJson() {
242 return json_encode( $this );
243 }
244 }