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/rpc/hosting.py DELETED
@@ -1,244 +0,0 @@
1
- # file: autobyteus/autobyteus/rpc/hosting.py
2
- import asyncio
3
- import logging
4
- import signal
5
- from typing import Optional, Dict, Union # Added Dict, Union
6
-
7
- from autobyteus.agent.agent import Agent
8
- from autobyteus.rpc.server import AgentServerEndpoint
9
- from autobyteus.rpc.config import AgentServerConfig
10
- from autobyteus.rpc.transport_type import TransportType
11
-
12
- logger = logging.getLogger(__name__)
13
-
14
- async def serve_agent_stdio(
15
- agent: Agent,
16
- stop_event: asyncio.Event,
17
- server_id_for_config: Optional[str] = None
18
- ) -> None:
19
- """
20
- Hosts a single Agent instance over STDIO within the current process.
21
- This function will run until the stop_event is set.
22
- The script calling this function will dedicate its sys.stdin/sys.stdout
23
- to RPC communication.
24
-
25
- Args:
26
- agent: The Agent instance to serve.
27
- stop_event: An asyncio.Event that signals when to stop the server.
28
- server_id_for_config: Optional string to use as server_id in the internal
29
- AgentServerConfig. Defaults to f"embedded_stdio_{agent.agent_id}".
30
- """
31
- if not isinstance(agent, Agent):
32
- raise TypeError("agent must be an instance of autobyteus.agent.agent.Agent")
33
- if not isinstance(stop_event, asyncio.Event):
34
- raise TypeError("stop_event must be an asyncio.Event")
35
-
36
- actual_server_id = server_id_for_config or f"embedded_stdio_{agent.agent_id}"
37
-
38
- stdio_config = AgentServerConfig(
39
- server_id=actual_server_id,
40
- transport_type=TransportType.STDIO,
41
- stdio_command=["in-process-stdio-server"]
42
- )
43
- logger.info(f"Configuring in-process STDIO server for agent '{agent.agent_id}' with config_id '{actual_server_id}'.")
44
-
45
- server_endpoint = AgentServerEndpoint(agent) # Pass single agent
46
-
47
- try:
48
- if not agent.is_running:
49
- logger.info(f"Starting agent '{agent.agent_id}' for STDIO hosting...")
50
- agent.start()
51
-
52
- logger.info(f"Starting STDIO server endpoint for agent '{agent.agent_id}'...")
53
- await server_endpoint.start(stdio_config)
54
-
55
- logger.info(f"Agent '{agent.agent_id}' now being served via STDIO. Waiting for stop signal...")
56
- await stop_event.wait()
57
- logger.info(f"Stop signal received for STDIO server of agent '{agent.agent_id}'.")
58
-
59
- except Exception as e:
60
- logger.error(f"Error during STDIO hosting for agent '{agent.agent_id}': {e}", exc_info=True)
61
- finally:
62
- logger.info(f"Shutting down STDIO server for agent '{agent.agent_id}'...")
63
- if server_endpoint.is_running:
64
- await server_endpoint.stop()
65
-
66
- if agent.is_running:
67
- logger.info(f"Stopping agent '{agent.agent_id}' after STDIO hosting...")
68
- await agent.stop()
69
- logger.info(f"STDIO hosting for agent '{agent.agent_id}' has shut down.")
70
-
71
-
72
- async def serve_single_agent_http_sse(
73
- agent: Agent,
74
- host: str,
75
- port: int,
76
- stop_event: asyncio.Event,
77
- server_id_prefix: str = "embedded_http_single",
78
- request_endpoint: str = "/rpc",
79
- events_endpoint_base: str = "/events" # Base path for events
80
- ) -> None:
81
- """
82
- Hosts a single Agent instance over HTTP/SSE within the current process.
83
- The agent will be accessible using its own agent_id as the key on the server
84
- (e.g., for SSE events: /events/{agent.agent_id}).
85
-
86
- Args:
87
- agent: The Agent instance to serve.
88
- host: The hostname or IP address to bind the HTTP server to.
89
- port: The port number to bind the HTTP server to.
90
- stop_event: An asyncio.Event that signals when to stop the server.
91
- server_id_prefix: Prefix for the server_id in the internal AgentServerConfig.
92
- request_endpoint: The URL path for RPC requests.
93
- events_endpoint_base: The base URL path for SSE event streams (agent_id will be appended).
94
- """
95
- # This function now essentially calls serve_multiple_agents_http_sse
96
- # The agent's own ID will be used as the key for routing on the server.
97
- agents_to_serve = {agent.agent_id: agent}
98
- await serve_multiple_agents_http_sse(
99
- agents=agents_to_serve,
100
- host=host,
101
- port=port,
102
- stop_event=stop_event,
103
- server_id_prefix=server_id_prefix,
104
- request_endpoint=request_endpoint,
105
- events_endpoint_base=events_endpoint_base
106
- )
107
-
108
-
109
- async def serve_multiple_agents_http_sse(
110
- agents: Dict[str, Agent], # Key: server-routable ID, Value: Agent instance
111
- host: str,
112
- port: int,
113
- stop_event: asyncio.Event,
114
- server_id_prefix: str = "embedded_http_multi",
115
- request_endpoint: str = "/rpc", # Single RPC endpoint for the gateway
116
- events_endpoint_base: str = "/events" # Base for /events/{agent_id_on_server}
117
- ) -> None:
118
- """
119
- Hosts multiple Agent instances over a single HTTP/SSE server within the current process.
120
- This function will run until the stop_event is set.
121
-
122
- Args:
123
- agents: A dictionary where keys are server-routable string IDs for each agent,
124
- and values are the Agent instances to serve.
125
- host: The hostname or IP address to bind the HTTP server to.
126
- port: The port number to bind the HTTP server to.
127
- stop_event: An asyncio.Event that signals when to stop the server.
128
- server_id_prefix: Prefix for the server_id in the internal AgentServerConfig for the gateway.
129
- request_endpoint: The URL path for all RPC requests (target_agent_id must be in payload).
130
- events_endpoint_base: The base URL path for SSE event streams. Clients subscribe to
131
- {events_endpoint_base}/{server_routable_agent_id}.
132
- """
133
- if not isinstance(agents, dict) or not agents:
134
- raise TypeError("agents must be a non-empty dictionary of [str, Agent] instances.")
135
- if not all(isinstance(k, str) and isinstance(v, Agent) for k, v in agents.items()):
136
- raise TypeError("agents dictionary keys must be strings and values must be Agent instances.")
137
- if not isinstance(stop_event, asyncio.Event):
138
- raise TypeError("stop_event must be an asyncio.Event")
139
-
140
- # server_id for the gateway server config
141
- gateway_server_id = f"{server_id_prefix}_gateway"
142
-
143
- sse_config = AgentServerConfig(
144
- server_id=gateway_server_id,
145
- transport_type=TransportType.SSE,
146
- sse_base_url=f"http://{host}:{port}", # type: ignore
147
- sse_request_endpoint=request_endpoint,
148
- sse_events_endpoint=events_endpoint_base # SseServerHandler will append /{agent_id_on_server}
149
- )
150
- routable_agent_ids = list(agents.keys())
151
- logger.info(f"Configuring in-process HTTP/SSE gateway server at {sse_config.sse_base_url} "
152
- f"(config_id: '{gateway_server_id}') to serve agents: {routable_agent_ids}.")
153
-
154
- server_endpoint = AgentServerEndpoint(agents) # Pass the dictionary of agents
155
-
156
- try:
157
- for agent_id_on_server, agent_instance in agents.items():
158
- if not agent_instance.is_running:
159
- logger.info(f"Starting agent '{agent_instance.agent_id}' (server key: '{agent_id_on_server}') for HTTP/SSE gateway hosting...")
160
- agent_instance.start()
161
-
162
- logger.info(f"Starting HTTP/SSE gateway server endpoint for agents: {routable_agent_ids}...")
163
- await server_endpoint.start(sse_config)
164
-
165
- logger.info(f"Multi-agent gateway now being served via HTTP/SSE on http://{host}:{port}. Waiting for stop signal...")
166
- await stop_event.wait()
167
- logger.info(f"Stop signal received for multi-agent HTTP/SSE gateway server.")
168
-
169
- except Exception as e:
170
- logger.error(f"Error during multi-agent HTTP/SSE hosting: {e}", exc_info=True)
171
- finally:
172
- logger.info(f"Shutting down multi-agent HTTP/SSE gateway server...")
173
- if server_endpoint.is_running:
174
- await server_endpoint.stop()
175
-
176
- for agent_id_on_server, agent_instance in agents.items():
177
- if agent_instance.is_running:
178
- logger.info(f"Stopping agent '{agent_instance.agent_id}' (server key: '{agent_id_on_server}')...")
179
- await agent_instance.stop()
180
- logger.info(f"Multi-agent HTTP/SSE hosting has shut down.")
181
-
182
-
183
- # Renamed old serve_agent_http_sse to serve_single_agent_http_sse
184
- # Kept the old signature for backward compatibility if any tests used it,
185
- # but it now delegates to the multi-agent version.
186
- async def serve_agent_http_sse(
187
- agent: Agent,
188
- host: str,
189
- port: int,
190
- stop_event: asyncio.Event,
191
- server_id_prefix: str = "embedded_http", # Note: prefix change if desired
192
- request_endpoint: str = "/rpc",
193
- events_endpoint_base: str = "/events"
194
- ) -> None:
195
- await serve_single_agent_http_sse(
196
- agent, host, port, stop_event, server_id_prefix, request_endpoint, events_endpoint_base
197
- )
198
-
199
-
200
- if __name__ == "__main__": # pragma: no cover
201
- logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(name)s - %(levelname)s - %(message)s')
202
- from autobyteus.agent.registry.agent_definition import AgentDefinition
203
- from autobyteus.agent.registry.agent_registry import default_agent_registry, default_definition_registry
204
- from autobyteus.llm.models import LLMModel
205
- try: import autobyteus.agent.input_processor
206
- except ImportError: print("Warning: input_processor module not found.", file=sys.stderr)
207
-
208
- def create_example_agent(name: str, role: str) -> Optional[Agent]:
209
- agent_def = default_definition_registry.get(name, role)
210
- if not agent_def:
211
- try:
212
- agent_def = AgentDefinition(name=name, role=role, description=f"{name} agent",
213
- system_prompt=f"You are {name}.", tool_names=[],
214
- input_processor_names=["PassthroughInputProcessor"])
215
- except Exception as e_def:
216
- logger.error(f"Failed to create def for {name}: {e_def}"); return None
217
-
218
- try: chosen_llm_model = next(iter(LLMModel)) if LLMModel else None
219
- except StopIteration: chosen_llm_model = None
220
- if not chosen_llm_model:
221
- class MockLLMModel(str, Enum): DUMMY = "dummy_model" # type: ignore
222
- LLMModel = MockLLMModel # type: ignore
223
- chosen_llm_model = LLMModel.DUMMY
224
-
225
- if chosen_llm_model:
226
- try: return default_agent_registry.create_agent(definition=agent_def, llm_model=chosen_llm_model)
227
- except Exception as e_create: logger.error(f"Failed to create agent {name}: {e_create}", exc_info=True)
228
- return None
229
-
230
- agent1 = create_example_agent("AgentAlpha", "analyzer")
231
- agent2 = create_example_agent("AgentBeta", "writer")
232
-
233
- if agent1 and agent2:
234
- agents_for_server = {
235
- "alpha": agent1, # Routable ID "alpha" maps to AgentAlpha
236
- "beta": agent2 # Routable ID "beta" maps to AgentBeta
237
- }
238
- # Example: Run the multi-agent SSE server
239
- asyncio.run(serve_multiple_agents_http_sse(agents_for_server, "127.0.0.1", 8888, asyncio.Event()))
240
- # To test, connect to http://127.0.0.1:8888/events/alpha and /events/beta for SSE
241
- # Send POST to http://127.0.0.1:8888/rpc with {"target_agent_id": "alpha", ...}
242
- else:
243
- logger.error("Could not create example agents for multi-agent hosting demo.")
244
-
@@ -1,244 +0,0 @@
1
- # file: autobyteus/autobyteus/rpc/protocol.py
2
- import logging
3
- from enum import Enum
4
- from typing import Optional, Dict, Any, List, Union
5
- from pydantic import BaseModel, Field, validator
6
- import uuid
7
-
8
- logger = logging.getLogger(__name__)
9
-
10
- class MessageType(str, Enum):
11
- """Type of the ProtocolMessage."""
12
- REQUEST = "request"
13
- RESPONSE = "response"
14
- ERROR = "error"
15
- EVENT = "event" # For server-pushed events, e.g., via SSE
16
-
17
- class RequestType(str, Enum):
18
- """Specific method/type for a 'request' message."""
19
- DISCOVER_CAPABILITIES = "discover_capabilities"
20
- INVOKE_METHOD = "invoke_method"
21
- REQUEST_STREAM_DOWNLOAD = "request_stream_download" # New request type for stream download
22
- # Other specific control messages can be added here
23
-
24
- class ResponseType(str, Enum):
25
- """Specific type for a 'response' message, often mirroring RequestType."""
26
- CAPABILITIES_RESPONSE = "capabilities_response"
27
- METHOD_RESULT = "method_result"
28
- ACKNOWLEDGEMENT = "acknowledgement" # Generic ack
29
- STREAM_DOWNLOAD_READY = "stream_download_ready" # New response type for stream download
30
-
31
- class EventType(str, Enum):
32
- """Specific type for an 'event' message (server-pushed)."""
33
- AGENT_OUTPUT_CHUNK = "agent_output_chunk"
34
- AGENT_FINAL_MESSAGE = "agent_final_message"
35
- AGENT_STATUS_UPDATE = "agent_status_update"
36
- TOOL_LOG_ENTRY = "tool_log_entry"
37
- # Other event types
38
-
39
- class ErrorCode(Enum):
40
- """Standard error codes for RPC communication."""
41
- PARSE_ERROR = -32700
42
- INVALID_REQUEST = -32600
43
- METHOD_NOT_FOUND = -32601
44
- INVALID_PARAMS = -32602
45
- INTERNAL_ERROR = -32603
46
- # Custom server errors: -32000 to -32099
47
- SERVER_ERROR_AGENT_PROCESSING_FAILED = -32000
48
- SERVER_ERROR_CAPABILITY_DISCOVERY_FAILED = -32001
49
- SERVER_ERROR_UNAUTHORIZED = -32002 # If auth is added
50
- SERVER_ERROR_TIMEOUT = -32003
51
- SERVER_ERROR_STREAM_PREPARATION_FAILED = -32004 # For stream download errors
52
- SERVER_ERROR_STREAM_NOT_FOUND = -32005 # If stream_id is invalid
53
-
54
- class ErrorDetails(BaseModel):
55
- """Structure for error details within a ProtocolMessage."""
56
- code: Union[ErrorCode, int] # Allow standard ErrorCode or custom int
57
- message: str
58
- data: Optional[Any] = None # Optional additional error data
59
-
60
- @validator('code', pre=True)
61
- def _validate_code(cls, v):
62
- if isinstance(v, ErrorCode):
63
- return v.value # Store the integer value of the enum
64
- if isinstance(v, int):
65
- return v
66
- raise ValueError("Error code must be an ErrorCode enum member or an integer.")
67
-
68
- class ProtocolMessage(BaseModel):
69
- """
70
- Defines the structure for all RPC communications.
71
- Based on JSON-RPC 2.0 concepts but adapted for AutoByteUs needs.
72
- """
73
- # Common fields for all message types
74
- type: MessageType = Field(..., description="The main type of the message (request, response, error, event).")
75
- id: Optional[str] = Field(default=None, description="Correlation ID for requests/responses. Can be string or number, UUID for simplicity here.")
76
-
77
- # Fields specific to 'request' type
78
- method: Optional[Union[RequestType, str]] = Field(default=None, description="Method name for 'request' type (e.g., 'discover_capabilities', 'invoke_method', or a custom agent method name).")
79
- params: Optional[Dict[str, Any]] = Field(default=None, description="Parameters for the method in 'request' type.")
80
-
81
- # Fields specific to 'response' type
82
- result: Optional[Any] = Field(default=None, description="Payload of a successful 'response'.")
83
- response_type: Optional[ResponseType] = Field(default=None, description="Specific type of a 'response', e.g., 'capabilities_response'.")
84
-
85
-
86
- # Fields specific to 'error' type (when type is MessageType.ERROR)
87
- error: Optional[ErrorDetails] = Field(default=None, description="Error details if the message type is 'error'.")
88
-
89
- # Fields specific to 'event' type (server-pushed)
90
- event_type: Optional[Union[EventType, str]] = Field(default=None, description="Specific type of 'event' (server-pushed).")
91
- payload: Optional[Dict[str, Any]] = Field(default=None, description="Data payload for an 'event'.")
92
-
93
- # Auto-generated fields (optional, can be added by sender if needed)
94
- # timestamp: datetime = Field(default_factory=lambda: datetime.now(timezone.utc))
95
-
96
- class Config:
97
- use_enum_values = True # Serialize enums to their values
98
- validate_assignment = True
99
-
100
- @validator('id', pre=True, always=True)
101
- def set_default_id_for_requests(cls, v, values):
102
- # Ensure requests have an ID, generate if not provided
103
- if values.get('type') == MessageType.REQUEST and v is None:
104
- return str(uuid.uuid4())
105
- return v
106
-
107
- @validator('error')
108
- def check_error_for_error_type(cls, v, values):
109
- if values.get('type') == MessageType.ERROR and v is None:
110
- raise ValueError("Field 'error' is required when message 'type' is ERROR.")
111
- if values.get('type') != MessageType.ERROR and v is not None:
112
- raise ValueError("Field 'error' should only be present when message 'type' is ERROR.")
113
- return v
114
-
115
- @validator('result')
116
- def check_result_for_response_type(cls, v, values):
117
- if values.get('type') == MessageType.RESPONSE and values.get('error') is not None:
118
- raise ValueError("Fields 'result' and 'error' must not coexist in a RESPONSE message.")
119
- if values.get('type') == MessageType.RESPONSE and v is None and values.get('error') is None:
120
- # Allow responses with null result explicitly if that's valid (e.g. for simple ack)
121
- # This validation might be too strict depending on use case.
122
- # For now, permit null result for acknowledgements and stream_download_ready (which will be populated by server handler)
123
- if values.get('response_type') not in [ResponseType.ACKNOWLEDGEMENT, ResponseType.STREAM_DOWNLOAD_READY]:
124
- logger.debug("Field 'result' is None for a non-acknowledgement/non-stream_download_ready RESPONSE message.")
125
- return v
126
-
127
- @validator('method', 'params')
128
- def check_request_fields(cls, v, field, values):
129
- if values.get('type') == MessageType.REQUEST and v is None and field.name == 'method':
130
- raise ValueError(f"Field '{field.name}' is required when message 'type' is REQUEST.")
131
- if values.get('type') != MessageType.REQUEST and v is not None:
132
- raise ValueError(f"Field '{field.name}' should only be present when message 'type' is REQUEST.")
133
- return v
134
-
135
- @validator('event_type', 'payload')
136
- def check_event_fields(cls, v, field, values):
137
- if values.get('type') == MessageType.EVENT and v is None and field.name == 'event_type':
138
- raise ValueError(f"Field 'event_type' is required when message 'type' is EVENT.")
139
- # Payload can be optional even for event type
140
- if values.get('type') != MessageType.EVENT and v is not None:
141
- raise ValueError(f"Field '{field.name}' should only be present when message 'type' is EVENT.")
142
- return v
143
-
144
- def to_json_str(self) -> str:
145
- """Serializes the ProtocolMessage to a JSON string."""
146
- return self.model_dump_json(exclude_none=True)
147
-
148
- @classmethod
149
- def from_json_str(cls, json_str: str) -> 'ProtocolMessage':
150
- """Deserializes a ProtocolMessage from a JSON string."""
151
- return cls.model_validate_json(json_str)
152
-
153
- # Factory methods for convenience
154
- @classmethod
155
- def create_request(cls, method: Union[RequestType, str], params: Optional[Dict[str, Any]] = None, id: Optional[str] = None) -> 'ProtocolMessage':
156
- return cls(type=MessageType.REQUEST, method=method, params=params or {}, id=id or str(uuid.uuid4()))
157
-
158
- @classmethod
159
- def create_response(cls, id: str, result: Any, response_type: Optional[ResponseType] = ResponseType.METHOD_RESULT) -> 'ProtocolMessage':
160
- return cls(type=MessageType.RESPONSE, id=id, result=result, response_type=response_type)
161
-
162
- @classmethod
163
- def create_error_response(cls, id: Optional[str], code: Union[ErrorCode, int], message: str, data: Optional[Any] = None) -> 'ProtocolMessage':
164
- actual_code = code.value if isinstance(code, ErrorCode) else code
165
- return cls(type=MessageType.ERROR, id=id, error=ErrorDetails(code=actual_code, message=message, data=data))
166
-
167
- @classmethod
168
- def create_event(cls, event_type: Union[EventType, str], payload: Optional[Dict[str, Any]] = None) -> 'ProtocolMessage':
169
- return cls(type=MessageType.EVENT, event_type=event_type, payload=payload or {})
170
-
171
-
172
- if __name__ == "__main__": # pragma: no cover
173
- # Example Usage
174
- logging.basicConfig(level=logging.DEBUG)
175
-
176
- # Request
177
- cap_request = ProtocolMessage.create_request(RequestType.DISCOVER_CAPABILITIES)
178
- logger.info(f"Capability Request: {cap_request.to_json_str()}")
179
-
180
- invoke_request_params = {"tool_name": "calculator", "args": {"operation": "add", "a": 5, "b": 3}}
181
- invoke_request = ProtocolMessage.create_request(RequestType.INVOKE_METHOD, params=invoke_request_params)
182
- logger.info(f"Invoke Request: {invoke_request.to_json_str()}")
183
-
184
- custom_invoke_req = ProtocolMessage.create_request("custom_agent_method", params={"input_data": "hello"})
185
- logger.info(f"Custom Invoke Request: {custom_invoke_req.to_json_str()}")
186
-
187
- stream_download_req = ProtocolMessage.create_request(RequestType.REQUEST_STREAM_DOWNLOAD, params={"resource_id": "large_file.dat"})
188
- logger.info(f"Stream Download Request: {stream_download_req.to_json_str()}")
189
-
190
- # Response
191
- cap_response_result = {"agent_id": "server_agent_001", "capabilities": ["post_inter_agent_message", "get_status"]}
192
- cap_response = ProtocolMessage.create_response(id=cap_request.id, result=cap_response_result, response_type=ResponseType.CAPABILITIES_RESPONSE)
193
- logger.info(f"Capability Response: {cap_response.to_json_str()}")
194
-
195
- invoke_response_result = {"output": 8}
196
- invoke_response = ProtocolMessage.create_response(id=invoke_request.id, result=invoke_response_result)
197
- logger.info(f"Invoke Response: {invoke_response.to_json_str()}")
198
-
199
- ack_response = ProtocolMessage.create_response(id=custom_invoke_req.id, result=None, response_type=ResponseType.ACKNOWLEDGEMENT)
200
- logger.info(f"Ack Response: {ack_response.to_json_str()}")
201
-
202
- stream_download_ready_result = {"stream_id": "uuid-for-stream", "metadata": {"filename": "large_file.dat", "size": 1024000}}
203
- # Note: download_url would be added by SseServerHandler before sending to client
204
- stream_download_ready_resp = ProtocolMessage.create_response(id=stream_download_req.id, result=stream_download_ready_result, response_type=ResponseType.STREAM_DOWNLOAD_READY)
205
- logger.info(f"Stream Download Ready Response (initial): {stream_download_ready_resp.to_json_str()}")
206
-
207
-
208
- # Error Response
209
- error_resp = ProtocolMessage.create_error_response(id=invoke_request.id, code=ErrorCode.METHOD_NOT_FOUND, message="Method not supported by agent.")
210
- logger.info(f"Error Response: {error_resp.to_json_str()}")
211
-
212
- parse_error_resp = ProtocolMessage.create_error_response(id=None, code=ErrorCode.PARSE_ERROR, message="Invalid JSON received.")
213
- logger.info(f"Parse Error Response (no ID): {parse_error_resp.to_json_str()}")
214
-
215
- stream_error_resp = ProtocolMessage.create_error_response(
216
- id=stream_download_req.id,
217
- code=ErrorCode.SERVER_ERROR_STREAM_PREPARATION_FAILED,
218
- message="Agent failed to prepare the stream for resource 'large_file.dat'."
219
- )
220
- logger.info(f"Stream Preparation Error Response: {stream_error_resp.to_json_str()}")
221
-
222
- # Event
223
- status_event = ProtocolMessage.create_event(EventType.AGENT_STATUS_UPDATE, payload={"status": "running"})
224
- logger.info(f"Status Event: {status_event.to_json_str()}")
225
-
226
- # Test validation
227
- try:
228
- invalid_msg = ProtocolMessage(type=MessageType.REQUEST) # Missing method
229
- except ValueError as e:
230
- logger.error(f"Validation Error: {e}")
231
-
232
- try:
233
- invalid_error_msg = ProtocolMessage(type=MessageType.ERROR, id="123") # Missing error field
234
- except ValueError as e:
235
- logger.error(f"Validation Error: {e}")
236
-
237
- try:
238
- error_details_invalid_code = ErrorDetails(code="INVALID_CODE_STR", message="test")
239
- except ValueError as e:
240
- logger.error(f"Validation Error (ErrorDetails): {e}")
241
-
242
- error_details_valid_int_code = ErrorDetails(code=-32050, message="Custom server error")
243
- logger.info(f"ErrorDetails with int code: {error_details_valid_int_code.model_dump_json()}")
244
- assert error_details_valid_int_code.code == -32050
@@ -1,20 +0,0 @@
1
- # file: autobyteus/autobyteus/rpc/server/__init__.py
2
- """
3
- Server-side components for the AutoByteUs RPC framework.
4
- These components enable an AgentRuntime to expose its capabilities remotely.
5
- """
6
- from .base_method_handler import BaseMethodHandler
7
- from .method_handlers import DiscoverCapabilitiesHandler, InvokeMethodHandler, InitiateStreamDownloadHandler # Added InitiateStreamDownloadHandler
8
- from .stdio_server_handler import StdioServerHandler
9
- from .sse_server_handler import SseServerHandler
10
- from .agent_server_endpoint import AgentServerEndpoint
11
-
12
- __all__ = [
13
- "BaseMethodHandler",
14
- "DiscoverCapabilitiesHandler",
15
- "InvokeMethodHandler",
16
- "InitiateStreamDownloadHandler", # Added InitiateStreamDownloadHandler
17
- "StdioServerHandler",
18
- "SseServerHandler",
19
- "AgentServerEndpoint",
20
- ]