aiqtoolkit 1.2.0rc4__py3-none-any.whl → 1.2.0rc5__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 (441) hide show
  1. aiqtoolkit-1.2.0rc5.dist-info/METADATA +29 -0
  2. aiqtoolkit-1.2.0rc5.dist-info/RECORD +4 -0
  3. aiqtoolkit-1.2.0rc5.dist-info/top_level.txt +1 -0
  4. aiq/agent/__init__.py +0 -0
  5. aiq/agent/base.py +0 -239
  6. aiq/agent/dual_node.py +0 -67
  7. aiq/agent/react_agent/__init__.py +0 -0
  8. aiq/agent/react_agent/agent.py +0 -355
  9. aiq/agent/react_agent/output_parser.py +0 -104
  10. aiq/agent/react_agent/prompt.py +0 -41
  11. aiq/agent/react_agent/register.py +0 -149
  12. aiq/agent/reasoning_agent/__init__.py +0 -0
  13. aiq/agent/reasoning_agent/reasoning_agent.py +0 -225
  14. aiq/agent/register.py +0 -23
  15. aiq/agent/rewoo_agent/__init__.py +0 -0
  16. aiq/agent/rewoo_agent/agent.py +0 -411
  17. aiq/agent/rewoo_agent/prompt.py +0 -108
  18. aiq/agent/rewoo_agent/register.py +0 -158
  19. aiq/agent/tool_calling_agent/__init__.py +0 -0
  20. aiq/agent/tool_calling_agent/agent.py +0 -119
  21. aiq/agent/tool_calling_agent/register.py +0 -106
  22. aiq/authentication/__init__.py +0 -14
  23. aiq/authentication/api_key/__init__.py +0 -14
  24. aiq/authentication/api_key/api_key_auth_provider.py +0 -96
  25. aiq/authentication/api_key/api_key_auth_provider_config.py +0 -124
  26. aiq/authentication/api_key/register.py +0 -26
  27. aiq/authentication/exceptions/__init__.py +0 -14
  28. aiq/authentication/exceptions/api_key_exceptions.py +0 -38
  29. aiq/authentication/exceptions/auth_code_grant_exceptions.py +0 -86
  30. aiq/authentication/exceptions/call_back_exceptions.py +0 -38
  31. aiq/authentication/exceptions/request_exceptions.py +0 -54
  32. aiq/authentication/http_basic_auth/__init__.py +0 -0
  33. aiq/authentication/http_basic_auth/http_basic_auth_provider.py +0 -81
  34. aiq/authentication/http_basic_auth/register.py +0 -30
  35. aiq/authentication/interfaces.py +0 -93
  36. aiq/authentication/oauth2/__init__.py +0 -14
  37. aiq/authentication/oauth2/oauth2_auth_code_flow_provider.py +0 -107
  38. aiq/authentication/oauth2/oauth2_auth_code_flow_provider_config.py +0 -39
  39. aiq/authentication/oauth2/register.py +0 -25
  40. aiq/authentication/register.py +0 -21
  41. aiq/builder/__init__.py +0 -0
  42. aiq/builder/builder.py +0 -285
  43. aiq/builder/component_utils.py +0 -316
  44. aiq/builder/context.py +0 -264
  45. aiq/builder/embedder.py +0 -24
  46. aiq/builder/eval_builder.py +0 -161
  47. aiq/builder/evaluator.py +0 -29
  48. aiq/builder/framework_enum.py +0 -24
  49. aiq/builder/front_end.py +0 -73
  50. aiq/builder/function.py +0 -344
  51. aiq/builder/function_base.py +0 -380
  52. aiq/builder/function_info.py +0 -627
  53. aiq/builder/intermediate_step_manager.py +0 -174
  54. aiq/builder/llm.py +0 -25
  55. aiq/builder/retriever.py +0 -25
  56. aiq/builder/user_interaction_manager.py +0 -74
  57. aiq/builder/workflow.py +0 -148
  58. aiq/builder/workflow_builder.py +0 -1117
  59. aiq/cli/__init__.py +0 -14
  60. aiq/cli/cli_utils/__init__.py +0 -0
  61. aiq/cli/cli_utils/config_override.py +0 -231
  62. aiq/cli/cli_utils/validation.py +0 -37
  63. aiq/cli/commands/__init__.py +0 -0
  64. aiq/cli/commands/configure/__init__.py +0 -0
  65. aiq/cli/commands/configure/channel/__init__.py +0 -0
  66. aiq/cli/commands/configure/channel/add.py +0 -28
  67. aiq/cli/commands/configure/channel/channel.py +0 -36
  68. aiq/cli/commands/configure/channel/remove.py +0 -30
  69. aiq/cli/commands/configure/channel/update.py +0 -30
  70. aiq/cli/commands/configure/configure.py +0 -33
  71. aiq/cli/commands/evaluate.py +0 -139
  72. aiq/cli/commands/info/__init__.py +0 -14
  73. aiq/cli/commands/info/info.py +0 -39
  74. aiq/cli/commands/info/list_channels.py +0 -32
  75. aiq/cli/commands/info/list_components.py +0 -129
  76. aiq/cli/commands/info/list_mcp.py +0 -213
  77. aiq/cli/commands/registry/__init__.py +0 -14
  78. aiq/cli/commands/registry/publish.py +0 -88
  79. aiq/cli/commands/registry/pull.py +0 -118
  80. aiq/cli/commands/registry/registry.py +0 -38
  81. aiq/cli/commands/registry/remove.py +0 -108
  82. aiq/cli/commands/registry/search.py +0 -155
  83. aiq/cli/commands/sizing/__init__.py +0 -14
  84. aiq/cli/commands/sizing/calc.py +0 -297
  85. aiq/cli/commands/sizing/sizing.py +0 -27
  86. aiq/cli/commands/start.py +0 -246
  87. aiq/cli/commands/uninstall.py +0 -81
  88. aiq/cli/commands/validate.py +0 -47
  89. aiq/cli/commands/workflow/__init__.py +0 -14
  90. aiq/cli/commands/workflow/templates/__init__.py.j2 +0 -0
  91. aiq/cli/commands/workflow/templates/config.yml.j2 +0 -16
  92. aiq/cli/commands/workflow/templates/pyproject.toml.j2 +0 -22
  93. aiq/cli/commands/workflow/templates/register.py.j2 +0 -5
  94. aiq/cli/commands/workflow/templates/workflow.py.j2 +0 -36
  95. aiq/cli/commands/workflow/workflow.py +0 -37
  96. aiq/cli/commands/workflow/workflow_commands.py +0 -313
  97. aiq/cli/entrypoint.py +0 -135
  98. aiq/cli/main.py +0 -44
  99. aiq/cli/register_workflow.py +0 -488
  100. aiq/cli/type_registry.py +0 -1000
  101. aiq/data_models/__init__.py +0 -14
  102. aiq/data_models/api_server.py +0 -694
  103. aiq/data_models/authentication.py +0 -231
  104. aiq/data_models/common.py +0 -171
  105. aiq/data_models/component.py +0 -54
  106. aiq/data_models/component_ref.py +0 -168
  107. aiq/data_models/config.py +0 -406
  108. aiq/data_models/dataset_handler.py +0 -123
  109. aiq/data_models/discovery_metadata.py +0 -335
  110. aiq/data_models/embedder.py +0 -27
  111. aiq/data_models/evaluate.py +0 -127
  112. aiq/data_models/evaluator.py +0 -26
  113. aiq/data_models/front_end.py +0 -26
  114. aiq/data_models/function.py +0 -30
  115. aiq/data_models/function_dependencies.py +0 -72
  116. aiq/data_models/interactive.py +0 -246
  117. aiq/data_models/intermediate_step.py +0 -302
  118. aiq/data_models/invocation_node.py +0 -38
  119. aiq/data_models/its_strategy.py +0 -30
  120. aiq/data_models/llm.py +0 -27
  121. aiq/data_models/logging.py +0 -26
  122. aiq/data_models/memory.py +0 -27
  123. aiq/data_models/object_store.py +0 -44
  124. aiq/data_models/profiler.py +0 -54
  125. aiq/data_models/registry_handler.py +0 -26
  126. aiq/data_models/retriever.py +0 -30
  127. aiq/data_models/retry_mixin.py +0 -35
  128. aiq/data_models/span.py +0 -187
  129. aiq/data_models/step_adaptor.py +0 -64
  130. aiq/data_models/streaming.py +0 -33
  131. aiq/data_models/swe_bench_model.py +0 -54
  132. aiq/data_models/telemetry_exporter.py +0 -26
  133. aiq/embedder/__init__.py +0 -0
  134. aiq/embedder/langchain_client.py +0 -41
  135. aiq/embedder/nim_embedder.py +0 -59
  136. aiq/embedder/openai_embedder.py +0 -43
  137. aiq/embedder/register.py +0 -24
  138. aiq/eval/__init__.py +0 -14
  139. aiq/eval/config.py +0 -60
  140. aiq/eval/dataset_handler/__init__.py +0 -0
  141. aiq/eval/dataset_handler/dataset_downloader.py +0 -106
  142. aiq/eval/dataset_handler/dataset_filter.py +0 -52
  143. aiq/eval/dataset_handler/dataset_handler.py +0 -254
  144. aiq/eval/evaluate.py +0 -506
  145. aiq/eval/evaluator/__init__.py +0 -14
  146. aiq/eval/evaluator/base_evaluator.py +0 -73
  147. aiq/eval/evaluator/evaluator_model.py +0 -45
  148. aiq/eval/intermediate_step_adapter.py +0 -99
  149. aiq/eval/rag_evaluator/__init__.py +0 -0
  150. aiq/eval/rag_evaluator/evaluate.py +0 -178
  151. aiq/eval/rag_evaluator/register.py +0 -143
  152. aiq/eval/register.py +0 -23
  153. aiq/eval/remote_workflow.py +0 -133
  154. aiq/eval/runners/__init__.py +0 -14
  155. aiq/eval/runners/config.py +0 -39
  156. aiq/eval/runners/multi_eval_runner.py +0 -54
  157. aiq/eval/runtime_event_subscriber.py +0 -52
  158. aiq/eval/swe_bench_evaluator/__init__.py +0 -0
  159. aiq/eval/swe_bench_evaluator/evaluate.py +0 -215
  160. aiq/eval/swe_bench_evaluator/register.py +0 -36
  161. aiq/eval/trajectory_evaluator/__init__.py +0 -0
  162. aiq/eval/trajectory_evaluator/evaluate.py +0 -75
  163. aiq/eval/trajectory_evaluator/register.py +0 -40
  164. aiq/eval/tunable_rag_evaluator/__init__.py +0 -0
  165. aiq/eval/tunable_rag_evaluator/evaluate.py +0 -245
  166. aiq/eval/tunable_rag_evaluator/register.py +0 -52
  167. aiq/eval/usage_stats.py +0 -41
  168. aiq/eval/utils/__init__.py +0 -0
  169. aiq/eval/utils/output_uploader.py +0 -140
  170. aiq/eval/utils/tqdm_position_registry.py +0 -40
  171. aiq/eval/utils/weave_eval.py +0 -184
  172. aiq/experimental/__init__.py +0 -0
  173. aiq/experimental/decorators/__init__.py +0 -0
  174. aiq/experimental/decorators/experimental_warning_decorator.py +0 -130
  175. aiq/experimental/inference_time_scaling/__init__.py +0 -0
  176. aiq/experimental/inference_time_scaling/editing/__init__.py +0 -0
  177. aiq/experimental/inference_time_scaling/editing/iterative_plan_refinement_editor.py +0 -147
  178. aiq/experimental/inference_time_scaling/editing/llm_as_a_judge_editor.py +0 -204
  179. aiq/experimental/inference_time_scaling/editing/motivation_aware_summarization.py +0 -107
  180. aiq/experimental/inference_time_scaling/functions/__init__.py +0 -0
  181. aiq/experimental/inference_time_scaling/functions/execute_score_select_function.py +0 -105
  182. aiq/experimental/inference_time_scaling/functions/its_tool_orchestration_function.py +0 -205
  183. aiq/experimental/inference_time_scaling/functions/its_tool_wrapper_function.py +0 -146
  184. aiq/experimental/inference_time_scaling/functions/plan_select_execute_function.py +0 -224
  185. aiq/experimental/inference_time_scaling/models/__init__.py +0 -0
  186. aiq/experimental/inference_time_scaling/models/editor_config.py +0 -132
  187. aiq/experimental/inference_time_scaling/models/its_item.py +0 -48
  188. aiq/experimental/inference_time_scaling/models/scoring_config.py +0 -112
  189. aiq/experimental/inference_time_scaling/models/search_config.py +0 -120
  190. aiq/experimental/inference_time_scaling/models/selection_config.py +0 -154
  191. aiq/experimental/inference_time_scaling/models/stage_enums.py +0 -43
  192. aiq/experimental/inference_time_scaling/models/strategy_base.py +0 -66
  193. aiq/experimental/inference_time_scaling/models/tool_use_config.py +0 -41
  194. aiq/experimental/inference_time_scaling/register.py +0 -36
  195. aiq/experimental/inference_time_scaling/scoring/__init__.py +0 -0
  196. aiq/experimental/inference_time_scaling/scoring/llm_based_agent_scorer.py +0 -168
  197. aiq/experimental/inference_time_scaling/scoring/llm_based_plan_scorer.py +0 -168
  198. aiq/experimental/inference_time_scaling/scoring/motivation_aware_scorer.py +0 -111
  199. aiq/experimental/inference_time_scaling/search/__init__.py +0 -0
  200. aiq/experimental/inference_time_scaling/search/multi_llm_planner.py +0 -128
  201. aiq/experimental/inference_time_scaling/search/multi_query_retrieval_search.py +0 -122
  202. aiq/experimental/inference_time_scaling/search/single_shot_multi_plan_planner.py +0 -128
  203. aiq/experimental/inference_time_scaling/selection/__init__.py +0 -0
  204. aiq/experimental/inference_time_scaling/selection/best_of_n_selector.py +0 -63
  205. aiq/experimental/inference_time_scaling/selection/llm_based_agent_output_selector.py +0 -131
  206. aiq/experimental/inference_time_scaling/selection/llm_based_output_merging_selector.py +0 -159
  207. aiq/experimental/inference_time_scaling/selection/llm_based_plan_selector.py +0 -128
  208. aiq/experimental/inference_time_scaling/selection/threshold_selector.py +0 -58
  209. aiq/front_ends/__init__.py +0 -14
  210. aiq/front_ends/console/__init__.py +0 -14
  211. aiq/front_ends/console/authentication_flow_handler.py +0 -233
  212. aiq/front_ends/console/console_front_end_config.py +0 -32
  213. aiq/front_ends/console/console_front_end_plugin.py +0 -96
  214. aiq/front_ends/console/register.py +0 -25
  215. aiq/front_ends/cron/__init__.py +0 -14
  216. aiq/front_ends/fastapi/__init__.py +0 -14
  217. aiq/front_ends/fastapi/auth_flow_handlers/__init__.py +0 -0
  218. aiq/front_ends/fastapi/auth_flow_handlers/http_flow_handler.py +0 -27
  219. aiq/front_ends/fastapi/auth_flow_handlers/websocket_flow_handler.py +0 -107
  220. aiq/front_ends/fastapi/fastapi_front_end_config.py +0 -234
  221. aiq/front_ends/fastapi/fastapi_front_end_controller.py +0 -68
  222. aiq/front_ends/fastapi/fastapi_front_end_plugin.py +0 -116
  223. aiq/front_ends/fastapi/fastapi_front_end_plugin_worker.py +0 -1092
  224. aiq/front_ends/fastapi/html_snippets/__init__.py +0 -14
  225. aiq/front_ends/fastapi/html_snippets/auth_code_grant_success.py +0 -35
  226. aiq/front_ends/fastapi/intermediate_steps_subscriber.py +0 -80
  227. aiq/front_ends/fastapi/job_store.py +0 -183
  228. aiq/front_ends/fastapi/main.py +0 -72
  229. aiq/front_ends/fastapi/message_handler.py +0 -298
  230. aiq/front_ends/fastapi/message_validator.py +0 -345
  231. aiq/front_ends/fastapi/register.py +0 -25
  232. aiq/front_ends/fastapi/response_helpers.py +0 -195
  233. aiq/front_ends/fastapi/step_adaptor.py +0 -321
  234. aiq/front_ends/mcp/__init__.py +0 -14
  235. aiq/front_ends/mcp/mcp_front_end_config.py +0 -32
  236. aiq/front_ends/mcp/mcp_front_end_plugin.py +0 -93
  237. aiq/front_ends/mcp/register.py +0 -27
  238. aiq/front_ends/mcp/tool_converter.py +0 -242
  239. aiq/front_ends/register.py +0 -22
  240. aiq/front_ends/simple_base/__init__.py +0 -14
  241. aiq/front_ends/simple_base/simple_front_end_plugin_base.py +0 -54
  242. aiq/llm/__init__.py +0 -0
  243. aiq/llm/aws_bedrock_llm.py +0 -57
  244. aiq/llm/nim_llm.py +0 -46
  245. aiq/llm/openai_llm.py +0 -46
  246. aiq/llm/register.py +0 -23
  247. aiq/llm/utils/__init__.py +0 -14
  248. aiq/llm/utils/env_config_value.py +0 -94
  249. aiq/llm/utils/error.py +0 -17
  250. aiq/memory/__init__.py +0 -20
  251. aiq/memory/interfaces.py +0 -183
  252. aiq/memory/models.py +0 -112
  253. aiq/meta/module_to_distro.json +0 -3
  254. aiq/meta/pypi.md +0 -58
  255. aiq/object_store/__init__.py +0 -20
  256. aiq/object_store/in_memory_object_store.py +0 -76
  257. aiq/object_store/interfaces.py +0 -84
  258. aiq/object_store/models.py +0 -36
  259. aiq/object_store/register.py +0 -20
  260. aiq/observability/__init__.py +0 -14
  261. aiq/observability/exporter/__init__.py +0 -14
  262. aiq/observability/exporter/base_exporter.py +0 -449
  263. aiq/observability/exporter/exporter.py +0 -78
  264. aiq/observability/exporter/file_exporter.py +0 -33
  265. aiq/observability/exporter/processing_exporter.py +0 -322
  266. aiq/observability/exporter/raw_exporter.py +0 -52
  267. aiq/observability/exporter/span_exporter.py +0 -265
  268. aiq/observability/exporter_manager.py +0 -335
  269. aiq/observability/mixin/__init__.py +0 -14
  270. aiq/observability/mixin/batch_config_mixin.py +0 -26
  271. aiq/observability/mixin/collector_config_mixin.py +0 -23
  272. aiq/observability/mixin/file_mixin.py +0 -288
  273. aiq/observability/mixin/file_mode.py +0 -23
  274. aiq/observability/mixin/resource_conflict_mixin.py +0 -134
  275. aiq/observability/mixin/serialize_mixin.py +0 -61
  276. aiq/observability/mixin/type_introspection_mixin.py +0 -183
  277. aiq/observability/processor/__init__.py +0 -14
  278. aiq/observability/processor/batching_processor.py +0 -309
  279. aiq/observability/processor/callback_processor.py +0 -42
  280. aiq/observability/processor/intermediate_step_serializer.py +0 -28
  281. aiq/observability/processor/processor.py +0 -71
  282. aiq/observability/register.py +0 -96
  283. aiq/observability/utils/__init__.py +0 -14
  284. aiq/observability/utils/dict_utils.py +0 -236
  285. aiq/observability/utils/time_utils.py +0 -31
  286. aiq/plugins/.namespace +0 -1
  287. aiq/profiler/__init__.py +0 -0
  288. aiq/profiler/calc/__init__.py +0 -14
  289. aiq/profiler/calc/calc_runner.py +0 -627
  290. aiq/profiler/calc/calculations.py +0 -288
  291. aiq/profiler/calc/data_models.py +0 -188
  292. aiq/profiler/calc/plot.py +0 -345
  293. aiq/profiler/callbacks/__init__.py +0 -0
  294. aiq/profiler/callbacks/agno_callback_handler.py +0 -295
  295. aiq/profiler/callbacks/base_callback_class.py +0 -20
  296. aiq/profiler/callbacks/langchain_callback_handler.py +0 -290
  297. aiq/profiler/callbacks/llama_index_callback_handler.py +0 -205
  298. aiq/profiler/callbacks/semantic_kernel_callback_handler.py +0 -238
  299. aiq/profiler/callbacks/token_usage_base_model.py +0 -27
  300. aiq/profiler/data_frame_row.py +0 -51
  301. aiq/profiler/data_models.py +0 -24
  302. aiq/profiler/decorators/__init__.py +0 -0
  303. aiq/profiler/decorators/framework_wrapper.py +0 -131
  304. aiq/profiler/decorators/function_tracking.py +0 -254
  305. aiq/profiler/forecasting/__init__.py +0 -0
  306. aiq/profiler/forecasting/config.py +0 -18
  307. aiq/profiler/forecasting/model_trainer.py +0 -75
  308. aiq/profiler/forecasting/models/__init__.py +0 -22
  309. aiq/profiler/forecasting/models/forecasting_base_model.py +0 -40
  310. aiq/profiler/forecasting/models/linear_model.py +0 -196
  311. aiq/profiler/forecasting/models/random_forest_regressor.py +0 -268
  312. aiq/profiler/inference_metrics_model.py +0 -28
  313. aiq/profiler/inference_optimization/__init__.py +0 -0
  314. aiq/profiler/inference_optimization/bottleneck_analysis/__init__.py +0 -0
  315. aiq/profiler/inference_optimization/bottleneck_analysis/nested_stack_analysis.py +0 -460
  316. aiq/profiler/inference_optimization/bottleneck_analysis/simple_stack_analysis.py +0 -258
  317. aiq/profiler/inference_optimization/data_models.py +0 -386
  318. aiq/profiler/inference_optimization/experimental/__init__.py +0 -0
  319. aiq/profiler/inference_optimization/experimental/concurrency_spike_analysis.py +0 -468
  320. aiq/profiler/inference_optimization/experimental/prefix_span_analysis.py +0 -405
  321. aiq/profiler/inference_optimization/llm_metrics.py +0 -212
  322. aiq/profiler/inference_optimization/prompt_caching.py +0 -163
  323. aiq/profiler/inference_optimization/token_uniqueness.py +0 -107
  324. aiq/profiler/inference_optimization/workflow_runtimes.py +0 -72
  325. aiq/profiler/intermediate_property_adapter.py +0 -102
  326. aiq/profiler/profile_runner.py +0 -473
  327. aiq/profiler/utils.py +0 -184
  328. aiq/registry_handlers/__init__.py +0 -0
  329. aiq/registry_handlers/local/__init__.py +0 -0
  330. aiq/registry_handlers/local/local_handler.py +0 -176
  331. aiq/registry_handlers/local/register_local.py +0 -37
  332. aiq/registry_handlers/metadata_factory.py +0 -60
  333. aiq/registry_handlers/package_utils.py +0 -567
  334. aiq/registry_handlers/pypi/__init__.py +0 -0
  335. aiq/registry_handlers/pypi/pypi_handler.py +0 -251
  336. aiq/registry_handlers/pypi/register_pypi.py +0 -40
  337. aiq/registry_handlers/register.py +0 -21
  338. aiq/registry_handlers/registry_handler_base.py +0 -157
  339. aiq/registry_handlers/rest/__init__.py +0 -0
  340. aiq/registry_handlers/rest/register_rest.py +0 -56
  341. aiq/registry_handlers/rest/rest_handler.py +0 -237
  342. aiq/registry_handlers/schemas/__init__.py +0 -0
  343. aiq/registry_handlers/schemas/headers.py +0 -42
  344. aiq/registry_handlers/schemas/package.py +0 -68
  345. aiq/registry_handlers/schemas/publish.py +0 -63
  346. aiq/registry_handlers/schemas/pull.py +0 -82
  347. aiq/registry_handlers/schemas/remove.py +0 -36
  348. aiq/registry_handlers/schemas/search.py +0 -91
  349. aiq/registry_handlers/schemas/status.py +0 -47
  350. aiq/retriever/__init__.py +0 -0
  351. aiq/retriever/interface.py +0 -37
  352. aiq/retriever/milvus/__init__.py +0 -14
  353. aiq/retriever/milvus/register.py +0 -81
  354. aiq/retriever/milvus/retriever.py +0 -228
  355. aiq/retriever/models.py +0 -74
  356. aiq/retriever/nemo_retriever/__init__.py +0 -14
  357. aiq/retriever/nemo_retriever/register.py +0 -60
  358. aiq/retriever/nemo_retriever/retriever.py +0 -190
  359. aiq/retriever/register.py +0 -22
  360. aiq/runtime/__init__.py +0 -14
  361. aiq/runtime/loader.py +0 -215
  362. aiq/runtime/runner.py +0 -190
  363. aiq/runtime/session.py +0 -158
  364. aiq/runtime/user_metadata.py +0 -130
  365. aiq/settings/__init__.py +0 -0
  366. aiq/settings/global_settings.py +0 -318
  367. aiq/test/.namespace +0 -1
  368. aiq/tool/__init__.py +0 -0
  369. aiq/tool/chat_completion.py +0 -74
  370. aiq/tool/code_execution/README.md +0 -151
  371. aiq/tool/code_execution/__init__.py +0 -0
  372. aiq/tool/code_execution/code_sandbox.py +0 -267
  373. aiq/tool/code_execution/local_sandbox/.gitignore +0 -1
  374. aiq/tool/code_execution/local_sandbox/Dockerfile.sandbox +0 -60
  375. aiq/tool/code_execution/local_sandbox/__init__.py +0 -13
  376. aiq/tool/code_execution/local_sandbox/local_sandbox_server.py +0 -198
  377. aiq/tool/code_execution/local_sandbox/sandbox.requirements.txt +0 -6
  378. aiq/tool/code_execution/local_sandbox/start_local_sandbox.sh +0 -50
  379. aiq/tool/code_execution/register.py +0 -74
  380. aiq/tool/code_execution/test_code_execution_sandbox.py +0 -414
  381. aiq/tool/code_execution/utils.py +0 -100
  382. aiq/tool/datetime_tools.py +0 -42
  383. aiq/tool/document_search.py +0 -141
  384. aiq/tool/github_tools/__init__.py +0 -0
  385. aiq/tool/github_tools/create_github_commit.py +0 -133
  386. aiq/tool/github_tools/create_github_issue.py +0 -87
  387. aiq/tool/github_tools/create_github_pr.py +0 -106
  388. aiq/tool/github_tools/get_github_file.py +0 -106
  389. aiq/tool/github_tools/get_github_issue.py +0 -166
  390. aiq/tool/github_tools/get_github_pr.py +0 -256
  391. aiq/tool/github_tools/update_github_issue.py +0 -100
  392. aiq/tool/mcp/__init__.py +0 -14
  393. aiq/tool/mcp/exceptions.py +0 -142
  394. aiq/tool/mcp/mcp_client.py +0 -255
  395. aiq/tool/mcp/mcp_tool.py +0 -96
  396. aiq/tool/memory_tools/__init__.py +0 -0
  397. aiq/tool/memory_tools/add_memory_tool.py +0 -79
  398. aiq/tool/memory_tools/delete_memory_tool.py +0 -67
  399. aiq/tool/memory_tools/get_memory_tool.py +0 -72
  400. aiq/tool/nvidia_rag.py +0 -95
  401. aiq/tool/register.py +0 -38
  402. aiq/tool/retriever.py +0 -89
  403. aiq/tool/server_tools.py +0 -66
  404. aiq/utils/__init__.py +0 -0
  405. aiq/utils/data_models/__init__.py +0 -0
  406. aiq/utils/data_models/schema_validator.py +0 -58
  407. aiq/utils/debugging_utils.py +0 -43
  408. aiq/utils/dump_distro_mapping.py +0 -32
  409. aiq/utils/exception_handlers/__init__.py +0 -0
  410. aiq/utils/exception_handlers/automatic_retries.py +0 -289
  411. aiq/utils/exception_handlers/mcp.py +0 -211
  412. aiq/utils/exception_handlers/schemas.py +0 -114
  413. aiq/utils/io/__init__.py +0 -0
  414. aiq/utils/io/model_processing.py +0 -28
  415. aiq/utils/io/yaml_tools.py +0 -119
  416. aiq/utils/log_utils.py +0 -37
  417. aiq/utils/metadata_utils.py +0 -74
  418. aiq/utils/optional_imports.py +0 -142
  419. aiq/utils/producer_consumer_queue.py +0 -178
  420. aiq/utils/reactive/__init__.py +0 -0
  421. aiq/utils/reactive/base/__init__.py +0 -0
  422. aiq/utils/reactive/base/observable_base.py +0 -65
  423. aiq/utils/reactive/base/observer_base.py +0 -55
  424. aiq/utils/reactive/base/subject_base.py +0 -79
  425. aiq/utils/reactive/observable.py +0 -59
  426. aiq/utils/reactive/observer.py +0 -76
  427. aiq/utils/reactive/subject.py +0 -131
  428. aiq/utils/reactive/subscription.py +0 -49
  429. aiq/utils/settings/__init__.py +0 -0
  430. aiq/utils/settings/global_settings.py +0 -197
  431. aiq/utils/string_utils.py +0 -38
  432. aiq/utils/type_converter.py +0 -290
  433. aiq/utils/type_utils.py +0 -484
  434. aiq/utils/url_utils.py +0 -27
  435. aiqtoolkit-1.2.0rc4.dist-info/METADATA +0 -363
  436. aiqtoolkit-1.2.0rc4.dist-info/RECORD +0 -438
  437. aiqtoolkit-1.2.0rc4.dist-info/entry_points.txt +0 -20
  438. aiqtoolkit-1.2.0rc4.dist-info/licenses/LICENSE-3rd-party.txt +0 -3686
  439. aiqtoolkit-1.2.0rc4.dist-info/licenses/LICENSE.md +0 -201
  440. aiqtoolkit-1.2.0rc4.dist-info/top_level.txt +0 -1
  441. {aiqtoolkit-1.2.0rc4.dist-info → aiqtoolkit-1.2.0rc5.dist-info}/WHEEL +0 -0
@@ -1,107 +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
-
16
- import logging
17
-
18
- from aiq.builder.builder import Builder
19
- from aiq.builder.framework_enum import LLMFrameworkEnum
20
- from aiq.cli.register_workflow import register_its_strategy
21
- from aiq.experimental.inference_time_scaling.models.editor_config import MotivationAwareSummarizationConfig
22
- from aiq.experimental.inference_time_scaling.models.its_item import ITSItem
23
- from aiq.experimental.inference_time_scaling.models.stage_enums import PipelineTypeEnum
24
- from aiq.experimental.inference_time_scaling.models.stage_enums import StageTypeEnum
25
- from aiq.experimental.inference_time_scaling.models.strategy_base import StrategyBase
26
- from aiq.utils.io.model_processing import remove_r1_think_tags
27
-
28
- logger = logging.getLogger(__name__)
29
-
30
-
31
- class MotivationAwareSummarization(StrategyBase):
32
- """
33
- A strategy that, for each incoming ITSItem, summarizes the output based on input
34
- and motivation.
35
- """
36
-
37
- def __init__(self, config: MotivationAwareSummarizationConfig) -> None:
38
- super().__init__(config)
39
- self.config = config
40
- self.llm_bound = None
41
-
42
- async def build_components(self, builder: Builder) -> None:
43
- """
44
- Binds each LLMRef in self.config.llms to an actual LLM client.
45
- """
46
- bound_llm = await builder.get_llm(self.config.editor_llm, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
47
- self.llm_bound = bound_llm
48
-
49
- def supported_pipeline_types(self) -> list[PipelineTypeEnum]:
50
- return [PipelineTypeEnum.TOOL_USE]
51
-
52
- def stage_type(self) -> StageTypeEnum:
53
- return StageTypeEnum.EDITING
54
-
55
- async def ainvoke(self,
56
- items: list[ITSItem],
57
- original_prompt: str | None = None,
58
- agent_context: str | None = None,
59
- **kwargs) -> list[ITSItem]:
60
- """
61
- For each ITSItem, rewrite the 'input' using each LLM to create a new perspective.
62
- The new ITSItems' 'output' field will store the newly generated query.
63
- """
64
- try:
65
- from langchain_core.prompts import PromptTemplate
66
- except ImportError:
67
- raise ImportError("langchain-core is required for MultiQueryRetrievalSearch. "
68
- "Install aiqtoolkit-langchain or similar.")
69
-
70
- new_its_items: list[ITSItem] = []
71
-
72
- # Create a single PromptTemplate object for rewriting the query
73
- template_vars = ["task", "motivation", "output"]
74
- query_template = PromptTemplate(template=self.config.editor_template,
75
- input_variables=template_vars,
76
- validate_template=True)
77
-
78
- for item in items:
79
- original_task = str(item.input) or ""
80
- motivation = str(item.metadata) if item.metadata else ""
81
- output = str(item.output) if item.output else ""
82
-
83
- prompt = await (query_template.ainvoke(input={
84
- "task": original_task, "motivation": motivation, "output": output
85
- }))
86
-
87
- llm_response = await self.llm_bound.ainvoke(prompt.to_string())
88
- llm_response = remove_r1_think_tags(llm_response.content)
89
-
90
- logger.info("LLM response from summarization: %s", llm_response)
91
-
92
- new_its_items.append(
93
- ITSItem(
94
- input=item.input,
95
- output=remove_r1_think_tags(llm_response),
96
- metadata=item.metadata,
97
- name=item.name, # keep the original tool name
98
- ))
99
-
100
- return new_its_items
101
-
102
-
103
- @register_its_strategy(config_type=MotivationAwareSummarizationConfig)
104
- async def register_multi_query_retrieval_search(config: MotivationAwareSummarizationConfig, builder: Builder):
105
- strategy = MotivationAwareSummarization(config)
106
- await strategy.build_components(builder)
107
- yield strategy
@@ -1,105 +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
-
16
- import logging
17
-
18
- from pydantic import Field
19
-
20
- from aiq.builder.builder import Builder
21
- from aiq.builder.function import Function
22
- from aiq.builder.function_info import FunctionInfo
23
- from aiq.cli.register_workflow import register_function
24
- from aiq.data_models.component_ref import FunctionRef
25
- from aiq.data_models.component_ref import ITSStrategyRef
26
- from aiq.data_models.function import FunctionBaseConfig
27
- from aiq.experimental.inference_time_scaling.models.its_item import ITSItem
28
- from aiq.experimental.inference_time_scaling.models.stage_enums import PipelineTypeEnum
29
- from aiq.experimental.inference_time_scaling.models.stage_enums import StageTypeEnum
30
-
31
- logger = logging.getLogger(__name__)
32
-
33
-
34
- class ExecuteScoreSelectFunctionConfig(FunctionBaseConfig, name="execute_score_select_function"):
35
- scorer: ITSStrategyRef | None = Field(description="Strategy to score the output of the function", default=None)
36
- selector: ITSStrategyRef = Field(description="Strategy to select the best output of the function")
37
- augmented_fn: FunctionRef = Field(description="Function that will be executed")
38
-
39
- num_executions: int = Field(3, description="Number of times to execute the function")
40
-
41
-
42
- @register_function(config_type=ExecuteScoreSelectFunctionConfig)
43
- async def execute_score_select_function(config: ExecuteScoreSelectFunctionConfig, builder: Builder):
44
- import asyncio
45
- import warnings
46
-
47
- from pydantic import BaseModel
48
-
49
- executable_fn: Function = builder.get_function(name=config.augmented_fn)
50
-
51
- if config.scorer:
52
- scorer = await builder.get_its_strategy(strategy_name=config.scorer,
53
- pipeline_type=PipelineTypeEnum.AGENT_EXECUTION,
54
- stage_type=StageTypeEnum.SCORING)
55
- else:
56
- scorer = None
57
-
58
- selector = await builder.get_its_strategy(strategy_name=config.selector,
59
- pipeline_type=PipelineTypeEnum.AGENT_EXECUTION,
60
- stage_type=StageTypeEnum.SELECTION)
61
-
62
- if executable_fn.has_streaming_output:
63
- warnings.warn("Streaming output is not supported for this function. "
64
- "The function will be executed in non-streaming mode.")
65
-
66
- def convert_to_str(arg):
67
- if isinstance(arg, BaseModel):
68
- return str(arg.model_dump())
69
- return str(arg)
70
-
71
- async def execute_fn(input_msg: executable_fn.input_type) -> executable_fn.single_output_type:
72
-
73
- logger.info("Executing function %d times", config.num_executions)
74
- tasks = [executable_fn.ainvoke(input_msg) for _ in range(config.num_executions)]
75
- results = await asyncio.gather(*tasks)
76
-
77
- input_str = convert_to_str(input_msg)
78
- function_outputs = [convert_to_str(out) for out in results]
79
- its_items = [ITSItem(
80
- input=input_str,
81
- output=out,
82
- ) for out in function_outputs]
83
-
84
- if scorer:
85
- logger.info("Beginning scoring")
86
- its_items = await scorer.ainvoke(items=its_items)
87
-
88
- logger.info("Beginning selection")
89
- selected_item = (await selector.ainvoke(items=its_items, original_prompt=its_items[0].input))[0]
90
-
91
- # Find the index of selected item in its_items by matching the output
92
- selected_output = selected_item.output
93
- selected_index = -1
94
- for i, item in enumerate(its_items):
95
- if item.output == selected_output:
96
- selected_index = i
97
- break
98
-
99
- return results[selected_index] if selected_index != -1 else selected_output
100
-
101
- yield FunctionInfo.from_fn(
102
- fn=execute_fn,
103
- description=("This function executes a given function multiple times, scores the outputs, "
104
- "and selects the best output based on the specified scoring and selection strategies."),
105
- )
@@ -1,205 +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
-
16
- import asyncio
17
- import logging
18
-
19
- from pydantic import Field
20
-
21
- from aiq.builder.builder import Builder
22
- from aiq.builder.framework_enum import LLMFrameworkEnum
23
- from aiq.builder.function_info import FunctionInfo
24
- from aiq.cli.register_workflow import register_function
25
- from aiq.data_models.component_ref import FunctionRef
26
- from aiq.data_models.component_ref import ITSStrategyRef
27
- from aiq.data_models.function import FunctionBaseConfig
28
- from aiq.experimental.inference_time_scaling.models.its_item import ITSItem
29
- from aiq.experimental.inference_time_scaling.models.stage_enums import PipelineTypeEnum
30
- from aiq.experimental.inference_time_scaling.models.stage_enums import StageTypeEnum
31
- from aiq.experimental.inference_time_scaling.models.tool_use_config import ToolUseInputSchema
32
- from aiq.experimental.inference_time_scaling.models.tool_use_config import ToolUselist
33
-
34
- logger = logging.getLogger(__name__)
35
-
36
-
37
- class ITSToolOrchestrationFunctionConfig(FunctionBaseConfig, name="its_tool_orchestration"):
38
- """
39
- Configuration for the ITSToolOrchestrationFunction, which is used to orchestrate multiple functions.
40
- """
41
-
42
- augmented_fns: list[FunctionRef] = Field(
43
- description="list of FunctionRefs for the functions to be orchestrated. Must be wrapped in `its_tool_wrapper`.")
44
-
45
- search_strategy: ITSStrategyRef | None = Field(
46
- description="The ITS search strategy to use for orchestrating invocation of the functions."
47
- " If None, no search will be performed.",
48
- default=None,
49
- )
50
-
51
- editing_strategy: ITSStrategyRef | None = Field(
52
- default=None,
53
- description="The ITS editing strategy to use for orchestrating invocation of the functions. "
54
- "If None, no editing will be performed.",
55
- )
56
-
57
- scoring_strategy: ITSStrategyRef | None = Field(
58
- default=None,
59
- description="The ITS scoring strategy to use for orchestrating invocation of the functions. "
60
- "If None, no scoring will be performed.",
61
- )
62
-
63
- selection_strategy: ITSStrategyRef = Field(
64
- description="The ITS selection strategy to use for orchestrating invocation of the functions.")
65
-
66
-
67
- @register_function(config_type=ITSToolOrchestrationFunctionConfig, framework_wrappers=[LLMFrameworkEnum.LANGCHAIN])
68
- async def register_its_tool_orchestration_function(
69
- config: ITSToolOrchestrationFunctionConfig,
70
- builder: Builder,
71
- ):
72
- """
73
- Registers an ITS-based orchestration function that:
74
- 1. Instantiates all relevant strategies (search, editing, scoring, selection).
75
- 2. Accepts a ToolUselist, converts each item to an ITSItem, optionally runs search/editing.
76
- 3. Calls the correct augmented_fn per item using name=tool name.
77
- 4. If configured, runs scoring and selection on the result.
78
- 5. Returns a new ToolUselist with each output set.
79
- """
80
-
81
- # 1) Gather references to all augmented (wrapped) functions
82
- function_map = {}
83
- for fn_ref in config.augmented_fns:
84
- # Retrieve the actual function from the builder
85
- fn_obj = builder.get_function(fn_ref)
86
- function_map[fn_ref] = fn_obj
87
-
88
- # 2) Instantiate search, editing, scoring, selection strategies (if any)
89
- search = None
90
- if config.search_strategy is not None:
91
- search = await builder.get_its_strategy(
92
- strategy_name=config.search_strategy,
93
- pipeline_type=PipelineTypeEnum.TOOL_USE,
94
- stage_type=StageTypeEnum.SEARCH,
95
- )
96
-
97
- editing = None
98
- if config.editing_strategy is not None:
99
- editing = await builder.get_its_strategy(
100
- strategy_name=config.editing_strategy,
101
- pipeline_type=PipelineTypeEnum.TOOL_USE,
102
- stage_type=StageTypeEnum.EDITING,
103
- )
104
-
105
- scoring = None
106
- if config.scoring_strategy is not None:
107
- scoring = await builder.get_its_strategy(
108
- strategy_name=config.scoring_strategy,
109
- pipeline_type=PipelineTypeEnum.TOOL_USE,
110
- stage_type=StageTypeEnum.SCORING,
111
- )
112
-
113
- selection = await builder.get_its_strategy(
114
- strategy_name=config.selection_strategy,
115
- pipeline_type=PipelineTypeEnum.TOOL_USE,
116
- stage_type=StageTypeEnum.SELECTION,
117
- )
118
-
119
- fn_description = ("\n".join(f"- **{fn_ref}**: {function_map[fn_ref].description or 'No description provided.'}"
120
- for fn_ref in config.augmented_fns))
121
-
122
- # 3) Create the inner function to handle single (non-streaming) calls.
123
- async def single_inner(tool_list: ToolUselist) -> ToolUselist:
124
- """
125
- Orchestrates multiple tool usages, optionally using search/editing/scoring/selection steps.
126
- """
127
- # Convert each ToolUseInputSchema to ITSItem
128
- its_items = []
129
- for t in tool_list.tools:
130
- item = ITSItem(
131
- input=t.task_description, # The user "task"
132
- output=None,
133
- name=t.tool_name, # The "tool name"
134
- metadata=t.motivation, # The "justification"
135
- )
136
- its_items.append(item)
137
-
138
- # Run search strategy if present
139
- if search is not None:
140
- its_items = await search.ainvoke(its_items)
141
-
142
- logger.info("ITS orchestration function: %d items after search", len(its_items))
143
-
144
- # Invoke the correct augmented function for each item concurrently
145
- # Helper coroutine to invoke a tool function and capture result or error
146
- async def _invoke_tool(item: ITSItem, fn):
147
- try:
148
- result = await fn.acall_invoke(item.output)
149
- return item, result, None
150
- except Exception as e:
151
- logger.error(f"Error invoking function '{item.name}': {e}")
152
- return item, None, str(e)
153
-
154
- tasks = []
155
- for item in its_items:
156
- if item.name not in function_map:
157
- logger.error(f"Function '{item.name}' not found in function map.")
158
- item.output = f"Error: Function '{item.name}' not found in function map. Check your input"
159
- else:
160
- fn = function_map[item.name]
161
- tasks.append(_invoke_tool(item, fn))
162
-
163
- # Await all tasks and assign outputs
164
- if tasks:
165
- results = await asyncio.gather(*tasks)
166
- for item, result, error in results:
167
- if error:
168
- item.output = f"Error invoking function '{item.name}': {error}"
169
- else:
170
- item.output = result
171
-
172
- if editing:
173
- its_items = await editing.ainvoke(its_items)
174
-
175
- # Run scoring strategy if present
176
- if scoring is not None:
177
- its_items = await scoring.ainvoke(its_items)
178
-
179
- # Run selection strategy
180
- if selection is not None:
181
- its_items = await selection.ainvoke(its_items)
182
-
183
- logger.info("ITS orchestration function: %d items after selection", len(its_items))
184
-
185
- # Convert final results from ITSItems back to a ToolUselist
186
- final_list = ToolUselist(tools=[])
187
- for item in its_items:
188
- # Compose a new ToolUseInputSchema with final output
189
- new_tool = ToolUseInputSchema(
190
- tool_name=item.name,
191
- task_description=str(item.input),
192
- motivation=item.metadata if item.metadata else None,
193
- output=str(item.output) if item.output is not None else None,
194
- )
195
- final_list.tools.append(new_tool)
196
-
197
- return final_list
198
-
199
- # 4) Return the function info (only a single_fn is needed; no streaming)
200
- yield FunctionInfo.create(
201
- single_fn=single_inner,
202
- stream_fn=None, # No streaming required
203
- input_schema=ToolUselist,
204
- single_output_schema=ToolUselist,
205
- description=fn_description)
@@ -1,146 +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
-
16
- import logging
17
-
18
- from pydantic import BaseModel
19
- from pydantic import Field
20
-
21
- from aiq.builder.builder import Builder
22
- from aiq.builder.framework_enum import LLMFrameworkEnum
23
- from aiq.builder.function import Function
24
- from aiq.builder.function_info import FunctionInfo
25
- from aiq.cli.register_workflow import register_function
26
- from aiq.data_models.component_ref import FunctionRef
27
- from aiq.data_models.component_ref import LLMRef
28
- from aiq.data_models.function import FunctionBaseConfig
29
- from aiq.utils.string_utils import convert_to_str
30
-
31
- logger = logging.getLogger(__name__)
32
-
33
-
34
- class ITSToolWrapperFunctionConfig(FunctionBaseConfig, name="its_tool_wrapper"):
35
- """
36
- Configuration for the ITSToolWrapperFunction, which is used to wrap a function that will be executed
37
- in the inference time scaling pipeline.
38
-
39
- This function is responsible for turning an 'objective' or description for the tool into tool input.
40
-
41
- NOTE: Only supports LLMs with structured output.
42
- """
43
-
44
- augmented_fn: FunctionRef = Field(description="The name of the function to reason on.")
45
-
46
- input_llm: LLMRef = Field(description="The LLM that will generate input to the function.")
47
- verbose: bool = Field(default=False, description="Whether to log detailed information.")
48
-
49
- downstream_template: str = Field(
50
- description="The template for the input LLM to generate structured input to the function.",
51
- default=("You are highly sophisticated generalist AI assistant. Your objective is to act as a"
52
- " conduit between a user's task for a function and the function itself. You will be given a general "
53
- "description of the task, or pseudo input for a function. You will also be provided with description "
54
- "of the function, its input schema, and the output schema. Your task is to generate structured input "
55
- "to the function based on the description of the task and the function's input schema. If you do not "
56
- "have enough information to generate structured input, you should respond with 'NOT ENOUGH "
57
- "INFORMATION'. \n\n The description of the function is: {function_description}\n\n"
58
- "The input schema of the function is: {input_schema}\n\n"
59
- "The output schema of the function is: {output_schema}\n\n"
60
- "The description of the task is: {task_description}\n\n"
61
- "The structured input to the function is: "))
62
-
63
- tool_description: str | None = Field(description="The description of the tool to be used for the function.",
64
- default=None)
65
-
66
-
67
- @register_function(config_type=ITSToolWrapperFunctionConfig, framework_wrappers=[LLMFrameworkEnum.LANGCHAIN])
68
- async def register_its_tool_wrapper_function(
69
- config: ITSToolWrapperFunctionConfig,
70
- builder: Builder,
71
- ):
72
- """
73
- Register the ITSToolWrapperFunction with the provided builder and configuration.
74
- """
75
-
76
- try:
77
- from langchain_core.language_models import BaseChatModel
78
- from langchain_core.prompts import PromptTemplate
79
- except ImportError:
80
- raise ImportError("langchain-core is not installed. Please install it to use SingleShotMultiPlanPlanner.\n"
81
- "This error can be resolved by installing aiqtoolkit-langchain.")
82
-
83
- augmented_function: Function = builder.get_function(config.augmented_fn)
84
- input_llm: BaseChatModel = await builder.get_llm(config.input_llm, wrapper_type=LLMFrameworkEnum.LANGCHAIN)
85
-
86
- if not augmented_function.has_single_output:
87
- raise ValueError("ITSToolWrapperFunction only supports functions with a single output.")
88
-
89
- if not augmented_function.has_single_output:
90
- raise ValueError("ITSToolWrapperFunction only supports functions with a single output.")
91
-
92
- if augmented_function.description and augmented_function.description != "":
93
- augmented_function_desc = augmented_function.description
94
- else:
95
- if not config.tool_description:
96
- raise ValueError(f"Function {config.augmented_fn} does not have a description. Cannot augment "
97
- f"function without a description and without a tool description.")
98
-
99
- augmented_function_desc = config.tool_description
100
-
101
- fn_input_schema: BaseModel = augmented_function.input_schema
102
- fn_output_schema: BaseModel = augmented_function.single_output_schema
103
-
104
- runnable_llm = input_llm.with_structured_output(schema=fn_input_schema)
105
-
106
- template = PromptTemplate(
107
- template=config.downstream_template,
108
- input_variables=["function_description", "input_schema", "output_schema", "task_description"],
109
- validate_template=True)
110
-
111
- function_description = (f"\nDescription: {augmented_function_desc}\n" +
112
- "\n Input should be a thorough description with all relevant information on what "
113
- f"the tool should do. The tool requires information about "
114
- f"{fn_input_schema.model_fields}")
115
-
116
- async def single_inner(input_message: str) -> fn_output_schema:
117
- """
118
- Inner function to handle the streaming output of the ITSToolWrapperFunction.
119
- It generates structured input for the augmented function based on the input message.
120
- """
121
-
122
- prompt = await template.ainvoke(
123
- input={
124
- "function_description": augmented_function_desc,
125
- "input_schema": fn_input_schema,
126
- "output_schema": fn_output_schema,
127
- "task_description": input_message
128
- })
129
-
130
- prompt = prompt.to_string()
131
-
132
- if config.verbose:
133
- logger.info("ITSToolWrapperFunction: Generated prompt: %s", prompt)
134
-
135
- llm_parsed = await runnable_llm.ainvoke(prompt)
136
-
137
- if not llm_parsed:
138
- logger.warning("ITSToolWrapperFunction: LLM parsing error")
139
- return "Not enough information"
140
-
141
- # Call the augmented function with the structured input
142
- result = await augmented_function.acall_invoke(llm_parsed)
143
-
144
- return result
145
-
146
- yield FunctionInfo.from_fn(fn=single_inner, description=function_description, converters=[convert_to_str])