> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.emtelligent.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.emtelligent.com/_mcp/server.

# Release notes for NLP API 2.36

## Contents

* [Brief Summary](#brief-summary)
* [New Features](#new-features)
* [Changes](#changes)
* [Python SDK updates](#python-sdk-updates)
* [Benchmarking](#benchmarking)

## Brief Summary

### Release versions

* NLP API version 2 Release 36.
* Python SDK and client v6.10.0.
* Java SDK and client v5.15.0 (deprecated).
* [NLP API specification v2.20.0](/nlp/api): added single API key authentication for some deployments.
* JSON result output schema v2.34.0 for [emtellipro-json-2](/nlp/reference/result-format): added concept links for relations.
* [visualclient](https://visualclient.emtelligent.com) version `v2025.07.02-8e1c4f`: minor visualization improvements and bug fixes.

### Highlights

* New discontinuous entity spans by assigning concept links to some relations.
* UMLS ontologies updated to 2025AA version (2025-05-05).
* LOINC and NCI entitylink update 2025-06-23.
* SNOMED-CT ontology updated to US Edition 2025-03-01 release.
* Relation and attribute updates and SNOMED-CT entity linking updates.

## New Features

### Concept Links for Relations

For a specific set of relations in the NLP API we combine the two arguments in the relation and use that as a synonym and we find a match to a SNOMED ontology concept for that synonym and link the SNOMED concept ID to the relation. In this release we only support concept links for the following relations:

* qualifier relation
* anatomicsite relation

We report concept links for these relation for SNOMED ontology only (if a concept link is found). We do not address mappings into UMLS, ICD-10 and ICD-10-CM

#### Qualifier relation example

To explain this consider the following sentence:

```text
The patient has mild mitral regurgitation.
```

In this case the NLP API finds a SNOMED concept ID `838451005` for the span `mild mitral regurgitation`.

However in the sentence:

```text
Her mitral regurgitation now appears to be mild.
```

The NLP API finds a SNOMED concept ID `48724000` instead for the span `mitral regurgitation`. However there is a qualifier relation linking `mild` to `mitral regurgitation`. By merging the two argument spans of the qualifier relation we can identify the same SNOMED concept ID of `838451005` as we did for the contiguous span `mild mitral regurgitation`.

The NLP API JSON output would capture this as a new field on the relation called concept_links which is similar to the concept_links field that is currently produced in the found entities output.

Both the concept_links have labels that can be looked up in the concepts part of the NLP API JSON output.

```javascript
"qualifiers": [
    {
        "label": "RQ0",
        "attributes": {
            "confidence": 1,
            "qualifier_type": "size/severity"
        },
        "concept_links": [
            "Csnomed4"
        ],
        "args": {
            "qualifier": {
                "ref": "E2",
                "text": [
                    "mild"
                ]
            },
            "qualifies": {
                "ref": "E7",
                "text": [
                    "mitral regurgitation"
                ]
            }
        }
    }
],
...
"concepts": {
  "snomed": [
      {
          "label": "Csnomed4",
          "concept_id": "838451005",
          "description": "Mild mitral valve regurgitation (disorder)"
      }
  ]
}
```

#### Anatomic Site relation example

Consider the sentence:

```text
pt has ureters injury.
```

In this case the span `ureters injury` is mapped to SNOMED concept ID `24850009`.

While in the sentence:

```text
pt was found to have an injury localized to the ureters.
```

we get separate SNOMED matches for `injury` and for `ureters` since those two spans are not contiguous.

However, there is an anatomic site relation that links `injury` to `ureters`:

In this case we would concatenate the spans for `ureters (site)` and `injury (situated entity)` to link the concatenated span to the SNOMED concept ID `24850009`.

The NLP API output JSON would look like this:

```javascript
"anatomicsites": [
  {
    "label": "RA0",
    "attributes": {
      "confidence": 1
    },
    "concept_links": [
        "Csnomed4"
    ]
    "args": {
      "site": {
        "ref": "E5",
        "text": [
          "ureters"
        ]
      },
      "situated_entity": {
        "ref": "E4",
        "text": [
          "injury"
        ]
      }
    }
  }
]
...
"concepts": {
  "snomed": [
    {
      "label": "Csnomed4",
      "concept_id": "24850009",
      "description": "Injury of ureter (disorder)"
    }
  ]
}
```

### Single API Key

Added support for [NLP API single API key authentication](/nlp/api).

However this is currently only supported for some deployments of the NLP API.

## Changes

### Ontology updates

* UMLS ontologies updated to 2025AA version (2025-05-05).
* Expand UMLS semantic types for Snomed's medication relations.
* LOINC and NCI entitylink update 2025-06-23.
* SNOMED-CT ontology updated to US Edition 2025-03-01 release.
* Added 8948 new synonym annotations for SNOMED-CT entities.
* Medcin ontology updated to Nov 2024 release.
* Added 161308 new synonyms to Medcin ontology.
* Remove Medcin ontology from medication relations. Instead, check for drugs with `Pharmacologic Substance` in Snomed ontology (using UMLS STY) instead of `medicinal product` (from fsn).
* Make Emtelligent ontology produce no ontology info. The emtelligent ontology is deprecated in this release.

### Negation

* `No date` negation should have limited scope.
* Fix negation scope changes affected by use of `suggest`.
* Fix over-negation issue with `no ... has`.
* Added `not present` as negation trigger.
* Improve recall for `Neg Hx` as negation trigger.

### Section parsing

* Improved section heading finder.
* Use section category "musculoskeletal" for all radiology bones and joints type headings.

### Bug fixes

* Fix bug where entities like `lesion` or `cyst` (and other morphologic abnormalities) were missed in certain cases.
* Fix bug in measurement unit finding for unicode and broken unicode.
* Fix false positive address matches for `cross`, `junction`, etc.
* Fix cases of `m` being extracted as milligram.
* Fix bug where SNOMED concepts were being assigned to some MEDCIN mentions.

### Model Updates

* Sentence boundary model enforces a maximum sentence length.
* Improved address recognition precision to avoid false positives.
* Section Heading model.
* Temporality relation.
* Anatomic Site relation allows for situated entities that are procedures.
* Reported Event relation.
* Entity Disambiguation model.
* Uncertainty attribute updated to handle `suggesting`.

#### Measurement relation

* Improved measurement relation model.
* Handle cases of missing whitespace in measurements like `LVEF25%` and `ef60%`.
* Improved handling of TNM scores/staging.
* Some longer descriptions of Gleason scores like `grade group 4 (gleason score 5 + 3)` are captured as an entity match on the entire span rather than as a measurement relation.

#### Experiencer relation

* Improved experiencer relation model.
* Cases like `Mr. X` and other proper names are no longer identified by the SNOMED concept `Person (person) 125676002` -- they are instead identified as `Person name (property) (qualifier value) 734006007`. Note that this affects the experiencer relation as these newly re-mapped proper names are no longer picked up as experiencers which reduces several false positives on unseen data.
* Do not use lowercase prefixes like `mr` to identify person names.

### Python Requirements

* Minimum Python version required is v3.11.

## Python SDK updates

The latest NLP API Python SDK at the time of release is version `6.10.0`. Refer to the [changelog for the Python SDK](/nlp/python/changelog) for a full explanation of the updates made since the last release. You will need to use at least version `5.7.0` of the Python SDK or later to send requests to the NLP API v2.36 but if you want to use the new features explained above you will need to use at least version `6.10.0`.

### New features in the Python SDK

* [Single API Key authentication](/nlp/python/features/api-key) (only for deployments that support this feature).
* [Relation concept links](/nlp/python/features/relation-concept-links)
* Please read the [Python SDK changelog](/nlp/python/changelog) for additional new features.

> **Warning**
>
> To use existing NLP API databases with the new Python SDK you must do a data migration using the Python database client `migrate` subcommand:

```bash
emtellipro-db-client migrate --database postgresql://username:password@hostname:port/example_db
```

## Benchmarking

* Processed 1744 CCDs.
* Total size: 34 MB; Average size: 19.5 KB.
* NLP API deployed with 4 GPU workers
* 32x CPU: Intel(R) Xeon(R) Silver 4310 CPU @ 2.10 - 3.30 GHz w/18 MB Cache; 189G RAM
* 1x GPU: Nvidia L4 w/24GB of RAM
* Processed 1744 reports in 35:38.17s for an average per report processing time of 1.226012s per report
* Output JSON file size: 479MB.
* Saved 1744 documents to database in 1:21.38s (.04666s / document)
* NLP API database size using Python database client output to sqlite: 658MB