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
autobyteus/tools/timer.py DELETED
@@ -1,175 +0,0 @@
1
- import asyncio
2
- from typing import Optional, TYPE_CHECKING, Any
3
- from autobyteus.tools.base_tool import BaseTool
4
- from autobyteus.tools.tool_config import ToolConfig
5
- from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
6
- from autobyteus.tools.tool_category import ToolCategory
7
- from autobyteus.events.event_emitter import EventEmitter
8
- from autobyteus.events.event_types import EventType
9
- import logging
10
-
11
- if TYPE_CHECKING:
12
- from autobyteus.agent.context import AgentContext
13
-
14
- logger = logging.getLogger(__name__)
15
-
16
- class Timer(BaseTool, EventEmitter):
17
- """
18
- A tool that provides timer functionality with configurable duration and event emission.
19
- The timer runs independently after being started and emits TIMER_UPDATE events.
20
- """
21
- CATEGORY = ToolCategory.UTILITY
22
-
23
- def __init__(self, config: Optional[ToolConfig] = None):
24
- BaseTool.__init__(self, config=config)
25
- EventEmitter.__init__(self)
26
-
27
- self.duration: int = 300
28
- self.interval: int = 60
29
-
30
- if config:
31
- try:
32
- self.duration = int(config.get('duration', 300))
33
- if not (1 <= self.duration <= 86400):
34
- logger.warning(f"Timer duration {self.duration} out of bounds (1-86400). Clamping or using default.")
35
- self.duration = max(1, min(self.duration, 86400))
36
- except ValueError:
37
- logger.warning(f"Invalid duration value in config, using default {self.duration}s.")
38
-
39
- try:
40
- self.interval = int(config.get('interval', 60))
41
- if not (1 <= self.interval <= 3600):
42
- logger.warning(f"Timer interval {self.interval} out of bounds (1-3600). Clamping or using default.")
43
- self.interval = max(1, min(self.interval, 3600))
44
- except ValueError:
45
- logger.warning(f"Invalid interval value in config, using default {self.interval}s.")
46
-
47
- self._is_running: bool = False
48
- self._task: Optional[asyncio.Task] = None
49
- logger.debug(f"Timer initialized with duration: {self.duration}s, interval: {self.interval}s")
50
-
51
- @classmethod
52
- def get_name(cls) -> str:
53
- return "start_timer"
54
-
55
- @classmethod
56
- def get_description(cls) -> str:
57
- return "Sets and runs a timer. Emits TIMER_UPDATE events with remaining time at specified intervals."
58
-
59
- @classmethod
60
- def get_argument_schema(cls) -> Optional[ParameterSchema]:
61
- schema = ParameterSchema()
62
- schema.add_parameter(ParameterDefinition(
63
- name="duration",
64
- param_type=ParameterType.INTEGER,
65
- description="Duration to set for this timer run in seconds.",
66
- required=True,
67
- min_value=1,
68
- max_value=86400
69
- ))
70
- schema.add_parameter(ParameterDefinition(
71
- name="interval",
72
- param_type=ParameterType.INTEGER,
73
- description="Interval for emitting timer events in seconds for this run. Overrides instance default.",
74
- required=False,
75
- default_value=None,
76
- min_value=1,
77
- max_value=3600
78
- ))
79
- return schema
80
-
81
- @classmethod
82
- def get_config_schema(cls) -> Optional[ParameterSchema]:
83
- schema = ParameterSchema()
84
- schema.add_parameter(ParameterDefinition(
85
- name="duration",
86
- param_type=ParameterType.INTEGER,
87
- description="Default duration of the timer in seconds if not overridden by execute.",
88
- required=False,
89
- default_value=300,
90
- min_value=1,
91
- max_value=86400
92
- ))
93
- schema.add_parameter(ParameterDefinition(
94
- name="interval",
95
- param_type=ParameterType.INTEGER,
96
- description="Default interval at which to emit timer events, in seconds, if not overridden by execute.",
97
- required=False,
98
- default_value=60,
99
- min_value=1,
100
- max_value=3600
101
- ))
102
- return schema
103
-
104
- def set_duration(self, duration: int) -> None:
105
- if not (1 <= duration <= 86400):
106
- raise ValueError("Duration must be between 1 and 86400 seconds.")
107
- self.duration = duration
108
-
109
- def set_interval(self, interval: int) -> None:
110
- if not (1 <= interval <= 3600):
111
- raise ValueError("Interval must be between 1 and 3600 seconds.")
112
- self.interval = interval
113
-
114
- def start(self, run_duration: Optional[int] = None, run_interval: Optional[int] = None) -> None:
115
- if self._is_running:
116
- logger.warning("Timer start called but timer is already running.")
117
- return
118
-
119
- current_duration = run_duration if run_duration is not None else self.duration
120
- current_interval = run_interval if run_interval is not None else self.interval
121
-
122
- if current_duration <= 0:
123
- raise RuntimeError("Timer duration must be positive and set before starting.")
124
- if current_interval <=0:
125
- raise RuntimeError("Timer interval must be positive and set.")
126
-
127
- self._is_running = True
128
- self._task = asyncio.create_task(self._run_timer_task(current_duration, current_interval))
129
- logger.info(f"Timer started for {current_duration}s, events every {current_interval}s.")
130
-
131
- async def _run_timer_task(self, duration: int, interval: int) -> None:
132
- remaining_time = duration
133
- try:
134
- while remaining_time > 0:
135
- self.emit(EventType.TIMER_UPDATE, remaining_time=remaining_time)
136
- await asyncio.sleep(min(interval, remaining_time))
137
- remaining_time -= interval
138
- self.emit(EventType.TIMER_UPDATE, remaining_time=0)
139
- except asyncio.CancelledError:
140
- logger.info("Timer task was cancelled.")
141
- self.emit(EventType.TIMER_UPDATE, remaining_time=-1, status="cancelled")
142
- raise
143
- finally:
144
- self._is_running = False
145
- logger.info("Timer task finished.")
146
-
147
- async def _execute(self, context: 'AgentContext', duration: int, interval: Optional[int] = None) -> str:
148
- logger.debug(f"Timer execute called by agent {context.agent_id} with duration: {duration}, interval: {interval}")
149
-
150
- effective_interval = interval if interval is not None else self.interval
151
-
152
- if self._task and not self._task.done():
153
- logger.info("Cancelling previous timer task before starting a new one.")
154
- self._task.cancel()
155
- try:
156
- await self._task
157
- except asyncio.CancelledError:
158
- logger.debug("Previous timer task successfully cancelled.")
159
- self._task = None
160
-
161
- self.start(run_duration=duration, run_interval=effective_interval)
162
- return f"Timer started for {duration} seconds, emitting events every {effective_interval} seconds."
163
-
164
- async def stop(self) -> None:
165
- if self._task and not self._task.done():
166
- logger.info("Stopping timer task...")
167
- self._task.cancel()
168
- try:
169
- await self._task
170
- except asyncio.CancelledError:
171
- logger.info("Timer task stopped successfully.")
172
- self._task = None
173
- self._is_running = False
174
- else:
175
- logger.info("Stop called, but no timer task is running or task already done.")
@@ -1,22 +0,0 @@
1
- # file: autobyteus/autobyteus/tools/usage/parsers/__init__.py
2
- """
3
- This package contains concrete parser classes that translate an LLM's raw response
4
- text into structured ToolInvocation objects.
5
- """
6
- from .base_parser import BaseToolUsageParser
7
- from .provider_aware_tool_usage_parser import ProviderAwareToolUsageParser
8
- from .default_xml_tool_usage_parser import DefaultXmlToolUsageParser
9
- from .anthropic_xml_tool_usage_parser import AnthropicXmlToolUsageParser
10
- from .default_json_tool_usage_parser import DefaultJsonToolUsageParser
11
- from .openai_json_tool_usage_parser import OpenAiJsonToolUsageParser
12
- from .gemini_json_tool_usage_parser import GeminiJsonToolUsageParser
13
-
14
- __all__ = [
15
- "BaseToolUsageParser",
16
- "ProviderAwareToolUsageParser",
17
- "DefaultXmlToolUsageParser",
18
- "AnthropicXmlToolUsageParser",
19
- "DefaultJsonToolUsageParser",
20
- "OpenAiJsonToolUsageParser",
21
- "GeminiJsonToolUsageParser",
22
- ]
@@ -1,99 +0,0 @@
1
- import re
2
- import logging
3
- from typing import List
4
-
5
- logger = logging.getLogger(__name__)
6
-
7
- def _find_json_blobs(text: str) -> List[str]:
8
- """
9
- Robustly finds and extracts all top-level JSON objects or arrays from a string,
10
- maintaining their original order of appearance. It handles JSON within
11
- markdown-style code blocks (```json ... ```) and inline JSON.
12
-
13
- Args:
14
- text: The string to search for JSON in.
15
-
16
- Returns:
17
- A list of strings, where each string is a valid-looking JSON blob,
18
- ordered as they appeared in the input text.
19
- """
20
- found_blobs = []
21
-
22
- # 1. Find all markdown blobs first and store them with their start positions.
23
- markdown_matches = list(re.finditer(r"```(?:json)?\s*([\s\S]+?)\s*```", text))
24
- for match in markdown_matches:
25
- content = match.group(1).strip()
26
- found_blobs.append((match.start(), content))
27
-
28
- # 2. Create a "masked" version of the text by replacing markdown blocks with spaces.
29
- # This prevents the inline scanner from finding JSON inside them, while preserving indices.
30
- masked_text_list = list(text)
31
- for match in markdown_matches:
32
- for i in range(match.start(), match.end()):
33
- masked_text_list[i] = ' '
34
- masked_text = "".join(masked_text_list)
35
-
36
- # 3. Scan the masked text for any other JSON using a single pass brace-counter.
37
- idx = 0
38
- while idx < len(masked_text):
39
- start_idx = -1
40
-
41
- # Find the next opening brace or bracket
42
- next_brace = masked_text.find('{', idx)
43
- next_bracket = masked_text.find('[', idx)
44
-
45
- if next_brace == -1 and next_bracket == -1:
46
- break # No more JSON starts
47
-
48
- if next_brace != -1 and (next_bracket == -1 or next_brace < next_bracket):
49
- start_idx = next_brace
50
- start_char, end_char = '{', '}'
51
- else:
52
- start_idx = next_bracket
53
- start_char, end_char = '[', ']'
54
-
55
- brace_count = 1
56
- in_string = False
57
- is_escaped = False
58
- end_idx = -1
59
-
60
- for i in range(start_idx + 1, len(masked_text)):
61
- char = masked_text[i]
62
-
63
- if in_string:
64
- if is_escaped:
65
- is_escaped = False
66
- elif char == '\\':
67
- is_escaped = True
68
- elif char == '"':
69
- in_string = False
70
- else:
71
- if char == '"':
72
- in_string = True
73
- is_escaped = False
74
- elif char == '{' or char == '[':
75
- brace_count += 1
76
- elif char == '}' or char == ']':
77
- brace_count -= 1
78
-
79
- if brace_count == 0:
80
- if (start_char == '{' and char == '}') or \
81
- (start_char == '[' and char == ']'):
82
- end_idx = i
83
- break
84
-
85
- if end_idx != -1:
86
- # We found a blob in the masked text, so its indices are correct
87
- # for the original text. Extract the blob from the original text.
88
- blob = text[start_idx : end_idx + 1]
89
- found_blobs.append((start_idx, blob))
90
- idx = end_idx + 1
91
- else:
92
- # No matching end brace found, move on from the start character.
93
- idx = start_idx + 1
94
-
95
- # 4. Sort all found blobs by their start position to ensure correct order
96
- found_blobs.sort(key=lambda item: item[0])
97
-
98
- # 5. Return only the content of the blobs
99
- return [content for _, content in found_blobs]
@@ -1,18 +0,0 @@
1
- # file: autobyteus/autobyteus/tools/usage/parsers/_string_decoders.py
2
- """Utility helpers for normalizing string content inside parsed tool payloads."""
3
-
4
- from __future__ import annotations
5
-
6
- import html
7
- from typing import Any
8
-
9
-
10
- def decode_html_entities(data: Any) -> Any:
11
- """Recursively decode HTML/XML entities in strings within a data structure."""
12
- if isinstance(data, dict):
13
- return {key: decode_html_entities(value) for key, value in data.items()}
14
- if isinstance(data, list):
15
- return [decode_html_entities(item) for item in data]
16
- if isinstance(data, str):
17
- return html.unescape(data)
18
- return data
@@ -1,10 +0,0 @@
1
- # file: autobyteus/autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py
2
- from .default_xml_tool_usage_parser import DefaultXmlToolUsageParser
3
-
4
- class AnthropicXmlToolUsageParser(DefaultXmlToolUsageParser):
5
- """
6
- Parser for Anthropic models. Anthropic uses XML for tool calls,
7
- so this is an alias for the default XML parser.
8
- """
9
- def get_name(self) -> str:
10
- return "anthropic_xml_tool_usage_parser"
@@ -1,41 +0,0 @@
1
- # file: autobyteus/autobyteus/tools/usage/parsers/base_parser.py
2
- import logging
3
- from abc import ABC, abstractmethod
4
- from typing import List, TYPE_CHECKING
5
-
6
- if TYPE_CHECKING:
7
- from autobyteus.agent.tool_invocation import ToolInvocation
8
- from autobyteus.llm.utils.response_types import CompleteResponse
9
-
10
- logger = logging.getLogger(__name__)
11
-
12
- class BaseToolUsageParser(ABC):
13
- """
14
- Abstract base class for parsing tool usage from an LLM's response text.
15
- These parsers are responsible for extracting structured tool call information.
16
- """
17
-
18
- def get_name(self) -> str:
19
- """
20
- Returns the unique name for this parser.
21
- Defaults to the class name.
22
- """
23
- return self.__class__.__name__
24
-
25
- @abstractmethod
26
- def parse(self, response: 'CompleteResponse') -> List['ToolInvocation']:
27
- """
28
- Parses the LLM's response. If actionable tool calls are found,
29
- this method should return a list of ToolInvocation objects.
30
-
31
- Args:
32
- response: The CompleteResponse object from the LLM.
33
-
34
- Returns:
35
- A list of ToolInvocation objects. Returns an empty list if no
36
- valid tool calls are found.
37
- """
38
- raise NotImplementedError("Subclasses must implement the 'parse' method.")
39
-
40
- def __repr__(self) -> str:
41
- return f"<{self.__class__.__name__}>"
@@ -1,83 +0,0 @@
1
- # file: autobyteus/autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py
2
- import json
3
- import logging
4
- from typing import Dict, Any, TYPE_CHECKING, List
5
-
6
- from ._string_decoders import decode_html_entities
7
-
8
- from autobyteus.agent.tool_invocation import ToolInvocation
9
- from .base_parser import BaseToolUsageParser
10
- from .exceptions import ToolUsageParseException
11
- from ._json_extractor import _find_json_blobs
12
-
13
- if TYPE_CHECKING:
14
- from autobyteus.llm.utils.response_types import CompleteResponse
15
-
16
- logger = logging.getLogger(__name__)
17
-
18
- class DefaultJsonToolUsageParser(BaseToolUsageParser):
19
- """
20
- A default parser for tool usage commands formatted as custom JSON.
21
- It robustly extracts potential JSON blobs and expects a 'tool' object
22
- with 'function' and 'parameters' keys.
23
- """
24
- def get_name(self) -> str:
25
- return "default_json_tool_usage_parser"
26
-
27
- def parse(self, response: 'CompleteResponse') -> List[ToolInvocation]:
28
- response_text = response.content
29
- json_blobs = _find_json_blobs(response_text)
30
- if not json_blobs:
31
- return []
32
-
33
- invocations: List[ToolInvocation] = []
34
- for blob in json_blobs:
35
- try:
36
- data = json.loads(blob)
37
-
38
- # This parser specifically looks for the {"tool": {...}} structure.
39
- if isinstance(data, dict) and "tool" in data:
40
- tool_block = data.get("tool")
41
- if not isinstance(tool_block, dict):
42
- continue
43
-
44
- tool_name = tool_block.get("function")
45
- arguments = tool_block.get("parameters")
46
-
47
- if not tool_name or not isinstance(tool_name, str):
48
- logger.debug(f"Skipping malformed tool block (missing or invalid 'function'): {tool_block}")
49
- continue
50
-
51
- if arguments is None:
52
- arguments = {}
53
-
54
- if not isinstance(arguments, dict):
55
- logger.debug(f"Skipping tool block with invalid 'parameters' type ({type(arguments)}): {tool_block}")
56
- continue
57
-
58
- decoded_arguments = decode_html_entities(arguments)
59
- decoded_tool_name = decode_html_entities(tool_name)
60
- try:
61
- # Pass id=None to trigger deterministic ID generation.
62
- tool_invocation = ToolInvocation(
63
- name=decoded_tool_name,
64
- arguments=decoded_arguments,
65
- id=None,
66
- )
67
- invocations.append(tool_invocation)
68
- logger.info(f"Successfully parsed default JSON tool invocation for '{tool_name}'.")
69
- except Exception as e:
70
- logger.error(f"Unexpected error creating ToolInvocation for tool '{tool_name}': {e}", exc_info=True)
71
-
72
- except json.JSONDecodeError:
73
- logger.debug(f"Could not parse extracted text as JSON in {self.get_name()}. Blob: {blob[:200]}")
74
- # This is likely not a tool call, so we can ignore it.
75
- continue
76
- except Exception as e:
77
- # If we're here, it's likely a valid JSON but with unexpected structure.
78
- # It's safer to raise this for upstream handling.
79
- error_msg = f"Unexpected error while parsing JSON blob in {self.get_name()}: {e}. Blob: {blob[:200]}"
80
- logger.error(error_msg, exc_info=True)
81
- raise ToolUsageParseException(error_msg, original_exception=e)
82
-
83
- return invocations