autobyteus 1.2.1__py3-none-any.whl → 1.2.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +19 -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 +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/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 +81 -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 +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/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -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 +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/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 +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 +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.2.3.dist-info/METADATA +293 -0
- autobyteus-1.2.3.dist-info/RECORD +600 -0
- {autobyteus-1.2.1.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.1.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/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.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
# file: autobyteus/agent/lifecycle/base_processor.py
|
|
2
|
+
"""
|
|
3
|
+
Base class for lifecycle processors.
|
|
4
|
+
Follows the same pattern as other processors (InputProcessor, LLMResponseProcessor, etc.)
|
|
5
|
+
"""
|
|
6
|
+
import logging
|
|
7
|
+
from abc import ABC, abstractmethod, ABCMeta
|
|
8
|
+
from typing import TYPE_CHECKING, Any, Dict
|
|
9
|
+
|
|
10
|
+
from autobyteus.agent.lifecycle.events import LifecycleEvent
|
|
11
|
+
|
|
12
|
+
if TYPE_CHECKING:
|
|
13
|
+
from autobyteus.agent.context import AgentContext
|
|
14
|
+
|
|
15
|
+
logger = logging.getLogger(__name__)
|
|
16
|
+
|
|
17
|
+
class LifecycleEventProcessorMeta(ABCMeta):
|
|
18
|
+
"""
|
|
19
|
+
Metaclass that automatically registers subclasses of BaseLifecycleEventProcessor.
|
|
20
|
+
"""
|
|
21
|
+
def __new__(mcs, name, bases, namespace):
|
|
22
|
+
cls = super().__new__(mcs, name, bases, namespace)
|
|
23
|
+
|
|
24
|
+
# Avoid registering the base abstract class itself
|
|
25
|
+
if name != "BaseLifecycleEventProcessor":
|
|
26
|
+
# Avoid circular imports by importing inside the method
|
|
27
|
+
from autobyteus.agent.lifecycle.processor_definition import LifecycleEventProcessorDefinition
|
|
28
|
+
from autobyteus.agent.lifecycle.processor_registry import default_lifecycle_event_processor_registry
|
|
29
|
+
|
|
30
|
+
# Use get_name() if available, otherwise class name.
|
|
31
|
+
# Note: get_name is a classmethod on BaseLifecycleEventProcessor, but cls is not fully formed?
|
|
32
|
+
# Actually, standard pattern calls cls.get_name() if defined.
|
|
33
|
+
try:
|
|
34
|
+
# We can instantiate a definition using the class
|
|
35
|
+
reg_name = cls.get_name()
|
|
36
|
+
definition = LifecycleEventProcessorDefinition(name=reg_name, processor_class=cls)
|
|
37
|
+
default_lifecycle_event_processor_registry.register_processor(definition)
|
|
38
|
+
except Exception as e:
|
|
39
|
+
# This might happen if get_name fails or other issues during definition creation
|
|
40
|
+
# Logging as warning because intermediate abstract classes might fail
|
|
41
|
+
logger.debug(f"Skipping auto-registration for {name}: {e}")
|
|
42
|
+
|
|
43
|
+
return cls
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
class BaseLifecycleEventProcessor(ABC, metaclass=LifecycleEventProcessorMeta):
|
|
47
|
+
"""
|
|
48
|
+
Abstract base class for lifecycle event processors.
|
|
49
|
+
|
|
50
|
+
Users extend this class to add custom logic at specific lifecycle events.
|
|
51
|
+
Only requires specifying a single event (unlike the legacy hooks system which required
|
|
52
|
+
source + target status).
|
|
53
|
+
|
|
54
|
+
Example:
|
|
55
|
+
class MySetupProcessor(BaseLifecycleEventProcessor):
|
|
56
|
+
@property
|
|
57
|
+
def event(self) -> LifecycleEvent:
|
|
58
|
+
return LifecycleEvent.AGENT_READY
|
|
59
|
+
|
|
60
|
+
async def process(self, context, event_data):
|
|
61
|
+
print("Agent is ready!")
|
|
62
|
+
"""
|
|
63
|
+
|
|
64
|
+
@classmethod
|
|
65
|
+
def get_name(cls) -> str:
|
|
66
|
+
"""
|
|
67
|
+
Returns the unique name for this processor.
|
|
68
|
+
Defaults to the class name.
|
|
69
|
+
"""
|
|
70
|
+
return cls.__name__
|
|
71
|
+
|
|
72
|
+
@classmethod
|
|
73
|
+
def get_order(cls) -> int:
|
|
74
|
+
"""
|
|
75
|
+
Returns the execution order. Lower numbers execute earlier.
|
|
76
|
+
Defaults to 500 (normal priority).
|
|
77
|
+
"""
|
|
78
|
+
return 500
|
|
79
|
+
|
|
80
|
+
@classmethod
|
|
81
|
+
def is_mandatory(cls) -> bool:
|
|
82
|
+
"""
|
|
83
|
+
Returns True if this processor logic is mandatory and cannot be skipped by user config.
|
|
84
|
+
Defaults to False.
|
|
85
|
+
"""
|
|
86
|
+
return False
|
|
87
|
+
|
|
88
|
+
@property
|
|
89
|
+
@abstractmethod
|
|
90
|
+
def event(self) -> LifecycleEvent:
|
|
91
|
+
"""The lifecycle event this processor handles."""
|
|
92
|
+
raise NotImplementedError
|
|
93
|
+
|
|
94
|
+
@abstractmethod
|
|
95
|
+
async def process(self, context: 'AgentContext', event_data: Dict[str, Any]) -> None:
|
|
96
|
+
"""
|
|
97
|
+
Execute processor logic.
|
|
98
|
+
|
|
99
|
+
Args:
|
|
100
|
+
context: The agent's context with full state access.
|
|
101
|
+
event_data: Event-specific data (e.g., tool_name for tool events).
|
|
102
|
+
"""
|
|
103
|
+
raise NotImplementedError
|
|
104
|
+
|
|
105
|
+
def __repr__(self) -> str:
|
|
106
|
+
try:
|
|
107
|
+
return f"<{self.__class__.__name__} event='{self.event.value}'>"
|
|
108
|
+
except (NotImplementedError, AttributeError):
|
|
109
|
+
return f"<{self.__class__.__name__} (unconfigured)>"
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
# file: autobyteus/agent/lifecycle/events.py
|
|
2
|
+
"""
|
|
3
|
+
Defines the LifecycleEvent enum for user-facing lifecycle extension points.
|
|
4
|
+
These are simplified, intuitive event names that map internally to status changes.
|
|
5
|
+
"""
|
|
6
|
+
from enum import Enum
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
class LifecycleEvent(str, Enum):
|
|
10
|
+
"""
|
|
11
|
+
User-facing lifecycle events for agent extension.
|
|
12
|
+
|
|
13
|
+
These events provide simple, intuitive hook points without requiring
|
|
14
|
+
users to understand the internal status machine.
|
|
15
|
+
"""
|
|
16
|
+
AGENT_READY = "agent_ready"
|
|
17
|
+
"""Triggered once after bootstrap completes and agent is ready for input."""
|
|
18
|
+
|
|
19
|
+
BEFORE_LLM_CALL = "before_llm_call"
|
|
20
|
+
"""Triggered just before sending a request to the LLM."""
|
|
21
|
+
|
|
22
|
+
AFTER_LLM_RESPONSE = "after_llm_response"
|
|
23
|
+
"""Triggered after receiving a complete LLM response."""
|
|
24
|
+
|
|
25
|
+
BEFORE_TOOL_EXECUTE = "before_tool_execute"
|
|
26
|
+
"""Triggered just before a tool starts execution."""
|
|
27
|
+
|
|
28
|
+
AFTER_TOOL_EXECUTE = "after_tool_execute"
|
|
29
|
+
"""Triggered after a tool completes execution."""
|
|
30
|
+
|
|
31
|
+
AGENT_SHUTTING_DOWN = "agent_shutting_down"
|
|
32
|
+
"""Triggered when agent shutdown is initiated."""
|
|
33
|
+
|
|
34
|
+
def __str__(self) -> str:
|
|
35
|
+
return self.value
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# file: autobyteus/agent/lifecycle/processor_definition.py
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Type, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from .base_processor import BaseLifecycleEventProcessor
|
|
7
|
+
|
|
8
|
+
logger = logging.getLogger(__name__)
|
|
9
|
+
|
|
10
|
+
class LifecycleEventProcessorDefinition:
|
|
11
|
+
"""
|
|
12
|
+
Represents the definition of a lifecycle event processor.
|
|
13
|
+
Contains its registered name and the class itself.
|
|
14
|
+
"""
|
|
15
|
+
def __init__(self, name: str, processor_class: Type['BaseLifecycleEventProcessor']):
|
|
16
|
+
"""
|
|
17
|
+
Initializes the LifecycleEventProcessorDefinition.
|
|
18
|
+
|
|
19
|
+
Args:
|
|
20
|
+
name: The unique registered name of the processor.
|
|
21
|
+
processor_class: The class of the lifecycle event processor.
|
|
22
|
+
|
|
23
|
+
Raises:
|
|
24
|
+
ValueError: If name is empty or processor_class is not a type.
|
|
25
|
+
"""
|
|
26
|
+
if not name or not isinstance(name, str):
|
|
27
|
+
raise ValueError("Processor name must be a non-empty string.")
|
|
28
|
+
if not isinstance(processor_class, type):
|
|
29
|
+
raise ValueError("processor_class must be a class type.")
|
|
30
|
+
|
|
31
|
+
self.name: str = name
|
|
32
|
+
self.processor_class: Type['BaseLifecycleEventProcessor'] = processor_class
|
|
33
|
+
logger.debug(f"LifecycleEventProcessorDefinition created: name='{name}', class='{processor_class.__name__}'.")
|
|
34
|
+
|
|
35
|
+
def __repr__(self) -> str:
|
|
36
|
+
return f"<LifecycleEventProcessorDefinition name='{self.name}', class='{self.processor_class.__name__}'>"
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
# file: autobyteus/agent/lifecycle/processor_registry.py
|
|
2
|
+
import logging
|
|
3
|
+
from typing import TYPE_CHECKING, Dict, List, Optional, Type
|
|
4
|
+
|
|
5
|
+
from autobyteus.utils.singleton import SingletonMeta
|
|
6
|
+
from .processor_definition import LifecycleEventProcessorDefinition
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from .base_processor import BaseLifecycleEventProcessor
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
class LifecycleEventProcessorRegistry(metaclass=SingletonMeta):
|
|
14
|
+
"""
|
|
15
|
+
A singleton registry for LifecycleEventProcessorDefinition objects.
|
|
16
|
+
Processors are typically auto-registered via LifecycleEventProcessorMeta.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
"""Initializes the LifecycleEventProcessorRegistry with an empty store."""
|
|
21
|
+
self._definitions: Dict[str, LifecycleEventProcessorDefinition] = {}
|
|
22
|
+
logger.info("LifecycleEventProcessorRegistry initialized.")
|
|
23
|
+
|
|
24
|
+
def register_processor(self, definition: LifecycleEventProcessorDefinition) -> None:
|
|
25
|
+
"""
|
|
26
|
+
Registers a lifecycle event processor definition.
|
|
27
|
+
"""
|
|
28
|
+
if not isinstance(definition, LifecycleEventProcessorDefinition):
|
|
29
|
+
raise TypeError(f"Expected LifecycleEventProcessorDefinition instance, got {type(definition).__name__}.")
|
|
30
|
+
|
|
31
|
+
processor_name = definition.name
|
|
32
|
+
if processor_name in self._definitions:
|
|
33
|
+
logger.warning(f"Overwriting existing lifecycle event processor definition for name: '{processor_name}'.")
|
|
34
|
+
|
|
35
|
+
self._definitions[processor_name] = definition
|
|
36
|
+
logger.info(f"Lifecycle event processor definition '{processor_name}' (class: '{definition.processor_class.__name__}') registered successfully.")
|
|
37
|
+
|
|
38
|
+
def get_processor_definition(self, name: str) -> Optional[LifecycleEventProcessorDefinition]:
|
|
39
|
+
"""
|
|
40
|
+
Retrieves a lifecycle event processor definition by its name.
|
|
41
|
+
"""
|
|
42
|
+
if not isinstance(name, str):
|
|
43
|
+
logger.warning(f"Attempted to retrieve lifecycle event processor definition with non-string name: {type(name).__name__}.")
|
|
44
|
+
return None
|
|
45
|
+
definition = self._definitions.get(name)
|
|
46
|
+
if not definition:
|
|
47
|
+
logger.debug(f"Lifecycle event processor definition with name '{name}' not found in registry.")
|
|
48
|
+
return definition
|
|
49
|
+
|
|
50
|
+
def get_processor(self, name: str) -> Optional['BaseLifecycleEventProcessor']:
|
|
51
|
+
"""
|
|
52
|
+
Retrieves an instance of a lifecycle event processor by its name.
|
|
53
|
+
"""
|
|
54
|
+
definition = self.get_processor_definition(name)
|
|
55
|
+
if definition:
|
|
56
|
+
try:
|
|
57
|
+
return definition.processor_class()
|
|
58
|
+
except Exception as e:
|
|
59
|
+
logger.error(f"Failed to instantiate lifecycle event processor '{name}' from class '{definition.processor_class.__name__}': {e}", exc_info=True)
|
|
60
|
+
return None
|
|
61
|
+
return None
|
|
62
|
+
|
|
63
|
+
def list_processor_names(self) -> List[str]:
|
|
64
|
+
"""
|
|
65
|
+
Returns an unordered list of names of all registered lifecycle processor definitions.
|
|
66
|
+
"""
|
|
67
|
+
return list(self._definitions.keys())
|
|
68
|
+
|
|
69
|
+
def get_ordered_processor_options(self) -> List['ProcessorOption']:
|
|
70
|
+
"""
|
|
71
|
+
Returns a list of ProcessorOption objects, sorted by their execution order.
|
|
72
|
+
"""
|
|
73
|
+
from autobyteus.agent.processor_option import ProcessorOption
|
|
74
|
+
definitions = list(self._definitions.values())
|
|
75
|
+
sorted_definitions = sorted(definitions, key=lambda d: d.processor_class.get_order())
|
|
76
|
+
return [
|
|
77
|
+
ProcessorOption(
|
|
78
|
+
name=d.name,
|
|
79
|
+
is_mandatory=d.processor_class.is_mandatory()
|
|
80
|
+
) for d in sorted_definitions
|
|
81
|
+
]
|
|
82
|
+
|
|
83
|
+
def get_all_definitions(self) -> Dict[str, LifecycleEventProcessorDefinition]:
|
|
84
|
+
"""
|
|
85
|
+
Returns a shallow copy of the dictionary containing all registered lifecycle processor 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 LifecycleProcessorRegistry.")
|
|
94
|
+
|
|
95
|
+
def __len__(self) -> int:
|
|
96
|
+
"""Returns the number of registered lifecycle processor definitions."""
|
|
97
|
+
return len(self._definitions)
|
|
98
|
+
|
|
99
|
+
def __contains__(self, name: str) -> bool:
|
|
100
|
+
"""Checks if a processor 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_lifecycle_event_processor_registry = LifecycleEventProcessorRegistry()
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Any, List, Optional, Union
|
|
3
|
+
|
|
4
|
+
from autobyteus.llm.prompt_renderers.base_prompt_renderer import BasePromptRenderer
|
|
5
|
+
from autobyteus.llm.user_message import LLMUserMessage
|
|
6
|
+
from autobyteus.llm.utils.messages import Message, MessageRole
|
|
7
|
+
from autobyteus.memory.compaction_snapshot_builder import CompactionSnapshotBuilder
|
|
8
|
+
from autobyteus.memory.memory_manager import MemoryManager
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class RequestPackage:
|
|
13
|
+
messages: List[Message]
|
|
14
|
+
rendered_payload: Any
|
|
15
|
+
did_compact: bool
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
class LLMRequestAssembler:
|
|
19
|
+
def __init__(
|
|
20
|
+
self,
|
|
21
|
+
memory_manager: MemoryManager,
|
|
22
|
+
renderer: BasePromptRenderer,
|
|
23
|
+
compaction_snapshot_builder: Optional[CompactionSnapshotBuilder] = None,
|
|
24
|
+
max_episodic: int = 3,
|
|
25
|
+
max_semantic: int = 20,
|
|
26
|
+
):
|
|
27
|
+
self.memory_manager = memory_manager
|
|
28
|
+
self.renderer = renderer
|
|
29
|
+
self.compaction_snapshot_builder = compaction_snapshot_builder or CompactionSnapshotBuilder()
|
|
30
|
+
self.max_episodic = max_episodic
|
|
31
|
+
self.max_semantic = max_semantic
|
|
32
|
+
|
|
33
|
+
async def prepare_request(
|
|
34
|
+
self,
|
|
35
|
+
processed_user_input: Union[str, LLMUserMessage],
|
|
36
|
+
current_turn_id: Optional[str] = None,
|
|
37
|
+
system_prompt: Optional[str] = None,
|
|
38
|
+
) -> RequestPackage:
|
|
39
|
+
user_message = self._build_user_message(processed_user_input)
|
|
40
|
+
self._ensure_system_prompt(system_prompt)
|
|
41
|
+
|
|
42
|
+
did_compact = False
|
|
43
|
+
policy = self.memory_manager.compaction_policy
|
|
44
|
+
compactor = self.memory_manager.compactor
|
|
45
|
+
|
|
46
|
+
if self.memory_manager.compaction_required and policy and compactor:
|
|
47
|
+
turn_ids = compactor.select_compaction_window()
|
|
48
|
+
if turn_ids:
|
|
49
|
+
compactor.compact(turn_ids)
|
|
50
|
+
bundle = self.memory_manager.retriever.retrieve(
|
|
51
|
+
max_episodic=self.max_episodic,
|
|
52
|
+
max_semantic=self.max_semantic,
|
|
53
|
+
)
|
|
54
|
+
raw_tail = self.memory_manager.get_raw_tail(
|
|
55
|
+
policy.raw_tail_turns,
|
|
56
|
+
exclude_turn_id=current_turn_id,
|
|
57
|
+
)
|
|
58
|
+
snapshot_messages = self.compaction_snapshot_builder.build(
|
|
59
|
+
system_prompt=system_prompt or "",
|
|
60
|
+
bundle=bundle,
|
|
61
|
+
raw_tail=raw_tail,
|
|
62
|
+
)
|
|
63
|
+
self.memory_manager.reset_transcript(snapshot_messages)
|
|
64
|
+
self.memory_manager.clear_compaction_request()
|
|
65
|
+
did_compact = True
|
|
66
|
+
|
|
67
|
+
self.memory_manager.active_transcript.append_message(user_message)
|
|
68
|
+
final_messages = self.memory_manager.get_transcript_messages()
|
|
69
|
+
rendered_payload = await self.render_payload(final_messages)
|
|
70
|
+
|
|
71
|
+
return RequestPackage(
|
|
72
|
+
messages=final_messages,
|
|
73
|
+
rendered_payload=rendered_payload,
|
|
74
|
+
did_compact=did_compact,
|
|
75
|
+
)
|
|
76
|
+
|
|
77
|
+
async def render_payload(self, messages: List[Message]) -> Any:
|
|
78
|
+
return await self.renderer.render(messages)
|
|
79
|
+
|
|
80
|
+
def _build_user_message(self, processed_user_input: Union[str, LLMUserMessage]) -> Message:
|
|
81
|
+
if isinstance(processed_user_input, LLMUserMessage):
|
|
82
|
+
return Message(
|
|
83
|
+
role=MessageRole.USER,
|
|
84
|
+
content=processed_user_input.content,
|
|
85
|
+
image_urls=processed_user_input.image_urls,
|
|
86
|
+
audio_urls=processed_user_input.audio_urls,
|
|
87
|
+
video_urls=processed_user_input.video_urls,
|
|
88
|
+
)
|
|
89
|
+
return Message(role=MessageRole.USER, content=str(processed_user_input))
|
|
90
|
+
|
|
91
|
+
def _ensure_system_prompt(self, system_prompt: Optional[str]) -> None:
|
|
92
|
+
if not system_prompt:
|
|
93
|
+
return
|
|
94
|
+
existing = self.memory_manager.get_transcript_messages()
|
|
95
|
+
if not existing:
|
|
96
|
+
self.memory_manager.active_transcript.append_message(
|
|
97
|
+
Message(role=MessageRole.SYSTEM, content=system_prompt)
|
|
98
|
+
)
|
|
@@ -1,16 +1,9 @@
|
|
|
1
1
|
# file: autobyteus/autobyteus/agent/llm_response_processor/__init__.py
|
|
2
2
|
"""
|
|
3
|
-
Components for processing LLM responses
|
|
3
|
+
Components for processing LLM responses.
|
|
4
4
|
"""
|
|
5
5
|
from .base_processor import BaseLLMResponseProcessor
|
|
6
|
-
from .provider_aware_tool_usage_processor import ProviderAwareToolUsageProcessor
|
|
7
|
-
|
|
8
|
-
# This __init__ should only export the high-level processors that live in this directory.
|
|
9
|
-
# The low-level parsers and formatters live in the `tools` module and are not
|
|
10
|
-
# part of this module's public API.
|
|
11
6
|
|
|
12
7
|
__all__ = [
|
|
13
|
-
# Primary public classes
|
|
14
8
|
"BaseLLMResponseProcessor",
|
|
15
|
-
"ProviderAwareToolUsageProcessor",
|
|
16
9
|
]
|
|
@@ -63,7 +63,7 @@ class ContextFileType(str, Enum):
|
|
|
63
63
|
return cls.PYTHON
|
|
64
64
|
elif extension == ".js":
|
|
65
65
|
return cls.JAVASCRIPT
|
|
66
|
-
elif extension in [".mp3", ".wav", ".m4a", ".flac", ".ogg"]:
|
|
66
|
+
elif extension in [".mp3", ".wav", ".m4a", ".flac", ".ogg", ".aac"]:
|
|
67
67
|
return cls.AUDIO
|
|
68
68
|
elif extension in [".mp4", ".mov", ".avi", ".mkv", ".webm"]:
|
|
69
69
|
return cls.VIDEO
|
|
@@ -6,9 +6,11 @@ import concurrent.futures
|
|
|
6
6
|
from typing import Optional, Any, Callable, Awaitable, TYPE_CHECKING
|
|
7
7
|
|
|
8
8
|
from autobyteus.agent.context import AgentContext, AgentContextRegistry
|
|
9
|
-
from autobyteus.agent.
|
|
9
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
10
|
+
from autobyteus.agent.status.manager import AgentStatusManager
|
|
10
11
|
from autobyteus.agent.events.notifiers import AgentExternalEventNotifier
|
|
11
|
-
from autobyteus.agent.events import BaseEvent
|
|
12
|
+
from autobyteus.agent.events import BaseEvent, AgentErrorEvent, AgentStoppedEvent, ShutdownRequestedEvent
|
|
13
|
+
from autobyteus.agent.status.status_update_utils import apply_event_and_derive_status
|
|
12
14
|
from autobyteus.agent.handlers import EventHandlerRegistry
|
|
13
15
|
from autobyteus.agent.runtime.agent_worker import AgentWorker
|
|
14
16
|
|
|
@@ -30,9 +32,9 @@ class AgentRuntime:
|
|
|
30
32
|
self.event_handler_registry: EventHandlerRegistry = event_handler_registry
|
|
31
33
|
|
|
32
34
|
self.external_event_notifier: AgentExternalEventNotifier = AgentExternalEventNotifier(agent_id=self.context.agent_id)
|
|
33
|
-
self.
|
|
35
|
+
self.status_manager: AgentStatusManager = AgentStatusManager(context=self.context, notifier=self.external_event_notifier)
|
|
34
36
|
|
|
35
|
-
self.context.state.
|
|
37
|
+
self.context.state.status_manager_ref = self.status_manager
|
|
36
38
|
|
|
37
39
|
self._worker: AgentWorker = AgentWorker(
|
|
38
40
|
context=self.context,
|
|
@@ -88,8 +90,8 @@ class AgentRuntime:
|
|
|
88
90
|
return
|
|
89
91
|
|
|
90
92
|
logger.info(f"AgentRuntime for '{agent_id}': Starting worker.")
|
|
91
|
-
# The first meaningful
|
|
92
|
-
#
|
|
93
|
+
# The first meaningful status change to BOOTSTRAPPING is triggered within
|
|
94
|
+
# the worker's async initialization sequence.
|
|
93
95
|
self._worker.start()
|
|
94
96
|
logger.info(f"AgentRuntime for '{agent_id}': Worker start command issued. Worker will initialize itself.")
|
|
95
97
|
|
|
@@ -100,28 +102,31 @@ class AgentRuntime:
|
|
|
100
102
|
logger.info(f"AgentRuntime '{agent_id}': Worker thread completed successfully.")
|
|
101
103
|
except Exception as e:
|
|
102
104
|
logger.error(f"AgentRuntime '{agent_id}': Worker thread terminated with an exception: {e}", exc_info=True)
|
|
103
|
-
if not self.context.
|
|
104
|
-
# Since the phase manager is now async, we must run it in a new event loop.
|
|
105
|
+
if not self.context.current_status.is_terminal():
|
|
105
106
|
try:
|
|
106
|
-
asyncio.run(self.
|
|
107
|
+
asyncio.run(self._apply_event_and_derive_status(
|
|
108
|
+
AgentErrorEvent(
|
|
109
|
+
error_message="Worker thread exited unexpectedly.",
|
|
110
|
+
exception_details=traceback.format_exc()
|
|
111
|
+
)
|
|
112
|
+
))
|
|
107
113
|
except Exception as run_e:
|
|
108
|
-
logger.critical(f"AgentRuntime '{agent_id}': Failed to
|
|
114
|
+
logger.critical(f"AgentRuntime '{agent_id}': Failed to emit derived error: {run_e}")
|
|
109
115
|
|
|
110
|
-
if not self.context.
|
|
111
|
-
# Use asyncio.run() to execute the final async phase transition from a sync callback.
|
|
116
|
+
if not self.context.current_status.is_terminal():
|
|
112
117
|
try:
|
|
113
|
-
asyncio.run(self.
|
|
118
|
+
asyncio.run(self._apply_event_and_derive_status(AgentStoppedEvent()))
|
|
114
119
|
except Exception as run_e:
|
|
115
|
-
logger.critical(f"AgentRuntime '{agent_id}': Failed to
|
|
120
|
+
logger.critical(f"AgentRuntime '{agent_id}': Failed to emit derived shutdown complete: {run_e}")
|
|
116
121
|
|
|
117
122
|
async def stop(self, timeout: float = 10.0) -> None:
|
|
118
123
|
agent_id = self.context.agent_id
|
|
119
124
|
if not self._worker.is_alive() and not self._worker._is_active:
|
|
120
|
-
if not self.context.
|
|
121
|
-
await self.
|
|
125
|
+
if not self.context.current_status.is_terminal():
|
|
126
|
+
await self._apply_event_and_derive_status(AgentStoppedEvent())
|
|
122
127
|
return
|
|
123
|
-
|
|
124
|
-
await self.
|
|
128
|
+
|
|
129
|
+
await self._apply_event_and_derive_status(ShutdownRequestedEvent())
|
|
125
130
|
await self._worker.stop(timeout=timeout)
|
|
126
131
|
|
|
127
132
|
# LLM instance cleanup is now handled by the AgentWorker before its loop closes.
|
|
@@ -130,12 +135,15 @@ class AgentRuntime:
|
|
|
130
135
|
self._context_registry.unregister_context(agent_id)
|
|
131
136
|
logger.info(f"AgentRuntime for '{agent_id}': Context unregistered.")
|
|
132
137
|
|
|
133
|
-
await self.
|
|
138
|
+
await self._apply_event_and_derive_status(AgentStoppedEvent())
|
|
134
139
|
logger.info(f"AgentRuntime for '{agent_id}' stop() method completed.")
|
|
135
140
|
|
|
141
|
+
async def _apply_event_and_derive_status(self, event: BaseEvent) -> None:
|
|
142
|
+
await apply_event_and_derive_status(event, self.context)
|
|
143
|
+
|
|
136
144
|
@property
|
|
137
|
-
def
|
|
138
|
-
return self.context.
|
|
145
|
+
def current_status_property(self) -> AgentStatus:
|
|
146
|
+
return self.context.current_status
|
|
139
147
|
|
|
140
148
|
@property
|
|
141
149
|
def is_running(self) -> bool:
|