Datenformate des NexAI Mailagenten
Diese Seite wird aus dem Programm erzeugt und beschreibt den Stand, der gerade läuft.
Die Verwaltung einer Instanz lädt alle Daten ihres Hauses jederzeit selbst herunter: angemeldet unter „Datenschutz“, Knopf „Export herunterladen“. Der Export ist eine ZIP-Datei. Hier steht, was darin ist, in welchem Format, was jedes Feld bedeutet, wie sich die Freigabeliste auf Veränderungen prüfen lässt und was mit welchem Grund fehlt.
Aufbau der ZIP-Datei
nexai-mailagent-export-JJJJ-MM-TT/
LIESMICH.txt kurze Übersicht
<tabelle>.jsonl eine Datei je Tabelle, siehe unten
einstellungen.json Einstellungen des Hauses
anhaenge/ die Dateianhänge der Nachrichten
dateien/ was das Haus als Datei pflegtAllgemeine Regeln
- Jede
.jsonl-Datei ist JSON Lines: je Datensatz eine Zeile, jede Zeile ein JSON-Objekt nach RFC 8259, Zeichensatz UTF-8, Zeilenende LF. Eine leere Tabelle ergibt eine leere Datei; eine Tabelle, die in dieser Instanz nie angelegt wurde, fehlt. - Die Namen der Felder sind die Spaltennamen der Datenbank. Jeder Datensatz enthält alle Felder seiner Tabelle; ein fehlender Wert steht als
nullda. - Ja/nein steht als Zahl:
1heißt ja,0heißt nein. - Verweise zwischen Dateien sind Nummern:
message_idinanalysis.jsonlist das Feldidinmessages.jsonl. - Alle Zeitpunkte sind Weltzeit (UTC). Es gibt zwei Schreibweisen, je Feld unten angegeben.
- Der Inhalt eines Anhangs steht nicht im JSON, sondern als Datei in
anhaenge/, benannt<Nachricht>-<Anhang>-<Dateiname>. Im Feldcontentsteht an seiner Stelle der Hinweis<n Bytes, siehe anhaenge/>. - Ist die Stimmungseinstufung ausgeschaltet, fehlt das Feld
stimmunginanalysis.jsonlganz, damit sein Vorgabewert nicht wie eine Einstufung aussieht. - In
schnittstellen_schluessel.jsonlfehltpruefwert: der Prüfwert, mit dem sich ein Schlüssel anmeldet.
| Format | Bedeutung |
|---|---|
| Ganzzahl | ganze Zahl |
| Kommazahl | Zahl mit Nachkommastellen, Punkt als Trenner |
| Text | Zeichenkette in UTF-8 |
| ja/nein (1/0) | 1 heißt ja, 0 heißt nein |
| ja/nein (true/false) | JSON-Wahrheitswert, nur in einstellungen.json |
| JSON-Text | Zeichenkette, die selbst JSON enthält und ein zweites Mal gelesen werden muss |
| Zeitpunkt ISO 8601 UTC | zum Beispiel 2026-11-01T15:45:33.123Z |
| Zeitpunkt SQLite UTC | zum Beispiel 2026-11-01 15:45:33, Weltzeit ohne Zonenangabe |
| Datum | JJJJ-MM-TT, zum Beispiel 2026-11-01 |
| Verweis | Nummer oder Kennung eines Datensatzes in einer anderen Datei |
Die Tabellen
messages.jsonl
Die aus den angebundenen Postfächern abgerufenen E-Mails mit Kopfdaten und Text, eine Zeile je Nachricht und Ordner.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer der Nachricht in dieser Datenbank, auf die die anderen Tabellen verweisen. |
account_id | Verweis | Kennung des Postfachs, aus dem die Nachricht stammt (Verweis auf accounts.id). |
folder | Text | Name des Ordners auf dem Mailserver, aus dem die Nachricht abgerufen wurde, etwa INBOX für den Posteingang, der Gesendet-Ordner oder beim Archivabruf der Ordner „Alle Nachrichten“. |
uid | Ganzzahl | Nummer der Nachricht innerhalb dieses Ordners auf dem Mailserver (IMAP-UID). |
message_id | Text kann null sein | Kennung der Mail aus ihrer Kopfzeile Message-ID; leer, wenn die Mail nicht gelesen werden konnte oder keine hat. |
thread_key | Text kann null sein | Kennung des Gesprächsverlaufs, wie sie der Mailserver liefert (zum Beispiel Gmail); leer, wenn der Server keine liefert. |
direction | Text | Richtung der Nachricht, bestimmt danach, ob der Absender die eigene Postfachadresse ist, und ersatzweise nach dem Ordner.
|
sent_at | Zeitpunkt ISO 8601 UTC kann null sein | Datum der Mail aus ihrer Kopfzeile Date, in UTC umgerechnet; leer, wenn die Mail keines hat oder nicht gelesen werden konnte. |
from_address | Text kann null sein | E-Mail-Adresse des Absenders. |
from_name | Text kann null sein | Anzeigename des Absenders. |
to_addresses | Text kann null sein | Empfängeradressen aus dem Feld An, durch Komma und Leerzeichen getrennt. |
cc_addresses | Text kann null sein | Empfängeradressen aus dem Feld Kopie (CC), durch Komma und Leerzeichen getrennt. |
subject | Text kann null sein | Betreff der Nachricht. |
body_text | Text kann null sein | Der Text der Nachricht als reiner Text. |
body_html | Text kann null sein | Die HTML-Fassung des Textes, die nur für Betrugsprüfung und Linkleser gebraucht und deshalb nach der Einstufung, frühestens zwei Tage nach dem Datum der Mail (ohne Einstufung nach 30 Tagen), geleert wird. |
size_bytes | Ganzzahl kann null sein | Größe der gesamten Nachricht auf dem Mailserver in Bytes, einschließlich Anhängen. |
flags | Text kann null sein | Markierungen der Nachricht auf dem Mailserver zum Zeitpunkt des Abrufs (zum Beispiel \Seen für gelesen), durch Komma getrennt und danach nicht mehr aktualisiert. |
has_attachments | ja/nein (1/0) | 1, wenn beim Abruf Anhänge gespeichert wurden (beim Archivabruf ohne Anhänge immer 0); der Wert bleibt 1, auch wenn die Anhänge später nach Frist gelöscht werden. |
fetched_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem der Agent die Nachricht abgerufen und gespeichert hat. |
headers | JSON-Text kann null sein | Alle Kopfzeilen der Mail als JSON-Objekt, mit dem Namen der Kopfzeile in Kleinbuchstaben als Schlüssel und einer Liste ihrer Werte; leer, wenn die Mail nicht gelesen werden konnte. |
attachments.jsonl
Die Dateianhänge der abgerufenen Nachrichten; im Export stehen hier die Angaben zur Datei, die Dateien selbst liegen im Ordner anhaenge/.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer des Anhangs, die auch im Dateinamen unter anhaenge/ steht. |
message_id | Verweis | Nummer der Nachricht, zu der der Anhang gehört (Verweis auf messages.id). |
filename | Text kann null sein | Dateiname, wie ihn die Mail angibt; im Ordner anhaenge/ steht er um unzulässige Zeichen bereinigt. |
mime_type | Text kann null sein | Dateiart, wie sie die Mail angibt (zum Beispiel application/pdf), ohne Prüfung übernommen. |
size_bytes | Ganzzahl kann null sein | Größe der Datei in Bytes. |
content | Text kann null sein | Inhalt der Datei; im Export steht hier nur der Hinweis „<n Bytes, siehe anhaenge/>“, die Datei selbst liegt unter anhaenge/ mit dem Namen <Nachricht>-<Kennung>-<Dateiname>. |
anhang_text.jsonl
Der aus Anhängen ausgelesene Text (Textdateien und PDF), einmal gespeichert für die Volltextsuche, samt Grund, wenn nichts auslesbar war.
| Feld | Format | Bedeutung |
|---|---|---|
attachment_id | Verweis | Nummer des Anhangs, aus dem der Text stammt (Verweis auf attachments.id). |
quelle | Text kann null sein | Wie der Text gewonnen wurde; leer, wenn kein Text herauskam.
|
text | Text | Der ausgelesene Text, ohne Steuerzeichen und auf höchstens 200.000 Zeichen gekürzt; ein leerer Text, wenn nichts herauskam. |
grund | Text kann null sein | Warum kein Text herauskam; leer, wenn das Auslesen gelungen ist.
|
gelesen_am | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem der Text ausgelesen wurde. |
anhang_pruefung.jsonl
Das Ergebnis der Virenprüfung je Anhang; Einträge gibt es nur, wenn ein Virenscanner eingerichtet ist, und ein Anhang, der nicht geprüft werden konnte, erscheint hier nicht.
| Feld | Format | Bedeutung |
|---|---|---|
attachment_id | Verweis | Nummer des geprüften Anhangs (Verweis auf attachments.id). |
befund | Text | Ergebnis der Prüfung durch den Virenscanner.
|
hinweis | Text kann null sein | Name der erkannten Schadsoftware laut Virenscanner; leer, wenn der Anhang sauber ist. |
am | Zeitpunkt SQLite UTC | Zeitpunkt der Prüfung. |
analysis.jsonl
Die Einstufung jeder eingehenden Nachricht im Posteingang durch den Agenten: Kategorie, Kurzfassung, erwartete Antwort, Terminwunsch und Ergebnis der Betrugsprüfung.
| Feld | Format | Bedeutung |
|---|---|---|
message_id | Verweis | Nummer der eingestuften Nachricht (Verweis auf messages.id); je Nachricht gibt es höchstens eine Einstufung. |
category | Text | Kategorie der Nachricht laut Sprachmodell; eine Absenderregel des Hauses kann sie auf wichtig heben oder von wichtig auf normal setzen, und Massenpost wird ohne Sprachmodell als werbung abgelegt.
|
summary | Text kann null sein | Ein Satz auf Deutsch, was in der Nachricht steht und was vom Haus erwartet wird; ein leerer Text bei Massenpost, die ohne Sprachmodell abgelegt wurde. |
reply_expected | ja/nein (1/0) | 1, wenn der Absender laut Sprachmodell eine Antwort erwartet. |
importance_note | Text kann null sein | Begründung des Sprachmodells, warum die Nachricht wichtig ist; nur gefüllt, wenn das Modell sie als wichtig eingestuft hat. |
instruction_attempt | ja/nein (1/0) | 1, wenn die Nachricht laut Sprachmodell versucht, dem Assistenten Anweisungen zu geben, etwa Regeln zu ändern, etwas weiterzuleiten oder Zugangsdaten zu nennen. |
scam_score | Ganzzahl | Punktzahl der regelbasierten Betrugsprüfung, etwa für eine fehlgeschlagene Absenderprüfung, einen getarnten Link, einen ausführbaren Anhang oder eine andere Bankverbindung als bisher; ein Virenfund zählt 6 Punkte. |
scam_level | Text | Stufe der Betrugsprüfung, aus der Punktzahl abgeleitet.
|
scam_reasons | JSON-Text kann null sein | Die Gründe aus der Betrugsprüfung als JSON-Liste von Texten; leer, wenn nichts auffiel. |
model | Text kann null sein | Name des Sprachmodells, mit dem eingestuft wurde, so wie er beim Anbieter heißt; „ohne Modell“ bei Massenpost, die nur anhand der Kopfzeilen abgelegt wurde. |
input_tokens | Ganzzahl kann null sein | Anzahl der Tokens (Abrechnungseinheiten des Sprachmodells), die für die Einstufung an das Modell gingen; 0 ohne Modell. |
output_tokens | Ganzzahl kann null sein | Anzahl der Tokens, die das Sprachmodell für die Einstufung zurückgab; 0 ohne Modell. |
analysed_at | Zeitpunkt SQLite UTC | Zeitpunkt der Einstufung. |
wants_appointment | ja/nein (1/0) | 1, wenn die Nachricht laut Sprachmodell einen Termin, ein Gespräch oder einen Rückruf vereinbaren will. |
stimmung | Text | Wie der Absender laut Sprachmodell klingt; nur bei eingeschalteter Stimmungseinstufung gefüllt und im Export enthalten, beim Ausschalten werden alle gespeicherten Einstufungen auf sachlich zurückgesetzt.
|
deadlines.jsonl
Termine und Fristen, die das Sprachmodell bei der Einstufung aus einer eingehenden Nachricht gelesen hat.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer der Frist. |
message_id | Verweis | Nummer der Nachricht, aus der die Frist stammt (Verweis auf messages.id). |
due_on | Text kann null sein | Datum der Frist als JJJJ-MM-TT, wenn das Sprachmodell es erkennen konnte, sonst die Formulierung aus der Nachricht als freier Text; leer, wenn nichts genannt ist. |
matter | Text | Worum es bei der Frist oder dem Termin geht, laut Sprachmodell. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem die Frist erfasst wurde. |
drafts.jsonl
Antwortentwürfe und Weitergaben an Dritte, die zu einer Nachricht angelegt wurden, und neue Mails (über „E-Mail schreiben“), jeweils mit aktuellem Text, Prüfergebnis und Stand von Freigabe und Versand.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer des Entwurfs. |
message_id | Verweis kann null sein | Nummer der Nachricht, auf die der Entwurf antwortet oder die er weitergibt (Verweis auf messages.id); leer bei einer neuen Mail. |
subject | Text | Betreff des Entwurfs in der aktuellen Fassung. |
body | Text | Text des Entwurfs in der aktuellen Fassung, den eine Bearbeitung durch einen Menschen überschreibt; noch offene Lücken stehen als [[Name]] im Text. |
gaps | JSON-Text kann null sein | JSON-Objekt mit "gaps" und "note": "gaps" ist die Liste der Lücken mit "name" (Platzhalter im Text), "options" (Vorschläge) und bei fremdsprachigen Mails "nameDe" und "optionsDe" als deutsche Lesehilfe (ältere Entwürfe führen eine Lücke nur als Text), "note" ist ein Hinweis zum Entwurf, beim Modellentwurf worauf beim Prüfen zu achten ist. |
warnings | JSON-Text kann null sein | Ergebnis der automatischen Prüfung des Entwurfstexts als JSON-Liste von Einträgen mit "kind" (zahl, prozent oder termin für Beträge, Prozentangaben und Daten, die weder im Faktenverzeichnis noch in der Nachricht stehen, iban für eine Kontonummer im Entwurf, luecke für eine offene Lücke) und "detail" (Beschreibung); wird bei jeder Bearbeitung neu berechnet. |
model | Text kann null sein | Name des Sprachmodells, das den Entwurf geschrieben hat; „uebergabe“ bei einer ohne Sprachmodell gebauten Weitergabe an Dritte, „serie“ bei einem aus einer Serie gleichartiger Nachrichten übernommenen Entwurf; leer bei einer neuen Mail, deren Text ein Mensch selbst geschrieben hat (sie geht ohne KI-Hinweis hinaus). |
input_tokens | Ganzzahl kann null sein | Anzahl der Tokens (Abrechnungseinheiten des Sprachmodells), die beim Schreiben an das Modell gingen; 0 bei Weitergaben und Serienentwürfen. |
output_tokens | Ganzzahl kann null sein | Anzahl der Tokens, die das Sprachmodell beim Schreiben zurückgab; 0 bei Weitergaben und Serienentwürfen. |
status | Text | Stand des Entwurfs.
|
created_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem der Entwurf angelegt wurde. |
sent_at | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt des Versands; leer, solange der Entwurf nicht versandt ist. |
extra_facts | Text kann null sein | Beim Bearbeiten eingefügte, aus dem Kalender belegte Angaben wie freie Zeiten und Buchungslinks, eine je Zeile, damit die Prüfung sie nicht als erfunden meldet. |
regeln_version | Verweis kann null sein | Stand der Hausregeln, der beim Anlegen des Entwurfs galt (Verweis auf hausregeln.version); leer bei Entwürfen, die vor Einführung dieser Spalte entstanden. |
ziel_adresse | Text kann null sein | Empfängeradresse einer Weitergabe an Dritte, zum Beispiel an die Steuerberatung, oder einer neuen Mail; leer bei einer normalen Antwort an den Absender. |
konto | Text kann null sein | Nur bei einer neuen Mail: Kurzname des Postfachs, aus dem sie geht (wie messages.account_id); leer bei Antworten und Weitergaben, die aus dem Postfach ihrer Nachricht gehen. |
corrections.jsonl
Wesentliche Änderungen, die ein Mensch an einem Entwurf vorgenommen hat, als Vorher und Nachher (kleine Korrekturen werden nicht gespeichert); die jüngsten dienen dem Agenten als Beispiel für künftige Entwürfe.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer der Änderung. |
draft_id | Verweis | Nummer des geänderten Entwurfs (Verweis auf drafts.id). |
before_text | Text | Text des Entwurfs vor der Änderung, ohne Leerraum am Rand und auf 4.000 Zeichen gekürzt. |
after_text | Text | Text des Entwurfs nach der Änderung durch den Menschen, ebenso auf 4.000 Zeichen gekürzt. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt der Änderung. |
questions.jsonl
Rückfragen, die der Agent beim Schreiben eines Entwurfs an das Haus stellt, meist zu einer Lücke, und die Antworten darauf, die beim nächsten Entwurf zu derselben Nachricht berücksichtigt werden.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer der Rückfrage. |
message_id | Verweis | Nummer der Nachricht, zu deren Entwurf die Rückfrage gehört (Verweis auf messages.id). |
question | Text | Text der Rückfrage des Agenten. |
answer | Text kann null sein | Antwort, die ein Mensch in der Oberfläche gegeben hat; leer, solange die Frage offen ist. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem die Rückfrage gestellt wurde. |
answered_at | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt der Antwort; leer, solange die Frage offen ist. |
freigaben.jsonl
Fortlaufendes, nur ergänztes und durch eine Prüfkette gesichertes Protokoll, wer welchen Antwortentwurf geschrieben, geändert, gegengelesen, gesendet oder verworfen hat und mit welchem Wortlaut; dazu Löschungen auf Verlangen und bestätigte Bankverbindungen.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer der Zeile; sie wird nie erneut vergeben und liegt nach einer Kürzung immer über freigaben_anker.bis_id. |
draft_id | Verweis kann null sein | Nummer des Entwurfs in drafts.id; leer bei Einträgen ohne Entwurf (Löschung auf Verlangen, bestätigte Bankverbindung), und der Entwurf selbst kann nach seiner Frist schon gelöscht sein. |
message_id | Verweis kann null sein | Nummer der Nachricht in messages.id, auf die sich die Zeile bezieht; leer bei Löschungen auf Verlangen, und die Zeile bleibt bestehen, auch wenn die Nachricht nach ihrer Frist gelöscht wurde. |
person_id | Verweis | Kennung der handelnden Person aus einstellungen.json (Liste personen, Feld id); beim Versand durch die Automatik steht hier „automatik“. |
person_name | Text | Name der handelnden Person zum Zeitpunkt der Aktion; bei der Automatik „Automatik (Freigabeliste)“. |
aktion | Text | Was in dieser Zeile geschehen ist.
|
betreff | Text kann null sein | Betreff des Entwurfs; bei einer Löschung auf Verlangen „Loeschung auf Verlangen“, bei einer bestätigten Bankverbindung „Bankverbindung bestaetigt“. |
text | Text | Vollständiger Wortlaut des Entwurfs zum Zeitpunkt der Aktion (bei einer Löschung auf Verlangen eine Beschreibung mit der betroffenen Adresse, bei einer bestätigten Bankverbindung IBAN und Absenderadresse); nach Ablauf der Frist für das Protokoll, bei nie gesendeten Entwürfen schon nach der Frist für Entwürfe, wird er durch einen leeren Text ersetzt, nicht durch null. |
text_pruefsumme | Text | SHA-256-Prüfsumme des Wortlauts als 64-stellige Hexadezimalzahl, beim Anlegen berechnet; sie bleibt unverändert, auch wenn der Wortlaut nach Frist geleert wird. |
regeln_version | Verweis kann null sein | Fassung der Hausregeln, nach der der Entwurf geschrieben wurde, als Nummer in hausregeln.version; gefüllt nur bei „geschrieben“ und beim Versand durch die Automatik. |
notiz | Text kann null sein | Ergänzende Angabe zur Aktion, etwa der Empfänger beim Versand („an …“), „zweites Augenpaar“ beim Gegenlesen, „Artikel 17“ bei einer Löschung auf Verlangen oder „Betrugspruefung“ bei einer bestätigten Bankverbindung. |
am | Zeitpunkt ISO 8601 UTC | Zeitpunkt der Aktion. |
kette | Text | Prüfkettenwert dieser Zeile als 64-stellige Hexadezimalzahl, beim Anlegen aus dem Wert der vorigen Zeile und den Angaben dieser Zeile berechnet (Verfahren unten); er ändert sich danach nie, auch nicht beim Leeren des Wortlauts. |
text_entfernt_am | Datum kann null sein | Tag, an dem der Wortlaut nach Frist geleert wurde (text ist dann ein leerer Text); leer, solange der Wortlaut noch vorhanden ist. |
freigaben_anker.jsonl
Eine einzige Zeile, die nach dem fristgemäßen Löschen der ältesten Zeilen aus freigaben den neuen Anfang der Prüfkette und den Umfang der Kürzung festhält; ohne Kürzung ist die Tabelle leer.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Nummer der Zeile, immer 1, weil es höchstens eine Ankerzeile gibt. |
kette | Text | Prüfkettenwert (freigaben.kette) der zuletzt gelöschten Zeile, an den die erste verbliebene Zeile anknüpft; wird bei jeder weiteren Kürzung überschrieben. |
bis_id | Ganzzahl | Nummer (freigaben.id) der zuletzt gelöschten Zeile; alle Zeilen bis einschließlich dieser Nummer sind gelöscht. |
entfernt | Ganzzahl | Gesamtzahl der bisher nach Frist gelöschten Zeilen aus freigaben, über alle Kürzungen aufsummiert. |
am | Zeitpunkt ISO 8601 UTC | Zeitpunkt der letzten Kürzung. |
verwaltungsprotokoll.jsonl
Protokoll, wer wann was an der Einrichtung des Mailagenten geändert hat (Postfächer, Personen, Fristen, Hausregeln, Buchungen, Datenexporte), dazu je Person die erste Anmeldung, das Einlösen eines Einrichtungslinks und beim Entfernen die letzte Anmeldung; ausdrücklich ohne Passwörter oder andere Geheimnisse.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer des Eintrags. |
am | Zeitpunkt SQLite UTC | Zeitpunkt des Vorgangs. |
person_id | Verweis | Kennung der handelnden Person aus einstellungen.json (Liste personen, Feld id); bei Aufträgen über die NexAI-Zugangszentrale steht hier „nexai-zentrale“. |
person_name | Text | Name der handelnden Person zum Zeitpunkt des Eintrags; bei der Zugangszentrale „NexAI-Zentrale: “ gefolgt vom Namen aus dem unterschriebenen Auftrag des NexAI-Portals. |
was | Text | Art des Vorgangs, als fester Wortlaut ohne Umlaute gespeichert.
|
gegenstand | Text kann null sein | Woran sich der Vorgang bezieht, etwa die Postfachadresse, Name oder Kennung einer Person, die Fassung der Hausregeln, die Empfängeradresse, die neue Rechnungsadresse, der Text eines Kontaktwunsches, der Stand vorher und nachher bei Buchungen oder bei Fehlern die Fehlermeldung. |
einzelheiten | Text kann null sein | Ergänzende Angaben, etwa der Anmeldeweg eines Postfachs („Weg: …“), beim Entfernen einer Person deren letzte Anmeldung („letzte Anmeldung …“ in deutscher Zeit oder „nie angemeldet“), die geänderten Felder einer Person, der Umfang eines Datenexports oder bei geänderten Löschfristen und Antwortzielen die neuen Werte als JSON-Text. |
rechnungen.jsonl
Aus Mails per Textmuster und ohne Sprachmodell erkannte Rechnungen und Mahnungen mit Betrag, Fälligkeit und Mahnstufe, als Liste offener Posten.
| Feld | Format | Bedeutung |
|---|---|---|
message_id | Verweis | Nummer der Nachricht in messages.id, in der die Rechnung erkannt wurde; je Nachricht höchstens eine Rechnung. |
betrag_cent | Ganzzahl kann null sein | Betrag der Forderung in Cent (1.234,56 € stehen als 123456), aus dem Mailtext abgeschrieben, bevorzugt der Betrag neben Wörtern wie „Gesamtbetrag“ oder „zu zahlen“. |
waehrung | Text | Währung des Betrags.
|
nummer | Text kann null sein | Rechnungsnummer, Aktenzeichen, Kundennummer oder Vorgangsnummer, wie sie im Text neben einem solchen Stichwort steht; nur übernommen, wenn sie mindestens eine Ziffer enthält. |
faellig_am | Datum kann null sein | Fälligkeitstag aus Formulierungen wie „zahlbar bis“ oder „fällig am“; fehlt im Text die Jahreszahl, wird das Jahr der Mail angenommen. |
mahnstufe | Ganzzahl | Stufe der Mahnung, aus Betreff und Textanfang erkannt.
|
mahnstufe_name | Text kann null sein | Bezeichnung der erkannten Mahnstufe; leer bei Stufe 0.
|
glaeubiger | Text kann null sein | Mailadresse des Absenders der Rechnung, wie sie bei der ersten Erkennung gespeichert wurde; eine spätere erneute Erkennung ändert sie nicht. |
bezahlt_am | Datum kann null sein | Tag, an dem eine Person die Rechnung im Mailagenten als bezahlt markiert hat; leer, solange sie offen ist oder wenn die Markierung zurückgenommen wurde. |
erkannt_am | Zeitpunkt SQLite UTC | Zeitpunkt der ersten Erkennung; eine erneute Erkennung derselben Nachricht ändert ihn nicht. |
wiedervorlagen.jsonl
Erinnerungen an Nachrichten, die wieder auf den Tisch müssen, mit einer Stufe, die mit jeder folgenlosen Erinnerung steigt.
| Feld | Format | Bedeutung |
|---|---|---|
message_id | Verweis | Nummer der Nachricht in messages.id; je Nachricht höchstens eine Wiedervorlage. |
am | Datum | Tag, an dem die Wiedervorlage fällig ist; nach jeder Erinnerung wird er auf den folgenden Tag gesetzt. |
grund | Text | Grund der Wiedervorlage: bei automatischen Einträgen ein erzeugter Satz (etwa „Frist am …: …“ oder „… hat das seit … offen“), bei von Hand gesetzten der eingegebene Text mit höchstens 200 Zeichen. |
quelle | Text | Woher die Wiedervorlage stammt.
|
stufe | Ganzzahl | Wie oft die Wiedervorlage schon gemeldet wurde; jede Meldung erhöht sie um 1, und ab Stufe 3 geht die Meldung zusätzlich an die Leitung, sofern es eine zweite Person gibt. |
zuletzt_gemeldet | Datum kann null sein | Tag der letzten Erinnerung; leer, solange noch keine erfolgt ist. |
erledigt_am | Datum kann null sein | Tag, an dem die Wiedervorlage als erledigt markiert wurde; wird beim erneuten Setzen wieder geleert. |
angelegt_am | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem die Wiedervorlage erstmals angelegt wurde. |
zuweisungen.jsonl
Hält fest, welche Person sich um eine Nachricht kümmert und wie weit die Bearbeitung ist.
| Feld | Format | Bedeutung |
|---|---|---|
message_id | Verweis | Nummer der Nachricht in messages.id; je Nachricht höchstens eine Zuweisung. |
person_id | Verweis | Kennung der zuständigen Person aus einstellungen.json (Liste personen, Feld id); ist die gewählte Person abwesend, steht hier ihre Vertretung. |
person_name | Text | Name der zuständigen Person zum Zeitpunkt der Zuweisung. |
status | Text | Bearbeitungsstand der Nachricht.
|
von_id | Verweis | Kennung der Person aus einstellungen.json, die zuletzt zugewiesen oder den Stand gesetzt hat. |
von_name | Text | Name der Person, die zuletzt zugewiesen oder den Stand gesetzt hat. |
geaendert_am | Zeitpunkt SQLite UTC | Zeitpunkt der letzten Zuweisung oder Änderung des Stands. |
notizen.jsonl
Interne Notizen der Mitarbeiter zu einer Nachricht, die nur im Haus sichtbar sind und nie an den Absender oder das Sprachmodell gehen.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer der Notiz. |
message_id | Verweis | Nummer der Nachricht in messages.id, zu der die Notiz gehört. |
person_id | Verweis | Kennung der verfassenden Person aus einstellungen.json (Liste personen, Feld id); nur sie kann die Notiz löschen. |
person_name | Text | Name der verfassenden Person zum Zeitpunkt der Notiz. |
text | Text | Inhalt der Notiz, ohne Leerzeichen am Anfang und Ende, höchstens 2.000 Zeichen. |
am | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem die Notiz geschrieben wurde. |
vorgaenge.jsonl
Ordnet jeder Nachricht das tatsächliche Gegenüber und den Eingangskanal zu, damit Nachrichten derselben Person über Mail, Telefon, Chat und Formular als ein Vorgang zusammengeführt werden.
| Feld | Format | Bedeutung |
|---|---|---|
message_id | Verweis | Nummer der Nachricht in messages.id. |
gegenseite | Text kann null sein | Mailadresse des tatsächlichen Gegenübers in Kleinschreibung: bei gewöhnlichen Mails der Absender, bei Meldungen eines in den Einstellungen als eigenes System eingetragenen Absenders (etwa Kontaktformular oder Telefonanlage) die Adresse aus einem beschrifteten E-Mail-Feld im Text; leer, wenn keine Adresse gefunden wurde. |
kanal | Text | Über welchen Weg die Nachricht kam, bei eigenen Systemen anhand von Absender, Name und Betreff erkannt.
|
anfragen.jsonl
Per Textmuster und ohne Sprachmodell erkannte Preisanfragen mit den wörtlich genannten Positionen.
| Feld | Format | Bedeutung |
|---|---|---|
message_id | Verweis | Nummer der Nachricht in messages.id, in der die Preisanfrage erkannt wurde. |
grund | Text kann null sein | Die Wendung aus der Mail, an der die Preisanfrage erkannt wurde, auf höchstens 80 Zeichen gekürzt. |
positionen | JSON-Text | Liste der wörtlich in der Mail genannten Positionen als JSON-Liste; jedes Element hat menge (Zahl), einheit (etwa „Stück“ oder „m²“), bezeichnung (Text) und fundstelle (die Zeile der Mail, aus der die Position stammt, wörtlich); „[]“, wenn keine Position erkannt wurde. |
erkannt_am | Zeitpunkt SQLite UTC | Zeitpunkt der ersten Erkennung; eine erneute Erkennung ändert ihn nicht. |
erledigt_am | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt, zu dem eine Person die Anfrage als erledigt markiert hat; leer, solange sie offen ist. |
absender_ibans.jsonl
Merkt sich, welche Bankverbindungen eine absendende Firma bisher genannt hat, damit eine plötzlich andere Kontonummer derselben Firma als möglicher Rechnungsbetrug auffällt.
| Feld | Format | Bedeutung |
|---|---|---|
domain | Text | Domain der Absenderadresse, auf die letzten beiden Teile gekürzt und kleingeschrieben (aus rechnung@mail.beispiel.de wird beispiel.de). |
iban | Text | In einer Mail dieser Firma genannte IBAN in Großbuchstaben ohne Leerzeichen, nur mit gültiger Prüfziffer; aus als verdächtig eingestuften Mails wird keine übernommen. |
zuerst_gesehen | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem diese IBAN erstmals bei dieser Firma erkannt wurde. |
zuletzt_gesehen | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem diese IBAN zuletzt in einer Mail dieser Firma erkannt wurde; 24 Monate danach wird die Zeile gelöscht. |
bestaetigt_am | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt, zu dem eine Person diese Bankverbindung als geprüft bestätigt hat; leer, solange sie nicht bestätigt ist. |
bestaetigt_von | Text kann null sein | Name der Person, die die Bankverbindung bestätigt hat. |
sender_rules.jsonl
Absenderregeln: für welche Absender das Haus festgelegt hat, dass ihre Post immer oder nie als wichtig gilt; die Regel geht der Einstufung durch das Sprachmodell vor.
| Feld | Format | Bedeutung |
|---|---|---|
address | Text | E-Mail-Adresse des Absenders, in Kleinbuchstaben gespeichert. |
verdict | Text | Die Festlegung des Hauses für diesen Absender.
|
created_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem die Regel zuletzt festgelegt wurde; eine erneute Festlegung überschreibt ihn. |
auto_send.jsonl
Die Freigabeliste der Automatik: Absender, deren Nachrichten der Agent ohne Freigabe durch einen Menschen beantworten darf, und zwar nur, wenn der Entwurf ohne Lücken, Fragen, Warnungen und verbindliche Erklärungen ist und keine zweite Freigabe verlangt.
| Feld | Format | Bedeutung |
|---|---|---|
address | Text | E-Mail-Adresse des Absenders, dessen Nachrichten automatisch beantwortet werden dürfen, in Kleinbuchstaben. |
note | Text kann null sein | Vermerk zur Aufnahme: über die Oberfläche „freigegeben von“ mit dem Namen der Person, über die Kommandozeile ein freier Text oder nichts. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem die Adresse in die Liste aufgenommen wurde. |
briefings.jsonl
Die Übersichten über neu eingestufte Post, die der Agent nach jedem geplanten oder von Hand angestoßenen Lauf schreibt, sofern es Neues gab.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer der Übersicht. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem die Übersicht geschrieben wurde. |
covers_from | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt der vorherigen Übersicht, aufgenommen ist alles, was seitdem eingestuft wurde; leer bei der ersten Übersicht. |
file_path | Text kann null sein | Speicherort einer zusätzlich als Markdown-Datei abgelegten Kopie auf dem Server; leer, wenn sie nicht geschrieben werden konnte; die Datei selbst ist nicht im Export, ihr Inhalt steht in content. |
content | Text | Wortlaut der Übersicht als Markdown: Zahl der neuen Nachrichten, Wichtiges, Fristen, Verdächtiges, Fragen des Agenten, Inhalte verlinkter Seiten, ausstehende Antworten und der Rest in einer Zeile. |
link_summaries.jsonl
Kurzfassungen der Webseiten, die in unverdächtigen eingehenden Nachrichten der Kategorien wichtig und normal verlinkt waren (höchstens drei je Nachricht), oder der Grund, warum eine Seite nicht gelesen wurde.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer des Eintrags. |
message_id | Verweis | Nummer der Nachricht, in der der Link stand (Verweis auf messages.id). |
url | Text | Adresse der verlinkten Seite; ein leerer Text bedeutet, dass die Nachricht keine lesbaren Links enthielt und nur als erledigt vermerkt ist. |
status | Text | Ergebnis des Lesens.
|
summary | Text kann null sein | Ein bis zwei Sätze des Sprachmodells, was auf der Seite steht, ergänzt um einen Warnsatz, wenn die Seite nach Daten oder Geld fragt oder dem Assistenten Anweisungen geben will; leer, wenn die Seite nicht gelesen wurde. |
wanted | Text kann null sein | Was die Seite laut Sprachmodell vom Haus will, etwa Zahlung, Anmeldung, Bestätigung oder Termin, oder „nichts“; leer, wenn die Seite nicht gelesen wurde. |
refused_reason | Text kann null sein | Grund, warum die Seite nicht abgerufen wurde (etwa eine ungültige oder ins eigene Netz zeigende Adresse oder ein Fehlercode der Seite), oder die Fehlermeldung bei misslungener Zusammenfassung; sonst leer. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt des Eintrags. |
hausregeln.jsonl
Jede Fassung der Hausregeln, die je gegolten hat, damit sich später sagen lässt, welche Regeln beim Schreiben eines Entwurfs galten.
| Feld | Format | Bedeutung |
|---|---|---|
version | Ganzzahl | Laufende Nummer der Fassung, beginnend bei 1; darauf verweist regeln_version in drafts.jsonl und freigaben.jsonl. |
inhalt | Text | Vollständiger Wortlaut der Hausregeln in dieser Fassung, als Markdown. |
pruefsumme | Text | Die ersten 16 Zeichen des SHA-256-Hashwerts über den Wortlaut aus inhalt, kodiert als UTF-8 und hexadezimal in Kleinbuchstaben geschrieben (16 Zeichen, also 64 Bit); eine neue Fassung entsteht nur, wenn diese Prüfsumme von der der letzten Fassung abweicht. |
mandant_id | Text | Kennung des Hauses, für das die Fassung galt, dieselbe wie id in einstellungen.json. |
notiz | Text kann null sein | Vermerk zur Fassung: bei einer Änderung über die Oberfläche „geaendert von“ mit dem Namen der Person und gegebenenfalls ihrer Begründung (höchstens 200 Zeichen), leer, wenn der Agent eine geänderte Datei beim Lesen bemerkt hat. |
gueltig_ab | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem der Agent diese Fassung zuerst abgelegt hat; wurde die Datei außerhalb der Oberfläche geändert, ist es der Zeitpunkt, zu dem er die Änderung zuerst gelesen hat. |
style_profile.jsonl
Das Schreibprofil des Hauses, gezählt aus bis zu 50 eigenen gesendeten Mails (übliche Anrede, Grußformel, Länge), das der Agent beim Entwerfen berücksichtigt; es gibt höchstens eine Zeile.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Immer 1, weil es je Haus nur ein Profil gibt. |
profile | JSON-Text | Das Profil als JSON-Objekt mit greeting (häufigste Anrede, Namen durch <Name> ersetzt, oder null), signoff (häufigste Grußformel oder null), averageWords (durchschnittliche Zahl der Wörter, Ganzzahl), sampleSize (Zahl ausgewerteter Mails, Ganzzahl) und notes (Liste von Texten, möglich sind „schreibt kurz, meist unter zehn Zeilen“ und „schreibt ausfuehrlich“). |
sample_size | Ganzzahl | Zahl der eigenen gesendeten Nachrichten, aus denen das Profil gezählt wurde, höchstens 50. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem das Profil ermittelt wurde; es entsteht beim ersten Entwurf und wird danach nicht von selbst erneuert. |
mailbox_actions.jsonl
Was der Agent zu einer Nachricht im Postfach oder in angebundenen Systemen getan hat: ein Label gesetzt, sie archiviert, eine Sofortmeldung verschickt, einen Termin für den Kalender verarbeitet oder einen Kontakt an das CRM gegeben.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer der Aktion. |
message_id | Verweis | Die Nachricht, um die es geht (Verweis auf id in messages.jsonl). |
action | Text | Art der Aktion.
|
detail | Text kann null sein | Einzelheit zur Aktion: bei label der Name des Labels (NexAI/Wichtig, NexAI/Antwort offen oder NexAI/Verdaechtig), bei archiviert der Zielordner im Postfach, bei eilmeldung der Grund, bei kalender das Ergebnis (eingetragen mit Kennung des Termins, war schon da oder uebersprungen, jeweils gegebenenfalls mit Grund), bei crm „neuer Kontakt“ oder „bestehender Kontakt“ mit dessen Kennung im CRM. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt der Aktion. |
undone_at | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt, zu dem eine Archivierung rückgängig gemacht wurde, also die Nachricht zurück in den Posteingang kam oder dort nicht mehr vorhanden war; nur bei archiviert, sonst leer. |
accounts.jsonl
Die Postfächer, aus denen der Agent je Post abgeholt hat; ein Eintrag bleibt bestehen, wenn das Postfach später getrennt wird, weil die Nachrichten daran hängen.
| Feld | Format | Bedeutung |
|---|---|---|
id | Text | Kennung des Postfachs, dieselbe wie postfaecher[].id in einstellungen.json; darauf verweist account_id in messages.jsonl. |
address | Text | E-Mail-Adresse des Postfachs, bei jeder Abholung auf den Stand der Einstellungen gebracht. |
kind | Text | Freie Beschriftung des Postfachs aus den Einstellungen (zum Beispiel geschaeftlich), so wie sie bei der ersten Abholung lautete; spätere Änderungen werden hier nicht nachgetragen. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt der ersten Abholung aus diesem Postfach. |
runs.jsonl
Das Laufprotokoll: jeder Abruflauf des Agenten mit Art, Beginn, Ende, Ergebnis, Zahl neuer Nachrichten, Störungen und Anmerkungen.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer des Laufs. |
kind | Text | Wodurch der Lauf ausgelöst wurde.
|
started_at | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem der Lauf begann. |
finished_at | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt, zu dem der Lauf endete oder als abgebrochen abgehakt wurde; leer, solange er läuft. |
status | Text | Wie der Lauf ausging.
|
new_messages | Ganzzahl | Zahl der in diesem Lauf neu abgeholten Nachrichten über alle Postfächer. |
error | Text kann null sein | Störungen des Laufs als Text, mehrere durch „ | “ getrennt, etwa ein Postfach, bei dem die Anmeldung scheiterte; leer, wenn es keine gab. |
hinweise | Text kann null sein | Anmerkungen des Laufs, die keine Störung sind, etwa ein noch nicht eingerichtetes Postfach oder der Empfänger einer automatisch beantworteten Mail, mehrere durch „ | “ getrennt; leer, wenn es keine gab. |
verbrauch.jsonl
Jeder Aufruf des Sprachmodells mit Zweck, Modell, Token-Zahlen und errechneten Kosten, als Grundlage für Kostenanzeige und Kostendeckel.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer des Aufrufs. |
zweck | Text | Wofür das Modell gefragt wurde.
|
model | Text | Bezeichnung des verwendeten Sprachmodells, zum Beispiel claude-haiku-4-5. |
input_tokens | Ganzzahl | Zahl der Token, die an das Modell gingen. |
output_tokens | Ganzzahl | Zahl der Token, die das Modell erzeugte. |
usd | Kommazahl | Kosten des Aufrufs in US-Dollar, vom Agenten aus den Token-Zahlen und einer im Programm hinterlegten Preisliste (Stand Oktober 2026) errechnet und nicht einer Rechnung des Anbieters entnommen; für ein dort unbekanntes Modell gilt der höchste hinterlegte Preis. |
created_at | Zeitpunkt SQLite UTC | Zeitpunkt des Aufrufs. |
schnittstellen_schluessel.jsonl
Die Schlüssel der offenen Schnittstelle, die die Verwaltung angelegt hat, mit Anlage, letzter Benutzung und Widerruf; der Schlüssel selbst ist nirgends gespeichert, und sein Prüfwert geht nicht in den Export.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer des Schlüssels, auf die schnittstellenprotokoll.schluessel_id verweist. |
name | Text | Name, den die Verwaltung beim Anlegen vergeben hat, damit sie den Schlüssel wiedererkennt; höchstens 80 Zeichen. |
anfang | Text | Die ersten 16 Zeichen des Schlüssels (die Vorsilbe nexaimail_ und sechs Zeichen), an denen man ihn erkennt; damit lässt sich nichts abrufen. |
angelegt_am | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem der Schlüssel angelegt wurde. |
angelegt_von | Text | Name der Person aus der Verwaltung, die ihn angelegt hat. |
zuletzt_benutzt | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt des letzten Abrufs mit diesem Schlüssel; leer, solange er nie benutzt wurde. |
widerrufen_am | Zeitpunkt SQLite UTC kann null sein | Zeitpunkt des Widerrufs; ab dann wird jeder Abruf mit diesem Schlüssel abgewiesen. Leer, solange er gilt; ein Ablaufdatum gibt es nicht. |
widerrufen_von | Text kann null sein | Name der Person aus der Verwaltung, die ihn widerrufen hat. |
schnittstellenprotokoll.jsonl
Jeder Abruf über die offene Schnittstelle, auch der abgewiesene, mit Schlüssel, Weg, Ergebnis, Größe und IP-Adresse; die IP-Adresse wird nach 90 Tagen geleert, die Zeile mit der Frist des Verwaltungsprotokolls (fristen.protokollTage) gelöscht.
| Feld | Format | Bedeutung |
|---|---|---|
id | Ganzzahl | Laufende Nummer des Abrufs. |
am | Zeitpunkt SQLite UTC | Zeitpunkt, zu dem die Antwort abgeschlossen oder abgebrochen war. |
schluessel_id | Verweis kann null sein | Nummer des benutzten Schlüssels in schnittstellen_schluessel.id; leer, wenn kein gültiger Schlüssel mitkam. |
schluessel_name | Text kann null sein | Name dieses Schlüssels zum Zeitpunkt des Abrufs; leer ohne gültigen Schlüssel. |
methode | Text | HTTP-Methode der Anfrage; außer GET wird alles abgewiesen. |
pfad | Text | Der abgerufene Weg, etwa /api/v1/tabellen/messages; von der Adresse nur der Weg und bei /api/v1/datei der Wert pfad, sonst nichts, damit ein versehentlich in die Adresse geschriebener Schlüssel nicht hier landet. |
status | Ganzzahl | HTTP-Status der Antwort.
|
bytes | Ganzzahl | Wie viele Bytes der Antwort hinausgingen; bei einem abgebrochenen Abruf weniger als die volle Größe. |
ip | Text kann null sein | IP-Adresse des Aufrufers, wie sie der vorgeschaltete Proxy meldet; dient dazu, einen entwendeten Schlüssel zu erkennen; nach 90 Tagen geleert, die Zeile bleibt als Nachweis, wer was abgerufen hat. |
einstellungen.json
Ein JSON-Objekt (RFC 8259, UTF-8) mit den Einstellungen des Hauses. Pfade mit [] stehen für jedes Element einer Liste. Felder, die nicht eingestellt sind, fehlen; dann gilt die Vorgabe des Programms. Zugangsdaten stehen nicht darin.
| Feld | Format | Bedeutung |
|---|---|---|
id | Text | Kennung des Hauses aus Kleinbuchstaben, Ziffern und Bindestrich, 2 bis 40 Zeichen. |
name | Text | Name der Firma. |
postfaecher[].id | Text | Kennung des Postfachs, eindeutig im Haus, dieselbe wie id in accounts.jsonl und account_id in messages.jsonl. |
postfaecher[].address | Text | E-Mail-Adresse des Postfachs. |
postfaecher[].kind | Text | Freie Beschriftung des Postfachs, etwa geschaeftlich, info oder buchhaltung; bei Anlage über die Oberfläche ist die Vorgabe geschaeftlich. |
postfaecher[].host | Text | Name des Servers, von dem der Agent die Post abholt (IMAP). |
postfaecher[].port | Ganzzahl | Port des Abholservers; bei Anlage über die Oberfläche ist die Vorgabe 993. |
postfaecher[].smtpHost | Text | Name des Servers, über den der Agent Mails versendet (SMTP). |
postfaecher[].smtpPort | Ganzzahl | Port des Versandservers; bei Anlage über die Oberfläche ist die Vorgabe 587. |
postfaecher[].ohneSignatur | ja/nein (true/false) kann null sein | true, wenn Mails aus diesem Postfach ohne Signatur hinausgehen, auch ohne die allgemeine, etwa bei einem privaten Postfach; fehlt das Feld, gilt die Signatur des Postfachs oder die allgemeine. |
postfaecher[].anmeldung | Text | Wie sich der Agent an diesem Postfach anmeldet; fehlt das Feld, gilt passwort; die Zugangsdaten selbst stehen nicht hier.
|
personen[].id | Text | Kennung der Person, eindeutig im Haus, auf die person_id in anderen Dateien verweist; fehlt die Liste personen ganz, gibt es einen einzigen Zugang, der alles sieht und verwaltet, und ein Eintrag mit der Kennung alle ohne Anmeldeadresse ist der Platzhalter für diesen früheren Einzelzugang. |
personen[].name | Text | Name der Person. |
personen[].email | Text | Anmeldeadresse der Person für die Oberfläche; ohne sie kann sich die Person nicht anmelden. |
personen[].rolle | Text | Was die Person im Haus darf; fehlt die Angabe, gilt verwalter, wenn die Person alle Postfächer sieht, sonst mitarbeiter.
|
personen[].postfaecher | Verweis | Welche Postfächer die Person sieht: eine Liste von Kennungen aus postfaecher[].id oder der Text alle; eine leere Liste heißt, dass sie noch keines sieht.
|
personen[].abwesendBis | Datum | Letzter Tag einer Abwesenheit; bis dahin bekommt die Person nichts zugewiesen, und was ihr zugewiesen war, geht an die Vertretung. |
personen[].vertretung | Verweis | Die Person, die während der Abwesenheit einspringt (Verweis auf personen[].id). |
personen[].gesperrt | ja/nein (true/false) | Steht hier true, ist die Person gesperrt: sie bleibt in der Liste, kann sich aber nicht anmelden und bekommt keine Post zugewiesen; beim Entsperren entfällt das Feld. |
fristen.nachrichtenTage | Ganzzahl | Löschfrist in Tagen für Nachrichten mit allem, was an ihnen hängt, sowie für Übersichten und Laufprotokoll, gerechnet ab dem Datum der Mail; Vorgabe 180, mindestens 7. |
fristen.anhaengeTage | Ganzzahl | Löschfrist in Tagen für Dateianhänge; Vorgabe 90, mindestens 7. |
fristen.entwuerfeTage | Ganzzahl | Löschfrist in Tagen für nicht gesendete Entwürfe und für den Wortlaut nie gesendeter Entwürfe im Freigabeprotokoll; Vorgabe 90, mindestens 7. |
fristen.protokollTage | Ganzzahl | Frist in Tagen, nach der im Freigabeprotokoll der Wortlaut entfernt wird (Zeile und Prüfsumme bleiben) und Einträge des Verwaltungs- und des Schnittstellenprotokolls gelöscht werden; Vorgabe 1095, mindestens 7. |
fristen.protokollEndeJahre | Ganzzahl | Volle Kalenderjahre nach dem Jahr der Freigabe, nach denen auch die Zeile im Freigabeprotokoll ganz gelöscht wird; Vorgabe 6, erlaubt 1 bis 30. |
fristen.verbrauchTage | Ganzzahl | Löschfrist in Tagen für die Zeilen zum Verbrauch des Sprachmodells; Vorgabe 1095, mindestens 7. |
vierAugen.an | ja/nein (true/false) kann null sein | Ob das Vier-Augen-Prinzip in diesem Haus gilt; fehlt die Angabe, gilt es; false hat die Verwaltung in den Einstellungen ausgeschaltet, die Schwellen bleiben dann erhalten. |
vierAugen.abBetragEuro | Ganzzahl | Betrag in Euro, ab dem eine Antwort auf eine erkannte Rechnung eine zweite Freigabe durch eine andere Person braucht; 0 heißt, der Betrag löst nichts aus; Vorgabe 1000; das Vier-Augen-Prinzip gilt nur, wenn sich mehr als eine Person anmelden kann. |
vierAugen.woerter[] | Text | Wort, bei dessen Vorkommen in Betreff oder Text eines Entwurfs eine zweite Freigabe nötig ist, ohne Rücksicht auf Groß- und Kleinschreibung; Vorgabe sind kuendigung, kündigung, kuendigen, vertrag, anwalt, rechtsanwalt, klage, mahnung und vergleich. |
vierAugen.empfaenger[] | Text | Adresse oder Domain der Gegenseite, bei der für jede Antwort eine zweite Freigabe nötig ist; Vorgabe ist keine. |
ziele.wichtigStunden | Ganzzahl | Zielzeit in Stunden, bis zu der eine wichtige Nachricht beantwortet sein soll; Vorgabe 4, erlaubt über 0 bis 720. |
ziele.normalStunden | Ganzzahl | Zielzeit in Stunden, bis zu der eine normale Nachricht beantwortet sein soll; Vorgabe 24, erlaubt über 0 bis 720. |
rechtemodell | Text | Wer im Haus Postfächer anbinden darf; fehlt die Angabe, gilt verwalter.
|
zugaenge | Ganzzahl | Zahl der gebuchten Zugänge, also der Personen, die mit dem Agenten arbeiten dürfen; fehlt die Angabe, sind es 3. |
postfachplaetze | Ganzzahl | Zahl der gebuchten Postfachplätze, also wie viele Postfächer das Haus anbinden darf; fehlt die Angabe, sind es 3. |
einrichtung.offen | ja/nein (true/false) | Ob der Einrichtungsablauf nach der ersten Anmeldung noch läuft; solange true, holt der Agent keine Post; fehlt der Abschnitt, gilt die Einrichtung als abgeschlossen. |
einrichtung.bestaetigt.fristen | Zeitpunkt ISO 8601 UTC | Zeitpunkt, zu dem die Löschfristen im Einrichtungsablauf ausdrücklich bestätigt wurden. |
einrichtung.bestaetigt.leute | Zeitpunkt ISO 8601 UTC | Zeitpunkt, zu dem die Personen im Einrichtungsablauf ausdrücklich bestätigt wurden. |
einrichtung.bestaetigt.freigaberegeln | Zeitpunkt ISO 8601 UTC | Zeitpunkt, zu dem die Freigaberegeln im Einrichtungsablauf ausdrücklich bestätigt wurden. |
einrichtung.abgeschlossenAm | Zeitpunkt ISO 8601 UTC | Zeitpunkt, zu dem der Einrichtungsablauf abgeschlossen wurde. |
rechnungsMail | Text | E-Mail-Adresse, an die NexAI die Rechnungen für dieses Haus schickt, vom Haus selbst eingetragen; fehlt das Feld, ist keine hinterlegt. |
stimmungseinstufung | ja/nein (true/false) | Ob der Agent einstuft, wie ein Absender klingt (sachlich, unzufrieden, verärgert); fehlt die Angabe, ist sie aus, und beim Ausschalten werden die gespeicherten Einstufungen gelöscht. |
kostendeckelUsd | Kommazahl | Obergrenze der errechneten Modellkosten je Kalendermonat (Weltzeit) in US-Dollar; ab 80 Prozent warnt der Agent, ist sie erreicht, holt er weiter Post, stuft aber nichts mehr ein und schreibt keine Entwürfe; 0 heißt kein Deckel; der Wert stammt nicht aus der Mandantendatei, sondern aus der Serverkonfiguration der Instanz und ist in der Oberfläche nicht änderbar. |
dateien/
Was das Haus selbst als Datei pflegt, unverändert kopiert. Fehlt eine Datei, hat das Haus sie nie angelegt.
| Datei | Format | Inhalt |
|---|---|---|
hausregeln.md | Markdown (UTF-8) | Die aktuell geltenden Hausregeln des Hauses: was der Agent beim Entwerfen beachten soll (Ton, was er nie selbst schreibt, wer freigibt, Eskalation), vom Haus über die Oberfläche gepflegt (höchstens 20.000 Zeichen) und beim ersten Lauf aus einer Vorlage angelegt; frühere Fassungen stehen in hausregeln.jsonl. |
fakten.md | Markdown (UTF-8) | Das Faktenverzeichnis: kurze Tatsachen, die der Agent in Antworten verwenden darf, etwa Firmenangaben, Angebot und was er nie von sich aus nennt; was dort fehlt, bleibt im Entwurf als Lücke; beim ersten Entwurf aus einer Vorlage angelegt; in der Oberfläche gibt es keinen Editor dafür, gepflegt wird die Datei direkt. |
signaturen/ | Ordner mit Textdateien (UTF-8) | Ordner mit den Signaturen, die beim Senden unter jede Mail gesetzt werden: je Postfach eine Datei <Postfach-Kennung>.txt, dazu wahlweise allgemein.txt als Ersatz für Postfächer ohne eigene; vom Haus über die Oberfläche gepflegt (höchstens 4.000 Zeichen) und beim ersten Lauf je Postfach aus einer Vorlage mit Platzhaltern in eckigen Klammern angelegt; kopiert wird der ganze Ordner. |
vorlagen/ | Ordner mit Markdown-Dateien (UTF-8) | Ordner mit Vorlagen für Mails zu Aufträgen aus dem NexAI-Portal, eine Markdown-Datei je Fall; benutzt nur, wenn die Instanz an das Portal angebunden ist; fehlt oder ist leer, wenn nie angelegt. |
wissen/ | Ordner mit Markdown- und Textdateien (UTF-8) | Ordner mit den Unterlagen des Hauses, aus denen der Agent beim Entwerfen Antworten belegt (zum Beispiel Preislisten oder Leistungsbeschreibungen), eine Datei je Thema; LIESMICH.md darin ist die mitgelieferte Erklärung. |
bausteine/ | Ordner mit Textdateien (UTF-8) | Ordner mit den Textbausteinen des Hauses für wiederkehrende Antworten, eine Datei <Name>.txt je Baustein; Platzhalter in geschweiften Klammern werden beim Einsetzen ersetzt. |
abfragen.json | JSON (RFC 8259, UTF-8) | Die lesenden Abfragen in Systemen des Hauses, die ein Mensch eingetragen hat: Name, Adresse mit Platzhaltern, erlaubte Muster der Werte und der Name des Zugangs. Die Schlüssel selbst stehen nicht darin. |
Prüfsummen und Prüfkette der Freigaben
Die Freigabeliste (freigaben.jsonl) hält fest, wer welchen Text geschrieben, geändert, freigegeben, gesendet oder verworfen hat. Sie ist so gebaut, dass eine nachträgliche Änderung auffällt.
- Prüfsumme des Wortlauts:
text_pruefsummeist SHA-256 über den Text in UTF-8, geschrieben als 64 Zeichen Hexadezimal in Kleinbuchstaben. Isttext_entfernt_amgesetzt, wurde der Wortlaut nach Ablauf seiner Frist gelöscht; die Prüfsumme bleibt als Nachweis. - Kettenglied:
ketteist SHA-256 (UTF-8, Hexadezimal, Kleinbuchstaben) über diese neun Werte, verbunden mit dem Zeichen|, in dieser Reihenfolge:ketteder vorhergehenden Zeile,person_id,aktion,text_pruefsumme,am,betreff,notiz,draft_id,message_id. Ein fehlender Wert (null) zählt als leerer Text, Nummern als Dezimalzahl ohne Nullen davor,amgenau so, wie es in der Datei steht. - Anfang der Kette: Die erste Zeile hängt am Wort
anfang. Wurden die ältesten Zeilen nach Ablauf ihrer Frist gelöscht, steht infreigaben_anker.jsonldie Prüfsumme der letzten gelöschten Zeile (kette) und ihre Nummer (bis_id); die Kette beginnt dann dort, und keine verbliebene Zeile darf eine Nummer bis einschließlichbis_idtragen. - Was die Kette nicht zeigt: Werden die letzten Zeilen entfernt, bleibt eine kürzere, in sich heile Kette. Das fällt nur im Vergleich mit einem früheren Stand auf: Zahl der Zeilen und letzte Prüfsumme von damals gegen heute.
Die Hausregeln (hausregeln.jsonl) tragen eine kürzere Prüfsumme: die ersten 16 Zeichen von SHA-256 über den Inhalt in UTF-8, hexadezimal in Kleinbuchstaben. Sie zeigt, ob sich eine Fassung von der vorigen unterscheidet.
Dieses Programm in Python 3 prüft einen entpackten Export, ohne etwas anderes als die Standardbibliothek: python3 pruefe_freigaben.py <Exportordner>
# Prüft die Freigabeliste eines Exports des NexAI Mailagenten.
# Aufruf: python3 pruefe_freigaben.py <entpackter Exportordner>
import hashlib, json, pathlib, sys
ordner = pathlib.Path(sys.argv[1])
def lies(name):
datei = ordner / name
if not datei.exists():
return []
return [json.loads(z) for z in datei.read_text(encoding="utf-8").splitlines() if z.strip()]
def sha256(text):
return hashlib.sha256(text.encode("utf-8")).hexdigest()
def wert(x):
return "" if x is None else str(x)
anker = next((a for a in lies("freigaben_anker.jsonl") if a["id"] == 1), None)
vorher = anker["kette"] if anker else "anfang"
bis = anker["bis_id"] if anker else 0
zeilen = sorted(lies("freigaben.jsonl"), key=lambda z: z["id"])
for z in zeilen:
glied = sha256("|".join([
vorher, z["person_id"], z["aktion"], z["text_pruefsumme"], z["am"],
wert(z["betreff"]), wert(z["notiz"]), wert(z["draft_id"]), wert(z["message_id"]),
]))
if glied != z["kette"] or z["id"] <= bis:
sys.exit(f"Kette gebrochen bei Zeile {z['id']}")
if not z["text_entfernt_am"] and sha256(z["text"] or "") != z["text_pruefsumme"]:
sys.exit(f"Wortlaut passt nicht zur Prüfsumme bei Zeile {z['id']}")
vorher = z["kette"]
print(f"Kette heil: {len(zeilen)} Zeilen, letzte Prüfsumme {vorher}")
Abruf über die Schnittstelle
Dieselben Daten gibt es ohne Oberfläche, nur lesend und kostenlos, unter der Adresse der jeweiligen Instanz. Den Schlüssel legt die Verwaltung unter „Datenschutz“ an; er gilt bis zum Widerruf und gehört in die Kopfzeile Authorization: Bearer …, nie in die Adresse. Jeder Abruf steht im Schnittstellenprotokoll. Die maschinenlesbare Beschreibung (OpenAPI 3.1) steht ohne Anmeldung unter /api/v1/openapi.json.
| Weg | Liefert |
|---|---|
GET /api/v1/export | Der ganze Export als ZIP-Datei, derselbe wie in der Oberfläche |
GET /api/v1/tabellen | Die Tabellen mit Zahl ihrer Zeilen |
GET /api/v1/tabellen/{name} | Eine Tabelle als JSON Lines, Zeile für Zeile wie im Export |
GET /api/v1/einstellungen | Die Einstellungen des Hauses, wie einstellungen.json im Export |
GET /api/v1/anhaenge/{id} | Ein Dateianhang; die Angaben dazu stehen in der Tabelle attachments |
GET /api/v1/dateien | Die Dateien, die das Haus pflegt, mit Pfad und Größe |
GET /api/v1/datei | Eine dieser Dateien, mit dem Pfad genau wie in der Liste |
curl -H "Authorization: Bearer $SCHLUESSEL" -o export.zip https://<instanz>.nexaimail.de/api/v1/exportWas nicht enthalten ist, und warum
konten: Passwort-Prüfwerte und Geheimnisse des zweiten Faktors der Benutzerwiederherstellungscodes: Prüfwerte der Wiederherstellungscodeseinrichtungen: Prüfwerte der Einrichtungslinkssitzungen: laufende Anmeldungen, nach Abmelden oder Ablauf wertlosanmeldeversuche: Sperre gegen das Raten von Passwörtern, nach 24 Stunden gelöschtzugaenge: Zugangsdaten der Postfächer und der angebundenen Systeme, verschlüsselt; Geheimnisse gehören in keinen Exportzugang_protokoll: Nutzung dieser Zugänge durch NexAI-Systemezentrale_jti: Einmalkennungen der Zugangszentrale gegen Wiederholungabrechnung_postausgang: Zustellwarteschlange der Buchungsmeldungen an NexAI; die Buchungen stehen im Verwaltungsprotokollautomatik_antworten: Schleifenschutz der Automatik; was versandt wurde, steht im Freigabeprotokollsync_state: Abrufstand je Postfachordnerpostausgang_auswege: technischer Ausweichweg beim Versandpraesenz: wer gerade eine Nachricht geöffnet hat, nach Minuten wertlosmeldungen: Dämpfer gegen doppelte Mitteilungenmessage_index: Suchindex, aus den Nachrichten jederzeit neu gebaut- zugang.key: der Schlüssel, mit dem die Zugangsdaten verschlüsselt sind
- Konfiguration des Servers: Schlüssel für Datenbank, Sprachmodell und Anmeldedienste; Geheimnisse gehören in keinen Export
- anfragen/: Ablagen für den Angebotsagenten, Kopien von Nachricht und Anhängen, die schon in messages.jsonl und anhaenge/ stehen
- beipack/: Verarbeitungsverzeichnis und technische Anlage zum Auftragsverarbeitungsvertrag, von NexAI aus den Einstellungen erzeugt
- Anweisungen von NexAI an das Sprachmodell: Teil der Software, nicht Daten des Hauses; die Hausregeln des Hauses sind enthalten