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.
- autobyteus/agent/agent.py +15 -5
- autobyteus/agent/bootstrap_steps/__init__.py +1 -3
- autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
- autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
- autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
- autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
- autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
- autobyteus/agent/context/agent_config.py +43 -20
- autobyteus/agent/context/agent_context.py +23 -18
- autobyteus/agent/context/agent_runtime_state.py +23 -19
- autobyteus/agent/events/__init__.py +16 -1
- autobyteus/agent/events/agent_events.py +43 -3
- autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
- autobyteus/agent/events/event_store.py +57 -0
- autobyteus/agent/events/notifiers.py +74 -60
- autobyteus/agent/events/worker_event_dispatcher.py +21 -64
- autobyteus/agent/factory/agent_factory.py +52 -0
- autobyteus/agent/handlers/__init__.py +2 -0
- autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
- autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
- autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
- autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
- autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
- autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
- autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
- autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
- autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
- autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
- autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
- autobyteus/agent/lifecycle/__init__.py +12 -0
- autobyteus/agent/lifecycle/base_processor.py +109 -0
- autobyteus/agent/lifecycle/events.py +35 -0
- autobyteus/agent/lifecycle/processor_definition.py +36 -0
- autobyteus/agent/lifecycle/processor_registry.py +106 -0
- autobyteus/agent/llm_request_assembler.py +98 -0
- autobyteus/agent/llm_response_processor/__init__.py +1 -8
- autobyteus/agent/message/context_file_type.py +1 -1
- autobyteus/agent/message/send_message_to.py +5 -4
- autobyteus/agent/runtime/agent_runtime.py +29 -21
- autobyteus/agent/runtime/agent_worker.py +98 -19
- autobyteus/agent/shutdown_steps/__init__.py +2 -0
- autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
- autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
- autobyteus/agent/status/__init__.py +14 -0
- autobyteus/agent/status/manager.py +93 -0
- autobyteus/agent/status/status_deriver.py +96 -0
- autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
- autobyteus/agent/status/status_update_utils.py +73 -0
- autobyteus/agent/streaming/__init__.py +52 -5
- autobyteus/agent/streaming/adapters/__init__.py +18 -0
- autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
- autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
- autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
- autobyteus/agent/streaming/agent_event_stream.py +3 -178
- autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
- autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
- autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
- autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/events/__init__.py +6 -0
- autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
- autobyteus/agent/streaming/events/stream_events.py +141 -0
- autobyteus/agent/streaming/handlers/__init__.py +15 -0
- autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
- autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
- autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
- autobyteus/agent/streaming/parser/__init__.py +61 -0
- autobyteus/agent/streaming/parser/event_emitter.py +181 -0
- autobyteus/agent/streaming/parser/events.py +4 -0
- autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
- autobyteus/agent/streaming/parser/parser_context.py +227 -0
- autobyteus/agent/streaming/parser/parser_factory.py +132 -0
- autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
- autobyteus/agent/streaming/parser/state_factory.py +62 -0
- autobyteus/agent/streaming/parser/states/__init__.py +1 -0
- autobyteus/agent/streaming/parser/states/base_state.py +60 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
- autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
- autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
- autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
- autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
- autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
- autobyteus/agent/streaming/parser/states/text_state.py +78 -0
- autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
- autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
- autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
- autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
- autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
- autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
- autobyteus/agent/streaming/parser/strategies/base.py +24 -0
- autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
- autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
- autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
- autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
- autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
- autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
- autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
- autobyteus/agent/streaming/parser/tool_constants.py +7 -0
- autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
- autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
- autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/queue_streamer.py +3 -57
- autobyteus/agent/streaming/segments/__init__.py +5 -0
- autobyteus/agent/streaming/segments/segment_events.py +81 -0
- autobyteus/agent/streaming/stream_event_payloads.py +2 -198
- autobyteus/agent/streaming/stream_events.py +3 -128
- autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
- autobyteus/agent/streaming/streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/streams/__init__.py +5 -0
- autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
- autobyteus/agent/streaming/utils/__init__.py +5 -0
- autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
- autobyteus/agent/system_prompt_processor/__init__.py +2 -0
- autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
- autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
- autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
- autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
- autobyteus/agent/token_budget.py +56 -0
- autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
- autobyteus/agent/tool_invocation.py +16 -40
- autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
- autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
- autobyteus/agent/utils/wait_for_idle.py +12 -14
- autobyteus/agent/workspace/base_workspace.py +6 -27
- autobyteus/agent_team/agent_team.py +3 -3
- autobyteus/agent_team/agent_team_builder.py +1 -41
- autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
- autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
- autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
- autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
- autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
- autobyteus/agent_team/context/agent_team_config.py +6 -3
- autobyteus/agent_team/context/agent_team_context.py +25 -3
- autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
- autobyteus/agent_team/events/__init__.py +11 -0
- autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
- autobyteus/agent_team/events/agent_team_events.py +16 -0
- autobyteus/agent_team/events/event_store.py +57 -0
- autobyteus/agent_team/factory/agent_team_factory.py +8 -0
- autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
- autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
- autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
- autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
- autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
- autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
- autobyteus/agent_team/status/__init__.py +14 -0
- autobyteus/agent_team/status/agent_team_status.py +18 -0
- autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
- autobyteus/agent_team/status/status_deriver.py +62 -0
- autobyteus/agent_team/status/status_update_utils.py +42 -0
- autobyteus/agent_team/streaming/__init__.py +2 -2
- autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
- autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
- autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
- autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
- autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
- autobyteus/agent_team/task_notification/activation_policy.py +1 -1
- autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
- autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
- autobyteus/agent_team/utils/wait_for_idle.py +4 -4
- autobyteus/cli/agent_cli.py +18 -10
- autobyteus/cli/agent_team_tui/app.py +18 -15
- autobyteus/cli/agent_team_tui/state.py +21 -23
- autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
- autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
- autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
- autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
- autobyteus/cli/cli_display.py +193 -44
- autobyteus/cli/workflow_tui/app.py +9 -10
- autobyteus/cli/workflow_tui/state.py +14 -16
- autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
- autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
- autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
- autobyteus/clients/autobyteus_client.py +94 -1
- autobyteus/events/event_types.py +15 -21
- autobyteus/llm/api/autobyteus_llm.py +33 -29
- autobyteus/llm/api/claude_llm.py +142 -36
- autobyteus/llm/api/gemini_llm.py +163 -59
- autobyteus/llm/api/grok_llm.py +1 -1
- autobyteus/llm/api/minimax_llm.py +26 -0
- autobyteus/llm/api/mistral_llm.py +113 -87
- autobyteus/llm/api/ollama_llm.py +9 -42
- autobyteus/llm/api/openai_compatible_llm.py +127 -91
- autobyteus/llm/api/openai_llm.py +3 -3
- autobyteus/llm/api/openai_responses_llm.py +324 -0
- autobyteus/llm/api/zhipu_llm.py +21 -2
- autobyteus/llm/autobyteus_provider.py +70 -60
- autobyteus/llm/base_llm.py +85 -81
- autobyteus/llm/converters/__init__.py +14 -0
- autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
- autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
- autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
- autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
- autobyteus/llm/extensions/base_extension.py +6 -12
- autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
- autobyteus/llm/llm_factory.py +282 -204
- autobyteus/llm/lmstudio_provider.py +60 -49
- autobyteus/llm/models.py +35 -2
- autobyteus/llm/ollama_provider.py +60 -49
- autobyteus/llm/ollama_provider_resolver.py +0 -1
- autobyteus/llm/prompt_renderers/__init__.py +19 -0
- autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
- autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
- autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
- autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
- autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
- autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
- autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
- autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
- autobyteus/llm/providers.py +1 -3
- autobyteus/llm/token_counter/claude_token_counter.py +56 -25
- autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
- autobyteus/llm/token_counter/openai_token_counter.py +24 -5
- autobyteus/llm/token_counter/token_counter_factory.py +12 -5
- autobyteus/llm/utils/llm_config.py +6 -12
- autobyteus/llm/utils/media_payload_formatter.py +27 -20
- autobyteus/llm/utils/messages.py +55 -3
- autobyteus/llm/utils/response_types.py +3 -0
- autobyteus/llm/utils/tool_call_delta.py +31 -0
- autobyteus/memory/__init__.py +32 -0
- autobyteus/memory/active_transcript.py +69 -0
- autobyteus/memory/compaction/__init__.py +9 -0
- autobyteus/memory/compaction/compaction_result.py +8 -0
- autobyteus/memory/compaction/compactor.py +89 -0
- autobyteus/memory/compaction/summarizer.py +11 -0
- autobyteus/memory/compaction_snapshot_builder.py +84 -0
- autobyteus/memory/memory_manager.py +183 -0
- autobyteus/memory/models/__init__.py +14 -0
- autobyteus/memory/models/episodic_item.py +41 -0
- autobyteus/memory/models/memory_types.py +7 -0
- autobyteus/memory/models/raw_trace_item.py +79 -0
- autobyteus/memory/models/semantic_item.py +41 -0
- autobyteus/memory/models/tool_interaction.py +20 -0
- autobyteus/memory/policies/__init__.py +5 -0
- autobyteus/memory/policies/compaction_policy.py +16 -0
- autobyteus/memory/retrieval/__init__.py +7 -0
- autobyteus/memory/retrieval/memory_bundle.py +11 -0
- autobyteus/memory/retrieval/retriever.py +13 -0
- autobyteus/memory/store/__init__.py +7 -0
- autobyteus/memory/store/base_store.py +14 -0
- autobyteus/memory/store/file_store.py +98 -0
- autobyteus/memory/tool_interaction_builder.py +46 -0
- autobyteus/memory/turn_tracker.py +9 -0
- autobyteus/multimedia/audio/api/__init__.py +3 -2
- autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
- autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
- autobyteus/multimedia/audio/audio_client_factory.py +84 -9
- autobyteus/multimedia/audio/audio_model.py +2 -1
- autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
- autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
- autobyteus/multimedia/image/api/openai_image_client.py +125 -43
- autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
- autobyteus/multimedia/image/image_client_factory.py +47 -15
- autobyteus/multimedia/image/image_model.py +5 -2
- autobyteus/multimedia/providers.py +3 -2
- autobyteus/skills/loader.py +71 -0
- autobyteus/skills/model.py +11 -0
- autobyteus/skills/registry.py +70 -0
- autobyteus/task_management/__init__.py +43 -20
- autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
- autobyteus/task_management/converters/__init__.py +2 -2
- autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
- autobyteus/task_management/events.py +7 -7
- autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
- autobyteus/task_management/schemas/__init__.py +3 -0
- autobyteus/task_management/schemas/task_status_report.py +2 -2
- autobyteus/task_management/schemas/todo_definition.py +15 -0
- autobyteus/task_management/todo.py +29 -0
- autobyteus/task_management/todo_list.py +75 -0
- autobyteus/task_management/tools/__init__.py +24 -8
- autobyteus/task_management/tools/task_tools/__init__.py +19 -0
- autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
- autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
- autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
- autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
- autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
- autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
- autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
- autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
- autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
- autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
- autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
- autobyteus/tools/__init__.py +43 -52
- autobyteus/tools/base_tool.py +7 -0
- autobyteus/tools/file/__init__.py +9 -0
- autobyteus/tools/file/patch_file.py +149 -0
- autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
- autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
- autobyteus/tools/functional_tool.py +53 -14
- autobyteus/tools/mcp/__init__.py +2 -0
- autobyteus/tools/mcp/config_service.py +5 -1
- autobyteus/tools/mcp/server/__init__.py +2 -0
- autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
- autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
- autobyteus/tools/mcp/server_instance_manager.py +8 -1
- autobyteus/tools/mcp/tool.py +3 -3
- autobyteus/tools/mcp/tool_registrar.py +5 -2
- autobyteus/tools/mcp/types.py +61 -0
- autobyteus/tools/multimedia/__init__.py +2 -1
- autobyteus/tools/multimedia/audio_tools.py +72 -19
- autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
- autobyteus/tools/multimedia/image_tools.py +248 -64
- autobyteus/tools/multimedia/media_reader_tool.py +1 -1
- autobyteus/tools/operation_executor/journal_manager.py +107 -0
- autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
- autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
- autobyteus/tools/operation_executor/operation_executor.py +58 -0
- autobyteus/tools/registry/tool_definition.py +108 -14
- autobyteus/tools/registry/tool_registry.py +29 -0
- autobyteus/tools/search/__init__.py +17 -0
- autobyteus/tools/search/base_strategy.py +35 -0
- autobyteus/tools/search/client.py +24 -0
- autobyteus/tools/search/factory.py +81 -0
- autobyteus/tools/search/google_cse_strategy.py +68 -0
- autobyteus/tools/search/providers.py +10 -0
- autobyteus/tools/search/serpapi_strategy.py +65 -0
- autobyteus/tools/search/serper_strategy.py +87 -0
- autobyteus/tools/search_tool.py +83 -0
- autobyteus/tools/skill/load_skill.py +50 -0
- autobyteus/tools/terminal/__init__.py +45 -0
- autobyteus/tools/terminal/ansi_utils.py +32 -0
- autobyteus/tools/terminal/background_process_manager.py +233 -0
- autobyteus/tools/terminal/output_buffer.py +105 -0
- autobyteus/tools/terminal/prompt_detector.py +63 -0
- autobyteus/tools/terminal/pty_session.py +241 -0
- autobyteus/tools/terminal/session_factory.py +20 -0
- autobyteus/tools/terminal/terminal_session_manager.py +226 -0
- autobyteus/tools/terminal/tools/__init__.py +13 -0
- autobyteus/tools/terminal/tools/get_process_output.py +81 -0
- autobyteus/tools/terminal/tools/run_bash.py +109 -0
- autobyteus/tools/terminal/tools/start_background_process.py +104 -0
- autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
- autobyteus/tools/terminal/types.py +54 -0
- autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
- autobyteus/tools/terminal/wsl_utils.py +156 -0
- autobyteus/tools/tool_meta.py +4 -24
- autobyteus/tools/transaction_management/backup_handler.py +48 -0
- autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
- autobyteus/tools/usage/__init__.py +1 -2
- autobyteus/tools/usage/formatters/__init__.py +17 -1
- autobyteus/tools/usage/formatters/base_formatter.py +8 -0
- autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
- autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
- autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
- autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
- autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
- autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
- autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
- autobyteus/tools/usage/registries/__init__.py +1 -3
- autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
- autobyteus/tools/usage/tool_schema_provider.py +51 -0
- autobyteus/tools/web/__init__.py +4 -0
- autobyteus/tools/web/read_url_tool.py +80 -0
- autobyteus/utils/diff_utils.py +271 -0
- autobyteus/utils/download_utils.py +109 -0
- autobyteus/utils/file_utils.py +57 -2
- autobyteus/utils/gemini_helper.py +56 -0
- autobyteus/utils/gemini_model_mapping.py +71 -0
- autobyteus/utils/llm_output_formatter.py +75 -0
- autobyteus/utils/tool_call_format.py +36 -0
- autobyteus/workflow/agentic_workflow.py +3 -3
- autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
- autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
- autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
- autobyteus/workflow/context/workflow_context.py +3 -3
- autobyteus/workflow/context/workflow_runtime_state.py +5 -5
- autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
- autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
- autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
- autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
- autobyteus/workflow/runtime/workflow_runtime.py +8 -8
- autobyteus/workflow/runtime/workflow_worker.py +3 -3
- autobyteus/workflow/status/__init__.py +11 -0
- autobyteus/workflow/status/workflow_status.py +19 -0
- autobyteus/workflow/status/workflow_status_manager.py +48 -0
- autobyteus/workflow/streaming/__init__.py +2 -2
- autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
- autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
- autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
- autobyteus/workflow/utils/wait_for_idle.py +4 -4
- autobyteus-1.2.3.dist-info/METADATA +293 -0
- autobyteus-1.2.3.dist-info/RECORD +600 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
- autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
- autobyteus/agent/hooks/__init__.py +0 -16
- autobyteus/agent/hooks/base_phase_hook.py +0 -78
- autobyteus/agent/hooks/hook_definition.py +0 -36
- autobyteus/agent/hooks/hook_meta.py +0 -37
- autobyteus/agent/hooks/hook_registry.py +0 -106
- autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
- autobyteus/agent/phases/__init__.py +0 -18
- autobyteus/agent/phases/discover.py +0 -53
- autobyteus/agent/phases/manager.py +0 -265
- autobyteus/agent/phases/transition_decorator.py +0 -40
- autobyteus/agent/phases/transition_info.py +0 -33
- autobyteus/agent/remote_agent.py +0 -244
- autobyteus/agent/workspace/workspace_definition.py +0 -36
- autobyteus/agent/workspace/workspace_meta.py +0 -37
- autobyteus/agent/workspace/workspace_registry.py +0 -72
- autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
- autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
- autobyteus/agent_team/phases/__init__.py +0 -11
- autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
- autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
- autobyteus/llm/api/bedrock_llm.py +0 -92
- autobyteus/llm/api/groq_llm.py +0 -94
- autobyteus/llm/api/nvidia_llm.py +0 -108
- autobyteus/llm/utils/token_pricing_config.py +0 -87
- autobyteus/person/examples/sample_persons.py +0 -14
- autobyteus/person/examples/sample_roles.py +0 -14
- autobyteus/person/person.py +0 -29
- autobyteus/person/role.py +0 -14
- autobyteus/rpc/__init__.py +0 -73
- autobyteus/rpc/client/__init__.py +0 -17
- autobyteus/rpc/client/abstract_client_connection.py +0 -124
- autobyteus/rpc/client/client_connection_manager.py +0 -153
- autobyteus/rpc/client/sse_client_connection.py +0 -306
- autobyteus/rpc/client/stdio_client_connection.py +0 -280
- autobyteus/rpc/config/__init__.py +0 -13
- autobyteus/rpc/config/agent_server_config.py +0 -153
- autobyteus/rpc/config/agent_server_registry.py +0 -152
- autobyteus/rpc/hosting.py +0 -244
- autobyteus/rpc/protocol.py +0 -244
- autobyteus/rpc/server/__init__.py +0 -20
- autobyteus/rpc/server/agent_server_endpoint.py +0 -181
- autobyteus/rpc/server/base_method_handler.py +0 -40
- autobyteus/rpc/server/method_handlers.py +0 -259
- autobyteus/rpc/server/sse_server_handler.py +0 -182
- autobyteus/rpc/server/stdio_server_handler.py +0 -151
- autobyteus/rpc/server_main.py +0 -198
- autobyteus/rpc/transport_type.py +0 -13
- autobyteus/tools/bash/__init__.py +0 -2
- autobyteus/tools/bash/bash_executor.py +0 -100
- autobyteus/tools/browser/__init__.py +0 -2
- autobyteus/tools/browser/session_aware/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
- autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
- autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
- autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
- autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
- autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
- autobyteus/tools/browser/standalone/__init__.py +0 -6
- autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
- autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
- autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/standalone/navigate_to.py +0 -80
- autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
- autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
- autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
- autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
- autobyteus/tools/file/file_editor.py +0 -200
- autobyteus/tools/google_search.py +0 -149
- autobyteus/tools/timer.py +0 -171
- autobyteus/tools/usage/parsers/__init__.py +0 -22
- autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
- autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
- autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
- autobyteus/tools/usage/parsers/base_parser.py +0 -41
- autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
- autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
- autobyteus/tools/usage/parsers/exceptions.py +0 -13
- autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
- autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
- autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
- autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
- autobyteus/workflow/phases/__init__.py +0 -11
- autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
- autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
- autobyteus-1.2.0.dist-info/METADATA +0 -205
- autobyteus-1.2.0.dist-info/RECORD +0 -496
- examples/__init__.py +0 -1
- examples/agent_team/__init__.py +0 -1
- examples/discover_phase_transitions.py +0 -104
- examples/run_browser_agent.py +0 -262
- examples/run_google_slides_agent.py +0 -287
- examples/run_mcp_browser_client.py +0 -174
- examples/run_mcp_google_slides_client.py +0 -270
- examples/run_mcp_list_tools.py +0 -189
- examples/run_poem_writer.py +0 -284
- examples/run_sqlite_agent.py +0 -295
- /autobyteus/{person → skills}/__init__.py +0 -0
- /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
autobyteus/rpc/protocol.py
DELETED
|
@@ -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
|
-
|