Direkt zum Hauptinhalt

Versionshistorie

Version 0.6.0 (In Entwicklung)

  • PostfachOptionen/IPostfachLeser: Neuer Ablageordner VorschlagOrdner fuer Dokumente, die unter der Anlageschwelle blieben. Bisher kannte die Ablage nur Erfolg oder Fehler, und ein Beleg, der nur als Vorschlag gemeldet wurde, landete im VerarbeitetOrdner — neben den tatsaechlich angelegten Auftraegen und von ihnen nicht zu unterscheiden. In der Pilotphase mit angehobener Anlageschwelle ist genau diese Trennung der Arbeitsvorrat fuer die manuelle Nachkontrolle. IPostfachLeser.MarkiereVerarbeitetAsync nimmt statt des bool erfolg jetzt das Ablageziel Ablage (Verarbeitet, Fehler, Vorschlag); AibeErgebnis.Ablage leitet es aus Staffel-Entscheid und Beleganlage ab. Ohne gesetzten VorschlagOrdner bleibt das Verhalten wie bisher.
  • GraphPostfachLeser: Quelle darf ein Ordnerpfad sein (Inbox/Bestellungen), aufgeloest Ebene fuer Ebene ueber die Kindordner; bisher wurden nur oberste Ordner per Anzeigename gefunden und ein Unterordner des Posteingangs brach den Start mit „Quellordner nicht gefunden" ab. Die Ablageordner entstehen jetzt unterhalb des Quellordners wie bei IMAP und Dateisystem — bisher legte Graph sie als oberste Ordner neben dem Posteingang an. Bestehende Graph-Installationen finden neue Mails deshalb ab dieser Version unter Posteingang/Verarbeitet statt im obersten Verarbeitet; die alten Ordner bleiben unangetastet.

Version 0.5.1

  • MesoXPO.Business auf 2026.4.79-beta55 angehoben (Bugfix bei den Beleganhaengen): Bisher vergab die Bibliothek die Dokumentgruppe eines neuen Belegs aus MAX(T496CMP.C014) + 1 und schrieb sie nach T025.C076 und T496CMP.C012. Dieser Zaehler ist kein WinLine-Schema und lief in der Praxis nicht sauber hoch — in der Folge landeten die Originalbestellungen mehrerer Auftraege in einer Gruppe, und WinLine zeigte am einzelnen Auftrag auch die Bestell-PDFs fremder Auftraege. Ab beta55 ist die Gruppe die Archiv-DokId des ersten Anhangs (Schema des MESO Archivimporters); eine am Beleg schon vorhandene Gruppe bleibt erhalten. Die Zuordnung wird damit je Beleg eindeutig. Bereits falsch gruppierte Belege muessen einmalig in der Datenbank korrigiert werden (C076 je Beleg auf die DokId seines eigenen Anhangs, C012 der Anhaenge entsprechend); der Dienst selbst verhaelt sich sonst unveraendert. Nebeneffekt: MesoAibe.DiagnoseTool zieht die Microsoft.Extensions.*-Pakete von 10.0.11 auf 10.0.12 nach, weil die Bibliothek diese Mindestversion verlangt.

Version 0.5.0

  • AibeServiceKonfiguration/AibeOptionen: Die Stellschrauben der Semantik-Stufe sind jetzt über Aibe:Ki erreichbar — MinAehnlichkeit, AutoAcceptKonfidenz, AmbiguitaetsAbstand, RerankBestaetigtKonfidenz, MaxRerankKandidaten, IndexTtl, IndexFehlerSperre, IndexZwischenspeicherAlle. Sie existierten in SemantikOptionen der Bibliothek schon, das Service-POCO kannte sie aber nicht, sodass sie im Betrieb unveränderbar auf den Defaults standen. Besonders MinAehnlichkeit ist modellabhängig: ein Embedding-Modell mit hohem Ähnlichkeits-Grundniveau macht bei 0.35 praktisch jeden Artikel zum Kandidaten, und ohne diesen Weg gab es dagegen keinen Hebel. Alle Felder sind nullable, ein fehlender Schlüssel behält also den Bibliotheks-Default — bei IndexZwischenspeicherAlle bleibt 0 dabei ein gültiger Wert („Zwischenspeichern aus"). Sie stehen bewusst nicht in der ausgelieferten appsettings.json, damit ein eingefrorener Wert spätere Default-Verbesserungen nicht blockiert

  • AibeOptionen/XpoStammdatenQuelle: Neue Option Aibe:StammdatenCacheMinuten (AibeOptionen.StammdatenCacheDauer) für die Gültigkeitsdauer des Artikel-/Preis-Zwischenspeichers, bisher fest auf dem Bibliotheks-Default von 5 Minuten. Bis zum Ablauf ist eine frisch in WinLine angelegte Artikelnummer für alle Matching-Stufen unsichtbar — auch für die Fuzzy- und Nummernstufen, die gar nicht am Embedding-Index hängen; das wurde regelmäßig als „der Embedding-Cache muss erst neu gebaut werden" fehlgedeutet. 0 liest bei jedem Zugriff neu, ohne Angabe bleibt es bei 5 Minuten

  • MesoAibe.DiagnoseTool (neu, PR #20): Konsolen-Werkzeug fuer den Kundeneinsatz — status zeigt den Embedding-Cache-Stand eines Mandanten (Anzahl Eintraege, Modell/BaseUrl), rebuild stoesst den Aufbau manuell an und zeigt Fehler live in der Konsole statt nur im Servicelog, matching testet Artikel-Matching interaktiv inklusive Embedding/Rerank (anders als MesoTestConsole im Bibliotheks-Repo, das Embedding bewusst auslaesst). Reines lokales CLI-Werkzeug ohne neuen Netzwerk-Port; wird ab diesem Release als eigenes Zip-Asset ausgeliefert (siehe MesoAibe.DiagnoseTool/README.md).

  • MesoAibe.DiagnoseTool: Neuer Befehl validiere <Mandant> <dokument.eml|.pdf> [--soll <datei>] [--bericht <pfad>] — schickt eine echte eingegangene Bestellung durch dieselbe Extraktion und denselben Matching-Sammelaufruf wie der Dienst und zeigt je Position, was die Extraktion gelesen hat und was das Matching daraus macht. Damit laesst sich eine Fehlzuordnung einer der beiden Stufen zuordnen, statt sie zu erraten. Je Position erscheint das Urteil automatisch / zu pruefen / ohne Treffer (dieselben Schwellen, die der Dienst anwendet) sowie bei mehreren Kandidaten die naechsten drei. --soll gibt eine erwartete Artikelnummer je Position vor und macht daraus eine Pruefung mit Bilanz (getroffen / falsch / nicht gefunden; der Abgleich laeuft ueber die Vergleichsform, die Nummer muss also nicht zeichengenau abgeschrieben werden), --bericht schreibt das Ergebnis als Markdown. Es wird kein Beleg angelegt und kein Import-XML geschrieben; Extraktion und Rerank kosten wie ein echter Durchlauf. Der Befehl bindet das volle Aibe-Schema des Dienstes und braucht deshalb einen Extraktions-Zugang und den Mandanten-Eintrag — nur ueber ihn greift ein mandantenspezifischer ExtraktionPrompt; fehlt er, laeuft die Extraktion mit dem Standard-Prompt und das Werkzeug weist darauf hin.

  • MesoAibe.DiagnoseTool: Neuer Dialog-Befehl neu im matching-Modus — lädt Artikel, Preise und Ersatznummern sofort neu, statt den Ablauf des Zwischenspeichers (fünf Minuten) abzuwarten. Bis dahin ist eine frisch in WinLine angelegte Artikelnummer in allen Stufen unsichtbar, auch in den Fuzzy- und Nummernstufen, die gar nicht am Embedding-Index hängen — das wurde regelmäßig als „der Embedding-Cache muss erst neu gebaut werden" fehlgedeutet. Der Hinweistext sagt deshalb ausdrücklich, dass neu den Index nicht anfasst und dafür rebuild <Mandant> zuständig ist

  • MesoAibe.DiagnoseTool: Der matching-Dialog weist jetzt darauf hin, wenn eine Eingabe ohne # nach einer Nummer aussieht (kein Leerzeichen, mindestens eine Ziffer, ab drei Zeichen) und die Textsuche keinen Kandidaten über der Auto-Accept-Schwelle geliefert hat. Ohne # gilt die Eingabe als Bezeichnung, es laufen also nur die Textstufen — eine hinterlegte Artikel-, Ersatz- oder Kundenartikelnummer wird dann nicht gefunden, was leicht als „Nummer fehlt im Stamm" fehlgedeutet wird. Der Hinweis nennt den fertigen Befehl (a #<Eingabe>) und ändert nichts am Matching

  • MesoAibeServiceCollectionExtensions: Neue Methode AddMesoAibeExtraktion(optionen) — registriert nur die Extraktion samt Inhaltsteil-Aufbereitern, also den Teil von AddMesoAibeCore, der ohne Beleganlage, WebService und Anlage-Staffel auskommt und die Konfiguration nicht validiert. AddMesoAibeCore ruft sie auf; das DiagnoseTool nutzt sie fuer validiere, damit die Bedingung fuer den PDF-zu-Bild-Aufbereiter nicht ein zweites Mal nachgebaut wird.

  • OrdnerLeser: LiesDokument(pfad) ist jetzt oeffentlich und liefert Dokument plus Rohbytes — dieselbe Abbildung von .eml/.pdf, die die Pipeline verwendet. Das DiagnoseTool liest damit eine einzelne Datei ein, statt die Abbildung zweitgleisig nachzubauen.

  • MesoXPO.Business auf 2026.4.79-beta40 angehoben (Verhaltensaenderung im Artikel-Matching): Die Nummernstufen sind fehlertolerant geworden — eine genannte Artikelnummer, die sich nur in Trennzeichen unterscheidet, trifft mit Konfidenz 94 und wird ohne LLM-Aufruf uebernommen; ein Zahlendreher oder ein einzelnes falsches Zeichen erzeugt einen Kandidaten mit Konfidenz 70 unter der Auto-Accept-Schwelle, der in den Rerank geht. Der Rerank erhaelt jetzt zusaetzlich die genannte Nummer und wird auch fuer Positionen ausgeloest, die nur einen Kandidaten unter Auto-Accept haben oder gar keine Bezeichnung tragen — solche Positionen liefen bisher ungeprueft durch. AibeVerarbeitung und die Konfiguration bleiben unveraendert: die Kaskade greift ueber FindeMehrereMitEmbeddingAsync von allein, beide Stufen sind per Default an. Der README-Hinweis „Zahlendreher deckt der Prompt nicht ab" ist damit ueberholt und ersetzt.

Version 0.4.0

  • PngKodierer (Bugfix, PR #13): Docnet/PDFium rendert PDF-Seiten mit praemultipliziertem Alpha auf transparentem Grund; der Encoder verwarf das Alpha und lieferte fuer jede echte Seite ein komplett schwarzes Bild. Jetzt wird gegen Weiss kompositiert (Kanal + (255 - Alpha)), Regressionstest mit variablem Alpha. Ohne den Fix war PdfAlsBildFuerExtraktion aus 0.2.4 in der Praxis unbrauchbar.
  • Demo-Stack: Ollama-Profil auf das Vision-Modell qwen2.5vl umgestellt (Rerank bleibt beim Textmodell), PdfAlsBildFuerExtraktion in beiden Profilen gesetzt; neuer Testfall testdaten/t9_auermann_schlecht_gescannt_kein_text.pdf (Scan-PDF ohne Textlayer).
  • Artikelmatching-Sammelaufruf (MesoXPO.Business 4.79-beta37, PR #266 der Bibliothek): AibeVerarbeitung ruft IArtikelMatchingService.FindeMehrereMitEmbeddingAsync einmal fuer alle Positionen eines Belegs auf statt FindeMitEmbeddingAsync je Position — ein Embedding-Aufruf fuer alle unsicheren Positionen, hoechstens ein Rerank-Aufruf fuer alle mehrdeutigen. Verhaltensaenderung der Bibliothek: woertlich identische Bezeichnungen tragen jetzt Matchgrund "Bezeichnung (exakt)" (Konfidenz 92) statt "Bezeichnung (Fuzzy)" (85), sichere Identifier-Treffer fuehren keine "Bezeichnung (Semantik)"-Kandidaten mehr in der Liste. Demo-Stack: RerankModel auf qwen2.5vl (= ExtraktionModel) umgestellt, damit Ollama kein drittes Modell zusaetzlich zu Extraktion/Embedding vorhalten muss.
  • Matching-Konsolidierung (MesoXPO.Business 4.79-beta38, PR #267 der Bibliothek): XpoArtikelStammProvider.LadePreise laedt T043 jetzt flach ueber zwei Abfragen statt einer Abfrage je Artikel (N+1) — weil IStammdatenQuelle in MesoAibeServiceCollectionExtensions transient registriert ist, lief die Preisladung bisher bei JEDEM Beleg kalt. Preiszeilen inaktiver Artikel (verkaufte Chargen) entfallen dabei: eine Kundenartikelnummer liefert keine inaktive Charge mehr als Kandidat mit Konfidenz 96. ArtikelMatcher fuehrt ab 2000 Artikeln einen Token-Vorfilter vor den Fuzzy-Stufen (Schwelle ueber AddStammdatenMatching(fuzzyVorfilterAb), Default 2000, in MesoAibe ungenutzt = Default) — das ist KEINE reine Performance-Massnahme: ab der Schwelle faellt jeder Fuzzy-Kandidat raus, dessen Text kein vollstaendiges Suchtoken (>=3 Zeichen) enthaelt, Tippfehler-/Abkuerzungstreffer koennen dadurch aus der Fuzzy-Kaskade verschwinden (Rueckfallnetz: die nachgelagerte Embedding-Stufe faengt das meist auf, ist aber keine Zusicherung). KundenMatchInput ist [Obsolete], Nachfolger PersonenkontoMatchInput (GenannteKundennummer -> GenannteKontonummer) — siehe naechster Punkt fuer die Abloesung von KundenMatcher durch PersonenkontoMatcher in MesoAibe. Pilot-Lauf Demo-Mandant 500M: Artikelmatching (inkl. Preisladung) je Beleg zuvor rund 22s (am Demo-Mandanten vor diesem Bump beobachtet), in einem Pilot-Lauf gemessen 0,4s (siehe docs/superpowers/pilotlauf-2026-09-05-beta38.md) — dieser Lauf hatte ausschliesslich exakte Artikelnummern-Treffer und deckt die Fuzzy-Kaskade/den Token-Vorfilter damit nicht ab.
  • Personenkonto-Matching (MesoXPO.Business 4.79-beta39, Issue #268 der Bibliothek): BelegVorschlagBuilder.MatcheKunde erwartet jetzt IPersonenkontoMatcher statt der Debitor-Huelle IKundenMatcher (die Huelle bleibt in der Bibliothek bestehen, ist aber nicht mehr die Builder-Abhaengigkeit) — MesoAibes Tests instanziieren daher PersonenkontoMatcher() statt KundenMatcher(). RohBelegdaten traegt neu PlzGenannt, StrasseGenannt, LandGenannt, WebsiteGenannt (von der Extraktion automatisch befuellt, kein Belegfeld-Konfigurationsaufwand), wodurch die Adress- (PLZ+Strasse-Fuzzy, 75/80) und Website-Stufe (70) der Kaskade jetzt greifen. IStammdatenQuelle/XpoStammdatenQuelle liefern zusaetzlich LadeBankverbindungen(), LadeMandant() und LadeKonten(Kontoart) (delegieren an den vorhandenen XpoKontoStammProvider); AibeVerarbeitung laedt Bankverbindungen und Mandant und reicht sie an MatcheKunde durch (IBAN aktuell ohne Wirkung: RohBelegdaten hat bewusst kein IbanGenannt — der Anwendungsfall ist die eingehende Bestellung, nicht die Eingangsrechnung). Der tatsaechliche Effekt von mandant: die eigene Mandanten-USt-ID wird beim USt-ID-Matching uebersprungen (Stufe 3), und die Adress-Stufe bekommt einen Land-Bonus (Konfidenz 80 statt 75, wenn mandant.Land mit KontoRow.Land uebereinstimmt und kein LandGenannt im Dokument steht) — die Laenderplausibilitaet (UstIdLaenderPlausibilitaet.PasstZuLand) selbst haengt an input.Land (RohBelegdaten.LandGenannt) und war schon vor der Mandant-Verdrahtung aktiv. Kontoart bleibt Kontoart.Debitor (Default, unveraendert) — Interessenten (Kennzeichen 4) bleiben aussen vor, siehe Issue #18: AIBE legt nur Auftraege an, ein Interessenten-Treffer liesse sich ohne Debitorenkonto nicht ummuenzen.

Version 0.2 (Releases 0.2.0 bis 0.2.4)

  • PdfAlsBildFuerExtraktion (neu, 0.2.4, PR #12): Option Aibe:Ki:PdfAlsBildFuerExtraktion rendert PDF-Seiten auf dem lokalen Extraktionspfad per Docnet/PDFium zu PNG und schickt sie einem Vision-faehigen ExtraktionModel, statt sie ueber den ohne tessdata wirkungslosen Tesseract-Pfad in Text zu wandeln. Behebt den Abbruch PDF '<Dateiname>' lieferte keinen Text (OCR fehlgeschlagen) bei Scan-PDFs. PNG-Encoder ohne Fremdpaket (ZLibStream aus der BCL). Default false.

  • MesoXPO.Business 4.79-beta35 (PR #259 der Bibliothek, keine Host-Aenderung): Auspraegungen (Chargen, Seriennummern, Varianten) im Artikel-Matching — textgleiche Chargen erscheinen nicht mehr als eigene Kandidaten, kopierte EAN/Alternativnummern/Hersteller-Codes zaehlen nur am Hauptartikel, eigene Werte treffen die Auspraegung, der Embedding-Index bettet Chargen nicht doppelt ein, NurChargenartikel fragt T024 nicht mehr je Position ab. Neu: Ein Endtreffer auf einen Hauptartikel mit Auspraegungen ohne gewaehlte Auspraegung wird auf Konfidenz 50 gedeckelt und im Bericht als „Auspraegung offen" ausgewiesen — der WinLine-Import nimmt die reine Hauptartikelnummer an, legt aber nur die Hauptartikelzeile an. Liegt Anlage.AnlegenAbKonfidenz ueber 50, endet ein solcher Beleg als Vorschlag.

  • MesoXPO.Business 4.79-beta33: NurChargenartikel der Prozedur-Aufloesung bewertet jetzt die T024-Zeile des Basisjahres des Mandanten (Bibliotheks-Bugfix in XpoProzedurArtikelZugriff, PR #255); vorher konnte irgendeine Wirtschaftsjahr-Zeile des Artikels entscheiden.

  • Stammdaten-Fallback der Belegfelder (MesoXPO.Business 4.79-beta32, PR #253): Kopffelder koennen Stammfeld (Pfad auf Personenkonto oder Ansprechpartner) und Gruppe tragen; AddMesoAibeCore registriert den StammfeldAnreicherer der Bibliothek immer (vor den Prozedur-Aufloesungen), der Orchestrator reicht kontext.Stammwerte an Finalisiere weiter. Ein Feld mit Stammfeld wird immer geschrieben — WinLine importiert angezeigte Vorlagenfelder sonst leer. README-Abschnitt „Stammdaten-Fallback" mit Lief.*-Beispiel.

  • MesoXPO.Business 4.79-beta34: Extraktionsschema vollstaendig required (behebt Schema is too complex), Plausibilitaetspruefung der Positionsanzahl (fail-closed, Mail landet im Fehlerordner), Stammdaten-Cache im Artikel-Provider (60 Positionen: Matching 32 s statt 1063 s), MaxTokens-Default 16384 — Vorlage appsettings.json entsprechend angehoben.

  • MesoXPO.Business 4.79-beta32: Anbindung des Fremdsprachen-Matchings (Stufe 5b) und der generischen Prozedur-Artikelaufloesung — neue Optionen Fremdsprachen und ProzedurAufloesungen in AibeOptionen/AddMesoAibeCore und als Mandanten-Sektionen in appsettings.json; der Orchestrator reicht die Dokumentsprache ans Matching durch und uebergibt das Ergebnis der Anreicherer-Kette an Finalisiere (ersetzte Treffer, z.B. Chargen-Artikelnummern, kommen so in den Beleg; Protokollzeile Treffer ersetzt).

  • MesoAibe.Service: Kopffelder/Positionsfelder binden den Bibliothekstyp Belegfeld direkt (POCO-Spiegel entfernt) — interne Extrakt-Felder ohne Vorlagenfeld sind damit konfigurierbar.

  • LizenzPruefung: Lizenz-Zugangsdaten jetzt auch ueber die Konfiguration (Aibe:Lizenz:Kundennummer/Lizenznummer) — Standardquelle im Kundeneinsatz; die Umgebungsvariablen LICENSE_CUSTOMER_NR/LICENSE_LICENSE_NR gewinnen bei Vorhandensein als Override (je Feld einzeln)

Version 0.1

  • MesoAibe.Core (neu): Quellenneutraler Kern — AibeOptionen/AnlageStaffel (Beleganlage- Konfidenz-Staffel mit getrennter Druckschwelle), BelegAnlageEntscheid (pure Entscheidung Vorschlag/Anlegen-ohne-Druck/Anlegen-mit-Druck), Orchestrator AibeVerarbeitung (Extraktion -> Matching -> Anreicherung -> Beleganlage), DI-Einstieg AddMesoAibeCore.
  • MesoAibe.Core (neu): NullKontaktReranker als Fallback, wenn keine Rerank-Quelle konfiguriert ist (weder Anthropic-Key noch BYO-Rerank-Endpunkt) — der Ansprechpartner-Schritt degradiert dann auf reine E-Mail-exakt-Suche, der Host bleibt trotzdem startfaehig.
  • MesoAibe.Ingest (neu): IPostfachLeser-Implementierungen OrdnerLeser (Dateisystem, .eml/.pdf), ImapPostfachLeser (MailKit) und GraphPostfachLeser (Microsoft Graph, ClientSecretCredential), konfiguriert je Quelle ueber PostfachOptionen.
  • MesoAibe.Service (neu): Standalone-Host mit AibeServiceKonfiguration (Aibe:Ki/Aibe:Mandanten/Aibe:IntervallSekunden), Lizenzpruefung gegen den Artikel MESO-AIBE (LICENSE_CUSTOMER_NR/LICENSE_LICENSE_NR), Intervall-Worker AibeWorker, Serilog-Journal und Textberichte (.txt) je Dokument.
  • CI/CD (neu): .github/workflows/release.yml — NuGet-Publish von MesoAibe.Core/ MesoAibe.Ingest nach GitHub Packages und self-contained win-x64-Zip von MesoAibe.Service als Release-Asset, ausgeloest bei release: published.
  • GraphPostfachLeser/ImapPostfachLeser (Bugfix): Doppelanlage-Schutz — Nachrichten werden unmittelbar nach erfolgreichem Lesen als gelesen markiert (Graph: isRead-Patch mit isRead eq false-Filter; IMAP: Quellordner mit FolderAccess.ReadWrite, Seen-Flag), statt erst beim Verschieben in den Ablageordner. Verhindert, dass ein spaeter scheiternder Move dieselbe Nachricht beim naechsten Lauf erneut liefert.
  • AibeWorker (neu): zusaetzlicher, prozesslebenslanger Gurt gegen Doppelverarbeitung ueber VerarbeiteteQuellen (Schluessel Mandant+Postfach-Index+QuellId) — siehe Abschnitt "Grenzen v1".
  • MesoAibe.Service/Program.cs (Bugfix): Directory.SetCurrentDirectory(AppContext.BaseDirectory) frueh beim Start, damit relative Pfade aus appsettings.json auch im Windows-Dienst-Betrieb (CWD System32) korrekt aufloesen; ausserdem ein Top-Level-catch, das einen unerwarteten Fehler beim Host-Aufbau/-Start als Fatal loggt und mit Exit-Code 1 beendet, sowie eine Duplikatpruefung auf Aibe:Mandanten[].Mandant (getrimmt, case-insensitiv) — ein doppelter Eintrag wird uebersprungen statt zwei DI-Container fuer denselben Mandanten aufzubauen.
  • GraphMapper (Bugfix): Absender kommt jetzt aus Message.From (fachlicher Absender), mit Message.Sender nur als Rueckfallebene — vorher wurde ausschliesslich Sender gelesen.
  • GraphMapper/MimeMapper (Bugfix): Empfangsdatum wird ueber DateTimeOffset.LocalDateTime (statt .DateTime) abgebildet, damit das Offset der Quelle nicht verloren geht und beide Quellen konsistent Maschinen-Lokalzeit liefern.

Unterstuetzung: Bei Fragen zur Verwendung oder Integration wenden Sie sich an den CSS EDV-Support.