# Challenge Service - Руководство для преподавателей Специальное руководство для пользователей с ролью `teacher` в Keycloak. ## Требования Для создания и редактирования заданий и цепочек необходимо: 1. Быть авторизованным через Keycloak 2. Иметь роль `teacher` в клиенте `journal` ## Особенности для преподавателей ### 1. Скрытые инструкции для LLM При создании заданий вы можете добавить **скрытые инструкции** (`hiddenInstructions`), которые: - ✅ Видны только преподавателям - ✅ Передаются в LLM при проверке - ❌ Не видны студентам - ❌ Не отображаются в интерфейсе студента #### Примеры использования **Пример 1: Контроль сложности** ```json { "title": "Реализовать сортировку", "description": "Напишите функцию для сортировки массива чисел", "hiddenInstructions": "Проверь, чтобы сложность алгоритма была не хуже O(n log n). Не принимай bubble sort или простые O(n²) решения." } ``` **Пример 2: Специфичные требования** ```json { "title": "REST API endpoint", "description": "Создайте endpoint для получения списка пользователей", "hiddenInstructions": "Обязательно должна быть пагинация, обработка ошибок и валидация параметров. Если чего-то не хватает - укажи в feedback." } ``` **Пример 3: Стиль кода** ```json { "title": "Компонент React", "description": "Создайте компонент для отображения карточки товара", "hiddenInstructions": "Проверь использование TypeScript, правильное применение хуков, и соблюдение best practices React. Код должен быть чистым и читаемым." } ``` **Пример 4: Тонкая настройка проверки** ```json { "title": "SQL запрос", "description": "Напишите запрос для выборки активных пользователей", "hiddenInstructions": "Даже если запрос работает, но неоптимален (например, использует SELECT *), укажи на это в feedback и попроси оптимизировать." } ``` ### 2. Создание задания через API #### С помощью Keycloak токена ```typescript // Получение токена (пример для frontend) const keycloakToken = keycloak.token // из keycloak-js // Создание задания async function createTask(title: string, description: string, hiddenInstructions: string) { const response = await fetch('http://localhost:8082/api/challenge/task', { method: 'POST', headers: { 'Content-Type': 'application/json', 'Authorization': `Bearer ${keycloakToken}` }, body: JSON.stringify({ title, description, hiddenInstructions }) }) return response.json() } ``` #### С помощью curl ```bash # Получить токен от Keycloak TOKEN="your_keycloak_token" # Создать задание curl -X POST http://localhost:8082/api/challenge/task \ -H "Content-Type: application/json" \ -H "Authorization: Bearer $TOKEN" \ -d '{ "title": "Написать функцию", "description": "# Задание\n\nНапишите функцию для...", "hiddenInstructions": "Проверь производительность и обработку ошибок" }' ``` ### 3. UI компоненты для преподавателей #### TaskForm с скрытыми инструкциями ```typescript import { useState } from 'react' import ReactMarkdown from 'react-markdown' interface TaskFormProps { onSubmit: (task: { title: string; description: string; hiddenInstructions: string }) => void } export function TeacherTaskForm({ onSubmit }: TaskFormProps) { const [title, setTitle] = useState('') const [description, setDescription] = useState('') const [hiddenInstructions, setHiddenInstructions] = useState('') const [showPreview, setShowPreview] = useState(false) const handleSubmit = (e: React.FormEvent) => { e.preventDefault() onSubmit({ title, description, hiddenInstructions }) } return (
setTitle(e.target.value)} required maxLength={255} />
{showPreview ? (
{description}
) : (