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