autobyteus 1.2.1__py3-none-any.whl → 1.2.3__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.
Files changed (466) hide show
  1. autobyteus/agent/agent.py +15 -5
  2. autobyteus/agent/bootstrap_steps/__init__.py +1 -3
  3. autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
  4. autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
  5. autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
  6. autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
  7. autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
  8. autobyteus/agent/context/agent_config.py +43 -20
  9. autobyteus/agent/context/agent_context.py +23 -18
  10. autobyteus/agent/context/agent_runtime_state.py +19 -19
  11. autobyteus/agent/events/__init__.py +16 -1
  12. autobyteus/agent/events/agent_events.py +43 -3
  13. autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
  14. autobyteus/agent/events/event_store.py +57 -0
  15. autobyteus/agent/events/notifiers.py +69 -59
  16. autobyteus/agent/events/worker_event_dispatcher.py +21 -64
  17. autobyteus/agent/factory/agent_factory.py +52 -0
  18. autobyteus/agent/handlers/__init__.py +2 -0
  19. autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
  20. autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
  21. autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
  22. autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
  23. autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
  24. autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
  25. autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
  26. autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
  27. autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
  28. autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
  29. autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
  30. autobyteus/agent/lifecycle/__init__.py +12 -0
  31. autobyteus/agent/lifecycle/base_processor.py +109 -0
  32. autobyteus/agent/lifecycle/events.py +35 -0
  33. autobyteus/agent/lifecycle/processor_definition.py +36 -0
  34. autobyteus/agent/lifecycle/processor_registry.py +106 -0
  35. autobyteus/agent/llm_request_assembler.py +98 -0
  36. autobyteus/agent/llm_response_processor/__init__.py +1 -8
  37. autobyteus/agent/message/context_file_type.py +1 -1
  38. autobyteus/agent/runtime/agent_runtime.py +29 -21
  39. autobyteus/agent/runtime/agent_worker.py +98 -19
  40. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  41. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  42. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  43. autobyteus/agent/status/__init__.py +14 -0
  44. autobyteus/agent/status/manager.py +93 -0
  45. autobyteus/agent/status/status_deriver.py +96 -0
  46. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  47. autobyteus/agent/status/status_update_utils.py +73 -0
  48. autobyteus/agent/streaming/__init__.py +52 -5
  49. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  50. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  51. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  52. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  53. autobyteus/agent/streaming/agent_event_stream.py +3 -183
  54. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  55. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  56. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  57. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  58. autobyteus/agent/streaming/events/__init__.py +6 -0
  59. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  60. autobyteus/agent/streaming/events/stream_events.py +141 -0
  61. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  62. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  63. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  64. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  66. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  67. autobyteus/agent/streaming/parser/__init__.py +61 -0
  68. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  69. autobyteus/agent/streaming/parser/events.py +4 -0
  70. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  71. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  77. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  78. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  79. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  80. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  81. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  82. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  83. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  85. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  86. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  87. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  88. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  90. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  91. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  92. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  93. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  94. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  95. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  96. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  97. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  98. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  99. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  100. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  101. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  102. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  103. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  104. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  105. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  106. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  107. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  108. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  109. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/queue_streamer.py +3 -57
  111. autobyteus/agent/streaming/segments/__init__.py +5 -0
  112. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  113. autobyteus/agent/streaming/stream_event_payloads.py +2 -223
  114. autobyteus/agent/streaming/stream_events.py +3 -140
  115. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  116. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  117. autobyteus/agent/streaming/streams/__init__.py +5 -0
  118. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  119. autobyteus/agent/streaming/utils/__init__.py +5 -0
  120. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  121. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  122. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  123. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  124. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  125. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  126. autobyteus/agent/token_budget.py +56 -0
  127. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  128. autobyteus/agent/tool_invocation.py +16 -40
  129. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  130. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  131. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  134. autobyteus/agent/utils/wait_for_idle.py +12 -14
  135. autobyteus/agent/workspace/base_workspace.py +6 -27
  136. autobyteus/agent_team/agent_team.py +3 -3
  137. autobyteus/agent_team/agent_team_builder.py +1 -41
  138. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  139. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  140. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  141. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  142. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
  145. autobyteus/agent_team/context/agent_team_config.py +6 -3
  146. autobyteus/agent_team/context/agent_team_context.py +25 -3
  147. autobyteus/agent_team/context/agent_team_runtime_state.py +9 -6
  148. autobyteus/agent_team/events/__init__.py +11 -0
  149. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  150. autobyteus/agent_team/events/agent_team_events.py +16 -0
  151. autobyteus/agent_team/events/event_store.py +57 -0
  152. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  153. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  154. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  155. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  156. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  157. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  158. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  159. autobyteus/agent_team/status/__init__.py +14 -0
  160. autobyteus/agent_team/status/agent_team_status.py +18 -0
  161. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  162. autobyteus/agent_team/status/status_deriver.py +62 -0
  163. autobyteus/agent_team/status/status_update_utils.py +42 -0
  164. autobyteus/agent_team/streaming/__init__.py +2 -2
  165. autobyteus/agent_team/streaming/agent_team_event_notifier.py +6 -6
  166. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
  167. autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
  168. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  169. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  170. autobyteus/agent_team/task_notification/task_notification_mode.py +19 -0
  171. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  172. autobyteus/cli/agent_cli.py +18 -10
  173. autobyteus/cli/agent_team_tui/app.py +14 -11
  174. autobyteus/cli/agent_team_tui/state.py +13 -15
  175. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  176. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
  177. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  178. autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
  179. autobyteus/cli/cli_display.py +193 -44
  180. autobyteus/cli/workflow_tui/app.py +9 -10
  181. autobyteus/cli/workflow_tui/state.py +14 -16
  182. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  183. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  184. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  185. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  186. autobyteus/clients/autobyteus_client.py +94 -1
  187. autobyteus/events/event_types.py +11 -18
  188. autobyteus/llm/api/autobyteus_llm.py +33 -29
  189. autobyteus/llm/api/claude_llm.py +142 -36
  190. autobyteus/llm/api/gemini_llm.py +163 -59
  191. autobyteus/llm/api/grok_llm.py +1 -1
  192. autobyteus/llm/api/minimax_llm.py +26 -0
  193. autobyteus/llm/api/mistral_llm.py +113 -87
  194. autobyteus/llm/api/ollama_llm.py +9 -42
  195. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  196. autobyteus/llm/api/openai_llm.py +3 -3
  197. autobyteus/llm/api/openai_responses_llm.py +324 -0
  198. autobyteus/llm/api/zhipu_llm.py +21 -2
  199. autobyteus/llm/autobyteus_provider.py +70 -60
  200. autobyteus/llm/base_llm.py +85 -81
  201. autobyteus/llm/converters/__init__.py +14 -0
  202. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  203. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  204. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  205. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  206. autobyteus/llm/extensions/base_extension.py +6 -12
  207. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  208. autobyteus/llm/llm_factory.py +282 -204
  209. autobyteus/llm/lmstudio_provider.py +60 -49
  210. autobyteus/llm/models.py +35 -2
  211. autobyteus/llm/ollama_provider.py +60 -49
  212. autobyteus/llm/ollama_provider_resolver.py +0 -1
  213. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  214. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  215. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  216. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  217. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  218. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  219. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  220. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  221. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  222. autobyteus/llm/providers.py +1 -3
  223. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  224. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  225. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  226. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  227. autobyteus/llm/utils/llm_config.py +6 -12
  228. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  229. autobyteus/llm/utils/messages.py +55 -3
  230. autobyteus/llm/utils/response_types.py +3 -0
  231. autobyteus/llm/utils/tool_call_delta.py +31 -0
  232. autobyteus/memory/__init__.py +32 -0
  233. autobyteus/memory/active_transcript.py +69 -0
  234. autobyteus/memory/compaction/__init__.py +9 -0
  235. autobyteus/memory/compaction/compaction_result.py +8 -0
  236. autobyteus/memory/compaction/compactor.py +89 -0
  237. autobyteus/memory/compaction/summarizer.py +11 -0
  238. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  239. autobyteus/memory/memory_manager.py +183 -0
  240. autobyteus/memory/models/__init__.py +14 -0
  241. autobyteus/memory/models/episodic_item.py +41 -0
  242. autobyteus/memory/models/memory_types.py +7 -0
  243. autobyteus/memory/models/raw_trace_item.py +79 -0
  244. autobyteus/memory/models/semantic_item.py +41 -0
  245. autobyteus/memory/models/tool_interaction.py +20 -0
  246. autobyteus/memory/policies/__init__.py +5 -0
  247. autobyteus/memory/policies/compaction_policy.py +16 -0
  248. autobyteus/memory/retrieval/__init__.py +7 -0
  249. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  250. autobyteus/memory/retrieval/retriever.py +13 -0
  251. autobyteus/memory/store/__init__.py +7 -0
  252. autobyteus/memory/store/base_store.py +14 -0
  253. autobyteus/memory/store/file_store.py +98 -0
  254. autobyteus/memory/tool_interaction_builder.py +46 -0
  255. autobyteus/memory/turn_tracker.py +9 -0
  256. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  257. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  258. autobyteus/multimedia/audio/audio_client_factory.py +47 -9
  259. autobyteus/multimedia/audio/audio_model.py +2 -1
  260. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  261. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  262. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  263. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  264. autobyteus/multimedia/image/image_client_factory.py +47 -15
  265. autobyteus/multimedia/image/image_model.py +5 -2
  266. autobyteus/multimedia/providers.py +3 -2
  267. autobyteus/skills/loader.py +71 -0
  268. autobyteus/skills/model.py +11 -0
  269. autobyteus/skills/registry.py +70 -0
  270. autobyteus/task_management/tools/todo_tools/add_todo.py +2 -2
  271. autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
  272. autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
  273. autobyteus/tools/__init__.py +34 -47
  274. autobyteus/tools/base_tool.py +7 -0
  275. autobyteus/tools/file/__init__.py +2 -6
  276. autobyteus/tools/file/patch_file.py +149 -0
  277. autobyteus/tools/file/read_file.py +36 -5
  278. autobyteus/tools/file/write_file.py +4 -1
  279. autobyteus/tools/functional_tool.py +43 -6
  280. autobyteus/tools/mcp/__init__.py +2 -0
  281. autobyteus/tools/mcp/config_service.py +5 -1
  282. autobyteus/tools/mcp/server/__init__.py +2 -0
  283. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  284. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  285. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  286. autobyteus/tools/mcp/types.py +61 -0
  287. autobyteus/tools/multimedia/audio_tools.py +70 -17
  288. autobyteus/tools/multimedia/download_media_tool.py +18 -4
  289. autobyteus/tools/multimedia/image_tools.py +246 -62
  290. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  291. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  292. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  293. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  294. autobyteus/tools/registry/tool_definition.py +43 -2
  295. autobyteus/tools/skill/load_skill.py +50 -0
  296. autobyteus/tools/terminal/__init__.py +45 -0
  297. autobyteus/tools/terminal/ansi_utils.py +32 -0
  298. autobyteus/tools/terminal/background_process_manager.py +233 -0
  299. autobyteus/tools/terminal/output_buffer.py +105 -0
  300. autobyteus/tools/terminal/prompt_detector.py +63 -0
  301. autobyteus/tools/terminal/pty_session.py +241 -0
  302. autobyteus/tools/terminal/session_factory.py +20 -0
  303. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  304. autobyteus/tools/terminal/tools/__init__.py +13 -0
  305. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  306. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  307. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  308. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  309. autobyteus/tools/terminal/types.py +54 -0
  310. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  311. autobyteus/tools/terminal/wsl_utils.py +156 -0
  312. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  313. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  314. autobyteus/tools/usage/__init__.py +1 -2
  315. autobyteus/tools/usage/formatters/__init__.py +17 -1
  316. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  317. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  318. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  319. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  320. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  321. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  322. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  323. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  324. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  325. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  326. autobyteus/tools/usage/registries/__init__.py +1 -3
  327. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  328. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  329. autobyteus/tools/web/__init__.py +4 -0
  330. autobyteus/tools/web/read_url_tool.py +80 -0
  331. autobyteus/utils/diff_utils.py +271 -0
  332. autobyteus/utils/download_utils.py +109 -0
  333. autobyteus/utils/file_utils.py +57 -2
  334. autobyteus/utils/gemini_helper.py +56 -0
  335. autobyteus/utils/gemini_model_mapping.py +71 -0
  336. autobyteus/utils/llm_output_formatter.py +75 -0
  337. autobyteus/utils/tool_call_format.py +36 -0
  338. autobyteus/workflow/agentic_workflow.py +3 -3
  339. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  340. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  341. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  342. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
  343. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  344. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  345. autobyteus/workflow/context/workflow_context.py +3 -3
  346. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  347. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  348. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  349. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  350. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  351. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  352. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  353. autobyteus/workflow/status/__init__.py +11 -0
  354. autobyteus/workflow/status/workflow_status.py +19 -0
  355. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  356. autobyteus/workflow/streaming/__init__.py +2 -2
  357. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  358. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  359. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  360. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  361. autobyteus-1.2.3.dist-info/METADATA +293 -0
  362. autobyteus-1.2.3.dist-info/RECORD +600 -0
  363. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  364. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  365. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  366. autobyteus/agent/hooks/__init__.py +0 -16
  367. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  368. autobyteus/agent/hooks/hook_definition.py +0 -36
  369. autobyteus/agent/hooks/hook_meta.py +0 -37
  370. autobyteus/agent/hooks/hook_registry.py +0 -106
  371. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  372. autobyteus/agent/phases/__init__.py +0 -18
  373. autobyteus/agent/phases/discover.py +0 -53
  374. autobyteus/agent/phases/manager.py +0 -265
  375. autobyteus/agent/phases/transition_decorator.py +0 -40
  376. autobyteus/agent/phases/transition_info.py +0 -33
  377. autobyteus/agent/remote_agent.py +0 -244
  378. autobyteus/agent/workspace/workspace_definition.py +0 -36
  379. autobyteus/agent/workspace/workspace_meta.py +0 -37
  380. autobyteus/agent/workspace/workspace_registry.py +0 -72
  381. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  382. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  383. autobyteus/agent_team/phases/__init__.py +0 -11
  384. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  385. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  386. autobyteus/llm/api/bedrock_llm.py +0 -92
  387. autobyteus/llm/api/groq_llm.py +0 -94
  388. autobyteus/llm/api/nvidia_llm.py +0 -108
  389. autobyteus/llm/utils/token_pricing_config.py +0 -87
  390. autobyteus/rpc/__init__.py +0 -73
  391. autobyteus/rpc/client/__init__.py +0 -17
  392. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  393. autobyteus/rpc/client/client_connection_manager.py +0 -153
  394. autobyteus/rpc/client/sse_client_connection.py +0 -306
  395. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  396. autobyteus/rpc/config/__init__.py +0 -13
  397. autobyteus/rpc/config/agent_server_config.py +0 -153
  398. autobyteus/rpc/config/agent_server_registry.py +0 -152
  399. autobyteus/rpc/hosting.py +0 -244
  400. autobyteus/rpc/protocol.py +0 -244
  401. autobyteus/rpc/server/__init__.py +0 -20
  402. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  403. autobyteus/rpc/server/base_method_handler.py +0 -40
  404. autobyteus/rpc/server/method_handlers.py +0 -259
  405. autobyteus/rpc/server/sse_server_handler.py +0 -182
  406. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  407. autobyteus/rpc/server_main.py +0 -198
  408. autobyteus/rpc/transport_type.py +0 -13
  409. autobyteus/tools/bash/__init__.py +0 -2
  410. autobyteus/tools/bash/bash_executor.py +0 -100
  411. autobyteus/tools/browser/__init__.py +0 -2
  412. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  413. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  414. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  415. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  416. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  417. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  418. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  419. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  420. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  421. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  422. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  423. autobyteus/tools/browser/standalone/__init__.py +0 -6
  424. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  425. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  426. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  427. autobyteus/tools/browser/standalone/navigate_to.py +0 -84
  428. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
  429. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
  430. autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
  431. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
  432. autobyteus/tools/file/edit_file.py +0 -200
  433. autobyteus/tools/file/list_directory.py +0 -168
  434. autobyteus/tools/file/search_files.py +0 -188
  435. autobyteus/tools/timer.py +0 -175
  436. autobyteus/tools/usage/parsers/__init__.py +0 -22
  437. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  438. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  439. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  440. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  441. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  442. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  443. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  444. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  445. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  446. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  447. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  448. autobyteus/workflow/phases/__init__.py +0 -11
  449. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  450. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  451. autobyteus-1.2.1.dist-info/METADATA +0 -205
  452. autobyteus-1.2.1.dist-info/RECORD +0 -511
  453. examples/__init__.py +0 -1
  454. examples/agent_team/__init__.py +0 -1
  455. examples/discover_phase_transitions.py +0 -104
  456. examples/run_agentic_software_engineer.py +0 -239
  457. examples/run_browser_agent.py +0 -262
  458. examples/run_google_slides_agent.py +0 -287
  459. examples/run_mcp_browser_client.py +0 -174
  460. examples/run_mcp_google_slides_client.py +0 -270
  461. examples/run_mcp_list_tools.py +0 -189
  462. examples/run_poem_writer.py +0 -284
  463. examples/run_sqlite_agent.py +0 -295
  464. /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
  465. /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
  466. {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -1,270 +0,0 @@
1
- import asyncio
2
- import logging
3
- import sys
4
- import os
5
- import json
6
- import argparse
7
- from pathlib import Path
8
- from datetime import datetime
9
- from typing import AsyncIterator, Optional, List
10
-
11
- # --- Boilerplate to make the script runnable from the project root ---
12
-
13
- # Ensure the autobyteus package is discoverable
14
- SCRIPT_DIR = Path(__file__).resolve().parent
15
- PACKAGE_ROOT = SCRIPT_DIR.parent
16
- if str(PACKAGE_ROOT) not in sys.path:
17
- sys.path.insert(0, str(PACKAGE_ROOT))
18
-
19
- # Load environment variables from .env file in the project root
20
- try:
21
- from dotenv import load_dotenv
22
- env_file_path = PACKAGE_ROOT / ".env"
23
- if env_file_path.exists():
24
- load_dotenv(env_file_path)
25
- print(f"Loaded environment variables from: {env_file_path}")
26
- else:
27
- print(f"Info: No .env file found at: {env_file_path}. Relying on exported environment variables.")
28
- except ImportError:
29
- print("Warning: python-dotenv not installed. Cannot load .env file.")
30
-
31
- # --- Imports for the MCP Client Example ---
32
-
33
- try:
34
- # High-level components for the full workflow
35
- from autobyteus.tools.mcp import McpToolRegistrar
36
- from autobyteus.tools.registry import ToolRegistry, default_tool_registry, ToolDefinition
37
- from autobyteus.agent.context import AgentContext, AgentConfig, AgentRuntimeState
38
- from autobyteus.llm.base_llm import BaseLLM
39
- from autobyteus.llm.utils.response_types import CompleteResponse, ChunkResponse
40
- except ImportError as e:
41
- print(f"Error importing autobyteus components: {e}", file=sys.stderr)
42
- print("Please ensure that the autobyteus library is installed and accessible in your PYTHONPATH.", file=sys.stderr)
43
- sys.exit(1)
44
-
45
- # --- Basic Logging Setup ---
46
- # A logger for this script
47
- logger = logging.getLogger("mcp_client_example")
48
-
49
- # --- Dummy LLM for creating AgentContext ---
50
- class DummyLLM(BaseLLM):
51
- """A dummy LLM implementation required to instantiate AgentConfig."""
52
- def __init__(self):
53
- # We need to provide a model and config to the BaseLLM constructor.
54
- # Let's use a dummy model configuration.
55
- from autobyteus.llm.models import LLMModel
56
- from autobyteus.llm.utils.llm_config import LLMConfig
57
- from autobyteus.llm.llm_factory import default_llm_factory
58
-
59
- # Ensure factory is initialized to access models
60
- default_llm_factory.ensure_initialized()
61
-
62
- # Pick any existing model for the dummy, e.g., the first one available.
63
- try:
64
- # Iterating through LLMModel is now possible due to metaclass
65
- dummy_model_instance = next(iter(LLMModel))
66
- except StopIteration:
67
- # This is a fallback in case no models are registered, which is unlikely but safe.
68
- raise RuntimeError("No LLMModels are registered in the factory. Cannot create DummyLLM.")
69
-
70
- super().__init__(model=dummy_model_instance, llm_config=LLMConfig())
71
-
72
- def configure_system_prompt(self, system_prompt: str):
73
- # This is on BaseLLM. My no-op implementation is fine.
74
- super().configure_system_prompt(system_prompt)
75
-
76
- async def _send_user_message_to_llm(self, user_message: str, image_urls: Optional[List[str]] = None, **kwargs) -> CompleteResponse:
77
- """Dummy implementation for sending a message."""
78
- logger.debug("DummyLLM._send_user_message_to_llm called.")
79
- return CompleteResponse(content="This is a dummy response from a dummy LLM.", usage=None)
80
-
81
- async def _stream_user_message_to_llm(
82
- self, user_message: str, image_urls: Optional[List[str]] = None, **kwargs
83
- ) -> AsyncIterator[ChunkResponse]:
84
- """Dummy implementation for streaming a message."""
85
- logger.debug("DummyLLM._stream_user_message_to_llm called.")
86
- yield ChunkResponse(content="This is a dummy response from a dummy LLM.", is_complete=True, usage=None)
87
-
88
-
89
- def setup_logging(debug: bool = False):
90
- """Configures logging for the script."""
91
- log_level = logging.DEBUG if debug else logging.INFO
92
- root_logger = logging.getLogger()
93
- if root_logger.hasHandlers():
94
- for handler in root_logger.handlers[:]:
95
- root_logger.removeHandler(handler)
96
- logging.basicConfig(
97
- level=log_level,
98
- format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',
99
- stream=sys.stdout,
100
- )
101
- if debug:
102
- logging.getLogger("autobyteus").setLevel(logging.DEBUG)
103
- logger.info("Debug logging enabled.")
104
- else:
105
- logging.getLogger("autobyteus").setLevel(logging.INFO)
106
-
107
- # --- Environment Variable Checks ---
108
- def check_required_env_vars():
109
- """Checks for environment variables required by this example and returns them."""
110
- required_vars = {
111
- "script_path": "TEST_GOOGLE_SLIDES_MCP_SCRIPT_PATH",
112
- "google_client_id": "GOOGLE_CLIENT_ID",
113
- "google_client_secret": "GOOGLE_CLIENT_SECRET",
114
- "google_refresh_token": "GOOGLE_REFRESH_TOKEN",
115
- }
116
- env_values = {}
117
- missing_vars = []
118
- for key, var_name in required_vars.items():
119
- value = os.environ.get(var_name)
120
- if not value:
121
- missing_vars.append(var_name)
122
- else:
123
- env_values[key] = value
124
- if missing_vars:
125
- logger.error("This example requires the following environment variables to be set: %s", missing_vars)
126
- sys.exit(1)
127
- if not Path(env_values["script_path"]).exists():
128
- logger.error(f"The script path specified by TEST_GOOGLE_SLIDES_MCP_SCRIPT_PATH does not exist: {env_values['script_path']}")
129
- sys.exit(1)
130
- return env_values
131
-
132
- def print_tool_definitions(tool_definitions: List[ToolDefinition]):
133
- """Iterates through a list of tool definitions and prints their JSON schema."""
134
- print("\n--- Registered Tool Schemas (from ToolDefinition) ---")
135
- for tool_definition in sorted(tool_definitions, key=lambda d: d.name):
136
- try:
137
- tool_json_schema = tool_definition.get_usage_json()
138
- print(f"\n# Tool: {tool_definition.name}")
139
- print(json.dumps(tool_json_schema, indent=2))
140
- except Exception as e:
141
- print(f"\n# Tool: {tool_definition.name}")
142
- print(f" Error getting schema from definition: {e}")
143
- print("\n--------------------------------------------------------\n")
144
-
145
-
146
- async def main():
147
- """
148
- Main function demonstrating the full end-to-end MCP integration workflow.
149
- """
150
- logger.info("--- Starting MCP Integration Workflow Example ---")
151
-
152
- env_vars = check_required_env_vars()
153
-
154
- # 1. Instantiate the core MCP and registry components.
155
- tool_registry = default_tool_registry
156
- registrar = McpToolRegistrar()
157
-
158
- # 2. Define the configuration for the MCP server as a dictionary.
159
- server_id = "google-slides-mcp"
160
- google_slides_mcp_config_dict = {
161
- server_id: {
162
- "transport_type": "stdio",
163
- "stdio_params": {
164
- "command": "node",
165
- "args": [env_vars["script_path"]],
166
- "env": {
167
- "GOOGLE_CLIENT_ID": env_vars["google_client_id"],
168
- "GOOGLE_CLIENT_SECRET": env_vars["google_client_secret"],
169
- "GOOGLE_REFRESH_TOKEN": env_vars["google_refresh_token"],
170
- }
171
- },
172
- "enabled": True,
173
- "tool_name_prefix": "gslides",
174
- }
175
- }
176
-
177
- try:
178
- # 3. Discover and register tools by passing the config dictionary directly.
179
- logger.info(f"Performing targeted discovery for remote tools from server '{server_id}'...")
180
- await registrar.load_and_register_server(config_dict=google_slides_mcp_config_dict)
181
- # Use the ToolRegistry to get tools by their source server ID.
182
- registered_tool_defs = tool_registry.get_tools_by_mcp_server(server_id)
183
- logger.info(f"Tool registration complete. Discovered tools: {[t.name for t in registered_tool_defs]}")
184
-
185
- # 4. Create an instance of a specific tool using the ToolRegistry.
186
- create_tool_name = "gslides_create_presentation"
187
- summarize_tool_name = "gslides_summarize_presentation"
188
-
189
- if create_tool_name not in tool_registry.list_tool_names():
190
- logger.error(f"Tool '{create_tool_name}' was not found in the registry. Aborting.")
191
- return
192
-
193
- logger.info(f"Creating an instance of the '{create_tool_name}' tool from the registry...")
194
- create_presentation_tool = tool_registry.create_tool(create_tool_name)
195
-
196
- logger.info(f"Creating an instance of the '{summarize_tool_name}' tool from the registry...")
197
- summarize_presentation_tool = tool_registry.create_tool(summarize_tool_name)
198
-
199
- # 5. Execute the tool using its standard .execute() method.
200
- presentation_title = f"AutoByteUs E2E Demo - {datetime.now().isoformat()}"
201
- logger.info(f"Executing '{create_tool_name}' with title: '{presentation_title}'")
202
-
203
- dummy_llm = DummyLLM()
204
- dummy_config = AgentConfig(
205
- name="mcp_example_runner_agent",
206
- role="tool_runner",
207
- description="A dummy agent config for running tools outside of a full agent.",
208
- llm_instance=dummy_llm,
209
- system_prompt="N/A",
210
- tools=[]
211
- )
212
- dummy_state = AgentRuntimeState(agent_id="mcp_example_runner")
213
- dummy_context = AgentContext(agent_id="mcp_example_runner", config=dummy_config, state=dummy_state)
214
-
215
- create_result = await create_presentation_tool.execute(
216
- context=dummy_context,
217
- title=presentation_title
218
- )
219
-
220
- if not isinstance(create_result, str):
221
- raise ValueError(f"Unexpected result type from tool '{create_tool_name}'. Expected a JSON string. Got: {type(create_result)}")
222
-
223
- presentation_object = json.loads(create_result)
224
- actual_presentation_id = presentation_object.get("presentationId")
225
-
226
- if not actual_presentation_id:
227
- raise ValueError(f"Could not find 'presentationId' in the response. Response: {create_result[:200]}...")
228
-
229
- logger.info(f"Tool '{create_tool_name}' executed. Extracted Presentation ID: {actual_presentation_id}")
230
-
231
- # 6. Execute the second tool.
232
- logger.info(f"Executing '{summarize_tool_name}' for presentation ID: {actual_presentation_id}")
233
- summary_result = await summarize_presentation_tool.execute(
234
- context=dummy_context,
235
- presentationId=actual_presentation_id
236
- )
237
-
238
- if not isinstance(summary_result, str):
239
- raise ValueError(f"Unexpected result type from tool '{summarize_tool_name}'. Got: {type(summary_result)}")
240
-
241
- logger.info(f"Tool '{summarize_tool_name}' executed successfully.")
242
- print("\n--- Presentation Summary ---")
243
- print(summary_result)
244
- print("--------------------------\n")
245
-
246
- # 7. Print all tool schemas for verification
247
- print_tool_definitions(registered_tool_defs)
248
-
249
- except Exception as e:
250
- logger.error(f"An error occurred during the workflow: {e}", exc_info=True)
251
-
252
- logger.info("--- MCP Integration Workflow Example Finished ---")
253
-
254
-
255
- if __name__ == "__main__":
256
- parser = argparse.ArgumentParser(description="Run the full MCP registration and execution workflow.")
257
- parser.add_argument("--debug", action="store_true", help="Enable debug level logging on the console.")
258
- args = parser.parse_args()
259
-
260
- setup_logging(debug=args.debug)
261
-
262
- try:
263
- asyncio.run(main())
264
- except (KeyboardInterrupt, SystemExit) as e:
265
- if isinstance(e, SystemExit) and e.code == 0:
266
- logger.info("Script exited normally.")
267
- else:
268
- logger.info(f"Script interrupted ({type(e).__name__}). Exiting.")
269
- except Exception as e:
270
- logger.error(f"An unhandled error occurred at the top level: {e}", exc_info=True)
@@ -1,189 +0,0 @@
1
- # file: autobyteus/examples/run_mcp_list_tools.py
2
- """
3
- This example script demonstrates how to use the McpToolRegistrar to connect
4
- to a remote MCP server and list the available tools without registering or
5
- executing them.
6
-
7
- This is a "dry-run" or "preview" operation, useful for inspecting the
8
- capabilities of a remote MCP server.
9
- """
10
- import asyncio
11
- import logging
12
- import sys
13
- import os
14
- import json
15
- import argparse
16
- from pathlib import Path
17
- from typing import List
18
-
19
- # --- Boilerplate to make the script runnable from the project root ---
20
-
21
- # Ensure the autobyteus package is discoverable
22
- SCRIPT_DIR = Path(__file__).resolve().parent
23
- PACKAGE_ROOT = SCRIPT_DIR.parent
24
- if str(PACKAGE_ROOT) not in sys.path:
25
- sys.path.insert(0, str(PACKAGE_ROOT))
26
-
27
- # Load environment variables from .env file in the project root
28
- try:
29
- from dotenv import load_dotenv
30
- env_file_path = PACKAGE_ROOT / ".env"
31
- if env_file_path.exists():
32
- load_dotenv(env_file_path)
33
- print(f"Loaded environment variables from: {env_file_path}")
34
- else:
35
- print(f"Info: No .env file found at: {env_file_path}. Relying on exported environment variables.")
36
- except ImportError:
37
- print("Warning: python-dotenv not installed. Cannot load .env file.")
38
-
39
- # --- Imports for the MCP Client Example ---
40
-
41
- try:
42
- from autobyteus.tools.mcp import McpToolRegistrar
43
- from autobyteus.tools.registry import ToolDefinition
44
- except ImportError as e:
45
- print(f"Error importing autobyteus components: {e}", file=sys.stderr)
46
- print("Please ensure that the autobyteus library is installed and accessible in your PYTHONPATH.", file=sys.stderr)
47
- sys.exit(1)
48
-
49
- # --- Basic Logging Setup ---
50
- logger = logging.getLogger("mcp_list_tools_example")
51
-
52
- def setup_logging(debug: bool = False):
53
- """Configures logging for the script."""
54
- log_level = logging.DEBUG if debug else logging.INFO
55
- root_logger = logging.getLogger()
56
- if root_logger.hasHandlers():
57
- for handler in root_logger.handlers[:]:
58
- root_logger.removeHandler(handler)
59
- logging.basicConfig(
60
- level=log_level,
61
- format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',
62
- stream=sys.stdout,
63
- )
64
- if debug:
65
- logging.getLogger("autobyteus").setLevel(logging.DEBUG)
66
- logger.info("Debug logging enabled.")
67
- else:
68
- logging.getLogger("autobyteus").setLevel(logging.INFO)
69
-
70
- # --- Environment Variable Checks ---
71
- def check_required_env_vars():
72
- """Checks for environment variables required by the SQLite MCP server."""
73
- required_vars = {
74
- "script_path": "TEST_SQLITE_MCP_SCRIPT_PATH",
75
- "db_path": "TEST_SQLITE_DB_PATH",
76
- }
77
- env_values = {}
78
- missing_vars = []
79
- for key, var_name in required_vars.items():
80
- value = os.environ.get(var_name)
81
- if not value:
82
- missing_vars.append(var_name)
83
- else:
84
- env_values[key] = value
85
- if missing_vars:
86
- logger.error("This example requires the following environment variables to be set: %s", missing_vars)
87
- logger.error("Example usage in your .env file:")
88
- logger.error('TEST_SQLITE_MCP_SCRIPT_PATH="/path/to/mcp-database-server/dist/src/index.js"')
89
- logger.error('TEST_SQLITE_DB_PATH="/path/to/your/database.db"')
90
- sys.exit(1)
91
-
92
- script_path_obj = Path(env_values["script_path"])
93
- if not script_path_obj.exists():
94
- logger.error(f"The script path specified by TEST_SQLITE_MCP_SCRIPT_PATH does not exist: {script_path_obj}")
95
- sys.exit(1)
96
-
97
- db_path_obj = Path(env_values["db_path"])
98
- if not db_path_obj.exists():
99
- logger.error(f"The database path specified by TEST_SQLITE_DB_PATH does not exist: {db_path_obj}")
100
- logger.error("Please ensure the database file is created before running this script.")
101
- sys.exit(1)
102
-
103
- return env_values
104
-
105
- def print_tool_definitions(tool_definitions: List[ToolDefinition]):
106
- """Iterates through a list of tool definitions and prints their JSON schema."""
107
- print("\n--- Discovered Remote Tool Schemas (from ToolDefinition) ---")
108
- for tool_definition in sorted(tool_definitions, key=lambda d: d.name):
109
- try:
110
- # get_usage_json() provides a provider-agnostic JSON schema representation
111
- tool_json_schema = tool_definition.get_usage_json()
112
- print(f"\n# Tool: {tool_definition.name}")
113
- print(f" Description: {tool_definition.description}")
114
- print("# Schema (JSON):")
115
- # Pretty-print the JSON schema
116
- print(json.dumps(tool_json_schema, indent=2))
117
- except Exception as e:
118
- print(f"\n# Tool: {tool_definition.name}")
119
- print(f" Error getting schema from definition: {e}")
120
- print("\n--------------------------------------------------------\n")
121
-
122
-
123
- async def main():
124
- """
125
- Main function to connect to the SQLite MCP server and list its tools.
126
- """
127
- logger.info("--- Starting MCP Remote Tool Listing Example ---")
128
-
129
- env_vars = check_required_env_vars()
130
-
131
- # 1. Instantiate the McpToolRegistrar.
132
- registrar = McpToolRegistrar()
133
-
134
- # 2. Define the configuration for the SQLite MCP server.
135
- server_id = "sqlite-mcp"
136
- sqlite_mcp_config_dict = {
137
- server_id: {
138
- "transport_type": "stdio",
139
- "stdio_params": {
140
- "command": "node",
141
- "args": [
142
- env_vars["script_path"],
143
- env_vars["db_path"],
144
- ],
145
- "env": {}, # No specific env vars needed for the SQLite server itself
146
- },
147
- "enabled": True,
148
- "tool_name_prefix": "sqlite",
149
- }
150
- }
151
-
152
- try:
153
- # 3. Use the registrar's `list_remote_tools` method for a preview.
154
- # This connects to the server, lists tools, and disconnects without
155
- # adding them to the main tool registry.
156
- logger.info(f"Connecting to remote server '{server_id}' to preview available tools...")
157
-
158
- tool_definitions = await registrar.list_remote_tools(mcp_config=sqlite_mcp_config_dict)
159
-
160
- # 4. Print the results.
161
- if tool_definitions:
162
- print_tool_definitions(tool_definitions)
163
- logger.info(f"Successfully listed {len(tool_definitions)} tools from the remote server.")
164
- else:
165
- logger.warning("No tools were found on the remote server.")
166
-
167
- except Exception as e:
168
- logger.error(f"An error occurred while trying to list remote tools: {e}", exc_info=True)
169
-
170
- logger.info("--- MCP Remote Tool Listing Example Finished ---")
171
-
172
-
173
- if __name__ == "__main__":
174
- parser = argparse.ArgumentParser(description="List available tools from the remote SQLite MCP server.")
175
- parser.add_argument("--debug", action="store_true", help="Enable debug level logging on the console.")
176
- args = parser.parse_args()
177
-
178
- setup_logging(debug=args.debug)
179
-
180
- try:
181
- asyncio.run(main())
182
- except (KeyboardInterrupt, SystemExit) as e:
183
- # Gracefully handle user interruption or normal exit.
184
- if isinstance(e, SystemExit) and e.code == 0:
185
- logger.info("Script exited normally.")
186
- else:
187
- logger.warning(f"Script interrupted ({type(e).__name__}). Exiting.")
188
- except Exception as e:
189
- logger.error(f"An unhandled error occurred at the top level: {e}", exc_info=True)