autobyteus 1.2.0__py3-none-any.whl → 1.2.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- autobyteus/agent/agent.py +15 -5
- autobyteus/agent/bootstrap_steps/__init__.py +1 -3
- autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
- autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
- autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
- autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
- autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
- autobyteus/agent/context/agent_config.py +43 -20
- autobyteus/agent/context/agent_context.py +23 -18
- autobyteus/agent/context/agent_runtime_state.py +23 -19
- autobyteus/agent/events/__init__.py +16 -1
- autobyteus/agent/events/agent_events.py +43 -3
- autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
- autobyteus/agent/events/event_store.py +57 -0
- autobyteus/agent/events/notifiers.py +74 -60
- autobyteus/agent/events/worker_event_dispatcher.py +21 -64
- autobyteus/agent/factory/agent_factory.py +52 -0
- autobyteus/agent/handlers/__init__.py +2 -0
- autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
- autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
- autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
- autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
- autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
- autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
- autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
- autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
- autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
- autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
- autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
- autobyteus/agent/lifecycle/__init__.py +12 -0
- autobyteus/agent/lifecycle/base_processor.py +109 -0
- autobyteus/agent/lifecycle/events.py +35 -0
- autobyteus/agent/lifecycle/processor_definition.py +36 -0
- autobyteus/agent/lifecycle/processor_registry.py +106 -0
- autobyteus/agent/llm_request_assembler.py +98 -0
- autobyteus/agent/llm_response_processor/__init__.py +1 -8
- autobyteus/agent/message/context_file_type.py +1 -1
- autobyteus/agent/message/send_message_to.py +5 -4
- autobyteus/agent/runtime/agent_runtime.py +29 -21
- autobyteus/agent/runtime/agent_worker.py +98 -19
- autobyteus/agent/shutdown_steps/__init__.py +2 -0
- autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
- autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
- autobyteus/agent/status/__init__.py +14 -0
- autobyteus/agent/status/manager.py +93 -0
- autobyteus/agent/status/status_deriver.py +96 -0
- autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
- autobyteus/agent/status/status_update_utils.py +73 -0
- autobyteus/agent/streaming/__init__.py +52 -5
- autobyteus/agent/streaming/adapters/__init__.py +18 -0
- autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
- autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
- autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
- autobyteus/agent/streaming/agent_event_stream.py +3 -178
- autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
- autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
- autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
- autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/events/__init__.py +6 -0
- autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
- autobyteus/agent/streaming/events/stream_events.py +141 -0
- autobyteus/agent/streaming/handlers/__init__.py +15 -0
- autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
- autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
- autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
- autobyteus/agent/streaming/parser/__init__.py +61 -0
- autobyteus/agent/streaming/parser/event_emitter.py +181 -0
- autobyteus/agent/streaming/parser/events.py +4 -0
- autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
- autobyteus/agent/streaming/parser/parser_context.py +227 -0
- autobyteus/agent/streaming/parser/parser_factory.py +132 -0
- autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
- autobyteus/agent/streaming/parser/state_factory.py +62 -0
- autobyteus/agent/streaming/parser/states/__init__.py +1 -0
- autobyteus/agent/streaming/parser/states/base_state.py +60 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
- autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
- autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
- autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
- autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
- autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
- autobyteus/agent/streaming/parser/states/text_state.py +78 -0
- autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
- autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
- autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
- autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
- autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
- autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
- autobyteus/agent/streaming/parser/strategies/base.py +24 -0
- autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
- autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
- autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
- autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
- autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
- autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
- autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
- autobyteus/agent/streaming/parser/tool_constants.py +7 -0
- autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
- autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
- autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/queue_streamer.py +3 -57
- autobyteus/agent/streaming/segments/__init__.py +5 -0
- autobyteus/agent/streaming/segments/segment_events.py +81 -0
- autobyteus/agent/streaming/stream_event_payloads.py +2 -198
- autobyteus/agent/streaming/stream_events.py +3 -128
- autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
- autobyteus/agent/streaming/streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/streams/__init__.py +5 -0
- autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
- autobyteus/agent/streaming/utils/__init__.py +5 -0
- autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
- autobyteus/agent/system_prompt_processor/__init__.py +2 -0
- autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
- autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
- autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
- autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
- autobyteus/agent/token_budget.py +56 -0
- autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
- autobyteus/agent/tool_invocation.py +16 -40
- autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
- autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
- autobyteus/agent/utils/wait_for_idle.py +12 -14
- autobyteus/agent/workspace/base_workspace.py +6 -27
- autobyteus/agent_team/agent_team.py +3 -3
- autobyteus/agent_team/agent_team_builder.py +1 -41
- autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
- autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
- autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
- autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
- autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
- autobyteus/agent_team/context/agent_team_config.py +6 -3
- autobyteus/agent_team/context/agent_team_context.py +25 -3
- autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
- autobyteus/agent_team/events/__init__.py +11 -0
- autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
- autobyteus/agent_team/events/agent_team_events.py +16 -0
- autobyteus/agent_team/events/event_store.py +57 -0
- autobyteus/agent_team/factory/agent_team_factory.py +8 -0
- autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
- autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
- autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
- autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
- autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
- autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
- autobyteus/agent_team/status/__init__.py +14 -0
- autobyteus/agent_team/status/agent_team_status.py +18 -0
- autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
- autobyteus/agent_team/status/status_deriver.py +62 -0
- autobyteus/agent_team/status/status_update_utils.py +42 -0
- autobyteus/agent_team/streaming/__init__.py +2 -2
- autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
- autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
- autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
- autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
- autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
- autobyteus/agent_team/task_notification/activation_policy.py +1 -1
- autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
- autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
- autobyteus/agent_team/utils/wait_for_idle.py +4 -4
- autobyteus/cli/agent_cli.py +18 -10
- autobyteus/cli/agent_team_tui/app.py +18 -15
- autobyteus/cli/agent_team_tui/state.py +21 -23
- autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
- autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
- autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
- autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
- autobyteus/cli/cli_display.py +193 -44
- autobyteus/cli/workflow_tui/app.py +9 -10
- autobyteus/cli/workflow_tui/state.py +14 -16
- autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
- autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
- autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
- autobyteus/clients/autobyteus_client.py +94 -1
- autobyteus/events/event_types.py +15 -21
- autobyteus/llm/api/autobyteus_llm.py +33 -29
- autobyteus/llm/api/claude_llm.py +142 -36
- autobyteus/llm/api/gemini_llm.py +163 -59
- autobyteus/llm/api/grok_llm.py +1 -1
- autobyteus/llm/api/minimax_llm.py +26 -0
- autobyteus/llm/api/mistral_llm.py +113 -87
- autobyteus/llm/api/ollama_llm.py +9 -42
- autobyteus/llm/api/openai_compatible_llm.py +127 -91
- autobyteus/llm/api/openai_llm.py +3 -3
- autobyteus/llm/api/openai_responses_llm.py +324 -0
- autobyteus/llm/api/zhipu_llm.py +21 -2
- autobyteus/llm/autobyteus_provider.py +70 -60
- autobyteus/llm/base_llm.py +85 -81
- autobyteus/llm/converters/__init__.py +14 -0
- autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
- autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
- autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
- autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
- autobyteus/llm/extensions/base_extension.py +6 -12
- autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
- autobyteus/llm/llm_factory.py +282 -204
- autobyteus/llm/lmstudio_provider.py +60 -49
- autobyteus/llm/models.py +35 -2
- autobyteus/llm/ollama_provider.py +60 -49
- autobyteus/llm/ollama_provider_resolver.py +0 -1
- autobyteus/llm/prompt_renderers/__init__.py +19 -0
- autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
- autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
- autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
- autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
- autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
- autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
- autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
- autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
- autobyteus/llm/providers.py +1 -3
- autobyteus/llm/token_counter/claude_token_counter.py +56 -25
- autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
- autobyteus/llm/token_counter/openai_token_counter.py +24 -5
- autobyteus/llm/token_counter/token_counter_factory.py +12 -5
- autobyteus/llm/utils/llm_config.py +6 -12
- autobyteus/llm/utils/media_payload_formatter.py +27 -20
- autobyteus/llm/utils/messages.py +55 -3
- autobyteus/llm/utils/response_types.py +3 -0
- autobyteus/llm/utils/tool_call_delta.py +31 -0
- autobyteus/memory/__init__.py +32 -0
- autobyteus/memory/active_transcript.py +69 -0
- autobyteus/memory/compaction/__init__.py +9 -0
- autobyteus/memory/compaction/compaction_result.py +8 -0
- autobyteus/memory/compaction/compactor.py +89 -0
- autobyteus/memory/compaction/summarizer.py +11 -0
- autobyteus/memory/compaction_snapshot_builder.py +84 -0
- autobyteus/memory/memory_manager.py +183 -0
- autobyteus/memory/models/__init__.py +14 -0
- autobyteus/memory/models/episodic_item.py +41 -0
- autobyteus/memory/models/memory_types.py +7 -0
- autobyteus/memory/models/raw_trace_item.py +79 -0
- autobyteus/memory/models/semantic_item.py +41 -0
- autobyteus/memory/models/tool_interaction.py +20 -0
- autobyteus/memory/policies/__init__.py +5 -0
- autobyteus/memory/policies/compaction_policy.py +16 -0
- autobyteus/memory/retrieval/__init__.py +7 -0
- autobyteus/memory/retrieval/memory_bundle.py +11 -0
- autobyteus/memory/retrieval/retriever.py +13 -0
- autobyteus/memory/store/__init__.py +7 -0
- autobyteus/memory/store/base_store.py +14 -0
- autobyteus/memory/store/file_store.py +98 -0
- autobyteus/memory/tool_interaction_builder.py +46 -0
- autobyteus/memory/turn_tracker.py +9 -0
- autobyteus/multimedia/audio/api/__init__.py +3 -2
- autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
- autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
- autobyteus/multimedia/audio/audio_client_factory.py +84 -9
- autobyteus/multimedia/audio/audio_model.py +2 -1
- autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
- autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
- autobyteus/multimedia/image/api/openai_image_client.py +125 -43
- autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
- autobyteus/multimedia/image/image_client_factory.py +47 -15
- autobyteus/multimedia/image/image_model.py +5 -2
- autobyteus/multimedia/providers.py +3 -2
- autobyteus/skills/loader.py +71 -0
- autobyteus/skills/model.py +11 -0
- autobyteus/skills/registry.py +70 -0
- autobyteus/task_management/__init__.py +43 -20
- autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
- autobyteus/task_management/converters/__init__.py +2 -2
- autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
- autobyteus/task_management/events.py +7 -7
- autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
- autobyteus/task_management/schemas/__init__.py +3 -0
- autobyteus/task_management/schemas/task_status_report.py +2 -2
- autobyteus/task_management/schemas/todo_definition.py +15 -0
- autobyteus/task_management/todo.py +29 -0
- autobyteus/task_management/todo_list.py +75 -0
- autobyteus/task_management/tools/__init__.py +24 -8
- autobyteus/task_management/tools/task_tools/__init__.py +19 -0
- autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
- autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
- autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
- autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
- autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
- autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
- autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
- autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
- autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
- autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
- autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
- autobyteus/tools/__init__.py +43 -52
- autobyteus/tools/base_tool.py +7 -0
- autobyteus/tools/file/__init__.py +9 -0
- autobyteus/tools/file/patch_file.py +149 -0
- autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
- autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
- autobyteus/tools/functional_tool.py +53 -14
- autobyteus/tools/mcp/__init__.py +2 -0
- autobyteus/tools/mcp/config_service.py +5 -1
- autobyteus/tools/mcp/server/__init__.py +2 -0
- autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
- autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
- autobyteus/tools/mcp/server_instance_manager.py +8 -1
- autobyteus/tools/mcp/tool.py +3 -3
- autobyteus/tools/mcp/tool_registrar.py +5 -2
- autobyteus/tools/mcp/types.py +61 -0
- autobyteus/tools/multimedia/__init__.py +2 -1
- autobyteus/tools/multimedia/audio_tools.py +72 -19
- autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
- autobyteus/tools/multimedia/image_tools.py +248 -64
- autobyteus/tools/multimedia/media_reader_tool.py +1 -1
- autobyteus/tools/operation_executor/journal_manager.py +107 -0
- autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
- autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
- autobyteus/tools/operation_executor/operation_executor.py +58 -0
- autobyteus/tools/registry/tool_definition.py +108 -14
- autobyteus/tools/registry/tool_registry.py +29 -0
- autobyteus/tools/search/__init__.py +17 -0
- autobyteus/tools/search/base_strategy.py +35 -0
- autobyteus/tools/search/client.py +24 -0
- autobyteus/tools/search/factory.py +81 -0
- autobyteus/tools/search/google_cse_strategy.py +68 -0
- autobyteus/tools/search/providers.py +10 -0
- autobyteus/tools/search/serpapi_strategy.py +65 -0
- autobyteus/tools/search/serper_strategy.py +87 -0
- autobyteus/tools/search_tool.py +83 -0
- autobyteus/tools/skill/load_skill.py +50 -0
- autobyteus/tools/terminal/__init__.py +45 -0
- autobyteus/tools/terminal/ansi_utils.py +32 -0
- autobyteus/tools/terminal/background_process_manager.py +233 -0
- autobyteus/tools/terminal/output_buffer.py +105 -0
- autobyteus/tools/terminal/prompt_detector.py +63 -0
- autobyteus/tools/terminal/pty_session.py +241 -0
- autobyteus/tools/terminal/session_factory.py +20 -0
- autobyteus/tools/terminal/terminal_session_manager.py +226 -0
- autobyteus/tools/terminal/tools/__init__.py +13 -0
- autobyteus/tools/terminal/tools/get_process_output.py +81 -0
- autobyteus/tools/terminal/tools/run_bash.py +109 -0
- autobyteus/tools/terminal/tools/start_background_process.py +104 -0
- autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
- autobyteus/tools/terminal/types.py +54 -0
- autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
- autobyteus/tools/terminal/wsl_utils.py +156 -0
- autobyteus/tools/tool_meta.py +4 -24
- autobyteus/tools/transaction_management/backup_handler.py +48 -0
- autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
- autobyteus/tools/usage/__init__.py +1 -2
- autobyteus/tools/usage/formatters/__init__.py +17 -1
- autobyteus/tools/usage/formatters/base_formatter.py +8 -0
- autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
- autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
- autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
- autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
- autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
- autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
- autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
- autobyteus/tools/usage/registries/__init__.py +1 -3
- autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
- autobyteus/tools/usage/tool_schema_provider.py +51 -0
- autobyteus/tools/web/__init__.py +4 -0
- autobyteus/tools/web/read_url_tool.py +80 -0
- autobyteus/utils/diff_utils.py +271 -0
- autobyteus/utils/download_utils.py +109 -0
- autobyteus/utils/file_utils.py +57 -2
- autobyteus/utils/gemini_helper.py +56 -0
- autobyteus/utils/gemini_model_mapping.py +71 -0
- autobyteus/utils/llm_output_formatter.py +75 -0
- autobyteus/utils/tool_call_format.py +36 -0
- autobyteus/workflow/agentic_workflow.py +3 -3
- autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
- autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
- autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
- autobyteus/workflow/context/workflow_context.py +3 -3
- autobyteus/workflow/context/workflow_runtime_state.py +5 -5
- autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
- autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
- autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
- autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
- autobyteus/workflow/runtime/workflow_runtime.py +8 -8
- autobyteus/workflow/runtime/workflow_worker.py +3 -3
- autobyteus/workflow/status/__init__.py +11 -0
- autobyteus/workflow/status/workflow_status.py +19 -0
- autobyteus/workflow/status/workflow_status_manager.py +48 -0
- autobyteus/workflow/streaming/__init__.py +2 -2
- autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
- autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
- autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
- autobyteus/workflow/utils/wait_for_idle.py +4 -4
- autobyteus-1.2.3.dist-info/METADATA +293 -0
- autobyteus-1.2.3.dist-info/RECORD +600 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
- autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
- autobyteus/agent/hooks/__init__.py +0 -16
- autobyteus/agent/hooks/base_phase_hook.py +0 -78
- autobyteus/agent/hooks/hook_definition.py +0 -36
- autobyteus/agent/hooks/hook_meta.py +0 -37
- autobyteus/agent/hooks/hook_registry.py +0 -106
- autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
- autobyteus/agent/phases/__init__.py +0 -18
- autobyteus/agent/phases/discover.py +0 -53
- autobyteus/agent/phases/manager.py +0 -265
- autobyteus/agent/phases/transition_decorator.py +0 -40
- autobyteus/agent/phases/transition_info.py +0 -33
- autobyteus/agent/remote_agent.py +0 -244
- autobyteus/agent/workspace/workspace_definition.py +0 -36
- autobyteus/agent/workspace/workspace_meta.py +0 -37
- autobyteus/agent/workspace/workspace_registry.py +0 -72
- autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
- autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
- autobyteus/agent_team/phases/__init__.py +0 -11
- autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
- autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
- autobyteus/llm/api/bedrock_llm.py +0 -92
- autobyteus/llm/api/groq_llm.py +0 -94
- autobyteus/llm/api/nvidia_llm.py +0 -108
- autobyteus/llm/utils/token_pricing_config.py +0 -87
- autobyteus/person/examples/sample_persons.py +0 -14
- autobyteus/person/examples/sample_roles.py +0 -14
- autobyteus/person/person.py +0 -29
- autobyteus/person/role.py +0 -14
- autobyteus/rpc/__init__.py +0 -73
- autobyteus/rpc/client/__init__.py +0 -17
- autobyteus/rpc/client/abstract_client_connection.py +0 -124
- autobyteus/rpc/client/client_connection_manager.py +0 -153
- autobyteus/rpc/client/sse_client_connection.py +0 -306
- autobyteus/rpc/client/stdio_client_connection.py +0 -280
- autobyteus/rpc/config/__init__.py +0 -13
- autobyteus/rpc/config/agent_server_config.py +0 -153
- autobyteus/rpc/config/agent_server_registry.py +0 -152
- autobyteus/rpc/hosting.py +0 -244
- autobyteus/rpc/protocol.py +0 -244
- autobyteus/rpc/server/__init__.py +0 -20
- autobyteus/rpc/server/agent_server_endpoint.py +0 -181
- autobyteus/rpc/server/base_method_handler.py +0 -40
- autobyteus/rpc/server/method_handlers.py +0 -259
- autobyteus/rpc/server/sse_server_handler.py +0 -182
- autobyteus/rpc/server/stdio_server_handler.py +0 -151
- autobyteus/rpc/server_main.py +0 -198
- autobyteus/rpc/transport_type.py +0 -13
- autobyteus/tools/bash/__init__.py +0 -2
- autobyteus/tools/bash/bash_executor.py +0 -100
- autobyteus/tools/browser/__init__.py +0 -2
- autobyteus/tools/browser/session_aware/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
- autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
- autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
- autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
- autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
- autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
- autobyteus/tools/browser/standalone/__init__.py +0 -6
- autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
- autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
- autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/standalone/navigate_to.py +0 -80
- autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
- autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
- autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
- autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
- autobyteus/tools/file/file_editor.py +0 -200
- autobyteus/tools/google_search.py +0 -149
- autobyteus/tools/timer.py +0 -171
- autobyteus/tools/usage/parsers/__init__.py +0 -22
- autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
- autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
- autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
- autobyteus/tools/usage/parsers/base_parser.py +0 -41
- autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
- autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
- autobyteus/tools/usage/parsers/exceptions.py +0 -13
- autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
- autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
- autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
- autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
- autobyteus/workflow/phases/__init__.py +0 -11
- autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
- autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
- autobyteus-1.2.0.dist-info/METADATA +0 -205
- autobyteus-1.2.0.dist-info/RECORD +0 -496
- examples/__init__.py +0 -1
- examples/agent_team/__init__.py +0 -1
- examples/discover_phase_transitions.py +0 -104
- examples/run_browser_agent.py +0 -262
- examples/run_google_slides_agent.py +0 -287
- examples/run_mcp_browser_client.py +0 -174
- examples/run_mcp_google_slides_client.py +0 -270
- examples/run_mcp_list_tools.py +0 -189
- examples/run_poem_writer.py +0 -284
- examples/run_sqlite_agent.py +0 -295
- /autobyteus/{person → skills}/__init__.py +0 -0
- /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
|
@@ -1,12 +1,10 @@
|
|
|
1
1
|
# file: autobyteus/autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py
|
|
2
2
|
import logging
|
|
3
|
-
from typing import Dict,
|
|
3
|
+
from typing import Dict, List, TYPE_CHECKING
|
|
4
4
|
|
|
5
5
|
from .base_processor import BaseSystemPromptProcessor
|
|
6
6
|
from autobyteus.tools.registry import default_tool_registry, ToolDefinition
|
|
7
7
|
from autobyteus.tools.usage.providers import ToolManifestProvider
|
|
8
|
-
from autobyteus.prompt.prompt_template import PromptTemplate
|
|
9
|
-
from autobyteus.llm.providers import LLMProvider
|
|
10
8
|
|
|
11
9
|
if TYPE_CHECKING:
|
|
12
10
|
from autobyteus.tools.base_tool import BaseTool
|
|
@@ -14,19 +12,12 @@ if TYPE_CHECKING:
|
|
|
14
12
|
|
|
15
13
|
logger = logging.getLogger(__name__)
|
|
16
14
|
|
|
15
|
+
|
|
17
16
|
class ToolManifestInjectorProcessor(BaseSystemPromptProcessor):
|
|
18
17
|
"""
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
rendering and delegates manifest generation to a ToolManifestProvider.
|
|
22
|
-
It automatically determines whether to use XML or JSON based on the LLM provider.
|
|
18
|
+
Appends an 'Accessible Tools' section to the system prompt.
|
|
19
|
+
Automatically determines XML or JSON format based on the LLM provider.
|
|
23
20
|
"""
|
|
24
|
-
# The '{{tools}}' placeholder is now handled by Jinja2 via PromptTemplate.
|
|
25
|
-
DEFAULT_PREFIX_FOR_TOOLS_ONLY_PROMPT = "You have access to a set of tools. Use them by outputting the appropriate tool call format. The user can only see the output of the tool, not the call itself. The available tools are:\n\n"
|
|
26
|
-
|
|
27
|
-
def __init__(self):
|
|
28
|
-
self._manifest_provider = ToolManifestProvider()
|
|
29
|
-
logger.debug(f"{self.get_name()} initialized.")
|
|
30
21
|
|
|
31
22
|
@classmethod
|
|
32
23
|
def get_name(cls) -> str:
|
|
@@ -34,63 +25,53 @@ class ToolManifestInjectorProcessor(BaseSystemPromptProcessor):
|
|
|
34
25
|
|
|
35
26
|
@classmethod
|
|
36
27
|
def get_order(cls) -> int:
|
|
37
|
-
"""Explicitly set to default, as it's often the only system prompt processor."""
|
|
38
28
|
return 500
|
|
39
29
|
|
|
40
30
|
@classmethod
|
|
41
31
|
def is_mandatory(cls) -> bool:
|
|
42
|
-
"""This processor is essential for the LLM to know which tools are available."""
|
|
43
32
|
return True
|
|
44
33
|
|
|
45
|
-
def
|
|
46
|
-
|
|
47
|
-
prompt_template = PromptTemplate(template=system_prompt)
|
|
48
|
-
except Exception as e:
|
|
49
|
-
logger.error(f"Failed to create PromptTemplate from system prompt for agent '{agent_id}'. Error: {e}", exc_info=True)
|
|
50
|
-
# Return original prompt on Jinja2 parsing failure
|
|
51
|
-
return system_prompt
|
|
34
|
+
def __init__(self):
|
|
35
|
+
self._manifest_provider = None
|
|
52
36
|
|
|
53
|
-
|
|
54
|
-
|
|
37
|
+
def process(
|
|
38
|
+
self,
|
|
39
|
+
system_prompt: str,
|
|
40
|
+
tool_instances: Dict[str, 'BaseTool'],
|
|
41
|
+
agent_id: str,
|
|
42
|
+
context: 'AgentContext'
|
|
43
|
+
) -> str:
|
|
44
|
+
if not tool_instances:
|
|
45
|
+
logger.info(f"Agent '{agent_id}': No tools configured. Skipping tool injection.")
|
|
55
46
|
return system_prompt
|
|
56
47
|
|
|
48
|
+
# Get LLM provider for format selection
|
|
57
49
|
llm_provider = None
|
|
58
50
|
if context.llm_instance and context.llm_instance.model:
|
|
59
51
|
llm_provider = context.llm_instance.model.provider
|
|
60
|
-
|
|
61
|
-
# Retrieve the override flag from the agent's configuration.
|
|
62
|
-
use_xml_tool_format = context.config.use_xml_tool_format
|
|
63
52
|
|
|
64
|
-
#
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
]
|
|
53
|
+
# Get tool definitions
|
|
54
|
+
tool_definitions: List[ToolDefinition] = [
|
|
55
|
+
td for name in tool_instances if (td := default_tool_registry.get_tool_definition(name))
|
|
56
|
+
]
|
|
57
|
+
|
|
58
|
+
if not tool_definitions:
|
|
59
|
+
logger.warning(f"Agent '{agent_id}': Tools configured but no definitions found in registry.")
|
|
60
|
+
return system_prompt
|
|
73
61
|
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
# Check if the prompt *only* contains the 'tools' variable by rendering with an empty string
|
|
86
|
-
rendered_without_tools = prompt_template.fill({"tools": ""})
|
|
87
|
-
is_tools_only_prompt = not rendered_without_tools.strip()
|
|
62
|
+
# Generate manifest
|
|
63
|
+
try:
|
|
64
|
+
if self._manifest_provider is None:
|
|
65
|
+
self._manifest_provider = ToolManifestProvider()
|
|
66
|
+
tools_manifest = self._manifest_provider.provide(
|
|
67
|
+
tool_definitions=tool_definitions,
|
|
68
|
+
provider=llm_provider,
|
|
69
|
+
)
|
|
70
|
+
except Exception as e:
|
|
71
|
+
logger.exception(f"Agent '{agent_id}': Failed to generate tool manifest: {e}")
|
|
72
|
+
return system_prompt
|
|
88
73
|
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
# For prompts that contain other text, add a newline for better formatting before filling the template.
|
|
94
|
-
tools_description_with_newline = f"\n{tools_manifest}"
|
|
95
|
-
final_prompt = prompt_template.fill({"tools": tools_description_with_newline})
|
|
96
|
-
return final_prompt
|
|
74
|
+
# Append tools section
|
|
75
|
+
tools_block = f"\n\n## Accessible Tools\n\n{tools_manifest}"
|
|
76
|
+
logger.info(f"Agent '{agent_id}': Injected {len(tool_definitions)} tools.")
|
|
77
|
+
return system_prompt + tools_block
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from autobyteus.llm.models import LLMModel
|
|
5
|
+
from autobyteus.llm.utils.llm_config import LLMConfig
|
|
6
|
+
from autobyteus.memory.policies.compaction_policy import CompactionPolicy
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass(frozen=True)
|
|
10
|
+
class TokenBudget:
|
|
11
|
+
max_context_tokens: int
|
|
12
|
+
max_output_tokens: int
|
|
13
|
+
safety_margin_tokens: int
|
|
14
|
+
compaction_ratio: float
|
|
15
|
+
input_budget: int
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
def resolve_token_budget(
|
|
19
|
+
model: LLMModel,
|
|
20
|
+
config: LLMConfig,
|
|
21
|
+
policy: CompactionPolicy,
|
|
22
|
+
) -> Optional[TokenBudget]:
|
|
23
|
+
max_context_tokens = model.max_context_tokens or config.token_limit
|
|
24
|
+
if not max_context_tokens:
|
|
25
|
+
return None
|
|
26
|
+
|
|
27
|
+
max_output_tokens = config.max_tokens or 0
|
|
28
|
+
|
|
29
|
+
if config.safety_margin_tokens is not None:
|
|
30
|
+
safety_margin = config.safety_margin_tokens
|
|
31
|
+
elif model.default_safety_margin_tokens is not None:
|
|
32
|
+
safety_margin = model.default_safety_margin_tokens
|
|
33
|
+
else:
|
|
34
|
+
safety_margin = policy.safety_margin_tokens
|
|
35
|
+
|
|
36
|
+
if config.compaction_ratio is not None:
|
|
37
|
+
compaction_ratio = config.compaction_ratio
|
|
38
|
+
elif model.default_compaction_ratio is not None:
|
|
39
|
+
compaction_ratio = model.default_compaction_ratio
|
|
40
|
+
else:
|
|
41
|
+
compaction_ratio = policy.trigger_ratio
|
|
42
|
+
|
|
43
|
+
input_budget = max(0, max_context_tokens - max_output_tokens - safety_margin)
|
|
44
|
+
|
|
45
|
+
return TokenBudget(
|
|
46
|
+
max_context_tokens=max_context_tokens,
|
|
47
|
+
max_output_tokens=max_output_tokens,
|
|
48
|
+
safety_margin_tokens=safety_margin,
|
|
49
|
+
compaction_ratio=compaction_ratio,
|
|
50
|
+
input_budget=input_budget,
|
|
51
|
+
)
|
|
52
|
+
|
|
53
|
+
|
|
54
|
+
def apply_compaction_policy(policy: CompactionPolicy, budget: TokenBudget) -> None:
|
|
55
|
+
policy.trigger_ratio = budget.compaction_ratio
|
|
56
|
+
policy.safety_margin_tokens = budget.safety_margin_tokens
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import TYPE_CHECKING
|
|
3
|
+
|
|
4
|
+
from autobyteus.agent.tool_execution_result_processor.base_processor import BaseToolExecutionResultProcessor
|
|
5
|
+
|
|
6
|
+
if TYPE_CHECKING:
|
|
7
|
+
from autobyteus.agent.context import AgentContext
|
|
8
|
+
from autobyteus.agent.events import ToolResultEvent
|
|
9
|
+
|
|
10
|
+
logger = logging.getLogger(__name__)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class MemoryIngestToolResultProcessor(BaseToolExecutionResultProcessor):
|
|
14
|
+
@classmethod
|
|
15
|
+
def get_order(cls) -> int:
|
|
16
|
+
return 900
|
|
17
|
+
|
|
18
|
+
async def process(self, event: "ToolResultEvent", context: "AgentContext") -> "ToolResultEvent":
|
|
19
|
+
memory_manager = getattr(context.state, "memory_manager", None)
|
|
20
|
+
if memory_manager:
|
|
21
|
+
if event.turn_id:
|
|
22
|
+
memory_manager.ingest_tool_result(event)
|
|
23
|
+
logger.debug("MemoryIngestToolResultProcessor stored tool result for turn_id %s", event.turn_id)
|
|
24
|
+
else:
|
|
25
|
+
logger.debug(
|
|
26
|
+
"MemoryIngestToolResultProcessor skipping tool result without turn_id for tool '%s'",
|
|
27
|
+
event.tool_name,
|
|
28
|
+
)
|
|
29
|
+
return event
|
|
@@ -1,9 +1,6 @@
|
|
|
1
1
|
# file: autobyteus/autobyteus/agent/tool_invocation.py
|
|
2
|
-
import uuid
|
|
3
|
-
import hashlib
|
|
4
|
-
import json
|
|
5
2
|
import logging
|
|
6
|
-
from typing import
|
|
3
|
+
from typing import Dict, Any, List, TYPE_CHECKING, Optional
|
|
7
4
|
from dataclasses import dataclass, field
|
|
8
5
|
|
|
9
6
|
if TYPE_CHECKING:
|
|
@@ -12,48 +9,26 @@ if TYPE_CHECKING:
|
|
|
12
9
|
logger = logging.getLogger(__name__)
|
|
13
10
|
|
|
14
11
|
class ToolInvocation:
|
|
15
|
-
def __init__(self, name:
|
|
12
|
+
def __init__(self, name: str, arguments: Dict[str, Any], id: str, turn_id: str = None):
|
|
16
13
|
"""
|
|
17
14
|
Represents a tool invocation request.
|
|
18
15
|
|
|
19
16
|
Args:
|
|
20
17
|
name: The name of the tool to be invoked.
|
|
21
18
|
arguments: A dictionary of arguments for the tool.
|
|
22
|
-
id:
|
|
23
|
-
If None, a deterministic ID will be generated based on the tool name and arguments.
|
|
19
|
+
id: Required. A unique identifier for this tool invocation.
|
|
24
20
|
"""
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
@staticmethod
|
|
37
|
-
def _generate_deterministic_id(name: str, arguments: Dict[str, Any]) -> str:
|
|
38
|
-
"""
|
|
39
|
-
Generates a deterministic ID for the tool invocation based on its content.
|
|
40
|
-
"""
|
|
41
|
-
# Create a canonical representation of the arguments
|
|
42
|
-
# sort_keys=True ensures that the order of keys doesn't change the hash
|
|
43
|
-
# ensure_ascii=False is critical for cross-language compatibility with JS
|
|
44
|
-
canonical_args = json.dumps(arguments, sort_keys=True, separators=(',', ':'), ensure_ascii=False)
|
|
45
|
-
|
|
46
|
-
# Create a string to hash
|
|
47
|
-
hash_string = f"{name}:{canonical_args}"
|
|
48
|
-
|
|
49
|
-
# --- ADDED LOGGING ---
|
|
50
|
-
logger.debug(f"Generating tool invocation ID from hash_string: '{hash_string}'")
|
|
51
|
-
|
|
52
|
-
# Use SHA256 for a robust hash
|
|
53
|
-
sha256_hash = hashlib.sha256(hash_string.encode('utf-8')).hexdigest()
|
|
54
|
-
|
|
55
|
-
# Prepend a prefix for clarity and use the full hash.
|
|
56
|
-
return f"call_{sha256_hash}"
|
|
21
|
+
if not id:
|
|
22
|
+
raise ValueError("ToolInvocation requires a non-empty id.")
|
|
23
|
+
if not name:
|
|
24
|
+
raise ValueError("ToolInvocation requires a non-empty name.")
|
|
25
|
+
if arguments is None:
|
|
26
|
+
raise ValueError("ToolInvocation requires arguments.")
|
|
27
|
+
|
|
28
|
+
self.name: str = name
|
|
29
|
+
self.arguments: Dict[str, Any] = arguments
|
|
30
|
+
self.id: str = id
|
|
31
|
+
self.turn_id: Optional[str] = turn_id
|
|
57
32
|
|
|
58
33
|
def is_valid(self) -> bool:
|
|
59
34
|
"""
|
|
@@ -63,7 +38,8 @@ class ToolInvocation:
|
|
|
63
38
|
return self.name is not None and self.arguments is not None
|
|
64
39
|
|
|
65
40
|
def __repr__(self) -> str:
|
|
66
|
-
|
|
41
|
+
turn_id_repr = f", turn_id='{self.turn_id}'" if self.turn_id else ""
|
|
42
|
+
return (f"ToolInvocation(id='{self.id}', name='{self.name}'{turn_id_repr}, "
|
|
67
43
|
f"arguments={self.arguments})")
|
|
68
44
|
|
|
69
45
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from .base_preprocessor import BaseToolInvocationPreprocessor
|
|
2
|
+
from .processor_definition import ToolInvocationPreprocessorDefinition
|
|
3
|
+
from .processor_registry import default_tool_invocation_preprocessor_registry
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"BaseToolInvocationPreprocessor",
|
|
7
|
+
"ToolInvocationPreprocessorDefinition",
|
|
8
|
+
"default_tool_invocation_preprocessor_registry",
|
|
9
|
+
]
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from abc import ABC, abstractmethod
|
|
3
|
+
from typing import TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
from .processor_meta import ToolInvocationPreprocessorMeta
|
|
6
|
+
|
|
7
|
+
if TYPE_CHECKING:
|
|
8
|
+
from autobyteus.agent.context import AgentContext
|
|
9
|
+
from autobyteus.agent.tool_invocation import ToolInvocation
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class BaseToolInvocationPreprocessor(ABC, metaclass=ToolInvocationPreprocessorMeta):
|
|
15
|
+
"""
|
|
16
|
+
Pre-execution processors that can mutate or validate a ToolInvocation
|
|
17
|
+
before the tool is executed.
|
|
18
|
+
"""
|
|
19
|
+
|
|
20
|
+
@classmethod
|
|
21
|
+
def get_name(cls) -> str:
|
|
22
|
+
return cls.__name__
|
|
23
|
+
|
|
24
|
+
@classmethod
|
|
25
|
+
def get_order(cls) -> int:
|
|
26
|
+
"""Lower numbers run earlier."""
|
|
27
|
+
return 500
|
|
28
|
+
|
|
29
|
+
@classmethod
|
|
30
|
+
def is_mandatory(cls) -> bool:
|
|
31
|
+
return False
|
|
32
|
+
|
|
33
|
+
@abstractmethod
|
|
34
|
+
async def process(self,
|
|
35
|
+
invocation: 'ToolInvocation',
|
|
36
|
+
context: 'AgentContext') -> 'ToolInvocation':
|
|
37
|
+
"""
|
|
38
|
+
Process and return the (potentially modified) ToolInvocation.
|
|
39
|
+
May raise to signal failure; caller should handle and surface as tool error.
|
|
40
|
+
"""
|
|
41
|
+
raise NotImplementedError
|
|
42
|
+
|
|
43
|
+
def __repr__(self) -> str:
|
|
44
|
+
return f"<{self.__class__.__name__}>"
|
|
45
|
+
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
from typing import TYPE_CHECKING, Type
|
|
2
|
+
|
|
3
|
+
if TYPE_CHECKING:
|
|
4
|
+
from .base_preprocessor import BaseToolInvocationPreprocessor
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class ToolInvocationPreprocessorDefinition:
|
|
8
|
+
"""
|
|
9
|
+
Lightweight container binding a name to a preprocessor class.
|
|
10
|
+
Mirrors the pattern used by other processor registries.
|
|
11
|
+
"""
|
|
12
|
+
def __init__(self, name: str, processor_class: Type['BaseToolInvocationPreprocessor']):
|
|
13
|
+
self.name = name
|
|
14
|
+
self.processor_class: Type['BaseToolInvocationPreprocessor'] = processor_class
|
|
15
|
+
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from abc import ABCMeta
|
|
3
|
+
|
|
4
|
+
from .processor_registry import default_tool_invocation_preprocessor_registry
|
|
5
|
+
from .processor_definition import ToolInvocationPreprocessorDefinition
|
|
6
|
+
|
|
7
|
+
logger = logging.getLogger(__name__)
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class ToolInvocationPreprocessorMeta(ABCMeta):
|
|
11
|
+
"""
|
|
12
|
+
Metaclass to auto-register concrete preprocessors.
|
|
13
|
+
"""
|
|
14
|
+
def __init__(cls, name, bases, dct):
|
|
15
|
+
super().__init__(name, bases, dct)
|
|
16
|
+
|
|
17
|
+
if name == "BaseToolInvocationPreprocessor" or getattr(cls, "__abstractmethods__", None):
|
|
18
|
+
logger.debug(f"Skipping registration for abstract tool invocation preprocessor class: {name}")
|
|
19
|
+
return
|
|
20
|
+
|
|
21
|
+
try:
|
|
22
|
+
processor_name = cls.get_name()
|
|
23
|
+
if not processor_name or not isinstance(processor_name, str):
|
|
24
|
+
logger.error(f"Tool invocation preprocessor class {name} must return valid string from get_name(); skipping.")
|
|
25
|
+
return
|
|
26
|
+
definition = ToolInvocationPreprocessorDefinition(name=processor_name, processor_class=cls)
|
|
27
|
+
default_tool_invocation_preprocessor_registry.register_preprocessor(definition)
|
|
28
|
+
logger.info(f"Auto-registered tool invocation preprocessor '{processor_name}' from class {name}.")
|
|
29
|
+
except AttributeError as e:
|
|
30
|
+
logger.error(f"Tool invocation preprocessor class {name} missing required methods ({e}); skipping registration.")
|
|
31
|
+
except Exception as e:
|
|
32
|
+
logger.error(f"Failed to auto-register tool invocation preprocessor class {name}: {e}", exc_info=True)
|
|
33
|
+
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import logging
|
|
2
|
+
from typing import TYPE_CHECKING, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
from autobyteus.utils.singleton import SingletonMeta
|
|
5
|
+
from autobyteus.agent.processor_option import ProcessorOption
|
|
6
|
+
from .processor_definition import ToolInvocationPreprocessorDefinition
|
|
7
|
+
|
|
8
|
+
if TYPE_CHECKING:
|
|
9
|
+
from .base_preprocessor import BaseToolInvocationPreprocessor
|
|
10
|
+
|
|
11
|
+
logger = logging.getLogger(__name__)
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class ToolInvocationPreprocessorRegistry(metaclass=SingletonMeta):
|
|
15
|
+
"""
|
|
16
|
+
Registry for ToolInvocationPreprocessor definitions.
|
|
17
|
+
"""
|
|
18
|
+
def __init__(self):
|
|
19
|
+
self._definitions: Dict[str, ToolInvocationPreprocessorDefinition] = {}
|
|
20
|
+
logger.info("ToolInvocationPreprocessorRegistry initialized.")
|
|
21
|
+
|
|
22
|
+
def register_preprocessor(self, definition: ToolInvocationPreprocessorDefinition) -> None:
|
|
23
|
+
if not isinstance(definition, ToolInvocationPreprocessorDefinition):
|
|
24
|
+
raise TypeError(f"Expected ToolInvocationPreprocessorDefinition, got {type(definition).__name__}")
|
|
25
|
+
name = definition.name
|
|
26
|
+
if name in self._definitions:
|
|
27
|
+
logger.warning(f"Overwriting existing tool invocation preprocessor definition '{name}'.")
|
|
28
|
+
self._definitions[name] = definition
|
|
29
|
+
logger.info(f"Tool invocation preprocessor definition '{name}' registered.")
|
|
30
|
+
|
|
31
|
+
def get_preprocessor_definition(self, name: str) -> Optional[ToolInvocationPreprocessorDefinition]:
|
|
32
|
+
return self._definitions.get(name)
|
|
33
|
+
|
|
34
|
+
def get_preprocessor(self, name: str) -> Optional['BaseToolInvocationPreprocessor']:
|
|
35
|
+
definition = self.get_preprocessor_definition(name)
|
|
36
|
+
if definition:
|
|
37
|
+
try:
|
|
38
|
+
return definition.processor_class()
|
|
39
|
+
except Exception as e:
|
|
40
|
+
logger.error(f"Failed to instantiate tool invocation preprocessor '{name}': {e}", exc_info=True)
|
|
41
|
+
return None
|
|
42
|
+
return None
|
|
43
|
+
|
|
44
|
+
def list_preprocessor_names(self) -> List[str]:
|
|
45
|
+
return list(self._definitions.keys())
|
|
46
|
+
|
|
47
|
+
# Backwards-compatible alias used by some services
|
|
48
|
+
def get_processor(self, name: str) -> Optional['BaseToolInvocationPreprocessor']:
|
|
49
|
+
return self.get_preprocessor(name)
|
|
50
|
+
|
|
51
|
+
def get_ordered_processor_options(self) -> List[ProcessorOption]:
|
|
52
|
+
definitions = list(self._definitions.values())
|
|
53
|
+
sorted_defs = sorted(definitions, key=lambda d: d.processor_class.get_order())
|
|
54
|
+
return [ProcessorOption(name=d.name, is_mandatory=d.processor_class.is_mandatory()) for d in sorted_defs]
|
|
55
|
+
|
|
56
|
+
def get_all_definitions(self) -> Dict[str, ToolInvocationPreprocessorDefinition]:
|
|
57
|
+
return dict(self._definitions)
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
default_tool_invocation_preprocessor_registry = ToolInvocationPreprocessorRegistry()
|
|
@@ -1,25 +1,23 @@
|
|
|
1
1
|
# file: autobyteus/autobyteus/agent/utils/wait_for_idle.py
|
|
2
2
|
import asyncio
|
|
3
3
|
import logging
|
|
4
|
-
from typing import Optional
|
|
5
4
|
|
|
6
5
|
from autobyteus.agent.agent import Agent
|
|
7
6
|
from autobyteus.agent.streaming.agent_event_stream import AgentEventStream
|
|
8
|
-
from autobyteus.agent.
|
|
9
|
-
from autobyteus.agent.phases import AgentOperationalPhase
|
|
7
|
+
from autobyteus.agent.status.status_enum import AgentStatus
|
|
10
8
|
|
|
11
9
|
logger = logging.getLogger(__name__)
|
|
12
10
|
|
|
13
11
|
async def _wait_loop(streamer: AgentEventStream, agent_id: str):
|
|
14
|
-
"""Internal helper to listen for the IDLE or ERROR
|
|
15
|
-
async for
|
|
16
|
-
if
|
|
12
|
+
"""Internal helper to listen for the IDLE or ERROR status update."""
|
|
13
|
+
async for status_update in streamer.stream_status_updates():
|
|
14
|
+
if status_update.new_status == AgentStatus.IDLE:
|
|
17
15
|
logger.info(f"Agent '{agent_id}' has become idle.")
|
|
18
16
|
return
|
|
19
|
-
if
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
17
|
+
if status_update.new_status == AgentStatus.ERROR:
|
|
18
|
+
error_message = f"Agent '{agent_id}' entered an error state while waiting for idle: {status_update}"
|
|
19
|
+
logger.error(error_message)
|
|
20
|
+
raise RuntimeError(error_message)
|
|
23
21
|
|
|
24
22
|
|
|
25
23
|
async def wait_for_agent_to_be_idle(agent: Agent, timeout: float = 30.0):
|
|
@@ -41,12 +39,12 @@ async def wait_for_agent_to_be_idle(agent: Agent, timeout: float = 30.0):
|
|
|
41
39
|
if not isinstance(agent, Agent):
|
|
42
40
|
raise TypeError("The 'agent' argument must be an instance of the Agent class.")
|
|
43
41
|
|
|
44
|
-
|
|
45
|
-
if
|
|
46
|
-
logger.warning(f"Agent '{agent.agent_id}' is already in a terminal state ({
|
|
42
|
+
current_status = agent.get_current_status()
|
|
43
|
+
if current_status.is_terminal():
|
|
44
|
+
logger.warning(f"Agent '{agent.agent_id}' is already in a terminal state ({current_status.value}) and will not become idle.")
|
|
47
45
|
return
|
|
48
46
|
|
|
49
|
-
if
|
|
47
|
+
if current_status == AgentStatus.IDLE:
|
|
50
48
|
logger.debug(f"Agent '{agent.agent_id}' is already idle.")
|
|
51
49
|
return
|
|
52
50
|
|
|
@@ -2,9 +2,7 @@
|
|
|
2
2
|
import logging
|
|
3
3
|
import uuid
|
|
4
4
|
from abc import ABC, abstractmethod
|
|
5
|
-
from typing import Optional,
|
|
6
|
-
from autobyteus.utils.parameter_schema import ParameterSchema
|
|
7
|
-
from autobyteus.agent.workspace.workspace_meta import WorkspaceMeta
|
|
5
|
+
from typing import Optional, TYPE_CHECKING
|
|
8
6
|
from autobyteus.agent.workspace.workspace_config import WorkspaceConfig
|
|
9
7
|
|
|
10
8
|
if TYPE_CHECKING:
|
|
@@ -12,13 +10,13 @@ if TYPE_CHECKING:
|
|
|
12
10
|
|
|
13
11
|
logger = logging.getLogger(__name__)
|
|
14
12
|
|
|
15
|
-
class BaseAgentWorkspace(ABC
|
|
13
|
+
class BaseAgentWorkspace(ABC):
|
|
16
14
|
"""
|
|
17
15
|
Abstract base class for an agent's workspace or working environment.
|
|
18
16
|
|
|
19
17
|
A workspace is a passive data container that describes an agent's operating
|
|
20
|
-
environment (e.g., a local directory
|
|
21
|
-
|
|
18
|
+
environment (e.g., a local directory). It does not implement active operations
|
|
19
|
+
itself; that is the responsibility of Tools.
|
|
22
20
|
"""
|
|
23
21
|
|
|
24
22
|
def __init__(self, config: Optional[WorkspaceConfig] = None):
|
|
@@ -26,7 +24,7 @@ class BaseAgentWorkspace(ABC, metaclass=WorkspaceMeta):
|
|
|
26
24
|
Initializes the BaseAgentWorkspace.
|
|
27
25
|
|
|
28
26
|
Args:
|
|
29
|
-
config: Optional configuration for the workspace (e.g., base path
|
|
27
|
+
config: Optional configuration for the workspace (e.g., base path).
|
|
30
28
|
"""
|
|
31
29
|
self._config: WorkspaceConfig = config or WorkspaceConfig()
|
|
32
30
|
self.context: Optional['AgentContext'] = None
|
|
@@ -68,25 +66,6 @@ class BaseAgentWorkspace(ABC, metaclass=WorkspaceMeta):
|
|
|
68
66
|
"""
|
|
69
67
|
return self.workspace_id
|
|
70
68
|
|
|
71
|
-
# --- Methods for self-description ---
|
|
72
|
-
|
|
73
|
-
@classmethod
|
|
74
|
-
@abstractmethod
|
|
75
|
-
def get_workspace_type_name(cls) -> str:
|
|
76
|
-
"""Returns the unique, machine-readable type name for this workspace (e.g., 'local_workspace')."""
|
|
77
|
-
pass
|
|
78
|
-
|
|
79
|
-
@classmethod
|
|
80
|
-
@abstractmethod
|
|
81
|
-
def get_description(cls) -> str:
|
|
82
|
-
"""Returns a user-friendly description of this workspace type."""
|
|
83
|
-
pass
|
|
84
|
-
|
|
85
|
-
@classmethod
|
|
86
|
-
@abstractmethod
|
|
87
|
-
def get_config_schema(cls) -> ParameterSchema:
|
|
88
|
-
"""Returns the ParameterSchema defining the configuration arguments needed to create an instance of this workspace."""
|
|
89
|
-
pass
|
|
90
|
-
|
|
91
69
|
def __repr__(self) -> str:
|
|
92
70
|
return f"<{self.__class__.__name__} workspace_id='{self.workspace_id}' agent_id='{self.agent_id or 'N/A'}>"
|
|
71
|
+
|
|
@@ -5,7 +5,7 @@ from typing import Optional
|
|
|
5
5
|
from autobyteus.agent_team.runtime.agent_team_runtime import AgentTeamRuntime
|
|
6
6
|
from autobyteus.agent_team.events.agent_team_events import ProcessUserMessageEvent, ToolApprovalTeamEvent
|
|
7
7
|
from autobyteus.agent.message.agent_input_user_message import AgentInputUserMessage
|
|
8
|
-
from autobyteus.agent_team.
|
|
8
|
+
from autobyteus.agent_team.status.agent_team_status import AgentTeamStatus
|
|
9
9
|
|
|
10
10
|
logger = logging.getLogger(__name__)
|
|
11
11
|
|
|
@@ -89,5 +89,5 @@ class AgentTeam:
|
|
|
89
89
|
"""Checks if the agent team's worker is running."""
|
|
90
90
|
return self._runtime.is_running
|
|
91
91
|
|
|
92
|
-
def
|
|
93
|
-
return self._runtime.context.state.
|
|
92
|
+
def get_current_status(self) -> AgentTeamStatus:
|
|
93
|
+
return self._runtime.context.state.current_status
|