PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 2.2.93
AI Engine – The Chatbot, AI Framework & MCP for WordPress v2.2.93
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
243 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 'rawMessage' => $rawMessage ? $rawMessage : $choice['message'],
166 ];
167 }
168 }
169 }
170
171 // If it's a function call (Open-AI style; usually for a final execution)
172 if ( isset( $choice['message']['function_call'] ) ) {
173 $content = $choice['message']['function_call'];
174 $needFeedbacks[] = [
175 'toolId' => null,
176 'mode' => 'static',
177 'type' => 'function_call',
178 'name' => trim( $choice['message']['function_call']['name'] ),
179 'arguments' => $this->extract_arguments( $tool['message']['function_call']['arguments'] ),
180 'rawMessage' => $rawMessage ? $rawMessage : $choice['message'],
181 ];
182 }
183
184 // Resolve the original function from the query
185 if ( !empty( $needFeedbacks ) ) {
186 foreach ( $needFeedbacks as &$needFeedback ) {
187 if ( $needFeedback['type'] !== 'function_call' && $needFeedback['type'] !== 'tool_call' ) {
188 continue;
189 }
190 foreach ( $this->query->functions as $function ) {
191 if ( $function->name == $needFeedback['name'] ) {
192 $needFeedback['function'] = $function;
193 break;
194 }
195 }
196 }
197 }
198
199 $this->needFeedbacks = $needFeedbacks;
200 }
201
202 // It's text completion
203 else if ( isset( $choice['text'] ) ) {
204
205 // TODO: Assistants return an array (so actually not really a text completion)
206 // We should probably make this clearer and analyze all the outputs from different endpoints.
207 if ( is_array( $choice['text'] ) ) {
208 $text = trim( $choice['text']['value'] );
209 $this->results[] = $text;
210 $this->result = $text;
211 }
212 else {
213 $text = trim( $choice['text'] );
214 $this->results[] = $text;
215 $this->result = $text;
216 }
217 }
218
219 // It's url/image
220 else if ( isset( $choice['url'] ) ) {
221 $url = trim( $choice['url'] );
222 $this->results[] = $url;
223 $this->result = $url;
224 }
225
226 // It's embedding
227 else if ( isset( $choice['embedding'] ) ) {
228 $content = $choice['embedding'];
229 $this->results[] = $content;
230 $this->result = $content;
231 }
232 }
233 }
234 else {
235 $this->result = $choices;
236 $this->results[] = $choices;
237 }
238 }
239
240 public function toJson() {
241 return json_encode( $this );
242 }
243 }