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,258 +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
- Advanced bottleneck analysis for a dataframe that contains:
17
- - event_type in {LLM_START, LLM_END, TOOL_START, TOOL_END, ...}
18
- - llm_name
19
- - tool_name
20
- - UUID
21
- - event_timestamp (float or datetime)
22
- - other metadata...
23
-
24
- We pair start/end events by UUID, compute operation durations,
25
- then analyze concurrency and produce a summary report.
26
- """
27
-
28
- import numpy as np
29
- import pandas as pd
30
-
31
- from aiq.data_models.intermediate_step import IntermediateStep
32
- from aiq.profiler.inference_optimization.data_models import SimpleBottleneckReport
33
- from aiq.profiler.inference_optimization.data_models import SimpleOperationStats
34
- from aiq.profiler.utils import create_standardized_dataframe
35
-
36
-
37
- # ----------------------------------------------------------------------
38
- # Main Function
39
- # ----------------------------------------------------------------------
40
- def profile_workflow_bottlenecks(all_steps: list[list[IntermediateStep]]) -> SimpleBottleneckReport:
41
- """
42
- Perform advanced bottleneck profiling on a workflow dataframe.
43
-
44
- 1) Pair LLM_START/LLM_END and TOOL_START/TOOL_END by UUID.
45
- 2) Compute operation durations.
46
- 3) Analyze concurrency (max concurrent usage).
47
- 4) Summarize as SimpleOperationStats and produce a final SimpleBottleneckReport.
48
-
49
- Parameters
50
- ----------
51
- all_steps : Intermediate Steps
52
-
53
- Returns
54
- -------
55
- SimpleBottleneckReport
56
- Contains detailed stats per operation and a textual summary of top bottlenecks.
57
- """
58
- df = create_standardized_dataframe(all_steps)
59
- # -------------------------------------------------------------
60
- # 1) Separate events by operation type and match start/end
61
- # -------------------------------------------------------------
62
- required_cols = {"event_type", "UUID", "event_timestamp"}
63
- missing_cols = required_cols - set(df.columns)
64
- if missing_cols:
65
- raise ValueError(f"DataFrame missing required columns: {missing_cols}")
66
-
67
- # We'll unify LLM and TOOL operations into a single set, with:
68
- # operation_type = 'LLM' or 'TOOL'
69
- # operation_name = llm_name/tool_name
70
- # start_time
71
- # end_time
72
- # duration = end_time - start_time
73
- # We'll store them in a list of dicts, then convert to DataFrame.
74
- operations_records = []
75
-
76
- # We'll create a copy to avoid mutating user data
77
- dfc = df.copy()
78
-
79
- # We define a small helper to map event_type -> (operation_type, which_name_field)
80
- def get_operation_info(event_type: str) -> str | None:
81
- """
82
- Return 'LLM' if event_type starts with 'LLM_', 'TOOL' if event_type starts with 'TOOL_',
83
- else None (unknown).
84
- """
85
- if event_type.startswith("LLM_"):
86
- return "LLM"
87
- if event_type.startswith("TOOL_"):
88
- return "TOOL"
89
- return None
90
-
91
- # Group by UUID so we can pair each START with the corresponding END
92
- grouped = dfc.groupby("UUID", as_index=False, group_keys=True)
93
-
94
- for uuid_val, group_df in grouped:
95
- if len(group_df) < 2:
96
- # Possibly incomplete or single event, skip
97
- continue
98
-
99
- # We might have multiple events with the same UUID, but typically we expect:
100
- # LLM_START, LLM_END (or TOOL_START, TOOL_END).
101
- # Sort by timestamp
102
- group_df = group_df.sort_values("event_timestamp")
103
-
104
- # Identify operation_type from the first row's event_type
105
- first_event_type = group_df["event_type"].iloc[0]
106
- operation_type = get_operation_info(first_event_type)
107
- if not operation_type:
108
- # unknown or not LLM_/TOOL_
109
- continue
110
-
111
- # We'll attempt to find the start row and the end row
112
- # Usually there's exactly 1 start, 1 end
113
- start_rows = group_df[group_df["event_type"] == f"{operation_type}_START"]
114
- end_rows = group_df[group_df["event_type"] == f"{operation_type}_END"]
115
-
116
- if len(start_rows) == 0 or len(end_rows) == 0:
117
- # No matching start/end
118
- continue
119
-
120
- # We'll just take the earliest start and the latest end for the entire group.
121
- start_time = start_rows["event_timestamp"].min()
122
- end_time = end_rows["event_timestamp"].max()
123
- duration = end_time - start_time
124
-
125
- # For the name, we pick 'llm_name' or 'tool_name' depending on operation_type
126
- if operation_type == "LLM":
127
- # Among the rows, pick a non-null llm_name if present
128
- op_names = group_df["llm_name"].dropna().unique()
129
- # fallback to a default if none
130
- operation_name = op_names[0] if len(op_names) else "unknown_llm"
131
- else:
132
- op_names = group_df["tool_name"].dropna().unique()
133
- operation_name = op_names[0] if len(op_names) else "unknown_tool"
134
-
135
- operations_records.append({
136
- "operation_type": operation_type,
137
- "operation_name": operation_name,
138
- "start_time": start_time,
139
- "end_time": end_time,
140
- "duration": duration,
141
- "UUID": uuid_val
142
- })
143
-
144
- if not operations_records:
145
- # No valid operations found
146
- return SimpleBottleneckReport(stats={}, summary="No operations found to profile.")
147
-
148
- operations_df = pd.DataFrame(operations_records)
149
-
150
- # -------------------------------------------------------------
151
- # 2) Concurrency Analysis
152
- # -------------------------------------------------------------
153
- # We want to find the maximum concurrency for each operation_name.
154
- # We'll do a timeline-based approach: for each operation we have a start_time, end_time
155
- # We'll create +1 event at start_time, -1 event at end_time, then do a running sum.
156
- # Then we can measure concurrency across the entire timeline. However, we want concurrency
157
- # specifically *by operation_name* as well as overall.
158
- #
159
- # We'll do it in two passes:
160
- # A) Overall concurrency ignoring operation_name
161
- # B) concurrency per (operation_type, operation_name)
162
- # Then we can combine them for a "peak concurrency" measure.
163
-
164
- # A) Overall concurrency (not always essential, but might be interesting)
165
- timeline_events = []
166
- for row in operations_df.itertuples(index=False):
167
- timeline_events.append((row.start_time, +1))
168
- timeline_events.append((row.end_time, -1))
169
-
170
- timeline_events.sort(key=lambda x: x[0]) # sort by time
171
- current_concurrency = 0
172
- concurrency_trace = []
173
- for ts, delta in timeline_events:
174
- current_concurrency += delta
175
- concurrency_trace.append((ts, current_concurrency))
176
- overall_max_concurrency = max(c[1] for c in concurrency_trace) if concurrency_trace else 0
177
-
178
- # B) concurrency by operation_name
179
- # We'll generate timeline events per operation_name
180
- # Then compute the max concurrency for that subset
181
- operation_names = operations_df["operation_name"].unique()
182
- max_concurrency_by_name = {}
183
-
184
- for op_name in operation_names:
185
- sub = operations_df[operations_df["operation_name"] == op_name]
186
- events_sub = []
187
- for row in sub.itertuples(index=False):
188
- events_sub.append((row.start_time, +1))
189
- events_sub.append((row.end_time, -1))
190
- if not events_sub:
191
- max_concurrency_by_name[op_name] = 0
192
- continue
193
- events_sub.sort(key=lambda x: x[0])
194
- c_curr = 0
195
- c_max = 0
196
- for ts, delta in events_sub:
197
- c_curr += delta
198
- if c_curr > c_max: # pylint: disable=consider-using-max-builtin
199
- c_max = c_curr
200
- max_concurrency_by_name[op_name] = c_max
201
-
202
- # -------------------------------------------------------------
203
- # 3) Compute summary stats per (operation_type, operation_name)
204
- # -------------------------------------------------------------
205
- # We'll gather durations in a list, compute average, p95, p99, etc.
206
-
207
- stats_dict = {}
208
- grouped_ops = operations_df.groupby(["operation_type", "operation_name"])
209
- for (op_type, op_name), grp in grouped_ops:
210
- durations = grp["duration"].values
211
- usage_count = len(durations)
212
- avg_duration = durations.mean()
213
- p95_duration = np.percentile(durations, 95)
214
- p99_duration = np.percentile(durations, 99)
215
-
216
- # concurrency
217
- max_concur = max_concurrency_by_name.get(op_name, 0)
218
-
219
- # define a custom "bottleneck_score":
220
- # We say score = avg_duration * max_concurrency,
221
- bottleneck_score = float(avg_duration * max_concur)
222
-
223
- # store in dictionary
224
- key = f"{op_type}:{op_name}"
225
- stats_dict[key] = SimpleOperationStats(operation_type=op_type,
226
- operation_name=op_name,
227
- usage_count=usage_count,
228
- avg_duration=float(avg_duration),
229
- p95_duration=float(p95_duration),
230
- p99_duration=float(p99_duration),
231
- max_concurrency=int(max_concur),
232
- bottleneck_score=bottleneck_score)
233
-
234
- # -------------------------------------------------------------
235
- # 4) Produce a textual summary highlighting top bottlenecks
236
- # -------------------------------------------------------------
237
- # We'll rank by bottleneck_score descending and show top 3.
238
- if not stats_dict:
239
- return SimpleBottleneckReport(stats={}, summary="No stats to report.")
240
-
241
- top_items = sorted(stats_dict.values(), key=lambda x: x.bottleneck_score, reverse=True)
242
- top_3 = top_items[:3]
243
-
244
- # Build a simple textual summary
245
- lines = []
246
- lines.append("---- BOTTLENECK REPORT ----")
247
- lines.append(f"Total distinct operations found: {len(stats_dict)}")
248
- lines.append(f"Overall max concurrency (all ops): {overall_max_concurrency}")
249
- lines.append("Top 3 Bottlenecks by bottleneck_score (avg_duration * max_concurrency):")
250
- for i, item in enumerate(top_3, start=1):
251
- lines.append(f"{i}) {item.operation_type} '{item.operation_name}': "
252
- f"score={item.bottleneck_score:.2f}, "
253
- f"avg_dur={item.avg_duration:.2f}, "
254
- f"max_concurrency={item.max_concurrency}")
255
- summary_report = "\n".join(lines)
256
-
257
- # Construct a final Pydantic model
258
- return SimpleBottleneckReport(stats=stats_dict, summary=summary_report)
@@ -1,386 +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
- from typing import Any
17
-
18
- from pydantic import BaseModel
19
- from pydantic import ConfigDict
20
- from pydantic import Field
21
- from pydantic import RootModel
22
-
23
- # -----------------------------------------------------------
24
- # Prompt Caching Data Models
25
- # -----------------------------------------------------------
26
-
27
-
28
- class PrefixInfo(BaseModel):
29
- """
30
- Stores metadata about a particular prefix observed in the LLM text input.
31
- """
32
- prefix: str
33
- prefix_length: int
34
- calls_count: int
35
- calls_percentage: float = Field(..., ge=0.0, le=1.0)
36
-
37
-
38
- class FrameworkLLMPrefixData(BaseModel):
39
- """
40
- Metadata for a single (framework, llm_name) group,
41
- including total calls and all prefix statistics.
42
- """
43
- total_calls: int
44
- prefix_info: list[PrefixInfo]
45
-
46
-
47
- class CommonPrefixesOutput(RootModel[dict[str, FrameworkLLMPrefixData]]):
48
- """
49
- A root model storing a dictionary keyed by '<framework>-<llm>',
50
- each value is a FrameworkLLMPrefixData instance.
51
- """
52
-
53
- def to_dict(self) -> dict[str, FrameworkLLMPrefixData]:
54
- """
55
- Return the raw dictionary of data, discarding the 'root' wrapper.
56
- """
57
- return self.root
58
-
59
-
60
- # ----------------------------------------------------------------
61
- # Token Uniqueness Models
62
- # ----------------------------------------------------------------
63
-
64
-
65
- class LLMUniquenessMetrics(BaseModel):
66
- """
67
- Stores p90, p95, and p99 for the 'new words' metric.
68
- """
69
- p90: float
70
- p95: float
71
- p99: float
72
-
73
-
74
- class LLMUniquenessMetricsByLLM(RootModel[dict[str, LLMUniquenessMetrics]]):
75
- """
76
- A RootModel containing a dictionary where each key is an LLM name
77
- and each value is the LLMUniquenessMetrics for that LLM.
78
- """
79
-
80
- def to_dict(self) -> dict[str, Any]:
81
- # Return the raw dictionary for convenience
82
- return self.root
83
-
84
-
85
- # ----------------------------------------------------------------
86
- # Workflow Runtime Models
87
- # ----------------------------------------------------------------
88
-
89
-
90
- class WorkflowRuntimeMetrics(BaseModel):
91
- """
92
- Stores p90, p95, and p99 for workflow runtimes across all examples.
93
- """
94
- p90: float
95
- p95: float
96
- p99: float
97
-
98
-
99
- # ----------------------------------------------------------------------
100
- # Simple Bottleneck Detection Models
101
- # ----------------------------------------------------------------------
102
-
103
-
104
- class SimpleOperationStats(BaseModel):
105
- """
106
- Statistics for a particular operation name (LLM or tool),
107
- capturing concurrency, duration, usage, etc.
108
- """
109
- operation_type: str # 'LLM' or 'TOOL'
110
- operation_name: str # e.g., "llama-3" or "serpapi"
111
- usage_count: int # how many times it appears
112
- avg_duration: float # average duration
113
- p95_duration: float
114
- p99_duration: float
115
- max_concurrency: int # maximum number of concurrent operations
116
- bottleneck_score: float = Field(..., description="Custom metric to rank bottlenecks.")
117
-
118
-
119
- class SimpleBottleneckReport(BaseModel):
120
- """
121
- A container for all operation stats keyed by 'operation_type:operation_name',
122
- plus a textual summary that highlights top bottlenecks.
123
- """
124
- stats: dict[str, SimpleOperationStats]
125
- summary: str
126
-
127
-
128
- # ----------------------------------------------------------------------
129
- # Nested Bottleneck Models
130
- # ----------------------------------------------------------------------
131
-
132
-
133
- class CallNode(BaseModel):
134
- """
135
- A single call (LLM or TOOL) in a nested call tree.
136
-
137
- Attributes
138
- ----------
139
- uuid: str
140
- Unique ID tying together START/END events.
141
- operation_type: str
142
- e.g. 'LLM' or 'TOOL'.
143
- operation_name: str
144
- e.g. 'llama-3', 'bing-search', ...
145
- start_time: float
146
- Time when the call started.
147
- end_time: float
148
- Time when the call ended.
149
- duration: float
150
- end_time - start_time
151
- children: list["CallNode"]
152
- List of nested calls inside this call's time window.
153
- parent: "CallNode" | None
154
- Reference to the parent call in the tree (None if top-level).
155
- """
156
- model_config = ConfigDict(arbitrary_types_allowed=True)
157
-
158
- uuid: str
159
- operation_type: str
160
- operation_name: str
161
- start_time: float
162
- end_time: float
163
- duration: float = Field(..., description="end_time - start_time")
164
- children: list["CallNode"] = Field(default_factory=list)
165
- parent: "CallNode | None" = None
166
-
167
- def compute_self_time(self) -> float:
168
- """
169
- 'Self time' = duration minus the union of child intervals.
170
- Overlapping child intervals are merged so we don't double-count them.
171
- """
172
- if not self.children:
173
- return self.duration
174
-
175
- intervals = [(c.start_time, c.end_time) for c in self.children] # pylint: disable=not-an-iterable
176
- # Sort by start time
177
- intervals.sort(key=lambda x: x[0])
178
-
179
- merged = []
180
- cur_start, cur_end = intervals[0]
181
- for i in range(1, len(intervals)):
182
- s, e = intervals[i]
183
- if s <= cur_end:
184
- # Overlap
185
- cur_end = max(cur_end, e)
186
- else:
187
- merged.append((cur_start, cur_end))
188
- cur_start, cur_end = s, e
189
- merged.append((cur_start, cur_end))
190
-
191
- # Sum coverage, clamped to [start_time, end_time]
192
- covered = 0.0
193
- for (s, e) in merged:
194
- s_clamped = max(s, self.start_time)
195
- e_clamped = min(e, self.end_time)
196
- if e_clamped > s_clamped:
197
- covered += (e_clamped - s_clamped)
198
-
199
- return max(0.0, self.duration - covered)
200
-
201
- def compute_subtree_time(self) -> float:
202
- """
203
- Recursively compute the sum of self_time + children's subtree_time.
204
- This ensures no overlap double-counting among children.
205
- """
206
- total = self.compute_self_time()
207
- for c in self.children: # pylint: disable=not-an-iterable
208
- total += c.compute_subtree_time()
209
- return total
210
-
211
- def __str__(self) -> str:
212
- return self._repr(0)
213
-
214
- def _repr(self, level: int) -> str:
215
- indent = " " * level
216
- info = (f"{indent}- {self.operation_type} '{self.operation_name}' "
217
- f"(uuid={self.uuid}, start={self.start_time:.2f}, "
218
- f"end={self.end_time:.2f}, dur={self.duration:.2f})")
219
- child_strs = [child._repr(level + 1) for child in self.children] # pylint: disable=not-an-iterable
220
- return "\n".join([info] + child_strs)
221
-
222
-
223
- CallNode.model_rebuild()
224
-
225
-
226
- class NodeMetrics(BaseModel):
227
- """
228
- Metrics for a single node:
229
- - self_time
230
- - subtree_time
231
- - concurrency_midpoint (optional)
232
- - bottleneck_score (example: subtree_time)
233
- """
234
- uuid: str
235
- operation_type: str
236
- operation_name: str
237
- start_time: float
238
- end_time: float
239
- duration: float
240
- self_time: float
241
- subtree_time: float
242
- concurrency_midpoint: float | None = None
243
- bottleneck_score: float
244
-
245
-
246
- class ConcurrencyDistribution(BaseModel):
247
- """
248
- Overall concurrency distribution info:
249
- - timeline_segments: List of (start, end, concurrency)
250
- - p50, p90, p95, p99 concurrency
251
- """
252
- timeline_segments: list[tuple[float, float, int]]
253
- p50: float
254
- p90: float
255
- p95: float
256
- p99: float
257
-
258
-
259
- class NestedCallProfilingResult(BaseModel):
260
- """
261
- The final Pydantic model returned by 'multi_example_call_profiling'.
262
-
263
- Contains:
264
- - concurrency: ConcurrencyDistribution
265
- - node_metrics: dict[uuid, NodeMetrics]
266
- - top_bottlenecks: The top calls by bottleneck_score
267
- - textual_report: A multiline string summarizing everything
268
- """
269
- concurrency: ConcurrencyDistribution
270
- node_metrics: dict[str, NodeMetrics]
271
- top_bottlenecks: list[NodeMetrics]
272
- textual_report: str
273
-
274
-
275
- # ----------------------------------------------------------------------
276
- # Concurrency Spike Analysis Models
277
- # ----------------------------------------------------------------------
278
-
279
-
280
- class ConcurrencyCallNode(CallNode):
281
- """
282
- A single call in the nested call tree for one example.
283
- Each call is matched by a UUID with a `*_START` and `*_END` event.
284
-
285
- Because fields like prompt_tokens, completion_tokens, total_tokens
286
- may only exist at the END event, we store them only after seeing `*_END`".
287
- """
288
-
289
- example_number: int
290
-
291
- # Additional fields from END events
292
- prompt_tokens: int | None = None
293
- completion_tokens: int | None = None
294
- total_tokens: int | None = None
295
- tool_outputs: str | None = None
296
- llm_text_output: str | None = None
297
-
298
-
299
- ConcurrencyCallNode.model_rebuild()
300
-
301
-
302
- class ConcurrencySpikeInfo(BaseModel):
303
- """
304
- Info about one concurrency spike interval:
305
- - start, end of the spike
306
- - concurrency level
307
- - list of calls that overlap
308
- """
309
- start_time: float
310
- end_time: float
311
- concurrency: int
312
- active_uuids: list[str] = Field(default_factory=list)
313
-
314
-
315
- class ConcurrencyCorrelationStats(BaseModel):
316
- """
317
- Simple container for correlation / summarized stats of calls overlapping concurrency spikes.
318
- """
319
- avg_prompt_tokens: float
320
- avg_total_tokens: float
321
-
322
-
323
- class ConcurrencyAnalysisResult(BaseModel):
324
- """
325
- The final Pydantic model returned by concurrency_spike_analysis(...).
326
- Contains:
327
- - concurrency_distribution: concurrency_level => total_time
328
- - p50_concurrency, p90_concurrency, p95_concurrency, p99_concurrency
329
- - spike_threshold, spike_intervals
330
- - correlation_stats
331
- - textual_report
332
- """
333
- concurrency_distribution: dict[int, float]
334
- p50_concurrency: float
335
- p90_concurrency: float
336
- p95_concurrency: float
337
- p99_concurrency: float
338
-
339
- spike_threshold: int
340
- spike_intervals: list[ConcurrencySpikeInfo]
341
- correlation_stats: ConcurrencyCorrelationStats
342
-
343
- average_latency_by_concurrency: dict[int, float]
344
-
345
- textual_report: str
346
-
347
-
348
- # ----------------------------------------------------------------------
349
- # PrefixSpan Analysis Models
350
- # ----------------------------------------------------------------------
351
-
352
-
353
- class PrefixCallNode(BaseModel):
354
- """
355
- Represents a single call in an example's workflow.
356
- - For LLM calls, we also store llm_text_input if available so we can incorporate it into the token.
357
- """
358
- uuid: str
359
- example_number: int
360
- operation_type: str # "LLM" or "TOOL"
361
- operation_name: str # e.g. "llama-3", "internet-search"
362
- start_time: float
363
- end_time: float
364
- duration: float
365
- llm_text_input: str | None = None
366
-
367
-
368
- class FrequentPattern(BaseModel):
369
- """
370
- Frequent sub-sequence discovered by PrefixSpan, with coverage and average duration data.
371
- """
372
- pattern: list[str] # e.g. ["LLM:llama-3|Hello world", "TOOL:internet-search"]
373
- frequency: int # total occurrences across all examples
374
- coverage: float # fraction of distinct examples that contain this pattern
375
- average_duration: float # average sum of call durations for calls in that sub-sequence
376
- examples_containing: list[int] # which examples have at least one occurrence
377
-
378
-
379
- class PrefixSpanSubworkflowResult(BaseModel):
380
- """
381
- Pydantic model for the final outcome:
382
- - A list of frequent patterns
383
- - A textual summary
384
- """
385
- patterns: list[FrequentPattern]
386
- textual_report: str