PluginProbe ʕ •ᴥ•ʔ
AI Engine – The Chatbot, AI Framework & MCP for WordPress / 3.0.0
AI Engine – The Chatbot, AI Framework & MCP for WordPress v3.0.0
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 / exceptions / function-call-exception.php
ai-engine / classes / exceptions Last commit date
function-call-exception.php 1 year ago
function-call-exception.php
184 lines
1 <?php
2
3 /**
4 * Specialized exception for function calling errors.
5 *
6 * Provides detailed context about what went wrong during
7 * function calling operations.
8 */
9 class Meow_MWAI_FunctionCallException extends Exception {
10 private array $context = [];
11
12 /**
13 * Error codes for different scenarios
14 */
15 public const ERROR_NO_TOOL_CALL_FOUND = 'no_tool_call_found';
16 public const ERROR_INVALID_RESPONSE_ID = 'invalid_response_id';
17 public const ERROR_FUNCTION_EXECUTION_FAILED = 'function_execution_failed';
18 public const ERROR_MISSING_FUNCTION_HANDLER = 'missing_function_handler';
19 public const ERROR_INVALID_ARGUMENTS = 'invalid_arguments';
20 public const ERROR_LOOP_DETECTED = 'loop_detected';
21
22 public function __construct(
23 string $message,
24 string $errorCode,
25 array $context = [],
26 ?Throwable $previous = null
27 ) {
28 $this->context = $context;
29 $detailedMessage = $this->build_detailed_message( $message, $errorCode, $context );
30 parent::__construct( $detailedMessage, 0, $previous );
31 }
32
33 /**
34 * Build a detailed error message with context
35 */
36 private function build_detailed_message( string $message, string $errorCode, array $context ): string {
37 $details = [$message];
38
39 switch ( $errorCode ) {
40 case self::ERROR_NO_TOOL_CALL_FOUND:
41 $callId = $context['call_id'] ?? 'unknown';
42 $details[] = sprintf(
43 'Function call mismatch: Expected call_id "%s" not found in conversation.',
44 $callId
45 );
46 $details[] = 'Ensure previous_response_id is set and function_call is echoed before function_call_output.';
47 if ( !empty( $context['available_calls'] ) ) {
48 $details[] = 'Available call IDs: ' . implode( ', ', $context['available_calls'] );
49 }
50 break;
51
52 case self::ERROR_INVALID_RESPONSE_ID:
53 $responseId = $context['response_id'] ?? 'unknown';
54 $expectedFormat = $context['expected_format'] ?? 'unknown';
55 $details[] = sprintf(
56 'Invalid response ID format: "%s" does not match expected format "%s".',
57 $responseId,
58 $expectedFormat
59 );
60 if ( !empty( $context['api_type'] ) ) {
61 $details[] = sprintf(
62 'The %s requires response IDs starting with "%s".',
63 $context['api_type'],
64 $context['expected_prefix'] ?? ''
65 );
66 }
67 break;
68
69 case self::ERROR_FUNCTION_EXECUTION_FAILED:
70 $functionName = $context['function_name'] ?? 'unknown';
71 $details[] = sprintf( 'Function "%s" execution failed.', $functionName );
72 if ( !empty( $context['error_details'] ) ) {
73 $details[] = 'Error details: ' . $context['error_details'];
74 }
75 break;
76
77 case self::ERROR_MISSING_FUNCTION_HANDLER:
78 $functionName = $context['function_name'] ?? 'unknown';
79 $details[] = sprintf(
80 'No handler registered for function "%s".',
81 $functionName
82 );
83 $details[] = 'Ensure the function is registered using add_filter("mwai_functions_list", ...).';
84 break;
85
86 case self::ERROR_INVALID_ARGUMENTS:
87 $functionName = $context['function_name'] ?? 'unknown';
88 $details[] = sprintf(
89 'Invalid arguments provided for function "%s".',
90 $functionName
91 );
92 if ( !empty( $context['validation_errors'] ) ) {
93 $details[] = 'Validation errors: ' . implode( ', ', $context['validation_errors'] );
94 }
95 break;
96
97 case self::ERROR_LOOP_DETECTED:
98 $maxDepth = $context['max_depth'] ?? 5;
99 $details[] = sprintf(
100 'Function call loop detected after %d iterations.',
101 $maxDepth
102 );
103 $details[] = 'The AI model is repeatedly calling functions without reaching a conclusion.';
104 if ( !empty( $context['call_stack'] ) ) {
105 $details[] = 'Call stack: ' . implode( '', $context['call_stack'] );
106 }
107 break;
108 }
109
110 // Add debug information if available
111 if ( !empty( $context['debug_info'] ) ) {
112 $details[] = 'Debug info: ' . json_encode( $context['debug_info'] );
113 }
114
115 return implode( ' ', $details );
116 }
117
118 /**
119 * Get the error context
120 */
121 public function get_context(): array {
122 return $this->context;
123 }
124
125 /**
126 * Create specific error instances
127 */
128 public static function no_tool_call_found( string $callId, array $availableCalls = [] ): self {
129 return new self(
130 'No tool call found for function call output.',
131 self::ERROR_NO_TOOL_CALL_FOUND,
132 [
133 'call_id' => $callId,
134 'available_calls' => $availableCalls
135 ]
136 );
137 }
138
139 public static function invalid_response_id( string $responseId, string $apiType, string $expectedPrefix ): self {
140 return new self(
141 'Invalid response ID format.',
142 self::ERROR_INVALID_RESPONSE_ID,
143 [
144 'response_id' => $responseId,
145 'api_type' => $apiType,
146 'expected_format' => $expectedPrefix . '...',
147 'expected_prefix' => $expectedPrefix
148 ]
149 );
150 }
151
152 public static function function_execution_failed( string $functionName, string $errorDetails ): self {
153 return new self(
154 'Function execution failed.',
155 self::ERROR_FUNCTION_EXECUTION_FAILED,
156 [
157 'function_name' => $functionName,
158 'error_details' => $errorDetails
159 ]
160 );
161 }
162
163 public static function missing_function_handler( string $functionName ): self {
164 return new self(
165 'Missing function handler.',
166 self::ERROR_MISSING_FUNCTION_HANDLER,
167 [
168 'function_name' => $functionName
169 ]
170 );
171 }
172
173 public static function loop_detected( int $maxDepth, array $callStack = [] ): self {
174 return new self(
175 'Function call loop detected.',
176 self::ERROR_LOOP_DETECTED,
177 [
178 'max_depth' => $maxDepth,
179 'call_stack' => $callStack
180 ]
181 );
182 }
183 }
184