PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.1.7
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.1.7
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 / services / response-id-manager.php
ai-engine / classes / services Last commit date
image.php 8 months ago message-builder.php 8 months ago model-environment.php 8 months ago response-id-manager.php 1 year ago session.php 11 months ago usage-stats.php 8 months ago
response-id-manager.php
203 lines
1 <?php
2
3 /**
4 * Centralized manager for AI response IDs.
5 *
6 * Handles storage, retrieval, and validation of response IDs
7 * used for stateful conversations with various AI APIs.
8 */
9 class Meow_MWAI_Services_ResponseIdManager {
10 private Meow_MWAI_Core $core;
11 private array $cache = [];
12
13 // Response ID patterns for different providers
14 public const OPENAI_RESPONSES_PATTERN = '/^resp_/';
15 public const OPENAI_CHAT_PATTERN = '/^chatcmpl-/';
16 public const ANTHROPIC_PATTERN = '/^msg_/';
17
18 // Expiry time (30 days as per OpenAI's policy)
19 public const EXPIRY_DAYS = 30;
20
21 public function __construct( Meow_MWAI_Core $core ) {
22 $this->core = $core;
23 }
24
25 /**
26 * Store a response ID with metadata
27 */
28 public function store( string $discussionId, string $responseId, array $metadata = [] ): void {
29 $data = [
30 'responseId' => $responseId,
31 'responseDate' => gmdate( 'Y-m-d H:i:s' ),
32 'provider' => $this->detect_provider( $responseId ),
33 'apiType' => $this->detect_api_type( $responseId )
34 ];
35
36 // Merge additional metadata
37 $data = array_merge( $data, $metadata );
38
39 // Cache for current request
40 $this->cache[$discussionId] = $data;
41
42 // Let the discussion system handle persistence
43 // This is called by the chatbot module when storing discussions
44 }
45
46 /**
47 * Retrieve a response ID if valid
48 */
49 public function retrieve( string $discussionId, array $extra = [] ): ?string {
50 // Check cache first
51 if ( isset( $this->cache[$discussionId] ) ) {
52 $data = $this->cache[$discussionId];
53 return $this->is_valid_data( $data ) ? $data['responseId'] : null;
54 }
55
56 // Check provided extra data (from discussion storage)
57 if ( !empty( $extra['responseId'] ) ) {
58 $responseDate = $extra['responseDate'] ?? null;
59
60 if ( $this->is_valid_date( $responseDate ) ) {
61 // Cache for future use in this request
62 $this->cache[$discussionId] = $extra;
63 return $extra['responseId'];
64 }
65 }
66
67 return null;
68 }
69
70 /**
71 * Validate a response ID for a specific API type
72 */
73 public function validate( string $responseId, string $apiType ): bool {
74 switch ( $apiType ) {
75 case 'openai_responses':
76 return $this->is_responses_api_id( $responseId );
77
78 case 'openai_chat':
79 return $this->is_chat_completions_id( $responseId );
80
81 case 'anthropic':
82 return $this->is_anthropic_id( $responseId );
83
84 default:
85 return true; // Allow unknown types
86 }
87 }
88
89 /**
90 * Check if ID is from OpenAI Responses API
91 */
92 public function is_responses_api_id( string $responseId ): bool {
93 return preg_match( self::OPENAI_RESPONSES_PATTERN, $responseId ) === 1;
94 }
95
96 /**
97 * Check if ID is from OpenAI Chat Completions API
98 */
99 public function is_chat_completions_id( string $responseId ): bool {
100 return preg_match( self::OPENAI_CHAT_PATTERN, $responseId ) === 1;
101 }
102
103 /**
104 * Check if ID is from Anthropic
105 */
106 public function is_anthropic_id( string $responseId ): bool {
107 return preg_match( self::ANTHROPIC_PATTERN, $responseId ) === 1;
108 }
109
110 /**
111 * Check if a response ID is valid for OpenAI Responses API
112 * (Alias for is_responses_api_id for backward compatibility)
113 */
114 public function is_valid_for_responses_api( string $responseId ): bool {
115 return $this->is_responses_api_id( $responseId );
116 }
117
118 /**
119 * Detect provider from response ID format
120 */
121 private function detect_provider( string $responseId ): string {
122 if ( $this->is_responses_api_id( $responseId ) ) {
123 return 'openai';
124 }
125 if ( $this->is_chat_completions_id( $responseId ) ) {
126 return 'openai';
127 }
128 if ( $this->is_anthropic_id( $responseId ) ) {
129 return 'anthropic';
130 }
131 return 'unknown';
132 }
133
134 /**
135 * Detect API type from response ID format
136 */
137 private function detect_api_type( string $responseId ): string {
138 if ( $this->is_responses_api_id( $responseId ) ) {
139 return 'responses_api';
140 }
141 if ( $this->is_chat_completions_id( $responseId ) ) {
142 return 'chat_completions';
143 }
144 if ( $this->is_anthropic_id( $responseId ) ) {
145 return 'messages_api';
146 }
147 return 'unknown';
148 }
149
150 /**
151 * Check if stored data is still valid
152 */
153 private function is_valid_data( array $data ): bool {
154 if ( empty( $data['responseId'] ) ) {
155 return false;
156 }
157
158 $responseDate = $data['responseDate'] ?? null;
159 return $this->is_valid_date( $responseDate );
160 }
161
162 /**
163 * Check if a response date is within validity period
164 */
165 private function is_valid_date( ?string $responseDate ): bool {
166 if ( empty( $responseDate ) ) {
167 return false;
168 }
169
170 $date = strtotime( $responseDate );
171 if ( $date === false ) {
172 return false;
173 }
174
175 $expiryTime = time() - ( self::EXPIRY_DAYS * 24 * 60 * 60 );
176 return $date > $expiryTime;
177 }
178
179 /**
180 * Clean up expired response IDs (for maintenance)
181 */
182 public function cleanup_expired(): int {
183 // This would be called by a scheduled task
184 // Implementation depends on how discussions are stored
185 // Return count of cleaned items
186 return 0;
187 }
188
189 /**
190 * Get debug information about a response ID
191 */
192 public function get_debug_info( string $responseId ): array {
193 return [
194 'id' => $responseId,
195 'provider' => $this->detect_provider( $responseId ),
196 'api_type' => $this->detect_api_type( $responseId ),
197 'is_valid_responses_api' => $this->is_responses_api_id( $responseId ),
198 'is_valid_chat_completions' => $this->is_chat_completions_id( $responseId ),
199 'is_valid_anthropic' => $this->is_anthropic_id( $responseId )
200 ];
201 }
202 }
203