quantalogic 0.57.0__tar.gz → 0.58.0__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (174) hide show
  1. {quantalogic-0.57.0 → quantalogic-0.58.0}/PKG-INFO +1 -1
  2. {quantalogic-0.57.0 → quantalogic-0.58.0}/pyproject.toml +1 -1
  3. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/agent.py +28 -4
  4. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/create_custom_agent.py +146 -71
  5. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/server/agent_server.py +19 -4
  6. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/google_packages/google_news_tool.py +26 -187
  7. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/utilities/__init__.py +2 -0
  8. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/utilities/download_file_tool.py +4 -2
  9. quantalogic-0.58.0/quantalogic/tools/utilities/vscode_tool.py +123 -0
  10. quantalogic-0.58.0/quantalogic/utils/ask_user_validation.py +32 -0
  11. quantalogic-0.57.0/quantalogic/utils/ask_user_validation.py +0 -12
  12. {quantalogic-0.57.0 → quantalogic-0.58.0}/LICENSE +0 -0
  13. {quantalogic-0.57.0 → quantalogic-0.58.0}/README.md +0 -0
  14. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/__init__.py +0 -0
  15. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/agent_config.py +0 -0
  16. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/agent_factory.py +0 -0
  17. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/coding_agent.py +0 -0
  18. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/config.py +0 -0
  19. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/console_print_events.py +0 -0
  20. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/console_print_token.py +0 -0
  21. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/docs_cli.py +0 -0
  22. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/event_emitter.py +0 -0
  23. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/__init__.py +0 -0
  24. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow.py +0 -0
  25. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow_extractor.py +0 -0
  26. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow_generator.py +0 -0
  27. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow_manager.py +0 -0
  28. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow_manager_schema.py +0 -0
  29. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow_mermaid.py +0 -0
  30. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow_validator.py +0 -0
  31. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow_yaml.linkedin.md +0 -0
  32. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/flow_yaml.md +0 -0
  33. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/templates/prompt_check_inventory.j2 +0 -0
  34. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/flow/templates/system_check_inventory.j2 +0 -0
  35. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/generative_model.py +0 -0
  36. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/get_model_info.py +0 -0
  37. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/interactive_text_editor.py +0 -0
  38. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/main.py +0 -0
  39. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/memory.py +0 -0
  40. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/model_info.py +0 -0
  41. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/model_info_list.py +0 -0
  42. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/model_info_litellm.py +0 -0
  43. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/model_names.py +0 -0
  44. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts/memory_compaction_prompt.j2 +0 -0
  45. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts/observation_response_format.j2 +0 -0
  46. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts/repeated_tool_call_error.j2 +0 -0
  47. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts/system_prompt.j2 +0 -0
  48. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts/task_prompt.j2 +0 -0
  49. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts/task_summary_prompt.j2 +0 -0
  50. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts/tools_prompt.j2 +0 -0
  51. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts/variables_prompt.j2 +0 -0
  52. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/prompts.py +0 -0
  53. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/quantlitellm.py +0 -0
  54. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/search_agent.py +0 -0
  55. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/server/__init__.py +0 -0
  56. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/server/models.py +0 -0
  57. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/server/routes.py +0 -0
  58. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/server/state.py +0 -0
  59. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/server/static/js/event_visualizer.js +0 -0
  60. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/server/static/js/quantalogic.js +0 -0
  61. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/server/templates/index.html +0 -0
  62. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/task_file_reader.py +0 -0
  63. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/task_runner.py +0 -0
  64. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tool_manager.py +0 -0
  65. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/__init__.py +0 -0
  66. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/agent_tool.py +0 -0
  67. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/composio/__init__.py +0 -0
  68. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/composio/composio.py +0 -0
  69. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/database/__init__.py +0 -0
  70. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/database/generate_database_report_tool.py +0 -0
  71. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/database/sql_query_tool_advanced.py +0 -0
  72. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/document_tools/__init__.py +0 -0
  73. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/document_tools/markdown_to_docx_tool.py +0 -0
  74. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/document_tools/markdown_to_epub_tool.py +0 -0
  75. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/document_tools/markdown_to_html_tool.py +0 -0
  76. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/document_tools/markdown_to_ipynb_tool.py +0 -0
  77. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/document_tools/markdown_to_latex_tool.py +0 -0
  78. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/document_tools/markdown_to_pdf_tool.py +0 -0
  79. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/document_tools/markdown_to_pptx_tool.py +0 -0
  80. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/download_http_file_tool.py +0 -0
  81. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/duckduckgo_search_tool.py +0 -0
  82. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/edit_whole_content_tool.py +0 -0
  83. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/elixir_tool.py +0 -0
  84. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/execute_bash_command_tool.py +0 -0
  85. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/__init__.py +0 -0
  86. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/alpha_vantage_tool.py +0 -0
  87. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/ccxt_tool.py +0 -0
  88. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/finance_llm_tool.py +0 -0
  89. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/google_finance.py +0 -0
  90. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/market_intelligence_tool.py +0 -0
  91. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/technical_analysis_tool.py +0 -0
  92. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/tradingview_tool.py +0 -0
  93. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/finance/yahoo_finance.py +0 -0
  94. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/git/__init__.py +0 -0
  95. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/git/bitbucket_clone_repo_tool.py +0 -0
  96. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/git/bitbucket_operations_tool.py +0 -0
  97. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/git/clone_repo_tool.py +0 -0
  98. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/git/git_operations_tool.py +0 -0
  99. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/google_packages/__init__.py +0 -0
  100. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/grep_app_tool.py +0 -0
  101. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/image_generation/__init__.py +0 -0
  102. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/image_generation/dalle_e.py +0 -0
  103. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/input_question_tool.py +0 -0
  104. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/jinja_tool.py +0 -0
  105. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/__init__.py +0 -0
  106. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/c_handler.py +0 -0
  107. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/cpp_handler.py +0 -0
  108. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/go_handler.py +0 -0
  109. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/java_handler.py +0 -0
  110. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/javascript_handler.py +0 -0
  111. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/python_handler.py +0 -0
  112. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/rust_handler.py +0 -0
  113. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/scala_handler.py +0 -0
  114. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/language_handlers/typescript_handler.py +0 -0
  115. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/list_directory_tool.py +0 -0
  116. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/llm_tool.py +0 -0
  117. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/llm_vision_tool.py +0 -0
  118. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/markitdown_tool.py +0 -0
  119. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/nasa_packages/__init__.py +0 -0
  120. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/nasa_packages/models.py +0 -0
  121. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/nasa_packages/nasa_apod_tool.py +0 -0
  122. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/nasa_packages/nasa_neows_tool.py +0 -0
  123. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/nasa_packages/services.py +0 -0
  124. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/nodejs_tool.py +0 -0
  125. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/presentation_tools/__init__.py +0 -0
  126. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/presentation_tools/presentation_llm_tool.py +0 -0
  127. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/product_hunt/__init__.py +0 -0
  128. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/product_hunt/product_hunt_tool.py +0 -0
  129. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/product_hunt/services.py +0 -0
  130. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/python_tool.py +0 -0
  131. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/rag_tool/__init__.py +0 -0
  132. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/rag_tool/document_metadata.py +0 -0
  133. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/rag_tool/query_response.py +0 -0
  134. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/rag_tool/rag_tool.py +0 -0
  135. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/rag_tool/rag_tool_beta.py +0 -0
  136. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/read_file_block_tool.py +0 -0
  137. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/read_file_tool.py +0 -0
  138. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/read_html_tool.py +0 -0
  139. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/replace_in_file_tool.py +0 -0
  140. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/ripgrep_tool.py +0 -0
  141. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/safe_python_interpreter_tool.py +0 -0
  142. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/search_definition_names.py +0 -0
  143. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/sequence_tool.py +0 -0
  144. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/serpapi_search_tool.py +0 -0
  145. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/sql_query_tool.py +0 -0
  146. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/task_complete_tool.py +0 -0
  147. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/tool.py +0 -0
  148. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/unified_diff_tool.py +0 -0
  149. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/utilities/csv_processor_tool.py +0 -0
  150. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/utilities/mermaid_validator_tool.py +0 -0
  151. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/utils/__init__.py +0 -0
  152. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/utils/create_sample_database.py +0 -0
  153. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/utils/generate_database_report.py +0 -0
  154. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/wikipedia_search_tool.py +0 -0
  155. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/tools/write_file_tool.py +0 -0
  156. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/__init__.py +0 -0
  157. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/async_utils.py +0 -0
  158. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/check_version.py +0 -0
  159. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/download_http_file.py +0 -0
  160. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/get_all_models.py +0 -0
  161. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/get_coding_environment.py +0 -0
  162. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/get_environment.py +0 -0
  163. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/get_quantalogic_rules_content.py +0 -0
  164. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/git_ls.py +0 -0
  165. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/lm_studio_model_info.py +0 -0
  166. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/python_interpreter.py +0 -0
  167. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/read_file.py +0 -0
  168. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/read_http_text_content.py +0 -0
  169. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/utils/xml_utility.py +0 -0
  170. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/version.py +0 -0
  171. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/version_check.py +0 -0
  172. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/welcome_message.py +0 -0
  173. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/xml_parser.py +0 -0
  174. {quantalogic-0.57.0 → quantalogic-0.58.0}/quantalogic/xml_tool_parser.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: quantalogic
3
- Version: 0.57.0
3
+ Version: 0.58.0
4
4
  Summary: QuantaLogic ReAct Agents
5
5
  Author: Raphaël MANSUY
6
6
  Author-email: raphael.mansuy@gmail.com
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "quantalogic"
3
- version = "0.57.0"
3
+ version = "0.58.0"
4
4
  description = "QuantaLogic ReAct Agents"
5
5
  authors = ["Raphaël MANSUY <raphael.mansuy@gmail.com>"]
6
6
  readme = "README.md"
@@ -2,7 +2,8 @@
2
2
 
3
3
  import asyncio
4
4
  import os
5
- from collections.abc import Callable
5
+ import uuid
6
+ from collections.abc import Awaitable, Callable
6
7
  from datetime import datetime
7
8
  from pathlib import Path
8
9
  from typing import Any
@@ -75,7 +76,7 @@ class Agent(BaseModel):
75
76
  config: AgentConfig
76
77
  task_to_solve: str
77
78
  task_to_solve_summary: str = ""
78
- ask_for_user_validation: Callable[[str], bool] = console_ask_for_user_validation
79
+ ask_for_user_validation: Callable[[str, str], Awaitable[bool]] = console_ask_for_user_validation
79
80
  last_tool_call: dict[str, Any] = {} # Stores the last tool call information
80
81
  total_tokens: int = 0 # Total tokens in the conversation
81
82
  current_iteration: int = 0
@@ -93,7 +94,7 @@ class Agent(BaseModel):
93
94
  memory: AgentMemory = AgentMemory(),
94
95
  variable_store: VariableMemory = VariableMemory(),
95
96
  tools: list[Tool] = [TaskCompleteTool()],
96
- ask_for_user_validation: Callable[[str], bool] = console_ask_for_user_validation,
97
+ ask_for_user_validation: Callable[[str, str], Awaitable[bool]] = console_ask_for_user_validation,
97
98
  task_to_solve: str = "",
98
99
  specific_expertise: str = "General AI assistant with coding and problem-solving capabilities",
99
100
  get_environment: Callable[[], str] = get_environment,
@@ -399,6 +400,18 @@ class Agent(BaseModel):
399
400
  Tuple of (executed_tool_name, response)
400
401
  """
401
402
  if tool.need_validation:
403
+ logger.info(f"Tool '{tool_name}' requires validation.")
404
+ validation_id = str(uuid.uuid4())
405
+ logger.info(f"Validation ID: {validation_id}")
406
+
407
+ self._emit_event(
408
+ "tool_execute_validation_start",
409
+ {
410
+ "validation_id": validation_id,
411
+ "tool_name": tool_name,
412
+ "arguments": arguments_with_values
413
+ },
414
+ )
402
415
  question_validation = (
403
416
  "Do you permit the execution of this tool?\n"
404
417
  f"Tool: {tool_name}\nArguments:\n"
@@ -406,7 +419,18 @@ class Agent(BaseModel):
406
419
  + "\n".join([f" <{key}>{value}</{key}>" for key, value in arguments_with_values.items()])
407
420
  + "\n</arguments>\nYes or No"
408
421
  )
409
- permission_granted = self.ask_for_user_validation(question_validation)
422
+ permission_granted = await self.ask_for_user_validation(validation_id=validation_id, question=question_validation)
423
+
424
+ self._emit_event(
425
+ "tool_execute_validation_end",
426
+ {
427
+ "validation_id": validation_id,
428
+ "tool_name": tool_name,
429
+ "arguments": arguments_with_values,
430
+ "granted": permission_granted
431
+ },
432
+ )
433
+
410
434
  if not permission_granted:
411
435
  return "", f"Error: execution of tool '{tool_name}' was denied by the user."
412
436
 
@@ -55,14 +55,14 @@ def create_tool_instance(tool_class, **kwargs):
55
55
  return None
56
56
 
57
57
  try:
58
- # Extract the name from the class name if not provided
59
- if 'name' not in kwargs:
58
+ # Only set name if the class doesn't already define it
59
+ if 'name' not in kwargs and not hasattr(tool_class, 'name'):
60
60
  class_name = tool_class.__name__
61
61
  kwargs['name'] = class_name.lower().replace('tool', '')
62
62
 
63
63
  # Create and return the tool instance
64
64
  instance = tool_class(**kwargs)
65
- logger.debug(f"Successfully created tool instance: {kwargs.get('name')}")
65
+ logger.debug(f"Successfully created tool instance: {tool_class.__name__}")
66
66
  return instance
67
67
  except Exception as e:
68
68
  logger.error(f"Failed to instantiate {tool_class.__name__}: {str(e)}")
@@ -72,33 +72,33 @@ def create_tool_instance(tool_class, **kwargs):
72
72
  TOOL_IMPORTS = {
73
73
  # LLM Tools
74
74
  "llm": lambda: _import_tool("quantalogic.tools.llm_tool", "LLMTool"),
75
- "llm_vision": lambda: _import_tool("quantalogic.tools.llm_tool", "LLMVisionTool"),
76
- "llm_image_generation": lambda: _import_tool("quantalogic.tools.llm_tool", "LLMImageGenerationTool"),
75
+ "llm_vision": lambda: _import_tool("quantalogic.tools.llm_vision_tool", "LLMVisionTool"),
76
+ "llm_image_generation": lambda: _import_tool("quantalogic.tools.image_generation.dalle_e", "LLMImageGenerationTool"),
77
77
 
78
78
  # File Tools
79
- "download_http_file": lambda: _import_tool("quantalogic.tools.download_file_tool", "PrepareDownloadTool"),
79
+ "download_http_file": lambda: _import_tool("quantalogic.tools.utilities", "PrepareDownloadTool"),
80
80
  "write_file": lambda: _import_tool("quantalogic.tools.write_file_tool", "WriteFileTool"),
81
- "edit_whole_content": lambda: _import_tool("quantalogic.tools.file_tools", "EditWholeContentTool"),
82
- "read_file_block": lambda: _import_tool("quantalogic.tools.file_tools", "ReadFileBlockTool"),
83
- "read_file": lambda: _import_tool("quantalogic.tools.file_tools", "ReadFileTool"),
84
- "replace_in_file": lambda: _import_tool("quantalogic.tools.file_tools", "ReplaceInFileTool"),
85
- "list_directory": lambda: _import_tool("quantalogic.tools.file_tools", "ListDirectoryTool"),
81
+ "edit_whole_content": lambda: _import_tool("quantalogic.tools", "EditWholeContentTool"),
82
+ "read_file_block": lambda: _import_tool("quantalogic.tools", "ReadFileBlockTool"),
83
+ "read_file": lambda: _import_tool("quantalogic.tools", "ReadFileTool"),
84
+ "replace_in_file": lambda: _import_tool("quantalogic.tools", "ReplaceInFileTool"),
85
+ "list_directory": lambda: _import_tool("quantalogic.tools", "ListDirectoryTool"),
86
86
 
87
87
  # Search Tools
88
88
  "duck_duck_go_search": lambda: _import_tool("quantalogic.tools", "DuckDuckGoSearchTool"),
89
89
  "wikipedia_search": lambda: _import_tool("quantalogic.tools", "WikipediaSearchTool"),
90
- "google_news": lambda: _import_tool("quantalogic.tools", "GoogleNewsTool"),
90
+ "google_news": lambda: _import_tool("quantalogic.tools.google_packages", "GoogleNewsTool"),
91
91
  "search_definition_names": lambda: _import_tool("quantalogic.tools", "SearchDefinitionNames"),
92
92
  "ripgrep": lambda: _import_tool("quantalogic.tools", "RipgrepTool"),
93
93
 
94
94
  # Execution Tools
95
- "execute_bash_command": lambda: _import_tool("quantalogic.tools.execution_tools", "ExecuteBashCommandTool"),
96
- "nodejs": lambda: _import_tool("quantalogic.tools.execution_tools", "NodeJsTool"),
97
- "python": lambda: _import_tool("quantalogic.tools.execution_tools", "PythonTool"),
98
- "safe_python_interpreter": lambda: _import_tool("quantalogic.tools.execution_tools", "SafePythonInterpreterTool"),
95
+ "execute_bash_command": lambda: _import_tool("quantalogic.tools", "ExecuteBashCommandTool"),
96
+ "nodejs": lambda: _import_tool("quantalogic.tools", "NodeJsTool"),
97
+ "python": lambda: _import_tool("quantalogic.tools", "PythonTool"),
98
+ "safe_python_interpreter": lambda: _import_tool("quantalogic.tools", "SafePythonInterpreterTool"),
99
99
 
100
100
  # Database Tools
101
- "sql_query": lambda: _import_tool("quantalogic.tools.database", "SQLQueryTool"),
101
+ "sql_query": lambda: _import_tool("quantalogic.tools", "SQLQueryTool"),
102
102
  "sql_query_advanced": lambda: _import_tool("quantalogic.tools.database", "SQLQueryToolAdvanced"),
103
103
 
104
104
  # Document Tools
@@ -140,7 +140,8 @@ TOOL_IMPORTS = {
140
140
  "sequence": lambda: _import_tool("quantalogic.tools.utilities", "SequenceTool"),
141
141
  "csv_processor": lambda: _import_tool("quantalogic.tools.utilities", "CSVProcessorTool"),
142
142
  "mermaid_validator_tool": lambda: _import_tool("quantalogic.tools.utilities", "MermaidValidatorTool"),
143
- "download_file_tool": lambda: _import_tool("quantalogic.tools.download_file_tool", "PrepareDownloadTool"),
143
+ "download_file_tool": lambda: _import_tool("quantalogic.tools.utilities", "PrepareDownloadTool"),
144
+ "vscode_server_tool": lambda: _import_tool("quantalogic.tools.utilities.vscode_tool", "VSCodeServerTool"),
144
145
  }
145
146
 
146
147
  def create_custom_agent(
@@ -175,61 +176,135 @@ def create_custom_agent(
175
176
  # Create event emitter
176
177
  event_emitter = EventEmitter()
177
178
 
178
- # Define tool configurations using create_tool_instance for proper instantiation
179
+ def get_llm_params(params: dict) -> dict:
180
+ """Get common parameters for LLM-based tools."""
181
+ return {
182
+ "model_name": params.get("model_name", model_name),
183
+ "on_token": console_print_token if not no_stream else None,
184
+ "event_emitter": event_emitter
185
+ }
186
+
187
+ # Define tool configurations with default parameters
179
188
  tool_configs = {
180
- "llm": lambda params: create_tool_instance(TOOL_IMPORTS["llm"](), **params),
181
- "llm_vision": lambda params: create_tool_instance(TOOL_IMPORTS["llm_vision"](), **params) if vision_model_name else None,
182
- "llm_image_generation": lambda params: create_tool_instance(TOOL_IMPORTS["llm_image_generation"](), **params),
183
- "download_http_file": lambda params: create_tool_instance(TOOL_IMPORTS["download_http_file"](), **params),
184
- "duck_duck_go_search": lambda params: create_tool_instance(TOOL_IMPORTS["duck_duck_go_search"](), **params),
185
- "write_file": lambda params: create_tool_instance(TOOL_IMPORTS["write_file"](), **params),
186
- "task_complete": lambda params: create_tool_instance(TOOL_IMPORTS["task_complete"](), **params),
187
- "edit_whole_content": lambda params: create_tool_instance(TOOL_IMPORTS["edit_whole_content"](), name="edit_whole_content", **params),
188
- "execute_bash_command": lambda params: create_tool_instance(TOOL_IMPORTS["execute_bash_command"](), name="execute_bash_command", **params),
189
- "input_question": lambda params: create_tool_instance(TOOL_IMPORTS["input_question"](), name="input_question", **params),
190
- "list_directory": lambda params: create_tool_instance(TOOL_IMPORTS["list_directory"](), name="list_directory", **params),
191
- "markitdown": lambda params: create_tool_instance(TOOL_IMPORTS["markitdown"](), name="markitdown", **params),
192
- "nodejs": lambda params: create_tool_instance(TOOL_IMPORTS["nodejs"](), name="nodejs", **params),
193
- "python": lambda params: create_tool_instance(TOOL_IMPORTS["python"](), name="python", **params),
194
- "read_file_block": lambda params: create_tool_instance(TOOL_IMPORTS["read_file_block"](), name="read_file_block", **params),
195
- "read_file": lambda params: create_tool_instance(TOOL_IMPORTS["read_file"](), name="read_file", **params),
196
- "read_html": lambda params: create_tool_instance(TOOL_IMPORTS["read_html"](), name="read_html", **params),
197
- "replace_in_file": lambda params: create_tool_instance(TOOL_IMPORTS["replace_in_file"](), name="replace_in_file", **params),
198
- "ripgrep": lambda params: create_tool_instance(TOOL_IMPORTS["ripgrep"](), name="ripgrep", **params),
199
- "safe_python_interpreter": lambda params: create_tool_instance(TOOL_IMPORTS["safe_python_interpreter"](), name="safe_python_interpreter", **params),
200
- "search_definition_names": lambda params: create_tool_instance(TOOL_IMPORTS["search_definition_names"](), name="search_definition_names", **params),
201
- "wikipedia_search": lambda params: create_tool_instance(TOOL_IMPORTS["wikipedia_search"](), name="wikipedia_search", **params),
202
- "google_news": lambda params: create_tool_instance(TOOL_IMPORTS["google_news"](), name="google_news", **params),
203
- "presentation_llm": lambda params: create_tool_instance(TOOL_IMPORTS["presentation_llm"](), name="presentation_llm", **params),
204
- "sequence": lambda params: create_tool_instance(TOOL_IMPORTS["sequence"](), name="sequence", **params),
205
- "sql_query": lambda params: create_tool_instance(TOOL_IMPORTS["sql_query"](), name="sql_query", **params),
206
- "sql_query_advanced": lambda params: create_tool_instance(TOOL_IMPORTS["sql_query_advanced"](), name="sql_query_advanced", **params),
207
- "clone_repo_tool": lambda params: create_tool_instance(TOOL_IMPORTS["clone_repo_tool"](), name="clone_repo_tool", **params),
208
- "bitbucket_clone_repo_tool": lambda params: create_tool_instance(TOOL_IMPORTS["bitbucket_clone_repo_tool"](), name="bitbucket_clone_repo_tool", **params),
209
- "bitbucket_operations_tool": lambda params: create_tool_instance(TOOL_IMPORTS["bitbucket_operations_tool"](), name="bitbucket_operations_tool", **params),
210
- "git_operations_tool": lambda params: create_tool_instance(TOOL_IMPORTS["git_operations_tool"](), name="git_operations_tool", **params),
211
- "markdown_to_pdf": lambda params: create_tool_instance(TOOL_IMPORTS["markdown_to_pdf"](), name="markdown_to_pdf", **params),
212
- "markdown_to_pptx": lambda params: create_tool_instance(TOOL_IMPORTS["markdown_to_pptx"](), name="markdown_to_pptx", **params),
213
- "markdown_to_html": lambda params: create_tool_instance(TOOL_IMPORTS["markdown_to_html"](), name="markdown_to_html", **params),
214
- "markdown_to_epub": lambda params: create_tool_instance(TOOL_IMPORTS["markdown_to_epub"](), name="markdown_to_epub", **params),
215
- "markdown_to_ipynb": lambda params: create_tool_instance(TOOL_IMPORTS["markdown_to_ipynb"](), name="markdown_to_ipynb", **params),
216
- "markdown_to_latex": lambda params: create_tool_instance(TOOL_IMPORTS["markdown_to_latex"](), name="markdown_to_latex", **params),
217
- "markdown_to_docx": lambda params: create_tool_instance(TOOL_IMPORTS["markdown_to_docx"](), name="markdown_to_docx", **params),
218
- "csv_processor": lambda params: create_tool_instance(TOOL_IMPORTS["csv_processor"](), name="csv_processor", **params),
219
- "mermaid_validator_tool": lambda params: create_tool_instance(TOOL_IMPORTS["mermaid_validator_tool"](), name="mermaid_validator_tool", **params),
220
- "download_file_tool": lambda params: create_tool_instance(TOOL_IMPORTS["download_file_tool"](), name="download_file_tool", **params),
221
- "email_tool": lambda params: create_tool_instance(TOOL_IMPORTS["email_tool"](), name="email_tool", **params),
222
- "callendar_tool": lambda params: create_tool_instance(TOOL_IMPORTS["callendar_tool"](), name="callendar_tool", **params),
223
- "weather_tool": lambda params: create_tool_instance(TOOL_IMPORTS["weather_tool"](), name="weather_tool", **params),
224
- "nasa_neows_tool": lambda params: create_tool_instance(TOOL_IMPORTS["nasa_neows_tool"](), name="nasa_neows_tool", **params),
225
- "nasa_apod_tool": lambda params: create_tool_instance(TOOL_IMPORTS["nasa_apod_tool"](), name="nasa_apod_tool", **params),
226
- "product_hunt_tool": lambda params: create_tool_instance(TOOL_IMPORTS["product_hunt_tool"](), name="product_hunt_tool", **params),
227
- "rag_tool": lambda params: create_tool_instance(TOOL_IMPORTS["rag_tool"](), name="rag_tool", **params),
189
+ # LLM Tools with shared parameters
190
+ "llm": lambda params: create_tool_instance(TOOL_IMPORTS["llm"](), **get_llm_params(params)),
191
+ "llm_vision": lambda params: create_tool_instance(TOOL_IMPORTS["llm_vision"](),
192
+ model_name=params.get("vision_model_name") or vision_model_name,
193
+ on_token=console_print_token if not no_stream else None,
194
+ event_emitter=event_emitter
195
+ ) if vision_model_name else None,
196
+ "llm_image_generation": lambda params: create_tool_instance(TOOL_IMPORTS["llm_image_generation"](),
197
+ provider="dall-e",
198
+ model_name="openai/dall-e-3",
199
+ on_token=console_print_token if not no_stream else None
200
+ ),
201
+
202
+ # Simple tools without parameters
203
+ "download_http_file": lambda _: create_tool_instance(TOOL_IMPORTS["download_http_file"]()),
204
+ "duck_duck_go_search": lambda _: create_tool_instance(TOOL_IMPORTS["duck_duck_go_search"]()),
205
+ "write_file": lambda _: create_tool_instance(TOOL_IMPORTS["write_file"]()),
206
+ "task_complete": lambda _: create_tool_instance(TOOL_IMPORTS["task_complete"]()),
207
+ "edit_whole_content": lambda _: create_tool_instance(TOOL_IMPORTS["edit_whole_content"]()),
208
+ "execute_bash_command": lambda _: create_tool_instance(TOOL_IMPORTS["execute_bash_command"]()),
209
+ "input_question": lambda _: create_tool_instance(TOOL_IMPORTS["input_question"]()),
210
+ "list_directory": lambda _: create_tool_instance(TOOL_IMPORTS["list_directory"]()),
211
+ "markitdown": lambda _: create_tool_instance(TOOL_IMPORTS["markitdown"]()),
212
+ "nodejs": lambda _: create_tool_instance(TOOL_IMPORTS["nodejs"]()),
213
+ "python": lambda _: create_tool_instance(TOOL_IMPORTS["python"]()),
214
+ "read_file_block": lambda _: create_tool_instance(TOOL_IMPORTS["read_file_block"]()),
215
+ "read_file": lambda _: create_tool_instance(TOOL_IMPORTS["read_file"]()),
216
+ "read_html": lambda _: create_tool_instance(TOOL_IMPORTS["read_html"]()),
217
+ "replace_in_file": lambda _: create_tool_instance(TOOL_IMPORTS["replace_in_file"]()),
218
+ "ripgrep": lambda _: create_tool_instance(TOOL_IMPORTS["ripgrep"]()),
219
+ "search_definition_names": lambda _: create_tool_instance(TOOL_IMPORTS["search_definition_names"]()),
220
+ "wikipedia_search": lambda _: create_tool_instance(TOOL_IMPORTS["wikipedia_search"]()),
221
+ "google_news": lambda _: create_tool_instance(TOOL_IMPORTS["google_news"]()),
222
+
223
+ # Tools with specific configurations
224
+ "safe_python_interpreter": lambda _: create_tool_instance(TOOL_IMPORTS["safe_python_interpreter"](),
225
+ allowed_modules=["math", "numpy", "pandas", "datetime", "random", "statistics", "decimal"]
226
+ ),
227
+
228
+ # LLM-based tools with additional parameters
229
+ "presentation_llm": lambda params: create_tool_instance(TOOL_IMPORTS["presentation_llm"](),
230
+ **get_llm_params(params),
231
+ additional_info=params.get("additional_info", "")
232
+ ),
233
+ "sequence": lambda params: create_tool_instance(TOOL_IMPORTS["sequence"](),
234
+ **get_llm_params(params)
235
+ ),
236
+
237
+ # Database tools
238
+ "sql_query": lambda params: create_tool_instance(TOOL_IMPORTS["sql_query"](),
239
+ **get_llm_params(params),
240
+ connection_string=params.get("connection_string", "")
241
+ ),
242
+ "sql_query_advanced": lambda params: create_tool_instance(TOOL_IMPORTS["sql_query_advanced"](),
243
+ **get_llm_params(params),
244
+ connection_string=params.get("connection_string", "")
245
+ ),
246
+
247
+ # Git tools
248
+ "clone_repo_tool": lambda params: create_tool_instance(TOOL_IMPORTS["clone_repo_tool"](),
249
+ auth_token=params.get("auth_token", "")
250
+ ),
251
+ "bitbucket_clone_repo_tool": lambda params: create_tool_instance(TOOL_IMPORTS["bitbucket_clone_repo_tool"](),
252
+ access_token=params.get("access_token", "")
253
+ ),
254
+ "bitbucket_operations_tool": lambda params: create_tool_instance(TOOL_IMPORTS["bitbucket_operations_tool"](),
255
+ access_token=params.get("access_token", "")
256
+ ),
257
+ "git_operations_tool": lambda params: create_tool_instance(TOOL_IMPORTS["git_operations_tool"](),
258
+ auth_token=params.get("auth_token", "")
259
+ ),
260
+
261
+ # Document conversion tools
262
+ "markdown_to_pdf": lambda _: create_tool_instance(TOOL_IMPORTS["markdown_to_pdf"]()),
263
+ "markdown_to_pptx": lambda _: create_tool_instance(TOOL_IMPORTS["markdown_to_pptx"]()),
264
+ "markdown_to_html": lambda _: create_tool_instance(TOOL_IMPORTS["markdown_to_html"]()),
265
+ "markdown_to_epub": lambda _: create_tool_instance(TOOL_IMPORTS["markdown_to_epub"]()),
266
+ "markdown_to_ipynb": lambda _: create_tool_instance(TOOL_IMPORTS["markdown_to_ipynb"]()),
267
+ "markdown_to_latex": lambda _: create_tool_instance(TOOL_IMPORTS["markdown_to_latex"]()),
268
+ "markdown_to_docx": lambda _: create_tool_instance(TOOL_IMPORTS["markdown_to_docx"]()),
269
+
270
+ # Utility tools
271
+ "csv_processor": lambda _: create_tool_instance(TOOL_IMPORTS["csv_processor"]()),
272
+ "mermaid_validator_tool": lambda _: create_tool_instance(TOOL_IMPORTS["mermaid_validator_tool"]()),
273
+ "download_file_tool": lambda _: create_tool_instance(TOOL_IMPORTS["download_file_tool"]()),
274
+
275
+ # Composio tools
276
+ "email_tool": lambda _: create_tool_instance(TOOL_IMPORTS["email_tool"](),
277
+ action="GMAIL_SEND_EMAIL",
278
+ name="email_tool",
279
+ description="Send emails via Gmail",
280
+ need_validation=False
281
+ ),
282
+ "callendar_tool": lambda _: create_tool_instance(TOOL_IMPORTS["callendar_tool"](),
283
+ action="GOOGLECALENDAR_CREATE_EVENT",
284
+ name="callendar_tool",
285
+ description="Create events in Google Calendar",
286
+ need_validation=False
287
+ ),
288
+ "weather_tool": lambda _: create_tool_instance(TOOL_IMPORTS["weather_tool"](),
289
+ action="WEATHERMAP_WEATHER",
290
+ name="weather_tool",
291
+ description="Get weather information for a location"
292
+ ),
293
+
294
+ # NASA tools
295
+ "nasa_neows_tool": lambda _: create_tool_instance(TOOL_IMPORTS["nasa_neows_tool"]()),
296
+ "nasa_apod_tool": lambda _: create_tool_instance(TOOL_IMPORTS["nasa_apod_tool"]()),
297
+ "product_hunt_tool": lambda _: create_tool_instance(TOOL_IMPORTS["product_hunt_tool"]()),
298
+
299
+ # RAG tool
300
+ "rag_tool": lambda params: create_tool_instance(TOOL_IMPORTS["rag_tool"](),
301
+ vector_store=params.get("vector_store", "chroma"),
302
+ embedding_model=params.get("embedding_model", "openai"),
303
+ persist_dir=storage_dir,
304
+ document_paths=params.get("document_paths", [])
305
+ ),
228
306
 
229
- # Special handling for Composio tools
230
- "email_tool": lambda params: create_tool_instance(TOOL_IMPORTS["email_tool"](), action="EMAIL", name="email_tool", **params),
231
- "callendar_tool": lambda params: create_tool_instance(TOOL_IMPORTS["callendar_tool"](), action="CALLENDAR", name="callendar_tool", **params),
232
- "weather_tool": lambda params: create_tool_instance(TOOL_IMPORTS["weather_tool"](), action="WEATHER", name="weather_tool", **params),
307
+ "vscode_server_tool": lambda _: create_tool_instance(TOOL_IMPORTS["vscode_server_tool"]())
233
308
  }
234
309
 
235
310
  # Log available tool types before processing
@@ -1,6 +1,7 @@
1
1
  #!/usr/bin/env python
2
2
  """FastAPI server for the QuantaLogic agent."""
3
3
 
4
+ # Standard library imports
4
5
  import asyncio
5
6
  import functools
6
7
  import json
@@ -14,6 +15,7 @@ from queue import Empty, Queue
14
15
  from threading import Lock
15
16
  from typing import Any, AsyncGenerator, Dict, List, Optional
16
17
 
18
+ # Third-party imports
17
19
  import uvicorn
18
20
  from fastapi import FastAPI, HTTPException, Request
19
21
  from fastapi.middleware.cors import CORSMiddleware
@@ -24,11 +26,12 @@ from loguru import logger
24
26
  from pydantic import BaseModel
25
27
  from rich.console import Console
26
28
 
29
+ # Local imports
27
30
  from quantalogic.agent_config import (
28
31
  MODEL_NAME,
29
32
  create_agent,
30
- create_coding_agent, # noqa: F401
31
33
  create_basic_agent, # noqa: F401
34
+ create_coding_agent, # noqa: F401
32
35
  )
33
36
  from quantalogic.console_print_events import console_print_events
34
37
 
@@ -282,9 +285,21 @@ class AgentState:
282
285
  logger.error(f"Failed to initialize agent: {e}", exc_info=True)
283
286
  raise
284
287
 
285
- async def sse_ask_for_user_validation(self, question: str = "Do you want to continue?") -> bool:
286
- """SSE-based user validation method."""
287
- validation_id = str(uuid.uuid4())
288
+ async def sse_ask_for_user_validation(self, question="Do you want to continue?", validation_id=None) -> bool:
289
+ """
290
+ SSE-based user validation method.
291
+
292
+ Args:
293
+ question: The validation question to ask
294
+ validation_id: Optional ID for tracking validation requests
295
+
296
+ Returns:
297
+ bool: True if the user validates, False otherwise.
298
+ """
299
+ # Ensure we have a validation_id
300
+ if validation_id is None:
301
+ validation_id = str(uuid.uuid4())
302
+
288
303
  response_queue = asyncio.Queue()
289
304
 
290
305
  # Store validation request and response queue