Author: @christianbeeznestpull/4601/head
							parent
							
								
									e9c14f16a9
								
							
						
					
					
						commit
						f86cf35055
					
				@ -0,0 +1,89 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
class LpAiHelper | 
				
			||||
{ | 
				
			||||
    /** | 
				
			||||
     * AiHelper constructor. | 
				
			||||
     * Requires plugin ai_helper to connect to the api. | 
				
			||||
     */ | 
				
			||||
    public function __construct() | 
				
			||||
    { | 
				
			||||
        if ('true' !== api_get_plugin_setting('ai_helper', 'tool_enable')) { | 
				
			||||
            return false; | 
				
			||||
        } | 
				
			||||
    } | 
				
			||||
 | 
				
			||||
    /** | 
				
			||||
     * Get the form to generate Lp items using Ai Helper. | 
				
			||||
     */ | 
				
			||||
    public function aiHelperForm() | 
				
			||||
    { | 
				
			||||
        $form = new FormValidator( | 
				
			||||
            'lp_ai_generate', | 
				
			||||
            'post', | 
				
			||||
            api_get_self()."?".api_get_cidreq(), | 
				
			||||
            null | 
				
			||||
        ); | 
				
			||||
        $form->addElement('header', get_lang('LpAiGenerator')); | 
				
			||||
        $form->addElement('text', 'lp_name', [get_lang('LpAiTopic'), get_lang('LpAiTopicHelp')]); | 
				
			||||
        $form->addRule('lp_name', get_lang('ThisFieldIsRequired'), 'required'); | 
				
			||||
        $form->addElement('number', 'nro_items', [get_lang('LpAiNumberOfItems'), get_lang('LpAiNumberOfItemsHelper')]); | 
				
			||||
        $form->addRule('nro_items', get_lang('ThisFieldIsRequired'), 'required'); | 
				
			||||
        $form->addElement('number', 'words_count', [get_lang('LpAiWordsCount'), get_lang('LpAiWordsCountHelper')]); | 
				
			||||
        $form->addRule('words_count', get_lang('ThisFieldIsRequired'), 'required'); | 
				
			||||
 | 
				
			||||
        $generateUrl = api_get_path(WEB_PLUGIN_PATH).'ai_helper/tool/learnpath.php'; | 
				
			||||
        $language = api_get_interface_language(); | 
				
			||||
        $courseCode = api_get_course_id(); | 
				
			||||
        $sessionId = api_get_session_id(); | 
				
			||||
        $redirectSuccess = api_get_path(WEB_CODE_PATH).'lp/lp_controller.php?'.api_get_cidreq().'&action=add_item&type=step&isStudentView=false&lp_id='; | 
				
			||||
        $form->addHtml('<script> | 
				
			||||
                $(function () { | 
				
			||||
                    $("#create-lp-ai").on("click", function (e) { | 
				
			||||
                      e.preventDefault(); | 
				
			||||
                      e.stopPropagation(); | 
				
			||||
 | 
				
			||||
                      var btnGenerate = $(this); | 
				
			||||
                      var lpName = $("[name=\'lp_name\']").val(); | 
				
			||||
                      var nroItems = parseInt($("[name=\'nro_items\']").val()); | 
				
			||||
                      var wordsCount = parseInt($("[name=\'words_count\']").val()); | 
				
			||||
                      var valid = (lpName != \'\' && nroItems > 0 && wordsCount > 0); | 
				
			||||
 | 
				
			||||
                      if (valid) { | 
				
			||||
                        btnGenerate.attr("disabled", true); | 
				
			||||
                        btnGenerate.text("'.get_lang('PleaseWaitThisCouldTakeAWhile').'"); | 
				
			||||
                        $.getJSON("'.$generateUrl.'", { | 
				
			||||
                            "lp_name": lpName, | 
				
			||||
                            "nro_items": nroItems, | 
				
			||||
                            "words_count": wordsCount, | 
				
			||||
                            "language": "'.$language.'", | 
				
			||||
                            "course_code": "'.$courseCode.'", | 
				
			||||
                            "session_id": "'.$sessionId.'" | 
				
			||||
                        }).done(function (data) { | 
				
			||||
                          btnGenerate.attr("disabled", false); | 
				
			||||
                          btnGenerate.text("'.get_lang('Generate').'"); | 
				
			||||
                          if (data.success && data.success == true) { | 
				
			||||
                            location.href = "'.$redirectSuccess.'" + data.lp_id; | 
				
			||||
                          } else { | 
				
			||||
                            alert("'.get_lang('NoSearchResults').'. '.get_lang('PleaseTryAgain').'"); | 
				
			||||
                          } | 
				
			||||
                        }); | 
				
			||||
                      } | 
				
			||||
                    }); | 
				
			||||
                }); | 
				
			||||
            </script>'); | 
				
			||||
 | 
				
			||||
        $form->addButton( | 
				
			||||
            'create_lp_button', | 
				
			||||
            get_lang('CreateLp'), | 
				
			||||
            '', | 
				
			||||
            'default', | 
				
			||||
            'default', | 
				
			||||
            null, | 
				
			||||
            ['id' => 'create-lp-ai'] | 
				
			||||
        ); | 
				
			||||
 | 
				
			||||
        echo $form->returnForm(); | 
				
			||||
    } | 
				
			||||
} | 
				
			||||
@ -0,0 +1,28 @@ | 
				
			||||
<?php | 
				
			||||
/* For licensing terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
$this_section = SECTION_COURSES; | 
				
			||||
api_protect_course_script(); | 
				
			||||
 | 
				
			||||
$interbreadcrumb[] = [ | 
				
			||||
    'url' => 'lp_controller.php?action=list&'.api_get_cidreq(), | 
				
			||||
    'name' => get_lang('LearningPaths'), | 
				
			||||
]; | 
				
			||||
 | 
				
			||||
Display::display_header(get_lang('CreateLpWithAiHelper'), 'Learnpath'); | 
				
			||||
 | 
				
			||||
echo '<div class="actions">'; | 
				
			||||
echo '<a href="lp_controller.php?'.api_get_cidreq().'">'. | 
				
			||||
    Display::return_icon( | 
				
			||||
        'back.png', | 
				
			||||
        get_lang('ReturnToLearningPaths'), | 
				
			||||
        '', | 
				
			||||
        ICON_SIZE_MEDIUM | 
				
			||||
    ).'</a>'; | 
				
			||||
echo '</div>'; | 
				
			||||
 | 
				
			||||
$aiHelper = new LpAiHelper(); | 
				
			||||
 | 
				
			||||
$aiHelper->aiHelperForm(); | 
				
			||||
 | 
				
			||||
Display::display_footer(); | 
				
			||||
@ -0,0 +1,104 @@ | 
				
			||||
<?php | 
				
			||||
/* For license terms, see /license.txt */ | 
				
			||||
 | 
				
			||||
/** | 
				
			||||
Create a learnpath with contents based on existing knowledge. | 
				
			||||
 */ | 
				
			||||
require_once __DIR__.'/../../../main/inc/global.inc.php'; | 
				
			||||
require_once __DIR__.'/../AiHelperPlugin.php'; | 
				
			||||
 | 
				
			||||
$plugin = AiHelperPlugin::create(); | 
				
			||||
 | 
				
			||||
$apiList = $plugin->getApiList(); | 
				
			||||
$apiName = $plugin->get('api_name'); | 
				
			||||
 | 
				
			||||
if (!in_array($apiName, array_keys($apiList))) { | 
				
			||||
    throw new Exception("Ai API is not available for this request."); | 
				
			||||
} | 
				
			||||
 | 
				
			||||
switch ($apiName) { | 
				
			||||
    case AiHelperPlugin::OPENAI_API: | 
				
			||||
 | 
				
			||||
        $courseLanguage = (string) $_REQUEST['language']; | 
				
			||||
        $chaptersCount = (int) $_REQUEST['nro_items']; | 
				
			||||
        $topic = (string) $_REQUEST['lp_name']; | 
				
			||||
        $wordsCount = (int) $_REQUEST['words_count']; | 
				
			||||
        $courseCode = (string) $_REQUEST['course_code']; | 
				
			||||
        $sessionId = (int) $_REQUEST['session_id']; | 
				
			||||
 | 
				
			||||
        $messageGetItems = 'Generate the table of contents of a course in "%s" in %d or less chapters on the topic of "%s" in a list separated with comma, without chapter number'; | 
				
			||||
        $prompt = sprintf($messageGetItems, $courseLanguage, $chaptersCount, $topic); | 
				
			||||
        $resultText = $plugin->openAiGetCompletionText($prompt); | 
				
			||||
        $lpItems = []; | 
				
			||||
        if (!empty($resultText)) { | 
				
			||||
            $items = explode(',', $resultText); | 
				
			||||
            $position = 1; | 
				
			||||
            foreach ($items as $item) { | 
				
			||||
                $explodedItem = preg_split('/\d\./', $item); | 
				
			||||
                $title = count($explodedItem) > 1 ? $explodedItem[1] : $explodedItem[0]; | 
				
			||||
                if (!empty($title)) { | 
				
			||||
                    $lpItems[$position]['title'] = trim($title); | 
				
			||||
                    $messageGetItemContent = 'In the context of "%s", generate a document with HTML tags in "%s" with %d words of content or less, about "%s"'; | 
				
			||||
                    $promptItem = sprintf($messageGetItemContent, $topic, $courseLanguage, $wordsCount, $title); | 
				
			||||
                    $resultContentText = $plugin->openAiGetCompletionText($promptItem); | 
				
			||||
                    if (!empty($resultContentText)) { | 
				
			||||
                        $lpItems[$position]['content'] = trim($resultContentText); | 
				
			||||
                    } | 
				
			||||
                    $position++; | 
				
			||||
                } | 
				
			||||
            } | 
				
			||||
        } | 
				
			||||
 | 
				
			||||
        // Create the learnpath and return the id generated. | 
				
			||||
        $return = ['success' => false, 'lp_id' => 0]; | 
				
			||||
        if (!empty($lpItems)) { | 
				
			||||
            $lpId = learnpath::add_lp( | 
				
			||||
                $courseCode, | 
				
			||||
                $topic, | 
				
			||||
                '', | 
				
			||||
                'chamilo', | 
				
			||||
                'manual' | 
				
			||||
            ); | 
				
			||||
 | 
				
			||||
            if (!empty($lpId)) { | 
				
			||||
                learnpath::toggle_visibility($lpId, 0); | 
				
			||||
                $courseInfo = api_get_course_info($courseCode); | 
				
			||||
                $lp = new \learnpath( | 
				
			||||
                    $courseCode, | 
				
			||||
                    $lpId, | 
				
			||||
                    api_get_user_id() | 
				
			||||
                ); | 
				
			||||
                $lp->generate_lp_folder($courseInfo, $topic); | 
				
			||||
 | 
				
			||||
                foreach ($lpItems as $dspOrder => $item) { | 
				
			||||
                    $documentId = $lp->create_document( | 
				
			||||
                        $courseInfo, | 
				
			||||
                        $item['content'], | 
				
			||||
                        $item['title'], | 
				
			||||
                        'html' | 
				
			||||
                    ); | 
				
			||||
 | 
				
			||||
                    if (!empty($documentId)) { | 
				
			||||
                        $lpItemId = $lp->add_item( | 
				
			||||
                            0, | 
				
			||||
                            0, | 
				
			||||
                            'document', | 
				
			||||
                            $documentId, | 
				
			||||
                            $item['title'], | 
				
			||||
                            '', | 
				
			||||
                            0, | 
				
			||||
                            0, | 
				
			||||
                            api_get_user_id(), | 
				
			||||
                            $dspOrder | 
				
			||||
                        ); | 
				
			||||
                    } | 
				
			||||
                } | 
				
			||||
            } | 
				
			||||
            $return = [ | 
				
			||||
                'success' => true, | 
				
			||||
                'lp_id' => $lpId, | 
				
			||||
            ]; | 
				
			||||
        } | 
				
			||||
        echo json_encode($return); | 
				
			||||
        break; | 
				
			||||
} | 
				
			||||
					Loading…
					
					
				
		Reference in new issue