Skip to content

Commit a531f41

Browse files
authored
Creating formula for AI field with choice type fails hard (baserow#4079)
Allow formula field to reference AI field with choice output type
1 parent 4a9d4ec commit a531f41

File tree

3 files changed

+92
-0
lines changed

3 files changed

+92
-0
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
{
2+
"type": "bug",
3+
"message": "Allow formula field to reference AI field with choice output type",
4+
"domain": "database",
5+
"issue_number": 3851,
6+
"bullet_points": [],
7+
"created_at": "2025-10-08"
8+
}

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,17 @@ def get_group_by_field_filters_and_annotations(
249249
field, field_name, base_queryset, value, cte, rows
250250
)
251251

252+
def get_formula_reference_to_model_field(
253+
self, model_field, db_column, already_in_subquery
254+
):
255+
instance = model_field.model.get_field_object(
256+
model_field.name, include_trash=True
257+
)["field"]
258+
baserow_field_type = self.get_baserow_field_type(instance)
259+
return baserow_field_type.get_formula_reference_to_model_field(
260+
model_field, db_column, already_in_subquery
261+
)
262+
252263
def get_export_serialized_value(
253264
self,
254265
row,

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

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1120,3 +1120,76 @@ def test_link_row_field_can_be_sorted_when_linking_an_ai_field(premium_data_fixt
11201120
.values_list("id", flat=True)
11211121
)
11221122
assert result == [row_b2.id, row_b1.id]
1123+
1124+
1125+
@pytest.mark.django_db
1126+
@pytest.mark.field_ai
1127+
def test_formula_field_can_reference_ai_choice_output_without_error(
1128+
premium_data_fixture,
1129+
):
1130+
premium_data_fixture.register_fake_generate_ai_type()
1131+
user = premium_data_fixture.create_user()
1132+
table = premium_data_fixture.create_database_table(user=user)
1133+
1134+
ai_choice_field = premium_data_fixture.create_ai_field(
1135+
table=table,
1136+
order=0,
1137+
name="ai_choice",
1138+
ai_output_type="choice",
1139+
ai_generative_ai_type="test_generative_ai",
1140+
ai_generative_ai_model="test_1",
1141+
ai_prompt="'pick one'",
1142+
)
1143+
premium_data_fixture.create_select_option(
1144+
field=ai_choice_field, value="Red", color="red", order=0
1145+
)
1146+
premium_data_fixture.create_select_option(
1147+
field=ai_choice_field, value="Blue", color="blue", order=1
1148+
)
1149+
1150+
formula_field = FieldHandler().create_field(
1151+
user=user,
1152+
table=table,
1153+
type_name="formula",
1154+
name="formula_from_ai_choice",
1155+
formula="field('ai_choice')",
1156+
)
1157+
1158+
assert formula_field is not None
1159+
1160+
1161+
@pytest.mark.django_db
1162+
@pytest.mark.field_ai
1163+
def test_ai_field_can_be_used_in_lookup_expression(premium_data_fixture):
1164+
premium_data_fixture.register_fake_generate_ai_type()
1165+
user = premium_data_fixture.create_user()
1166+
1167+
source_table = premium_data_fixture.create_database_table(user=user, name="Source")
1168+
ai_field = premium_data_fixture.create_ai_field(
1169+
table=source_table,
1170+
order=0,
1171+
name="ai_text",
1172+
ai_output_type="text",
1173+
ai_generative_ai_type="test_generative_ai",
1174+
ai_generative_ai_model="test_1",
1175+
ai_prompt="'Hello World'",
1176+
)
1177+
1178+
target_table = premium_data_fixture.create_database_table(user=user, name="Target")
1179+
link_row_field = premium_data_fixture.create_link_row_field(
1180+
table=target_table,
1181+
order=0,
1182+
name="link_to_source",
1183+
link_row_table=source_table,
1184+
)
1185+
1186+
formula_field = FieldHandler().create_field(
1187+
user=user,
1188+
table=target_table,
1189+
type_name="formula",
1190+
name="lookup_ai_field",
1191+
formula="lookup('link_to_source', 'ai_text')",
1192+
)
1193+
1194+
assert formula_field is not None
1195+
assert formula_field.formula_type == "array"

0 commit comments

Comments
 (0)