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
@@ -0,0 +1,62 @@
1
+ """
2
+ tools/coordinator/operation_lifecycle_manager.py
3
+
4
+ This module contains the OperationLifecycleManager class which manages the
5
+ transaction lifecycle including starting, committing, and rolling back transactions.
6
+ """
7
+
8
+ import uuid
9
+ from autobyteus.tools.operation_executor.journal_manager import JournalManager
10
+ from autobyteus.tools.operation_executor.operation_event_producer import OperationEventProducer
11
+ from autobyteus.tools.transaction_management.backup_handler import BackupHandler
12
+ from tools.operation_executor.operation_executor import OperationExecutor
13
+ # Assuming the other required classes are located in their respective modules.
14
+
15
+ class OperationLifecycleManager:
16
+ def __init__(self,
17
+ journal_manager: JournalManager,
18
+ operation_executor: OperationExecutor,
19
+ backup_handler: BackupHandler,
20
+ event_producer: OperationEventProducer) -> None:
21
+ self.journal_manager = journal_manager
22
+ self.operation_executor = operation_executor
23
+ self.backup_handler = backup_handler
24
+ self.event_producer = event_producer
25
+
26
+ def start_transaction(self) -> str:
27
+ """
28
+ Initializes a transaction and returns a unique transaction ID.
29
+ """
30
+ transaction_id = str(uuid.uuid4())
31
+ self.journal_manager.initialize_journal(transaction_id)
32
+ return transaction_id
33
+
34
+ def commit(self, transaction_id: str) -> None:
35
+ """
36
+ Commits all the operations, journals them, and emits an event indicating
37
+ a successful commit.
38
+
39
+ Args:
40
+ transaction_id (str): The unique ID of the transaction to be committed.
41
+ """
42
+ try:
43
+ self.journal_manager.finalize_journal(transaction_id, status="committed")
44
+ self.event_producer.emit_event(f"Transaction {transaction_id} committed.")
45
+ except Exception as e:
46
+ self.journal_manager.log_error(transaction_id, str(e))
47
+ raise
48
+
49
+ def rollback(self, transaction_id: str) -> None:
50
+ """
51
+ Reverts all executed operations, restores files if necessary, and emits a rollback event.
52
+
53
+ Args:
54
+ transaction_id (str): The unique ID of the transaction to be rolled back.
55
+ """
56
+ try:
57
+ self.operation_executor.rollback_operations()
58
+ self.backup_handler.restore_backup(transaction_id)
59
+ self.event_producer.emit_event(f"Transaction {transaction_id} rolled back.")
60
+ except Exception as e:
61
+ self.journal_manager.log_error(transaction_id, str(e))
62
+ raise
@@ -1,6 +1,5 @@
1
1
  # file: autobyteus/autobyteus/tools/usage/__init__.py
2
2
  """
3
3
  This package contains the framework for generating provider-specific
4
- tool usage information (schemas and examples) and for parsing
5
- tool usage from LLM responses.
4
+ tool usage information (schemas and examples).
6
5
  """
@@ -3,7 +3,7 @@
3
3
  This package contains concrete formatter classes that translate a BaseTool's
4
4
  metadata into a specific provider's format (e.g., OpenAI JSON, Anthropic JSON, XML).
5
5
  """
6
- from .base_formatter import BaseSchemaFormatter, BaseExampleFormatter
6
+ from .base_formatter import BaseSchemaFormatter, BaseExampleFormatter, BaseXmlSchemaFormatter
7
7
  from .default_xml_schema_formatter import DefaultXmlSchemaFormatter
8
8
  from .default_json_schema_formatter import DefaultJsonSchemaFormatter
9
9
  from .openai_json_schema_formatter import OpenAiJsonSchemaFormatter
@@ -15,9 +15,18 @@ from .openai_json_example_formatter import OpenAiJsonExampleFormatter
15
15
  from .anthropic_json_example_formatter import AnthropicJsonExampleFormatter
16
16
  from .gemini_json_example_formatter import GeminiJsonExampleFormatter
17
17
 
18
+ # Tool-specific formatters
19
+ from .write_file_xml_schema_formatter import WriteFileXmlSchemaFormatter
20
+ from .write_file_xml_example_formatter import WriteFileXmlExampleFormatter
21
+ from .patch_file_xml_schema_formatter import PatchFileXmlSchemaFormatter
22
+ from .patch_file_xml_example_formatter import PatchFileXmlExampleFormatter
23
+ from .run_bash_xml_schema_formatter import RunBashXmlSchemaFormatter
24
+ from .run_bash_xml_example_formatter import RunBashXmlExampleFormatter
25
+
18
26
  __all__ = [
19
27
  "BaseSchemaFormatter",
20
28
  "BaseExampleFormatter",
29
+ "BaseXmlSchemaFormatter",
21
30
  "DefaultXmlSchemaFormatter",
22
31
  "DefaultJsonSchemaFormatter",
23
32
  "OpenAiJsonSchemaFormatter",
@@ -28,4 +37,11 @@ __all__ = [
28
37
  "OpenAiJsonExampleFormatter",
29
38
  "AnthropicJsonExampleFormatter",
30
39
  "GeminiJsonExampleFormatter",
40
+ # Tool-specific formatters
41
+ "WriteFileXmlSchemaFormatter",
42
+ "WriteFileXmlExampleFormatter",
43
+ "PatchFileXmlSchemaFormatter",
44
+ "PatchFileXmlExampleFormatter",
45
+ "RunBashXmlSchemaFormatter",
46
+ "RunBashXmlExampleFormatter",
31
47
  ]
@@ -23,6 +23,14 @@ class BaseSchemaFormatter(ABC):
23
23
  """
24
24
  pass
25
25
 
26
+ class BaseXmlSchemaFormatter(BaseSchemaFormatter):
27
+ """
28
+ Marker base class for all XML schema formatters.
29
+ Subclass this for any formatter that produces XML output.
30
+ """
31
+ pass
32
+
33
+
26
34
  class BaseExampleFormatter(ABC):
27
35
  """
28
36
  Abstract base class for formatting a usage example of a single tool
@@ -3,12 +3,12 @@ import xml.sax.saxutils
3
3
  from typing import TYPE_CHECKING, List, Dict
4
4
 
5
5
  from autobyteus.utils.parameter_schema import ParameterType, ParameterDefinition, ParameterSchema
6
- from .base_formatter import BaseSchemaFormatter
6
+ from .base_formatter import BaseXmlSchemaFormatter
7
7
 
8
8
  if TYPE_CHECKING:
9
9
  from autobyteus.tools.registry import ToolDefinition
10
10
 
11
- class DefaultXmlSchemaFormatter(BaseSchemaFormatter):
11
+ class DefaultXmlSchemaFormatter(BaseXmlSchemaFormatter):
12
12
  """Formats a tool's schema into a standardized, potentially nested, XML string."""
13
13
 
14
14
  def provide(self, tool_definition: 'ToolDefinition') -> str:
@@ -0,0 +1,18 @@
1
+ from typing import Dict, TYPE_CHECKING
2
+ from .base_formatter import BaseSchemaFormatter
3
+
4
+ if TYPE_CHECKING:
5
+ from autobyteus.tools.registry import ToolDefinition
6
+
7
+ class MistralJsonSchemaFormatter(BaseSchemaFormatter):
8
+ """Formats a tool's schema into the Mistral JSON format (standard JSON schema)."""
9
+
10
+ def provide(self, tool_definition: 'ToolDefinition') -> Dict:
11
+ return {
12
+ "type": "function",
13
+ "function": {
14
+ "name": tool_definition.name,
15
+ "description": tool_definition.description,
16
+ "parameters": tool_definition.argument_schema.to_json_schema_dict() if tool_definition.argument_schema else {"type": "object", "properties": {}}
17
+ }
18
+ }
@@ -0,0 +1,64 @@
1
+ # file: autobyteus/autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py
2
+ """
3
+ XML Example formatter for the patch_file tool using standard <tool name="patch_file"> syntax.
4
+ """
5
+ from typing import TYPE_CHECKING
6
+
7
+ from .base_formatter import BaseExampleFormatter
8
+
9
+ if TYPE_CHECKING:
10
+ from autobyteus.tools.registry import ToolDefinition
11
+
12
+
13
+ class PatchFileXmlExampleFormatter(BaseExampleFormatter):
14
+ """
15
+ Formats usage examples for patch_file using the standard <tool name="patch_file"> XML syntax.
16
+ """
17
+
18
+ def provide(self, tool_definition: 'ToolDefinition') -> str:
19
+ """
20
+ Generates usage examples for patch_file.
21
+ """
22
+ return '''### Example 1: Modify a function in a Python file
23
+
24
+ <tool name="patch_file">
25
+ <arguments>
26
+ <arg name="path">/path/to/utils.py</arg>
27
+ <arg name="patch">
28
+ __START_PATCH__
29
+ --- a/utils.py
30
+ +++ b/utils.py
31
+ @@ -10,7 +10,7 @@
32
+ def calculate_total(items):
33
+ """Calculate the total price of items."""
34
+ total = 0
35
+ - for item in items:
36
+ + for item in sorted(items, key=lambda x: x.price):
37
+ total += item.price
38
+ return total
39
+ __END_PATCH__
40
+ </arg>
41
+ </arguments>
42
+ </tool>
43
+
44
+ ### Example 2: Add new lines to a configuration file
45
+
46
+ <tool name="patch_file">
47
+ <arguments>
48
+ <arg name="path">config/settings.yaml</arg>
49
+ <arg name="patch">
50
+ __START_PATCH__
51
+ --- a/settings.yaml
52
+ +++ b/settings.yaml
53
+ @@ -5,3 +5,6 @@
54
+ logging:
55
+ level: INFO
56
+ format: "%(asctime)s - %(message)s"
57
+ +
58
+ +cache:
59
+ + enabled: true
60
+ + ttl: 3600
61
+ __END_PATCH__
62
+ </arg>
63
+ </arguments>
64
+ </tool>'''
@@ -0,0 +1,31 @@
1
+ # file: autobyteus/autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py
2
+ """
3
+ XML Schema formatter for the patch_file tool using standard <tool name="patch_file"> syntax.
4
+ """
5
+ from typing import TYPE_CHECKING
6
+
7
+ from .base_formatter import BaseXmlSchemaFormatter
8
+
9
+ if TYPE_CHECKING:
10
+ from autobyteus.tools.registry import ToolDefinition
11
+
12
+
13
+ class PatchFileXmlSchemaFormatter(BaseXmlSchemaFormatter):
14
+ """
15
+ Formats the patch_file tool schema using the standard <tool name="patch_file"> XML syntax.
16
+ """
17
+
18
+ def provide(self, tool_definition: 'ToolDefinition') -> str:
19
+ """
20
+ Generates the schema description for patch_file using standard XML syntax
21
+ with specific instructions for sentinel tags to support robust streaming.
22
+ """
23
+ return '''<tool name="patch_file">
24
+ <arguments>
25
+ <arg name="path" type="string" description="The absolute or relative path to the file to patch." required="true" />
26
+ <arg name="patch" type="string" description="The unified diff patch to apply to the file." required="true">
27
+ IMPORTANT: To ensure reliable streaming, you MUST enclose the patch content with the sentinel tags __START_PATCH__ and __END_PATCH__.
28
+ The parser will strip these tags, but they are critical for preventing XML parsing errors if the patch contains special characters.
29
+ </arg>
30
+ </arguments>
31
+ </tool>'''
@@ -0,0 +1,32 @@
1
+ # file: autobyteus/autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py
2
+ """
3
+ XML Example formatter for the run_bash tool using shorthand <run_bash> syntax.
4
+ """
5
+ from typing import TYPE_CHECKING
6
+
7
+ from .base_formatter import BaseExampleFormatter
8
+
9
+ if TYPE_CHECKING:
10
+ from autobyteus.tools.registry import ToolDefinition
11
+
12
+
13
+ class RunBashXmlExampleFormatter(BaseExampleFormatter):
14
+ """
15
+ Formats usage examples for run_bash using the shorthand <run_bash> XML syntax.
16
+ """
17
+
18
+ def provide(self, tool_definition: 'ToolDefinition') -> str:
19
+ """
20
+ Generates usage examples for run_bash.
21
+ """
22
+ return '''### Example 1: List files
23
+
24
+ <run_bash>
25
+ ls -la
26
+ </run_bash>
27
+
28
+ ### Example 2: Run tests
29
+
30
+ <run_bash>
31
+ python -m pytest tests/ -v
32
+ </run_bash>'''
@@ -0,0 +1,36 @@
1
+ # file: autobyteus/autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py
2
+ """
3
+ XML Schema formatter for the run_bash tool using shorthand <run_bash> syntax.
4
+ """
5
+ from typing import TYPE_CHECKING
6
+
7
+ from .base_formatter import BaseXmlSchemaFormatter
8
+
9
+ if TYPE_CHECKING:
10
+ from autobyteus.tools.registry import ToolDefinition
11
+
12
+
13
+ class RunBashXmlSchemaFormatter(BaseXmlSchemaFormatter):
14
+ """
15
+ Formats the run_bash tool schema using the shorthand <run_bash> XML syntax.
16
+ """
17
+
18
+ def provide(self, tool_definition: 'ToolDefinition') -> str:
19
+ """
20
+ Generates the schema description for run_bash using shorthand syntax.
21
+ """
22
+ return '''## run_bash
23
+
24
+ Runs a command in the terminal.
25
+
26
+ **Syntax:**
27
+ ```xml
28
+ <run_bash>
29
+ command_to_execute
30
+ </run_bash>
31
+ ```
32
+
33
+ **Parameters:**
34
+ - Content between tags: The shell command to execute.
35
+
36
+ The command runs in the agent's configured working directory.'''
@@ -0,0 +1,53 @@
1
+ # file: autobyteus/autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py
2
+ """
3
+ XML Example formatter for the write_file tool using shorthand <write_file> syntax.
4
+ """
5
+ from typing import TYPE_CHECKING
6
+
7
+ from .base_formatter import BaseExampleFormatter
8
+
9
+ if TYPE_CHECKING:
10
+ from autobyteus.tools.registry import ToolDefinition
11
+
12
+
13
+ class WriteFileXmlExampleFormatter(BaseExampleFormatter):
14
+ """
15
+ Formats usage examples for write_file using the shorthand <write_file> XML syntax.
16
+ """
17
+
18
+ def provide(self, tool_definition: 'ToolDefinition') -> str:
19
+ """
20
+ Generates usage examples for write_file.
21
+ """
22
+ return '''### Example 1: Create a Python file
23
+
24
+ <tool name="write_file">
25
+ <arguments>
26
+ <arg name="path">/path/to/hello.py</arg>
27
+ <arg name="content">
28
+ __START_CONTENT__
29
+ def hello():
30
+ print("Hello, World!")
31
+
32
+ if __name__ == "__main__":
33
+ hello()
34
+ __END_CONTENT__
35
+ </arg>
36
+ </arguments>
37
+ </tool>
38
+
39
+ ### Example 2: Create a configuration file
40
+
41
+ <tool name="write_file">
42
+ <arguments>
43
+ <arg name="path">config/settings.json</arg>
44
+ <arg name="content">
45
+ __START_CONTENT__
46
+ {
47
+ "debug": true,
48
+ "log_level": "INFO"
49
+ }
50
+ __END_CONTENT__
51
+ </arg>
52
+ </arguments>
53
+ </tool>'''
@@ -0,0 +1,31 @@
1
+ # file: autobyteus/autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py
2
+ """
3
+ XML Schema formatter for the write_file tool using shorthand <write_file> syntax.
4
+ """
5
+ from typing import TYPE_CHECKING
6
+
7
+ from .base_formatter import BaseXmlSchemaFormatter
8
+
9
+ if TYPE_CHECKING:
10
+ from autobyteus.tools.registry import ToolDefinition
11
+
12
+
13
+ class WriteFileXmlSchemaFormatter(BaseXmlSchemaFormatter):
14
+ """
15
+ Formats the write_file tool schema using the shorthand <write_file> XML syntax.
16
+ """
17
+
18
+ def provide(self, tool_definition: 'ToolDefinition') -> str:
19
+ """
20
+ Generates the schema description for write_file using standard XML syntax
21
+ but with specific instructions for sentinel tags to support robust streaming.
22
+ """
23
+ return '''<tool name="write_file">
24
+ <arguments>
25
+ <arg name="path" type="string" description="The absolute or relative path where the file will be written." required="true" />
26
+ <arg name="content" type="string" description="The content to write to the file." required="true">
27
+ IMPORTANT: To ensure reliable streaming, you MUST enclose the file content with the sentinel tags __START_CONTENT__ and __END_CONTENT__.
28
+ The parser will strip these tags, but they are critical for preventing XML parsing errors if the content contains special characters.
29
+ </arg>
30
+ </arguments>
31
+ </tool>'''
@@ -5,7 +5,7 @@ from typing import TYPE_CHECKING, List, Optional
5
5
 
6
6
  from autobyteus.llm.providers import LLMProvider
7
7
  from autobyteus.tools.usage.registries.tool_formatting_registry import ToolFormattingRegistry
8
- from autobyteus.tools.usage.formatters import DefaultXmlSchemaFormatter
8
+ from autobyteus.tools.usage.formatters import BaseXmlSchemaFormatter
9
9
 
10
10
  if TYPE_CHECKING:
11
11
  from autobyteus.tools.registry import ToolDefinition
@@ -52,29 +52,29 @@ class ToolManifestProvider:
52
52
 
53
53
  def provide(self,
54
54
  tool_definitions: List['ToolDefinition'],
55
- provider: Optional[LLMProvider] = None,
56
- use_xml_tool_format: bool = False) -> str:
55
+ provider: Optional[LLMProvider] = None) -> str:
57
56
  """
58
57
  Generates the manifest string for a list of tools.
59
58
 
60
59
  Args:
61
60
  tool_definitions: A list of ToolDefinition objects.
62
61
  provider: The LLM provider, for provider-specific formatting.
63
- use_xml_tool_format: If True, forces the use of XML formatters.
64
62
 
65
63
  Returns:
66
64
  A single string containing the formatted manifest.
67
65
  """
68
66
  tool_blocks = []
69
67
 
70
- formatter_pair = self._formatting_registry.get_formatter_pair(provider, use_xml_tool_format=use_xml_tool_format)
71
- schema_formatter = formatter_pair.schema_formatter
72
- example_formatter = formatter_pair.example_formatter
73
-
74
- is_xml_format = isinstance(schema_formatter, DefaultXmlSchemaFormatter)
75
-
76
68
  for td in tool_definitions:
77
69
  try:
70
+ # Get formatter pair per-tool (with fallback to provider)
71
+ formatter_pair = self._formatting_registry.get_formatter_pair_for_tool(
72
+ td.name, provider
73
+ )
74
+ schema_formatter = formatter_pair.schema_formatter
75
+ example_formatter = formatter_pair.example_formatter
76
+ is_xml_format = isinstance(schema_formatter, BaseXmlSchemaFormatter)
77
+
78
78
  schema = schema_formatter.provide(td)
79
79
  example = example_formatter.provide(td) # This is now a pre-formatted string for both XML and JSON
80
80
 
@@ -1,15 +1,13 @@
1
1
  # file: autobyteus/autobyteus/tools/usage/registries/__init__.py
2
2
  """
3
- This package contains registries for schema/example formatters and parsers,
3
+ This package contains registries for schema/example formatters,
4
4
  allowing for easy retrieval of the correct component based on the LLM provider.
5
5
  """
6
6
  # Import the new consolidated components
7
7
  from .tool_formatter_pair import ToolFormatterPair
8
8
  from .tool_formatting_registry import ToolFormattingRegistry
9
- from .tool_usage_parser_registry import ToolUsageParserRegistry
10
9
 
11
10
  __all__ = [
12
11
  "ToolFormatterPair",
13
12
  "ToolFormattingRegistry",
14
- "ToolUsageParserRegistry",
15
13
  ]
@@ -5,12 +5,18 @@ from typing import Dict, Optional
5
5
  from autobyteus.llm.providers import LLMProvider
6
6
  from autobyteus.utils.singleton import SingletonMeta
7
7
  from .tool_formatter_pair import ToolFormatterPair
8
+ from autobyteus.utils.tool_call_format import resolve_tool_call_format
8
9
 
9
10
  # Import all necessary formatters
10
11
  from autobyteus.tools.usage.formatters import (
11
12
  DefaultJsonSchemaFormatter, OpenAiJsonSchemaFormatter, AnthropicJsonSchemaFormatter, GeminiJsonSchemaFormatter,
12
13
  DefaultJsonExampleFormatter, OpenAiJsonExampleFormatter, AnthropicJsonExampleFormatter, GeminiJsonExampleFormatter,
13
- DefaultXmlSchemaFormatter, DefaultXmlExampleFormatter
14
+ DefaultXmlSchemaFormatter, DefaultXmlExampleFormatter,
15
+ BaseSchemaFormatter, BaseExampleFormatter,
16
+ # Tool-specific formatters
17
+ WriteFileXmlSchemaFormatter, WriteFileXmlExampleFormatter,
18
+ PatchFileXmlSchemaFormatter, PatchFileXmlExampleFormatter,
19
+ RunBashXmlSchemaFormatter, RunBashXmlExampleFormatter,
14
20
  )
15
21
 
16
22
  logger = logging.getLogger(__name__)
@@ -19,6 +25,9 @@ class ToolFormattingRegistry(metaclass=SingletonMeta):
19
25
  """
20
26
  A consolidated registry that maps an LLMProvider directly to its required
21
27
  ToolFormatterPair, which contains both schema and example formatters.
28
+
29
+ Also supports tool-specific formatter pairs that take priority over provider defaults.
30
+ Priority cascade: tool-specific → provider-specific → default
22
31
  """
23
32
 
24
33
  def __init__(self):
@@ -38,28 +47,126 @@ class ToolFormattingRegistry(metaclass=SingletonMeta):
38
47
  self._default_pair = ToolFormatterPair(DefaultJsonSchemaFormatter(), DefaultJsonExampleFormatter())
39
48
  # A specific pair for the XML override
40
49
  self._xml_override_pair = ToolFormatterPair(DefaultXmlSchemaFormatter(), DefaultXmlExampleFormatter())
50
+ # Tool-specific formatter pairs (tool_name -> ToolFormatterPair)
51
+ self._tool_pairs: Dict[str, ToolFormatterPair] = {}
52
+
53
+ # Register tool-specific formatters
54
+ self._register_tool_formatters()
41
55
 
42
56
  logger.info("ToolFormattingRegistry initialized with direct provider-to-formatter mappings.")
43
57
 
44
- def get_formatter_pair(self, provider: Optional[LLMProvider], use_xml_tool_format: bool = False) -> ToolFormatterPair:
58
+ def _register_tool_formatters(self) -> None:
59
+ """Register built-in tool-specific formatters."""
60
+ # write_file uses standard <tool name="write_file"> syntax with custom sentinel instructions
61
+ self._tool_pairs["write_file"] = ToolFormatterPair(
62
+ WriteFileXmlSchemaFormatter(),
63
+ WriteFileXmlExampleFormatter()
64
+ )
65
+ # patch_file uses standard <tool name="patch_file"> syntax with custom sentinel instructions
66
+ self._tool_pairs["patch_file"] = ToolFormatterPair(
67
+ PatchFileXmlSchemaFormatter(),
68
+ PatchFileXmlExampleFormatter()
69
+ )
70
+ # run_bash uses shorthand <run_bash> syntax
71
+ #self._tool_pairs["run_bash"] = ToolFormatterPair(
72
+ # RunBashXmlSchemaFormatter(),
73
+ # RunBashXmlExampleFormatter()
74
+ #)
75
+
76
+ def register_tool_formatter(self, tool_name: str, formatter_pair: ToolFormatterPair) -> None:
77
+ """
78
+ Register a tool-specific formatter pair.
79
+
80
+ Args:
81
+ tool_name: The name of the tool (e.g., 'write_file').
82
+ formatter_pair: The formatter pair to use for this tool.
83
+ """
84
+ self._tool_pairs[tool_name] = formatter_pair
85
+ logger.info(f"Registered tool-specific formatter for '{tool_name}'.")
86
+
87
+ def get_formatter_pair_for_tool(
88
+ self,
89
+ tool_name: str,
90
+ provider: Optional[LLMProvider]
91
+ ) -> ToolFormatterPair:
92
+ """
93
+ Get the formatter pair for a specific tool with priority cascade.
94
+
95
+ Priority:
96
+ 1. Tool-specific pair (if registered)
97
+ 2. Provider-specific pair (if provider known)
98
+ 3. Default pair
99
+
100
+ Args:
101
+ tool_name: The name of the tool.
102
+ provider: The LLM provider.
103
+
104
+ Returns:
105
+ The appropriate ToolFormatterPair.
106
+ """
107
+ if tool_name in self._tool_pairs:
108
+ logger.debug(f"Using tool-specific formatter for '{tool_name}'.")
109
+ return self._tool_pairs[tool_name]
110
+ return self.get_formatter_pair(provider)
111
+
112
+ def get_formatter_pair(self, provider: Optional[LLMProvider]) -> ToolFormatterPair:
45
113
  """
46
- Retrieves the appropriate formatting pair for a given provider, honoring the XML override.
114
+ Retrieves the appropriate formatting pair for a given provider, honoring the env format override.
47
115
 
48
116
  Args:
49
117
  provider: The LLMProvider enum member.
50
- use_xml_tool_format: If True, forces the use of XML formatters.
51
118
 
52
119
  Returns:
53
120
  The corresponding ToolFormatterPair instance.
54
121
  """
55
- if use_xml_tool_format:
56
- logger.debug("XML tool format is forced by configuration. Returning XML formatter pair.")
122
+ format_override = resolve_tool_call_format()
123
+ if format_override == "xml":
124
+ logger.info("Tool format resolved to XML (env override).")
57
125
  return self._xml_override_pair
126
+ if format_override == "json":
127
+ logger.info("Tool format resolved to JSON (env override).")
128
+ return self._default_pair
129
+ if format_override in {"sentinel", "api_tool_call"}:
130
+ logger.info(
131
+ "Tool format '%s' is not supported by formatter registry. "
132
+ "Falling back to JSON formatters.",
133
+ format_override,
134
+ )
135
+ return self._default_pair
58
136
 
59
137
  if provider and provider in self._pairs:
60
138
  pair = self._pairs[provider]
61
- logger.debug(f"Found specific formatter pair for provider {provider.name}: {pair}")
139
+ logger.info(
140
+ "Tool format resolved by provider '%s' to %s.",
141
+ provider.name,
142
+ "XML" if pair is self._xml_override_pair else "JSON",
143
+ )
62
144
  return pair
63
145
 
64
- logger.debug(f"No specific formatter pair for provider {provider.name if provider else 'Unknown'}. Returning default pair.")
146
+ logger.info(
147
+ "Tool format resolved by default to JSON (provider=%s).",
148
+ provider.name if provider else "Unknown",
149
+ )
65
150
  return self._default_pair
151
+
152
+
153
+ def register_tool_formatter(
154
+ tool_name: str,
155
+ schema_formatter: BaseSchemaFormatter,
156
+ example_formatter: BaseExampleFormatter
157
+ ) -> None:
158
+ """
159
+ Registers a custom schema and example formatter for a specific tool.
160
+
161
+ This allows developers to define exactly how a tool's schema and usage example
162
+ should be presented to the LLM, overriding default provider-specific behavior.
163
+
164
+ Args:
165
+ tool_name: The name of the tool (must match the @tool name).
166
+ schema_formatter: An instance of a class inheriting from BaseSchemaFormatter.
167
+ example_formatter: An instance of a class inheriting from BaseExampleFormatter.
168
+ """
169
+ registry = ToolFormattingRegistry()
170
+ pair = ToolFormatterPair(schema_formatter, example_formatter)
171
+ registry.register_tool_formatter(tool_name, pair)
172
+ logger.info(f"Registered custom formatter pair for tool '{tool_name}' via facade.")