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,6 +0,0 @@
1
- numpy
2
- pandas
3
- scipy
4
- ipython
5
- plotly
6
- pydantic
@@ -1,50 +0,0 @@
1
- #!/bin/bash
2
-
3
- # Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved.
4
- #
5
- # Licensed under the Apache License, Version 2.0 (the "License");
6
- # you may not use this file except in compliance with the License.
7
- # You may obtain a copy of the License at
8
- #
9
- # http://www.apache.org/licenses/LICENSE-2.0
10
- #
11
- # Unless required by applicable law or agreed to in writing, software
12
- # distributed under the License is distributed on an "AS IS" BASIS,
13
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
- # See the License for the specific language governing permissions and
15
- # limitations under the License.
16
-
17
- # Usage: ./start_local_sandbox.sh [SANDBOX_NAME] [OUTPUT_DATA_PATH]
18
- # NOTE: needs to run from the root of the repo!
19
-
20
- DOCKER_COMMAND=${DOCKER_COMMAND:-"docker"}
21
- SANDBOX_NAME=${1:-'local-sandbox'}
22
- NUM_THREADS=10
23
-
24
- # Get the output_data directory path for mounting
25
- # Priority: command line argument > environment variable > default path (current directory)
26
- OUTPUT_DATA_PATH=${2:-${OUTPUT_DATA_PATH:-$(pwd)}}
27
-
28
- echo "Starting sandbox with container name: ${SANDBOX_NAME}"
29
- echo "Mounting output_data directory: ${OUTPUT_DATA_PATH}"
30
-
31
- # Verify the path exists before mounting, create if it doesn't
32
- if [ ! -d "${OUTPUT_DATA_PATH}" ]; then
33
- echo "Output data directory does not exist, creating: ${OUTPUT_DATA_PATH}"
34
- mkdir -p "${OUTPUT_DATA_PATH}"
35
- fi
36
-
37
- # Check if the Docker image already exists
38
- if ! ${DOCKER_COMMAND} images ${SANDBOX_NAME} | grep -q "${SANDBOX_NAME}"; then
39
- echo "Docker image not found locally. Building ${SANDBOX_NAME}..."
40
- ${DOCKER_COMMAND} build --tag=${SANDBOX_NAME} --build-arg="UWSGI_PROCESSES=$((${NUM_THREADS} * 10))" --build-arg="UWSGI_CHEAPER=${NUM_THREADS}" -f Dockerfile.sandbox .
41
- else
42
- echo "Using existing Docker image: ${SANDBOX_NAME}"
43
- fi
44
-
45
- # Mount the output_data directory directly so files created in container appear in the local directory
46
- ${DOCKER_COMMAND} run --rm --name=local-sandbox \
47
- --network=host \
48
- -v "${OUTPUT_DATA_PATH}:/workspace" \
49
- -w /workspace \
50
- ${SANDBOX_NAME}
@@ -1,74 +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
- from typing import Literal
18
-
19
- from pydantic import BaseModel
20
- from pydantic import Field
21
- from pydantic import HttpUrl
22
-
23
- from aiq.builder.builder import Builder
24
- from aiq.builder.function_info import FunctionInfo
25
- from aiq.cli.register_workflow import register_function
26
- from aiq.data_models.function import FunctionBaseConfig
27
-
28
- logger = logging.getLogger(__name__)
29
-
30
-
31
- class CodeExecutionToolConfig(FunctionBaseConfig, name="code_execution"):
32
- """
33
- Tool for executing python code in a remotely hosted sandbox environment.
34
- """
35
- uri: HttpUrl = Field(default=HttpUrl("http://127.0.0.1:6000"),
36
- description="URI for the code execution sandbox server")
37
- sandbox_type: Literal["local", "piston"] = Field(default="local", description="The type of code execution sandbox")
38
- timeout: float = Field(default=10.0, description="Number of seconds to wait for a code execution request")
39
- max_output_characters: int = Field(default=1000, description="Maximum number of characters that can be returned")
40
-
41
-
42
- @register_function(config_type=CodeExecutionToolConfig)
43
- async def code_execution_tool(config: CodeExecutionToolConfig, builder: Builder):
44
- from aiq.tool.code_execution.code_sandbox import get_sandbox
45
-
46
- class CodeExecutionInputSchema(BaseModel):
47
- generated_code: str = Field(description="String containing the code to be executed")
48
-
49
- # Create sandbox without working_directory
50
- sandbox_kwargs = {"uri": config.uri}
51
-
52
- sandbox = get_sandbox(sandbox_type=config.sandbox_type, **sandbox_kwargs)
53
- logger.info(f"[DEBUG] Created sandbox of type: {config.sandbox_type}")
54
-
55
- async def _execute_code(generated_code: str) -> dict:
56
- logger.info("Executing code in the sandbox at %s", config.uri)
57
- try:
58
- output = await sandbox.execute_code(
59
- generated_code=generated_code,
60
- language="python",
61
- timeout_seconds=config.timeout,
62
- max_output_characters=config.max_output_characters,
63
- )
64
- except Exception as e:
65
- logger.exception("Error when executing code in the sandbox, %s", e)
66
- return {"process_status": "error", "stdout": "", "stderr": str(e)}
67
- return output
68
-
69
- yield FunctionInfo.from_fn(
70
- fn=_execute_code,
71
- input_schema=CodeExecutionInputSchema,
72
- description="""Executes the provied 'generated_code' in a python sandbox environment and returns
73
- a dictionary containing stdout, stderr, and the execution status, as well as a session_id. The
74
- session_id can be used to append to code that was previously executed.""")
@@ -1,414 +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
- Test suite for Code Execution Sandbox using pytest.
17
-
18
- This module provides comprehensive testing for the code execution sandbox service,
19
- replacing the original bash script with a more maintainable Python implementation.
20
- """
21
-
22
- import os
23
- from typing import Any
24
-
25
- import pytest
26
- import requests
27
- from requests.exceptions import ConnectionError
28
- from requests.exceptions import RequestException
29
- from requests.exceptions import Timeout
30
-
31
-
32
- class TestCodeExecutionSandbox:
33
- """Test suite for the Code Execution Sandbox service."""
34
-
35
- @pytest.fixture(scope="class")
36
- def sandbox_config(self):
37
- """Configuration for sandbox testing."""
38
- return {
39
- "url": os.environ.get("SANDBOX_URL", "http://127.0.0.1:6000/execute"),
40
- "timeout": int(os.environ.get("SANDBOX_TIMEOUT", "30")),
41
- "connection_timeout": 5
42
- }
43
-
44
- @pytest.fixture(scope="class", autouse=True)
45
- def check_sandbox_running(self, sandbox_config):
46
- """Check if sandbox server is running before running tests."""
47
- try:
48
- _ = requests.get(sandbox_config["url"], timeout=sandbox_config["connection_timeout"])
49
- print(f"✓ Sandbox server is running at {sandbox_config['url']}")
50
- except (ConnectionError, Timeout, RequestException):
51
- pytest.skip(
52
- f"Sandbox server is not running at {sandbox_config['url']}. "
53
- "Please start it with: cd src/aiq/tool/code_execution/local_sandbox && ./start_local_sandbox.sh")
54
-
55
- def execute_code(self, sandbox_config: dict[str, Any], code: str, language: str = "python") -> dict[str, Any]:
56
- """
57
- Execute code in the sandbox and return the response.
58
-
59
- Args:
60
- sandbox_config: Configuration dictionary
61
- code: Code to execute
62
- language: Programming language (default: python)
63
-
64
- Returns:
65
- dictionary containing the response from the sandbox
66
- """
67
- payload = {"generated_code": code, "timeout": sandbox_config["timeout"], "language": language}
68
-
69
- response = requests.post(
70
- sandbox_config["url"],
71
- json=payload,
72
- timeout=sandbox_config["timeout"] + 5 # Add buffer to request timeout
73
- )
74
-
75
- # Ensure we got a response
76
- response.raise_for_status()
77
- return response.json()
78
-
79
- def test_simple_print(self, sandbox_config):
80
- """Test simple print statement execution."""
81
- code = "print('Hello, World!')"
82
- result = self.execute_code(sandbox_config, code)
83
-
84
- assert result["process_status"] == "completed"
85
- assert "Hello, World!" in result["stdout"]
86
- assert result["stderr"] == ""
87
-
88
- def test_basic_arithmetic(self, sandbox_config):
89
- """Test basic arithmetic operations."""
90
- code = """
91
- result = 2 + 3
92
- print(f'Result: {result}')
93
- """
94
- result = self.execute_code(sandbox_config, code)
95
-
96
- assert result["process_status"] == "completed"
97
- assert "Result: 5" in result["stdout"]
98
- assert result["stderr"] == ""
99
-
100
- def test_numpy_operations(self, sandbox_config):
101
- """Test numpy dependency availability and operations."""
102
- code = """
103
- import numpy as np
104
- arr = np.array([1, 2, 3, 4, 5])
105
- print(f'Array: {arr}')
106
- print(f'Mean: {np.mean(arr)}')
107
- """
108
- result = self.execute_code(sandbox_config, code)
109
-
110
- assert result["process_status"] == "completed"
111
- assert "Array: [1 2 3 4 5]" in result["stdout"]
112
- assert "Mean: 3.0" in result["stdout"]
113
- assert result["stderr"] == ""
114
-
115
- def test_pandas_operations(self, sandbox_config):
116
- """Test pandas dependency availability and operations."""
117
- code = """
118
- import pandas as pd
119
- df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
120
- print(df)
121
- print(f'Sum of column A: {df["A"].sum()}')
122
- """
123
- result = self.execute_code(sandbox_config, code)
124
-
125
- assert result["process_status"] == "completed"
126
- assert "Sum of column A: 6" in result["stdout"]
127
- assert result["stderr"] == ""
128
-
129
- def test_plotly_import(self, sandbox_config):
130
- """Test plotly dependency availability."""
131
- code = """
132
- import plotly.graph_objects as go
133
- print('Plotly imported successfully')
134
- fig = go.Figure()
135
- fig.add_trace(go.Scatter(x=[1, 2, 3], y=[4, 5, 6]))
136
- print('Plot created successfully')
137
- """
138
- result = self.execute_code(sandbox_config, code)
139
-
140
- assert result["process_status"] == "completed"
141
- assert "Plotly imported successfully" in result["stdout"]
142
- assert "Plot created successfully" in result["stdout"]
143
- assert result["stderr"] == ""
144
-
145
- def test_syntax_error_handling(self, sandbox_config):
146
- """Test handling of syntax errors."""
147
- code = """
148
- print('Hello World'
149
- # Missing closing parenthesis
150
- """
151
- result = self.execute_code(sandbox_config, code)
152
-
153
- assert result["process_status"] == "error"
154
- assert "SyntaxError" in result["stderr"] or "SyntaxError" in result["stdout"]
155
-
156
- def test_runtime_error_handling(self, sandbox_config):
157
- """Test handling of runtime errors."""
158
- code = """
159
- x = 1 / 0
160
- print('This should not print')
161
- """
162
- result = self.execute_code(sandbox_config, code)
163
-
164
- assert result["process_status"] == "error"
165
- assert "ZeroDivisionError" in result["stderr"] or "ZeroDivisionError" in result["stdout"]
166
-
167
- def test_import_error_handling(self, sandbox_config):
168
- """Test handling of import errors."""
169
- code = """
170
- import nonexistent_module
171
- print('This should not print')
172
- """
173
- result = self.execute_code(sandbox_config, code)
174
-
175
- assert result["process_status"] == "error"
176
- assert "ModuleNotFoundError" in result["stderr"] or "ImportError" in result["stderr"]
177
-
178
- def test_mixed_output(self, sandbox_config):
179
- """Test code that produces both stdout and stderr output."""
180
- code = """
181
- import sys
182
- print('This goes to stdout')
183
- print('This goes to stderr', file=sys.stderr)
184
- print('Back to stdout')
185
- """
186
- result = self.execute_code(sandbox_config, code)
187
-
188
- assert result["process_status"] == "completed"
189
- assert "This goes to stdout" in result["stdout"]
190
- assert "Back to stdout" in result["stdout"]
191
- assert "This goes to stderr" in result["stderr"]
192
-
193
- def test_long_running_code(self, sandbox_config):
194
- """Test code that takes some time to execute but completes within timeout."""
195
- code = """
196
- import time
197
- for i in range(3):
198
- print(f'Iteration {i}')
199
- time.sleep(0.5)
200
- print('Completed')
201
- """
202
- result = self.execute_code(sandbox_config, code)
203
-
204
- assert result["process_status"] == "completed"
205
- assert "Iteration 0" in result["stdout"]
206
- assert "Iteration 1" in result["stdout"]
207
- assert "Iteration 2" in result["stdout"]
208
- assert "Completed" in result["stdout"]
209
- assert result["stderr"] == ""
210
-
211
- def test_file_operations(self, sandbox_config):
212
- """Test basic file operations in the sandbox."""
213
- code = """
214
- import os
215
- print(f'Current directory: {os.getcwd()}')
216
- with open('test_file.txt', 'w') as f:
217
- f.write('Hello, World!')
218
- with open('test_file.txt', 'r') as f:
219
- content = f.read()
220
- print(f'File content: {content}')
221
- os.remove('test_file.txt')
222
- print('File operations completed')
223
- """
224
- result = self.execute_code(sandbox_config, code)
225
-
226
- assert result["process_status"] == "completed"
227
- assert "File content: Hello, World!" in result["stdout"]
228
- assert "File operations completed" in result["stdout"]
229
- assert result["stderr"] == ""
230
-
231
- def test_file_persistence_create(self, sandbox_config):
232
- """Test file persistence - create various file types."""
233
- code = """
234
- import os
235
- import pandas as pd
236
- import numpy as np
237
- print('Current directory:', os.getcwd())
238
- print('Directory contents:', os.listdir('.'))
239
-
240
- # Create a test file
241
- with open('persistence_test.txt', 'w') as f:
242
- f.write('Hello from sandbox persistence test!')
243
-
244
- # Create a CSV file
245
- df = pd.DataFrame({'A': [1, 2, 3], 'B': [4, 5, 6]})
246
- df.to_csv('persistence_test.csv', index=False)
247
-
248
- # Create a numpy array file
249
- arr = np.array([1, 2, 3, 4, 5])
250
- np.save('persistence_test.npy', arr)
251
-
252
- print('Files created:')
253
- for file in os.listdir('.'):
254
- if 'persistence_test' in file:
255
- print(' -', file)
256
- """
257
- result = self.execute_code(sandbox_config, code)
258
-
259
- assert result["process_status"] == "completed"
260
- assert "persistence_test.txt" in result["stdout"]
261
- assert "persistence_test.csv" in result["stdout"]
262
- assert "persistence_test.npy" in result["stdout"]
263
- assert result["stderr"] == ""
264
-
265
- def test_file_persistence_read(self, sandbox_config):
266
- """Test file persistence - read back created files."""
267
- code = """
268
- import pandas as pd
269
- import numpy as np
270
-
271
- # Read back the files we created
272
- print('=== Reading persistence_test.txt ===')
273
- with open('persistence_test.txt', 'r') as f:
274
- content = f.read()
275
- print(f'Content: {content}')
276
-
277
- print('\\n=== Reading persistence_test.csv ===')
278
- df = pd.read_csv('persistence_test.csv')
279
- print(df)
280
- print(f'DataFrame shape: {df.shape}')
281
-
282
- print('\\n=== Reading persistence_test.npy ===')
283
- arr = np.load('persistence_test.npy')
284
- print(f'Array: {arr}')
285
- print(f'Array sum: {np.sum(arr)}')
286
-
287
- print('\\n=== File persistence test PASSED! ===')
288
- """
289
- result = self.execute_code(sandbox_config, code)
290
-
291
- assert result["process_status"] == "completed"
292
- assert "Content: Hello from sandbox persistence test!" in result["stdout"]
293
- assert "DataFrame shape: (3, 2)" in result["stdout"]
294
- assert "Array: [1 2 3 4 5]" in result["stdout"]
295
- assert "Array sum: 15" in result["stdout"]
296
- assert "File persistence test PASSED!" in result["stdout"]
297
- assert result["stderr"] == ""
298
-
299
- def test_json_operations(self, sandbox_config):
300
- """Test JSON file operations for persistence."""
301
- code = """
302
- import json
303
- import os
304
-
305
- # Create a complex JSON file
306
- data = {
307
- 'test_name': 'sandbox_persistence',
308
- 'timestamp': '2024-07-03',
309
- 'results': {
310
- 'numpy_test': True,
311
- 'pandas_test': True,
312
- 'file_operations': True
313
- },
314
- 'metrics': [1.5, 2.3, 3.7, 4.1],
315
- 'metadata': {
316
- 'working_dir': os.getcwd(),
317
- 'python_version': '3.x'
318
- }
319
- }
320
-
321
- # Save JSON file
322
- with open('persistence_test.json', 'w') as f:
323
- json.dump(data, f, indent=2)
324
-
325
- # Read it back
326
- with open('persistence_test.json', 'r') as f:
327
- loaded_data = json.load(f)
328
-
329
- print('JSON file created and loaded successfully')
330
- print(f'Test name: {loaded_data["test_name"]}')
331
- print(f'Results count: {len(loaded_data["results"])}')
332
- print(f'Metrics: {loaded_data["metrics"]}')
333
- print('JSON persistence test completed!')
334
- """
335
- result = self.execute_code(sandbox_config, code)
336
-
337
- assert result["process_status"] == "completed"
338
- assert "JSON file created and loaded successfully" in result["stdout"]
339
- assert "Test name: sandbox_persistence" in result["stdout"]
340
- assert "Results count: 3" in result["stdout"]
341
- assert "JSON persistence test completed!" in result["stdout"]
342
- assert result["stderr"] == ""
343
-
344
- def test_missing_generated_code_field(self, sandbox_config):
345
- """Test request missing the generated_code field."""
346
- payload = {"timeout": 10, "language": "python"}
347
-
348
- response = requests.post(sandbox_config["url"], json=payload)
349
-
350
- # Should return an error status code or error in response
351
- assert response.status_code != 200 or "error" in response.json()
352
-
353
- def test_missing_timeout_field(self, sandbox_config):
354
- """Test request missing the timeout field."""
355
- payload = {"generated_code": "print('test')", "language": "python"}
356
-
357
- response = requests.post(sandbox_config["url"], json=payload)
358
-
359
- # Should return error for missing timeout field
360
- result = response.json()
361
- assert response.status_code == 400 and result["process_status"] == "error"
362
-
363
- def test_invalid_json(self, sandbox_config):
364
- """Test request with invalid JSON."""
365
- invalid_json = '{"generated_code": "print("test")", "timeout": 10}'
366
-
367
- response = requests.post(sandbox_config["url"], data=invalid_json, headers={"Content-Type": "application/json"})
368
-
369
- # Should return error for invalid JSON
370
- assert response.status_code != 200
371
-
372
- def test_non_json_request(self, sandbox_config):
373
- """Test request with non-JSON content."""
374
- response = requests.post(sandbox_config["url"], data="This is not JSON", headers={"Content-Type": "text/plain"})
375
-
376
- # Should return error for non-JSON content
377
- assert response.status_code != 200
378
-
379
- def test_timeout_too_low(self, sandbox_config):
380
- """Test request with timeout too low."""
381
- code = """
382
- import time
383
- time.sleep(2.0)
384
- """
385
- payload = {"generated_code": code, "timeout": 1, "language": "python"}
386
- response = requests.post(sandbox_config["url"], json=payload)
387
- assert response.json()["process_status"] == "timeout"
388
- assert response.status_code == 200
389
-
390
-
391
- # Pytest configuration and fixtures for command-line options
392
- def pytest_addoption(parser):
393
- """Add custom command-line options for pytest."""
394
- parser.addoption("--sandbox-url",
395
- action="store",
396
- default="http://127.0.0.1:6000/execute",
397
- help="Sandbox URL for testing")
398
- parser.addoption("--sandbox-timeout",
399
- action="store",
400
- type=int,
401
- default=30,
402
- help="Timeout in seconds for sandbox operations")
403
-
404
-
405
- @pytest.fixture(scope="session", autouse=True)
406
- def setup_environment(request):
407
- """Setup environment variables from command-line options."""
408
- os.environ["SANDBOX_URL"] = request.config.getoption("--sandbox-url", "http://127.0.0.1:6000/execute")
409
- os.environ["SANDBOX_TIMEOUT"] = str(request.config.getoption("--sandbox-timeout", 30))
410
-
411
-
412
- if __name__ == "__main__":
413
- # Allow running as a script
414
- pytest.main([__file__, "-v"])
@@ -1,100 +0,0 @@
1
- # Copyright (c) 2024-2025, NVIDIA CORPORATION. All rights reserved.
2
- #
3
- # Licensed under the Apache License, Version 2.0 (the "License");
4
- # you may not use this file except in compliance with the License.
5
- # You may obtain a copy of the License at
6
- #
7
- # http://www.apache.org/licenses/LICENSE-2.0
8
- #
9
- # Unless required by applicable law or agreed to in writing, software
10
- # distributed under the License is distributed on an "AS IS" BASIS,
11
- # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
- # See the License for the specific language governing permissions and
13
- # limitations under the License.
14
-
15
- import glob
16
- import logging
17
- import re
18
-
19
- LOG = logging.getLogger(__name__)
20
-
21
-
22
- def format_code_output(execution_dict: dict[str, str],
23
- code_output_begin: str,
24
- code_output_end: str,
25
- code_output_format: str = 'llama'):
26
- """Formatting code output to be displayed as an llm expects it."""
27
- if code_output_format == 'llama':
28
- output = execution_dict["process_status"]
29
- if execution_dict['stdout']:
30
- output += f"\n[stdout]\n{execution_dict['stdout']}[/stdout]"
31
- if execution_dict['stderr']:
32
- output += f"\n[stderr]\n{execution_dict['stderr']}[/stderr]"
33
- output = f"{code_output_begin}\n\n{output}{code_output_end}\n\n"
34
- elif code_output_format == 'qwen':
35
- output = ""
36
- if execution_dict['stdout']:
37
- output += f"{execution_dict['stdout']}"
38
- if execution_dict['stderr']:
39
- output += f"{execution_dict['stderr']}"
40
- if execution_dict['stderr'] and execution_dict['stdout']:
41
- LOG.warning("Both stdout and stderr are not empty. This shouldn't normally happen! %s", execution_dict)
42
- output = f"{code_output_begin}{output}{code_output_end}"
43
- else:
44
- raise ValueError(f"Unknown code_output_format: {code_output_format}")
45
-
46
- # wrapping with code output separators
47
- return output
48
-
49
-
50
- def _extract_between_separators(generation: str, separators: tuple[str, str], extract_all: bool = False):
51
- """Extracting all text between last occurrence of separators[0] and [1].
52
-
53
- If extract_all is True, returning a list with all occurrences of text between separators.
54
- """
55
- if extract_all:
56
- separators = [re.escape(sp) for sp in separators]
57
- pattern = f'{separators[0]}(.*?){separators[1]}'
58
- return re.findall(pattern, generation, re.DOTALL)
59
- return generation.split(separators[0])[-1].split(separators[1])[0]
60
-
61
-
62
- def extract_code_to_execute(generation: str, code_begin: str, code_end: str, extract_all: bool = False):
63
- return _extract_between_separators(generation, [code_begin, code_end], extract_all)
64
-
65
-
66
- def extract_code_output(generation: str, code_output_begin: str, code_output_end: str, extract_all: bool = False):
67
- return _extract_between_separators(generation, [code_output_begin, code_output_end], extract_all)
68
-
69
-
70
- def unroll_files(input_files):
71
- if len(input_files) == 0:
72
- raise ValueError("No files found with the given pattern.")
73
- total_files = 0
74
- for file_pattern in input_files:
75
- for file in sorted(glob.glob(file_pattern, recursive=True)):
76
- total_files += 1
77
- yield file
78
- if total_files == 0:
79
- raise ValueError("No files found with the given pattern.")
80
-
81
-
82
- def python_doc_to_cmd_help(doc_class, docs_prefix="", arg_prefix=""):
83
- """Converts python doc to cmd help format.
84
-
85
- Will color the args and change the format to match what we use in cmd help.
86
- """
87
- all_args = docs_prefix
88
- all_args += doc_class.__doc__.split("Args:")[1].rstrip()
89
- # \033[92m ... \033[0m - green in terminal
90
- colored_args = ""
91
- for line in all_args.split("\n"):
92
- if " " in line and " - " in line:
93
- # add colors
94
- line = line.replace(" ", " \033[92m").replace(" - ", "\033[0m - ")
95
- # fixing arg format
96
- line = line.replace(' \033[92m', f' \033[92m{arg_prefix}')
97
- # fixing indent
98
- line = line.replace(" ", " ").replace(" ", " ")
99
- colored_args += line + '\n'
100
- return colored_args[:-1]