Show the language model's opinion on a message #15

Merged
jcoffey-dev merged 1 commits from feature/llm-opinion into main 2026-09-23 05:39:19 +00:00
Owner

When inbuxa-server's AI spam classification is on, it records the model's
answer in an X-Spam-LLM header: a tag (LLM_[_]) and,
in parentheses, the model's explanation. The full message now asks for it,
and where it's there:

  • the message details show "Language model's opinion" beside the spam
    filter's own working, with category, confidence and explanation;
  • a message in Junk carries a banner saying the same.

Both say it's one of several signals the spam filter weighed, never the
reason on its own, as the server's spec requires. The explanation is model
output and is only ever rendered as text. Nothing shows without the header,
so a server without the feature, or with it off, looks as before.

Translations: two new strings, "Language model's opinion" and "One of
several signals the spam filter weighed", in all eight catalogues (16
entries). Category and confidence come from the server and aren't
translated.

Summary

Related issues

Translations

Testing

Screenshots

When inbuxa-server's AI spam classification is on, it records the model's answer in an X-Spam-LLM header: a tag (LLM_<category>[_<confidence>]) and, in parentheses, the model's explanation. The full message now asks for it, and where it's there: - the message details show "Language model's opinion" beside the spam filter's own working, with category, confidence and explanation; - a message in Junk carries a banner saying the same. Both say it's one of several signals the spam filter weighed, never the reason on its own, as the server's spec requires. The explanation is model output and is only ever rendered as text. Nothing shows without the header, so a server without the feature, or with it off, looks as before. Translations: two new strings, "Language model's opinion" and "One of several signals the spam filter weighed", in all eight catalogues (16 entries). Category and confidence come from the server and aren't translated. <!-- Thanks for contributing to ihasmail. CONTRIBUTING.md has the full guide; this is the short version. Delete any section that does not apply. --> ## Summary <!-- What changes, and why. --> ## Related issues <!-- e.g. Closes #123. Leave blank if there are none. --> ## Translations <!-- Nine languages ship alongside English, and a missing key silently renders its English source -- so an untranslated string is invisible until somebody reading that language finds it. Say which this PR is, explicitly: - Adds or alters user-visible strings: how many keys, and the fallback count before and after. - Adds none. "Adds none" is an answer. Saying nothing is not -- it leaves it to be inferred. See CONTRIBUTING.md -> Translations. --> ## Testing <!-- What you ran, and what you saw. `npm run typecheck`, `npm test` and `npm run build` all run in CI, so the useful thing here is what CI cannot do: which flows you exercised by hand, and against what -- a real Stalwart instance, or `npm run dev:mock`. If the change is visible on screen, drive the built app, not just the store. See CONTRIBUTING.md -> Verifying UI work. --> ## Screenshots <!-- For UI changes. Before/after, or a GIF for anything with motion. -->
jcoffey-dev added 1 commit 2026-09-23 05:19:44 +00:00
Show the language model's opinion on a message
ci / version (pull_request) Skipped
ci / node (pull_request) Successful in 2m23s
ci / publish (pull_request) Skipped
ci / docker-build (pull_request) Successful in 1m24s
e4926cfa7d
When inbuxa-server's AI spam classification is on, it records the model's
answer in an X-Spam-LLM header: a tag (LLM_<category>[_<confidence>]) and,
in parentheses, the model's explanation. The full message now asks for it,
and where it's there:

- the message details show "Language model's opinion" beside the spam
  filter's own working, with category, confidence and explanation;
- a message in Junk carries a banner saying the same.

Both say it's one of several signals the spam filter weighed, never the
reason on its own, as the server's spec requires. The explanation is model
output and is only ever rendered as text. Nothing shows without the header,
so a server without the feature, or with it off, looks as before.

Translations: two new strings, "Language model's opinion" and "One of
several signals the spam filter weighed", in all eight catalogues (16
entries). Category and confidence come from the server and aren't
translated.
jcoffey-dev merged commit 119548090e into main 2026-09-23 05:39:19 +00:00
Sign in to join this conversation.
No Reviewers
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: inbuxa/ihasmail-inbuxa#15