Skip to content

Commit ca3051e

Browse files
authored
Fix import of unknown ai generative types (baserow#5190)
1 parent dc9efa1 commit ca3051e

3 files changed

Lines changed: 55 additions & 4 deletions

File tree

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
"type": "bug",
3+
"message": "Fix import of unknown ai generative types",
4+
"issue_origin": "github",
5+
"issue_number": 5163,
6+
"domain": "database",
7+
"bullet_points": [],
8+
"created_at": "2026-04-13"
9+
}

premium/backend/src/baserow_premium/fields/field_types.py

Lines changed: 13 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -335,10 +335,11 @@ def _validate_field_kwargs(
335335
self, ai_output_type, ai_type, model_type, ai_file_field_id, workspace=None
336336
):
337337
ai_field_output_registry.get(ai_output_type)
338-
ai_type = generative_ai_model_type_registry.get(ai_type)
339-
models = ai_type.get_enabled_models(workspace=workspace)
340-
if model_type not in models:
341-
raise ModelDoesNotBelongToType(model_name=model_type)
338+
if ai_type is not None:
339+
ai_type = generative_ai_model_type_registry.get(ai_type)
340+
models = ai_type.get_enabled_models(workspace=workspace)
341+
if model_type not in models:
342+
raise ModelDoesNotBelongToType(model_name=model_type)
342343
if ai_file_field_id is not None and not ai_type.supports_files:
343344
raise GenerativeAITypeDoesNotSupportFileField()
344345

@@ -508,6 +509,14 @@ def import_serialized(
508509
serialized_values = serialized_values.copy()
509510
serialized_values.pop("ai_auto_update_user_id", None)
510511
serialized_values["ai_auto_update"] = False
512+
513+
ai_type = serialized_values.get("ai_generative_ai_type")
514+
if ai_type is not None:
515+
try:
516+
generative_ai_model_type_registry.get(ai_type)
517+
except GenerativeAITypeDoesNotExist:
518+
serialized_values["ai_generative_ai_type"] = None
519+
511520
return super().import_serialized(
512521
table,
513522
serialized_values,

premium/backend/tests/baserow_premium_tests/fields/test_ai_field_type.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1382,6 +1382,39 @@ def test_create_ai_field_auto_doesnt_update_user_if_set(premium_data_fixture):
13821382
assert ai_field.ai_auto_update_user_id == user.id # not changed
13831383

13841384

1385+
@pytest.mark.django_db
1386+
@pytest.mark.field_ai
1387+
def test_import_serialized_ai_field_missing_ai_generative_ai_type(premium_data_fixture):
1388+
user = premium_data_fixture.create_user()
1389+
table = premium_data_fixture.create_database_table(user=user)
1390+
premium_data_fixture.register_fake_generate_ai_type()
1391+
premium_data_fixture.create_text_field(
1392+
table=table, order=0, name="text", primary=True
1393+
)
1394+
ai_field = premium_data_fixture.create_ai_field(
1395+
table=table,
1396+
order=1,
1397+
name="ai",
1398+
ai_generative_ai_type="missing",
1399+
ai_generative_ai_model="test_1",
1400+
ai_prompt="Tell me a joke",
1401+
)
1402+
field_type = field_type_registry.get_by_model(ai_field)
1403+
serialized = field_type.export_serialized(ai_field)
1404+
1405+
imported_field = field_type.import_serialized(
1406+
table,
1407+
serialized,
1408+
ImportExportConfig(include_permission_data=False),
1409+
id_mapping={},
1410+
deferred_fk_update_collector=DeferredForeignKeyUpdater(),
1411+
)
1412+
1413+
imported_field = AIField.objects.get(id=imported_field.id)
1414+
assert imported_field.ai_generative_ai_type is None
1415+
assert imported_field.ai_generative_ai_model == "test_1"
1416+
1417+
13851418
@pytest.mark.django_db
13861419
@pytest.mark.field_ai
13871420
def test_import_serialized_ai_field_with_auto_update_user(premium_data_fixture):

0 commit comments

Comments
 (0)