PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.1.8
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.1.8
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 / dropped-file.php
ai-engine / classes / query Last commit date
assist-feedback.php 10 months ago assistant.php 8 months ago base.php 8 months ago dropped-file.php 8 months ago edit-image.php 8 months ago embed.php 10 months ago feedback.php 10 months ago function.php 8 months ago image.php 8 months ago parameter.php 1 year ago text.php 8 months ago transcribe.php 8 months ago
dropped-file.php
204 lines
1 <?php
2
3 class Meow_MWAI_Query_DroppedFile {
4 private $data;
5 private $rawData;
6 private $type; // Defines what the data is about ('refId', 'url', or 'data')
7 private $purpose; // Can be 'assistant', 'vision' or 'files' => this needs to be checked
8 private $mimeType; // 'image/jpeg' or any other mime type
9 private $fileId; // The ID of the file in the database
10 public $originalPath; // The original file path (for files loaded from disk)
11
12 public static function from_url( $url, $purpose, $mimeType = null, $fileId = null ) {
13 if ( empty( $mimeType ) ) {
14 $mimeType = Meow_MWAI_Core::get_mime_type( $url );
15 }
16 return new Meow_MWAI_Query_DroppedFile( $url, 'url', $purpose, $mimeType, $fileId );
17 }
18
19 public static function from_data( $data, $purpose, $mimeType = null ) {
20 return new Meow_MWAI_Query_DroppedFile( $data, 'data', $purpose, $mimeType );
21 }
22
23 public static function from_path( $path, $purpose, $mimeType = null ) {
24 $data = file_get_contents( $path );
25 if ( empty( $mimeType ) ) {
26 $mimeType = Meow_MWAI_Core::get_mime_type( $path );
27 }
28 $droppedFile = new Meow_MWAI_Query_DroppedFile( $data, 'data', $purpose, $mimeType );
29 // Store the original path for filename extraction
30 $droppedFile->originalPath = $path;
31 return $droppedFile;
32 }
33
34 public static function from_refId( $refId, $purpose, $mimeType = null ) {
35 return new Meow_MWAI_Query_DroppedFile( $refId, 'refId', $purpose, $mimeType );
36 }
37
38 /**
39 * Create DroppedFile from provider file_id reference (OpenAI, Anthropic, etc.)
40 *
41 * For PDFs uploaded to provider Files APIs, we only store the file_id
42 * Examples: OpenAI 'file-xxx', Anthropic 'file_xxx'
43 * These are reference-only - the file data lives on the provider's servers
44 * Do NOT try to load file data from these - use get_refId() to get the file_id
45 */
46 public static function from_provider_file_id( $fileId, $purpose, $mimeType = null ) {
47 return new Meow_MWAI_Query_DroppedFile( $fileId, 'provider_file_id', $purpose, $mimeType );
48 }
49
50 /**
51 * @deprecated Use from_provider_file_id() instead
52 * Kept for backward compatibility
53 */
54 public static function from_openai_file_id( $fileId, $purpose, $mimeType = null ) {
55 return self::from_provider_file_id( $fileId, $purpose, $mimeType );
56 }
57
58 public function __construct( $data, $type, $purpose, $mimeType = null, $fileId = null ) {
59 // Support both old 'openai_file_id' and new 'provider_file_id' for backward compatibility
60 if ( $type === 'openai_file_id' ) {
61 $type = 'provider_file_id';
62 }
63 if ( !empty( $type ) && $type !== 'refId' && $type !== 'url' && $type !== 'data' && $type !== 'provider_file_id' ) {
64 throw new Exception( 'AI Engine: The file type can only be refId, url, data, or provider_file_id.' );
65 }
66 if ( !empty( $purpose ) && $purpose !== 'assistant-in' && $purpose !== 'vision' && $purpose !== 'files' ) {
67 throw new Exception( 'AI Engine: The file purpose can only be assistant, vision or files.' );
68 }
69 $this->data = $data;
70 $this->type = $type;
71 $this->purpose = $purpose;
72 $this->mimeType = $mimeType;
73 $this->fileId = $fileId;
74 }
75
76 public function get_url() {
77 if ( $this->type === 'url' ) {
78 return $this->data;
79 }
80 throw new Exception( 'AI Engine: The file is not an URL.' );
81 }
82
83 private function get_raw_data() {
84 if ( !empty( $this->rawData ) ) {
85 return $this->rawData;
86 }
87 if ( $this->type === 'provider_file_id' ) {
88 // Provider file IDs are reference-only (file data lives on provider's servers)
89 // Common mistake: trying to load file data for PDFs in conversation history
90 // Fix: Check file mime type before calling get_data()/get_base64()/get_inline_base64_url()
91 // For PDFs: use get_refId() to get the file_id string instead
92 throw new Exception( 'AI Engine: Cannot get raw data for provider file ID (file_id: ' . $this->data . '). Use get_refId() instead.' );
93 }
94 if ( $this->type === 'refId' ) {
95 // For refId, fetch the URL from database and load the file
96 global $mwai_core;
97 $url = $mwai_core->files->get_url( $this->data );
98 if ( empty( $url ) ) {
99 throw new Exception( 'AI Engine: Could not find file URL for refId: ' . $this->data );
100 }
101 // Validate URL scheme to prevent SSRF attacks
102 $parts = wp_parse_url( $url );
103 if ( ! isset( $parts['scheme'] ) || ! in_array( $parts['scheme'], [ 'http', 'https' ], true ) ) {
104 throw new Exception( 'Invalid URL scheme; only HTTP/HTTPS allowed.' );
105 }
106 $this->rawData = file_get_contents( $url );
107 return $this->rawData;
108 }
109 else if ( $this->type === 'url' ) {
110 // Validate URL scheme to prevent SSRF attacks
111 $parts = wp_parse_url( $this->data );
112 if ( ! isset( $parts['scheme'] ) || ! in_array( $parts['scheme'], [ 'http', 'https' ], true ) ) {
113 throw new Exception( 'Invalid URL scheme; only HTTP/HTTPS allowed.' );
114 }
115
116 $this->rawData = file_get_contents( $this->data );
117 return $this->rawData;
118 }
119 else if ( $this->type === 'data' ) {
120 return $this->data;
121 }
122 throw new Exception( 'AI Engine: The file is not data or an URL.' );
123 }
124
125 public function get_data() {
126 if ( $this->type === 'provider_file_id' ) {
127 // Provider file IDs are just references, no data loading needed
128 throw new Exception( 'AI Engine: Cannot get data for provider file ID. Use get_refId() instead.' );
129 }
130 if ( $this->type === 'refId' || $this->type === 'url' ) {
131 return $this->get_raw_data();
132 }
133 else if ( $this->type === 'data' ) {
134 return $this->data;
135 }
136 throw new Exception( 'AI Engine: The file is not data or an URL.' );
137 }
138
139 public function get_base64() {
140 $data = $this->get_raw_data();
141 return base64_encode( $data );
142 }
143
144 // Will return something like "data:image/jpeg;base64,{data}"
145 public function get_inline_base64_url() {
146 $b64 = $this->get_base64();
147 return "data:{$this->mimeType};base64,{$b64}";
148 }
149
150 public function get_type() {
151 return $this->type;
152 }
153
154 public function get_purpose() {
155 return $this->purpose;
156 }
157
158 public function get_mimeType() {
159 return $this->mimeType;
160 }
161
162 public function is_image() {
163 return strpos( $this->mimeType, 'image' ) !== false;
164 }
165
166 public function get_fileId() {
167 return $this->fileId;
168 }
169
170 public function get_refId() {
171 if ( $this->type === 'refId' || $this->type === 'provider_file_id' ) {
172 return $this->data;
173 }
174 return null;
175 }
176
177 // Return a filename for this file. If the file is an URL, use the basename of
178 // its path. If the file is raw data, generate a generic name based on the mime type.
179 public function get_filename() {
180 // If we have an original path (from from_path), use its basename
181 if ( !empty( $this->originalPath ) ) {
182 return basename( $this->originalPath );
183 }
184 if ( $this->type === 'refId' ) {
185 global $mwai_core;
186 $path = $mwai_core->files->get_path( $this->data );
187 return basename( $path );
188 }
189 if ( $this->type === 'url' ) {
190 $path = parse_url( $this->data, PHP_URL_PATH );
191 return basename( $path );
192 }
193 if ( $this->type === 'data' ) {
194 if ( !empty( $this->mimeType ) ) {
195 $parts = explode( '/', $this->mimeType );
196 $ext = end( $parts );
197 return 'file.' . $ext;
198 }
199 return 'file.bin';
200 }
201 return 'file';
202 }
203 }
204