Parties — how it works
The package ships one node type, Parties/PartyAnalysis. A node holds a document and, after
Analyse, the table of its parties: every person and organisation the document names, the role
each plays in this document, the other ways the document writes the name, a quote that shows the
role, and a confidence. Getting the package puts a Sample Dossier in your space — a fictitious
discharge letter to try it on.
1. Give it a document
Open Edit on the node and either
- paste the text into Text, or
- name a stored file in Document — a content reference such as
Acme/Dossiers/content/huber.pdf. PDF, DOCX and text files are read as text. You must be allowed to read the node that owns the file; a scanned PDF has no text until it is OCR'd.
2. Choose the roles
Catalog picks a preset:
| Catalogue | Roles |
|---|---|
PatientDossier |
patient, treating physician, referring physician, nurse, therapist, relative, hospital, practice, insurer, service provider |
Contract |
contracting party, individual party, signatory, contact person, guarantor, third party |
InsuranceClaim |
claimant, insured, witness, adjuster, expert, insurer, broker, third party |
Generic |
person, organisation |
A node that needs other roles lists its own in Roles (id, kind person/organisation, and a
sentence saying how to tell it from its neighbours — the model decides by that sentence).
3. Analyse
The button runs four steps:
- Read the document as text.
- Candidates. Where the mesh runs the
s1-extractname extractor (S1Extract:Endpoint), it proposes person and organisation names. It is a small CPU model (GLiNER) that finds names and decides nothing. - Roles. A language model reads the document with the role catalogue and the candidates and
answers which party plays which role. 🇪🇺 Required data residency is
Euby default: only a model that processes data in the EU is used, and when there is none the run fails and the document is sent nowhere. Clear the field to defer to the instance's own rule. - Ground. Every name, alias and quote is checked against the document text, word by word. A
name the model returned that the document does not contain is dropped (the run's note counts
them); a role outside the catalogue becomes
other; a candidate the model skipped is listed asunassignedfor review. Two people who share a surname stay two people.
🚨 A provider that masks personal data cannot be used. Some gateways redact names before the model reads them — an OpenRouter key with PII masking turns "Dr. med. Peter Brunner" into "Dr. med. [PERSON_NAME]" for every model behind it (measured 2026-09-29: 6 of the Sample Dossier's 11 parties masked — 5 of its 7 people and the hospital). The model then cannot say who plays which role, and the grounding step would drop every masked party without a word. So a reply that contains such a placeholder fails the run and names the cause; pick a model whose provider does not mask names, or a self-hosted one.
The run's notes say what was left out — no extractor, names dropped, a document longer than the 60,000 characters one run reads.
Why two models
Measured 2026-09-28 with fastino/gliner2-multi-v1 (0.3B, Apache-2.0) on a fictitious German
discharge letter — the Sample Dossier: 1,051 characters naming 7 people and 4 organisations —
on CPU only, 4 threads, after a one-off 25 s model load:
| Run | Names found | People given the right role | Time |
|---|---|---|---|
Generic labels person / organization |
all 7 people and 4 organisations, short forms linked ("Frau Huber", "S. Keller"); plus 2 non-names ("uns", "Musterstadt") | — | 0.2 s |
| Role ids as the labels | 6 of 7 people (missed the assistant physician) | 3 of 6 — the family doctor as "treating physician", the husband and daughter as "patient" | 0.2 s |
| One role choice per person over its sentences | 7 of 7 | 3 of 7 — the other four all "patient" | 1.3 s |
The organisations' roles (hospital, insurer, service provider) were right in every run.
The same letter through this package's own prompt and catalogue, to a language model that saw the names (Claude Haiku, 2026-09-29 — a prompt-quality check on invented data, not the EU path): all 7 people and 4 organisations, 11 of 11 roles right — the family doctor as referring physician, husband and daughter as relatives, the assistant physician as treating physician. Its one invented alias (an abbreviation the letter never uses) is exactly what the grounding step removes.
A small extraction model is fast, cheap and good at finding names, and weak at deciding a role that depends on the whole letter ("Dr. Brunner" is the referring doctor because the letter is addressed to him). "System One" decision models (TypeSafe's Jev, the open-weight Kev family, September 2026) answer typed questions but cannot extract a name at all. So the extractor proposes and a language model with the whole document decides, and the grounding step keeps the model from adding anyone.
Relation to the client-name gate
Governance/NameCheck blocks builds that name a client, by matching against the CRM
(ClientNameGate). It uses the same s1-extract service for names the
CRM does not know. This package does not take part in that gate; it only reads documents you give
it.