autobyteus 1.2.0__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 (512) 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 +23 -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 +74 -60
  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/message/send_message_to.py +5 -4
  39. autobyteus/agent/runtime/agent_runtime.py +29 -21
  40. autobyteus/agent/runtime/agent_worker.py +98 -19
  41. autobyteus/agent/shutdown_steps/__init__.py +2 -0
  42. autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
  43. autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
  44. autobyteus/agent/status/__init__.py +14 -0
  45. autobyteus/agent/status/manager.py +93 -0
  46. autobyteus/agent/status/status_deriver.py +96 -0
  47. autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
  48. autobyteus/agent/status/status_update_utils.py +73 -0
  49. autobyteus/agent/streaming/__init__.py +52 -5
  50. autobyteus/agent/streaming/adapters/__init__.py +18 -0
  51. autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
  52. autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
  53. autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
  54. autobyteus/agent/streaming/agent_event_stream.py +3 -178
  55. autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
  56. autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
  57. autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
  58. autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
  59. autobyteus/agent/streaming/events/__init__.py +6 -0
  60. autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
  61. autobyteus/agent/streaming/events/stream_events.py +141 -0
  62. autobyteus/agent/streaming/handlers/__init__.py +15 -0
  63. autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
  64. autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
  65. autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
  66. autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
  67. autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
  68. autobyteus/agent/streaming/parser/__init__.py +61 -0
  69. autobyteus/agent/streaming/parser/event_emitter.py +181 -0
  70. autobyteus/agent/streaming/parser/events.py +4 -0
  71. autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
  72. autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
  73. autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
  74. autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
  75. autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
  76. autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
  77. autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
  78. autobyteus/agent/streaming/parser/parser_context.py +227 -0
  79. autobyteus/agent/streaming/parser/parser_factory.py +132 -0
  80. autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
  81. autobyteus/agent/streaming/parser/state_factory.py +62 -0
  82. autobyteus/agent/streaming/parser/states/__init__.py +1 -0
  83. autobyteus/agent/streaming/parser/states/base_state.py +60 -0
  84. autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
  85. autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
  86. autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
  87. autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
  88. autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
  89. autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
  90. autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
  91. autobyteus/agent/streaming/parser/states/text_state.py +78 -0
  92. autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
  93. autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
  94. autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
  95. autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
  96. autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
  97. autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
  98. autobyteus/agent/streaming/parser/strategies/base.py +24 -0
  99. autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
  100. autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
  101. autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
  102. autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
  103. autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
  104. autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
  105. autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
  106. autobyteus/agent/streaming/parser/tool_constants.py +7 -0
  107. autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
  108. autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
  109. autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
  110. autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
  111. autobyteus/agent/streaming/queue_streamer.py +3 -57
  112. autobyteus/agent/streaming/segments/__init__.py +5 -0
  113. autobyteus/agent/streaming/segments/segment_events.py +81 -0
  114. autobyteus/agent/streaming/stream_event_payloads.py +2 -198
  115. autobyteus/agent/streaming/stream_events.py +3 -128
  116. autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
  117. autobyteus/agent/streaming/streaming_response_handler.py +4 -0
  118. autobyteus/agent/streaming/streams/__init__.py +5 -0
  119. autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
  120. autobyteus/agent/streaming/utils/__init__.py +5 -0
  121. autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
  122. autobyteus/agent/system_prompt_processor/__init__.py +2 -0
  123. autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
  124. autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
  125. autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
  126. autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
  127. autobyteus/agent/token_budget.py +56 -0
  128. autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
  129. autobyteus/agent/tool_invocation.py +16 -40
  130. autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
  131. autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
  132. autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
  133. autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
  134. autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
  135. autobyteus/agent/utils/wait_for_idle.py +12 -14
  136. autobyteus/agent/workspace/base_workspace.py +6 -27
  137. autobyteus/agent_team/agent_team.py +3 -3
  138. autobyteus/agent_team/agent_team_builder.py +1 -41
  139. autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
  140. autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
  141. autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
  142. autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
  143. autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
  144. autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
  145. autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
  146. autobyteus/agent_team/context/agent_team_config.py +6 -3
  147. autobyteus/agent_team/context/agent_team_context.py +25 -3
  148. autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
  149. autobyteus/agent_team/events/__init__.py +11 -0
  150. autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
  151. autobyteus/agent_team/events/agent_team_events.py +16 -0
  152. autobyteus/agent_team/events/event_store.py +57 -0
  153. autobyteus/agent_team/factory/agent_team_factory.py +8 -0
  154. autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
  155. autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
  156. autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
  157. autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
  158. autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
  159. autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
  160. autobyteus/agent_team/status/__init__.py +14 -0
  161. autobyteus/agent_team/status/agent_team_status.py +18 -0
  162. autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
  163. autobyteus/agent_team/status/status_deriver.py +62 -0
  164. autobyteus/agent_team/status/status_update_utils.py +42 -0
  165. autobyteus/agent_team/streaming/__init__.py +2 -2
  166. autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
  167. autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
  168. autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
  169. autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
  170. autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
  171. autobyteus/agent_team/task_notification/activation_policy.py +1 -1
  172. autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
  173. autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
  174. autobyteus/agent_team/utils/wait_for_idle.py +4 -4
  175. autobyteus/cli/agent_cli.py +18 -10
  176. autobyteus/cli/agent_team_tui/app.py +18 -15
  177. autobyteus/cli/agent_team_tui/state.py +21 -23
  178. autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
  179. autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
  180. autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
  181. autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
  182. autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
  183. autobyteus/cli/cli_display.py +193 -44
  184. autobyteus/cli/workflow_tui/app.py +9 -10
  185. autobyteus/cli/workflow_tui/state.py +14 -16
  186. autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
  187. autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
  188. autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
  189. autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
  190. autobyteus/clients/autobyteus_client.py +94 -1
  191. autobyteus/events/event_types.py +15 -21
  192. autobyteus/llm/api/autobyteus_llm.py +33 -29
  193. autobyteus/llm/api/claude_llm.py +142 -36
  194. autobyteus/llm/api/gemini_llm.py +163 -59
  195. autobyteus/llm/api/grok_llm.py +1 -1
  196. autobyteus/llm/api/minimax_llm.py +26 -0
  197. autobyteus/llm/api/mistral_llm.py +113 -87
  198. autobyteus/llm/api/ollama_llm.py +9 -42
  199. autobyteus/llm/api/openai_compatible_llm.py +127 -91
  200. autobyteus/llm/api/openai_llm.py +3 -3
  201. autobyteus/llm/api/openai_responses_llm.py +324 -0
  202. autobyteus/llm/api/zhipu_llm.py +21 -2
  203. autobyteus/llm/autobyteus_provider.py +70 -60
  204. autobyteus/llm/base_llm.py +85 -81
  205. autobyteus/llm/converters/__init__.py +14 -0
  206. autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
  207. autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
  208. autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
  209. autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
  210. autobyteus/llm/extensions/base_extension.py +6 -12
  211. autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
  212. autobyteus/llm/llm_factory.py +282 -204
  213. autobyteus/llm/lmstudio_provider.py +60 -49
  214. autobyteus/llm/models.py +35 -2
  215. autobyteus/llm/ollama_provider.py +60 -49
  216. autobyteus/llm/ollama_provider_resolver.py +0 -1
  217. autobyteus/llm/prompt_renderers/__init__.py +19 -0
  218. autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
  219. autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
  220. autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
  221. autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
  222. autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
  223. autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
  224. autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
  225. autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
  226. autobyteus/llm/providers.py +1 -3
  227. autobyteus/llm/token_counter/claude_token_counter.py +56 -25
  228. autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
  229. autobyteus/llm/token_counter/openai_token_counter.py +24 -5
  230. autobyteus/llm/token_counter/token_counter_factory.py +12 -5
  231. autobyteus/llm/utils/llm_config.py +6 -12
  232. autobyteus/llm/utils/media_payload_formatter.py +27 -20
  233. autobyteus/llm/utils/messages.py +55 -3
  234. autobyteus/llm/utils/response_types.py +3 -0
  235. autobyteus/llm/utils/tool_call_delta.py +31 -0
  236. autobyteus/memory/__init__.py +32 -0
  237. autobyteus/memory/active_transcript.py +69 -0
  238. autobyteus/memory/compaction/__init__.py +9 -0
  239. autobyteus/memory/compaction/compaction_result.py +8 -0
  240. autobyteus/memory/compaction/compactor.py +89 -0
  241. autobyteus/memory/compaction/summarizer.py +11 -0
  242. autobyteus/memory/compaction_snapshot_builder.py +84 -0
  243. autobyteus/memory/memory_manager.py +183 -0
  244. autobyteus/memory/models/__init__.py +14 -0
  245. autobyteus/memory/models/episodic_item.py +41 -0
  246. autobyteus/memory/models/memory_types.py +7 -0
  247. autobyteus/memory/models/raw_trace_item.py +79 -0
  248. autobyteus/memory/models/semantic_item.py +41 -0
  249. autobyteus/memory/models/tool_interaction.py +20 -0
  250. autobyteus/memory/policies/__init__.py +5 -0
  251. autobyteus/memory/policies/compaction_policy.py +16 -0
  252. autobyteus/memory/retrieval/__init__.py +7 -0
  253. autobyteus/memory/retrieval/memory_bundle.py +11 -0
  254. autobyteus/memory/retrieval/retriever.py +13 -0
  255. autobyteus/memory/store/__init__.py +7 -0
  256. autobyteus/memory/store/base_store.py +14 -0
  257. autobyteus/memory/store/file_store.py +98 -0
  258. autobyteus/memory/tool_interaction_builder.py +46 -0
  259. autobyteus/memory/turn_tracker.py +9 -0
  260. autobyteus/multimedia/audio/api/__init__.py +3 -2
  261. autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
  262. autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
  263. autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
  264. autobyteus/multimedia/audio/audio_client_factory.py +84 -9
  265. autobyteus/multimedia/audio/audio_model.py +2 -1
  266. autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
  267. autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
  268. autobyteus/multimedia/image/api/openai_image_client.py +125 -43
  269. autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
  270. autobyteus/multimedia/image/image_client_factory.py +47 -15
  271. autobyteus/multimedia/image/image_model.py +5 -2
  272. autobyteus/multimedia/providers.py +3 -2
  273. autobyteus/skills/loader.py +71 -0
  274. autobyteus/skills/model.py +11 -0
  275. autobyteus/skills/registry.py +70 -0
  276. autobyteus/task_management/__init__.py +43 -20
  277. autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
  278. autobyteus/task_management/converters/__init__.py +2 -2
  279. autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
  280. autobyteus/task_management/events.py +7 -7
  281. autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
  282. autobyteus/task_management/schemas/__init__.py +3 -0
  283. autobyteus/task_management/schemas/task_status_report.py +2 -2
  284. autobyteus/task_management/schemas/todo_definition.py +15 -0
  285. autobyteus/task_management/todo.py +29 -0
  286. autobyteus/task_management/todo_list.py +75 -0
  287. autobyteus/task_management/tools/__init__.py +24 -8
  288. autobyteus/task_management/tools/task_tools/__init__.py +19 -0
  289. autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
  290. autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
  291. autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
  292. autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
  293. autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
  294. autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
  295. autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
  296. autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
  297. autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
  298. autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
  299. autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
  300. autobyteus/tools/__init__.py +43 -52
  301. autobyteus/tools/base_tool.py +7 -0
  302. autobyteus/tools/file/__init__.py +9 -0
  303. autobyteus/tools/file/patch_file.py +149 -0
  304. autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
  305. autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
  306. autobyteus/tools/functional_tool.py +53 -14
  307. autobyteus/tools/mcp/__init__.py +2 -0
  308. autobyteus/tools/mcp/config_service.py +5 -1
  309. autobyteus/tools/mcp/server/__init__.py +2 -0
  310. autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
  311. autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
  312. autobyteus/tools/mcp/server_instance_manager.py +8 -1
  313. autobyteus/tools/mcp/tool.py +3 -3
  314. autobyteus/tools/mcp/tool_registrar.py +5 -2
  315. autobyteus/tools/mcp/types.py +61 -0
  316. autobyteus/tools/multimedia/__init__.py +2 -1
  317. autobyteus/tools/multimedia/audio_tools.py +72 -19
  318. autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
  319. autobyteus/tools/multimedia/image_tools.py +248 -64
  320. autobyteus/tools/multimedia/media_reader_tool.py +1 -1
  321. autobyteus/tools/operation_executor/journal_manager.py +107 -0
  322. autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
  323. autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
  324. autobyteus/tools/operation_executor/operation_executor.py +58 -0
  325. autobyteus/tools/registry/tool_definition.py +108 -14
  326. autobyteus/tools/registry/tool_registry.py +29 -0
  327. autobyteus/tools/search/__init__.py +17 -0
  328. autobyteus/tools/search/base_strategy.py +35 -0
  329. autobyteus/tools/search/client.py +24 -0
  330. autobyteus/tools/search/factory.py +81 -0
  331. autobyteus/tools/search/google_cse_strategy.py +68 -0
  332. autobyteus/tools/search/providers.py +10 -0
  333. autobyteus/tools/search/serpapi_strategy.py +65 -0
  334. autobyteus/tools/search/serper_strategy.py +87 -0
  335. autobyteus/tools/search_tool.py +83 -0
  336. autobyteus/tools/skill/load_skill.py +50 -0
  337. autobyteus/tools/terminal/__init__.py +45 -0
  338. autobyteus/tools/terminal/ansi_utils.py +32 -0
  339. autobyteus/tools/terminal/background_process_manager.py +233 -0
  340. autobyteus/tools/terminal/output_buffer.py +105 -0
  341. autobyteus/tools/terminal/prompt_detector.py +63 -0
  342. autobyteus/tools/terminal/pty_session.py +241 -0
  343. autobyteus/tools/terminal/session_factory.py +20 -0
  344. autobyteus/tools/terminal/terminal_session_manager.py +226 -0
  345. autobyteus/tools/terminal/tools/__init__.py +13 -0
  346. autobyteus/tools/terminal/tools/get_process_output.py +81 -0
  347. autobyteus/tools/terminal/tools/run_bash.py +109 -0
  348. autobyteus/tools/terminal/tools/start_background_process.py +104 -0
  349. autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
  350. autobyteus/tools/terminal/types.py +54 -0
  351. autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
  352. autobyteus/tools/terminal/wsl_utils.py +156 -0
  353. autobyteus/tools/tool_meta.py +4 -24
  354. autobyteus/tools/transaction_management/backup_handler.py +48 -0
  355. autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
  356. autobyteus/tools/usage/__init__.py +1 -2
  357. autobyteus/tools/usage/formatters/__init__.py +17 -1
  358. autobyteus/tools/usage/formatters/base_formatter.py +8 -0
  359. autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
  360. autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
  361. autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
  362. autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
  363. autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
  364. autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
  365. autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
  366. autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
  367. autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
  368. autobyteus/tools/usage/registries/__init__.py +1 -3
  369. autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
  370. autobyteus/tools/usage/tool_schema_provider.py +51 -0
  371. autobyteus/tools/web/__init__.py +4 -0
  372. autobyteus/tools/web/read_url_tool.py +80 -0
  373. autobyteus/utils/diff_utils.py +271 -0
  374. autobyteus/utils/download_utils.py +109 -0
  375. autobyteus/utils/file_utils.py +57 -2
  376. autobyteus/utils/gemini_helper.py +56 -0
  377. autobyteus/utils/gemini_model_mapping.py +71 -0
  378. autobyteus/utils/llm_output_formatter.py +75 -0
  379. autobyteus/utils/tool_call_format.py +36 -0
  380. autobyteus/workflow/agentic_workflow.py +3 -3
  381. autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
  382. autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
  383. autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
  384. autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
  385. autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
  386. autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
  387. autobyteus/workflow/context/workflow_context.py +3 -3
  388. autobyteus/workflow/context/workflow_runtime_state.py +5 -5
  389. autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
  390. autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
  391. autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
  392. autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
  393. autobyteus/workflow/runtime/workflow_runtime.py +8 -8
  394. autobyteus/workflow/runtime/workflow_worker.py +3 -3
  395. autobyteus/workflow/status/__init__.py +11 -0
  396. autobyteus/workflow/status/workflow_status.py +19 -0
  397. autobyteus/workflow/status/workflow_status_manager.py +48 -0
  398. autobyteus/workflow/streaming/__init__.py +2 -2
  399. autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
  400. autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
  401. autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
  402. autobyteus/workflow/utils/wait_for_idle.py +4 -4
  403. autobyteus-1.2.3.dist-info/METADATA +293 -0
  404. autobyteus-1.2.3.dist-info/RECORD +600 -0
  405. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
  406. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
  407. autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
  408. autobyteus/agent/hooks/__init__.py +0 -16
  409. autobyteus/agent/hooks/base_phase_hook.py +0 -78
  410. autobyteus/agent/hooks/hook_definition.py +0 -36
  411. autobyteus/agent/hooks/hook_meta.py +0 -37
  412. autobyteus/agent/hooks/hook_registry.py +0 -106
  413. autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
  414. autobyteus/agent/phases/__init__.py +0 -18
  415. autobyteus/agent/phases/discover.py +0 -53
  416. autobyteus/agent/phases/manager.py +0 -265
  417. autobyteus/agent/phases/transition_decorator.py +0 -40
  418. autobyteus/agent/phases/transition_info.py +0 -33
  419. autobyteus/agent/remote_agent.py +0 -244
  420. autobyteus/agent/workspace/workspace_definition.py +0 -36
  421. autobyteus/agent/workspace/workspace_meta.py +0 -37
  422. autobyteus/agent/workspace/workspace_registry.py +0 -72
  423. autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
  424. autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
  425. autobyteus/agent_team/phases/__init__.py +0 -11
  426. autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
  427. autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
  428. autobyteus/llm/api/bedrock_llm.py +0 -92
  429. autobyteus/llm/api/groq_llm.py +0 -94
  430. autobyteus/llm/api/nvidia_llm.py +0 -108
  431. autobyteus/llm/utils/token_pricing_config.py +0 -87
  432. autobyteus/person/examples/sample_persons.py +0 -14
  433. autobyteus/person/examples/sample_roles.py +0 -14
  434. autobyteus/person/person.py +0 -29
  435. autobyteus/person/role.py +0 -14
  436. autobyteus/rpc/__init__.py +0 -73
  437. autobyteus/rpc/client/__init__.py +0 -17
  438. autobyteus/rpc/client/abstract_client_connection.py +0 -124
  439. autobyteus/rpc/client/client_connection_manager.py +0 -153
  440. autobyteus/rpc/client/sse_client_connection.py +0 -306
  441. autobyteus/rpc/client/stdio_client_connection.py +0 -280
  442. autobyteus/rpc/config/__init__.py +0 -13
  443. autobyteus/rpc/config/agent_server_config.py +0 -153
  444. autobyteus/rpc/config/agent_server_registry.py +0 -152
  445. autobyteus/rpc/hosting.py +0 -244
  446. autobyteus/rpc/protocol.py +0 -244
  447. autobyteus/rpc/server/__init__.py +0 -20
  448. autobyteus/rpc/server/agent_server_endpoint.py +0 -181
  449. autobyteus/rpc/server/base_method_handler.py +0 -40
  450. autobyteus/rpc/server/method_handlers.py +0 -259
  451. autobyteus/rpc/server/sse_server_handler.py +0 -182
  452. autobyteus/rpc/server/stdio_server_handler.py +0 -151
  453. autobyteus/rpc/server_main.py +0 -198
  454. autobyteus/rpc/transport_type.py +0 -13
  455. autobyteus/tools/bash/__init__.py +0 -2
  456. autobyteus/tools/bash/bash_executor.py +0 -100
  457. autobyteus/tools/browser/__init__.py +0 -2
  458. autobyteus/tools/browser/session_aware/__init__.py +0 -0
  459. autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
  460. autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
  461. autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
  462. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
  463. autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
  464. autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
  465. autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
  466. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
  467. autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
  468. autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
  469. autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
  470. autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
  471. autobyteus/tools/browser/standalone/__init__.py +0 -6
  472. autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
  473. autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
  474. autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
  475. autobyteus/tools/browser/standalone/navigate_to.py +0 -80
  476. autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
  477. autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
  478. autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
  479. autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
  480. autobyteus/tools/file/file_editor.py +0 -200
  481. autobyteus/tools/google_search.py +0 -149
  482. autobyteus/tools/timer.py +0 -171
  483. autobyteus/tools/usage/parsers/__init__.py +0 -22
  484. autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
  485. autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
  486. autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
  487. autobyteus/tools/usage/parsers/base_parser.py +0 -41
  488. autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
  489. autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
  490. autobyteus/tools/usage/parsers/exceptions.py +0 -13
  491. autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
  492. autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
  493. autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
  494. autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
  495. autobyteus/workflow/phases/__init__.py +0 -11
  496. autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
  497. autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
  498. autobyteus-1.2.0.dist-info/METADATA +0 -205
  499. autobyteus-1.2.0.dist-info/RECORD +0 -496
  500. examples/__init__.py +0 -1
  501. examples/agent_team/__init__.py +0 -1
  502. examples/discover_phase_transitions.py +0 -104
  503. examples/run_browser_agent.py +0 -262
  504. examples/run_google_slides_agent.py +0 -287
  505. examples/run_mcp_browser_client.py +0 -174
  506. examples/run_mcp_google_slides_client.py +0 -270
  507. examples/run_mcp_list_tools.py +0 -189
  508. examples/run_poem_writer.py +0 -284
  509. examples/run_sqlite_agent.py +0 -295
  510. /autobyteus/{person → skills}/__init__.py +0 -0
  511. /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
  512. {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
@@ -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
- ]
@@ -1,181 +0,0 @@
1
- # file: autobyteus/autobyteus/rpc/server/agent_server_endpoint.py
2
- import asyncio
3
- import logging
4
- from typing import Optional, Dict, Union
5
-
6
- from autobyteus.rpc.config import AgentServerConfig
7
- from autobyteus.rpc.transport_type import TransportType
8
- from autobyteus.rpc.protocol import RequestType
9
- from autobyteus.agent.agent import Agent
10
- from .base_method_handler import BaseMethodHandler
11
- from .method_handlers import DiscoverCapabilitiesHandler, InvokeMethodHandler, InitiateStreamDownloadHandler # Added InitiateStreamDownloadHandler
12
- from .stdio_server_handler import StdioServerHandler
13
- from .sse_server_handler import SseServerHandler
14
-
15
- logger = logging.getLogger(__name__)
16
-
17
- class AgentServerEndpoint:
18
- """
19
- Manages the server-side RPC endpoint.
20
- It can serve a single Agent or a dictionary of multiple Agents (for SSE).
21
- It initializes and controls transport-specific handlers.
22
- """
23
-
24
- def __init__(self, agent_or_agents: Union[Agent, Dict[str, Agent]]):
25
- """
26
- Initializes the AgentServerEndpoint.
27
-
28
- Args:
29
- agent_or_agents: Either a single Agent instance to serve, or a dictionary
30
- mapping server-routable agent IDs to Agent instances
31
- (primarily for multi-agent SSE hosting).
32
- """
33
- if not isinstance(agent_or_agents, (Agent, dict)):
34
- raise TypeError("AgentServerEndpoint requires an Agent instance or a Dict[str, Agent].")
35
- if isinstance(agent_or_agents, dict) and not all(isinstance(k, str) and isinstance(v, Agent) for k, v in agent_or_agents.items()):
36
- raise TypeError("If agent_or_agents is a dict, keys must be strings and values must be Agent instances.")
37
-
38
- self._served_entity: Union[Agent, Dict[str, Agent]] = agent_or_agents
39
- self._config: Optional[AgentServerConfig] = None
40
-
41
- # Initialize method handlers
42
- # These handlers are stateless and can be reused.
43
- # For stateful handlers, they might need to be instantiated per request or per agent context.
44
- self._method_handlers: Dict[Union[RequestType, str], BaseMethodHandler] = {
45
- RequestType.DISCOVER_CAPABILITIES: DiscoverCapabilitiesHandler(),
46
- RequestType.INVOKE_METHOD: InvokeMethodHandler(),
47
- RequestType.REQUEST_STREAM_DOWNLOAD: InitiateStreamDownloadHandler(), # Added handler for stream download
48
- }
49
-
50
- self._stdio_handler: Optional[StdioServerHandler] = None
51
- self._stdio_task: Optional[asyncio.Task] = None
52
-
53
- self._sse_handler: Optional[SseServerHandler] = None
54
- self._sse_server_task: Optional[asyncio.Task] = None # For the aiohttp server itself
55
-
56
- self._is_running: bool = False
57
-
58
- if isinstance(self._served_entity, Agent):
59
- logger.info(f"AgentServerEndpoint initialized for single agent '{self._served_entity.agent_id}'.")
60
- else: # Dict[str, Agent]
61
- agent_ids_served = list(self._served_entity.keys())
62
- logger.info(f"AgentServerEndpoint initialized to serve multiple agents: {agent_ids_served}.")
63
-
64
-
65
- @property
66
- def is_running(self) -> bool:
67
- return self._is_running
68
-
69
- async def start(self, config: AgentServerConfig) -> None:
70
- if self._is_running:
71
- served_id = self._served_entity.agent_id if isinstance(self._served_entity, Agent) else "multiple agents"
72
- logger.warning(f"AgentServerEndpoint for '{served_id}' is already running. Ignoring start request.")
73
- return
74
-
75
- if not isinstance(config, AgentServerConfig):
76
- raise TypeError("AgentServerConfig instance required to start AgentServerEndpoint.")
77
-
78
- self._config = config
79
- served_id_log = self._served_entity.agent_id if isinstance(self._served_entity, Agent) else f"multiple agents ({list(self._served_entity.keys())})" # type: ignore
80
- logger.info(f"AgentServerEndpoint for '{served_id_log}' starting with config '{config.server_id}' (Transport: {config.transport_type.value}).")
81
-
82
- if self._config.transport_type == TransportType.STDIO:
83
- if not isinstance(self._served_entity, Agent):
84
- raise ValueError("STDIO transport currently supports serving only a single Agent instance.")
85
- single_agent_for_stdio: Agent = self._served_entity
86
-
87
- if not self._stdio_handler: # Create handler if it doesn't exist
88
- self._stdio_handler = StdioServerHandler(single_agent_for_stdio, self._method_handlers)
89
-
90
- # Ensure task is not already running or is completed
91
- if self._stdio_task and not self._stdio_task.done():
92
- logger.warning(f"Stdio task for agent '{single_agent_for_stdio.agent_id}' seems to be already running. Not restarting.")
93
- else:
94
- self._stdio_task = asyncio.create_task(
95
- self._stdio_handler.listen_and_dispatch(),
96
- name=f"stdio_server_endpoint_{single_agent_for_stdio.agent_id}"
97
- )
98
- logger.info(f"Stdio transport for agent '{single_agent_for_stdio.agent_id}' started via StdioServerHandler.")
99
-
100
- elif self._config.transport_type == TransportType.SSE:
101
- agents_for_sse: Dict[str, Agent]
102
- if isinstance(self._served_entity, Agent):
103
- agents_for_sse = {self._served_entity.agent_id: self._served_entity}
104
- logger.info(f"Serving single agent '{self._served_entity.agent_id}' via SSE under its own agent_id as the server key.")
105
- elif isinstance(self._served_entity, dict):
106
- agents_for_sse = self._served_entity
107
- else:
108
- raise ValueError("Invalid _served_entity type for SSE transport.")
109
-
110
-
111
- if not self._sse_handler: # Create handler if it doesn't exist
112
- self._sse_handler = SseServerHandler(agents_for_sse, self._method_handlers)
113
-
114
- if self._sse_server_task and not self._sse_server_task.done():
115
- logger.warning("SSE server task seems to be already running. Not restarting.")
116
- else:
117
- # SseServerHandler.start_server is a blocking call that runs the aiohttp server.
118
- # It should be run in a task that this endpoint manages.
119
- self._sse_server_task = asyncio.create_task(
120
- self._sse_handler.start_server(config),
121
- name=f"sse_server_endpoint_manager"
122
- )
123
- logger.info(f"SSE transport starting via SseServerHandler for agents: {list(agents_for_sse.keys())}.")
124
-
125
- else:
126
- logger.error(f"Unsupported transport type '{self._config.transport_type}' in AgentServerEndpoint.")
127
- self._config = None # Reset config if start fails for this reason
128
- raise NotImplementedError(f"Transport type '{self._config.transport_type}' not implemented.")
129
-
130
- self._is_running = True
131
- logger.info(f"AgentServerEndpoint for '{served_id_log}' started successfully.")
132
-
133
- async def stop(self) -> None:
134
- served_id_log = self._served_entity.agent_id if isinstance(self._served_entity, Agent) else f"multiple agents ({list(self._served_entity.keys())})" # type: ignore
135
- if not self._is_running:
136
- logger.warning(f"AgentServerEndpoint for '{served_id_log}' is not running. Ignoring stop request.")
137
- return
138
-
139
- logger.info(f"AgentServerEndpoint for '{served_id_log}' stopping...")
140
-
141
- # Stop transport-specific handlers/tasks
142
- if self._config and self._config.transport_type == TransportType.STDIO:
143
- if self._stdio_handler: # StdioServerHandler manages its own _running flag
144
- self._stdio_handler.stop() # Signal handler to stop listening
145
- if self._stdio_task and not self._stdio_task.done():
146
- self._stdio_task.cancel() # Cancel the listen_and_dispatch task
147
- try: await self._stdio_task
148
- except asyncio.CancelledError: logger.info(f"Stdio task for endpoint for '{served_id_log}' cancelled.")
149
- except Exception as e: logger.error(f"Error awaiting stdio_task during stop: {e}", exc_info=True)
150
- self._stdio_task = None
151
- # self._stdio_handler = None # Handler can be reused if started again
152
- logger.info(f"Stdio transport for endpoint '{served_id_log}' stopped.")
153
-
154
- elif self._config and self._config.transport_type == TransportType.SSE:
155
- if self._sse_handler: # SseServerHandler has its own stop_server method
156
- await self._sse_handler.stop_server()
157
- if self._sse_server_task and not self._sse_server_task.done():
158
- # The sse_handler.stop_server() should ideally cause the task awaiting sse_handler.start_server() to complete.
159
- # If start_server is not designed to unblock on stop_server, cancellation might be needed.
160
- # Assuming start_server will handle cleanup and exit gracefully when stop_server is called.
161
- # If not, explicit cancellation might be required here.
162
- try:
163
- # Give some time for graceful shutdown initiated by stop_server()
164
- await asyncio.wait_for(self._sse_server_task, timeout=5.0)
165
- except asyncio.TimeoutError:
166
- logger.warning(f"Timeout waiting for SSE server task for '{served_id_log}' to complete. Cancelling.")
167
- self._sse_server_task.cancel()
168
- try: await self._sse_server_task
169
- except asyncio.CancelledError: logger.info(f"SSE server task for endpoint '{served_id_log}' cancelled.")
170
- except asyncio.CancelledError: # If already cancelled by internal logic
171
- logger.info(f"SSE server task for endpoint '{served_id_log}' was already cancelled.")
172
- except Exception as e: logger.error(f"Error awaiting sse_server_task during stop: {e}", exc_info=True)
173
-
174
- self._sse_server_task = None
175
- # self._sse_handler = None # Handler can be reused
176
- logger.info(f"SSE transport for endpoint '{served_id_log}' stopped.")
177
-
178
- self._is_running = False
179
- self._config = None # Clear current config
180
- logger.info(f"AgentServerEndpoint for '{served_id_log}' stopped successfully.")
181
-
@@ -1,40 +0,0 @@
1
- # file: autobyteus/autobyteus/rpc/server/base_method_handler.py
2
- import logging
3
- from abc import ABC, abstractmethod
4
- from typing import Optional, Dict, Any, TYPE_CHECKING
5
-
6
- from autobyteus.rpc.protocol import ProtocolMessage
7
-
8
- if TYPE_CHECKING:
9
- from autobyteus.agent.agent import Agent # Changed from AgentRuntime to Agent
10
-
11
- logger = logging.getLogger(__name__)
12
-
13
- class BaseMethodHandler(ABC):
14
- """
15
- Abstract base class for handlers of specific RPC methods on the Agent Server.
16
- """
17
-
18
- @abstractmethod
19
- async def handle(self,
20
- request_id: Optional[str],
21
- params: Optional[Dict[str, Any]],
22
- agent: 'Agent') -> ProtocolMessage: # Changed from runtime: AgentRuntime to agent: Agent
23
- """
24
- Handles an RPC method call.
25
-
26
- Args:
27
- request_id: The ID of the incoming request message. Used for the response.
28
- params: The parameters provided with the RPC method call.
29
- agent: The Agent instance being served. This provides access to the
30
- agent's public API, context, queues, status, etc.
31
-
32
- Returns:
33
- A ProtocolMessage representing the response (success or error) to be sent
34
- back to the client.
35
- """
36
- raise NotImplementedError
37
-
38
- def __repr__(self) -> str:
39
- return f"<{self.__class__.__name__}>"
40
-