autobyteus 1.2.1__py3-none-any.whl → 1.3.0__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 +3 -3
- autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +5 -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/working_context_snapshot_restore_step.py +38 -0
- autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
- autobyteus/agent/context/agent_config.py +47 -20
- autobyteus/agent/context/agent_context.py +23 -18
- autobyteus/agent/context/agent_runtime_state.py +21 -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 +69 -59
- autobyteus/agent/events/worker_event_dispatcher.py +21 -64
- autobyteus/agent/factory/agent_factory.py +83 -6
- 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 +44 -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/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 -183
- 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 +82 -0
- autobyteus/agent/streaming/stream_event_payloads.py +2 -223
- autobyteus/agent/streaming/stream_events.py +3 -140
- 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 +1 -2
- autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
- 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 +9 -6
- 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 +6 -6
- autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
- autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
- 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/task_notification_mode.py +19 -0
- autobyteus/agent_team/utils/wait_for_idle.py +4 -4
- autobyteus/cli/agent_cli.py +18 -10
- autobyteus/cli/agent_team_tui/app.py +14 -11
- autobyteus/cli/agent_team_tui/state.py +13 -15
- autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
- autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
- autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
- 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 +11 -18
- 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 +35 -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 +205 -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/path_resolver.py +27 -0
- autobyteus/memory/policies/__init__.py +5 -0
- autobyteus/memory/policies/compaction_policy.py +16 -0
- autobyteus/memory/restore/__init__.py +1 -0
- autobyteus/memory/restore/working_context_snapshot_bootstrapper.py +61 -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 +9 -0
- autobyteus/memory/store/base_store.py +14 -0
- autobyteus/memory/store/file_store.py +98 -0
- autobyteus/memory/store/working_context_snapshot_store.py +28 -0
- autobyteus/memory/tool_interaction_builder.py +46 -0
- autobyteus/memory/turn_tracker.py +9 -0
- autobyteus/memory/working_context_snapshot.py +69 -0
- autobyteus/memory/working_context_snapshot_serializer.py +135 -0
- autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +109 -16
- autobyteus/multimedia/audio/audio_client_factory.py +47 -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 +39 -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/tools/todo_tools/add_todo.py +2 -2
- autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
- autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
- autobyteus/tools/__init__.py +34 -47
- autobyteus/tools/base_tool.py +7 -0
- autobyteus/tools/file/__init__.py +2 -6
- autobyteus/tools/file/patch_file.py +149 -0
- autobyteus/tools/file/read_file.py +36 -5
- autobyteus/tools/file/write_file.py +4 -1
- autobyteus/tools/functional_tool.py +43 -6
- 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/types.py +61 -0
- autobyteus/tools/multimedia/audio_tools.py +70 -17
- autobyteus/tools/multimedia/download_media_tool.py +18 -4
- autobyteus/tools/multimedia/image_tools.py +246 -62
- 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 +43 -2
- 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/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 +64 -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 +3 -9
- 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.3.0.dist-info/METADATA +293 -0
- autobyteus-1.3.0.dist-info/RECORD +606 -0
- {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.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/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/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/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 -84
- autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
- autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
- autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
- autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
- autobyteus/tools/file/edit_file.py +0 -200
- autobyteus/tools/file/list_directory.py +0 -168
- autobyteus/tools/file/search_files.py +0 -188
- autobyteus/tools/timer.py +0 -175
- 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.1.dist-info/METADATA +0 -205
- autobyteus-1.2.1.dist-info/RECORD +0 -511
- examples/__init__.py +0 -1
- examples/agent_team/__init__.py +0 -1
- examples/discover_phase_transitions.py +0 -104
- examples/run_agentic_software_engineer.py +0 -239
- 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/{tools/browser/session_aware → skills}/__init__.py +0 -0
- /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
- {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,57 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py
|
|
2
|
-
import logging
|
|
3
|
-
from typing import TYPE_CHECKING
|
|
4
|
-
|
|
5
|
-
from .base_bootstrap_step import BaseBootstrapStep
|
|
6
|
-
from autobyteus.agent.events import AgentErrorEvent, AgentInputEventQueueManager
|
|
7
|
-
# AgentOutputDataManager is no longer initialized here.
|
|
8
|
-
|
|
9
|
-
if TYPE_CHECKING:
|
|
10
|
-
from autobyteus.agent.context import AgentContext
|
|
11
|
-
from autobyteus.agent.phases import AgentPhaseManager
|
|
12
|
-
|
|
13
|
-
logger = logging.getLogger(__name__)
|
|
14
|
-
|
|
15
|
-
class AgentRuntimeQueueInitializationStep(BaseBootstrapStep):
|
|
16
|
-
"""
|
|
17
|
-
Bootstrap step for initializing the agent's runtime INPUT event queues.
|
|
18
|
-
These queues are created within the AgentWorker's event loop.
|
|
19
|
-
Output data is now handled by emitting events via AgentExternalEventNotifier.
|
|
20
|
-
"""
|
|
21
|
-
def __init__(self, input_queue_size: int = 0): # Removed output_queue_size
|
|
22
|
-
self.input_queue_size = input_queue_size
|
|
23
|
-
logger.debug(f"AgentRuntimeQueueInitializationStep initialized with input_q_size={input_queue_size}.")
|
|
24
|
-
|
|
25
|
-
async def execute(self,
|
|
26
|
-
context: 'AgentContext',
|
|
27
|
-
phase_manager: 'AgentPhaseManager') -> bool:
|
|
28
|
-
agent_id = context.agent_id
|
|
29
|
-
logger.info(f"Agent '{agent_id}': Executing AgentRuntimeQueueInitializationStep (for input queues).")
|
|
30
|
-
|
|
31
|
-
try:
|
|
32
|
-
if context.state.input_event_queues is not None: # Check only input queues
|
|
33
|
-
logger.warning(f"Agent '{agent_id}': Input runtime queues seem to be already initialized. Overwriting. This might indicate a logic error.")
|
|
34
|
-
|
|
35
|
-
input_queues = AgentInputEventQueueManager(queue_size=self.input_queue_size)
|
|
36
|
-
context.state.input_event_queues = input_queues
|
|
37
|
-
# context.state.output_data_queues is no longer set here.
|
|
38
|
-
|
|
39
|
-
logger.info(f"Agent '{agent_id}': AgentInputEventQueueManager initialized and set in agent state.")
|
|
40
|
-
if context.state.input_event_queues is None: # pragma: no cover
|
|
41
|
-
raise RuntimeError("Input event queue manager was not successfully set in agent state during AgentRuntimeQueueInitializationStep.")
|
|
42
|
-
|
|
43
|
-
return True
|
|
44
|
-
except Exception as e:
|
|
45
|
-
error_message = f"Agent '{agent_id}': Critical failure during AgentRuntimeQueueInitializationStep (input queues): {e}"
|
|
46
|
-
logger.error(error_message, exc_info=True)
|
|
47
|
-
|
|
48
|
-
# Attempt to enqueue an error event if input_event_queues was partially created
|
|
49
|
-
# This check itself might be problematic if input_queues is the thing that failed.
|
|
50
|
-
# However, if it failed *after* assigning self.input_event_queues, this might work.
|
|
51
|
-
if context.state.input_event_queues and context.state.input_event_queues.internal_system_event_queue: # pragma: no cover
|
|
52
|
-
await context.state.input_event_queues.enqueue_internal_system_event(
|
|
53
|
-
AgentErrorEvent(error_message=error_message, exception_details=str(e))
|
|
54
|
-
)
|
|
55
|
-
else: # pragma: no cover
|
|
56
|
-
logger.error(f"Agent '{agent_id}': Cannot enqueue AgentErrorEvent as input_event_queues are not available after AgentRuntimeQueueInitializationStep failure.")
|
|
57
|
-
return False
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/hooks/__init__.py
|
|
2
|
-
"""
|
|
3
|
-
Components for defining and running lifecycle hooks based on agent phase transitions.
|
|
4
|
-
"""
|
|
5
|
-
from .base_phase_hook import BasePhaseHook
|
|
6
|
-
from .hook_definition import PhaseHookDefinition
|
|
7
|
-
from .hook_meta import PhaseHookMeta
|
|
8
|
-
from .hook_registry import PhaseHookRegistry, default_phase_hook_registry
|
|
9
|
-
|
|
10
|
-
__all__ = [
|
|
11
|
-
"BasePhaseHook",
|
|
12
|
-
"PhaseHookDefinition",
|
|
13
|
-
"PhaseHookMeta",
|
|
14
|
-
"PhaseHookRegistry",
|
|
15
|
-
"default_phase_hook_registry",
|
|
16
|
-
]
|
|
@@ -1,78 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/hooks/base_phase_hook.py
|
|
2
|
-
import logging
|
|
3
|
-
from abc import ABC, abstractmethod
|
|
4
|
-
from typing import TYPE_CHECKING
|
|
5
|
-
|
|
6
|
-
from autobyteus.agent.phases import AgentOperationalPhase
|
|
7
|
-
from .hook_meta import PhaseHookMeta
|
|
8
|
-
|
|
9
|
-
if TYPE_CHECKING:
|
|
10
|
-
from autobyteus.agent.context import AgentContext
|
|
11
|
-
|
|
12
|
-
logger = logging.getLogger(__name__)
|
|
13
|
-
|
|
14
|
-
class BasePhaseHook(ABC, metaclass=PhaseHookMeta):
|
|
15
|
-
"""
|
|
16
|
-
Abstract base class for creating hooks that execute on specific agent
|
|
17
|
-
phase transitions.
|
|
18
|
-
|
|
19
|
-
Subclasses must define the `source_phase` and `target_phase` to specify
|
|
20
|
-
the exact transition they are interested in, and implement the `execute`
|
|
21
|
-
method for their custom logic.
|
|
22
|
-
"""
|
|
23
|
-
|
|
24
|
-
@classmethod
|
|
25
|
-
def get_name(cls) -> str:
|
|
26
|
-
"""
|
|
27
|
-
Returns the unique registration name for this hook.
|
|
28
|
-
Defaults to the class name. Can be overridden by subclasses.
|
|
29
|
-
"""
|
|
30
|
-
return cls.__name__
|
|
31
|
-
|
|
32
|
-
@classmethod
|
|
33
|
-
def get_order(cls) -> int:
|
|
34
|
-
"""
|
|
35
|
-
Returns the execution order for this hook if multiple hooks are triggered
|
|
36
|
-
on the same transition. Lower numbers execute earlier.
|
|
37
|
-
Defaults to 500 (normal priority).
|
|
38
|
-
"""
|
|
39
|
-
return 500
|
|
40
|
-
|
|
41
|
-
@classmethod
|
|
42
|
-
def is_mandatory(cls) -> bool:
|
|
43
|
-
"""
|
|
44
|
-
Returns True if this hook is mandatory for the agent to function correctly.
|
|
45
|
-
Defaults to False (optional).
|
|
46
|
-
"""
|
|
47
|
-
return False
|
|
48
|
-
|
|
49
|
-
@property
|
|
50
|
-
@abstractmethod
|
|
51
|
-
def source_phase(self) -> AgentOperationalPhase:
|
|
52
|
-
"""The source phase for the transition this hook targets."""
|
|
53
|
-
raise NotImplementedError
|
|
54
|
-
|
|
55
|
-
@property
|
|
56
|
-
@abstractmethod
|
|
57
|
-
def target_phase(self) -> AgentOperationalPhase:
|
|
58
|
-
"""The target phase for the transition this hook targets."""
|
|
59
|
-
raise NotImplementedError
|
|
60
|
-
|
|
61
|
-
@abstractmethod
|
|
62
|
-
async def execute(self, context: 'AgentContext') -> None:
|
|
63
|
-
"""
|
|
64
|
-
The method executed when the specified phase transition occurs.
|
|
65
|
-
|
|
66
|
-
Args:
|
|
67
|
-
context: The agent's context at the time of the transition.
|
|
68
|
-
"""
|
|
69
|
-
raise NotImplementedError
|
|
70
|
-
|
|
71
|
-
def __repr__(self) -> str:
|
|
72
|
-
# Use try-except in case properties are not yet implemented during introspection
|
|
73
|
-
try:
|
|
74
|
-
return (f"<{self.__class__.__name__} "
|
|
75
|
-
f"source='{self.source_phase.value}' "
|
|
76
|
-
f"target='{self.target_phase.value}'>")
|
|
77
|
-
except (NotImplementedError, AttributeError):
|
|
78
|
-
return f"<{self.__class__.__name__} (unconfigured)>"
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/hooks/hook_definition.py
|
|
2
|
-
import logging
|
|
3
|
-
from typing import Type, TYPE_CHECKING
|
|
4
|
-
|
|
5
|
-
if TYPE_CHECKING:
|
|
6
|
-
from .base_phase_hook import BasePhaseHook
|
|
7
|
-
|
|
8
|
-
logger = logging.getLogger(__name__)
|
|
9
|
-
|
|
10
|
-
class PhaseHookDefinition:
|
|
11
|
-
"""
|
|
12
|
-
Represents the definition of a phase hook.
|
|
13
|
-
Contains its registered name and the class itself.
|
|
14
|
-
"""
|
|
15
|
-
def __init__(self, name: str, hook_class: Type['BasePhaseHook']):
|
|
16
|
-
"""
|
|
17
|
-
Initializes the PhaseHookDefinition.
|
|
18
|
-
|
|
19
|
-
Args:
|
|
20
|
-
name: The unique registered name of the hook.
|
|
21
|
-
hook_class: The class of the phase hook.
|
|
22
|
-
|
|
23
|
-
Raises:
|
|
24
|
-
ValueError: If name is empty or hook_class is not a type.
|
|
25
|
-
"""
|
|
26
|
-
if not name or not isinstance(name, str):
|
|
27
|
-
raise ValueError("Hook name must be a non-empty string.")
|
|
28
|
-
if not isinstance(hook_class, type):
|
|
29
|
-
raise ValueError("hook_class must be a class type.")
|
|
30
|
-
|
|
31
|
-
self.name: str = name
|
|
32
|
-
self.hook_class: Type['BasePhaseHook'] = hook_class
|
|
33
|
-
logger.debug(f"PhaseHookDefinition created: name='{name}', class='{hook_class.__name__}'.")
|
|
34
|
-
|
|
35
|
-
def __repr__(self) -> str:
|
|
36
|
-
return f"<PhaseHookDefinition name='{self.name}', class='{self.hook_class.__name__}'>"
|
|
@@ -1,37 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/hooks/hook_meta.py
|
|
2
|
-
import logging
|
|
3
|
-
from abc import ABCMeta
|
|
4
|
-
|
|
5
|
-
from .hook_registry import default_phase_hook_registry
|
|
6
|
-
from .hook_definition import PhaseHookDefinition
|
|
7
|
-
|
|
8
|
-
logger = logging.getLogger(__name__)
|
|
9
|
-
|
|
10
|
-
class PhaseHookMeta(ABCMeta):
|
|
11
|
-
"""
|
|
12
|
-
Metaclass for BasePhaseHook that automatically registers concrete
|
|
13
|
-
hook subclasses with the default_phase_hook_registry.
|
|
14
|
-
Registration uses the name obtained from the class method `get_name()`.
|
|
15
|
-
"""
|
|
16
|
-
def __init__(cls, name, bases, dct):
|
|
17
|
-
super().__init__(name, bases, dct)
|
|
18
|
-
|
|
19
|
-
if name == 'BasePhaseHook' or getattr(cls, "__abstractmethods__", None):
|
|
20
|
-
logger.debug(f"Skipping registration for abstract phase hook class: {name}")
|
|
21
|
-
return
|
|
22
|
-
|
|
23
|
-
try:
|
|
24
|
-
hook_name = cls.get_name()
|
|
25
|
-
|
|
26
|
-
if not hook_name or not isinstance(hook_name, str):
|
|
27
|
-
logger.error(f"Phase hook class {name} must return a valid string from static get_name(). Skipping registration.")
|
|
28
|
-
return
|
|
29
|
-
|
|
30
|
-
definition = PhaseHookDefinition(name=hook_name, hook_class=cls)
|
|
31
|
-
default_phase_hook_registry.register_hook(definition)
|
|
32
|
-
logger.info(f"Auto-registered phase hook: '{hook_name}' from class {name} (no schema).")
|
|
33
|
-
|
|
34
|
-
except AttributeError as e:
|
|
35
|
-
logger.error(f"Phase hook class {name} is missing required static/class method 'get_name' ({e}). Skipping registration.")
|
|
36
|
-
except Exception as e:
|
|
37
|
-
logger.error(f"Failed to auto-register phase hook class {name}: {e}", exc_info=True)
|
|
@@ -1,106 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/hooks/hook_registry.py
|
|
2
|
-
import logging
|
|
3
|
-
from typing import TYPE_CHECKING, Dict, List, Optional
|
|
4
|
-
|
|
5
|
-
from autobyteus.utils.singleton import SingletonMeta
|
|
6
|
-
from autobyteus.agent.processor_option import HookOption
|
|
7
|
-
from .hook_definition import PhaseHookDefinition
|
|
8
|
-
|
|
9
|
-
if TYPE_CHECKING:
|
|
10
|
-
from .base_phase_hook import BasePhaseHook
|
|
11
|
-
|
|
12
|
-
logger = logging.getLogger(__name__)
|
|
13
|
-
|
|
14
|
-
class PhaseHookRegistry(metaclass=SingletonMeta):
|
|
15
|
-
"""
|
|
16
|
-
A singleton registry for PhaseHookDefinition objects.
|
|
17
|
-
Hooks are typically auto-registered via PhaseHookMeta.
|
|
18
|
-
"""
|
|
19
|
-
|
|
20
|
-
def __init__(self):
|
|
21
|
-
"""Initializes the PhaseHookRegistry with an empty store."""
|
|
22
|
-
self._definitions: Dict[str, PhaseHookDefinition] = {}
|
|
23
|
-
logger.info("PhaseHookRegistry initialized.")
|
|
24
|
-
|
|
25
|
-
def register_hook(self, definition: PhaseHookDefinition) -> None:
|
|
26
|
-
"""
|
|
27
|
-
Registers a phase hook definition.
|
|
28
|
-
"""
|
|
29
|
-
if not isinstance(definition, PhaseHookDefinition):
|
|
30
|
-
raise TypeError(f"Expected PhaseHookDefinition instance, got {type(definition).__name__}.")
|
|
31
|
-
|
|
32
|
-
hook_name = definition.name
|
|
33
|
-
if hook_name in self._definitions:
|
|
34
|
-
logger.warning(f"Overwriting existing phase hook definition for name: '{hook_name}'.")
|
|
35
|
-
|
|
36
|
-
self._definitions[hook_name] = definition
|
|
37
|
-
logger.info(f"Phase hook definition '{hook_name}' (class: '{definition.hook_class.__name__}') registered successfully.")
|
|
38
|
-
|
|
39
|
-
def get_hook_definition(self, name: str) -> Optional[PhaseHookDefinition]:
|
|
40
|
-
"""
|
|
41
|
-
Retrieves a phase hook definition by its name.
|
|
42
|
-
"""
|
|
43
|
-
if not isinstance(name, str):
|
|
44
|
-
logger.warning(f"Attempted to retrieve hook definition with non-string name: {type(name).__name__}.")
|
|
45
|
-
return None
|
|
46
|
-
definition = self._definitions.get(name)
|
|
47
|
-
if not definition:
|
|
48
|
-
logger.debug(f"Phase hook definition with name '{name}' not found in registry.")
|
|
49
|
-
return definition
|
|
50
|
-
|
|
51
|
-
def get_hook(self, name: str) -> Optional['BasePhaseHook']:
|
|
52
|
-
"""
|
|
53
|
-
Retrieves an instance of a phase hook by its name.
|
|
54
|
-
"""
|
|
55
|
-
definition = self.get_hook_definition(name)
|
|
56
|
-
if definition:
|
|
57
|
-
try:
|
|
58
|
-
return definition.hook_class()
|
|
59
|
-
except Exception as e:
|
|
60
|
-
logger.error(f"Failed to instantiate phase hook '{name}' from class '{definition.hook_class.__name__}': {e}", exc_info=True)
|
|
61
|
-
return None
|
|
62
|
-
return None
|
|
63
|
-
|
|
64
|
-
def list_hook_names(self) -> List[str]:
|
|
65
|
-
"""
|
|
66
|
-
Returns an unordered list of names of all registered phase hook definitions.
|
|
67
|
-
"""
|
|
68
|
-
return list(self._definitions.keys())
|
|
69
|
-
|
|
70
|
-
def get_ordered_hook_options(self) -> List[HookOption]:
|
|
71
|
-
"""
|
|
72
|
-
Returns a list of HookOption objects, sorted by their execution order.
|
|
73
|
-
"""
|
|
74
|
-
definitions = list(self._definitions.values())
|
|
75
|
-
sorted_definitions = sorted(definitions, key=lambda d: d.hook_class.get_order())
|
|
76
|
-
return [
|
|
77
|
-
HookOption(
|
|
78
|
-
name=d.name,
|
|
79
|
-
is_mandatory=d.hook_class.is_mandatory()
|
|
80
|
-
) for d in sorted_definitions
|
|
81
|
-
]
|
|
82
|
-
|
|
83
|
-
def get_all_definitions(self) -> Dict[str, PhaseHookDefinition]:
|
|
84
|
-
"""
|
|
85
|
-
Returns a shallow copy of the dictionary containing all registered phase hook definitions.
|
|
86
|
-
"""
|
|
87
|
-
return dict(self._definitions)
|
|
88
|
-
|
|
89
|
-
def clear(self) -> None:
|
|
90
|
-
"""Removes all definitions from the registry."""
|
|
91
|
-
count = len(self._definitions)
|
|
92
|
-
self._definitions.clear()
|
|
93
|
-
logger.info(f"Cleared {count} definitions from the PhaseHookRegistry.")
|
|
94
|
-
|
|
95
|
-
def __len__(self) -> int:
|
|
96
|
-
"""Returns the number of registered hook definitions."""
|
|
97
|
-
return len(self._definitions)
|
|
98
|
-
|
|
99
|
-
def __contains__(self, name: str) -> bool:
|
|
100
|
-
"""Checks if a hook definition is in the registry by name."""
|
|
101
|
-
if isinstance(name, str):
|
|
102
|
-
return name in self._definitions
|
|
103
|
-
return False
|
|
104
|
-
|
|
105
|
-
# Default instance of the registry
|
|
106
|
-
default_phase_hook_registry = PhaseHookRegistry()
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py
|
|
2
|
-
import logging
|
|
3
|
-
from typing import TYPE_CHECKING, List
|
|
4
|
-
|
|
5
|
-
from .base_processor import BaseLLMResponseProcessor
|
|
6
|
-
from autobyteus.agent.events import PendingToolInvocationEvent
|
|
7
|
-
from autobyteus.agent.tool_invocation import ToolInvocation, ToolInvocationTurn
|
|
8
|
-
from autobyteus.tools.usage.parsers import ProviderAwareToolUsageParser
|
|
9
|
-
from autobyteus.tools.usage.parsers.exceptions import ToolUsageParseException
|
|
10
|
-
|
|
11
|
-
if TYPE_CHECKING:
|
|
12
|
-
from autobyteus.agent.context import AgentContext
|
|
13
|
-
from autobyteus.agent.events import LLMCompleteResponseReceivedEvent
|
|
14
|
-
from autobyteus.llm.utils.response_types import CompleteResponse
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
class ProviderAwareToolUsageProcessor(BaseLLMResponseProcessor):
|
|
19
|
-
"""
|
|
20
|
-
A "master" tool usage processor that uses a high-level parser from the
|
|
21
|
-
`tools` module to extract tool invocations. It then ensures each invocation
|
|
22
|
-
has a session-unique ID before enqueuing the necessary agent events.
|
|
23
|
-
"""
|
|
24
|
-
INVOCATION_COUNTS_KEY = "agent_tool_invocation_counts"
|
|
25
|
-
|
|
26
|
-
def __init__(self):
|
|
27
|
-
self._parser = ProviderAwareToolUsageParser()
|
|
28
|
-
logger.debug("ProviderAwareToolUsageProcessor initialized.")
|
|
29
|
-
|
|
30
|
-
@classmethod
|
|
31
|
-
def get_name(cls) -> str:
|
|
32
|
-
return "ProviderAwareToolUsageProcessor"
|
|
33
|
-
|
|
34
|
-
@classmethod
|
|
35
|
-
def get_order(cls) -> int:
|
|
36
|
-
"""Runs with the highest priority to parse for tool calls before any other processing."""
|
|
37
|
-
return 100
|
|
38
|
-
|
|
39
|
-
@classmethod
|
|
40
|
-
def is_mandatory(cls) -> bool:
|
|
41
|
-
"""This processor is essential for any agent that uses tools."""
|
|
42
|
-
return True
|
|
43
|
-
|
|
44
|
-
async def process_response(self, response: 'CompleteResponse', context: 'AgentContext', triggering_event: 'LLMCompleteResponseReceivedEvent') -> bool:
|
|
45
|
-
"""
|
|
46
|
-
Uses a ProviderAwareToolUsageParser to get tool invocations, makes their
|
|
47
|
-
IDs unique within the agent's session, and then enqueues a
|
|
48
|
-
PendingToolInvocationEvent for each one.
|
|
49
|
-
Propagates ToolUsageParseException if parsing fails.
|
|
50
|
-
"""
|
|
51
|
-
try:
|
|
52
|
-
# Delegate parsing to the high-level parser
|
|
53
|
-
tool_invocations = self._parser.parse(response, context)
|
|
54
|
-
except ToolUsageParseException:
|
|
55
|
-
# Re-raise the exception to be caught by the event handler
|
|
56
|
-
raise
|
|
57
|
-
|
|
58
|
-
if not tool_invocations:
|
|
59
|
-
return False
|
|
60
|
-
|
|
61
|
-
# --- NEW LOGIC FOR UNIQUE ID GENERATION ---
|
|
62
|
-
|
|
63
|
-
# Ensure the counter map exists in the agent's state's custom data
|
|
64
|
-
if self.INVOCATION_COUNTS_KEY not in context.custom_data:
|
|
65
|
-
context.custom_data[self.INVOCATION_COUNTS_KEY] = {}
|
|
66
|
-
|
|
67
|
-
invocation_counts = context.custom_data[self.INVOCATION_COUNTS_KEY]
|
|
68
|
-
|
|
69
|
-
processed_invocations: List[ToolInvocation] = []
|
|
70
|
-
|
|
71
|
-
for invocation in tool_invocations:
|
|
72
|
-
base_id = invocation.id
|
|
73
|
-
|
|
74
|
-
# Get the current count for this base ID, default to 0
|
|
75
|
-
count = invocation_counts.get(base_id, 0)
|
|
76
|
-
|
|
77
|
-
# Create the new session-unique ID
|
|
78
|
-
unique_id = f"{base_id}_{count}"
|
|
79
|
-
|
|
80
|
-
# Update the invocation's ID in-place
|
|
81
|
-
invocation.id = unique_id
|
|
82
|
-
|
|
83
|
-
# Increment the counter for the next time this base ID is seen
|
|
84
|
-
invocation_counts[base_id] = count + 1
|
|
85
|
-
|
|
86
|
-
processed_invocations.append(invocation)
|
|
87
|
-
|
|
88
|
-
# --- END NEW LOGIC ---
|
|
89
|
-
|
|
90
|
-
# --- NEW: Initialize the multi-tool turn state ---
|
|
91
|
-
if len(processed_invocations) > 0:
|
|
92
|
-
logger.info(f"Agent '{context.agent_id}': Initializing multi-tool call turn with {len(processed_invocations)} invocations.")
|
|
93
|
-
context.state.active_multi_tool_call_turn = ToolInvocationTurn(invocations=processed_invocations)
|
|
94
|
-
# --- END NEW ---
|
|
95
|
-
|
|
96
|
-
logger.info(f"Agent '{context.agent_id}': Parsed {len(processed_invocations)} tool invocations. Enqueuing events with unique IDs.")
|
|
97
|
-
for invocation in processed_invocations:
|
|
98
|
-
logger.info(f"Agent '{context.agent_id}' ({self.get_name()}) identified tool invocation: {invocation.name} with unique ID {invocation.id}. Enqueuing event.")
|
|
99
|
-
await context.input_event_queues.enqueue_tool_invocation_request(
|
|
100
|
-
PendingToolInvocationEvent(tool_invocation=invocation)
|
|
101
|
-
)
|
|
102
|
-
|
|
103
|
-
return True
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/phases/__init__.py
|
|
2
|
-
"""
|
|
3
|
-
This package contains components for defining and describing agent operational phases
|
|
4
|
-
and their transitions.
|
|
5
|
-
"""
|
|
6
|
-
from .phase_enum import AgentOperationalPhase
|
|
7
|
-
from .transition_info import PhaseTransitionInfo
|
|
8
|
-
from .transition_decorator import phase_transition
|
|
9
|
-
from .discover import PhaseTransitionDiscoverer
|
|
10
|
-
from .manager import AgentPhaseManager
|
|
11
|
-
|
|
12
|
-
__all__ = [
|
|
13
|
-
"AgentOperationalPhase",
|
|
14
|
-
"PhaseTransitionInfo",
|
|
15
|
-
"phase_transition",
|
|
16
|
-
"PhaseTransitionDiscoverer",
|
|
17
|
-
"AgentPhaseManager",
|
|
18
|
-
]
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/phases/discover.py
|
|
2
|
-
import inspect
|
|
3
|
-
import logging
|
|
4
|
-
from typing import List, Optional
|
|
5
|
-
|
|
6
|
-
from autobyteus.agent.phases.manager import AgentPhaseManager
|
|
7
|
-
|
|
8
|
-
from .transition_info import PhaseTransitionInfo
|
|
9
|
-
|
|
10
|
-
logger = logging.getLogger(__name__)
|
|
11
|
-
|
|
12
|
-
class PhaseTransitionDiscoverer:
|
|
13
|
-
"""
|
|
14
|
-
A utility class to discover all valid phase transitions within the system.
|
|
15
|
-
|
|
16
|
-
It works by introspecting the AgentPhaseManager and finding methods
|
|
17
|
-
that have been decorated with the `@phase_transition` decorator.
|
|
18
|
-
"""
|
|
19
|
-
_cached_transitions: Optional[List[PhaseTransitionInfo]] = None
|
|
20
|
-
|
|
21
|
-
@classmethod
|
|
22
|
-
def discover(cls) -> List[PhaseTransitionInfo]:
|
|
23
|
-
"""
|
|
24
|
-
Discovers and returns a list of all possible phase transitions.
|
|
25
|
-
|
|
26
|
-
The result is cached after the first call for performance.
|
|
27
|
-
|
|
28
|
-
Returns:
|
|
29
|
-
A list of PhaseTransitionInfo objects, each describing a valid transition.
|
|
30
|
-
"""
|
|
31
|
-
if cls._cached_transitions is not None:
|
|
32
|
-
return cls._cached_transitions
|
|
33
|
-
|
|
34
|
-
logger.debug("Discovering phase transitions from AgentPhaseManager for the first time.")
|
|
35
|
-
transitions = []
|
|
36
|
-
for name, method in inspect.getmembers(AgentPhaseManager, predicate=inspect.isfunction):
|
|
37
|
-
if hasattr(method, '_transition_info'):
|
|
38
|
-
info = getattr(method, '_transition_info')
|
|
39
|
-
if isinstance(info, PhaseTransitionInfo):
|
|
40
|
-
transitions.append(info)
|
|
41
|
-
|
|
42
|
-
# Sort for deterministic output
|
|
43
|
-
transitions.sort(key=lambda t: (t.target_phase.value, t.triggering_method))
|
|
44
|
-
|
|
45
|
-
cls._cached_transitions = transitions
|
|
46
|
-
logger.info(f"Discovered and cached {len(transitions)} phase transitions.")
|
|
47
|
-
return transitions
|
|
48
|
-
|
|
49
|
-
@classmethod
|
|
50
|
-
def clear_cache(cls) -> None:
|
|
51
|
-
"""Clears the cached list of transitions."""
|
|
52
|
-
cls._cached_transitions = None
|
|
53
|
-
logger.info("Cleared cached phase transitions.")
|