From 96440e07e33970b67fdd5e9bee6fda5609d19de8 Mon Sep 17 00:00:00 2001 From: alhendrickson Date: Wed, 10 Jun 2026 15:58:28 +0000 Subject: [PATCH 1/2] fix(medcat-trainer): Fix Try Model bug after medcat V2 --- medcat-trainer/docker-compose-dev.yml | 2 +- medcat-trainer/webapp/api/api/views.py | 66 +++++++++++++------------- 2 files changed, 34 insertions(+), 34 deletions(-) diff --git a/medcat-trainer/docker-compose-dev.yml b/medcat-trainer/docker-compose-dev.yml index 340941e69..2f0700313 100644 --- a/medcat-trainer/docker-compose-dev.yml +++ b/medcat-trainer/docker-compose-dev.yml @@ -85,4 +85,4 @@ volumes: networks: gateway-auth_gateway-net: name: ${MCT_GATEWAY_NETWORK_NAME:-gateway-auth_gateway-net} - external: true + # external: true # Uncomment if using an existing gateway auth network. diff --git a/medcat-trainer/webapp/api/api/views.py b/medcat-trainer/webapp/api/api/views.py index c6e5ddea4..7e07411bc 100644 --- a/medcat-trainer/webapp/api/api/views.py +++ b/medcat-trainer/webapp/api/api/views.py @@ -777,45 +777,45 @@ def annotate_text(request): logger.warning(f'Failed to get children for CUI {parent_cui}: {e}') cuis_set = expanded_cuis - with temp_changed_config(cat.config.components.linking, 'filters', cuis_set): + with temp_changed_config(cat.config.components.linking.filters, 'cuis', cuis_set): spacy_doc = cat(message) ents = [] anno_tkns = [] for ent in spacy_doc.linked_ents: - cnt = Entity.objects.filter(label=ent.cui).count() inc_ent = all(tkn not in anno_tkns for tkn in ent) - if inc_ent and cnt != 0: - meta_annotations = [] - if 'meta_cat_meta_anns' in ent.get_available_addon_paths(): - meta_anns = ent.get_addon_data('meta_cat_meta_anns') - for meta_ann_task, pred in meta_anns.items(): - # Extract value and confidence from pred - # pred can be a dict, object, or string - if isinstance(pred, dict): - pred_value = pred.get('value', str(pred)) - pred_confidence = pred.get('confidence', None) - elif hasattr(pred, 'value'): - pred_value = pred.value - pred_confidence = getattr(pred, 'confidence', None) - else: - pred_value = str(pred) - pred_confidence = None - meta_annotations.append({ - 'task': meta_ann_task, - 'value': pred_value, - 'confidence': pred_confidence - }) - anno_tkns.extend([tkn for tkn in ent]) - entity = Entity.objects.get(label=ent.cui) - ents.append({ - 'entity': entity.id, - 'value': ent.base.text, - 'start_ind': ent.base.start_char_index, - 'end_ind': ent.base.end_char_index, - 'acc': ent.context_similarity, - 'meta_annotations': meta_annotations - }) + if not inc_ent: + continue + entity, _ = Entity.objects.get_or_create(label=ent.cui) + meta_annotations = [] + if 'meta_cat_meta_anns' in ent.get_available_addon_paths(): + meta_anns = ent.get_addon_data('meta_cat_meta_anns') + for meta_ann_task, pred in meta_anns.items(): + # Extract value and confidence from pred + # pred can be a dict, object, or string + if isinstance(pred, dict): + pred_value = pred.get('value', str(pred)) + pred_confidence = pred.get('confidence', None) + elif hasattr(pred, 'value'): + pred_value = pred.value + pred_confidence = getattr(pred, 'confidence', None) + else: + pred_value = str(pred) + pred_confidence = None + meta_annotations.append({ + 'task': meta_ann_task, + 'value': pred_value, + 'confidence': pred_confidence + }) + anno_tkns.extend([tkn for tkn in ent]) + ents.append({ + 'entity': entity.id, + 'value': ent.base.text, + 'start_ind': ent.base.start_char_index, + 'end_ind': ent.base.end_char_index, + 'acc': ent.context_similarity, + 'meta_annotations': meta_annotations + }) ents.sort(key=lambda e: e['start_ind']) out = {'message': message, 'entities': ents} From 45451c21543de9b9b443b5680228f671ac8f00e8 Mon Sep 17 00:00:00 2001 From: alhendrickson Date: Wed, 10 Jun 2026 16:10:22 +0000 Subject: [PATCH 2/2] fix(medcat-trainer): Fix try model where Entity not in DB --- medcat-trainer/webapp/api/api/views.py | 5 +++-- .../webapp/frontend/src/mixins/ConceptDetailService.js | 4 ++++ 2 files changed, 7 insertions(+), 2 deletions(-) diff --git a/medcat-trainer/webapp/api/api/views.py b/medcat-trainer/webapp/api/api/views.py index 7e07411bc..b7ffede93 100644 --- a/medcat-trainer/webapp/api/api/views.py +++ b/medcat-trainer/webapp/api/api/views.py @@ -786,7 +786,6 @@ def annotate_text(request): inc_ent = all(tkn not in anno_tkns for tkn in ent) if not inc_ent: continue - entity, _ = Entity.objects.get_or_create(label=ent.cui) meta_annotations = [] if 'meta_cat_meta_anns' in ent.get_available_addon_paths(): meta_anns = ent.get_addon_data('meta_cat_meta_anns') @@ -808,8 +807,10 @@ def annotate_text(request): 'confidence': pred_confidence }) anno_tkns.extend([tkn for tkn in ent]) + entity = Entity.objects.filter(label=ent.cui).first() ents.append({ - 'entity': entity.id, + 'entity': entity.id if entity is not None else -1, + 'cui': ent.cui, 'value': ent.base.text, 'start_ind': ent.base.start_char_index, 'end_ind': ent.base.end_char_index, diff --git a/medcat-trainer/webapp/frontend/src/mixins/ConceptDetailService.js b/medcat-trainer/webapp/frontend/src/mixins/ConceptDetailService.js index 09442dbb1..b6fa3c075 100644 --- a/medcat-trainer/webapp/frontend/src/mixins/ConceptDetailService.js +++ b/medcat-trainer/webapp/frontend/src/mixins/ConceptDetailService.js @@ -5,6 +5,10 @@ export default { methods: { fetchDetail (selectedEnt, cdbSearchIndex, callback) { if (selectedEnt && Object.keys(selectedEnt).length) { + if (selectedEnt.cui) { + this.fetchConcept(selectedEnt, cdbSearchIndex, callback) + return + } const queryEntId = selectedEnt.id this.$http.get(`/api/entities/${selectedEnt.entity}/`).then(resp => { if (selectedEnt && queryEntId === selectedEnt.id) {