feat(*): Add spelling and grammar

This commit is contained in:
Josh Creek
2025-04-21 18:03:56 +01:00
parent 83feb9ac23
commit 54aa8e9fc5
5 changed files with 38 additions and 40 deletions
+10 -8
View File
@@ -1,10 +1,11 @@
<script lang="ts"> <script lang="ts">
export let grade: string = ''; export let grade: string = '';
export let strengths: string = ''; export let strengths: string = '';
export let areas_for_improvement: string = ''; export let areasForImprovement: string = '';
export let individualized_activity: string = ''; export let individualizedActivity: string = '';
export let reflection_question: string = ''; export let reflectionQuestion: string = '';
export let teacher_suggestion: string = ''; export let teacherSuggestion: string = '';
export let spellingAndGrammar: string = '';
export let reasoning: string = ''; export let reasoning: string = '';
</script> </script>
@@ -12,10 +13,11 @@
<h2 class="text-xl font-bold mb-4 text-blue-700">AI Assessment Feedback</h2> <h2 class="text-xl font-bold mb-4 text-blue-700">AI Assessment Feedback</h2>
<div class="mb-2"><span class="font-semibold">Grade:</span> {grade}</div> <div class="mb-2"><span class="font-semibold">Grade:</span> {grade}</div>
<div class="mb-2"><span class="font-semibold">Strengths:</span> {strengths}</div> <div class="mb-2"><span class="font-semibold">Strengths:</span> {strengths}</div>
<div class="mb-2"><span class="font-semibold">Areas for Improvement:</span> {areas_for_improvement}</div> <div class="mb-2"><span class="font-semibold">Areas for Improvement:</span> {areasForImprovement}</div>
<div class="mb-2"><span class="font-semibold">Individualized Activity:</span> {individualized_activity}</div> <div class="mb-2"><span class="font-semibold">Individualized Activity:</span> {individualizedActivity}</div>
<div class="mb-2"><span class="font-semibold">Reflection Question:</span> {reflection_question}</div> <div class="mb-2"><span class="font-semibold">Reflection Question:</span> {reflectionQuestion}</div>
<div class="mb-2"><span class="font-semibold">Teacher Suggestion:</span> {teacher_suggestion}</div> <div class="mb-2"><span class="font-semibold">Teacher Suggestion:</span> {teacherSuggestion}</div>
<div class="mb-2"><span class="font-semibold">Spelling and Grammar:</span> {spellingAndGrammar}</div>
<details class="mt-4"> <details class="mt-4">
<summary class="cursor-pointer font-semibold text-gray-600">Show AI Reasoning</summary> <summary class="cursor-pointer font-semibold text-gray-600">Show AI Reasoning</summary>
<div class="mt-2 text-gray-700 whitespace-pre-line">{reasoning}</div> <div class="mt-2 text-gray-700 whitespace-pre-line">{reasoning}</div>
+5 -4
View File
@@ -35,10 +35,11 @@
<div class="mt-2 p-2 bg-gray-50 rounded"> <div class="mt-2 p-2 bg-gray-50 rounded">
<div class="mb-1"><span class="font-semibold">Submission:</span> <span class="whitespace-pre-line">{entry.submission}</span></div> <div class="mb-1"><span class="font-semibold">Submission:</span> <span class="whitespace-pre-line">{entry.submission}</span></div>
<div class="mb-1"><span class="font-semibold">Strengths:</span> {entry.strengths}</div> <div class="mb-1"><span class="font-semibold">Strengths:</span> {entry.strengths}</div>
<div class="mb-1"><span class="font-semibold">Areas for Improvement:</span> {entry.areas_for_improvement}</div> <div class="mb-1"><span class="font-semibold">Areas for Improvement:</span> {entry.areasForImprovement}</div>
<div class="mb-1"><span class="font-semibold">Individualized Activity:</span> {entry.individualized_activity}</div> <div class="mb-1"><span class="font-semibold">Individualized Activity:</span> {entry.individualizedActivity}</div>
<div class="mb-1"><span class="font-semibold">Reflection Question:</span> {entry.reflection_question}</div> <div class="mb-1"><span class="font-semibold">Reflection Question:</span> {entry.reflectionQuestion}</div>
<div class="mb-1"><span class="font-semibold">Teacher Suggestion:</span> {entry.teacher_suggestion}</div> <div class="mb-1"><span class="font-semibold">Teacher Suggestion:</span> {entry.teacherSuggestion}</div>
<div class="mb-1"><span class="font-semibold">Spelling and Grammar:</span> {entry.spellingAndGrammar}</div>
<details class="mt-2"> <details class="mt-2">
<summary class="cursor-pointer font-semibold text-gray-600" aria-label="Show AI reasoning for this assessment">Show AI Reasoning</summary> <summary class="cursor-pointer font-semibold text-gray-600" aria-label="Show AI reasoning for this assessment">Show AI Reasoning</summary>
<div class="mt-1 text-gray-700 whitespace-pre-line">{entry.reasoning}</div> <div class="mt-1 text-gray-700 whitespace-pre-line">{entry.reasoning}</div>
+17 -23
View File
@@ -1,6 +1,7 @@
import { client, agent } from '../agent/services/agentService'; import { client, agent } from '../agent/services/agentService';
import type { MessageTextContentOutput, ToolOutput } from '@azure/ai-projects'; import type { MessageTextContentOutput, ToolOutput } from '@azure/ai-projects';
import { PARTYKIT_BASE_URL } from '$env/static/private'; import { PARTYKIT_BASE_URL } from '$env/static/private';
import type { OpenAIResponse } from './types';
// Prompt template for grading and feedback // Prompt template for grading and feedback
export function buildGradingPrompt(submission: string, task: string) { export function buildGradingPrompt(submission: string, task: string) {
@@ -27,12 +28,13 @@ Follow these steps:
RESPONSE FORMAT (respond with a single JSON object, no extra text): RESPONSE FORMAT (respond with a single JSON object, no extra text):
{ {
"grade": "<number or string, e.g. 8/10 or 8>", "grade": "<number or string, e.g. A, B, C+, etc>",
"strengths": "<text>", "strengths": "<text>",
"areas_for_improvement": "<text>", "areasForImprovement": "<text>",
"individualized_activity": "<text>", "individualizedActivity": "<text>",
"reflection_question": "<text>", "reflectionQuestion": "<text>",
"teacher_suggestion": "<text>", "teacherSuggestion": "<text>",
"spellingAndGrammar": "<text>",
"reasoning": "<step-by-step explanation>" "reasoning": "<step-by-step explanation>"
} }
@@ -40,25 +42,16 @@ Respond ONLY with the JSON object, with no preamble or explanation.
`; `;
} }
export type OpenAIResponse = {
grade: string;
strengths: string;
areas_for_improvement: string;
individualized_activity: string;
reflection_question: string;
teacher_suggestion: string;
reasoning: string;
};
function fallbackGrade(submission: string, task: string): OpenAIResponse { function fallbackGrade(submission: string, task: string): OpenAIResponse {
console.log('using fallback'); console.log('using fallback');
return { return {
grade: '7/10', grade: '7/10',
strengths: 'Clear argument and good evidence (in response to the task: ' + task + ").", strengths: 'Clear argument and good evidence (in response to the task: ' + task + ").",
areas_for_improvement: 'Needs deeper analysis and more examples.', areasForImprovement: 'Needs deeper analysis and more examples.',
individualized_activity: 'Write a paragraph expanding on your main point and provide two additional examples to support your argument.', individualizedActivity: 'Write a paragraph expanding on your main point and provide two additional examples to support your argument.',
reflection_question: 'What was the most challenging part of this assignment for you, and why?', reflectionQuestion: 'What was the most challenging part of this assignment for you, and why?',
teacher_suggestion: 'In the next lesson, review how to develop arguments with supporting evidence and provide a model answer for comparison.', teacherSuggestion: 'In the next lesson, review how to develop arguments with supporting evidence and provide a model answer for comparison.',
spellingAndGrammar: 'Everything was spelled correctly',
reasoning: 'The submission demonstrates a good structure and evidence, but lacks depth and breadth of analysis. The activity and suggestions are designed to target this gap.' reasoning: 'The submission demonstrates a good structure and evidence, but lacks depth and breadth of analysis. The activity and suggestions are designed to target this gap.'
}; };
} }
@@ -189,10 +182,11 @@ export async function gradeSubmissionWithAgent(submission: string, task: string,
return { return {
grade: '', grade: '',
strengths: '', strengths: '',
areas_for_improvement: '', areasForImprovement: '',
individualized_activity: '', individualizedActivity: '',
reflection_question: '', reflectionQuestion: '',
teacher_suggestion: '', teacherSuggestion: '',
spellingAndGrammar: '',
reasoning: text || 'No feedback generated.' reasoning: text || 'No feedback generated.'
}; };
} catch (err) { } catch (err) {
+5 -4
View File
@@ -1,9 +1,10 @@
export interface OpenAIResponse { export interface OpenAIResponse {
grade: string; grade: string;
strengths: string; strengths: string;
areas_for_improvement: string; areasForImprovement: string;
individualized_activity: string; individualizedActivity: string;
reflection_question: string; reflectionQuestion: string;
teacher_suggestion: string; teacherSuggestion: string;
spellingAndGrammar: string;
reasoning: string; reasoning: string;
} }
+1 -1
View File
@@ -35,7 +35,7 @@ export const POST: RequestHandler = async (event: RequestEvent) => {
return new Response(JSON.stringify({ return new Response(JSON.stringify({
success: true, success: true,
task: task.trim(), task: task.trim(),
feedback: `Grade: ${aiResult.grade}\nStrengths: ${aiResult.strengths}\nAreas for Improvement: ${aiResult.areas_for_improvement}\nIndividualized Activity: ${aiResult.individualized_activity}\nReasoning: ${aiResult.reasoning}`, feedback: `Grade: ${aiResult.grade}\nStrengths: ${aiResult.strengths}\nAreas for Improvement: ${aiResult.areasForImprovement}\nIndividualized Activity: ${aiResult.individualizedActivity}\nSpelling and Grammar: ${aiResult.spellingAndGrammar}\nReasoning: ${aiResult.reasoning}`,
...aiResult ...aiResult
}), { }), {
status: 200, status: 200,