diff --git a/docs/updateAPI.md b/docs/updateAPI.md index be7e35f..75bb81f 100644 --- a/docs/updateAPI.md +++ b/docs/updateAPI.md @@ -4,7 +4,7 @@ Содержит два блока изменений: - **Управление видимостью цепочек заданий** (поле `isActive` и новый админский эндпоинт). -- **Тестовая проверка решения задания админом** (флаг `isTest` в `/submit`). +- **Тестовая проверка решения задания админом** (флаг `isTest` и опциональные `hiddenInstructions` в `/submit`). --- @@ -158,14 +158,15 @@ #### `POST /api/challenge/submit` -К существующему API добавлен новый опциональный флаг в теле запроса: +К существующему API добавлены новые опциональные поля в теле запроса: ```json { "userId": "...", "taskId": "...", "result": "...", - "isTest": true // НОВОЕ: опциональный флаг + "isTest": true, // НОВОЕ: флаг тестового режима + "hiddenInstructions": "..." // НОВОЕ: опциональные инструкции для проверки } ``` @@ -183,8 +184,9 @@ - Доступен только для ролей `teacher` / `challenge-author` (проверка через `isTeacher(req, true)`). - **Не создаётся** запись `ChallengeSubmission`. - **Не используется** очередь проверки. -- Проверяется только существование задания (`taskId`), пользователь по `userId` в этом режиме **не ищется и не нужен**. -- Сразу вызывается LLM и возвращается результат проверки. +- Проверяется только существование задания (`taskId`), пользователь по `userId` в этом режиме **не ищется и не нужен** (но поле всё ещё формально обязательно по схеме). +- Если переданы `hiddenInstructions`, они используются **вместо** `task.hiddenInstructions` при формировании промпта для LLM. +- Никакие изменения инструкций, переданные через `hiddenInstructions`, **не сохраняются** в базу — это чисто временная инструкция для одной тестовой проверки. **Пример запроса (тестовый режим):** @@ -197,12 +199,11 @@ Authorization: Bearer "userId": "any-or-dummy-id", "taskId": "507f1f77bcf86cd799439012", "result": "function solve() { ... }", - "isTest": true + "isTest": true, + "hiddenInstructions": "ВРЕМЕННЫЕ инструкции для проверки, не сохраняются" } ``` -> `userId` формально обязателен по схеме, но в тестовом режиме не используется на бэке. Можно передавать любой корректный ObjectId. - **Пример ответа (тестовый режим):** ```json @@ -222,12 +223,13 @@ Authorization: Bearer - **Где использовать тестовый режим**: - только в админских/преподавательских интерфейсах (например, экран настройки задания или предпросмотр проверки); - - использовать флаг `isTest: true`, когда нужно получить мгновенный ответ от LLM без записи в историю. + - использовать флаг `isTest: true`, когда нужно получить мгновенный ответ от LLM без записи в историю; + - при наличии UI-редактора скрытых инструкций использовать `hiddenInstructions` для передачи временного варианта, не сохраняя его. - **Где НЕ использовать**: - в пользовательском флоу сдачи заданий студентами — там должен использоваться обычный режим **без** `isTest`. - **UI-ожидания**: - показывать администратору статус (`accepted` / `needs_revision`) и `feedback`; - - явно обозначить в интерфейсе, что это «тестовая проверка» и она **не попадает в статистику / попытки**. + - явно обозначить в интерфейсе, что это «тестовая проверка» и она **не попадает в статистику / попытки**, а переданные `hiddenInstructions` не сохраняются. --- @@ -238,4 +240,4 @@ Authorization: Bearer - админский список: `GET /api/challenge/chains/admin` → все цепочки + управление `isActive` через `POST/PUT /chain`. - Для отправки решений: - обычный режим без `isTest` — всё как раньше (очередь, попытки, статистика); - - тестовый режим с `isTest: true` — только для `teacher/challenge-author`, без записи прогресса, сразу возвращает результат проверки. \ No newline at end of file + - тестовый режим с `isTest: true` + опциональные `hiddenInstructions` — только для `teacher/challenge-author`, без записи прогресса, сразу возвращает результат проверки с учётом временных инструкций. \ No newline at end of file diff --git a/src/__data__/api/api.ts b/src/__data__/api/api.ts index 26073a4..f173558 100644 --- a/src/__data__/api/api.ts +++ b/src/__data__/api/api.ts @@ -147,7 +147,7 @@ export const api = createApi({ // Test submission (LLM check without creating a real submission) testSubmission: builder.mutation({ - query: ({ userId, taskId, result, isTest = true }) => ({ + query: ({ userId, taskId, result, isTest = true, hiddenInstructions }) => ({ url: '/challenge/submit', method: 'POST', body: { @@ -155,6 +155,7 @@ export const api = createApi({ taskId, result, isTest, + hiddenInstructions, }, }), transformResponse: (response: APIResponse) => response.data, diff --git a/src/pages/tasks/TaskFormPage.tsx b/src/pages/tasks/TaskFormPage.tsx index 809f3c5..53de7c3 100644 --- a/src/pages/tasks/TaskFormPage.tsx +++ b/src/pages/tasks/TaskFormPage.tsx @@ -136,6 +136,7 @@ export const TaskFormPage: React.FC = () => { taskId: task.id, result: testAnswer.trim(), isTest: true, + hiddenInstructions: hiddenInstructions.trim() || undefined, }).unwrap() setTestStatus(result.status) diff --git a/src/types/challenge.ts b/src/types/challenge.ts index cd6da21..12d8f9b 100644 --- a/src/types/challenge.ts +++ b/src/types/challenge.ts @@ -234,6 +234,8 @@ export interface SubmitRequest { result: string // Флаг тестового режима: проверка без создания Submission и очереди isTest?: boolean + // Временные скрытые инструкции для тестовой проверки (не сохраняются в задачу) + hiddenInstructions?: string } export interface TestSubmissionResult {