sapiopycommons 2025.9.9a738__tar.gz → 2025.9.10a743__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of sapiopycommons might be problematic. Click here for more details.

Files changed (124) hide show
  1. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/PKG-INFO +1 -1
  2. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/pyproject.toml +1 -1
  3. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/tool_service_base.py +19 -7
  4. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/.gitignore +0 -0
  5. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/LICENSE +0 -0
  6. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/README.md +0 -0
  7. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/__init__.py +0 -0
  8. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/__init__.py +0 -0
  9. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/converter_service_base.py +0 -0
  10. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/fielddefinitions/fields_pb2.py +0 -0
  11. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/fielddefinitions/fields_pb2.pyi +0 -0
  12. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/fielddefinitions/fields_pb2_grpc.py +0 -0
  13. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/fielddefinitions/velox_field_def_pb2.py +0 -0
  14. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/fielddefinitions/velox_field_def_pb2.pyi +0 -0
  15. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/fielddefinitions/velox_field_def_pb2_grpc.py +0 -0
  16. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/converter/converter_pb2.py +0 -0
  17. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/converter/converter_pb2.pyi +0 -0
  18. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/converter/converter_pb2_grpc.py +0 -0
  19. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/item/item_container_pb2.py +0 -0
  20. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/item/item_container_pb2.pyi +0 -0
  21. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/item/item_container_pb2_grpc.py +0 -0
  22. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/script/script_pb2.py +0 -0
  23. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/script/script_pb2.pyi +0 -0
  24. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/script/script_pb2_grpc.py +0 -0
  25. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/step_output_pb2.py +0 -0
  26. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/step_output_pb2.pyi +0 -0
  27. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/step_output_pb2_grpc.py +0 -0
  28. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/step_pb2.py +0 -0
  29. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/step_pb2.pyi +0 -0
  30. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/step_pb2_grpc.py +0 -0
  31. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/tool/entry_pb2.py +0 -0
  32. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/tool/entry_pb2.pyi +0 -0
  33. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/tool/entry_pb2_grpc.py +0 -0
  34. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/tool/tool_pb2.py +0 -0
  35. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/tool/tool_pb2.pyi +0 -0
  36. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/plan/tool/tool_pb2_grpc.py +0 -0
  37. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/session/sapio_conn_info_pb2.py +0 -0
  38. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/session/sapio_conn_info_pb2.pyi +0 -0
  39. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protoapi/session/sapio_conn_info_pb2_grpc.py +0 -0
  40. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/protobuf_utils.py +0 -0
  41. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/server.py +0 -0
  42. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/ai/test_client.py +0 -0
  43. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/callbacks/__init__.py +0 -0
  44. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/callbacks/callback_util.py +0 -0
  45. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/callbacks/field_builder.py +0 -0
  46. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/chem/IndigoMolecules.py +0 -0
  47. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/chem/Molecules.py +0 -0
  48. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/chem/__init__.py +0 -0
  49. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/customreport/__init__.py +0 -0
  50. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/customreport/auto_pagers.py +0 -0
  51. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/customreport/column_builder.py +0 -0
  52. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/customreport/custom_report_builder.py +0 -0
  53. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/customreport/term_builder.py +0 -0
  54. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/datatype/__init__.py +0 -0
  55. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/datatype/attachment_util.py +0 -0
  56. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/datatype/data_fields.py +0 -0
  57. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/datatype/pseudo_data_types.py +0 -0
  58. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/eln/__init__.py +0 -0
  59. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/eln/experiment_cache.py +0 -0
  60. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/eln/experiment_handler.py +0 -0
  61. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/eln/experiment_report_util.py +0 -0
  62. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/eln/experiment_step_factory.py +0 -0
  63. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/eln/experiment_tags.py +0 -0
  64. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/eln/plate_designer.py +0 -0
  65. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/eln/step_creation.py +0 -0
  66. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/__init__.py +0 -0
  67. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/complex_data_loader.py +0 -0
  68. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/file_bridge.py +0 -0
  69. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/file_bridge_handler.py +0 -0
  70. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/file_data_handler.py +0 -0
  71. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/file_util.py +0 -0
  72. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/file_validator.py +0 -0
  73. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/file_writer.py +0 -0
  74. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/files/temp_files.py +0 -0
  75. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/flowcyto/flow_cyto.py +0 -0
  76. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/flowcyto/flowcyto_data.py +0 -0
  77. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/__init__.py +0 -0
  78. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/accession_service.py +0 -0
  79. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/aliases.py +0 -0
  80. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/audit_log.py +0 -0
  81. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/custom_report_util.py +0 -0
  82. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/data_structure_util.py +0 -0
  83. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/directive_util.py +0 -0
  84. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/exceptions.py +0 -0
  85. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/html_formatter.py +0 -0
  86. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/popup_util.py +0 -0
  87. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/sapio_links.py +0 -0
  88. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/storage_util.py +0 -0
  89. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/general/time_util.py +0 -0
  90. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/multimodal/multimodal.py +0 -0
  91. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/multimodal/multimodal_data.py +0 -0
  92. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/processtracking/__init__.py +0 -0
  93. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/processtracking/custom_workflow_handler.py +0 -0
  94. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/processtracking/endpoints.py +0 -0
  95. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/recordmodel/__init__.py +0 -0
  96. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/recordmodel/record_handler.py +0 -0
  97. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/rules/__init__.py +0 -0
  98. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/rules/eln_rule_handler.py +0 -0
  99. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/rules/on_save_rule_handler.py +0 -0
  100. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/samples/aliquot.py +0 -0
  101. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/sftpconnect/__init__.py +0 -0
  102. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/sftpconnect/sftp_builder.py +0 -0
  103. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/webhook/__init__.py +0 -0
  104. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/webhook/webhook_context.py +0 -0
  105. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/webhook/webhook_handlers.py +0 -0
  106. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/src/sapiopycommons/webhook/webservice_handlers.py +0 -0
  107. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/AF-A0A009IHW8-F1-model_v4.cif +0 -0
  108. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/_do_not_add_init_py_here +0 -0
  109. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/accession_test.py +0 -0
  110. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/aliquot_test.py +0 -0
  111. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/bio_reg_test.py +0 -0
  112. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/chem_test.py +0 -0
  113. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/chem_test_curation_queue.py +0 -0
  114. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/curation_queue_test.sdf +0 -0
  115. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/data_type_models.py +0 -0
  116. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/flowcyto/101_DEN084Y5_15_E01_008_clean.fcs +0 -0
  117. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/flowcyto/101_DEN084Y5_15_E03_009_clean.fcs +0 -0
  118. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/flowcyto/101_DEN084Y5_15_E05_010_clean.fcs +0 -0
  119. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/flowcyto/8_color_ICS.wsp +0 -0
  120. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/flowcyto/COVID19_W_001_O.fcs +0 -0
  121. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/flowcyto_test.py +0 -0
  122. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/kappa.chains.fasta +0 -0
  123. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/mafft_test.py +0 -0
  124. {sapiopycommons-2025.9.9a738 → sapiopycommons-2025.9.10a743}/tests/test.gb +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sapiopycommons
3
- Version: 2025.9.9a738
3
+ Version: 2025.9.10a743
4
4
  Summary: Official Sapio Python API Utilities Package
5
5
  Project-URL: Homepage, https://github.com/sapiosciences
6
6
  Author-email: Jonathan Steck <jsteck@sapiosciences.com>, Yechen Qiao <yqiao@sapiosciences.com>
@@ -4,7 +4,7 @@ build-backend = "hatchling.build"
4
4
 
5
5
  [project]
6
6
  name = "sapiopycommons"
7
- version='2025.09.09a738'
7
+ version='2025.09.10a743'
8
8
  authors = [
9
9
  { name="Jonathan Steck", email="jsteck@sapiosciences.com" },
10
10
  { name="Yechen Qiao", email="yqiao@sapiosciences.com" },
@@ -12,11 +12,12 @@ from typing import Any, Iterable, Mapping
12
12
 
13
13
  from grpc import ServicerContext
14
14
  from sapiopylib.rest.User import SapioUser, ensure_logger_initialized
15
- from sapiopylib.rest.pojo.datatype.FieldDefinition import AbstractVeloxFieldDefinition
15
+ from sapiopylib.rest.pojo.datatype.FieldDefinition import AbstractVeloxFieldDefinition, FieldValidator
16
16
 
17
17
  from sapiopycommons.ai.protoapi.fielddefinitions.fields_pb2 import FieldValueMapPbo, FieldValuePbo
18
18
  from sapiopycommons.ai.protoapi.fielddefinitions.velox_field_def_pb2 import VeloxFieldDefPbo, FieldTypePbo, \
19
- SelectionPropertiesPbo, IntegerPropertiesPbo, DoublePropertiesPbo, BooleanPropertiesPbo, StringPropertiesPbo
19
+ SelectionPropertiesPbo, IntegerPropertiesPbo, DoublePropertiesPbo, BooleanPropertiesPbo, StringPropertiesPbo, \
20
+ FieldValidatorPbo
20
21
  from sapiopycommons.ai.protoapi.plan.item.item_container_pb2 import ContentTypePbo
21
22
  from sapiopycommons.ai.protoapi.plan.tool.entry_pb2 import StepOutputBatchPbo, StepItemContainerPbo, \
22
23
  StepBinaryContainerPbo, StepCsvContainerPbo, StepCsvHeaderRowPbo, StepCsvRowPbo, StepJsonContainerPbo, \
@@ -637,8 +638,8 @@ class ToolBase(ABC):
637
638
  ))
638
639
 
639
640
  def add_string_config_field(self, field_name: str, display_name: str, description: str,
640
- default_value: str | None = None, max_length: int = 1000, optional: bool = False) \
641
- -> None:
641
+ default_value: str | None = None, max_length: int = 1000, optional: bool = False,
642
+ validation_regex: str | None = None, error_msg: str | None = None) -> None:
642
643
  """
643
644
  Add a string configuration field to the tool. This field will be used to configure the tool in the plan
644
645
  manager.
@@ -649,6 +650,8 @@ class ToolBase(ABC):
649
650
  :param default_value: The default value of the field.
650
651
  :param max_length: The maximum length of the field.
651
652
  :param optional: If true, this field is optional. If false, this field is required.
653
+ :param validation_regex: An optional regex that the field value must match.
654
+ :param error_msg: An optional error message to display if the field value does not match the regex.
652
655
  """
653
656
  self.config_fields.append(VeloxFieldDefPbo(
654
657
  data_field_type=FieldTypePbo.STRING,
@@ -659,13 +662,15 @@ class ToolBase(ABC):
659
662
  editable=True,
660
663
  string_properties=StringPropertiesPbo(
661
664
  default_value=default_value,
662
- max_length=max_length
665
+ max_length=max_length,
666
+ field_validator=FieldValidatorPbo(validation_regex, error_msg) if validation_regex else None
663
667
  )
664
668
  ))
665
669
 
666
670
  def add_list_config_field(self, field_name: str, display_name: str, description: str,
667
671
  default_value: str | None = None, allowed_values: list[str] | None = None,
668
- direct_edit: bool = False, optional: bool = False) -> None:
672
+ direct_edit: bool = False, optional: bool = False,
673
+ validation_regex: str | None = None, error_msg: str | None = None) -> None:
669
674
  """
670
675
  Add a list configuration field to the tool. This field will be used to configure the tool in the plan
671
676
  manager.
@@ -678,6 +683,8 @@ class ToolBase(ABC):
678
683
  :param direct_edit: If true, the user can enter a value that is not in the list of allowed values. If false,
679
684
  the user can only select from the list of allowed values.
680
685
  :param optional: If true, this field is optional. If false, this field is required.
686
+ :param validation_regex: An optional regex that the field value must match.
687
+ :param error_msg: An optional error message to display if the field value does not match the regex.
681
688
  """
682
689
  self.config_fields.append(VeloxFieldDefPbo(
683
690
  data_field_type=FieldTypePbo.SELECTION,
@@ -690,12 +697,14 @@ class ToolBase(ABC):
690
697
  default_value=default_value,
691
698
  static_list_values=allowed_values,
692
699
  direct_edit=direct_edit,
700
+ field_validator=FieldValidatorPbo(validation_regex, error_msg) if validation_regex else None
693
701
  )
694
702
  ))
695
703
 
696
704
  def add_multi_list_config_field(self, field_name: str, display_name: str, description: str,
697
705
  default_value: list[str] | None = None, allowed_values: list[str] | None = None,
698
- direct_edit: bool = False, optional: bool = False) -> None:
706
+ direct_edit: bool = False, optional: bool = False,
707
+ validation_regex: str | None = None, error_msg: str | None = None) -> None:
699
708
  """
700
709
  Add a multi-select list configuration field to the tool. This field will be used to configure the tool in the
701
710
  plan manager.
@@ -708,6 +717,8 @@ class ToolBase(ABC):
708
717
  :param direct_edit: If true, the user can enter a value that is not in the list of allowed values. If false,
709
718
  the user can only select from the list of allowed values.
710
719
  :param optional: If true, this field is optional. If false, this field is required.
720
+ :param validation_regex: An optional regex that the field value must match.
721
+ :param error_msg: An optional error message to display if the field value does not match the regex.
711
722
  """
712
723
  self.config_fields.append(VeloxFieldDefPbo(
713
724
  data_field_type=FieldTypePbo.SELECTION,
@@ -721,6 +732,7 @@ class ToolBase(ABC):
721
732
  static_list_values=allowed_values,
722
733
  multi_select=True,
723
734
  direct_edit=direct_edit,
735
+ field_validator=FieldValidatorPbo(validation_regex, error_msg) if validation_regex else None
724
736
  )
725
737
  ))
726
738