sapiopycommons 2025.4.24a493__tar.gz → 2025.4.24a494__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.24a493 → sapiopycommons-2025.4.24a494}/PKG-INFO +1 -1
  2. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/pyproject.toml +1 -1
  3. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/tool_service_base.py +102 -2
  4. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/.gitignore +0 -0
  5. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/LICENSE +0 -0
  6. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/README.md +0 -0
  7. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/__init__.py +0 -0
  8. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/__init__.py +0 -0
  9. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.py +0 -0
  10. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2.pyi +0 -0
  11. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/fielddefinitions/proto/velox_field_def_pb2_grpc.py +0 -0
  12. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2.py +0 -0
  13. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2.pyi +0 -0
  14. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/proto/step_output_pb2_grpc.py +0 -0
  15. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/proto/step_pb2.py +0 -0
  16. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/proto/step_pb2.pyi +0 -0
  17. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/proto/step_pb2_grpc.py +0 -0
  18. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2.py +0 -0
  19. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2.pyi +0 -0
  20. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/script/proto/script_pb2_grpc.py +0 -0
  21. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2.py +0 -0
  22. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2.pyi +0 -0
  23. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/tool/proto/entry_pb2_grpc.py +0 -0
  24. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2.py +0 -0
  25. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2.pyi +0 -0
  26. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/plan/tool/proto/tool_pb2_grpc.py +0 -0
  27. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.py +0 -0
  28. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2.pyi +0 -0
  29. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/api/session/proto/sapio_conn_info_pb2_grpc.py +0 -0
  30. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/ai/tool_of_tools.py +0 -0
  31. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/callbacks/__init__.py +0 -0
  32. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/callbacks/callback_util.py +0 -0
  33. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/callbacks/field_builder.py +0 -0
  34. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/chem/IndigoMolecules.py +0 -0
  35. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/chem/Molecules.py +0 -0
  36. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/chem/__init__.py +0 -0
  37. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/customreport/__init__.py +0 -0
  38. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/customreport/auto_pagers.py +0 -0
  39. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/customreport/column_builder.py +0 -0
  40. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/customreport/custom_report_builder.py +0 -0
  41. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/customreport/term_builder.py +0 -0
  42. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/datatype/__init__.py +0 -0
  43. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/datatype/attachment_util.py +0 -0
  44. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/datatype/data_fields.py +0 -0
  45. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/datatype/pseudo_data_types.py +0 -0
  46. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/eln/__init__.py +0 -0
  47. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/eln/experiment_handler.py +0 -0
  48. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/eln/experiment_report_util.py +0 -0
  49. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/eln/experiment_tags.py +0 -0
  50. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/eln/plate_designer.py +0 -0
  51. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/files/__init__.py +0 -0
  52. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/files/complex_data_loader.py +0 -0
  53. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/files/file_bridge.py +0 -0
  54. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/files/file_bridge_handler.py +0 -0
  55. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/files/file_data_handler.py +0 -0
  56. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/files/file_util.py +0 -0
  57. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/files/file_validator.py +0 -0
  58. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/files/file_writer.py +0 -0
  59. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/flowcyto/flow_cyto.py +0 -0
  60. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/flowcyto/flowcyto_data.py +0 -0
  61. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/__init__.py +0 -0
  62. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/accession_service.py +0 -0
  63. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/aliases.py +0 -0
  64. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/audit_log.py +0 -0
  65. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/custom_report_util.py +0 -0
  66. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/directive_util.py +0 -0
  67. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/exceptions.py +0 -0
  68. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/html_formatter.py +0 -0
  69. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/popup_util.py +0 -0
  70. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/sapio_links.py +0 -0
  71. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/storage_util.py +0 -0
  72. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/general/time_util.py +0 -0
  73. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/multimodal/multimodal.py +0 -0
  74. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/multimodal/multimodal_data.py +0 -0
  75. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/processtracking/__init__.py +0 -0
  76. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/processtracking/custom_workflow_handler.py +0 -0
  77. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/processtracking/endpoints.py +0 -0
  78. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/recordmodel/__init__.py +0 -0
  79. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/recordmodel/record_handler.py +0 -0
  80. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/rules/__init__.py +0 -0
  81. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/rules/eln_rule_handler.py +0 -0
  82. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/rules/on_save_rule_handler.py +0 -0
  83. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/samples/aliquot.py +0 -0
  84. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/sftpconnect/__init__.py +0 -0
  85. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/sftpconnect/sftp_builder.py +0 -0
  86. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/webhook/__init__.py +0 -0
  87. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/webhook/webhook_context.py +0 -0
  88. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/webhook/webhook_handlers.py +0 -0
  89. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/src/sapiopycommons/webhook/webservice_handlers.py +0 -0
  90. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/AF-A0A009IHW8-F1-model_v4.cif +0 -0
  91. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/_do_not_add_init_py_here +0 -0
  92. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/accession_test.py +0 -0
  93. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/aliquot_test.py +0 -0
  94. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/bio_reg_test.py +0 -0
  95. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/chem_test.py +0 -0
  96. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/chem_test_curation_queue.py +0 -0
  97. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/curation_queue_test.sdf +0 -0
  98. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/data_type_models.py +0 -0
  99. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/flowcyto/101_DEN084Y5_15_E01_008_clean.fcs +0 -0
  100. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/flowcyto/101_DEN084Y5_15_E03_009_clean.fcs +0 -0
  101. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/flowcyto/101_DEN084Y5_15_E05_010_clean.fcs +0 -0
  102. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/flowcyto/8_color_ICS.wsp +0 -0
  103. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/flowcyto/COVID19_W_001_O.fcs +0 -0
  104. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/flowcyto_test.py +0 -0
  105. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/kappa.chains.fasta +0 -0
  106. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/mafft_test.py +0 -0
  107. {sapiopycommons-2025.4.24a493 → sapiopycommons-2025.4.24a494}/tests/test.gb +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.3
2
2
  Name: sapiopycommons
3
- Version: 2025.4.24a493
3
+ Version: 2025.4.24a494
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.24a493'
7
+ version='2025.04.24a494'
8
8
  authors = [
9
9
  { name="Jonathan Steck", email="jsteck@sapiosciences.com" },
10
10
  { name="Yechen Qiao", email="yqiao@sapiosciences.com" },
@@ -6,13 +6,15 @@ from abc import abstractmethod, ABC
6
6
  from typing import Any
7
7
 
8
8
  from grpc import ServicerContext
9
+
10
+ from sapiopycommons.ai.api.fielddefinitions.proto.velox_field_def_pb2 import VeloxFieldDefProto
9
11
  from sapiopycommons.general.aliases import FieldMap
10
12
  from sapiopylib.rest.User import SapioUser
11
13
 
12
14
  from sapiopycommons.ai.api.plan.tool.proto.entry_pb2 import StepEntryOutputData, StepEntryData, StepJsonData, DataType, \
13
15
  StepImageData, StepTextData, StepCsvData, StepBinaryData, StepCsvHeaderRow, StepCsvRow
14
16
  from sapiopycommons.ai.api.plan.tool.proto.tool_pb2 import ProcessStepRequest, ToolDetailsRequest, ToolDetailsResponse, \
15
- ProcessStepResponse, ToolDetails, StepRecord, StepRecordFieldValue
17
+ ProcessStepResponse, ToolDetails, StepRecord, StepRecordFieldValue, ToolInputDetails, ToolOutputDetails
16
18
  from sapiopycommons.ai.api.plan.tool.proto.tool_pb2_grpc import ToolServiceServicer
17
19
  from sapiopycommons.ai.api.session.proto.sapio_conn_info_pb2 import SapioConnectionInfo, SapioUserSecretType
18
20
 
@@ -185,6 +187,8 @@ class ToolServiceBase(ToolServiceServicer, ABC):
185
187
 
186
188
  Subclasses must implement the get_details and run methods to provide specific functionality for the tool.
187
189
  """
190
+ tools: list[ToolBase]
191
+
188
192
  def GetToolDetails(self, request: ToolDetailsRequest, context: ServicerContext) -> ToolDetailsResponse:
189
193
  try:
190
194
  # Convert the SapioConnectionInfo proto object to a SapioUser object.
@@ -212,9 +216,12 @@ class ToolServiceBase(ToolServiceServicer, ABC):
212
216
  else:
213
217
  new_records.extend(data)
214
218
  # Return a ProcessStepResponse proto object containing the output data and new records to the caller.
219
+ # TODO: Return an is_success = true value.
220
+ # TODO: Allow logging in the tools?
215
221
  return ProcessStepResponse(entry_data=entry_data, new_records=new_records)
216
222
  except Exception as e:
217
223
  # TODO: Do something other than dump the full stack trace into the logs?
224
+ # TODO: Eventually we'll return an is_success = false value.
218
225
  return ProcessStepResponse(log=[traceback.format_exc()])
219
226
 
220
227
  @staticmethod
@@ -244,6 +251,25 @@ class ToolServiceBase(ToolServiceServicer, ABC):
244
251
  """
245
252
  return 1
246
253
 
254
+ def _get_tools(self) -> list[ToolBase]:
255
+ """
256
+ Get the tools registered with this service.
257
+ """
258
+ # If the tools have not been registered, call the register_tools method to do so.
259
+ if not hasattr(self, "tools"):
260
+ self.tools = self.register_tools()
261
+ # If the tools are still not registered, raise an exception.
262
+ if not self.tools:
263
+ raise Exception("No tools registered with this service.")
264
+ return self.tools
265
+
266
+ @abstractmethod
267
+ def register_tools(self) -> list[ToolBase]:
268
+ """
269
+ Register the tools with this service.
270
+ """
271
+ pass
272
+
247
273
  @abstractmethod
248
274
  def get_details(self, user: SapioUser, request: ToolDetailsRequest, context: ServicerContext) -> list[ToolDetails]:
249
275
  """
@@ -255,7 +281,81 @@ class ToolServiceBase(ToolServiceServicer, ABC):
255
281
  :param context: The gRPC context.
256
282
  :return: A ToolDetailsResponse object containing the tool details.
257
283
  """
258
- pass
284
+ tool_details: list[ToolDetails] = []
285
+ for tool in self._get_tools():
286
+ tool_details.append(tool.to_proto())
287
+ return tool_details
288
+
289
+ @abstractmethod
290
+ def run(self, user: SapioUser, request: ProcessStepRequest, context: ServicerContext) -> list[SapioToolResult]:
291
+ """
292
+ Execute a tool from this service.
293
+
294
+ :param user: A user object that can be used to initialize manager classes using DataMgmtServer to query the
295
+ system.
296
+ :param request: The request object containing the input data.
297
+ :param context: The gRPC context.
298
+ :return: A SapioToolResults object containing the response data.
299
+ """
300
+ for tool in self._get_tools():
301
+ if request.tool_name == tool.name:
302
+ return tool.run(user, request, context)
303
+ raise Exception(f"Tool {request.tool_name} not found in registered tools.")
304
+
305
+
306
+ class ToolBase(ABC):
307
+ name: str
308
+ description: str
309
+ data_type_name: str | None
310
+ inputs: list[ToolInputDetails]
311
+ outputs: list[ToolOutputDetails]
312
+ configs: list[VeloxFieldDefProto]
313
+
314
+ def __init__(self, name: str, description: str, data_type_name: str | None = None):
315
+ self.name = name
316
+ self.description = description
317
+ self.data_type_name = data_type_name
318
+ self.inputs = []
319
+ self.outputs = []
320
+
321
+ def add_input(self, details: ToolInputDetails) -> None:
322
+ """
323
+ Add an input configuration to the tool.
324
+
325
+ :param details: The input configuration details.
326
+ """
327
+ self.inputs.append(details)
328
+
329
+ def add_output(self, details: ToolOutputDetails) -> None:
330
+ """
331
+ Add an output configuration to the tool.
332
+
333
+ :param details: The output configuration details.
334
+ """
335
+ self.outputs.append(details)
336
+
337
+ def add_config_field(self, field: VeloxFieldDefProto) -> None:
338
+ """
339
+ Add a configuration field to the tool.
340
+
341
+ :param field: The configuration field details.
342
+ """
343
+ self.configs.append(field)
344
+
345
+ def to_proto(self) -> ToolDetails:
346
+ """
347
+ Convert this tool to a ToolDetails proto object.
348
+
349
+ :return: The ToolDetails proto object.
350
+ """
351
+ return ToolDetails(
352
+ name=self.name,
353
+ description=self.description,
354
+ input_configs=self.inputs,
355
+ output_configs=self.outputs,
356
+ output_data_type_name=self.data_type_name,
357
+ config_fields=self.configs
358
+ )
259
359
 
260
360
  @abstractmethod
261
361
  def run(self, user: SapioUser, request: ProcessStepRequest, context: ServicerContext) -> list[SapioToolResult]: