Add AI evaluation for incorrect open answers

This commit is contained in:
Wojtek
2026-10-16 11:53:23 +02:00
parent 53dd9658e8
commit 804c8f5467
9 changed files with 180 additions and 2 deletions
@@ -6,6 +6,8 @@ defined('_JEXEC') or die;
use Joomla\CMS\Factory;
use Joomla\CMS\MVC\Model\BaseDatabaseModel;
use Joomla\CMS\Component\ComponentHelper;
use Komponent\Component\Testquestions\Administrator\Service\AiService;
class ResultModel extends BaseDatabaseModel
{
@@ -72,4 +74,42 @@ class ResultModel extends BaseDatabaseModel
return (bool) $db->updateObject('#__testquestions_results', $row, 'id');
}
public function evaluateWithAi(int $id, int $questionId): string
{
$item = $this->getItem($id);
if (!$item) {
throw new \RuntimeException('Nie znaleziono zapisanego testu.');
}
$answer = $item->answers[$questionId] ?? null;
$question = $item->questions[$questionId] ?? null;
if (!$item || !$answer || !$question || $question->question_type !== 'open' || !empty($answer['correct'])) {
throw new \RuntimeException('Nieprawidłowe pytanie do oceny AI.');
}
$params = ComponentHelper::getParams('com_testquestions');
$feedback = (new AiService())->evaluate(
(string) $params->get('ai_provider', 'openai'),
(string) $params->get('ai_api_key', ''),
strip_tags((string) $question->question),
(string) ($answer['selected'] ?? ''),
(string) $question->answer_open
);
$item->answers[$questionId]['ai_feedback'] = $feedback;
$db = Factory::getContainer()->get('DatabaseDriver');
$row = (object) [
'id' => $id,
'answers' => json_encode($item->answers, JSON_UNESCAPED_UNICODE),
];
if (!$db->updateObject('#__testquestions_results', $row, 'id')) {
throw new \RuntimeException('Nie udało się zapisać oceny AI.');
}
return $feedback;
}
}