Inspiration
I built Drumul spre Română, an 89-lesson Romanian course, over three weeks in August. I’d never heard of this hackathon at the time. Every exercise type with a fixed answer (multiple choice, fill-in-the-blank, matching) can be graded by a script. Free writing can’t be, and it’s the one exercise that actually resembles using a language. The course’s own rule-based checker is honest about that limit: it marks free writing “submitted” and moves on, with no verdict and no explanation. That gap is what Corectorul closes.
What it does
Corectorul reads a learner’s free-written Romanian sentence and checks it the way a careful tutor would, by looking things up instead of guessing. It calls four tools (lookup_vocab, lookup_verb, lookup_grammar, check_register) against the course’s own verified data: 600 vocabulary entries, 190 fully-conjugated verbs cross-checked against Wiktionary, and 41 grammar articles. It returns one of four verdicts (correct, almost, unnatural, incorrect) with an explanation that names what it actually checked. It’s wired directly into the course’s existing free-writing exercises behind a “Get feedback on your writing” button, so it works inside the interface the course already has instead of opening a separate chat window.
How I built it
The agent is built with the Strands Agents SDK, running Claude behind those four grounding tools, deployed on AWS Lambda behind API Gateway. The grounding data is extracted directly from the live course’s own js/data/*.js files, by a Python tool I wrote for exactly this, plus a verb-conjugation and click-to-gloss index pulled straight from the course’s real browser engine. A verdict is checked against the same rules the course itself teaches, using the four lookup tools rather than the model’s own sense of Romanian grammar.
Challenges I ran into
Two separate AWS account-level restrictions hit within about a day of each other, for unrelated services. First, Bedrock model access came back suspended account-wide (“Error 002”), confirmed on two fully independent AWS accounts: a platform-level hold rather than an IAM permissions issue. Rather than block on AWS support clearing it, I made the model provider swappable at runtime and switched to calling Claude through Anthropic’s API directly. That means switching back, if Bedrock ever clears, is just one environment variable away. Then a plain Lambda Function URL returned Forbidden for genuinely public access, a second and separate restriction. API Gateway, an older AWS service, wasn’t caught by it, so that’s the endpoint actually serving traffic now.
Accomplishments I’m proud of
Every verdict lists the specific words, verb forms, or grammar rules it actually looked up, so the learner can tell what was checked from what’s just the model’s general sense of the language. It’s live on real content built for real learners. It also survived two independent AWS account-level restrictions in the same day without slipping the deadline, because the architecture was built to swap providers from the start.
What’s next for Corectorul
The four-tool shape (vocabulary, verb forms, grammar rules, register) generalizes to any course with structured content. If Bedrock access clears, swapping back and adding Amazon Bedrock AgentCore Runtime as the production entrypoint (already coded as agent/main.py) is next. I also shipped a general site feedback form as a bonus during this same build window, since working on this made the course’s other gaps more visible.
Built With
- amazon-api-gateway
- amazon-web-services
- anthropic
- aws-iam
- aws-lambda
- boto3
- botocore
- claude
- css3
- git
- github
- html5
- javascript
- json
- pydantic
- python
- rest-api
- serverless
- strands-agents
- uv
- vanilla-javascript
Log in or sign up for Devpost to join the conversation.