PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.6.5
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.6.5
3.6.8 3.6.7 3.6.6 3.6.4 3.6.5 3.6.3 3.6.2 3.6.1 3.6.0 3.5.9 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 / query / function.php
ai-engine / classes / query Last commit date
assist-feedback.php 11 months ago assistant.php 3 months ago base.php 1 month ago dropped-file.php 4 months ago edit-image.php 4 months ago embed.php 4 months ago feedback.php 11 months ago function.php 5 days ago image.php 2 months ago parameter.php 1 year ago text.php 1 month ago transcribe.php 9 months ago
function.php
266 lines
1 <?php
2
3 class Meow_MWAI_Query_Function {
4 public string $name;
5 public string $description;
6 public array $parameters;
7 public string $type; // 'code-engine', etc...
8 public string $target; // 'server' or 'client'
9 public string $behavior; // 'dynamic' (default) or 'static'
10 public ?string $id;
11 // Raw JSON Schema (MCP-style inputSchema). When set, it is sent to the
12 // providers as-is and $parameters is ignored, so rich schemas (nested
13 // objects, oneOf, items types) survive without being flattened.
14 public ?array $rawSchema = null;
15
16 public function __construct(
17 string $name,
18 string $description,
19 array $parameters = [],
20 ?string $type = null,
21 ?string $id = null,
22 ?string $target = null,
23 ?string $behavior = null
24 ) {
25 // $name: The name of the function to be called.
26 // Must be a-z, A-Z, 0-9, or contain underscores and dashes, with a maximum length of 64.
27 if ( !preg_match( '/^[a-zA-Z0-9_-]{1,64}$/', $name ) ) {
28 throw new InvalidArgumentException( "AI Engine: Invalid function name ($name) for Meow_MWAI_Query_Function." );
29 }
30
31 foreach ( $parameters as $parameter ) {
32 if ( !( $parameter instanceof Meow_MWAI_Query_Parameter ) ) {
33 throw new InvalidArgumentException( 'AI Engine: Invalid parameter for Meow_MWAI_Query_Function.' );
34 }
35 }
36
37 $this->name = $name;
38 $this->description = $description;
39 $this->parameters = $parameters;
40 $this->type = $type ?? 'manual';
41 $this->id = $id;
42 $this->target = $target ?? 'server';
43 $this->behavior = ( $behavior === 'static' ) ? 'static' : 'dynamic';
44 }
45
46 public static function from_raw_schema(
47 string $name,
48 string $description,
49 ?array $schema,
50 ?string $type = null,
51 ?string $id = null
52 ): Meow_MWAI_Query_Function {
53 $function = new self( $name, $description, [], $type, $id );
54 $function->rawSchema = is_array( $schema ) ? $schema : null;
55 return $function;
56 }
57
58 private function normalized_raw_schema(): array {
59 $schema = $this->rawSchema;
60 unset( $schema['$schema'] );
61 if ( empty( $schema['type'] ) ) {
62 $schema['type'] = 'object';
63 }
64 // An empty PHP array encodes as [], but every provider requires {} here.
65 if ( empty( $schema['properties'] ) ) {
66 $schema['properties'] = new stdClass();
67 }
68 if ( isset( $schema['required'] ) && empty( $schema['required'] ) ) {
69 unset( $schema['required'] );
70 }
71 return $schema;
72 }
73
74 public function serializeForOpenAI() {
75 if ( $this->rawSchema !== null ) {
76 return [
77 'name' => $this->name,
78 'description' => $this->description,
79 'parameters' => $this->normalized_raw_schema(),
80 ];
81 }
82
83 // Initialize the base structure with name and description
84 $json = [ 'name' => $this->name, 'description' => $this->description ];
85
86 $properties = [];
87 $required = [];
88
89 // Loop through each parameter to construct the properties object
90 if ( !empty( $this->parameters ) ) {
91 foreach ( $this->parameters as $parameter ) {
92
93 $properties[$parameter->name] = [
94 'type' => $parameter->type, // Assuming each parameter has a 'type' attribute
95 'description' => $parameter->description, // Assuming each parameter has a 'description' attribute
96 ];
97
98 // If the parameter type is "array" and has a "items" attribute, include it
99 if ( $parameter->type === 'array' ) {
100 $properties[$parameter->name]['items'] = [
101 'type' => 'string', // Assuming the items are strings
102 ];
103 }
104
105 // If an enum is set for the parameter, include it
106 if ( isset( $parameter->enum ) ) {
107 $properties[$parameter->name]['enum'] = $parameter->enum;
108 }
109
110 // If the parameter is required, add its name to the required array
111 if ( $parameter->required ) {
112 $required[] = $parameter->name;
113 }
114 }
115 }
116
117 // Always include parameters field (required by some APIs like OVH even when empty)
118 // Properties must be an object (stdClass) when empty, not an empty array
119 $json['parameters'] = [
120 'type' => 'object',
121 'properties' => empty( $properties ) ? new stdClass() : $properties,
122 'required' => $required,
123 ];
124
125 return $json;
126 }
127
128 public function serializeForAnthropic() {
129 if ( $this->rawSchema !== null ) {
130 return [
131 'name' => $this->name,
132 'description' => $this->description,
133 'input_schema' => $this->normalized_raw_schema(),
134 ];
135 }
136
137 $json = [
138 'name' => $this->name,
139 'description' => $this->description,
140 'input_schema' => [
141 'type' => 'object',
142 'properties' => new stdClass()
143 ],
144 ];
145
146 if ( !empty( $this->parameters ) ) {
147 $properties = [];
148 $required = [];
149 foreach ( $this->parameters as $parameter ) {
150 $properties[$parameter->name] = [
151 'type' => $parameter->type,
152 'description' => $parameter->description,
153 ];
154 if ( isset( $parameter->enum ) ) {
155 $properties[$parameter->name]['enum'] = $parameter->enum;
156 }
157 if ( $parameter->required ) {
158 $required[] = $parameter->name;
159 }
160 }
161 $json['input_schema']['properties'] = empty( $properties ) ? new stdClass() : $properties;
162 if ( !empty( $required ) ) {
163 $json['input_schema']['required'] = $required;
164 }
165 }
166
167 return $json;
168 }
169
170 public function serializeForGemini() {
171 if ( $this->rawSchema !== null ) {
172 return [
173 'name' => $this->name,
174 'description' => $this->description,
175 'parameters' => $this->normalized_raw_schema(),
176 ];
177 }
178
179 $json = [
180 'name' => $this->name,
181 'description' => $this->description,
182 'parameters' => [
183 'type' => 'object',
184 'properties' => new stdClass(),
185 'required' => []
186 ]
187 ];
188
189 if ( !empty( $this->parameters ) ) {
190 $properties = [];
191 $required = [];
192 foreach ( $this->parameters as $parameter ) {
193 $properties[$parameter->name] = [
194 'type' => $parameter->type,
195 'description' => $parameter->description,
196 ];
197
198 // If the parameter type is "array" and has a "items" attribute, include it
199 if ( $parameter->type === 'array' ) {
200 $properties[$parameter->name]['items'] = [
201 'type' => 'string',
202 ];
203 }
204
205 if ( isset( $parameter->enum ) ) {
206 $properties[$parameter->name]['enum'] = $parameter->enum;
207 }
208 if ( $parameter->required ) {
209 $required[] = $parameter->name;
210 }
211 }
212 // Gemini requires properties to be an object (stdClass), not an array
213 $json['parameters']['properties'] = empty( $properties ) ? new stdClass() : (object) $properties;
214 $json['parameters']['required'] = $required;
215 }
216
217 return $json;
218 }
219
220 public static function fromJson( array $json ): Meow_MWAI_Query_Function {
221 $funcName = $json['name'];
222 $funcDesc = $json['description'] ?? '';
223 $funcType = $json['type'] ?? null;
224 $funcId = $json['id'] ?? null;
225 $funcTarget = $json['target'] ?? null;
226 $funcBehavior = $json['behavior'] ?? null;
227 if ( $funcId === null && !empty( $json['snippetId'] ) ) {
228 $funcId = $json['snippetId'];
229 }
230 $args = [];
231 if ( !empty( $json['args'] ) ) {
232 foreach ( $json['args'] as $arg ) {
233 $name = ltrim( $arg['name'], '$' );
234 $desc = $arg['description'] ?? null;
235 $type = $arg['type'] ?? 'string';
236 $required = $arg['required'] ?? false;
237 $args[] = new Meow_MWAI_Query_Parameter( $name, $desc, $type, $required );
238 }
239 }
240 return new self( $funcName, $funcDesc, $args, $funcType, $funcId, $funcTarget, $funcBehavior );
241 }
242
243 public static function toJson( Meow_MWAI_Query_Function $function ): array {
244 $json = [
245 'name' => $function->name,
246 'desc' => $function->description,
247 'type' => $function->type,
248 'id' => $function->id,
249 'target' => $function->target,
250 'behavior' => $function->behavior,
251 'args' => [],
252 ];
253
254 foreach ( $function->parameters as $param ) {
255 $json['args'][] = [
256 'name' => $param->name,
257 'desc' => $param->description,
258 'type' => $param->type,
259 'required' => $param->required,
260 ];
261 }
262
263 return $json;
264 }
265 }
266