RegisterPrivate('process_ai_message', 'ProcessAIMessage'); $this->RegisterPrivate('build_ai_prompt', 'BuildAIPrompt'); $this->RegisterPrivate('process_external_response', 'ProcessExternalResponse'); } public function GetDefaultNonce() { return 'rnai'; } public function ProcessAIMessage() { $message = $this->GetRequired('message'); $history = $this->GetRequired('history'); $model = $this->GetRequired('model'); $messageType = $this->GetRequired('messageType'); // Collect uploaded files $files = $this->CollectUploadedFiles(); switch ($messageType) { case 'form-generation': $formGenerator = new AIFormGenerator(APiCallerBase::GetCallerByName($model)); $this->SendSuccessMessage($formGenerator->Generate($message, $history, $files)); break; case 'form-logic-generation': $fields = $this->GetOptional('fields', ''); $logicGenerator = new AIFormLogicGenerator(APiCallerBase::GetCallerByName($model)); $this->SendSuccessMessage($logicGenerator->Generate($message, $history, $fields)); break; case 'form-designer-contextual': $form = $this->GetRequired('form'); $promptName = $this->GetOptional('promptName', ''); $formGenerator = new AIContextualFormDesigner(APiCallerBase::GetCallerByName($model)); $formGenerator->PromptName = $promptName; $this->SendSuccessMessage($formGenerator->Generate($message, $history, $form, $files)); break; case 'formula-generator': $form = $this->GetRequired('form'); $targetFieldId = $this->GetOptional('targetFieldId', ''); $expectedReturnType = $this->GetOptional('expectedReturnType', 'any'); $formulaGenerator = new AIFormulaGenerator(APiCallerBase::GetCallerByName($model)); $this->SendSuccessMessage($formulaGenerator->Generate($message, $history, $form, $targetFieldId, $expectedReturnType)); break; case 'condition-generator': $form = $this->GetRequired('form'); $targetFieldId = $this->GetOptional('targetFieldId', ''); $conditionContext = $this->GetOptional('conditionContext', null); $conditionGenerator = new AIConditionGenerator(APiCallerBase::GetCallerByName($model)); $this->SendSuccessMessage($conditionGenerator->Generate($message, $history, $form, $targetFieldId, $conditionContext)); break; case 'style-designer': $form = $this->GetRequired('form'); $styleGenerator = new AIStyleGenerator(APiCallerBase::GetCallerByName($model)); $this->SendSuccessMessage($styleGenerator->Generate($message, $history, $form, $files)); break; } } /** * Build the AI prompt without calling the API. * Used for external chat mode. */ public function BuildAIPrompt() { $message = $this->GetRequired('message'); $history = $this->GetRequired('history'); $messageType = $this->GetRequired('messageType'); switch ($messageType) { case 'form-generation': $formGenerator = new AIFormGenerator(); $this->SendSuccessMessage($formGenerator->BuildPromptOnly($message, $history)); break; case 'form-logic-generation': $fields = $this->GetOptional('fields', ''); $logicGenerator = new AIFormLogicGenerator(); $this->SendSuccessMessage($logicGenerator->BuildPromptOnly($message, $history, $fields)); break; case 'form-designer-contextual': $form = $this->GetRequired('form'); $promptName = $this->GetOptional('promptName', ''); $formGenerator = new AIContextualFormDesigner(); $formGenerator->PromptName = $promptName; $this->SendSuccessMessage($formGenerator->BuildPromptOnly($message, $history, $form)); break; case 'formula-generator': $form = $this->GetRequired('form'); $targetFieldId = $this->GetOptional('targetFieldId', ''); $expectedReturnType = $this->GetOptional('expectedReturnType', 'any'); $formulaGenerator = new AIFormulaGenerator(); $this->SendSuccessMessage($formulaGenerator->BuildPromptOnly($message, $history, $form, $targetFieldId, $expectedReturnType)); break; case 'condition-generator': $form = $this->GetRequired('form'); $targetFieldId = $this->GetOptional('targetFieldId', ''); $conditionContext = $this->GetOptional('conditionContext', null); $conditionGenerator = new AIConditionGenerator(); $this->SendSuccessMessage($conditionGenerator->BuildPromptOnly($message, $history, $form, $targetFieldId, $conditionContext)); break; case 'style-designer': $form = $this->GetRequired('form'); $styleGenerator = new AIStyleGenerator(); $this->SendSuccessMessage($styleGenerator->BuildPromptOnly($message, $history, $form)); break; default: $this->SendErrorMessage('External chat mode is not supported for this message type'); break; } } /** * Process a response pasted from an external chat. */ public function ProcessExternalResponse() { $responseJson = $this->GetRequired('responseJson'); $message = $this->GetRequired('message'); $history = $this->GetRequired('history'); $messageType = $this->GetRequired('messageType'); switch ($messageType) { case 'form-generation': $formGenerator = new AIFormGenerator(); $this->SendSuccessMessage($formGenerator->ProcessExternalResponse($responseJson, $message, $history)); break; case 'form-logic-generation': $logicGenerator = new AIFormLogicGenerator(); $this->SendSuccessMessage($logicGenerator->ProcessExternalResponse($responseJson, $message, $history)); break; case 'form-designer-contextual': $form = $this->GetRequired('form'); $promptName = $this->GetOptional('promptName', ''); $formGenerator = new AIContextualFormDesigner(); $formGenerator->PromptName = $promptName; $this->SendSuccessMessage($formGenerator->ProcessExternalResponse($responseJson, $message, $history, $form)); break; case 'formula-generator': $form = $this->GetRequired('form'); $formulaGenerator = new AIFormulaGenerator(); $this->SendSuccessMessage($formulaGenerator->ProcessExternalResponse($responseJson, $message, $history, $form)); break; case 'condition-generator': $form = $this->GetRequired('form'); $conditionGenerator = new AIConditionGenerator(); $this->SendSuccessMessage($conditionGenerator->ProcessExternalResponse($responseJson, $message, $history, $form)); break; case 'style-designer': $form = $this->GetRequired('form'); $styleGenerator = new AIStyleGenerator(); $this->SendSuccessMessage($styleGenerator->ProcessExternalResponse($responseJson, $message, $history, $form)); break; default: $this->SendErrorMessage('External chat mode is not supported for this message type'); break; } } /** * Collect uploaded files from $_FILES and return as array of base64-encoded file data. */ private function CollectUploadedFiles() { $files = []; if (empty($_FILES)) { return $files; } foreach ($_FILES as $key => $fileInfo) { if ($fileInfo['error'] !== UPLOAD_ERR_OK || empty($fileInfo['tmp_name'])) { continue; } $fileContent = file_get_contents($fileInfo['tmp_name']); if ($fileContent === false) { continue; } $files[] = [ 'mimeType' => $fileInfo['type'], 'data' => base64_encode($fileContent), 'name' => $fileInfo['name'] ]; } return $files; } }