aiqtoolkit 1.1.0rc6__py3-none-any.whl → 1.2.0__py3-none-any.whl

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 aiqtoolkit might be problematic. Click here for more details.

Files changed (319) hide show
  1. aiqtoolkit-1.2.0.dist-info/METADATA +29 -0
  2. aiqtoolkit-1.2.0.dist-info/RECORD +4 -0
  3. {aiqtoolkit-1.1.0rc6.dist-info → aiqtoolkit-1.2.0.dist-info}/WHEEL +1 -1
  4. aiqtoolkit-1.2.0.dist-info/top_level.txt +1 -0
  5. aiq/agent/__init__.py +0 -0
  6. aiq/agent/base.py +0 -76
  7. aiq/agent/dual_node.py +0 -67
  8. aiq/agent/react_agent/__init__.py +0 -0
  9. aiq/agent/react_agent/agent.py +0 -322
  10. aiq/agent/react_agent/output_parser.py +0 -104
  11. aiq/agent/react_agent/prompt.py +0 -46
  12. aiq/agent/react_agent/register.py +0 -148
  13. aiq/agent/reasoning_agent/__init__.py +0 -0
  14. aiq/agent/reasoning_agent/reasoning_agent.py +0 -224
  15. aiq/agent/register.py +0 -23
  16. aiq/agent/rewoo_agent/__init__.py +0 -0
  17. aiq/agent/rewoo_agent/agent.py +0 -410
  18. aiq/agent/rewoo_agent/prompt.py +0 -108
  19. aiq/agent/rewoo_agent/register.py +0 -158
  20. aiq/agent/tool_calling_agent/__init__.py +0 -0
  21. aiq/agent/tool_calling_agent/agent.py +0 -123
  22. aiq/agent/tool_calling_agent/register.py +0 -105
  23. aiq/builder/__init__.py +0 -0
  24. aiq/builder/builder.py +0 -223
  25. aiq/builder/component_utils.py +0 -303
  26. aiq/builder/context.py +0 -227
  27. aiq/builder/embedder.py +0 -24
  28. aiq/builder/eval_builder.py +0 -120
  29. aiq/builder/evaluator.py +0 -29
  30. aiq/builder/framework_enum.py +0 -24
  31. aiq/builder/front_end.py +0 -73
  32. aiq/builder/function.py +0 -297
  33. aiq/builder/function_base.py +0 -376
  34. aiq/builder/function_info.py +0 -627
  35. aiq/builder/intermediate_step_manager.py +0 -176
  36. aiq/builder/llm.py +0 -25
  37. aiq/builder/retriever.py +0 -25
  38. aiq/builder/user_interaction_manager.py +0 -71
  39. aiq/builder/workflow.py +0 -143
  40. aiq/builder/workflow_builder.py +0 -757
  41. aiq/cli/__init__.py +0 -14
  42. aiq/cli/cli_utils/__init__.py +0 -0
  43. aiq/cli/cli_utils/config_override.py +0 -231
  44. aiq/cli/cli_utils/validation.py +0 -37
  45. aiq/cli/commands/__init__.py +0 -0
  46. aiq/cli/commands/configure/__init__.py +0 -0
  47. aiq/cli/commands/configure/channel/__init__.py +0 -0
  48. aiq/cli/commands/configure/channel/add.py +0 -28
  49. aiq/cli/commands/configure/channel/channel.py +0 -36
  50. aiq/cli/commands/configure/channel/remove.py +0 -30
  51. aiq/cli/commands/configure/channel/update.py +0 -30
  52. aiq/cli/commands/configure/configure.py +0 -33
  53. aiq/cli/commands/evaluate.py +0 -139
  54. aiq/cli/commands/info/__init__.py +0 -14
  55. aiq/cli/commands/info/info.py +0 -39
  56. aiq/cli/commands/info/list_channels.py +0 -32
  57. aiq/cli/commands/info/list_components.py +0 -129
  58. aiq/cli/commands/info/list_mcp.py +0 -126
  59. aiq/cli/commands/registry/__init__.py +0 -14
  60. aiq/cli/commands/registry/publish.py +0 -88
  61. aiq/cli/commands/registry/pull.py +0 -118
  62. aiq/cli/commands/registry/registry.py +0 -38
  63. aiq/cli/commands/registry/remove.py +0 -108
  64. aiq/cli/commands/registry/search.py +0 -155
  65. aiq/cli/commands/start.py +0 -250
  66. aiq/cli/commands/uninstall.py +0 -83
  67. aiq/cli/commands/validate.py +0 -47
  68. aiq/cli/commands/workflow/__init__.py +0 -14
  69. aiq/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  70. aiq/cli/commands/workflow/templates/config.yml.j2 +0 -16
  71. aiq/cli/commands/workflow/templates/pyproject.toml.j2 +0 -22
  72. aiq/cli/commands/workflow/templates/register.py.j2 +0 -5
  73. aiq/cli/commands/workflow/templates/workflow.py.j2 +0 -36
  74. aiq/cli/commands/workflow/workflow.py +0 -37
  75. aiq/cli/commands/workflow/workflow_commands.py +0 -313
  76. aiq/cli/entrypoint.py +0 -133
  77. aiq/cli/main.py +0 -44
  78. aiq/cli/register_workflow.py +0 -408
  79. aiq/cli/type_registry.py +0 -879
  80. aiq/data_models/__init__.py +0 -14
  81. aiq/data_models/api_server.py +0 -588
  82. aiq/data_models/common.py +0 -143
  83. aiq/data_models/component.py +0 -46
  84. aiq/data_models/component_ref.py +0 -135
  85. aiq/data_models/config.py +0 -349
  86. aiq/data_models/dataset_handler.py +0 -122
  87. aiq/data_models/discovery_metadata.py +0 -286
  88. aiq/data_models/embedder.py +0 -26
  89. aiq/data_models/evaluate.py +0 -104
  90. aiq/data_models/evaluator.py +0 -26
  91. aiq/data_models/front_end.py +0 -26
  92. aiq/data_models/function.py +0 -30
  93. aiq/data_models/function_dependencies.py +0 -64
  94. aiq/data_models/interactive.py +0 -237
  95. aiq/data_models/intermediate_step.py +0 -269
  96. aiq/data_models/invocation_node.py +0 -38
  97. aiq/data_models/llm.py +0 -26
  98. aiq/data_models/logging.py +0 -26
  99. aiq/data_models/memory.py +0 -26
  100. aiq/data_models/profiler.py +0 -53
  101. aiq/data_models/registry_handler.py +0 -26
  102. aiq/data_models/retriever.py +0 -30
  103. aiq/data_models/step_adaptor.py +0 -64
  104. aiq/data_models/streaming.py +0 -33
  105. aiq/data_models/swe_bench_model.py +0 -54
  106. aiq/data_models/telemetry_exporter.py +0 -26
  107. aiq/embedder/__init__.py +0 -0
  108. aiq/embedder/langchain_client.py +0 -41
  109. aiq/embedder/nim_embedder.py +0 -58
  110. aiq/embedder/openai_embedder.py +0 -42
  111. aiq/embedder/register.py +0 -24
  112. aiq/eval/__init__.py +0 -14
  113. aiq/eval/config.py +0 -42
  114. aiq/eval/dataset_handler/__init__.py +0 -0
  115. aiq/eval/dataset_handler/dataset_downloader.py +0 -106
  116. aiq/eval/dataset_handler/dataset_filter.py +0 -52
  117. aiq/eval/dataset_handler/dataset_handler.py +0 -169
  118. aiq/eval/evaluate.py +0 -325
  119. aiq/eval/evaluator/__init__.py +0 -14
  120. aiq/eval/evaluator/evaluator_model.py +0 -44
  121. aiq/eval/intermediate_step_adapter.py +0 -93
  122. aiq/eval/rag_evaluator/__init__.py +0 -0
  123. aiq/eval/rag_evaluator/evaluate.py +0 -138
  124. aiq/eval/rag_evaluator/register.py +0 -138
  125. aiq/eval/register.py +0 -23
  126. aiq/eval/remote_workflow.py +0 -128
  127. aiq/eval/runtime_event_subscriber.py +0 -52
  128. aiq/eval/swe_bench_evaluator/__init__.py +0 -0
  129. aiq/eval/swe_bench_evaluator/evaluate.py +0 -215
  130. aiq/eval/swe_bench_evaluator/register.py +0 -36
  131. aiq/eval/trajectory_evaluator/__init__.py +0 -0
  132. aiq/eval/trajectory_evaluator/evaluate.py +0 -118
  133. aiq/eval/trajectory_evaluator/register.py +0 -40
  134. aiq/eval/tunable_rag_evaluator/__init__.py +0 -0
  135. aiq/eval/tunable_rag_evaluator/evaluate.py +0 -263
  136. aiq/eval/tunable_rag_evaluator/register.py +0 -50
  137. aiq/eval/utils/__init__.py +0 -0
  138. aiq/eval/utils/output_uploader.py +0 -131
  139. aiq/eval/utils/tqdm_position_registry.py +0 -40
  140. aiq/front_ends/__init__.py +0 -14
  141. aiq/front_ends/console/__init__.py +0 -14
  142. aiq/front_ends/console/console_front_end_config.py +0 -32
  143. aiq/front_ends/console/console_front_end_plugin.py +0 -107
  144. aiq/front_ends/console/register.py +0 -25
  145. aiq/front_ends/cron/__init__.py +0 -14
  146. aiq/front_ends/fastapi/__init__.py +0 -14
  147. aiq/front_ends/fastapi/fastapi_front_end_config.py +0 -150
  148. aiq/front_ends/fastapi/fastapi_front_end_plugin.py +0 -103
  149. aiq/front_ends/fastapi/fastapi_front_end_plugin_worker.py +0 -607
  150. aiq/front_ends/fastapi/intermediate_steps_subscriber.py +0 -80
  151. aiq/front_ends/fastapi/job_store.py +0 -161
  152. aiq/front_ends/fastapi/main.py +0 -70
  153. aiq/front_ends/fastapi/message_handler.py +0 -279
  154. aiq/front_ends/fastapi/message_validator.py +0 -345
  155. aiq/front_ends/fastapi/register.py +0 -25
  156. aiq/front_ends/fastapi/response_helpers.py +0 -195
  157. aiq/front_ends/fastapi/step_adaptor.py +0 -320
  158. aiq/front_ends/fastapi/websocket.py +0 -148
  159. aiq/front_ends/mcp/__init__.py +0 -14
  160. aiq/front_ends/mcp/mcp_front_end_config.py +0 -32
  161. aiq/front_ends/mcp/mcp_front_end_plugin.py +0 -93
  162. aiq/front_ends/mcp/register.py +0 -27
  163. aiq/front_ends/mcp/tool_converter.py +0 -242
  164. aiq/front_ends/register.py +0 -22
  165. aiq/front_ends/simple_base/__init__.py +0 -14
  166. aiq/front_ends/simple_base/simple_front_end_plugin_base.py +0 -52
  167. aiq/llm/__init__.py +0 -0
  168. aiq/llm/nim_llm.py +0 -45
  169. aiq/llm/openai_llm.py +0 -45
  170. aiq/llm/register.py +0 -22
  171. aiq/llm/utils/__init__.py +0 -14
  172. aiq/llm/utils/env_config_value.py +0 -94
  173. aiq/llm/utils/error.py +0 -17
  174. aiq/memory/__init__.py +0 -20
  175. aiq/memory/interfaces.py +0 -183
  176. aiq/memory/models.py +0 -112
  177. aiq/meta/module_to_distro.json +0 -3
  178. aiq/meta/pypi.md +0 -58
  179. aiq/observability/__init__.py +0 -0
  180. aiq/observability/async_otel_listener.py +0 -429
  181. aiq/observability/register.py +0 -99
  182. aiq/plugins/.namespace +0 -1
  183. aiq/profiler/__init__.py +0 -0
  184. aiq/profiler/callbacks/__init__.py +0 -0
  185. aiq/profiler/callbacks/agno_callback_handler.py +0 -295
  186. aiq/profiler/callbacks/base_callback_class.py +0 -20
  187. aiq/profiler/callbacks/langchain_callback_handler.py +0 -278
  188. aiq/profiler/callbacks/llama_index_callback_handler.py +0 -205
  189. aiq/profiler/callbacks/semantic_kernel_callback_handler.py +0 -238
  190. aiq/profiler/callbacks/token_usage_base_model.py +0 -27
  191. aiq/profiler/data_frame_row.py +0 -51
  192. aiq/profiler/decorators/__init__.py +0 -0
  193. aiq/profiler/decorators/framework_wrapper.py +0 -131
  194. aiq/profiler/decorators/function_tracking.py +0 -254
  195. aiq/profiler/forecasting/__init__.py +0 -0
  196. aiq/profiler/forecasting/config.py +0 -18
  197. aiq/profiler/forecasting/model_trainer.py +0 -75
  198. aiq/profiler/forecasting/models/__init__.py +0 -22
  199. aiq/profiler/forecasting/models/forecasting_base_model.py +0 -40
  200. aiq/profiler/forecasting/models/linear_model.py +0 -196
  201. aiq/profiler/forecasting/models/random_forest_regressor.py +0 -268
  202. aiq/profiler/inference_metrics_model.py +0 -25
  203. aiq/profiler/inference_optimization/__init__.py +0 -0
  204. aiq/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  205. aiq/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +0 -452
  206. aiq/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +0 -258
  207. aiq/profiler/inference_optimization/data_models.py +0 -386
  208. aiq/profiler/inference_optimization/experimental/__init__.py +0 -0
  209. aiq/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +0 -468
  210. aiq/profiler/inference_optimization/experimental/prefix_span_analysis.py +0 -405
  211. aiq/profiler/inference_optimization/llm_metrics.py +0 -212
  212. aiq/profiler/inference_optimization/prompt_caching.py +0 -163
  213. aiq/profiler/inference_optimization/token_uniqueness.py +0 -107
  214. aiq/profiler/inference_optimization/workflow_runtimes.py +0 -72
  215. aiq/profiler/intermediate_property_adapter.py +0 -102
  216. aiq/profiler/profile_runner.py +0 -433
  217. aiq/profiler/utils.py +0 -184
  218. aiq/registry_handlers/__init__.py +0 -0
  219. aiq/registry_handlers/local/__init__.py +0 -0
  220. aiq/registry_handlers/local/local_handler.py +0 -176
  221. aiq/registry_handlers/local/register_local.py +0 -37
  222. aiq/registry_handlers/metadata_factory.py +0 -60
  223. aiq/registry_handlers/package_utils.py +0 -198
  224. aiq/registry_handlers/pypi/__init__.py +0 -0
  225. aiq/registry_handlers/pypi/pypi_handler.py +0 -251
  226. aiq/registry_handlers/pypi/register_pypi.py +0 -40
  227. aiq/registry_handlers/register.py +0 -21
  228. aiq/registry_handlers/registry_handler_base.py +0 -157
  229. aiq/registry_handlers/rest/__init__.py +0 -0
  230. aiq/registry_handlers/rest/register_rest.py +0 -56
  231. aiq/registry_handlers/rest/rest_handler.py +0 -237
  232. aiq/registry_handlers/schemas/__init__.py +0 -0
  233. aiq/registry_handlers/schemas/headers.py +0 -42
  234. aiq/registry_handlers/schemas/package.py +0 -68
  235. aiq/registry_handlers/schemas/publish.py +0 -63
  236. aiq/registry_handlers/schemas/pull.py +0 -82
  237. aiq/registry_handlers/schemas/remove.py +0 -36
  238. aiq/registry_handlers/schemas/search.py +0 -91
  239. aiq/registry_handlers/schemas/status.py +0 -47
  240. aiq/retriever/__init__.py +0 -0
  241. aiq/retriever/interface.py +0 -37
  242. aiq/retriever/milvus/__init__.py +0 -14
  243. aiq/retriever/milvus/register.py +0 -81
  244. aiq/retriever/milvus/retriever.py +0 -228
  245. aiq/retriever/models.py +0 -74
  246. aiq/retriever/nemo_retriever/__init__.py +0 -14
  247. aiq/retriever/nemo_retriever/register.py +0 -60
  248. aiq/retriever/nemo_retriever/retriever.py +0 -190
  249. aiq/retriever/register.py +0 -22
  250. aiq/runtime/__init__.py +0 -14
  251. aiq/runtime/loader.py +0 -188
  252. aiq/runtime/runner.py +0 -176
  253. aiq/runtime/session.py +0 -140
  254. aiq/runtime/user_metadata.py +0 -131
  255. aiq/settings/__init__.py +0 -0
  256. aiq/settings/global_settings.py +0 -318
  257. aiq/test/.namespace +0 -1
  258. aiq/tool/__init__.py +0 -0
  259. aiq/tool/code_execution/__init__.py +0 -0
  260. aiq/tool/code_execution/code_sandbox.py +0 -188
  261. aiq/tool/code_execution/local_sandbox/Dockerfile.sandbox +0 -60
  262. aiq/tool/code_execution/local_sandbox/__init__.py +0 -13
  263. aiq/tool/code_execution/local_sandbox/local_sandbox_server.py +0 -83
  264. aiq/tool/code_execution/local_sandbox/sandbox.requirements.txt +0 -4
  265. aiq/tool/code_execution/local_sandbox/start_local_sandbox.sh +0 -25
  266. aiq/tool/code_execution/register.py +0 -70
  267. aiq/tool/code_execution/utils.py +0 -100
  268. aiq/tool/datetime_tools.py +0 -42
  269. aiq/tool/document_search.py +0 -141
  270. aiq/tool/github_tools/__init__.py +0 -0
  271. aiq/tool/github_tools/create_github_commit.py +0 -133
  272. aiq/tool/github_tools/create_github_issue.py +0 -87
  273. aiq/tool/github_tools/create_github_pr.py +0 -106
  274. aiq/tool/github_tools/get_github_file.py +0 -106
  275. aiq/tool/github_tools/get_github_issue.py +0 -166
  276. aiq/tool/github_tools/get_github_pr.py +0 -256
  277. aiq/tool/github_tools/update_github_issue.py +0 -100
  278. aiq/tool/mcp/__init__.py +0 -14
  279. aiq/tool/mcp/mcp_client.py +0 -220
  280. aiq/tool/mcp/mcp_tool.py +0 -95
  281. aiq/tool/memory_tools/__init__.py +0 -0
  282. aiq/tool/memory_tools/add_memory_tool.py +0 -79
  283. aiq/tool/memory_tools/delete_memory_tool.py +0 -67
  284. aiq/tool/memory_tools/get_memory_tool.py +0 -72
  285. aiq/tool/nvidia_rag.py +0 -95
  286. aiq/tool/register.py +0 -37
  287. aiq/tool/retriever.py +0 -89
  288. aiq/tool/server_tools.py +0 -63
  289. aiq/utils/__init__.py +0 -0
  290. aiq/utils/data_models/__init__.py +0 -0
  291. aiq/utils/data_models/schema_validator.py +0 -58
  292. aiq/utils/debugging_utils.py +0 -43
  293. aiq/utils/exception_handlers/__init__.py +0 -0
  294. aiq/utils/exception_handlers/schemas.py +0 -114
  295. aiq/utils/io/__init__.py +0 -0
  296. aiq/utils/io/yaml_tools.py +0 -119
  297. aiq/utils/metadata_utils.py +0 -74
  298. aiq/utils/optional_imports.py +0 -142
  299. aiq/utils/producer_consumer_queue.py +0 -178
  300. aiq/utils/reactive/__init__.py +0 -0
  301. aiq/utils/reactive/base/__init__.py +0 -0
  302. aiq/utils/reactive/base/observable_base.py +0 -65
  303. aiq/utils/reactive/base/observer_base.py +0 -55
  304. aiq/utils/reactive/base/subject_base.py +0 -79
  305. aiq/utils/reactive/observable.py +0 -59
  306. aiq/utils/reactive/observer.py +0 -76
  307. aiq/utils/reactive/subject.py +0 -131
  308. aiq/utils/reactive/subscription.py +0 -49
  309. aiq/utils/settings/__init__.py +0 -0
  310. aiq/utils/settings/global_settings.py +0 -197
  311. aiq/utils/type_converter.py +0 -232
  312. aiq/utils/type_utils.py +0 -397
  313. aiq/utils/url_utils.py +0 -27
  314. aiqtoolkit-1.1.0rc6.dist-info/METADATA +0 -331
  315. aiqtoolkit-1.1.0rc6.dist-info/RECORD +0 -316
  316. aiqtoolkit-1.1.0rc6.dist-info/entry_points.txt +0 -17
  317. aiqtoolkit-1.1.0rc6.dist-info/licenses/LICENSE-3rd-party.txt +0 -3686
  318. aiqtoolkit-1.1.0rc6.dist-info/licenses/LICENSE.md +0 -201
  319. aiqtoolkit-1.1.0rc6.dist-info/top_level.txt +0 -1
@@ -1,376 +0,0 @@
1
- # SPDX-FileCopyrightText: Copyright (c) 2025, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2
- # SPDX-License-Identifier: Apache-2.0
3
- #
4
- # Licensed under the Apache License, Version 2.0 (the "License");
5
- # you may not use this file except in compliance with the License.
6
- # You may obtain a copy of the License at
7
- #
8
- # http://www.apache.org/licenses/LICENSE-2.0
9
- #
10
- # Unless required by applicable law or agreed to in writing, software
11
- # distributed under the License is distributed on an "AS IS" BASIS,
12
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
- # See the License for the specific language governing permissions and
14
- # limitations under the License.
15
- """Base class for AIQ Toolkit functions providing type handling and schema management.
16
-
17
- This module contains the FunctionBase abstract base class which provides core functionality
18
- for AIQ Toolkit functions including type handling via generics, schema management for inputs and outputs,
19
- and type conversion capabilities.
20
- """
21
-
22
- import logging
23
- import typing
24
- from abc import ABC
25
- from collections.abc import Callable
26
- from functools import lru_cache
27
- from types import NoneType
28
-
29
- from pydantic import BaseModel
30
-
31
- from aiq.utils.type_converter import TypeConverter
32
- from aiq.utils.type_utils import DecomposedType
33
-
34
- InputT = typing.TypeVar("InputT")
35
- StreamingOutputT = typing.TypeVar("StreamingOutputT")
36
- SingleOutputT = typing.TypeVar("SingleOutputT")
37
-
38
- logger = logging.getLogger(__name__)
39
-
40
-
41
- class FunctionBase(typing.Generic[InputT, StreamingOutputT, SingleOutputT], ABC):
42
- """
43
- Abstract base class providing core functionality for AIQ Toolkit functions.
44
-
45
- This class provides type handling via generics, schema management for inputs and outputs,
46
- and type conversion capabilities.
47
-
48
- Parameters
49
- ----------
50
- InputT : TypeVar
51
- The input type for the function
52
- StreamingOutputT : TypeVar
53
- The output type for streaming results
54
- SingleOutputT : TypeVar
55
- The output type for single results
56
-
57
- Notes
58
- -----
59
- FunctionBase is the foundation of the AIQ Toolkit function system, providing:
60
- - Type handling via generics
61
- - Schema management for inputs and outputs
62
- - Type conversion capabilities
63
- - Abstract interface that concrete function classes must implement
64
- """
65
-
66
- def __init__(self,
67
- *,
68
- input_schema: type[BaseModel] | None = None,
69
- streaming_output_schema: type[BaseModel] | type[None] | None = None,
70
- single_output_schema: type[BaseModel] | type[None] | None = None,
71
- converters: list[Callable[[typing.Any], typing.Any]] | None = None):
72
-
73
- converters = converters or []
74
-
75
- self._converter_list = converters
76
-
77
- final_input_schema = input_schema or DecomposedType(self.input_type).get_pydantic_schema(converters)
78
-
79
- assert not issubclass(final_input_schema, NoneType)
80
-
81
- self._input_schema = final_input_schema
82
-
83
- if streaming_output_schema is not None:
84
- self._streaming_output_schema = streaming_output_schema
85
- else:
86
- self._streaming_output_schema = DecomposedType(self.streaming_output_type).get_pydantic_schema(converters)
87
-
88
- if single_output_schema is not None:
89
- self._single_output_schema = single_output_schema
90
- else:
91
- self._single_output_schema = DecomposedType(self.single_output_type).get_pydantic_schema(converters)
92
-
93
- self._converter: TypeConverter = TypeConverter(converters)
94
-
95
- @property
96
- @lru_cache
97
- def input_type(self) -> type[InputT]:
98
- """
99
- Get the input type of the function. The input type is determined by the generic parameters of the class.
100
-
101
- For example, if a function is defined as `def my_function(input: list[int]) -> str`, the `input_type` is
102
- `list[int]`.
103
-
104
- Returns
105
- -------
106
- type[InputT]
107
- The input type specified in the generic parameters
108
-
109
- Raises
110
- ------
111
- ValueError
112
- If the input type cannot be determined from the class definition
113
- """
114
- for base_cls in self.__class__.__orig_bases__: # pylint: disable=no-member # type: ignore
115
-
116
- base_cls_args = typing.get_args(base_cls)
117
-
118
- if len(base_cls_args) == 3:
119
- return base_cls_args[0]
120
-
121
- raise ValueError("Could not find input schema")
122
-
123
- @property
124
- @lru_cache
125
- def input_class(self) -> type:
126
- """
127
- Get the python class of the input type. This is the class that can be used to check if a value is an instance of
128
- the input type. It removes any generic or annotation information from the input type.
129
-
130
- For example, if a function is defined as `def my_function(input: list[int]) -> str`, the `input_class` is
131
- `list`.
132
-
133
- Returns
134
- -------
135
- type
136
- The python type of the input type
137
- """
138
-
139
- input_origin = typing.get_origin(self.input_type)
140
-
141
- if (input_origin is None):
142
- return self.input_type
143
-
144
- return input_origin
145
-
146
- @property
147
- @lru_cache
148
- def input_schema(self) -> type[BaseModel]:
149
- """
150
- Get the Pydantic model schema for validating inputs. The schema must be pydantic models. This allows for
151
- type validation and coercion, and documenting schema properties of the input value. If the input type is
152
- already a pydantic model, it will be returned as is.
153
-
154
- For example, if a function is defined as `def my_function(input: list[int]) -> str`, the `input_schema` is::
155
-
156
- class InputSchema(BaseModel):
157
- input: list[int]
158
-
159
-
160
- Returns
161
- -------
162
- type[BaseModel]
163
- The Pydantic model class for input validation
164
- """
165
- return self._input_schema
166
-
167
- @property
168
- def converter_list(self) -> list[Callable[[typing.Any], typing.Any]]:
169
- """
170
- Get the list of type converters used by this function.
171
-
172
- Returns
173
- -------
174
- list[Callable[[typing.Any], typing.Any]]
175
- List of converter functions that transform input types
176
- """
177
- return self._converter_list
178
-
179
- @property
180
- @lru_cache
181
- def streaming_output_type(self) -> type[StreamingOutputT]:
182
- """
183
- Get the streaming output type of the function. The streaming output type is determined by the generic parameters
184
- of the class.
185
-
186
- For example, if a function is defined as `def my_function(input: int) -> AsyncGenerator[dict[str, Any]]`,
187
- the `streaming_output_type` is `dict[str, Any]`.
188
-
189
- Returns
190
- -------
191
- type[StreamingOutputT]
192
- The streaming output type specified in the generic parameters
193
-
194
- Raises
195
- ------
196
- ValueError
197
- If the streaming output type cannot be determined from the class definition
198
- """
199
- for base_cls in self.__class__.__orig_bases__: # pylint: disable=no-member # type: ignore
200
-
201
- base_cls_args = typing.get_args(base_cls)
202
-
203
- if len(base_cls_args) == 3:
204
- return base_cls_args[1]
205
-
206
- raise ValueError("Could not find output schema")
207
-
208
- @property
209
- @lru_cache
210
- def streaming_output_class(self) -> type:
211
- """
212
- Get the python class of the output type. This is the class that can be used to check if a value is an instance
213
- of the output type. It removes any generic or annotation information from the output type.
214
-
215
- For example, if a function is defined as `def my_function(input: int) -> AsyncGenerator[dict[str, Any]]`,
216
- the `streaming_output_class` is `dict`.
217
-
218
- Returns
219
- -------
220
- type
221
- The python type of the output type
222
- """
223
-
224
- output_origin = typing.get_origin(self.streaming_output_type)
225
-
226
- if (output_origin is None):
227
- return self.streaming_output_type
228
-
229
- return output_origin
230
-
231
- @property
232
- @lru_cache
233
- def streaming_output_schema(self) -> type[BaseModel] | type[None]:
234
- """
235
- Get the Pydantic model schema for validating streaming outputs. The schema must be pydantic models. This allows
236
- for type validation and coercion, and documenting schema properties of the output value. If the output type is
237
- already a pydantic model, it will be returned as is.
238
-
239
- For example, if a function is defined as `def my_function(input: int) -> AsyncGenerator[dict[str, Any]]`,
240
- the `streaming_output_schema` is::
241
-
242
- class StreamingOutputSchema(BaseModel):
243
- value: dict[str, Any]
244
-
245
- Returns
246
- -------
247
- type[BaseModel] | type[None]
248
- The Pydantic model class for streaming output validation, or NoneType if no streaming output.
249
- """
250
- return self._streaming_output_schema
251
-
252
- @property
253
- @lru_cache
254
- def single_output_type(self) -> type[SingleOutputT]:
255
- """
256
- Get the single output type of the function. The single output type is determined by the generic parameters
257
- of the class. Returns NoneType if no single output is supported.
258
-
259
- For example, if a function is defined as `def my_function(input: int) -> list[str]`, the `single_output_type` is
260
- `list[str]`.
261
-
262
- Returns
263
- -------
264
- type[SingleOutputT]
265
- The single output type specified in the generic parameters
266
-
267
- Raises
268
- ------
269
- ValueError
270
- If the single output type cannot be determined from the class definition
271
- """
272
- for base_cls in self.__class__.__orig_bases__: # pylint: disable=no-member # type: ignore
273
-
274
- base_cls_args = typing.get_args(base_cls)
275
-
276
- if len(base_cls_args) == 3:
277
- return base_cls_args[2]
278
-
279
- raise ValueError("Could not find output schema")
280
-
281
- @property
282
- @lru_cache
283
- def single_output_class(self) -> type:
284
- """
285
- Get the python class of the output type. This is the class that can be used to check if a value is an instance
286
- of the output type. It removes any generic or annotation information from the output type.
287
-
288
- For example, if a function is defined as `def my_function(input: int) -> list[str]`, the `single_output_class`
289
- is `list`.
290
-
291
- Returns
292
- -------
293
- type
294
- The python type of the output type
295
- """
296
-
297
- output_origin = typing.get_origin(self.single_output_type)
298
-
299
- if (output_origin is None):
300
- return self.single_output_type
301
-
302
- return output_origin
303
-
304
- @property
305
- @lru_cache
306
- def single_output_schema(self) -> type[BaseModel] | type[None]:
307
- """
308
- Get the Pydantic model schema for validating single outputs. The schema must be pydantic models. This allows for
309
- type validation and coercion, and documenting schema properties of the output value. If the output type is
310
- already a pydantic model, it will be returned as is.
311
-
312
- For example, if a function is defined as `def my_function(input: int) -> list[str]`, the `single_output_schema`
313
- is::
314
-
315
- class SingleOutputSchema(BaseModel):
316
- value: list[str]
317
-
318
- Returns
319
- -------
320
- type[BaseModel] | type[None]
321
- The Pydantic model class for single output validation, or None if no single output
322
- """
323
- return self._single_output_schema
324
-
325
- @property
326
- def has_streaming_output(self) -> bool:
327
- """
328
- Check if this function supports streaming output.
329
-
330
- Returns
331
- -------
332
- bool
333
- True if the function supports streaming output, False otherwise
334
- """
335
- # Override in derived classes if this needs to return False. Assumption is, if not overridden, it has streaming
336
- # output because the ABC has it.
337
- return True
338
-
339
- @property
340
- def has_single_output(self) -> bool:
341
- """
342
- Check if this function supports single output.
343
-
344
- Returns
345
- -------
346
- bool
347
- True if the function supports single output, False otherwise
348
- """
349
- # Override in derived classes if this needs to return False. Assumption is, if not overridden, it has single
350
- # output because the ABC has it.
351
- return True
352
-
353
- def _convert_input(self, value: typing.Any):
354
- if (isinstance(value, self.input_class)):
355
- return value
356
-
357
- # No converter, try to convert to the input schema
358
- if (isinstance(value, dict)):
359
- value = self.input_schema.model_validate(value)
360
-
361
- if (self.input_type == self.input_schema):
362
- return value
363
-
364
- if (isinstance(value, self.input_schema)):
365
-
366
- # Get the first value from the schema object
367
- first_key = next(iter(self.input_schema.model_fields.keys()))
368
-
369
- return getattr(value, first_key)
370
-
371
- # If the value is None bypass conversion to avoid raising an error.
372
- if value is None:
373
- return value
374
-
375
- # Fallback to the converter
376
- return self._converter.convert(value, to_type=self.input_class)