autobyteus 1.2.1__py3-none-any.whl → 1.3.0__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- autobyteus/agent/agent.py +15 -5
- autobyteus/agent/bootstrap_steps/__init__.py +3 -3
- autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +5 -59
- autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
- autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
- autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
- autobyteus/agent/bootstrap_steps/working_context_snapshot_restore_step.py +38 -0
- autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
- autobyteus/agent/context/agent_config.py +47 -20
- autobyteus/agent/context/agent_context.py +23 -18
- autobyteus/agent/context/agent_runtime_state.py +21 -19
- autobyteus/agent/events/__init__.py +16 -1
- autobyteus/agent/events/agent_events.py +43 -3
- autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
- autobyteus/agent/events/event_store.py +57 -0
- autobyteus/agent/events/notifiers.py +69 -59
- autobyteus/agent/events/worker_event_dispatcher.py +21 -64
- autobyteus/agent/factory/agent_factory.py +83 -6
- autobyteus/agent/handlers/__init__.py +2 -0
- autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
- autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
- autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
- autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
- autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
- autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
- autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
- autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
- autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
- autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
- autobyteus/agent/input_processor/memory_ingest_input_processor.py +44 -0
- autobyteus/agent/lifecycle/__init__.py +12 -0
- autobyteus/agent/lifecycle/base_processor.py +109 -0
- autobyteus/agent/lifecycle/events.py +35 -0
- autobyteus/agent/lifecycle/processor_definition.py +36 -0
- autobyteus/agent/lifecycle/processor_registry.py +106 -0
- autobyteus/agent/llm_request_assembler.py +98 -0
- autobyteus/agent/llm_response_processor/__init__.py +1 -8
- autobyteus/agent/message/context_file_type.py +1 -1
- autobyteus/agent/runtime/agent_runtime.py +29 -21
- autobyteus/agent/runtime/agent_worker.py +98 -19
- autobyteus/agent/shutdown_steps/__init__.py +2 -0
- autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
- autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
- autobyteus/agent/status/__init__.py +14 -0
- autobyteus/agent/status/manager.py +93 -0
- autobyteus/agent/status/status_deriver.py +96 -0
- autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
- autobyteus/agent/status/status_update_utils.py +73 -0
- autobyteus/agent/streaming/__init__.py +52 -5
- autobyteus/agent/streaming/adapters/__init__.py +18 -0
- autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
- autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
- autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
- autobyteus/agent/streaming/agent_event_stream.py +3 -183
- autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
- autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
- autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
- autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/events/__init__.py +6 -0
- autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
- autobyteus/agent/streaming/events/stream_events.py +141 -0
- autobyteus/agent/streaming/handlers/__init__.py +15 -0
- autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
- autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
- autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
- autobyteus/agent/streaming/parser/__init__.py +61 -0
- autobyteus/agent/streaming/parser/event_emitter.py +181 -0
- autobyteus/agent/streaming/parser/events.py +4 -0
- autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
- autobyteus/agent/streaming/parser/parser_context.py +227 -0
- autobyteus/agent/streaming/parser/parser_factory.py +132 -0
- autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
- autobyteus/agent/streaming/parser/state_factory.py +62 -0
- autobyteus/agent/streaming/parser/states/__init__.py +1 -0
- autobyteus/agent/streaming/parser/states/base_state.py +60 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
- autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
- autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
- autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
- autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
- autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
- autobyteus/agent/streaming/parser/states/text_state.py +78 -0
- autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
- autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
- autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
- autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
- autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
- autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
- autobyteus/agent/streaming/parser/strategies/base.py +24 -0
- autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
- autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
- autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
- autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
- autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
- autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
- autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
- autobyteus/agent/streaming/parser/tool_constants.py +7 -0
- autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
- autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
- autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/queue_streamer.py +3 -57
- autobyteus/agent/streaming/segments/__init__.py +5 -0
- autobyteus/agent/streaming/segments/segment_events.py +82 -0
- autobyteus/agent/streaming/stream_event_payloads.py +2 -223
- autobyteus/agent/streaming/stream_events.py +3 -140
- autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
- autobyteus/agent/streaming/streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/streams/__init__.py +5 -0
- autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
- autobyteus/agent/streaming/utils/__init__.py +5 -0
- autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
- autobyteus/agent/system_prompt_processor/__init__.py +2 -0
- autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
- autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
- autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
- autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
- autobyteus/agent/token_budget.py +56 -0
- autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
- autobyteus/agent/tool_invocation.py +16 -40
- autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
- autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
- autobyteus/agent/utils/wait_for_idle.py +12 -14
- autobyteus/agent/workspace/base_workspace.py +6 -27
- autobyteus/agent_team/agent_team.py +3 -3
- autobyteus/agent_team/agent_team_builder.py +1 -41
- autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
- autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
- autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
- autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +4 -4
- autobyteus/agent_team/context/agent_team_config.py +6 -3
- autobyteus/agent_team/context/agent_team_context.py +25 -3
- autobyteus/agent_team/context/agent_team_runtime_state.py +9 -6
- autobyteus/agent_team/events/__init__.py +11 -0
- autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
- autobyteus/agent_team/events/agent_team_events.py +16 -0
- autobyteus/agent_team/events/event_store.py +57 -0
- autobyteus/agent_team/factory/agent_team_factory.py +8 -0
- autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
- autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
- autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
- autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
- autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
- autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
- autobyteus/agent_team/status/__init__.py +14 -0
- autobyteus/agent_team/status/agent_team_status.py +18 -0
- autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
- autobyteus/agent_team/status/status_deriver.py +62 -0
- autobyteus/agent_team/status/status_update_utils.py +42 -0
- autobyteus/agent_team/streaming/__init__.py +2 -2
- autobyteus/agent_team/streaming/agent_team_event_notifier.py +6 -6
- autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +4 -4
- autobyteus/agent_team/streaming/agent_team_stream_events.py +3 -3
- autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
- autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
- autobyteus/agent_team/task_notification/task_notification_mode.py +19 -0
- autobyteus/agent_team/utils/wait_for_idle.py +4 -4
- autobyteus/cli/agent_cli.py +18 -10
- autobyteus/cli/agent_team_tui/app.py +14 -11
- autobyteus/cli/agent_team_tui/state.py +13 -15
- autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/agent_team_tui/widgets/focus_pane.py +143 -36
- autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
- autobyteus/cli/agent_team_tui/widgets/shared.py +25 -25
- autobyteus/cli/cli_display.py +193 -44
- autobyteus/cli/workflow_tui/app.py +9 -10
- autobyteus/cli/workflow_tui/state.py +14 -16
- autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
- autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
- autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
- autobyteus/clients/autobyteus_client.py +94 -1
- autobyteus/events/event_types.py +11 -18
- autobyteus/llm/api/autobyteus_llm.py +33 -29
- autobyteus/llm/api/claude_llm.py +142 -36
- autobyteus/llm/api/gemini_llm.py +163 -59
- autobyteus/llm/api/grok_llm.py +1 -1
- autobyteus/llm/api/minimax_llm.py +26 -0
- autobyteus/llm/api/mistral_llm.py +113 -87
- autobyteus/llm/api/ollama_llm.py +9 -42
- autobyteus/llm/api/openai_compatible_llm.py +127 -91
- autobyteus/llm/api/openai_llm.py +3 -3
- autobyteus/llm/api/openai_responses_llm.py +324 -0
- autobyteus/llm/api/zhipu_llm.py +21 -2
- autobyteus/llm/autobyteus_provider.py +70 -60
- autobyteus/llm/base_llm.py +85 -81
- autobyteus/llm/converters/__init__.py +14 -0
- autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
- autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
- autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
- autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
- autobyteus/llm/extensions/base_extension.py +6 -12
- autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
- autobyteus/llm/llm_factory.py +282 -204
- autobyteus/llm/lmstudio_provider.py +60 -49
- autobyteus/llm/models.py +35 -2
- autobyteus/llm/ollama_provider.py +60 -49
- autobyteus/llm/ollama_provider_resolver.py +0 -1
- autobyteus/llm/prompt_renderers/__init__.py +19 -0
- autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
- autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
- autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
- autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
- autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
- autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
- autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
- autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
- autobyteus/llm/providers.py +1 -3
- autobyteus/llm/token_counter/claude_token_counter.py +56 -25
- autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
- autobyteus/llm/token_counter/openai_token_counter.py +24 -5
- autobyteus/llm/token_counter/token_counter_factory.py +12 -5
- autobyteus/llm/utils/llm_config.py +6 -12
- autobyteus/llm/utils/media_payload_formatter.py +27 -20
- autobyteus/llm/utils/messages.py +55 -3
- autobyteus/llm/utils/response_types.py +3 -0
- autobyteus/llm/utils/tool_call_delta.py +31 -0
- autobyteus/memory/__init__.py +35 -0
- autobyteus/memory/compaction/__init__.py +9 -0
- autobyteus/memory/compaction/compaction_result.py +8 -0
- autobyteus/memory/compaction/compactor.py +89 -0
- autobyteus/memory/compaction/summarizer.py +11 -0
- autobyteus/memory/compaction_snapshot_builder.py +84 -0
- autobyteus/memory/memory_manager.py +205 -0
- autobyteus/memory/models/__init__.py +14 -0
- autobyteus/memory/models/episodic_item.py +41 -0
- autobyteus/memory/models/memory_types.py +7 -0
- autobyteus/memory/models/raw_trace_item.py +79 -0
- autobyteus/memory/models/semantic_item.py +41 -0
- autobyteus/memory/models/tool_interaction.py +20 -0
- autobyteus/memory/path_resolver.py +27 -0
- autobyteus/memory/policies/__init__.py +5 -0
- autobyteus/memory/policies/compaction_policy.py +16 -0
- autobyteus/memory/restore/__init__.py +1 -0
- autobyteus/memory/restore/working_context_snapshot_bootstrapper.py +61 -0
- autobyteus/memory/retrieval/__init__.py +7 -0
- autobyteus/memory/retrieval/memory_bundle.py +11 -0
- autobyteus/memory/retrieval/retriever.py +13 -0
- autobyteus/memory/store/__init__.py +9 -0
- autobyteus/memory/store/base_store.py +14 -0
- autobyteus/memory/store/file_store.py +98 -0
- autobyteus/memory/store/working_context_snapshot_store.py +28 -0
- autobyteus/memory/tool_interaction_builder.py +46 -0
- autobyteus/memory/turn_tracker.py +9 -0
- autobyteus/memory/working_context_snapshot.py +69 -0
- autobyteus/memory/working_context_snapshot_serializer.py +135 -0
- autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +109 -16
- autobyteus/multimedia/audio/audio_client_factory.py +47 -9
- autobyteus/multimedia/audio/audio_model.py +2 -1
- autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
- autobyteus/multimedia/image/api/gemini_image_client.py +39 -17
- autobyteus/multimedia/image/api/openai_image_client.py +125 -43
- autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
- autobyteus/multimedia/image/image_client_factory.py +47 -15
- autobyteus/multimedia/image/image_model.py +5 -2
- autobyteus/multimedia/providers.py +3 -2
- autobyteus/skills/loader.py +71 -0
- autobyteus/skills/model.py +11 -0
- autobyteus/skills/registry.py +70 -0
- autobyteus/task_management/tools/todo_tools/add_todo.py +2 -2
- autobyteus/task_management/tools/todo_tools/create_todo_list.py +2 -2
- autobyteus/task_management/tools/todo_tools/update_todo_status.py +2 -2
- autobyteus/tools/__init__.py +34 -47
- autobyteus/tools/base_tool.py +7 -0
- autobyteus/tools/file/__init__.py +2 -6
- autobyteus/tools/file/patch_file.py +149 -0
- autobyteus/tools/file/read_file.py +36 -5
- autobyteus/tools/file/write_file.py +4 -1
- autobyteus/tools/functional_tool.py +43 -6
- autobyteus/tools/mcp/__init__.py +2 -0
- autobyteus/tools/mcp/config_service.py +5 -1
- autobyteus/tools/mcp/server/__init__.py +2 -0
- autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
- autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
- autobyteus/tools/mcp/server_instance_manager.py +8 -1
- autobyteus/tools/mcp/types.py +61 -0
- autobyteus/tools/multimedia/audio_tools.py +70 -17
- autobyteus/tools/multimedia/download_media_tool.py +18 -4
- autobyteus/tools/multimedia/image_tools.py +246 -62
- autobyteus/tools/operation_executor/journal_manager.py +107 -0
- autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
- autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
- autobyteus/tools/operation_executor/operation_executor.py +58 -0
- autobyteus/tools/registry/tool_definition.py +43 -2
- autobyteus/tools/skill/load_skill.py +50 -0
- autobyteus/tools/terminal/__init__.py +45 -0
- autobyteus/tools/terminal/ansi_utils.py +32 -0
- autobyteus/tools/terminal/background_process_manager.py +233 -0
- autobyteus/tools/terminal/output_buffer.py +105 -0
- autobyteus/tools/terminal/prompt_detector.py +63 -0
- autobyteus/tools/terminal/pty_session.py +241 -0
- autobyteus/tools/terminal/session_factory.py +20 -0
- autobyteus/tools/terminal/terminal_session_manager.py +226 -0
- autobyteus/tools/terminal/tools/__init__.py +13 -0
- autobyteus/tools/terminal/tools/get_process_output.py +81 -0
- autobyteus/tools/terminal/tools/run_bash.py +109 -0
- autobyteus/tools/terminal/tools/start_background_process.py +104 -0
- autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
- autobyteus/tools/terminal/types.py +54 -0
- autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
- autobyteus/tools/terminal/wsl_utils.py +156 -0
- autobyteus/tools/transaction_management/backup_handler.py +48 -0
- autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
- autobyteus/tools/usage/__init__.py +1 -2
- autobyteus/tools/usage/formatters/__init__.py +17 -1
- autobyteus/tools/usage/formatters/base_formatter.py +8 -0
- autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
- autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
- autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
- autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
- autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
- autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
- autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
- autobyteus/tools/usage/registries/__init__.py +1 -3
- autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
- autobyteus/tools/usage/tool_schema_provider.py +51 -0
- autobyteus/tools/web/__init__.py +4 -0
- autobyteus/tools/web/read_url_tool.py +80 -0
- autobyteus/utils/diff_utils.py +271 -0
- autobyteus/utils/download_utils.py +109 -0
- autobyteus/utils/file_utils.py +57 -2
- autobyteus/utils/gemini_helper.py +64 -0
- autobyteus/utils/gemini_model_mapping.py +71 -0
- autobyteus/utils/llm_output_formatter.py +75 -0
- autobyteus/utils/tool_call_format.py +36 -0
- autobyteus/workflow/agentic_workflow.py +3 -3
- autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +3 -9
- autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
- autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
- autobyteus/workflow/context/workflow_context.py +3 -3
- autobyteus/workflow/context/workflow_runtime_state.py +5 -5
- autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
- autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
- autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
- autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
- autobyteus/workflow/runtime/workflow_runtime.py +8 -8
- autobyteus/workflow/runtime/workflow_worker.py +3 -3
- autobyteus/workflow/status/__init__.py +11 -0
- autobyteus/workflow/status/workflow_status.py +19 -0
- autobyteus/workflow/status/workflow_status_manager.py +48 -0
- autobyteus/workflow/streaming/__init__.py +2 -2
- autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
- autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
- autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
- autobyteus/workflow/utils/wait_for_idle.py +4 -4
- autobyteus-1.3.0.dist-info/METADATA +293 -0
- autobyteus-1.3.0.dist-info/RECORD +606 -0
- {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/top_level.txt +0 -1
- autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
- autobyteus/agent/hooks/__init__.py +0 -16
- autobyteus/agent/hooks/base_phase_hook.py +0 -78
- autobyteus/agent/hooks/hook_definition.py +0 -36
- autobyteus/agent/hooks/hook_meta.py +0 -37
- autobyteus/agent/hooks/hook_registry.py +0 -106
- autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
- autobyteus/agent/phases/__init__.py +0 -18
- autobyteus/agent/phases/discover.py +0 -53
- autobyteus/agent/phases/manager.py +0 -265
- autobyteus/agent/phases/transition_decorator.py +0 -40
- autobyteus/agent/phases/transition_info.py +0 -33
- autobyteus/agent/remote_agent.py +0 -244
- autobyteus/agent/workspace/workspace_definition.py +0 -36
- autobyteus/agent/workspace/workspace_meta.py +0 -37
- autobyteus/agent/workspace/workspace_registry.py +0 -72
- autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
- autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
- autobyteus/agent_team/phases/__init__.py +0 -11
- autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
- autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
- autobyteus/llm/api/bedrock_llm.py +0 -92
- autobyteus/llm/api/groq_llm.py +0 -94
- autobyteus/llm/api/nvidia_llm.py +0 -108
- autobyteus/llm/utils/token_pricing_config.py +0 -87
- autobyteus/rpc/__init__.py +0 -73
- autobyteus/rpc/client/__init__.py +0 -17
- autobyteus/rpc/client/abstract_client_connection.py +0 -124
- autobyteus/rpc/client/client_connection_manager.py +0 -153
- autobyteus/rpc/client/sse_client_connection.py +0 -306
- autobyteus/rpc/client/stdio_client_connection.py +0 -280
- autobyteus/rpc/config/__init__.py +0 -13
- autobyteus/rpc/config/agent_server_config.py +0 -153
- autobyteus/rpc/config/agent_server_registry.py +0 -152
- autobyteus/rpc/hosting.py +0 -244
- autobyteus/rpc/protocol.py +0 -244
- autobyteus/rpc/server/__init__.py +0 -20
- autobyteus/rpc/server/agent_server_endpoint.py +0 -181
- autobyteus/rpc/server/base_method_handler.py +0 -40
- autobyteus/rpc/server/method_handlers.py +0 -259
- autobyteus/rpc/server/sse_server_handler.py +0 -182
- autobyteus/rpc/server/stdio_server_handler.py +0 -151
- autobyteus/rpc/server_main.py +0 -198
- autobyteus/rpc/transport_type.py +0 -13
- autobyteus/tools/bash/__init__.py +0 -2
- autobyteus/tools/bash/bash_executor.py +0 -100
- autobyteus/tools/browser/__init__.py +0 -2
- autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
- autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
- autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
- autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
- autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
- autobyteus/tools/browser/standalone/__init__.py +0 -6
- autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
- autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
- autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/standalone/navigate_to.py +0 -84
- autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -101
- autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -169
- autobyteus/tools/browser/standalone/webpage_reader.py +0 -105
- autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -105
- autobyteus/tools/file/edit_file.py +0 -200
- autobyteus/tools/file/list_directory.py +0 -168
- autobyteus/tools/file/search_files.py +0 -188
- autobyteus/tools/timer.py +0 -175
- autobyteus/tools/usage/parsers/__init__.py +0 -22
- autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
- autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
- autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
- autobyteus/tools/usage/parsers/base_parser.py +0 -41
- autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
- autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
- autobyteus/tools/usage/parsers/exceptions.py +0 -13
- autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
- autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
- autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
- autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
- autobyteus/workflow/phases/__init__.py +0 -11
- autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
- autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
- autobyteus-1.2.1.dist-info/METADATA +0 -205
- autobyteus-1.2.1.dist-info/RECORD +0 -511
- examples/__init__.py +0 -1
- examples/agent_team/__init__.py +0 -1
- examples/discover_phase_transitions.py +0 -104
- examples/run_agentic_software_engineer.py +0 -239
- examples/run_browser_agent.py +0 -262
- examples/run_google_slides_agent.py +0 -287
- examples/run_mcp_browser_client.py +0 -174
- examples/run_mcp_google_slides_client.py +0 -270
- examples/run_mcp_list_tools.py +0 -189
- examples/run_poem_writer.py +0 -284
- examples/run_sqlite_agent.py +0 -295
- /autobyteus/{tools/browser/session_aware → skills}/__init__.py +0 -0
- /autobyteus/tools/{browser/session_aware/factory → skill}/__init__.py +0 -0
- {autobyteus-1.2.1.dist-info → autobyteus-1.3.0.dist-info}/licenses/LICENSE +0 -0
|
@@ -6,16 +6,20 @@ import threading
|
|
|
6
6
|
import concurrent.futures
|
|
7
7
|
from typing import TYPE_CHECKING, Optional, Any, Callable, Awaitable, List
|
|
8
8
|
|
|
9
|
-
from autobyteus.agent.
|
|
9
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
10
10
|
from autobyteus.agent.events import (
|
|
11
11
|
BaseEvent,
|
|
12
12
|
AgentErrorEvent,
|
|
13
13
|
AgentStoppedEvent,
|
|
14
|
+
AgentInputEventQueueManager,
|
|
15
|
+
BootstrapStartedEvent,
|
|
16
|
+
AgentEventStore,
|
|
14
17
|
)
|
|
15
18
|
from autobyteus.agent.events import WorkerEventDispatcher
|
|
16
19
|
from autobyteus.agent.runtime.agent_thread_pool_manager import AgentThreadPoolManager
|
|
17
|
-
from autobyteus.agent.bootstrap_steps.agent_bootstrapper import AgentBootstrapper
|
|
18
20
|
from autobyteus.agent.shutdown_steps import AgentShutdownOrchestrator
|
|
21
|
+
from autobyteus.agent.status.status_deriver import AgentStatusDeriver
|
|
22
|
+
from autobyteus.agent.status.status_update_utils import apply_event_and_derive_status
|
|
19
23
|
|
|
20
24
|
if TYPE_CHECKING:
|
|
21
25
|
from autobyteus.agent.context import AgentContext
|
|
@@ -35,13 +39,12 @@ class AgentWorker:
|
|
|
35
39
|
event_handler_registry: 'EventHandlerRegistry'):
|
|
36
40
|
self.context: 'AgentContext' = context
|
|
37
41
|
|
|
38
|
-
self.
|
|
39
|
-
if not self.
|
|
40
|
-
raise ValueError(f"AgentWorker for '{self.context.agent_id}':
|
|
42
|
+
self.status_manager = self.context.status_manager
|
|
43
|
+
if not self.status_manager: # pragma: no cover
|
|
44
|
+
raise ValueError(f"AgentWorker for '{self.context.agent_id}': AgentStatusManager not found.")
|
|
41
45
|
|
|
42
46
|
self.worker_event_dispatcher = WorkerEventDispatcher(
|
|
43
|
-
event_handler_registry=event_handler_registry
|
|
44
|
-
phase_manager=self.phase_manager
|
|
47
|
+
event_handler_registry=event_handler_registry
|
|
45
48
|
)
|
|
46
49
|
|
|
47
50
|
self._thread_pool_manager = AgentThreadPoolManager()
|
|
@@ -58,16 +61,70 @@ class AgentWorker:
|
|
|
58
61
|
|
|
59
62
|
async def _initialize(self) -> bool:
|
|
60
63
|
"""
|
|
61
|
-
Runs the agent's initialization sequence
|
|
64
|
+
Runs the agent's initialization sequence via bootstrap events.
|
|
62
65
|
Returns True on success, False on failure.
|
|
63
66
|
"""
|
|
64
67
|
agent_id = self.context.agent_id
|
|
65
|
-
logger.info(f"Agent '{agent_id}': Starting internal initialization process using
|
|
68
|
+
logger.info(f"Agent '{agent_id}': Starting internal initialization process using bootstrap events.")
|
|
66
69
|
|
|
67
|
-
|
|
68
|
-
initialization_successful = await bootstrapper.run(self.context, self.phase_manager)
|
|
70
|
+
await self.context.input_event_queues.enqueue_internal_system_event(BootstrapStartedEvent())
|
|
69
71
|
|
|
70
|
-
|
|
72
|
+
while self.context.current_status not in [AgentStatus.IDLE, AgentStatus.ERROR]:
|
|
73
|
+
if self._async_stop_event and self._async_stop_event.is_set():
|
|
74
|
+
break
|
|
75
|
+
try:
|
|
76
|
+
queue_event_tuple = await asyncio.wait_for(
|
|
77
|
+
self.context.state.input_event_queues.get_next_internal_event(), timeout=0.1
|
|
78
|
+
)
|
|
79
|
+
except asyncio.TimeoutError:
|
|
80
|
+
continue
|
|
81
|
+
|
|
82
|
+
if queue_event_tuple is None:
|
|
83
|
+
continue
|
|
84
|
+
|
|
85
|
+
_queue_name, event_obj = queue_event_tuple
|
|
86
|
+
await self.worker_event_dispatcher.dispatch(event_obj, self.context)
|
|
87
|
+
await asyncio.sleep(0)
|
|
88
|
+
|
|
89
|
+
return self.context.current_status == AgentStatus.IDLE
|
|
90
|
+
|
|
91
|
+
async def _runtime_init(self) -> bool:
|
|
92
|
+
"""
|
|
93
|
+
Initializes the minimal runtime prerequisites required for event handling.
|
|
94
|
+
This must run before any event-driven bootstrap steps.
|
|
95
|
+
"""
|
|
96
|
+
agent_id = self.context.agent_id
|
|
97
|
+
if self.context.state.event_store is None:
|
|
98
|
+
self.context.state.event_store = AgentEventStore(agent_id=agent_id)
|
|
99
|
+
logger.info(f"Agent '{agent_id}': Runtime init completed (event store initialized).")
|
|
100
|
+
|
|
101
|
+
if self.context.state.status_deriver is None:
|
|
102
|
+
self.context.state.status_deriver = AgentStatusDeriver()
|
|
103
|
+
logger.info(f"Agent '{agent_id}': Runtime init completed (status deriver initialized).")
|
|
104
|
+
|
|
105
|
+
if self.context.state.input_event_queues is not None:
|
|
106
|
+
logger.debug(f"Agent '{agent_id}': Runtime init skipped; input event queues already initialized.")
|
|
107
|
+
return True
|
|
108
|
+
|
|
109
|
+
try:
|
|
110
|
+
queue_size = getattr(self.context.config, "input_event_queue_size", 0)
|
|
111
|
+
if queue_size is None:
|
|
112
|
+
queue_size = 0
|
|
113
|
+
if queue_size < 0:
|
|
114
|
+
logger.warning(
|
|
115
|
+
f"Agent '{agent_id}': input_event_queue_size must be >= 0. "
|
|
116
|
+
f"Got {queue_size}. Falling back to unbounded queues."
|
|
117
|
+
)
|
|
118
|
+
queue_size = 0
|
|
119
|
+
|
|
120
|
+
self.context.state.input_event_queues = AgentInputEventQueueManager(queue_size=queue_size)
|
|
121
|
+
logger.info(
|
|
122
|
+
f"Agent '{agent_id}': Runtime init completed (input queues initialized, size={queue_size})."
|
|
123
|
+
)
|
|
124
|
+
return True
|
|
125
|
+
except Exception as e:
|
|
126
|
+
logger.critical(f"Agent '{agent_id}': Runtime init failed while initializing input queues: {e}", exc_info=True)
|
|
127
|
+
return False
|
|
71
128
|
|
|
72
129
|
def add_done_callback(self, callback: Callable[[concurrent.futures.Future], None]):
|
|
73
130
|
"""Adds a callback to be executed when the worker's thread completes."""
|
|
@@ -113,12 +170,16 @@ class AgentWorker:
|
|
|
113
170
|
self._worker_loop.run_until_complete(self.async_run())
|
|
114
171
|
except Exception as e:
|
|
115
172
|
logger.error(f"AgentWorker '{agent_id}': Unhandled exception in _run_managed_thread_loop: {e}", exc_info=True)
|
|
116
|
-
if
|
|
173
|
+
if not self.context.current_status.is_terminal():
|
|
117
174
|
try:
|
|
118
|
-
|
|
119
|
-
|
|
175
|
+
self._apply_event_and_derive_status_sync(
|
|
176
|
+
AgentErrorEvent(
|
|
177
|
+
error_message=f"Worker thread fatal error: {e}",
|
|
178
|
+
exception_details=traceback.format_exc()
|
|
179
|
+
)
|
|
180
|
+
)
|
|
120
181
|
except Exception as run_e:
|
|
121
|
-
logger.critical(f"AgentWorker '{agent_id}': Failed to
|
|
182
|
+
logger.critical(f"AgentWorker '{agent_id}': Failed to emit derived error from sync context: {run_e}")
|
|
122
183
|
finally:
|
|
123
184
|
if self._worker_loop:
|
|
124
185
|
try:
|
|
@@ -145,6 +206,13 @@ class AgentWorker:
|
|
|
145
206
|
logger.info(f"AgentWorker '{agent_id}' async_run(): Starting.")
|
|
146
207
|
|
|
147
208
|
# --- Direct Initialization ---
|
|
209
|
+
runtime_init_successful = await self._runtime_init()
|
|
210
|
+
if not runtime_init_successful:
|
|
211
|
+
logger.critical(f"AgentWorker '{agent_id}' failed during runtime init. Worker is shutting down.")
|
|
212
|
+
if self._async_stop_event and not self._async_stop_event.is_set():
|
|
213
|
+
self._async_stop_event.set()
|
|
214
|
+
return
|
|
215
|
+
|
|
148
216
|
initialization_successful = await self._initialize()
|
|
149
217
|
if not initialization_successful:
|
|
150
218
|
logger.critical(f"AgentWorker '{agent_id}' failed to initialize. Worker is shutting down.")
|
|
@@ -156,9 +224,14 @@ class AgentWorker:
|
|
|
156
224
|
logger.info(f"AgentWorker '{agent_id}' initialized successfully. Entering main event loop.")
|
|
157
225
|
while not self._async_stop_event.is_set():
|
|
158
226
|
try:
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
227
|
+
if self.context.current_status == AgentStatus.BOOTSTRAPPING:
|
|
228
|
+
queue_event_tuple = await asyncio.wait_for(
|
|
229
|
+
self.context.state.input_event_queues.get_next_internal_event(), timeout=0.1
|
|
230
|
+
)
|
|
231
|
+
else:
|
|
232
|
+
queue_event_tuple = await asyncio.wait_for(
|
|
233
|
+
self.context.state.input_event_queues.get_next_input_event(), timeout=0.1
|
|
234
|
+
)
|
|
162
235
|
except asyncio.TimeoutError:
|
|
163
236
|
if self._async_stop_event.is_set(): break
|
|
164
237
|
continue
|
|
@@ -229,6 +302,12 @@ class AgentWorker:
|
|
|
229
302
|
|
|
230
303
|
self._is_active = False
|
|
231
304
|
|
|
305
|
+
def _apply_event_and_derive_status_sync(self, event: BaseEvent) -> None:
|
|
306
|
+
try:
|
|
307
|
+
asyncio.run(apply_event_and_derive_status(event, self.context))
|
|
308
|
+
except Exception as e: # pragma: no cover
|
|
309
|
+
logger.error(f"AgentWorker '{self.context.agent_id}': Failed to project status: {e}", exc_info=True)
|
|
310
|
+
|
|
232
311
|
|
|
233
312
|
def is_alive(self) -> bool:
|
|
234
313
|
return self._thread_future is not None and not self._thread_future.done()
|
|
@@ -7,11 +7,13 @@ These steps are orchestrated by the AgentShutdownOrchestrator.
|
|
|
7
7
|
from .base_shutdown_step import BaseShutdownStep
|
|
8
8
|
from .llm_instance_cleanup_step import LLMInstanceCleanupStep
|
|
9
9
|
from .mcp_server_cleanup_step import McpServerCleanupStep
|
|
10
|
+
from .tool_cleanup_step import ToolCleanupStep
|
|
10
11
|
from .agent_shutdown_orchestrator import AgentShutdownOrchestrator
|
|
11
12
|
|
|
12
13
|
__all__ = [
|
|
13
14
|
"BaseShutdownStep",
|
|
14
15
|
"LLMInstanceCleanupStep",
|
|
15
16
|
"McpServerCleanupStep",
|
|
17
|
+
"ToolCleanupStep",
|
|
16
18
|
"AgentShutdownOrchestrator",
|
|
17
19
|
]
|
|
@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING, List, Optional
|
|
|
5
5
|
from .base_shutdown_step import BaseShutdownStep
|
|
6
6
|
from .llm_instance_cleanup_step import LLMInstanceCleanupStep
|
|
7
7
|
from .mcp_server_cleanup_step import McpServerCleanupStep
|
|
8
|
+
from .tool_cleanup_step import ToolCleanupStep
|
|
8
9
|
|
|
9
10
|
if TYPE_CHECKING:
|
|
10
11
|
from autobyteus.agent.context import AgentContext
|
|
@@ -27,6 +28,7 @@ class AgentShutdownOrchestrator:
|
|
|
27
28
|
if steps is None:
|
|
28
29
|
self.shutdown_steps: List[BaseShutdownStep] = [
|
|
29
30
|
LLMInstanceCleanupStep(),
|
|
31
|
+
ToolCleanupStep(),
|
|
30
32
|
McpServerCleanupStep(),
|
|
31
33
|
]
|
|
32
34
|
logger.debug("AgentShutdownOrchestrator initialized with default steps.")
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import asyncio
|
|
2
|
+
import logging
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from .base_shutdown_step import BaseShutdownStep
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from autobyteus.agent.context import AgentContext
|
|
9
|
+
from autobyteus.tools.base_tool import BaseTool
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ToolCleanupStep(BaseShutdownStep):
|
|
15
|
+
"""
|
|
16
|
+
Shutdown step responsible for cleaning up all tool instances retained in the agent context.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
def __init__(self):
|
|
20
|
+
logger.debug("ToolCleanupStep initialized.")
|
|
21
|
+
|
|
22
|
+
async def execute(self, context: 'AgentContext') -> bool:
|
|
23
|
+
agent_id = context.agent_id
|
|
24
|
+
logger.info(f"Agent '{agent_id}': Executing ToolCleanupStep.")
|
|
25
|
+
|
|
26
|
+
tool_instances = context.tool_instances
|
|
27
|
+
if not tool_instances:
|
|
28
|
+
logger.debug(f"Agent '{agent_id}': No tool instances found. Skipping ToolCleanupStep.")
|
|
29
|
+
return True
|
|
30
|
+
|
|
31
|
+
all_cleanups_succeeded = True
|
|
32
|
+
|
|
33
|
+
for tool_name, tool_instance in tool_instances.items():
|
|
34
|
+
try:
|
|
35
|
+
cleanup_func = getattr(tool_instance, "cleanup", None)
|
|
36
|
+
if cleanup_func is None:
|
|
37
|
+
logger.debug(f"Agent '{agent_id}': Tool '{tool_name}' has no cleanup hook. Skipping.")
|
|
38
|
+
continue
|
|
39
|
+
|
|
40
|
+
logger.info(f"Agent '{agent_id}': Cleaning up tool '{tool_name}'.")
|
|
41
|
+
if asyncio.iscoroutinefunction(cleanup_func):
|
|
42
|
+
await cleanup_func()
|
|
43
|
+
else:
|
|
44
|
+
cleanup_func()
|
|
45
|
+
logger.debug(f"Agent '{agent_id}': Tool '{tool_name}' cleanup completed.")
|
|
46
|
+
except Exception as exc: # pragma: no cover - defensive logging
|
|
47
|
+
all_cleanups_succeeded = False
|
|
48
|
+
logger.error(
|
|
49
|
+
f"Agent '{agent_id}': Error during cleanup of tool '{tool_name}': {exc}",
|
|
50
|
+
exc_info=True,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
if all_cleanups_succeeded:
|
|
54
|
+
logger.info(f"Agent '{agent_id}': ToolCleanupStep completed successfully.")
|
|
55
|
+
else:
|
|
56
|
+
logger.warning(f"Agent '{agent_id}': ToolCleanupStep completed with errors; see logs above.")
|
|
57
|
+
|
|
58
|
+
return all_cleanups_succeeded
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/agent/status/__init__.py
|
|
2
|
+
"""
|
|
3
|
+
This package contains components for defining and describing agent operational statuses
|
|
4
|
+
and their updates.
|
|
5
|
+
"""
|
|
6
|
+
from .status_enum import AgentStatus
|
|
7
|
+
from .manager import AgentStatusManager
|
|
8
|
+
from .status_deriver import AgentStatusDeriver
|
|
9
|
+
|
|
10
|
+
__all__ = [
|
|
11
|
+
"AgentStatus",
|
|
12
|
+
"AgentStatusManager",
|
|
13
|
+
"AgentStatusDeriver",
|
|
14
|
+
]
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
|
|
2
|
+
# file: autobyteus/autobyteus/agent/status/manager.py
|
|
3
|
+
import logging
|
|
4
|
+
from typing import TYPE_CHECKING, Optional, Dict, Any, List
|
|
5
|
+
|
|
6
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from autobyteus.agent.context import AgentContext
|
|
10
|
+
from autobyteus.agent.events.notifiers import AgentExternalEventNotifier
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
logger = logging.getLogger(__name__)
|
|
14
|
+
|
|
15
|
+
class AgentStatusManager:
|
|
16
|
+
"""
|
|
17
|
+
Handles lifecycle processor execution and external status notifications.
|
|
18
|
+
Status is derived from events; this manager does not own the source of truth.
|
|
19
|
+
"""
|
|
20
|
+
def __init__(self, context: 'AgentContext', notifier: Optional['AgentExternalEventNotifier'] = None):
|
|
21
|
+
self.context: 'AgentContext' = context
|
|
22
|
+
if notifier is None:
|
|
23
|
+
raise ValueError("AgentStatusManager requires a notifier.")
|
|
24
|
+
self.notifier = notifier
|
|
25
|
+
if not isinstance(self.context.current_status, AgentStatus):
|
|
26
|
+
self.context.current_status = AgentStatus.UNINITIALIZED
|
|
27
|
+
|
|
28
|
+
logger.debug(
|
|
29
|
+
f"AgentStatusManager initialized for agent_id '{self.context.agent_id}'. "
|
|
30
|
+
f"Initial status: {self.context.current_status.value}. Notifier provided: {bool(notifier)}"
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
async def _execute_lifecycle_processors(self, old_status: AgentStatus, new_status: AgentStatus, event_data: Optional[Dict[str, Any]] = None):
|
|
34
|
+
"""
|
|
35
|
+
Execute lifecycle processors for the given status update.
|
|
36
|
+
Maps internal status changes to simple LifecycleEvent values.
|
|
37
|
+
"""
|
|
38
|
+
from autobyteus.agent.lifecycle import LifecycleEvent
|
|
39
|
+
|
|
40
|
+
# Map status changes to lifecycle events
|
|
41
|
+
lifecycle_event = None
|
|
42
|
+
if old_status == AgentStatus.BOOTSTRAPPING and new_status == AgentStatus.IDLE:
|
|
43
|
+
lifecycle_event = LifecycleEvent.AGENT_READY
|
|
44
|
+
elif new_status == AgentStatus.AWAITING_LLM_RESPONSE:
|
|
45
|
+
lifecycle_event = LifecycleEvent.BEFORE_LLM_CALL
|
|
46
|
+
elif old_status == AgentStatus.AWAITING_LLM_RESPONSE and new_status == AgentStatus.ANALYZING_LLM_RESPONSE:
|
|
47
|
+
lifecycle_event = LifecycleEvent.AFTER_LLM_RESPONSE
|
|
48
|
+
elif new_status == AgentStatus.EXECUTING_TOOL:
|
|
49
|
+
lifecycle_event = LifecycleEvent.BEFORE_TOOL_EXECUTE
|
|
50
|
+
elif old_status == AgentStatus.EXECUTING_TOOL:
|
|
51
|
+
lifecycle_event = LifecycleEvent.AFTER_TOOL_EXECUTE
|
|
52
|
+
elif new_status == AgentStatus.SHUTTING_DOWN:
|
|
53
|
+
lifecycle_event = LifecycleEvent.AGENT_SHUTTING_DOWN
|
|
54
|
+
|
|
55
|
+
if lifecycle_event is None:
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
# Find and execute matching processors
|
|
59
|
+
processors_to_run = [
|
|
60
|
+
p for p in self.context.config.lifecycle_processors
|
|
61
|
+
if p.event == lifecycle_event
|
|
62
|
+
]
|
|
63
|
+
|
|
64
|
+
if not processors_to_run:
|
|
65
|
+
return
|
|
66
|
+
|
|
67
|
+
# Sort by order
|
|
68
|
+
sorted_processors = sorted(processors_to_run, key=lambda p: p.get_order())
|
|
69
|
+
processor_names = [p.get_name() for p in sorted_processors]
|
|
70
|
+
logger.info(f"Agent '{self.context.agent_id}': Executing {len(sorted_processors)} lifecycle processors for '{lifecycle_event.value}': {processor_names}")
|
|
71
|
+
|
|
72
|
+
for processor in sorted_processors:
|
|
73
|
+
try:
|
|
74
|
+
await processor.process(self.context, event_data or {})
|
|
75
|
+
logger.debug(f"Agent '{self.context.agent_id}': Lifecycle processor '{processor.get_name()}' executed successfully.")
|
|
76
|
+
except Exception as e:
|
|
77
|
+
logger.error(f"Agent '{self.context.agent_id}': Error executing lifecycle processor "
|
|
78
|
+
f"'{processor.get_name()}' for '{lifecycle_event.value}': {e}",
|
|
79
|
+
exc_info=True)
|
|
80
|
+
|
|
81
|
+
async def emit_status_update(self,
|
|
82
|
+
old_status: AgentStatus,
|
|
83
|
+
new_status: AgentStatus,
|
|
84
|
+
additional_data: Optional[Dict[str, Any]] = None) -> None:
|
|
85
|
+
"""
|
|
86
|
+
Emits notifier events and lifecycle processors for a status update
|
|
87
|
+
derived from the event stream.
|
|
88
|
+
"""
|
|
89
|
+
if old_status == new_status:
|
|
90
|
+
return
|
|
91
|
+
|
|
92
|
+
await self._execute_lifecycle_processors(old_status, new_status, additional_data)
|
|
93
|
+
self.notifier.notify_status_updated(new_status, old_status, additional_data)
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/agent/status/status_deriver.py
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Optional, Tuple, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
6
|
+
from autobyteus.agent.events.agent_events import (
|
|
7
|
+
AgentReadyEvent,
|
|
8
|
+
AgentStoppedEvent,
|
|
9
|
+
AgentErrorEvent,
|
|
10
|
+
AgentIdleEvent,
|
|
11
|
+
ShutdownRequestedEvent,
|
|
12
|
+
BootstrapStartedEvent,
|
|
13
|
+
BootstrapCompletedEvent,
|
|
14
|
+
UserMessageReceivedEvent,
|
|
15
|
+
InterAgentMessageReceivedEvent,
|
|
16
|
+
LLMUserMessageReadyEvent,
|
|
17
|
+
LLMCompleteResponseReceivedEvent,
|
|
18
|
+
PendingToolInvocationEvent,
|
|
19
|
+
ToolExecutionApprovalEvent,
|
|
20
|
+
ApprovedToolInvocationEvent,
|
|
21
|
+
ToolResultEvent,
|
|
22
|
+
)
|
|
23
|
+
|
|
24
|
+
if TYPE_CHECKING:
|
|
25
|
+
from autobyteus.agent.context import AgentContext
|
|
26
|
+
from autobyteus.agent.events.agent_events import BaseEvent
|
|
27
|
+
|
|
28
|
+
logger = logging.getLogger(__name__)
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
class AgentStatusDeriver:
|
|
32
|
+
"""
|
|
33
|
+
Derives agent status from an event stream.
|
|
34
|
+
This is a pure read-model: no side effects beyond status updates.
|
|
35
|
+
"""
|
|
36
|
+
def __init__(self, initial_status: AgentStatus = AgentStatus.UNINITIALIZED):
|
|
37
|
+
self._current_status = initial_status
|
|
38
|
+
logger.debug(f"AgentStatusDeriver initialized with status '{initial_status.value}'.")
|
|
39
|
+
|
|
40
|
+
@property
|
|
41
|
+
def current_status(self) -> AgentStatus:
|
|
42
|
+
return self._current_status
|
|
43
|
+
|
|
44
|
+
def apply(self, event: 'BaseEvent', context: Optional['AgentContext'] = None) -> Tuple[AgentStatus, AgentStatus]:
|
|
45
|
+
old_status = self._current_status
|
|
46
|
+
new_status = self._reduce(event, old_status, context)
|
|
47
|
+
self._current_status = new_status
|
|
48
|
+
return old_status, new_status
|
|
49
|
+
|
|
50
|
+
def _reduce(self, event: 'BaseEvent', current_status: AgentStatus, context: Optional['AgentContext']) -> AgentStatus:
|
|
51
|
+
if isinstance(event, BootstrapStartedEvent):
|
|
52
|
+
return AgentStatus.BOOTSTRAPPING
|
|
53
|
+
if isinstance(event, BootstrapCompletedEvent):
|
|
54
|
+
return current_status
|
|
55
|
+
if isinstance(event, AgentReadyEvent):
|
|
56
|
+
return AgentStatus.IDLE
|
|
57
|
+
if isinstance(event, AgentIdleEvent):
|
|
58
|
+
return AgentStatus.IDLE
|
|
59
|
+
if isinstance(event, ShutdownRequestedEvent):
|
|
60
|
+
if current_status == AgentStatus.ERROR:
|
|
61
|
+
return current_status
|
|
62
|
+
return AgentStatus.SHUTTING_DOWN
|
|
63
|
+
if isinstance(event, AgentStoppedEvent):
|
|
64
|
+
if current_status == AgentStatus.ERROR:
|
|
65
|
+
return AgentStatus.ERROR
|
|
66
|
+
return AgentStatus.SHUTDOWN_COMPLETE
|
|
67
|
+
if isinstance(event, AgentErrorEvent):
|
|
68
|
+
return AgentStatus.ERROR
|
|
69
|
+
|
|
70
|
+
if isinstance(event, (UserMessageReceivedEvent, InterAgentMessageReceivedEvent)):
|
|
71
|
+
return AgentStatus.PROCESSING_USER_INPUT
|
|
72
|
+
if isinstance(event, LLMUserMessageReadyEvent):
|
|
73
|
+
if current_status in [AgentStatus.AWAITING_LLM_RESPONSE, AgentStatus.ERROR]:
|
|
74
|
+
return current_status
|
|
75
|
+
return AgentStatus.AWAITING_LLM_RESPONSE
|
|
76
|
+
if isinstance(event, LLMCompleteResponseReceivedEvent):
|
|
77
|
+
if current_status != AgentStatus.AWAITING_LLM_RESPONSE:
|
|
78
|
+
return current_status
|
|
79
|
+
return AgentStatus.ANALYZING_LLM_RESPONSE
|
|
80
|
+
|
|
81
|
+
if isinstance(event, PendingToolInvocationEvent):
|
|
82
|
+
if context and not context.auto_execute_tools:
|
|
83
|
+
return AgentStatus.AWAITING_TOOL_APPROVAL
|
|
84
|
+
return AgentStatus.EXECUTING_TOOL
|
|
85
|
+
if isinstance(event, ApprovedToolInvocationEvent):
|
|
86
|
+
return AgentStatus.EXECUTING_TOOL
|
|
87
|
+
if isinstance(event, ToolExecutionApprovalEvent):
|
|
88
|
+
if event.is_approved:
|
|
89
|
+
return AgentStatus.EXECUTING_TOOL
|
|
90
|
+
return AgentStatus.TOOL_DENIED
|
|
91
|
+
if isinstance(event, ToolResultEvent):
|
|
92
|
+
if current_status != AgentStatus.EXECUTING_TOOL:
|
|
93
|
+
return current_status
|
|
94
|
+
return AgentStatus.PROCESSING_TOOL_RESULT
|
|
95
|
+
|
|
96
|
+
return current_status
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/agent/
|
|
1
|
+
# file: autobyteus/autobyteus/agent/status/status_enum.py
|
|
2
2
|
from enum import Enum
|
|
3
3
|
|
|
4
|
-
class
|
|
4
|
+
class AgentStatus(str, Enum):
|
|
5
5
|
"""
|
|
6
|
-
Defines the
|
|
7
|
-
|
|
6
|
+
Defines the possible operational statuses of an agent.
|
|
7
|
+
Renamed from the legacy operational state enum.
|
|
8
8
|
"""
|
|
9
9
|
UNINITIALIZED = "uninitialized" # Agent object created, but runtime not started or fully set up.
|
|
10
10
|
BOOTSTRAPPING = "bootstrapping" # Agent is running its internal initialization/bootstrap sequence.
|
|
@@ -27,23 +27,23 @@ class AgentOperationalPhase(str, Enum):
|
|
|
27
27
|
return self.value
|
|
28
28
|
|
|
29
29
|
def is_initializing(self) -> bool:
|
|
30
|
-
"""Checks if the agent is in any of the initializing
|
|
30
|
+
"""Checks if the agent is in any of the initializing statuses."""
|
|
31
31
|
return self in [
|
|
32
|
-
|
|
32
|
+
AgentStatus.BOOTSTRAPPING,
|
|
33
33
|
]
|
|
34
34
|
|
|
35
35
|
def is_processing(self) -> bool:
|
|
36
|
-
"""Checks if the agent is in any active processing
|
|
36
|
+
"""Checks if the agent is in any active processing status (post-initialization, pre-shutdown)."""
|
|
37
37
|
return self in [
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
38
|
+
AgentStatus.PROCESSING_USER_INPUT,
|
|
39
|
+
AgentStatus.AWAITING_LLM_RESPONSE,
|
|
40
|
+
AgentStatus.ANALYZING_LLM_RESPONSE,
|
|
41
|
+
AgentStatus.AWAITING_TOOL_APPROVAL,
|
|
42
|
+
AgentStatus.TOOL_DENIED,
|
|
43
|
+
AgentStatus.EXECUTING_TOOL,
|
|
44
|
+
AgentStatus.PROCESSING_TOOL_RESULT,
|
|
45
45
|
]
|
|
46
46
|
|
|
47
47
|
def is_terminal(self) -> bool:
|
|
48
|
-
"""Checks if the
|
|
49
|
-
return self in [
|
|
48
|
+
"""Checks if the status is a terminal state (shutdown or error)."""
|
|
49
|
+
return self in [AgentStatus.SHUTDOWN_COMPLETE, AgentStatus.ERROR]
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/agent/status/status_update_utils.py
|
|
2
|
+
import logging
|
|
3
|
+
from typing import Optional, Tuple, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
6
|
+
from autobyteus.agent.events.agent_events import (
|
|
7
|
+
AgentErrorEvent,
|
|
8
|
+
PendingToolInvocationEvent,
|
|
9
|
+
ApprovedToolInvocationEvent,
|
|
10
|
+
ToolExecutionApprovalEvent,
|
|
11
|
+
ToolResultEvent,
|
|
12
|
+
)
|
|
13
|
+
|
|
14
|
+
if TYPE_CHECKING:
|
|
15
|
+
from autobyteus.agent.context import AgentContext
|
|
16
|
+
from autobyteus.agent.events.agent_events import BaseEvent
|
|
17
|
+
|
|
18
|
+
logger = logging.getLogger(__name__)
|
|
19
|
+
|
|
20
|
+
|
|
21
|
+
def build_status_update_data(event: 'BaseEvent',
|
|
22
|
+
context: 'AgentContext',
|
|
23
|
+
new_status: AgentStatus) -> Optional[dict]:
|
|
24
|
+
if new_status == AgentStatus.PROCESSING_USER_INPUT:
|
|
25
|
+
return {"trigger": type(event).__name__}
|
|
26
|
+
|
|
27
|
+
if new_status == AgentStatus.EXECUTING_TOOL:
|
|
28
|
+
tool_name = None
|
|
29
|
+
if isinstance(event, PendingToolInvocationEvent):
|
|
30
|
+
tool_name = event.tool_invocation.name
|
|
31
|
+
elif isinstance(event, ApprovedToolInvocationEvent):
|
|
32
|
+
tool_name = event.tool_invocation.name
|
|
33
|
+
elif isinstance(event, ToolExecutionApprovalEvent):
|
|
34
|
+
pending_invocation = context.state.pending_tool_approvals.get(event.tool_invocation_id)
|
|
35
|
+
tool_name = pending_invocation.name if pending_invocation else "unknown_tool"
|
|
36
|
+
if tool_name:
|
|
37
|
+
return {"tool_name": tool_name}
|
|
38
|
+
|
|
39
|
+
if new_status == AgentStatus.PROCESSING_TOOL_RESULT and isinstance(event, ToolResultEvent):
|
|
40
|
+
return {"tool_name": event.tool_name}
|
|
41
|
+
|
|
42
|
+
if new_status == AgentStatus.TOOL_DENIED and isinstance(event, ToolExecutionApprovalEvent):
|
|
43
|
+
pending_invocation = context.state.pending_tool_approvals.get(event.tool_invocation_id)
|
|
44
|
+
tool_name = pending_invocation.name if pending_invocation else "unknown_tool"
|
|
45
|
+
return {"tool_name": tool_name, "denial_for_tool": tool_name}
|
|
46
|
+
|
|
47
|
+
if new_status == AgentStatus.ERROR and isinstance(event, AgentErrorEvent):
|
|
48
|
+
return {"error_message": event.error_message, "error_details": event.exception_details}
|
|
49
|
+
|
|
50
|
+
return None
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
async def apply_event_and_derive_status(event: 'BaseEvent',
|
|
54
|
+
context: 'AgentContext') -> Tuple[AgentStatus, AgentStatus]:
|
|
55
|
+
if context.state.event_store:
|
|
56
|
+
try:
|
|
57
|
+
context.state.event_store.append(event)
|
|
58
|
+
except Exception as exc: # pragma: no cover
|
|
59
|
+
logger.error(f"Failed to append event to store: {exc}", exc_info=True)
|
|
60
|
+
|
|
61
|
+
if not context.state.status_deriver:
|
|
62
|
+
return context.current_status, context.current_status
|
|
63
|
+
|
|
64
|
+
old_status, new_status = context.state.status_deriver.apply(event, context)
|
|
65
|
+
if old_status != new_status:
|
|
66
|
+
context.current_status = new_status
|
|
67
|
+
additional_data = build_status_update_data(event, context, new_status)
|
|
68
|
+
if context.status_manager:
|
|
69
|
+
await context.status_manager.emit_status_update(
|
|
70
|
+
old_status, new_status, additional_data=additional_data
|
|
71
|
+
)
|
|
72
|
+
|
|
73
|
+
return old_status, new_status
|
|
@@ -1,15 +1,62 @@
|
|
|
1
1
|
# file: autobyteus/autobyteus/agent/streaming/__init__.py
|
|
2
2
|
"""
|
|
3
|
-
Components related to agent output streaming
|
|
3
|
+
Components related to agent output streaming.
|
|
4
|
+
|
|
5
|
+
Main components:
|
|
6
|
+
- StreamingResponseHandler: High-level handler for LLM response parsing
|
|
7
|
+
- StreamingParser: Low-level character-by-character parser
|
|
8
|
+
- SegmentEvent: Structured events for UI streaming
|
|
9
|
+
|
|
10
|
+
Legacy components (for backward compatibility):
|
|
11
|
+
- StreamEvent, StreamEventType: Old event format
|
|
12
|
+
- AgentEventStream: Old stream consumer
|
|
4
13
|
"""
|
|
5
|
-
from .stream_events import StreamEventType, StreamEvent
|
|
6
|
-
from .agent_event_stream import AgentEventStream
|
|
7
|
-
from .queue_streamer import stream_queue_items
|
|
14
|
+
from .events.stream_events import StreamEventType, StreamEvent
|
|
15
|
+
from .streams.agent_event_stream import AgentEventStream
|
|
16
|
+
from .utils.queue_streamer import stream_queue_items
|
|
17
|
+
from .handlers.streaming_response_handler import StreamingResponseHandler
|
|
18
|
+
from .handlers.streaming_handler_factory import StreamingResponseHandlerFactory
|
|
19
|
+
from .handlers.parsing_streaming_response_handler import ParsingStreamingResponseHandler
|
|
20
|
+
from .handlers.pass_through_streaming_response_handler import PassThroughStreamingResponseHandler
|
|
21
|
+
from .handlers.api_tool_call_streaming_response_handler import ApiToolCallStreamingResponseHandler
|
|
22
|
+
|
|
23
|
+
# Re-export commonly used parser components
|
|
24
|
+
from .parser import (
|
|
25
|
+
StreamingParser,
|
|
26
|
+
SegmentEvent,
|
|
27
|
+
SegmentType,
|
|
28
|
+
SegmentEventType,
|
|
29
|
+
ToolInvocationAdapter,
|
|
30
|
+
ParserConfig,
|
|
31
|
+
parse_complete_response,
|
|
32
|
+
extract_segments,
|
|
33
|
+
StreamingParserProtocol,
|
|
34
|
+
create_streaming_parser,
|
|
35
|
+
resolve_parser_name,
|
|
36
|
+
)
|
|
8
37
|
|
|
9
38
|
__all__ = [
|
|
39
|
+
# New streaming API
|
|
40
|
+
"StreamingResponseHandler",
|
|
41
|
+
"StreamingResponseHandlerFactory",
|
|
42
|
+
"ParsingStreamingResponseHandler",
|
|
43
|
+
"PassThroughStreamingResponseHandler",
|
|
44
|
+
"ApiToolCallStreamingResponseHandler",
|
|
45
|
+
"StreamingParser",
|
|
46
|
+
"SegmentEvent",
|
|
47
|
+
"SegmentType",
|
|
48
|
+
"SegmentEventType",
|
|
49
|
+
"ToolInvocationAdapter",
|
|
50
|
+
"ParserConfig",
|
|
51
|
+
"parse_complete_response",
|
|
52
|
+
"extract_segments",
|
|
53
|
+
"StreamingParserProtocol",
|
|
54
|
+
"create_streaming_parser",
|
|
55
|
+
"resolve_parser_name",
|
|
56
|
+
|
|
57
|
+
# Legacy (backward compatible)
|
|
10
58
|
"StreamEventType",
|
|
11
59
|
"StreamEvent",
|
|
12
60
|
"AgentEventStream",
|
|
13
61
|
"stream_queue_items",
|
|
14
62
|
]
|
|
15
|
-
|