target_field; $fields = $item->fields; $intentsText .= $item->intent_text . "\r\n"; /** * @var \rednaoeasycalculationforms\core\Managers\FormManager\Fields\FBFieldBase */ $field = $form->GetFieldById($targetField); if ($field === null) { continue; } $fieldListText .= $field->Options->Id . ": " . $field->Options->Type . "\r\n"; $dataType = $field->Options->Type; $fieldSettings = $descriptor->GetFieldSettingsByFieldType($dataType); foreach ($fieldSettings as $currentSetting) { if (!in_array($currentSetting['name'], $settings)) { $text = $currentSetting['name']; if (isset($currentSetting['usage']) && !empty($currentSetting['usage'])) $text .= ". " . $currentSetting['usage']; if (isset($currentSetting['instructions']) && !empty($currentSetting['instructions'])) $text .= ". Instructions:" . $currentSetting['instructions']; $text .= "\r\n"; $settings[$currentSetting['name']] = [ 'text' => $text, 'used_by' => [] ]; } $settings[$currentSetting['name']]['used_by'][] = $dataType; } } $settingsText = ''; foreach ($settings as $currentSetting) { $settingsText .= $currentSetting['text'] . '.Used By: ' . implode(',', $currentSetting['used_by']) . "\r\n"; } $prompt = file_get_contents(AllInOneForms()->GetLoader()->DIR . '/Managers/AIManagers/AIGenerators/AIContextualFormDesigner/ContextActions/SetFieldSettingContextAction.txt'); $prompt = str_replace('{{LIST_OF_SETTINGS}}', $settingsText, $prompt); $prompt = str_replace('{{LIST_OF_FIELDS}}', $fieldListText, $prompt); $prompt = [ $this->CreateMessage('system', $prompt), $this->CreateMessage('user', $intentsText) ]; $response = $this->GetCaller()->Chat($prompt); $data = json_decode($response); if ($data == null) return null; $data = $this->Sanitize($data, $form, $descriptor); $changesToReturn = []; foreach ($data->changes as $currentChange) { $changesToReturn[] = [ 'ActionType' => 'SetFieldSetting', 'Data' => $currentChange ]; } return $changesToReturn; } /** * @param mixed $data * @param mixed $form * @param mixed $descriptor AIFieldDescriptor * @throws \rednaoeasycalculationforms\core\Exception\FriendlyException * @return void */ public function Sanitize($data, $form, $descriptor) { $changes = Sanitizer::GetValueFromPath($data, 'changes', null); if (!is_array($changes) || count($changes) == 0) throw new FriendlyException('No changes found'); foreach ($changes as $currentChange) { $fieldId = Sanitizer::GetStringValueFromPath($currentChange, 'target_field', defaultValue: null); $field = $form->GetFieldById($fieldId); if ($field === null) throw new FriendlyException('The change can not be done'); if (isset($currentChange->error) && !empty($currentChange->error)) throw new FriendlyException($currentChange->error); $dataType = $field->Options->Type; $fieldDescription = $descriptor->GetField($dataType); if ( !array_filter($fieldDescription['settings'], function ($setting) use ($currentChange) { return $setting === $currentChange->setting || strpos($setting, $currentChange->setting . ':') === 0; }) ) throw new FriendlyException('The setting ' . $currentChange->setting . ' is not valid for the field of type ' . $dataType); $setting = $descriptor->GetSetting($currentChange->setting); if (isset($setting['realName'])) { $currentChange->setting = $setting['realName']; } } return $data; } }