sapiopycommons 2025.4.24a495__tar.gz → 2025.4.25a496__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 (107) hide show
  1. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/PKG-INFO +1 -1
  2. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/pyproject.toml +1 -1
  3. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/tool_service_base.py +159 -1
  4. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/.gitignore +0 -0
  5. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/LICENSE +0 -0
  6. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/README.md +0 -0
  7. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/__init__.py +0 -0
  8. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/__init__.py +0 -0
  9. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.py +0 -0
  10. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.pyi +0 -0
  11. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2_grpc.py +0 -0
  12. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2.py +0 -0
  13. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2.pyi +0 -0
  14. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2_grpc.py +0 -0
  15. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/proto/step_pb2.py +0 -0
  16. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/proto/step_pb2.pyi +0 -0
  17. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/proto/step_pb2_grpc.py +0 -0
  18. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2.py +0 -0
  19. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2.pyi +0 -0
  20. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2_grpc.py +0 -0
  21. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2.py +0 -0
  22. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2.pyi +0 -0
  23. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2_grpc.py +0 -0
  24. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2.py +0 -0
  25. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2.pyi +0 -0
  26. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2_grpc.py +0 -0
  27. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.py +0 -0
  28. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.pyi +0 -0
  29. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2_grpc.py +0 -0
  30. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/ai/tool_of_tools.py +0 -0
  31. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/callbacks/__init__.py +0 -0
  32. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/callbacks/callback_util.py +0 -0
  33. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/callbacks/field_builder.py +0 -0
  34. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/chem/IndigoMolecules.py +0 -0
  35. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/chem/Molecules.py +0 -0
  36. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/chem/__init__.py +0 -0
  37. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/customreport/__init__.py +0 -0
  38. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/customreport/auto_pagers.py +0 -0
  39. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/customreport/column_builder.py +0 -0
  40. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/customreport/custom_report_builder.py +0 -0
  41. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/customreport/term_builder.py +0 -0
  42. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/datatype/__init__.py +0 -0
  43. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/datatype/attachment_util.py +0 -0
  44. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/datatype/data_fields.py +0 -0
  45. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/datatype/pseudo_data_types.py +0 -0
  46. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/eln/__init__.py +0 -0
  47. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/eln/experiment_handler.py +0 -0
  48. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/eln/experiment_report_util.py +0 -0
  49. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/eln/experiment_tags.py +0 -0
  50. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/eln/plate_designer.py +0 -0
  51. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/files/__init__.py +0 -0
  52. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/files/complex_data_loader.py +0 -0
  53. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/files/file_bridge.py +0 -0
  54. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/files/file_bridge_handler.py +0 -0
  55. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/files/file_data_handler.py +0 -0
  56. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/files/file_util.py +0 -0
  57. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/files/file_validator.py +0 -0
  58. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/files/file_writer.py +0 -0
  59. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/flowcyto/flow_cyto.py +0 -0
  60. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/flowcyto/flowcyto_data.py +0 -0
  61. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/__init__.py +0 -0
  62. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/accession_service.py +0 -0
  63. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/aliases.py +0 -0
  64. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/audit_log.py +0 -0
  65. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/custom_report_util.py +0 -0
  66. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/directive_util.py +0 -0
  67. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/exceptions.py +0 -0
  68. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/html_formatter.py +0 -0
  69. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/popup_util.py +0 -0
  70. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/sapio_links.py +0 -0
  71. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/storage_util.py +0 -0
  72. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/general/time_util.py +0 -0
  73. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/multimodal/multimodal.py +0 -0
  74. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/multimodal/multimodal_data.py +0 -0
  75. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/processtracking/__init__.py +0 -0
  76. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/processtracking/custom_workflow_handler.py +0 -0
  77. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/processtracking/endpoints.py +0 -0
  78. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/recordmodel/__init__.py +0 -0
  79. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/recordmodel/record_handler.py +0 -0
  80. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/rules/__init__.py +0 -0
  81. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/rules/eln_rule_handler.py +0 -0
  82. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/rules/on_save_rule_handler.py +0 -0
  83. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/samples/aliquot.py +0 -0
  84. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/sftpconnect/__init__.py +0 -0
  85. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/sftpconnect/sftp_builder.py +0 -0
  86. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/webhook/__init__.py +0 -0
  87. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/webhook/webhook_context.py +0 -0
  88. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/webhook/webhook_handlers.py +0 -0
  89. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/src/sapiopycommons/webhook/webservice_handlers.py +0 -0
  90. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/AF-A0A009IHW8-F1-model_v4.cif +0 -0
  91. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/_do_not_add_init_py_here +0 -0
  92. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/accession_test.py +0 -0
  93. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/aliquot_test.py +0 -0
  94. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/bio_reg_test.py +0 -0
  95. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/chem_test.py +0 -0
  96. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/chem_test_curation_queue.py +0 -0
  97. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/curation_queue_test.sdf +0 -0
  98. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/data_type_models.py +0 -0
  99. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/flowcyto/101_DEN084Y5_15_E01_008_clean.fcs +0 -0
  100. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/flowcyto/101_DEN084Y5_15_E03_009_clean.fcs +0 -0
  101. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/flowcyto/101_DEN084Y5_15_E05_010_clean.fcs +0 -0
  102. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/flowcyto/8_color_ICS.wsp +0 -0
  103. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/flowcyto/COVID19_W_001_O.fcs +0 -0
  104. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/flowcyto_test.py +0 -0
  105. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/kappa.chains.fasta +0 -0
  106. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/mafft_test.py +0 -0
  107. {sapiopycommons-2025.4.24a495 → sapiopycommons-2025.4.25a496}/tests/test.gb +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sapiopycommons
3
- Version: 2025.4.24a495
3
+ Version: 2025.4.25a496
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.04.24a495'
7
+ version='2025.04.25a496'
8
8
  authors = [
9
9
  { name="Jonathan Steck", email="jsteck@sapiosciences.com" },
10
10
  { name="Yechen Qiao", email="yqiao@sapiosciences.com" },
@@ -7,7 +7,8 @@ from typing import Any
7
7
 
8
8
  from grpc import ServicerContext
9
9
 
10
- from sapiopycommons.ai.api.fielddefinitions.proto.velox_field_def_pb2 import VeloxFieldDefProto
10
+ from sapiopycommons.ai.api.fielddefinitions.proto.velox_field_def_pb2 import VeloxFieldDefProto, FieldTypeProto, \
11
+ IntegerProperties, DoubleProperties, SelectionProperties, BooleanProperties
11
12
  from sapiopycommons.general.aliases import FieldMap
12
13
  from sapiopylib.rest.User import SapioUser
13
14
 
@@ -359,6 +360,110 @@ class ToolBase(ABC):
359
360
  """
360
361
  self.configs.append(field)
361
362
 
363
+ def add_integer_config_field(self, field_name: str, display_name: str, description: str,
364
+ default_value: int, min_value: int = -2**31, max_value: int = 2**31-1) -> None:
365
+ """
366
+ Add an integer configuration field to the tool. This field will be used to configure the tool in the plan
367
+ manager.
368
+
369
+ :param field_name: The name of the field.
370
+ :param display_name: The display name of the field.
371
+ :param description: The description of the field.
372
+ :param default_value: The default value of the field.
373
+ :param min_value: The minimum value of the field.
374
+ :param max_value: The maximum value of the field.
375
+ """
376
+ self.configs.append(VeloxFieldDefProto(
377
+ data_field_type=FieldTypeProto.INTEGER,
378
+ data_field_name=field_name,
379
+ display_name=display_name,
380
+ description=description,
381
+ required=True,
382
+ editable=True,
383
+ integer_properties=IntegerProperties(
384
+ default_value=default_value,
385
+ min_value=min_value,
386
+ max_value=max_value
387
+ )
388
+ ))
389
+
390
+ def add_double_config_field(self, field_name: str, display_name: str, description: str, default_value: float,
391
+ min_value: float = -10.**120, max_value: float = 10.**120, precision: int = 2) -> None:
392
+ """
393
+ Add a double configuration field to the tool. This field will be used to configure the tool in the plan
394
+ manager.
395
+
396
+ :param field_name: The name of the field.
397
+ :param display_name: The display name of the field.
398
+ :param description: The description of the field.
399
+ :param default_value: The default value of the field.
400
+ :param min_value: The minimum value of the field.
401
+ :param max_value: The maximum value of the field.
402
+ :param precision: The precision of the field.
403
+ """
404
+ self.configs.append(VeloxFieldDefProto(
405
+ data_field_type=FieldTypeProto.DOUBLE,
406
+ data_field_name=field_name,
407
+ display_name=display_name,
408
+ description=description,
409
+ required=True,
410
+ editable=True,
411
+ double_properties=DoubleProperties(
412
+ default_value=default_value,
413
+ min_value=min_value,
414
+ max_value=max_value,
415
+ precision=precision
416
+ )
417
+ ))
418
+
419
+ def add_list_config_field(self, field_name: str, display_name: str, description: str, default_value: str,
420
+ allowed_values: list[str]) -> None:
421
+ """
422
+ Add a list configuration field to the tool. This field will be used to configure the tool in the plan
423
+ manager.
424
+
425
+ :param field_name: The name of the field.
426
+ :param display_name: The display name of the field.
427
+ :param description: The description of the field.
428
+ :param default_value: The default value of the field.
429
+ :param allowed_values: The list of allowed values for the field.
430
+ """
431
+ self.configs.append(VeloxFieldDefProto(
432
+ data_field_type=FieldTypeProto.SELECTION,
433
+ data_field_name=field_name,
434
+ display_name=display_name,
435
+ description=description,
436
+ required=True,
437
+ editable=True,
438
+ selection_properties=SelectionProperties(
439
+ default_value=default_value,
440
+ static_list_values=allowed_values,
441
+ )
442
+ ))
443
+
444
+ def add_boolean_config_field(self, field_name: str, display_name: str, description: str, default_value: bool) \
445
+ -> None:
446
+ """
447
+ Add a boolean configuration field to the tool. This field will be used to configure the tool in the plan
448
+ manager.
449
+
450
+ :param field_name: The name of the field.
451
+ :param display_name: The display name of the field.
452
+ :param description: The description of the field.
453
+ :param default_value: The default value of the field.
454
+ """
455
+ self.configs.append(VeloxFieldDefProto(
456
+ data_field_type=FieldTypeProto.BOOLEAN,
457
+ data_field_name=field_name,
458
+ display_name=display_name,
459
+ description=description,
460
+ required=True,
461
+ editable=True,
462
+ boolean_properties=BooleanProperties(
463
+ default_value=default_value
464
+ )
465
+ ))
466
+
362
467
  def to_proto(self) -> ToolDetails:
363
468
  """
364
469
  :return: The ToolDetails proto object representing this tool.
@@ -392,3 +497,56 @@ class ToolBase(ABC):
392
497
  :return: A SapioToolResults object containing the response data.
393
498
  """
394
499
  pass
500
+
501
+ @staticmethod
502
+ def get_request_json(request: ProcessStepRequest, index: int = 0) -> list[Any]:
503
+ """
504
+ Parse the JSON data from the request object.
505
+
506
+ :param request: The request object containing the input data.
507
+ :param index: The index of the input to parse. Defaults to 0.
508
+ :return: A list of parsed JSON objects. Each entry in the list represents a separate JSON entry from the input.
509
+ """
510
+ entry_data = request.entry_data
511
+ input_data: list[Any] = [json.loads(x) for x in entry_data[index].entry_data.json_data.entries]
512
+ return input_data
513
+
514
+ @staticmethod
515
+ def read_from_json(json_data: list[dict[str, Any]], key: str) -> list[Any]:
516
+ """
517
+ From a list of dictionaries, return a list of values for the given key from each dictionary. Skips null values.
518
+
519
+ :param json_data: The JSON data to read from.
520
+ :param key: The key to read the values from.
521
+ :return: A list of values corresponding to the given key in the JSON data.
522
+ """
523
+ ret_val: list[Any] = []
524
+ for entry in json_data:
525
+ if key in entry:
526
+ value = entry[key]
527
+ if isinstance(value, list):
528
+ ret_val.extend(value)
529
+ elif value is not None:
530
+ ret_val.append(value)
531
+ return ret_val
532
+
533
+ @staticmethod
534
+ def get_config_fields(request: ProcessStepRequest) -> dict[str, Any]:
535
+ """
536
+ Get the configuration fields from the request object.
537
+
538
+ :param request: The request object containing the input data.
539
+ :return: A dictionary of configuration field names and their values.
540
+ """
541
+ config_fields: dict[str, Any] = {}
542
+ for field, value in request.config_field_values.items():
543
+ if value.bool_value is not None:
544
+ value = value.bool_value
545
+ elif value.string_value is not None:
546
+ value = value.string_value
547
+ elif value.int_value is not None:
548
+ value = value.int_value
549
+ elif value.double_value is not None:
550
+ value = value.double_value
551
+ config_fields[field] = value
552
+ return config_fields