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
|
@@ -1,141 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import
|
|
3
|
-
from enum import Enum
|
|
4
|
-
from typing import Dict, Any, Optional, Union, Type
|
|
5
|
-
from pydantic import BaseModel, Field, AwareDatetime, field_validator, ValidationInfo
|
|
6
|
-
import datetime
|
|
7
|
-
import uuid
|
|
1
|
+
"""Compatibility shim for stream events."""
|
|
2
|
+
from .events.stream_events import *
|
|
8
3
|
|
|
9
|
-
|
|
10
|
-
from .stream_event_payloads import (
|
|
11
|
-
StreamDataPayload,
|
|
12
|
-
AssistantChunkData,
|
|
13
|
-
AssistantCompleteResponseData,
|
|
14
|
-
ToolInteractionLogEntryData,
|
|
15
|
-
AgentOperationalPhaseTransitionData,
|
|
16
|
-
ErrorEventData,
|
|
17
|
-
ToolInvocationApprovalRequestedData,
|
|
18
|
-
ToolInvocationAutoExecutingData,
|
|
19
|
-
SystemTaskNotificationData, # NEW
|
|
20
|
-
ToDoListUpdateData,
|
|
21
|
-
EmptyData,
|
|
22
|
-
create_assistant_chunk_data,
|
|
23
|
-
create_assistant_complete_response_data,
|
|
24
|
-
create_tool_interaction_log_entry_data,
|
|
25
|
-
create_agent_operational_phase_transition_data,
|
|
26
|
-
create_error_event_data,
|
|
27
|
-
create_tool_invocation_approval_requested_data,
|
|
28
|
-
create_tool_invocation_auto_executing_data,
|
|
29
|
-
create_system_task_notification_data, # NEW
|
|
30
|
-
create_todo_list_update_data,
|
|
31
|
-
)
|
|
32
|
-
|
|
33
|
-
logger = logging.getLogger(__name__)
|
|
34
|
-
|
|
35
|
-
class StreamEventType(str, Enum):
|
|
36
|
-
"""
|
|
37
|
-
Defines the types of events that can appear in a unified agent output stream
|
|
38
|
-
provided by AgentEventStream.
|
|
39
|
-
"""
|
|
40
|
-
ASSISTANT_CHUNK = "assistant_chunk"
|
|
41
|
-
ASSISTANT_COMPLETE_RESPONSE = "assistant_complete_response"
|
|
42
|
-
TOOL_INTERACTION_LOG_ENTRY = "tool_interaction_log_entry"
|
|
43
|
-
AGENT_OPERATIONAL_PHASE_TRANSITION = "agent_operational_phase_transition"
|
|
44
|
-
ERROR_EVENT = "error_event"
|
|
45
|
-
TOOL_INVOCATION_APPROVAL_REQUESTED = "tool_invocation_approval_requested"
|
|
46
|
-
TOOL_INVOCATION_AUTO_EXECUTING = "tool_invocation_auto_executing"
|
|
47
|
-
SYSTEM_TASK_NOTIFICATION = "system_task_notification" # NEW
|
|
48
|
-
AGENT_TODO_LIST_UPDATE = "agent_todo_list_updated"
|
|
49
|
-
AGENT_IDLE = "agent_idle"
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
_STREAM_EVENT_TYPE_TO_PAYLOAD_CLASS: Dict[StreamEventType, Type[BaseModel]] = {
|
|
53
|
-
StreamEventType.ASSISTANT_CHUNK: AssistantChunkData,
|
|
54
|
-
StreamEventType.ASSISTANT_COMPLETE_RESPONSE: AssistantCompleteResponseData,
|
|
55
|
-
StreamEventType.TOOL_INTERACTION_LOG_ENTRY: ToolInteractionLogEntryData,
|
|
56
|
-
StreamEventType.AGENT_OPERATIONAL_PHASE_TRANSITION: AgentOperationalPhaseTransitionData,
|
|
57
|
-
StreamEventType.ERROR_EVENT: ErrorEventData,
|
|
58
|
-
StreamEventType.TOOL_INVOCATION_APPROVAL_REQUESTED: ToolInvocationApprovalRequestedData,
|
|
59
|
-
StreamEventType.TOOL_INVOCATION_AUTO_EXECUTING: ToolInvocationAutoExecutingData,
|
|
60
|
-
StreamEventType.SYSTEM_TASK_NOTIFICATION: SystemTaskNotificationData, # NEW
|
|
61
|
-
StreamEventType.AGENT_TODO_LIST_UPDATE: ToDoListUpdateData,
|
|
62
|
-
StreamEventType.AGENT_IDLE: AgentOperationalPhaseTransitionData,
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
class StreamEvent(BaseModel):
|
|
67
|
-
"""
|
|
68
|
-
Pydantic model for a unified, typed event in an agent's output stream.
|
|
69
|
-
The 'data' field is now a discriminated union of specific payload models
|
|
70
|
-
based on 'event_type'.
|
|
71
|
-
"""
|
|
72
|
-
event_id: str = Field(
|
|
73
|
-
default_factory=lambda: str(uuid.uuid4()),
|
|
74
|
-
description="Unique identifier for the event."
|
|
75
|
-
)
|
|
76
|
-
timestamp: AwareDatetime = Field(
|
|
77
|
-
default_factory=lambda: datetime.datetime.now(datetime.timezone.utc),
|
|
78
|
-
description="Timestamp of when the event was created (UTC)."
|
|
79
|
-
)
|
|
80
|
-
event_type: StreamEventType = Field(
|
|
81
|
-
...,
|
|
82
|
-
description="The type of the event. This acts as the discriminator."
|
|
83
|
-
)
|
|
84
|
-
data: StreamDataPayload = Field(
|
|
85
|
-
...,
|
|
86
|
-
description="Payload of the event, specific to the event_type."
|
|
87
|
-
)
|
|
88
|
-
agent_id: Optional[str] = Field(
|
|
89
|
-
default=None,
|
|
90
|
-
description="Optional ID of the agent that originated this event."
|
|
91
|
-
)
|
|
92
|
-
|
|
93
|
-
@field_validator('data', mode='before')
|
|
94
|
-
def validate_data_based_on_event_type(cls, v, info: ValidationInfo):
|
|
95
|
-
event_type_value = info.data.get('event_type')
|
|
96
|
-
if not event_type_value:
|
|
97
|
-
return v
|
|
98
|
-
|
|
99
|
-
if isinstance(event_type_value, str):
|
|
100
|
-
try:
|
|
101
|
-
event_type = StreamEventType(event_type_value)
|
|
102
|
-
except ValueError: # pragma: no cover
|
|
103
|
-
logger.error(f"Invalid event_type string '{event_type_value}' for validation.")
|
|
104
|
-
raise ValueError(f"Invalid event_type string '{event_type_value}'")
|
|
105
|
-
elif isinstance(event_type_value, StreamEventType):
|
|
106
|
-
event_type = event_type_value
|
|
107
|
-
else: # pragma: no cover
|
|
108
|
-
logger.error(f"event_type is of unexpected type {type(event_type_value)} during validation.")
|
|
109
|
-
raise TypeError(f"event_type is of unexpected type {type(event_type_value)}")
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
payload_class = _STREAM_EVENT_TYPE_TO_PAYLOAD_CLASS.get(event_type)
|
|
113
|
-
|
|
114
|
-
if payload_class:
|
|
115
|
-
if isinstance(v, payload_class):
|
|
116
|
-
return v
|
|
117
|
-
if isinstance(v, dict):
|
|
118
|
-
try:
|
|
119
|
-
return payload_class(**v)
|
|
120
|
-
except Exception as e:
|
|
121
|
-
logger.error(f"Failed to parse dict into {payload_class.__name__} for event_type {event_type.value}: {e}. Dict was: {v}")
|
|
122
|
-
raise ValueError(f"Data for event type {event_type.value} does not match expected model {payload_class.__name__}.") from e
|
|
123
|
-
logger.error(f"Data for event type {event_type.value} is of unexpected type {type(v)}. Expected dict or {payload_class.__name__}.")
|
|
124
|
-
raise ValueError(f"Data for event type {event_type.value} is of unexpected type {type(v)}.")
|
|
125
|
-
|
|
126
|
-
logger.warning(f"No specific payload class mapped for event_type: {event_type.value}. Raw data: {v}")
|
|
127
|
-
if isinstance(v, dict):
|
|
128
|
-
return v
|
|
129
|
-
return v
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
class Config:
|
|
133
|
-
populate_by_name = True
|
|
134
|
-
|
|
135
|
-
def __repr__(self) -> str:
|
|
136
|
-
return (f"<StreamEvent event_id='{self.event_id}', agent_id='{self.agent_id}', "
|
|
137
|
-
f"type='{self.event_type.value}', timestamp='{self.timestamp.isoformat()}', data_type='{type(self.data).__name__}'>")
|
|
138
|
-
|
|
139
|
-
def __str__(self) -> str:
|
|
140
|
-
return (f"StreamEvent[{self.event_type.value}] (ID: {self.event_id}, Agent: {self.agent_id or 'N/A'}): "
|
|
141
|
-
f"Data: {self.data!r}")
|
|
4
|
+
__all__ = ["StreamEvent", "StreamEventType"]
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/agent/streaming/agent_event_stream.py
|
|
2
|
+
import asyncio
|
|
3
|
+
import logging
|
|
4
|
+
import queue as standard_queue
|
|
5
|
+
from typing import AsyncIterator, Any, TYPE_CHECKING, Optional, Union
|
|
6
|
+
from ..events.stream_events import StreamEvent, StreamEventType
|
|
7
|
+
from ..events.stream_event_payloads import (
|
|
8
|
+
create_assistant_chunk_data,
|
|
9
|
+
create_assistant_complete_response_data,
|
|
10
|
+
create_tool_interaction_log_entry_data,
|
|
11
|
+
create_agent_status_update_data,
|
|
12
|
+
create_error_event_data,
|
|
13
|
+
create_tool_invocation_approval_requested_data,
|
|
14
|
+
create_tool_invocation_auto_executing_data,
|
|
15
|
+
create_segment_event_data,
|
|
16
|
+
create_system_task_notification_data, # NEW
|
|
17
|
+
create_inter_agent_message_data, # NEW
|
|
18
|
+
create_todo_list_update_data,
|
|
19
|
+
create_artifact_persisted_data, # NEW
|
|
20
|
+
create_artifact_updated_data, # NEW
|
|
21
|
+
AssistantChunkData,
|
|
22
|
+
AssistantCompleteResponseData,
|
|
23
|
+
ToolInteractionLogEntryData,
|
|
24
|
+
AgentStatusUpdateData,
|
|
25
|
+
ToolInvocationApprovalRequestedData,
|
|
26
|
+
ToolInvocationAutoExecutingData,
|
|
27
|
+
SegmentEventData,
|
|
28
|
+
ErrorEventData,
|
|
29
|
+
SystemTaskNotificationData, # NEW
|
|
30
|
+
InterAgentMessageData, # NEW
|
|
31
|
+
ToDoListUpdateData,
|
|
32
|
+
ArtifactPersistedData, # NEW
|
|
33
|
+
ArtifactUpdatedData, # NEW
|
|
34
|
+
StreamDataPayload,
|
|
35
|
+
)
|
|
36
|
+
from ..utils.queue_streamer import stream_queue_items
|
|
37
|
+
from autobyteus.events.event_types import EventType
|
|
38
|
+
from autobyteus.events.event_emitter import EventEmitter
|
|
39
|
+
|
|
40
|
+
if TYPE_CHECKING:
|
|
41
|
+
from autobyteus.agent.agent import Agent
|
|
42
|
+
from autobyteus.agent.events.notifiers import AgentExternalEventNotifier
|
|
43
|
+
|
|
44
|
+
logger = logging.getLogger(__name__)
|
|
45
|
+
|
|
46
|
+
_AES_INTERNAL_SENTINEL = object()
|
|
47
|
+
|
|
48
|
+
class AgentEventStream(EventEmitter):
|
|
49
|
+
def __init__(self, agent: 'Agent'):
|
|
50
|
+
super().__init__()
|
|
51
|
+
|
|
52
|
+
from autobyteus.agent.agent import Agent as ConcreteAgent
|
|
53
|
+
if not isinstance(agent, ConcreteAgent):
|
|
54
|
+
raise TypeError(f"AgentEventStream requires an Agent instance, got {type(agent).__name__}.")
|
|
55
|
+
|
|
56
|
+
self.agent_id: str = agent.agent_id
|
|
57
|
+
|
|
58
|
+
self._generic_stream_event_internal_q: standard_queue.Queue[Union[StreamEvent, object]] = standard_queue.Queue()
|
|
59
|
+
|
|
60
|
+
self._notifier: Optional['AgentExternalEventNotifier'] = None
|
|
61
|
+
if agent.context and agent.context.status_manager:
|
|
62
|
+
self._notifier = agent.context.status_manager.notifier
|
|
63
|
+
|
|
64
|
+
if not self._notifier:
|
|
65
|
+
logger.error(f"AgentEventStream for '{self.agent_id}': Notifier not available. No events will be streamed.")
|
|
66
|
+
return
|
|
67
|
+
|
|
68
|
+
self._register_listeners()
|
|
69
|
+
|
|
70
|
+
logger.info(f"AgentEventStream (ID: {self.object_id}) initialized for agent_id '{self.agent_id}'. Subscribed to notifier.")
|
|
71
|
+
|
|
72
|
+
def _register_listeners(self):
|
|
73
|
+
"""Subscribes this instance's handler to all relevant events from the notifier."""
|
|
74
|
+
all_agent_event_types = [et for et in EventType if et.name.startswith("AGENT_")]
|
|
75
|
+
|
|
76
|
+
for event_type in all_agent_event_types:
|
|
77
|
+
self.subscribe_from(self._notifier, event_type, self._handle_notifier_event_sync)
|
|
78
|
+
|
|
79
|
+
def _handle_notifier_event_sync(self, event_type: EventType, payload: Optional[Any] = None, object_id: Optional[str] = None, **kwargs):
|
|
80
|
+
event_agent_id = kwargs.get("agent_id", self.agent_id)
|
|
81
|
+
|
|
82
|
+
typed_payload_for_stream_event: Optional[StreamDataPayload] = None
|
|
83
|
+
stream_event_type_for_generic_stream: Optional[StreamEventType] = None
|
|
84
|
+
|
|
85
|
+
try:
|
|
86
|
+
if event_type == EventType.AGENT_STATUS_UPDATED:
|
|
87
|
+
typed_payload_for_stream_event = create_agent_status_update_data(payload)
|
|
88
|
+
stream_event_type_for_generic_stream = StreamEventType.AGENT_STATUS_UPDATED
|
|
89
|
+
elif event_type == EventType.AGENT_DATA_ASSISTANT_CHUNK:
|
|
90
|
+
typed_payload_for_stream_event = create_assistant_chunk_data(payload)
|
|
91
|
+
stream_event_type_for_generic_stream = StreamEventType.ASSISTANT_CHUNK
|
|
92
|
+
elif event_type == EventType.AGENT_DATA_ASSISTANT_COMPLETE_RESPONSE:
|
|
93
|
+
typed_payload_for_stream_event = create_assistant_complete_response_data(payload)
|
|
94
|
+
stream_event_type_for_generic_stream = StreamEventType.ASSISTANT_COMPLETE_RESPONSE
|
|
95
|
+
elif event_type == EventType.AGENT_DATA_TOOL_LOG:
|
|
96
|
+
typed_payload_for_stream_event = create_tool_interaction_log_entry_data(payload)
|
|
97
|
+
stream_event_type_for_generic_stream = StreamEventType.TOOL_INTERACTION_LOG_ENTRY
|
|
98
|
+
elif event_type == EventType.AGENT_REQUEST_TOOL_INVOCATION_APPROVAL:
|
|
99
|
+
typed_payload_for_stream_event = create_tool_invocation_approval_requested_data(payload)
|
|
100
|
+
stream_event_type_for_generic_stream = StreamEventType.TOOL_INVOCATION_APPROVAL_REQUESTED
|
|
101
|
+
elif event_type == EventType.AGENT_TOOL_INVOCATION_AUTO_EXECUTING:
|
|
102
|
+
typed_payload_for_stream_event = create_tool_invocation_auto_executing_data(payload)
|
|
103
|
+
stream_event_type_for_generic_stream = StreamEventType.TOOL_INVOCATION_AUTO_EXECUTING
|
|
104
|
+
elif event_type == EventType.AGENT_DATA_SEGMENT_EVENT:
|
|
105
|
+
typed_payload_for_stream_event = create_segment_event_data(payload)
|
|
106
|
+
stream_event_type_for_generic_stream = StreamEventType.SEGMENT_EVENT
|
|
107
|
+
elif event_type == EventType.AGENT_ERROR_OUTPUT_GENERATION:
|
|
108
|
+
typed_payload_for_stream_event = create_error_event_data(payload)
|
|
109
|
+
stream_event_type_for_generic_stream = StreamEventType.ERROR_EVENT
|
|
110
|
+
# NEW MAPPING
|
|
111
|
+
elif event_type == EventType.AGENT_DATA_SYSTEM_TASK_NOTIFICATION_RECEIVED:
|
|
112
|
+
typed_payload_for_stream_event = create_system_task_notification_data(payload)
|
|
113
|
+
stream_event_type_for_generic_stream = StreamEventType.SYSTEM_TASK_NOTIFICATION
|
|
114
|
+
elif event_type == EventType.AGENT_DATA_INTER_AGENT_MESSAGE_RECEIVED:
|
|
115
|
+
typed_payload_for_stream_event = create_inter_agent_message_data(payload)
|
|
116
|
+
stream_event_type_for_generic_stream = StreamEventType.INTER_AGENT_MESSAGE
|
|
117
|
+
elif event_type == EventType.AGENT_DATA_TODO_LIST_UPDATED:
|
|
118
|
+
typed_payload_for_stream_event = create_todo_list_update_data(payload)
|
|
119
|
+
stream_event_type_for_generic_stream = StreamEventType.AGENT_TODO_LIST_UPDATE
|
|
120
|
+
# NEW MAPPING
|
|
121
|
+
elif event_type == EventType.AGENT_ARTIFACT_PERSISTED:
|
|
122
|
+
typed_payload_for_stream_event = create_artifact_persisted_data(payload)
|
|
123
|
+
stream_event_type_for_generic_stream = StreamEventType.ARTIFACT_PERSISTED
|
|
124
|
+
elif event_type == EventType.AGENT_ARTIFACT_UPDATED:
|
|
125
|
+
typed_payload_for_stream_event = create_artifact_updated_data(payload)
|
|
126
|
+
stream_event_type_for_generic_stream = StreamEventType.ARTIFACT_UPDATED
|
|
127
|
+
|
|
128
|
+
elif event_type == EventType.AGENT_DATA_TOOL_LOG_STREAM_END:
|
|
129
|
+
pass
|
|
130
|
+
else:
|
|
131
|
+
logger.debug(f"AgentEventStream received internal event '{event_type.name}' with no direct stream mapping.")
|
|
132
|
+
|
|
133
|
+
except Exception as e:
|
|
134
|
+
logger.error(f"AgentEventStream error processing payload for event '{event_type.name}': {e}", exc_info=True)
|
|
135
|
+
|
|
136
|
+
if typed_payload_for_stream_event and stream_event_type_for_generic_stream:
|
|
137
|
+
stream_event = StreamEvent(
|
|
138
|
+
agent_id=event_agent_id,
|
|
139
|
+
event_type=stream_event_type_for_generic_stream,
|
|
140
|
+
data=typed_payload_for_stream_event
|
|
141
|
+
)
|
|
142
|
+
self._generic_stream_event_internal_q.put(stream_event)
|
|
143
|
+
|
|
144
|
+
async def close(self):
|
|
145
|
+
logger.info(f"AgentEventStream (ID: {self.object_id}) for '{self.agent_id}': close() called. Unsubscribing all listeners and signaling.")
|
|
146
|
+
self.unsubscribe_all_listeners()
|
|
147
|
+
# Standard queue.put is non-blocking for the unbounded queue we use here.
|
|
148
|
+
self._generic_stream_event_internal_q.put(_AES_INTERNAL_SENTINEL)
|
|
149
|
+
|
|
150
|
+
async def all_events(self) -> AsyncIterator[StreamEvent]:
|
|
151
|
+
"""The primary method to consume all structured events from the agent."""
|
|
152
|
+
async for event in stream_queue_items(self._generic_stream_event_internal_q, _AES_INTERNAL_SENTINEL, f"agent_{self.agent_id}_all_events"):
|
|
153
|
+
yield event
|
|
154
|
+
|
|
155
|
+
# --- Convenience Stream Methods ---
|
|
156
|
+
|
|
157
|
+
async def stream_assistant_chunks(self) -> AsyncIterator[AssistantChunkData]:
|
|
158
|
+
"""A convenience async generator that yields only assistant content/reasoning chunks."""
|
|
159
|
+
async for event in self.all_events():
|
|
160
|
+
if event.event_type == StreamEventType.ASSISTANT_CHUNK and isinstance(event.data, AssistantChunkData):
|
|
161
|
+
yield event.data
|
|
162
|
+
|
|
163
|
+
async def stream_assistant_final_response(self) -> AsyncIterator[AssistantCompleteResponseData]:
|
|
164
|
+
"""A convenience async generator that yields only the final, complete assistant responses."""
|
|
165
|
+
async for event in self.all_events():
|
|
166
|
+
if event.event_type == StreamEventType.ASSISTANT_COMPLETE_RESPONSE and isinstance(event.data, AssistantCompleteResponseData):
|
|
167
|
+
yield event.data
|
|
168
|
+
|
|
169
|
+
async def stream_tool_logs(self) -> AsyncIterator[ToolInteractionLogEntryData]:
|
|
170
|
+
"""A convenience async generator that yields only tool interaction log entries."""
|
|
171
|
+
async for event in self.all_events():
|
|
172
|
+
if event.event_type == StreamEventType.TOOL_INTERACTION_LOG_ENTRY and isinstance(event.data, ToolInteractionLogEntryData):
|
|
173
|
+
yield event.data
|
|
174
|
+
|
|
175
|
+
async def stream_status_updates(self) -> AsyncIterator[AgentStatusUpdateData]:
|
|
176
|
+
"""A convenience async generator that yields only agent status update data."""
|
|
177
|
+
async for event in self.all_events():
|
|
178
|
+
if event.event_type == StreamEventType.AGENT_STATUS_UPDATED and isinstance(event.data, AgentStatusUpdateData):
|
|
179
|
+
yield event.data
|
|
180
|
+
|
|
181
|
+
async def stream_tool_approval_requests(self) -> AsyncIterator[ToolInvocationApprovalRequestedData]:
|
|
182
|
+
"""A convenience async generator that yields only requests for tool invocation approval."""
|
|
183
|
+
async for event in self.all_events():
|
|
184
|
+
if event.event_type == StreamEventType.TOOL_INVOCATION_APPROVAL_REQUESTED and isinstance(event.data, ToolInvocationApprovalRequestedData):
|
|
185
|
+
yield event.data
|
|
186
|
+
|
|
187
|
+
async def stream_tool_auto_executing(self) -> AsyncIterator[ToolInvocationAutoExecutingData]:
|
|
188
|
+
"""A convenience async generator that yields only events for tools being auto-executed."""
|
|
189
|
+
async for event in self.all_events():
|
|
190
|
+
if event.event_type == StreamEventType.TOOL_INVOCATION_AUTO_EXECUTING and isinstance(event.data, ToolInvocationAutoExecutingData):
|
|
191
|
+
yield event.data
|
|
192
|
+
|
|
193
|
+
async def stream_errors(self) -> AsyncIterator[ErrorEventData]:
|
|
194
|
+
"""A convenience async generator that yields only error events."""
|
|
195
|
+
async for event in self.all_events():
|
|
196
|
+
if event.event_type == StreamEventType.ERROR_EVENT and isinstance(event.data, ErrorEventData):
|
|
197
|
+
yield event.data
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/agent/streaming/queue_streamer.py
|
|
2
|
+
import asyncio
|
|
3
|
+
import logging
|
|
4
|
+
from typing import TypeVar, AsyncIterator, Union, Any
|
|
5
|
+
import queue as standard_queue
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
T = TypeVar('T')
|
|
10
|
+
|
|
11
|
+
async def stream_queue_items(
|
|
12
|
+
queue: standard_queue.Queue[Union[T, object]],
|
|
13
|
+
sentinel: object,
|
|
14
|
+
source_name: str = "unspecified_queue"
|
|
15
|
+
) -> AsyncIterator[T]:
|
|
16
|
+
"""
|
|
17
|
+
Asynchronously iterates over a standard `queue.Queue`, yielding items of type T
|
|
18
|
+
until a specific sentinel object is encountered. This is designed to be used
|
|
19
|
+
from an async context to consume from a queue populated by a synchronous/threaded context.
|
|
20
|
+
|
|
21
|
+
Args:
|
|
22
|
+
queue: The standard `queue.Queue` to stream items from.
|
|
23
|
+
sentinel: The unique object used to signal the end of data in the queue.
|
|
24
|
+
source_name: An optional identifier for the queue source, used in logging.
|
|
25
|
+
|
|
26
|
+
Yields:
|
|
27
|
+
Items of type T from the queue.
|
|
28
|
+
|
|
29
|
+
Raises:
|
|
30
|
+
TypeError: If queue is not a `queue.Queue`.
|
|
31
|
+
ValueError: If sentinel is None.
|
|
32
|
+
asyncio.CancelledError: If the generator is cancelled.
|
|
33
|
+
Exception: Propagates exceptions encountered during queue.get().
|
|
34
|
+
"""
|
|
35
|
+
if not isinstance(queue, standard_queue.Queue):
|
|
36
|
+
raise TypeError(f"queue must be an instance of queue.Queue for source '{source_name}'.")
|
|
37
|
+
if sentinel is None:
|
|
38
|
+
raise ValueError(f"sentinel object cannot be None for source '{source_name}'.")
|
|
39
|
+
|
|
40
|
+
logger.debug(f"Starting to stream items from queue '{source_name}'.")
|
|
41
|
+
try:
|
|
42
|
+
while True:
|
|
43
|
+
try:
|
|
44
|
+
item: Any = queue.get_nowait()
|
|
45
|
+
except standard_queue.Empty:
|
|
46
|
+
await asyncio.sleep(0.01)
|
|
47
|
+
continue
|
|
48
|
+
if item is sentinel:
|
|
49
|
+
logger.debug(f"Sentinel {sentinel!r} received from queue '{source_name}'. Ending stream.")
|
|
50
|
+
break
|
|
51
|
+
yield item # type: ignore
|
|
52
|
+
except asyncio.CancelledError:
|
|
53
|
+
logger.info(f"Stream from queue '{source_name}' was cancelled.")
|
|
54
|
+
raise
|
|
55
|
+
except Exception as e:
|
|
56
|
+
logger.error(f"Error streaming from queue '{source_name}': {e}", exc_info=True)
|
|
57
|
+
raise
|
|
58
|
+
finally:
|
|
59
|
+
logger.debug(f"Exiting stream_queue_items for queue '{source_name}'.")
|
|
@@ -6,9 +6,11 @@ from .base_processor import BaseSystemPromptProcessor
|
|
|
6
6
|
|
|
7
7
|
# Import concrete processors here to make them easily accessible for instantiation
|
|
8
8
|
from .tool_manifest_injector_processor import ToolManifestInjectorProcessor
|
|
9
|
+
from .available_skills_processor import AvailableSkillsProcessor
|
|
9
10
|
|
|
10
11
|
|
|
11
12
|
__all__ = [
|
|
12
13
|
"BaseSystemPromptProcessor",
|
|
13
14
|
"ToolManifestInjectorProcessor",
|
|
15
|
+
"AvailableSkillsProcessor",
|
|
14
16
|
]
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import TYPE_CHECKING, Dict
|
|
3
|
+
from autobyteus.agent.system_prompt_processor.base_processor import BaseSystemPromptProcessor
|
|
4
|
+
from autobyteus.skills.registry import SkillRegistry
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from autobyteus.tools.base_tool import BaseTool
|
|
8
|
+
from autobyteus.agent.context import AgentContext
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
class AvailableSkillsProcessor(BaseSystemPromptProcessor):
|
|
13
|
+
"""
|
|
14
|
+
A system prompt processor that injects information about available skills.
|
|
15
|
+
For preloaded skills (defined in config), it injects the full map.
|
|
16
|
+
For other skills, it injects a summary (awareness).
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
@classmethod
|
|
20
|
+
def get_name(cls) -> str:
|
|
21
|
+
return "AvailableSkillsProcessor"
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def is_mandatory(cls) -> bool:
|
|
25
|
+
return True
|
|
26
|
+
|
|
27
|
+
def process(self,
|
|
28
|
+
system_prompt: str,
|
|
29
|
+
tool_instances: Dict[str, 'BaseTool'],
|
|
30
|
+
agent_id: str,
|
|
31
|
+
context: 'AgentContext') -> str:
|
|
32
|
+
registry = SkillRegistry()
|
|
33
|
+
all_skills = registry.list_skills()
|
|
34
|
+
|
|
35
|
+
if not all_skills:
|
|
36
|
+
logger.info(f"Agent '{agent_id}': No skills found in registry. Skipping injection.")
|
|
37
|
+
return system_prompt
|
|
38
|
+
|
|
39
|
+
# Preloaded skills from config
|
|
40
|
+
preloaded_skills_names = getattr(context.config, 'skills', [])
|
|
41
|
+
|
|
42
|
+
# Build catalog (table of contents) for all skills
|
|
43
|
+
catalog_entries = []
|
|
44
|
+
detailed_sections = []
|
|
45
|
+
|
|
46
|
+
for skill in all_skills:
|
|
47
|
+
# Every skill goes in the catalog
|
|
48
|
+
catalog_entries.append(f"- **{skill.name}**: {skill.description}")
|
|
49
|
+
|
|
50
|
+
# Preloaded skills also get detailed content
|
|
51
|
+
if skill.name in preloaded_skills_names:
|
|
52
|
+
detailed_sections.append(
|
|
53
|
+
f"""#### {skill.name}
|
|
54
|
+
**Root Path:** `{skill.root_path}`
|
|
55
|
+
|
|
56
|
+
{skill.content}""")
|
|
57
|
+
|
|
58
|
+
# Build the skills block
|
|
59
|
+
skills_block = "\n\n## Agent Skills\n"
|
|
60
|
+
|
|
61
|
+
# Catalog section (like table of contents)
|
|
62
|
+
skills_block += "### Skill Catalog\n"
|
|
63
|
+
skills_block += "\n".join(catalog_entries) + "\n"
|
|
64
|
+
skills_block += "\nTo load a skill not shown in detail below, use the `load_skill` tool.\n"
|
|
65
|
+
|
|
66
|
+
# Critical rules section (applies to ALL skills)
|
|
67
|
+
if detailed_sections:
|
|
68
|
+
skills_block += """
|
|
69
|
+
### Critical Rules for Using Skills
|
|
70
|
+
|
|
71
|
+
> **Path Resolution Required for Skill Files**
|
|
72
|
+
>
|
|
73
|
+
> Skill instructions use relative paths (e.g., `./scripts/run.sh` or `scripts/run.sh`) to refer to internal files.
|
|
74
|
+
> However, standard tools resolve relative paths against the User's Workspace, not the skill directory.
|
|
75
|
+
>
|
|
76
|
+
> When using ANY file from a skill, you MUST convert its path to ABSOLUTE:
|
|
77
|
+
> `Root Path` + `Relative Path` = `Absolute Path`
|
|
78
|
+
>
|
|
79
|
+
> **Examples:**
|
|
80
|
+
> 1. Root Path: `/path/to/skill`
|
|
81
|
+
> Relative: `./scripts/run.sh`
|
|
82
|
+
> Result: `/path/to/skill/scripts/run.sh`
|
|
83
|
+
>
|
|
84
|
+
> 2. Root Path: `/path/to/skill`
|
|
85
|
+
> Relative: `scripts/run.sh`
|
|
86
|
+
> Result: `/path/to/skill/scripts/run.sh`
|
|
87
|
+
|
|
88
|
+
"""
|
|
89
|
+
|
|
90
|
+
# Detailed content section (like reading specific chapters)
|
|
91
|
+
if detailed_sections:
|
|
92
|
+
skills_block += "### Skill Details\n"
|
|
93
|
+
skills_block += "\n".join(detailed_sections) + "\n"
|
|
94
|
+
|
|
95
|
+
logger.info(f"Agent '{agent_id}': Injected {len(catalog_entries)} skills in catalog, {len(detailed_sections)} with details.")
|
|
96
|
+
return system_prompt + skills_block
|
|
@@ -61,4 +61,4 @@ class BaseSystemPromptProcessor(ABC, metaclass=SystemPromptProcessorMeta):
|
|
|
61
61
|
raise NotImplementedError("Subclasses must implement the 'process' method.")
|
|
62
62
|
|
|
63
63
|
def __repr__(self) -> str:
|
|
64
|
-
return f"
|
|
64
|
+
return f"<{self.__class__.__name__}>"
|
|
@@ -26,12 +26,25 @@ class SystemPromptProcessorMeta(ABCMeta):
|
|
|
26
26
|
logger.debug(f"Skipping registration for abstract system prompt processor class: {name}")
|
|
27
27
|
return
|
|
28
28
|
|
|
29
|
+
if "get_name" not in dct:
|
|
30
|
+
logger.error(
|
|
31
|
+
f"System prompt processor class {name} is missing required static/class method 'get_name'. Skipping registration."
|
|
32
|
+
)
|
|
33
|
+
return
|
|
34
|
+
|
|
29
35
|
try:
|
|
30
36
|
# Get static/class info from the class being defined
|
|
31
|
-
|
|
37
|
+
try:
|
|
38
|
+
processor_name = cls.get_name()
|
|
39
|
+
except TypeError:
|
|
40
|
+
# Fallback for instance-level get_name overrides
|
|
41
|
+
instance = cls()
|
|
42
|
+
processor_name = instance.get_name()
|
|
32
43
|
|
|
33
44
|
if not processor_name or not isinstance(processor_name, str):
|
|
34
|
-
logger.error(
|
|
45
|
+
logger.error(
|
|
46
|
+
f"System prompt processor class {name} must return a valid string from static get_name(). Skipping registration."
|
|
47
|
+
)
|
|
35
48
|
return
|
|
36
49
|
|
|
37
50
|
# Create definition using name and the class itself
|