PyTales

Lora

The friendly helper for everything in research, teaching and administration

An AI assistant with tools for documents, literature, transcription and tables – for Windows, macOS, Linux and Android.

Research prototype tested at the chair and in the team · as of 10 November 2026

Try the demoWhat Lora can do

Demo

Demo with prepared answers: No AI is running and nothing leaves your browser. All outputs are examples, not real model outputs; all names and data are made up.

New chat

Hello

Demo mode – prepared answers

    What Lora can do

    One click plays the example in the demo.

    How Lora works

    The path of a request – what happens on the device and what a language model on the server takes over.

    1. Device

      Command or question?

      Lora’s own model Lora Befehle recognises in 3.5 ms whether a setting, a tool or a deadline is meant – otherwise Lora asks.

    2. Device

      Where does it run?

      Commands run locally at once, short tasks with a local language model, large ones via the server.

    3. Device

      Pseudonymise

      Names, places and numbers become placeholders such as [Name 1] before anything leaves the device.

    4. Server

      Agent loop

      The language model plans and calls tools. Anything that changes something waits for “Run”.

    5. Device

      Answer back

      The placeholders turn back into names; sources are numbered.

    Technology in detail
    • App: Kotlin with Jetpack Compose (Android) and Compose Desktop (Windows, macOS, Linux); logic, tools and most screens share one code base.
    • Language models: via an OpenAI-compatible interface with streaming and tool calls. Lora herself uses GLM-5.3 Flash, handovers to the chat DeepSeek V4.1 Flash. Locally: llama.cpp with GGUF models; the llama-server listens only on 127.0.0.1 and stops after ten idle minutes.
    • Own models: ONNX Runtime from sherpa-onnx (which also provides speech recognition), a WordPiece tokenizer in Kotlin, downloads checked with SHA-256.
    • Agent: up to 30 tool steps, then automatically on to at most 500; the same action four times in a row stops it. Reading tools run in parallel, broken tool calls (JSON) are repaired.
    • Context: at most 100 000 tokens; the older part of a long chat is summarised once, the last two rounds stay complete.
    • Failures: the rate limit is respected ahead of time; if a model does not answer after retries (502/503/504), a similar one steps in (can be switched off).
    • Approvals and workflows: the default is “Always ask”; every Lora action is logged and can be undone. Multi-step tasks are first shown as a plan with steps, duration and a privacy note (Go · Change · Cancel); a running workflow resumes after a restart.
    • Mixed mode: The mailbox only goes to local models; Lora only remembers something after asking.
    • Privacy levels per project: in the vault only the university’s server, with “Only on this device” only local models.

    Two models of its own

    Lora Namensschutz (“name protection”) and Lora Befehle (“commands”) are small enough for the device and were trained on invented texts only. Each is measured on a test set that never went into training.

    Finds names, institutions and places

    Lora Namensschutz

    99.2 % of private details found

    Target of at least 98 % reached

    Found, in per cent – compared with the fixed rules alone

    rules only78.2 with model99.2
    wrongly replaced
    7.4 %
    public names · target of at most 2 % still open
    per paragraph
    ≈ 11 ms
    target under 50 ms reached
    on the device
    110 MB
    ONNX int8, as accurate as the full model

    Understands requests on the device

    Lora Befehle

    0.0 % of commands executed wrongly

    Target of at most 2 % reached · rules only: 19.4 %

    Recognised straight away, in per cent – compared with the fixed rules alone

    rules only38.1 with model84.8
    with a follow-up question
    97.0 %
    recognised, with two buttons to choose from
    per input
    ≈ 3.5 ms
    offline, without a server
    on the device
    68 MB
    178 actions of the app

    Example

    How Lora Namensschutz reads a sentence

    Word pieces receive labels in the BIO scheme (B = beginning, I = inside, O = nothing). Example in German with made-up names, not a real model output.

    Frau Keller unterrichtet an der Lindenschule in Pirna. (Ms Keller teaches at the Lindenschule in Pirna.)

    The measurement in detailAll figures, test sets and limits of the measurement

    Lora Namensschutz

    It is based on gbert-base (German BERT); the model gives every word piece a label. Together with the app’s rules it finds almost all private details; it still replaces public names too often.

    Figures on the test set
    Figurewith modelrules onlyTargetStatus
    private names, institutions and places found99.2 %97.2–99.8 %78.2 %at least 98 % reached
    public names wrongly replaced7.4 %4.0–13.5 %9.9 %at most 2 % open
    Time per paragraph (app on a PC)≈ 11 ms–under 50 ms reached
    Size as ONNX int8110 MB––0.0 percentage points from the full model

    Test set: 174 invented, everyday texts (interview, parent meeting, report, e-mail, minutes, table, chat, academic text) with 261 private and 121 public details. Counting is per detail: it is found if all its core words are replaced; a public detail counts as wrongly replaced as soon as one word is replaced. The ranges below the values are Wilson 95 % intervals.

    By type

    • People205 of 205 found
    • Institutions (school, day care, practice …)31 of 31 found
    • Places that identify a person23 of 25 found
    • public figures3 of 23 wrongly replaced
    • places without personal reference3 of 17 wrongly replaced
    • public institutions1 of 19 wrongly replaced
    • cited authors0 of 48 wrongly replaced
    • words that look like names0 of 14 wrongly replaced

    found wrongly replaced · Evaluation by the training script with rules and model: 5.8 % wrongly replaced; the app with its own rules reaches 7.4 % (above); 99.2 % are found in both cases.

    What the numbers do not show: the test corpus was written before the training templates, and words from the test set do not occur in the training data – but both are made up. A test with real, approved texts is still pending, as is a comparison with other filters such as Presidio or spaCy on the same corpus and an analysis of how many texts stay completely free of gaps.

    Lora Befehle

    It is based on distilbert-base-german-cased. The model maps inputs such as “make it dark” or “remind me of the deadline on 15 December” to an action of the app – offline, without a request to a server. Guiding rule: a wrongly executed action is worse than a follow-up question.

    Figures on the test set
    Figurewith modelrules onlyTargetStatus
    commands executed wrongly0.0 %19.4 %at most 2 % reached
    commands recognised straight away84.8 %38.1 %at least 90 % open
    commands recognised, with a follow-up question97.0 %––two buttons to choose from
    open questions correctly passed on to a language model100 %–––
    Time per input≈ 3.5 ms––ONNX int8, 68 MB

    Test set: 386 invented requests for 178 actions, including typos and English.

    Pseudonymisation in detail

    What the app replaces, where the mapping is kept and what the filter does not do.

    What leaves the device?

    With a model on the server: the text of the messages, the text of attached files and their names – with placeholders instead of personal details. Pseudonymisation is on by default. Web search and literature databases also only receive placeholders. Images and scanned pages cannot be pseudonymised; the app asks before sending them.

    With a local model nothing leaves the device, so placeholders are not needed. The app addresses language models on the server via an OpenAI-compatible interface – during testing at the chair, the university’s AI service. There are no usage statistics; error logs stay on the device and are only included if you use “Report a problem” yourself.

    Placeholders, mapping and translating back

    Details are replaced by placeholders in square brackets – [Name 1], [Einrichtung 2], [E-Mail 1], optionally with a role such as [Schüler/in 2] – not by made-up names. This way the language model sees that something was replaced and is instructed to keep the placeholders unchanged.

    The same person keeps the same placeholder in all requests; with “placeholders per chat” every chat starts at [Name 1], so the server cannot link people across chats. Other spellings (MÜLLER, Mueller) get the same placeholder. Inflected German names are replaced too: “Annas Heft” becomes “[Name 1]s Heft”, “dem Müller” becomes “dem [Name 2]” – and that is how they come back.

    The mapping is kept as a file in the app’s data folder on the device, is not synchronised and stays until you delete it under Settings › Privacy. It is not separately encrypted (unlike the API keys). On the device the answer gets the real details back, in created documents too; only tools that send to the internet keep the placeholders.

    What is recognised

    Fixed rules on the device: email addresses, phone numbers, addresses with postcode and town, dates of birth, student, pupil, staff and customer numbers, file references, IBAN, BIC and credit cards (with check digit), tax ID, ID card and social security numbers, number plates, IP addresses, profile links and @ handles; names after roles, greetings and signatures, whole name columns in tables, CSV and Excel, names from email addresses, file and folder names.

    Plus Lora Namensschutz for names, institutions and places with a personal reference, a custom list (also from class lists) and “Never replace”. Cited authors and those in your own reference library stay as they are. Every rule can be switched off individually; on request, a local language model also reads through the text (“Thorough”).

    When something goes wrong

    If Lora Namensschutz is missing or switched off, the rules carry on alone. If pseudonymisation itself fails, the request is not sent. When in doubt, the filter replaces too much rather than too little.

    What was replaced is shown in the preview under Settings › Privacy and in the log of every agent run; one click on “do not replace” or “also replace” applies to all chats from then on. In the vault the strict level applies: everything on, no exception for public sources, plus the local language model.

    Legal classification

    Pseudonymised data remain personal data (Recital 26 GDPR): whoever has the mapping can trace them back. The filter reduces the risk but does not by itself make a use GDPR-compliant. Responsibility remains with whoever uses Lora with real data, or their institution. Whether a server service may be used for such data, for example under a data processing agreement, is something to clarify with the data protection officer.

    Limits
    • Tested is German in everyday school and university life; other languages and fields are not.
    • Lora Namensschutz recognises public figures from context (office, work, quotation), not from world knowledge.
    • It does not recognise indirect details such as “the head teacher of the only school in the village” or combinations of such details – through these someone may remain recognisable.
    • Special categories such as health information are not recognised as such; typos and dialect are not specifically tested in the test corpus.
    • Lora Namensschutz has been tried out on a PC, not yet on Android.
    Model cards, status and reporting errors

    Lora Namensschutz (files lora-namensschutz-pytales.*, as of 09/11/2026): gbert-base by deepset (MIT licence), three epochs on 27,000 invented texts, threshold 0.9, ONNX int8. The templates were written by Claude (Anthropic) as teacher model; a script inserted invented names. Lora Befehle (files lora-befehle-pytales.*, as of 10/11/2026): distilbert-base-german-cased (Apache-2.0), five epochs on 26,360 invented requests, threshold 0.8, ONNX int8.

    Licence: Lora and both models are free for everyone to use, permanently. They may only be modified or redistributed with written permission from PyTales. The base models remain under their own licences; their authors have neither reviewed nor endorsed Lora Namensschutz and Lora Befehle. No warranty – the models can make mistakes; when in doubt, a human checks the result.

    History: 09/11/2026 test corpus, training and integration of Lora Namensschutz on the PC · 10/11/2026 Lora Befehle and mixed mode.

    Names that slipped through or false alarms – please report them in the app under Settings › Report a problem or to dominik.toepper@tu-dresden.de, using made-up examples only.

    Lora is a personal project and not an official service of TU Dresden.