Skip to content

fix(medcat): Relcat addon fix deserialise_from to match metacat behavior#542

Open
alhendrickson wants to merge 6 commits into
mainfrom
fix/medcat/relcat-deserialize-error
Open

fix(medcat): Relcat addon fix deserialise_from to match metacat behavior#542
alhendrickson wants to merge 6 commits into
mainfrom
fix/medcat/relcat-deserialize-error

Conversation

@alhendrickson

@alhendrickson alhendrickson commented Jun 15, 2026

Copy link
Copy Markdown
Collaborator

Error

When I save a model pack in medcat trainer, that has a relcat addon, then it errors the page and returns 500

The error looks like the RelCAT addon isn't as safe as the Metacat addon.

This change updates the relcat deserialise_from method to match the metacat one, by adding defaults and some safety into it. It should look like MetaCATAddon

Trainer



2026-06-15 16:01:27.406 | [medcattrainer] INFO 2026-06-15 15:01:27,406 cat.py l:784:Unziping the model pack and loading models.
2026-06-15 16:01:31.444 | [medcattrainer] [15/Jun/2026 15:01:31] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:01:39.503 | [medcattrainer] [15/Jun/2026 15:01:39] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:01:45.148 | [medcattrainer] INFO 2026-06-15 15:01:45,147 serialisers.py l:314:Determined serialised of type dill off disk
2026-06-15 16:01:47.901 | [medcattrainer] [15/Jun/2026 15:01:47] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:01:55.852 | [medcattrainer] [15/Jun/2026 15:01:55] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:02:03.842 | [medcattrainer] [15/Jun/2026 15:02:03] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:02:11.930 | [medcattrainer] [15/Jun/2026 15:02:11] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:02:24.381 | [medcattrainer] [15/Jun/2026 15:02:24] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:02:28.315 | [medcattrainer] [15/Jun/2026 15:02:28] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:02:36.492 | [medcattrainer] [15/Jun/2026 15:02:36] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:02:51.299 | [medcattrainer] [15/Jun/2026 15:02:51] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:02:52.463 | [medcattrainer] [15/Jun/2026 15:02:52] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:03:01.825 | [medcattrainer] INFO 2026-06-15 15:03:01,825 serialisers.py l:314:Determined serialised of type dill off disk
2026-06-15 16:03:01.836 | [medcattrainer] [15/Jun/2026 15:03:01] "GET /api/prep-docs-bg-tasks/ HTTP/1.1" 200 36
2026-06-15 16:03:03.869 | [medcattrainer] INFO 2026-06-15 15:03:03,869 serialisers.py l:149:Deserialising manually based on medcat.components.addons.relation_extraction.rel_cat.RelCATAddon
2026-06-15 16:03:04.951 | [medcattrainer] Internal Server Error: /api/modelpacks/
2026-06-15 16:03:04.951 | [medcattrainer] Traceback (most recent call last):
2026-06-15 16:03:04.951 | [medcattrainer]   File "/home/api/api/models.py", line 119, in save
2026-06-15 16:03:04.951 | [medcattrainer]     addons = CAT.load_addons(unpacked_model_pack_path)
2026-06-15 16:03:04.951 | [medcattrainer]              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.951 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/medcat/cat.py", line 937, in load_addons
2026-06-15 16:03:04.951 | [medcattrainer]     deserialise(addon_path)
2026-06-15 16:03:04.951 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/medcat/storage/serialisers.py", line 366, in deserialise
2026-06-15 16:03:04.951 | [medcattrainer]     return Serialiser.deserialise_manually(folder_path, man_cls_path,
2026-06-15 16:03:04.951 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.951 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/medcat/storage/serialisers.py", line 159, in deserialise_manually
2026-06-15 16:03:04.952 | [medcattrainer]     return man_cls.deserialise_from(folder_path, **init_kwargs)
2026-06-15 16:03:04.952 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/medcat/components/addons/relation_extraction/rel_cat.py", line 100, in deserialise_from
2026-06-15 16:03:04.953 | [medcattrainer]     base_tokenizer=init_kwargs['tokenizer'],
2026-06-15 16:03:04.953 | [medcattrainer]                    ~~~~~~~~~~~^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer] KeyError: 'tokenizer'
2026-06-15 16:03:04.953 | [medcattrainer] 
2026-06-15 16:03:04.953 | [medcattrainer] The above exception was the direct cause of the following exception:
2026-06-15 16:03:04.953 | [medcattrainer] 
2026-06-15 16:03:04.953 | [medcattrainer] Traceback (most recent call last):
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
2026-06-15 16:03:04.953 | [medcattrainer]     response = get_response(request)
2026-06-15 16:03:04.953 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
2026-06-15 16:03:04.953 | [medcattrainer]     response = wrapped_callback(request, *callback_args, **callback_kwargs)
2026-06-15 16:03:04.953 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
2026-06-15 16:03:04.953 | [medcattrainer]     return view_func(request, *args, **kwargs)
2026-06-15 16:03:04.953 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/viewsets.py", line 125, in view
2026-06-15 16:03:04.953 | [medcattrainer]     return self.dispatch(request, *args, **kwargs)
2026-06-15 16:03:04.953 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/views.py", line 515, in dispatch
2026-06-15 16:03:04.953 | [medcattrainer]     response = self.handle_exception(exc)
2026-06-15 16:03:04.953 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/views.py", line 475, in handle_exception
2026-06-15 16:03:04.953 | [medcattrainer]     self.raise_uncaught_exception(exc)
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/views.py", line 486, in raise_uncaught_exception
2026-06-15 16:03:04.953 | [medcattrainer]     raise exc
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/views.py", line 512, in dispatch
2026-06-15 16:03:04.953 | [medcattrainer]     response = handler(request, *args, **kwargs)
2026-06-15 16:03:04.953 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/mixins.py", line 19, in create
2026-06-15 16:03:04.953 | [medcattrainer]     self.perform_create(serializer)
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/mixins.py", line 24, in perform_create
2026-06-15 16:03:04.953 | [medcattrainer]     serializer.save()
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/serializers.py", line 210, in save
2026-06-15 16:03:04.953 | [medcattrainer]     self.instance = self.create(validated_data)
2026-06-15 16:03:04.953 | [medcattrainer]                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.953 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/serializers.py", line 991, in create
2026-06-15 16:03:04.954 | [medcattrainer]     instance = ModelClass._default_manager.create(**validated_data)
2026-06-15 16:03:04.954 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.954 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
2026-06-15 16:03:04.954 | [medcattrainer]     return getattr(self.get_queryset(), name)(*args, **kwargs)
2026-06-15 16:03:04.954 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.954 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 665, in create
2026-06-15 16:03:04.954 | [medcattrainer]     obj.save(force_insert=True, using=self.db)
2026-06-15 16:03:04.954 | [medcattrainer]   File "/usr/local/lib/python3.12/contextlib.py", line 81, in inner
2026-06-15 16:03:04.954 | [medcattrainer]     return func(*args, **kwds)
2026-06-15 16:03:04.954 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.954 | [medcattrainer]   File "/home/api/api/models.py", line 133, in save
2026-06-15 16:03:04.954 | [medcattrainer]     raise MedCATLoadException(f'Failure loading MetaCAT models - {unpacked_model_pack_path}') from exc
2026-06-15 16:03:04.954 | [medcattrainer] api.models.MedCATLoadException: Failure loading MetaCAT models - /home/api/media/MedCAT_Snomed2025_w_RelCAT_FULL_v1
2026-06-15 16:03:04.954 | [medcattrainer] ERROR 2026-06-15 15:03:04,940 log.py l:253:Internal Server Error: /api/modelpacks/
2026-06-15 16:03:04.954 | [medcattrainer] Traceback (most recent call last):
2026-06-15 16:03:04.954 | [medcattrainer]   File "/home/api/api/models.py", line 119, in save
2026-06-15 16:03:04.954 | [medcattrainer]     addons = CAT.load_addons(unpacked_model_pack_path)
2026-06-15 16:03:04.954 | [medcattrainer]              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.954 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/medcat/cat.py", line 937, in load_addons
2026-06-15 16:03:04.954 | [medcattrainer]     deserialise(addon_path)
2026-06-15 16:03:04.954 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/medcat/storage/serialisers.py", line 366, in deserialise
2026-06-15 16:03:04.954 | [medcattrainer]     return Serialiser.deserialise_manually(folder_path, man_cls_path,
2026-06-15 16:03:04.954 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.954 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/medcat/storage/serialisers.py", line 159, in deserialise_manually
2026-06-15 16:03:04.959 | [medcattrainer]     return man_cls.deserialise_from(folder_path, **init_kwargs)
2026-06-15 16:03:04.959 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/medcat/components/addons/relation_extraction/rel_cat.py", line 100, in deserialise_from
2026-06-15 16:03:04.959 | [medcattrainer]     base_tokenizer=init_kwargs['tokenizer'],
2026-06-15 16:03:04.959 | [medcattrainer]                    ~~~~~~~~~~~^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer] KeyError: 'tokenizer'
2026-06-15 16:03:04.959 | [medcattrainer] 
2026-06-15 16:03:04.959 | [medcattrainer] The above exception was the direct cause of the following exception:
2026-06-15 16:03:04.959 | [medcattrainer] 
2026-06-15 16:03:04.959 | [medcattrainer] Traceback (most recent call last):
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
2026-06-15 16:03:04.959 | [medcattrainer]     response = get_response(request)
2026-06-15 16:03:04.959 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/core/handlers/base.py", line 197, in _get_response
2026-06-15 16:03:04.959 | [medcattrainer]     response = wrapped_callback(request, *callback_args, **callback_kwargs)
2026-06-15 16:03:04.959 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
2026-06-15 16:03:04.959 | [medcattrainer]     return view_func(request, *args, **kwargs)
2026-06-15 16:03:04.959 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/viewsets.py", line 125, in view
2026-06-15 16:03:04.959 | [medcattrainer]     return self.dispatch(request, *args, **kwargs)
2026-06-15 16:03:04.959 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/views.py", line 515, in dispatch
2026-06-15 16:03:04.959 | [medcattrainer]     response = self.handle_exception(exc)
2026-06-15 16:03:04.959 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/views.py", line 475, in handle_exception
2026-06-15 16:03:04.959 | [medcattrainer]     self.raise_uncaught_exception(exc)
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/views.py", line 486, in raise_uncaught_exception
2026-06-15 16:03:04.959 | [medcattrainer]     raise exc
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/views.py", line 512, in dispatch
2026-06-15 16:03:04.959 | [medcattrainer]     response = handler(request, *args, **kwargs)
2026-06-15 16:03:04.959 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/mixins.py", line 19, in create
2026-06-15 16:03:04.959 | [medcattrainer]     self.perform_create(serializer)
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/mixins.py", line 24, in perform_create
2026-06-15 16:03:04.959 | [medcattrainer]     serializer.save()
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/serializers.py", line 210, in save
2026-06-15 16:03:04.959 | [medcattrainer]     self.instance = self.create(validated_data)
2026-06-15 16:03:04.959 | [medcattrainer]                     ^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/rest_framework/serializers.py", line 991, in create
2026-06-15 16:03:04.959 | [medcattrainer]     instance = ModelClass._default_manager.create(**validated_data)
2026-06-15 16:03:04.959 | [medcattrainer]                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/db/models/manager.py", line 87, in manager_method
2026-06-15 16:03:04.959 | [medcattrainer]     return getattr(self.get_queryset(), name)(*args, **kwargs)
2026-06-15 16:03:04.959 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/.venv/lib/python3.12/site-packages/django/db/models/query.py", line 665, in create
2026-06-15 16:03:04.959 | [medcattrainer]     obj.save(force_insert=True, using=self.db)
2026-06-15 16:03:04.959 | [medcattrainer]   File "/usr/local/lib/python3.12/contextlib.py", line 81, in inner
2026-06-15 16:03:04.959 | [medcattrainer]     return func(*args, **kwds)
2026-06-15 16:03:04.959 | [medcattrainer]            ^^^^^^^^^^^^^^^^^^^
2026-06-15 16:03:04.959 | [medcattrainer]   File "/home/api/api/models.py", line 133, in save
2026-06-15 16:03:04.959 | [medcattrainer]     raise MedCATLoadException(f'Failure loading MetaCAT models - {unpacked_model_pack_path}') from exc
2026-06-15 16:03:04.959 | [medcattrainer] api.models.MedCATLoadException: Failure loading MetaCAT models - /home/api/media/MedCAT_Snomed2025_w_RelCAT_FULL_v1
2026-06-15 16:03:04.959 | [medcattrainer] [15/Jun/2026 15:03:04] "POST /api/modelpacks/ HTTP/1.1" 500 167524

Medcat

This is the error in medcat, after making a unit test to check this load_addons function.

ERROR: test_can_load_rel_cat_via_load_addons (tests.components.addons.relation_extraction.test_rel_cat_in_model_pack.LoadedRelCATTests.test_can_load_rel_cat_via_load_addons)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/home/ali/workspace/CogStack/cogstack-nlp/medcat-v2/tests/components/addons/relation_extraction/test_rel_cat_in_model_pack.py", line 89, in test_can_load_rel_cat_via_load_addons
    addons = CAT.load_addons(self.model_pack_path)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ali/workspace/CogStack/cogstack-nlp/medcat-v2/medcat/cat.py", line 939, in load_addons
    deserialise(addon_path)
  File "/home/ali/workspace/CogStack/cogstack-nlp/medcat-v2/medcat/storage/serialisers.py", line 366, in deserialise
    return Serialiser.deserialise_manually(folder_path, man_cls_path,
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ali/workspace/CogStack/cogstack-nlp/medcat-v2/medcat/storage/serialisers.py", line 159, in deserialise_manually
    return man_cls.deserialise_from(folder_path, **init_kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/home/ali/workspace/CogStack/cogstack-nlp/medcat-v2/medcat/components/addons/relation_extraction/rel_cat.py", line 100, in deserialise_from
    base_tokenizer=init_kwargs['tokenizer'],
                   ~~~~~~~~~~~^^^^^^^^^^^^^
KeyError: 'tokenizer'

----------------------------------------------------------------------
Ran 1 test in 142.944s

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant