Files
MtoRagSystem/src/Controller/Admin/AdminEvalController.php
team 1 6dced1c4df p101
2026-05-12 10:56:50 +02:00

112 lines
4.0 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Controller\Admin;
use App\Security\ApplicationRoles;
use App\Service\Admin\EvalAdminService;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
#[Route('/admin/evals')]
final class AdminEvalController extends AbstractController
{
#[Route('/', name: 'admin_evals_index', methods: ['GET'])]
public function index(Request $request, EvalAdminService $evals): Response
{
$this->denyAccessUnlessGranted(ApplicationRoles::ROLE_KNOWLEDGE_ADMIN);
$selectedType = trim((string) $request->query->get('type', ''));
if ($selectedType === '' || !in_array($selectedType, $evals->supportedTypeNames(), true)) {
$selectedType = 'retrieval';
}
return $this->render('admin/evals/index.html.twig', [
'types' => $evals->supportedTypes(),
'overview' => $evals->overview(),
'cases_by_type' => $evals->casesByType(),
'selected_type' => $selectedType,
'selected_report' => $evals->readTypeReport($selectedType),
'last_report' => $evals->readLastReport(),
]);
}
#[Route('/run', name: 'admin_evals_run', methods: ['POST'])]
public function run(Request $request, EvalAdminService $evals): Response
{
$this->denyAccessUnlessGranted(ApplicationRoles::ROLE_KNOWLEDGE_ADMIN);
if (!$this->isCsrfTokenValid('admin_eval_run', (string) $request->request->get('_token'))) {
throw $this->createAccessDeniedException();
}
$type = trim((string) $request->request->get('type', 'retrieval'));
$caseId = trim((string) $request->request->get('case_id', ''));
try {
$report = $evals->run($type, $caseId !== '' ? $caseId : null);
$type = trim((string) ($report['type'] ?? $type));
$this->addFlash(
((int) ($report['failed'] ?? 0)) === 0 ? 'success' : 'danger',
sprintf(
'Eval %s abgeschlossen: %d/%d bestanden.',
$type,
(int) ($report['passed'] ?? 0),
(int) ($report['total'] ?? 0)
)
);
} catch (\Throwable $e) {
$this->addFlash('danger', $e->getMessage());
}
return $this->redirectToRoute('admin_evals_index', [
'type' => $type,
]);
}
#[Route('/case/create', name: 'admin_evals_case_create', methods: ['POST'])]
public function createCase(Request $request, EvalAdminService $evals): Response
{
$this->denyAccessUnlessGranted(ApplicationRoles::ROLE_KNOWLEDGE_ADMIN);
if (!$this->isCsrfTokenValid('admin_eval_case_create', (string) $request->request->get('_token'))) {
throw $this->createAccessDeniedException();
}
$type = trim((string) $request->request->get('type', 'retrieval'));
try {
$created = $evals->createCase(
type: $type,
id: (string) $request->request->get('id', ''),
prompt: (string) $request->request->get('prompt', ''),
assertJson: (string) $request->request->get('assert_json', ''),
historyJson: (string) $request->request->get('history_json', ''),
requestContextHint: (string) $request->request->get('request_context_hint', ''),
);
$type = (string) ($created['type'] ?? $type);
$this->addFlash(
'success',
sprintf('Eval-Case "%s" wurde in %s.ndjson gespeichert.', (string) ($created['id'] ?? ''), $type)
);
} catch (\Throwable $e) {
$this->addFlash('danger', $e->getMessage());
}
if (!in_array($type, $evals->supportedTypeNames(), true)) {
$type = 'retrieval';
}
return $this->redirectToRoute('admin_evals_index', [
'type' => $type,
]);
}
}