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
autobyteus/tools/timer.py
DELETED
|
@@ -1,175 +0,0 @@
|
|
|
1
|
-
import asyncio
|
|
2
|
-
from typing import Optional, TYPE_CHECKING, Any
|
|
3
|
-
from autobyteus.tools.base_tool import BaseTool
|
|
4
|
-
from autobyteus.tools.tool_config import ToolConfig
|
|
5
|
-
from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
|
|
6
|
-
from autobyteus.tools.tool_category import ToolCategory
|
|
7
|
-
from autobyteus.events.event_emitter import EventEmitter
|
|
8
|
-
from autobyteus.events.event_types import EventType
|
|
9
|
-
import logging
|
|
10
|
-
|
|
11
|
-
if TYPE_CHECKING:
|
|
12
|
-
from autobyteus.agent.context import AgentContext
|
|
13
|
-
|
|
14
|
-
logger = logging.getLogger(__name__)
|
|
15
|
-
|
|
16
|
-
class Timer(BaseTool, EventEmitter):
|
|
17
|
-
"""
|
|
18
|
-
A tool that provides timer functionality with configurable duration and event emission.
|
|
19
|
-
The timer runs independently after being started and emits TIMER_UPDATE events.
|
|
20
|
-
"""
|
|
21
|
-
CATEGORY = ToolCategory.UTILITY
|
|
22
|
-
|
|
23
|
-
def __init__(self, config: Optional[ToolConfig] = None):
|
|
24
|
-
BaseTool.__init__(self, config=config)
|
|
25
|
-
EventEmitter.__init__(self)
|
|
26
|
-
|
|
27
|
-
self.duration: int = 300
|
|
28
|
-
self.interval: int = 60
|
|
29
|
-
|
|
30
|
-
if config:
|
|
31
|
-
try:
|
|
32
|
-
self.duration = int(config.get('duration', 300))
|
|
33
|
-
if not (1 <= self.duration <= 86400):
|
|
34
|
-
logger.warning(f"Timer duration {self.duration} out of bounds (1-86400). Clamping or using default.")
|
|
35
|
-
self.duration = max(1, min(self.duration, 86400))
|
|
36
|
-
except ValueError:
|
|
37
|
-
logger.warning(f"Invalid duration value in config, using default {self.duration}s.")
|
|
38
|
-
|
|
39
|
-
try:
|
|
40
|
-
self.interval = int(config.get('interval', 60))
|
|
41
|
-
if not (1 <= self.interval <= 3600):
|
|
42
|
-
logger.warning(f"Timer interval {self.interval} out of bounds (1-3600). Clamping or using default.")
|
|
43
|
-
self.interval = max(1, min(self.interval, 3600))
|
|
44
|
-
except ValueError:
|
|
45
|
-
logger.warning(f"Invalid interval value in config, using default {self.interval}s.")
|
|
46
|
-
|
|
47
|
-
self._is_running: bool = False
|
|
48
|
-
self._task: Optional[asyncio.Task] = None
|
|
49
|
-
logger.debug(f"Timer initialized with duration: {self.duration}s, interval: {self.interval}s")
|
|
50
|
-
|
|
51
|
-
@classmethod
|
|
52
|
-
def get_name(cls) -> str:
|
|
53
|
-
return "start_timer"
|
|
54
|
-
|
|
55
|
-
@classmethod
|
|
56
|
-
def get_description(cls) -> str:
|
|
57
|
-
return "Sets and runs a timer. Emits TIMER_UPDATE events with remaining time at specified intervals."
|
|
58
|
-
|
|
59
|
-
@classmethod
|
|
60
|
-
def get_argument_schema(cls) -> Optional[ParameterSchema]:
|
|
61
|
-
schema = ParameterSchema()
|
|
62
|
-
schema.add_parameter(ParameterDefinition(
|
|
63
|
-
name="duration",
|
|
64
|
-
param_type=ParameterType.INTEGER,
|
|
65
|
-
description="Duration to set for this timer run in seconds.",
|
|
66
|
-
required=True,
|
|
67
|
-
min_value=1,
|
|
68
|
-
max_value=86400
|
|
69
|
-
))
|
|
70
|
-
schema.add_parameter(ParameterDefinition(
|
|
71
|
-
name="interval",
|
|
72
|
-
param_type=ParameterType.INTEGER,
|
|
73
|
-
description="Interval for emitting timer events in seconds for this run. Overrides instance default.",
|
|
74
|
-
required=False,
|
|
75
|
-
default_value=None,
|
|
76
|
-
min_value=1,
|
|
77
|
-
max_value=3600
|
|
78
|
-
))
|
|
79
|
-
return schema
|
|
80
|
-
|
|
81
|
-
@classmethod
|
|
82
|
-
def get_config_schema(cls) -> Optional[ParameterSchema]:
|
|
83
|
-
schema = ParameterSchema()
|
|
84
|
-
schema.add_parameter(ParameterDefinition(
|
|
85
|
-
name="duration",
|
|
86
|
-
param_type=ParameterType.INTEGER,
|
|
87
|
-
description="Default duration of the timer in seconds if not overridden by execute.",
|
|
88
|
-
required=False,
|
|
89
|
-
default_value=300,
|
|
90
|
-
min_value=1,
|
|
91
|
-
max_value=86400
|
|
92
|
-
))
|
|
93
|
-
schema.add_parameter(ParameterDefinition(
|
|
94
|
-
name="interval",
|
|
95
|
-
param_type=ParameterType.INTEGER,
|
|
96
|
-
description="Default interval at which to emit timer events, in seconds, if not overridden by execute.",
|
|
97
|
-
required=False,
|
|
98
|
-
default_value=60,
|
|
99
|
-
min_value=1,
|
|
100
|
-
max_value=3600
|
|
101
|
-
))
|
|
102
|
-
return schema
|
|
103
|
-
|
|
104
|
-
def set_duration(self, duration: int) -> None:
|
|
105
|
-
if not (1 <= duration <= 86400):
|
|
106
|
-
raise ValueError("Duration must be between 1 and 86400 seconds.")
|
|
107
|
-
self.duration = duration
|
|
108
|
-
|
|
109
|
-
def set_interval(self, interval: int) -> None:
|
|
110
|
-
if not (1 <= interval <= 3600):
|
|
111
|
-
raise ValueError("Interval must be between 1 and 3600 seconds.")
|
|
112
|
-
self.interval = interval
|
|
113
|
-
|
|
114
|
-
def start(self, run_duration: Optional[int] = None, run_interval: Optional[int] = None) -> None:
|
|
115
|
-
if self._is_running:
|
|
116
|
-
logger.warning("Timer start called but timer is already running.")
|
|
117
|
-
return
|
|
118
|
-
|
|
119
|
-
current_duration = run_duration if run_duration is not None else self.duration
|
|
120
|
-
current_interval = run_interval if run_interval is not None else self.interval
|
|
121
|
-
|
|
122
|
-
if current_duration <= 0:
|
|
123
|
-
raise RuntimeError("Timer duration must be positive and set before starting.")
|
|
124
|
-
if current_interval <=0:
|
|
125
|
-
raise RuntimeError("Timer interval must be positive and set.")
|
|
126
|
-
|
|
127
|
-
self._is_running = True
|
|
128
|
-
self._task = asyncio.create_task(self._run_timer_task(current_duration, current_interval))
|
|
129
|
-
logger.info(f"Timer started for {current_duration}s, events every {current_interval}s.")
|
|
130
|
-
|
|
131
|
-
async def _run_timer_task(self, duration: int, interval: int) -> None:
|
|
132
|
-
remaining_time = duration
|
|
133
|
-
try:
|
|
134
|
-
while remaining_time > 0:
|
|
135
|
-
self.emit(EventType.TIMER_UPDATE, remaining_time=remaining_time)
|
|
136
|
-
await asyncio.sleep(min(interval, remaining_time))
|
|
137
|
-
remaining_time -= interval
|
|
138
|
-
self.emit(EventType.TIMER_UPDATE, remaining_time=0)
|
|
139
|
-
except asyncio.CancelledError:
|
|
140
|
-
logger.info("Timer task was cancelled.")
|
|
141
|
-
self.emit(EventType.TIMER_UPDATE, remaining_time=-1, status="cancelled")
|
|
142
|
-
raise
|
|
143
|
-
finally:
|
|
144
|
-
self._is_running = False
|
|
145
|
-
logger.info("Timer task finished.")
|
|
146
|
-
|
|
147
|
-
async def _execute(self, context: 'AgentContext', duration: int, interval: Optional[int] = None) -> str:
|
|
148
|
-
logger.debug(f"Timer execute called by agent {context.agent_id} with duration: {duration}, interval: {interval}")
|
|
149
|
-
|
|
150
|
-
effective_interval = interval if interval is not None else self.interval
|
|
151
|
-
|
|
152
|
-
if self._task and not self._task.done():
|
|
153
|
-
logger.info("Cancelling previous timer task before starting a new one.")
|
|
154
|
-
self._task.cancel()
|
|
155
|
-
try:
|
|
156
|
-
await self._task
|
|
157
|
-
except asyncio.CancelledError:
|
|
158
|
-
logger.debug("Previous timer task successfully cancelled.")
|
|
159
|
-
self._task = None
|
|
160
|
-
|
|
161
|
-
self.start(run_duration=duration, run_interval=effective_interval)
|
|
162
|
-
return f"Timer started for {duration} seconds, emitting events every {effective_interval} seconds."
|
|
163
|
-
|
|
164
|
-
async def stop(self) -> None:
|
|
165
|
-
if self._task and not self._task.done():
|
|
166
|
-
logger.info("Stopping timer task...")
|
|
167
|
-
self._task.cancel()
|
|
168
|
-
try:
|
|
169
|
-
await self._task
|
|
170
|
-
except asyncio.CancelledError:
|
|
171
|
-
logger.info("Timer task stopped successfully.")
|
|
172
|
-
self._task = None
|
|
173
|
-
self._is_running = False
|
|
174
|
-
else:
|
|
175
|
-
logger.info("Stop called, but no timer task is running or task already done.")
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/tools/usage/parsers/__init__.py
|
|
2
|
-
"""
|
|
3
|
-
This package contains concrete parser classes that translate an LLM's raw response
|
|
4
|
-
text into structured ToolInvocation objects.
|
|
5
|
-
"""
|
|
6
|
-
from .base_parser import BaseToolUsageParser
|
|
7
|
-
from .provider_aware_tool_usage_parser import ProviderAwareToolUsageParser
|
|
8
|
-
from .default_xml_tool_usage_parser import DefaultXmlToolUsageParser
|
|
9
|
-
from .anthropic_xml_tool_usage_parser import AnthropicXmlToolUsageParser
|
|
10
|
-
from .default_json_tool_usage_parser import DefaultJsonToolUsageParser
|
|
11
|
-
from .openai_json_tool_usage_parser import OpenAiJsonToolUsageParser
|
|
12
|
-
from .gemini_json_tool_usage_parser import GeminiJsonToolUsageParser
|
|
13
|
-
|
|
14
|
-
__all__ = [
|
|
15
|
-
"BaseToolUsageParser",
|
|
16
|
-
"ProviderAwareToolUsageParser",
|
|
17
|
-
"DefaultXmlToolUsageParser",
|
|
18
|
-
"AnthropicXmlToolUsageParser",
|
|
19
|
-
"DefaultJsonToolUsageParser",
|
|
20
|
-
"OpenAiJsonToolUsageParser",
|
|
21
|
-
"GeminiJsonToolUsageParser",
|
|
22
|
-
]
|
|
@@ -1,99 +0,0 @@
|
|
|
1
|
-
import re
|
|
2
|
-
import logging
|
|
3
|
-
from typing import List
|
|
4
|
-
|
|
5
|
-
logger = logging.getLogger(__name__)
|
|
6
|
-
|
|
7
|
-
def _find_json_blobs(text: str) -> List[str]:
|
|
8
|
-
"""
|
|
9
|
-
Robustly finds and extracts all top-level JSON objects or arrays from a string,
|
|
10
|
-
maintaining their original order of appearance. It handles JSON within
|
|
11
|
-
markdown-style code blocks (```json ... ```) and inline JSON.
|
|
12
|
-
|
|
13
|
-
Args:
|
|
14
|
-
text: The string to search for JSON in.
|
|
15
|
-
|
|
16
|
-
Returns:
|
|
17
|
-
A list of strings, where each string is a valid-looking JSON blob,
|
|
18
|
-
ordered as they appeared in the input text.
|
|
19
|
-
"""
|
|
20
|
-
found_blobs = []
|
|
21
|
-
|
|
22
|
-
# 1. Find all markdown blobs first and store them with their start positions.
|
|
23
|
-
markdown_matches = list(re.finditer(r"```(?:json)?\s*([\s\S]+?)\s*```", text))
|
|
24
|
-
for match in markdown_matches:
|
|
25
|
-
content = match.group(1).strip()
|
|
26
|
-
found_blobs.append((match.start(), content))
|
|
27
|
-
|
|
28
|
-
# 2. Create a "masked" version of the text by replacing markdown blocks with spaces.
|
|
29
|
-
# This prevents the inline scanner from finding JSON inside them, while preserving indices.
|
|
30
|
-
masked_text_list = list(text)
|
|
31
|
-
for match in markdown_matches:
|
|
32
|
-
for i in range(match.start(), match.end()):
|
|
33
|
-
masked_text_list[i] = ' '
|
|
34
|
-
masked_text = "".join(masked_text_list)
|
|
35
|
-
|
|
36
|
-
# 3. Scan the masked text for any other JSON using a single pass brace-counter.
|
|
37
|
-
idx = 0
|
|
38
|
-
while idx < len(masked_text):
|
|
39
|
-
start_idx = -1
|
|
40
|
-
|
|
41
|
-
# Find the next opening brace or bracket
|
|
42
|
-
next_brace = masked_text.find('{', idx)
|
|
43
|
-
next_bracket = masked_text.find('[', idx)
|
|
44
|
-
|
|
45
|
-
if next_brace == -1 and next_bracket == -1:
|
|
46
|
-
break # No more JSON starts
|
|
47
|
-
|
|
48
|
-
if next_brace != -1 and (next_bracket == -1 or next_brace < next_bracket):
|
|
49
|
-
start_idx = next_brace
|
|
50
|
-
start_char, end_char = '{', '}'
|
|
51
|
-
else:
|
|
52
|
-
start_idx = next_bracket
|
|
53
|
-
start_char, end_char = '[', ']'
|
|
54
|
-
|
|
55
|
-
brace_count = 1
|
|
56
|
-
in_string = False
|
|
57
|
-
is_escaped = False
|
|
58
|
-
end_idx = -1
|
|
59
|
-
|
|
60
|
-
for i in range(start_idx + 1, len(masked_text)):
|
|
61
|
-
char = masked_text[i]
|
|
62
|
-
|
|
63
|
-
if in_string:
|
|
64
|
-
if is_escaped:
|
|
65
|
-
is_escaped = False
|
|
66
|
-
elif char == '\\':
|
|
67
|
-
is_escaped = True
|
|
68
|
-
elif char == '"':
|
|
69
|
-
in_string = False
|
|
70
|
-
else:
|
|
71
|
-
if char == '"':
|
|
72
|
-
in_string = True
|
|
73
|
-
is_escaped = False
|
|
74
|
-
elif char == '{' or char == '[':
|
|
75
|
-
brace_count += 1
|
|
76
|
-
elif char == '}' or char == ']':
|
|
77
|
-
brace_count -= 1
|
|
78
|
-
|
|
79
|
-
if brace_count == 0:
|
|
80
|
-
if (start_char == '{' and char == '}') or \
|
|
81
|
-
(start_char == '[' and char == ']'):
|
|
82
|
-
end_idx = i
|
|
83
|
-
break
|
|
84
|
-
|
|
85
|
-
if end_idx != -1:
|
|
86
|
-
# We found a blob in the masked text, so its indices are correct
|
|
87
|
-
# for the original text. Extract the blob from the original text.
|
|
88
|
-
blob = text[start_idx : end_idx + 1]
|
|
89
|
-
found_blobs.append((start_idx, blob))
|
|
90
|
-
idx = end_idx + 1
|
|
91
|
-
else:
|
|
92
|
-
# No matching end brace found, move on from the start character.
|
|
93
|
-
idx = start_idx + 1
|
|
94
|
-
|
|
95
|
-
# 4. Sort all found blobs by their start position to ensure correct order
|
|
96
|
-
found_blobs.sort(key=lambda item: item[0])
|
|
97
|
-
|
|
98
|
-
# 5. Return only the content of the blobs
|
|
99
|
-
return [content for _, content in found_blobs]
|
|
@@ -1,18 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/tools/usage/parsers/_string_decoders.py
|
|
2
|
-
"""Utility helpers for normalizing string content inside parsed tool payloads."""
|
|
3
|
-
|
|
4
|
-
from __future__ import annotations
|
|
5
|
-
|
|
6
|
-
import html
|
|
7
|
-
from typing import Any
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
def decode_html_entities(data: Any) -> Any:
|
|
11
|
-
"""Recursively decode HTML/XML entities in strings within a data structure."""
|
|
12
|
-
if isinstance(data, dict):
|
|
13
|
-
return {key: decode_html_entities(value) for key, value in data.items()}
|
|
14
|
-
if isinstance(data, list):
|
|
15
|
-
return [decode_html_entities(item) for item in data]
|
|
16
|
-
if isinstance(data, str):
|
|
17
|
-
return html.unescape(data)
|
|
18
|
-
return data
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py
|
|
2
|
-
from .default_xml_tool_usage_parser import DefaultXmlToolUsageParser
|
|
3
|
-
|
|
4
|
-
class AnthropicXmlToolUsageParser(DefaultXmlToolUsageParser):
|
|
5
|
-
"""
|
|
6
|
-
Parser for Anthropic models. Anthropic uses XML for tool calls,
|
|
7
|
-
so this is an alias for the default XML parser.
|
|
8
|
-
"""
|
|
9
|
-
def get_name(self) -> str:
|
|
10
|
-
return "anthropic_xml_tool_usage_parser"
|
|
@@ -1,41 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/tools/usage/parsers/base_parser.py
|
|
2
|
-
import logging
|
|
3
|
-
from abc import ABC, abstractmethod
|
|
4
|
-
from typing import List, TYPE_CHECKING
|
|
5
|
-
|
|
6
|
-
if TYPE_CHECKING:
|
|
7
|
-
from autobyteus.agent.tool_invocation import ToolInvocation
|
|
8
|
-
from autobyteus.llm.utils.response_types import CompleteResponse
|
|
9
|
-
|
|
10
|
-
logger = logging.getLogger(__name__)
|
|
11
|
-
|
|
12
|
-
class BaseToolUsageParser(ABC):
|
|
13
|
-
"""
|
|
14
|
-
Abstract base class for parsing tool usage from an LLM's response text.
|
|
15
|
-
These parsers are responsible for extracting structured tool call information.
|
|
16
|
-
"""
|
|
17
|
-
|
|
18
|
-
def get_name(self) -> str:
|
|
19
|
-
"""
|
|
20
|
-
Returns the unique name for this parser.
|
|
21
|
-
Defaults to the class name.
|
|
22
|
-
"""
|
|
23
|
-
return self.__class__.__name__
|
|
24
|
-
|
|
25
|
-
@abstractmethod
|
|
26
|
-
def parse(self, response: 'CompleteResponse') -> List['ToolInvocation']:
|
|
27
|
-
"""
|
|
28
|
-
Parses the LLM's response. If actionable tool calls are found,
|
|
29
|
-
this method should return a list of ToolInvocation objects.
|
|
30
|
-
|
|
31
|
-
Args:
|
|
32
|
-
response: The CompleteResponse object from the LLM.
|
|
33
|
-
|
|
34
|
-
Returns:
|
|
35
|
-
A list of ToolInvocation objects. Returns an empty list if no
|
|
36
|
-
valid tool calls are found.
|
|
37
|
-
"""
|
|
38
|
-
raise NotImplementedError("Subclasses must implement the 'parse' method.")
|
|
39
|
-
|
|
40
|
-
def __repr__(self) -> str:
|
|
41
|
-
return f"<{self.__class__.__name__}>"
|
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py
|
|
2
|
-
import json
|
|
3
|
-
import logging
|
|
4
|
-
from typing import Dict, Any, TYPE_CHECKING, List
|
|
5
|
-
|
|
6
|
-
from ._string_decoders import decode_html_entities
|
|
7
|
-
|
|
8
|
-
from autobyteus.agent.tool_invocation import ToolInvocation
|
|
9
|
-
from .base_parser import BaseToolUsageParser
|
|
10
|
-
from .exceptions import ToolUsageParseException
|
|
11
|
-
from ._json_extractor import _find_json_blobs
|
|
12
|
-
|
|
13
|
-
if TYPE_CHECKING:
|
|
14
|
-
from autobyteus.llm.utils.response_types import CompleteResponse
|
|
15
|
-
|
|
16
|
-
logger = logging.getLogger(__name__)
|
|
17
|
-
|
|
18
|
-
class DefaultJsonToolUsageParser(BaseToolUsageParser):
|
|
19
|
-
"""
|
|
20
|
-
A default parser for tool usage commands formatted as custom JSON.
|
|
21
|
-
It robustly extracts potential JSON blobs and expects a 'tool' object
|
|
22
|
-
with 'function' and 'parameters' keys.
|
|
23
|
-
"""
|
|
24
|
-
def get_name(self) -> str:
|
|
25
|
-
return "default_json_tool_usage_parser"
|
|
26
|
-
|
|
27
|
-
def parse(self, response: 'CompleteResponse') -> List[ToolInvocation]:
|
|
28
|
-
response_text = response.content
|
|
29
|
-
json_blobs = _find_json_blobs(response_text)
|
|
30
|
-
if not json_blobs:
|
|
31
|
-
return []
|
|
32
|
-
|
|
33
|
-
invocations: List[ToolInvocation] = []
|
|
34
|
-
for blob in json_blobs:
|
|
35
|
-
try:
|
|
36
|
-
data = json.loads(blob)
|
|
37
|
-
|
|
38
|
-
# This parser specifically looks for the {"tool": {...}} structure.
|
|
39
|
-
if isinstance(data, dict) and "tool" in data:
|
|
40
|
-
tool_block = data.get("tool")
|
|
41
|
-
if not isinstance(tool_block, dict):
|
|
42
|
-
continue
|
|
43
|
-
|
|
44
|
-
tool_name = tool_block.get("function")
|
|
45
|
-
arguments = tool_block.get("parameters")
|
|
46
|
-
|
|
47
|
-
if not tool_name or not isinstance(tool_name, str):
|
|
48
|
-
logger.debug(f"Skipping malformed tool block (missing or invalid 'function'): {tool_block}")
|
|
49
|
-
continue
|
|
50
|
-
|
|
51
|
-
if arguments is None:
|
|
52
|
-
arguments = {}
|
|
53
|
-
|
|
54
|
-
if not isinstance(arguments, dict):
|
|
55
|
-
logger.debug(f"Skipping tool block with invalid 'parameters' type ({type(arguments)}): {tool_block}")
|
|
56
|
-
continue
|
|
57
|
-
|
|
58
|
-
decoded_arguments = decode_html_entities(arguments)
|
|
59
|
-
decoded_tool_name = decode_html_entities(tool_name)
|
|
60
|
-
try:
|
|
61
|
-
# Pass id=None to trigger deterministic ID generation.
|
|
62
|
-
tool_invocation = ToolInvocation(
|
|
63
|
-
name=decoded_tool_name,
|
|
64
|
-
arguments=decoded_arguments,
|
|
65
|
-
id=None,
|
|
66
|
-
)
|
|
67
|
-
invocations.append(tool_invocation)
|
|
68
|
-
logger.info(f"Successfully parsed default JSON tool invocation for '{tool_name}'.")
|
|
69
|
-
except Exception as e:
|
|
70
|
-
logger.error(f"Unexpected error creating ToolInvocation for tool '{tool_name}': {e}", exc_info=True)
|
|
71
|
-
|
|
72
|
-
except json.JSONDecodeError:
|
|
73
|
-
logger.debug(f"Could not parse extracted text as JSON in {self.get_name()}. Blob: {blob[:200]}")
|
|
74
|
-
# This is likely not a tool call, so we can ignore it.
|
|
75
|
-
continue
|
|
76
|
-
except Exception as e:
|
|
77
|
-
# If we're here, it's likely a valid JSON but with unexpected structure.
|
|
78
|
-
# It's safer to raise this for upstream handling.
|
|
79
|
-
error_msg = f"Unexpected error while parsing JSON blob in {self.get_name()}: {e}. Blob: {blob[:200]}"
|
|
80
|
-
logger.error(error_msg, exc_info=True)
|
|
81
|
-
raise ToolUsageParseException(error_msg, original_exception=e)
|
|
82
|
-
|
|
83
|
-
return invocations
|