dracero’s JevNER classifies and masks Spanish-language student-survey comments. Its Astro application sends text to TypeSafe Jev, asks typed questions about sensitive content, then locates and replaces selected phrases locally.
The source makes a reusable decision-model pattern inspectable: construct a menu of text fragments, ask the model to select one, and let code apply the replacement.
Candidate generation limits what can be found
The implementation builds word fragments and short consecutive phrases, ranks them, then keeps 30 candidates. Each entity category gets one choice question plus a “none” option.
- A presence question asks whether the comment contains a person, course, insult, email or phone number.
- A separate choice question selects a matching fragment from the generated menu.
- Local thresholds combine the presence result with the selected fragment before masking.
In a constructed offline test, the candidate generator omitted a short name after longer capitalized fragments filled the menu. This tests the code’s coverage limit; it says nothing about Jev’s accuracy on that input.
One selected name leaves others outside the mask
The masking function finds occurrences of the selected string. It receives one selected person name, rather than a list of every person mentioned.
An offline call supplying Ana for the constructed sentence Ana y Luis enseñan química. returned:
[DOCENTE] y Luis enseñan química.
A structured choice can be valid while the anonymized text still contains another person’s name. Measure missed entities across whole comments before relying on the output.
Confidence labels and exports need separate checks
The code assigns fixed confidence values to located spans, including 0.98 for a person. That value is an implementation constant, independent of Jev’s returned probability.
The export path also deserves an explicit review:
- Add-column and metadata modes preserve the original row alongside the masked text.
- The API’s default mode string matches none of its transformation branches, leaving original row data unchanged.
- Comments marked for manual review remain eligible for export; the exclusion rule removes discarded comments.
These are source-inspection findings. The export endpoint was not executed.
Keep the privacy boundary visible
Raw comments go to TypeSafe’s hosted API before masking. Optional LangSmith tracing records inputs and outputs, adding another data destination when enabled.
The README’s speed and calibration language comes without a labeled entity-recall evaluation. A deployable interface alone cannot establish that sensitive names have all been removed.
Verification: inspected the README, Jev adapter, masking, batch, export and tracing code; exercised candidate generation and the original masking functions on constructed inputs. No live Jev calls, production survey data or end-to-end application run were used. This was not a security audit.