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
examples/run_poem_writer.py
DELETED
|
@@ -1,284 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/examples/run_poem_writer.py
|
|
2
|
-
import asyncio
|
|
3
|
-
import logging
|
|
4
|
-
import argparse
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
import sys
|
|
7
|
-
import os
|
|
8
|
-
from typing import Optional
|
|
9
|
-
|
|
10
|
-
# Ensure the autobyteus package is discoverable
|
|
11
|
-
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
12
|
-
PACKAGE_ROOT = SCRIPT_DIR.parent
|
|
13
|
-
sys.path.insert(0, str(PACKAGE_ROOT))
|
|
14
|
-
|
|
15
|
-
# Also add the server package root to resolve workspace imports
|
|
16
|
-
SERVER_PACKAGE_ROOT = PACKAGE_ROOT.parent / "autobyteus-server"
|
|
17
|
-
if SERVER_PACKAGE_ROOT.exists() and str(SERVER_PACKAGE_ROOT) not in sys.path:
|
|
18
|
-
sys.path.insert(0, str(SERVER_PACKAGE_ROOT))
|
|
19
|
-
|
|
20
|
-
# Load environment variables from .env file in the project root
|
|
21
|
-
try:
|
|
22
|
-
from dotenv import load_dotenv
|
|
23
|
-
env_file_path = PACKAGE_ROOT / ".env"
|
|
24
|
-
if env_file_path.exists():
|
|
25
|
-
load_dotenv(env_file_path)
|
|
26
|
-
print(f"Loaded environment variables from: {env_file_path}")
|
|
27
|
-
else:
|
|
28
|
-
print(f"No .env file found at: {env_file_path}")
|
|
29
|
-
except ImportError: # pragma: no cover
|
|
30
|
-
print("Warning: python-dotenv not installed. Environment variables from .env file will not be loaded.")
|
|
31
|
-
print("Install with: pip install python-dotenv")
|
|
32
|
-
except Exception as e: # pragma: no cover
|
|
33
|
-
print(f"Error loading .env file: {e}")
|
|
34
|
-
|
|
35
|
-
try:
|
|
36
|
-
# Import autobyteus components from the current implementation
|
|
37
|
-
from autobyteus.agent.context.agent_config import AgentConfig
|
|
38
|
-
from autobyteus.llm.models import LLMModel
|
|
39
|
-
from autobyteus.llm.llm_factory import default_llm_factory, LLMFactory
|
|
40
|
-
from autobyteus.agent.factory.agent_factory import AgentFactory
|
|
41
|
-
from autobyteus.cli import agent_cli
|
|
42
|
-
from autobyteus.tools.file.write_file import write_file
|
|
43
|
-
# Import core workspace and schema components from the library
|
|
44
|
-
from autobyteus.agent.workspace import BaseAgentWorkspace, WorkspaceConfig
|
|
45
|
-
from autobyteus.utils.parameter_schema import ParameterSchema, ParameterDefinition, ParameterType
|
|
46
|
-
except ImportError as e: # pragma: no cover
|
|
47
|
-
print(f"Error importing autobyteus components: {e}")
|
|
48
|
-
print("Please ensure that the autobyteus and autobyteus-server libraries are installed and accessible in your PYTHONPATH.")
|
|
49
|
-
print(f"Attempted to add to sys.path: {str(PACKAGE_ROOT)} and {str(SERVER_PACKAGE_ROOT)}")
|
|
50
|
-
sys.exit(1)
|
|
51
|
-
|
|
52
|
-
# --- Minimal, Self-Contained Workspace for this Example ---
|
|
53
|
-
class SimpleLocalWorkspace(BaseAgentWorkspace):
|
|
54
|
-
"""A minimal, self-contained workspace for local file system access, for example scripts."""
|
|
55
|
-
|
|
56
|
-
def __init__(self, config: WorkspaceConfig):
|
|
57
|
-
super().__init__(config)
|
|
58
|
-
self.root_path: str = config.get("root_path")
|
|
59
|
-
if not self.root_path:
|
|
60
|
-
raise ValueError("SimpleLocalWorkspace requires a 'root_path' in its config.")
|
|
61
|
-
|
|
62
|
-
def get_base_path(self) -> str:
|
|
63
|
-
return self.root_path
|
|
64
|
-
|
|
65
|
-
@classmethod
|
|
66
|
-
def get_workspace_type_name(cls) -> str:
|
|
67
|
-
return "simple_local_example_workspace"
|
|
68
|
-
|
|
69
|
-
@classmethod
|
|
70
|
-
def get_description(cls) -> str:
|
|
71
|
-
return "A basic workspace for local file access within an example script."
|
|
72
|
-
|
|
73
|
-
@classmethod
|
|
74
|
-
def get_config_schema(cls) -> ParameterSchema:
|
|
75
|
-
schema = ParameterSchema()
|
|
76
|
-
schema.add_parameter(ParameterDefinition(
|
|
77
|
-
name="root_path",
|
|
78
|
-
param_type=ParameterType.STRING,
|
|
79
|
-
description="The absolute local file path for the workspace root.",
|
|
80
|
-
required=True
|
|
81
|
-
))
|
|
82
|
-
return schema
|
|
83
|
-
|
|
84
|
-
# Logger for this script
|
|
85
|
-
logger = logging.getLogger("run_poem_writer")
|
|
86
|
-
# Logger for interactive CLI output
|
|
87
|
-
interactive_logger = logging.getLogger("autobyteus.cli.interactive")
|
|
88
|
-
|
|
89
|
-
def setup_logging(args: argparse.Namespace):
|
|
90
|
-
"""
|
|
91
|
-
Configure logging for the interactive session.
|
|
92
|
-
"""
|
|
93
|
-
# --- Clear existing handlers from all relevant loggers ---
|
|
94
|
-
loggers_to_clear = [
|
|
95
|
-
logging.getLogger(), # Root logger
|
|
96
|
-
logging.getLogger("autobyteus"),
|
|
97
|
-
logging.getLogger("autobyteus-server"),
|
|
98
|
-
logging.getLogger("autobyteus.cli"),
|
|
99
|
-
logging.getLogger("autobyteus.cli.interactive"),
|
|
100
|
-
]
|
|
101
|
-
for l in loggers_to_clear:
|
|
102
|
-
if l.hasHandlers():
|
|
103
|
-
for handler in l.handlers[:]:
|
|
104
|
-
l.removeHandler(handler)
|
|
105
|
-
if hasattr(handler, 'close'): handler.close()
|
|
106
|
-
|
|
107
|
-
script_log_level = logging.DEBUG if args.debug else logging.INFO
|
|
108
|
-
|
|
109
|
-
# --- 1. Handler for unformatted interactive output (replicates print) ---
|
|
110
|
-
interactive_handler = logging.StreamHandler(sys.stdout)
|
|
111
|
-
interactive_logger.addHandler(interactive_handler)
|
|
112
|
-
interactive_logger.setLevel(logging.INFO)
|
|
113
|
-
interactive_logger.propagate = False
|
|
114
|
-
|
|
115
|
-
# --- 2. Handler for formatted console logs (script + CLI debug) ---
|
|
116
|
-
console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
|
|
117
|
-
|
|
118
|
-
class FormattedConsoleFilter(logging.Filter):
|
|
119
|
-
def filter(self, record):
|
|
120
|
-
if record.name.startswith("run_poem_writer") or record.name.startswith("autobyteus.cli"):
|
|
121
|
-
return True
|
|
122
|
-
if record.levelno >= logging.CRITICAL:
|
|
123
|
-
return True
|
|
124
|
-
return False
|
|
125
|
-
|
|
126
|
-
formatted_console_handler = logging.StreamHandler(sys.stdout)
|
|
127
|
-
formatted_console_handler.setFormatter(console_formatter)
|
|
128
|
-
formatted_console_handler.addFilter(FormattedConsoleFilter())
|
|
129
|
-
|
|
130
|
-
root_logger = logging.getLogger()
|
|
131
|
-
root_logger.addHandler(formatted_console_handler)
|
|
132
|
-
root_logger.setLevel(script_log_level)
|
|
133
|
-
|
|
134
|
-
# --- 3. Handler for the main agent log file ---
|
|
135
|
-
log_file_path = Path(args.agent_log_file).resolve()
|
|
136
|
-
log_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
137
|
-
|
|
138
|
-
agent_file_handler = logging.FileHandler(log_file_path, mode='w')
|
|
139
|
-
agent_file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s:%(lineno)d - %(message)s')
|
|
140
|
-
agent_file_handler.setFormatter(agent_file_formatter)
|
|
141
|
-
file_log_level = logging.DEBUG if args.debug else logging.INFO
|
|
142
|
-
|
|
143
|
-
# --- 4. Configure `autobyteus` package logging ---
|
|
144
|
-
autobyteus_logger = logging.getLogger("autobyteus")
|
|
145
|
-
autobyteus_logger.addHandler(agent_file_handler)
|
|
146
|
-
autobyteus_logger.setLevel(file_log_level)
|
|
147
|
-
autobyteus_logger.propagate = True
|
|
148
|
-
|
|
149
|
-
# --- 5. Isolate noisy queue manager logs to a separate file in debug mode ---
|
|
150
|
-
if args.debug:
|
|
151
|
-
queue_log_file_path = Path("./queue_logs.txt").resolve()
|
|
152
|
-
|
|
153
|
-
queue_file_handler = logging.FileHandler(queue_log_file_path, mode='w')
|
|
154
|
-
queue_file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
|
|
155
|
-
queue_file_handler.setFormatter(queue_file_formatter)
|
|
156
|
-
|
|
157
|
-
queue_logger = logging.getLogger("autobyteus.agent.events.agent_input_event_queue_manager")
|
|
158
|
-
|
|
159
|
-
queue_logger.setLevel(logging.DEBUG)
|
|
160
|
-
queue_logger.addHandler(queue_file_handler)
|
|
161
|
-
queue_logger.propagate = False
|
|
162
|
-
|
|
163
|
-
logger.info(f"Debug mode: Redirecting noisy queue manager DEBUG logs to: {queue_log_file_path}")
|
|
164
|
-
|
|
165
|
-
# --- 6. Configure `autobyteus.cli` package logging ---
|
|
166
|
-
cli_logger = logging.getLogger("autobyteus.cli")
|
|
167
|
-
cli_logger.setLevel(script_log_level)
|
|
168
|
-
cli_logger.propagate = True
|
|
169
|
-
|
|
170
|
-
logger.info(f"Core library logs (excluding CLI) redirected to: {log_file_path} (level: {logging.getLevelName(file_log_level)})")
|
|
171
|
-
|
|
172
|
-
async def main(args: argparse.Namespace):
|
|
173
|
-
"""Main function to configure and run the PoemWriterAgent."""
|
|
174
|
-
|
|
175
|
-
workspace_base_path = Path(args.output_dir).resolve()
|
|
176
|
-
workspace_base_path.mkdir(parents=True, exist_ok=True)
|
|
177
|
-
logger.info(f"Agent will be configured with a local workspace at: {workspace_base_path}")
|
|
178
|
-
|
|
179
|
-
# The write_file tool is an instance ready to be used
|
|
180
|
-
tools_for_agent = [write_file]
|
|
181
|
-
|
|
182
|
-
# UPDATED: The system prompt now provides context about the workspace.
|
|
183
|
-
system_prompt = (
|
|
184
|
-
f"You are a world-class poet working inside a dedicated file workspace. Your task is to write a creative and beautiful poem on the given topic.\n"
|
|
185
|
-
f"After composing the poem, you MUST use the available tool to save your work. Because you are in a workspace, you only need to provide a relative path; simply use the filename '{args.poem_filename}'.\n"
|
|
186
|
-
f"Conclude your response with only the tool call necessary to save the poem.\n\n"
|
|
187
|
-
f"Here is the manifest of tools available to you, including their definitions and examples:\n"
|
|
188
|
-
f"{{{{tools}}}}"
|
|
189
|
-
)
|
|
190
|
-
|
|
191
|
-
try:
|
|
192
|
-
# Validate the LLM model name
|
|
193
|
-
_ = LLMModel[args.llm_model]
|
|
194
|
-
except (ValueError, KeyError):
|
|
195
|
-
logger.error(f"LLM Model '{args.llm_model}' is not valid or is ambiguous.", file=sys.stderr)
|
|
196
|
-
try:
|
|
197
|
-
LLMFactory.ensure_initialized()
|
|
198
|
-
print("\nAvailable LLM Models (use the 'Identifier' with --llm-model):")
|
|
199
|
-
all_models = sorted(list(LLMModel), key=lambda m: m.model_identifier)
|
|
200
|
-
if not all_models:
|
|
201
|
-
print(" No models found.")
|
|
202
|
-
for model in all_models:
|
|
203
|
-
print(f" - Display Name: {model.name:<30} Identifier: {model.model_identifier}")
|
|
204
|
-
except Exception as e:
|
|
205
|
-
print(f"Additionally, an error occurred while listing models: {e}", file=sys.stderr)
|
|
206
|
-
sys.exit(1)
|
|
207
|
-
|
|
208
|
-
logger.info(f"Creating LLM instance for model: {args.llm_model}")
|
|
209
|
-
llm_instance = default_llm_factory.create_llm(model_identifier=args.llm_model)
|
|
210
|
-
|
|
211
|
-
# --- Create and configure the workspace using the self-contained class ---
|
|
212
|
-
logger.info(f"Configuring SimpleLocalWorkspace with root path: {str(workspace_base_path)}")
|
|
213
|
-
workspace_config = WorkspaceConfig(params={"root_path": str(workspace_base_path)})
|
|
214
|
-
workspace = SimpleLocalWorkspace(config=workspace_config)
|
|
215
|
-
|
|
216
|
-
# Create the single, unified AgentConfig object
|
|
217
|
-
poem_writer_config = AgentConfig(
|
|
218
|
-
name="PoemWriterAgent",
|
|
219
|
-
role="CreativePoet",
|
|
220
|
-
description="An agent that writes poems and saves them to disk.",
|
|
221
|
-
llm_instance=llm_instance,
|
|
222
|
-
system_prompt=system_prompt,
|
|
223
|
-
tools=tools_for_agent,
|
|
224
|
-
workspace=workspace,
|
|
225
|
-
auto_execute_tools=False
|
|
226
|
-
)
|
|
227
|
-
|
|
228
|
-
# Use the AgentFactory to create the agent
|
|
229
|
-
agent = AgentFactory().create_agent(config=poem_writer_config)
|
|
230
|
-
logger.info(f"Agent instance created: {agent.agent_id}")
|
|
231
|
-
|
|
232
|
-
try:
|
|
233
|
-
logger.info(f"Starting interactive session for agent {agent.agent_id} via agent_cli.run()...")
|
|
234
|
-
await agent_cli.run(
|
|
235
|
-
agent=agent
|
|
236
|
-
)
|
|
237
|
-
logger.info(f"Interactive session for agent {agent.agent_id} finished.")
|
|
238
|
-
except KeyboardInterrupt:
|
|
239
|
-
logger.info("KeyboardInterrupt received during interactive session. agent_cli.run should handle shutdown.")
|
|
240
|
-
except Exception as e:
|
|
241
|
-
logger.error(f"An error occurred during the agent interaction: {e}", exc_info=True)
|
|
242
|
-
finally:
|
|
243
|
-
logger.info("Poem writer script finished.")
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
if __name__ == "__main__": # pragma: no cover
|
|
247
|
-
parser = argparse.ArgumentParser(description="Run the PoemWriterAgent interactively to generate and save poems.")
|
|
248
|
-
parser.add_argument("--topic", type=str, default=None, help="Optional: The initial topic for the first poem.")
|
|
249
|
-
parser.add_argument("--output-dir", type=str, default="./poem_writer_output", help="Directory to save the poem(s). Defaults to './poem_writer_output'.")
|
|
250
|
-
parser.add_argument("--poem-filename", type=str, default="poem_interactive.txt", help="Filename for the saved poem.")
|
|
251
|
-
parser.add_argument("--llm-model", type=str, default="gpt-4o", help=f"The LLM model identifier to use. Call --help-models for list.")
|
|
252
|
-
parser.add_argument("--help-models", action="store_true", help="Display available LLM models and exit.")
|
|
253
|
-
parser.add_argument("--debug", action="store_true", help="Enable debug logging. This will create detailed agent_logs.txt and a separate queue_logs.txt for noisy logs.")
|
|
254
|
-
parser.add_argument("--no-tool-logs", action="store_true",
|
|
255
|
-
help="Disable display of [Tool Log (...)] messages on the console by the agent_cli.")
|
|
256
|
-
|
|
257
|
-
parser.add_argument("--agent-log-file", type=str, default="./agent_logs.txt",
|
|
258
|
-
help="Path to the log file for autobyteus.* library logs. (Default: ./agent_logs.txt)")
|
|
259
|
-
|
|
260
|
-
if "--help-models" in sys.argv:
|
|
261
|
-
try:
|
|
262
|
-
LLMFactory.ensure_initialized()
|
|
263
|
-
print("Available LLM Models (use the 'Identifier' with --llm-model):")
|
|
264
|
-
all_models = sorted(list(LLMModel), key=lambda m: m.model_identifier)
|
|
265
|
-
if not all_models:
|
|
266
|
-
print(" No models found.")
|
|
267
|
-
for model in all_models:
|
|
268
|
-
print(f" - Display Name: {model.name:<30} Identifier: {model.model_identifier}")
|
|
269
|
-
except Exception as e:
|
|
270
|
-
print(f"Error listing models: {e}")
|
|
271
|
-
sys.exit(0)
|
|
272
|
-
|
|
273
|
-
parsed_args = parser.parse_args()
|
|
274
|
-
|
|
275
|
-
setup_logging(parsed_args)
|
|
276
|
-
|
|
277
|
-
try:
|
|
278
|
-
asyncio.run(main(parsed_args))
|
|
279
|
-
except KeyboardInterrupt:
|
|
280
|
-
logger.info("Script interrupted by user (KeyboardInterrupt at top level).")
|
|
281
|
-
except Exception as e_global:
|
|
282
|
-
logger.error(f"Unhandled global exception in script: {e_global}", exc_info=True)
|
|
283
|
-
finally:
|
|
284
|
-
logger.info("Exiting script.")
|
examples/run_sqlite_agent.py
DELETED
|
@@ -1,295 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/examples/run_sqlite_agent.py
|
|
2
|
-
import asyncio
|
|
3
|
-
import logging
|
|
4
|
-
import argparse
|
|
5
|
-
from pathlib import Path
|
|
6
|
-
import sys
|
|
7
|
-
import os
|
|
8
|
-
|
|
9
|
-
# --- Boilerplate to make the script runnable from the project root ---
|
|
10
|
-
SCRIPT_DIR = Path(__file__).resolve().parent
|
|
11
|
-
PACKAGE_ROOT = SCRIPT_DIR.parent
|
|
12
|
-
if str(PACKAGE_ROOT) not in sys.path:
|
|
13
|
-
sys.path.insert(0, str(PACKAGE_ROOT))
|
|
14
|
-
|
|
15
|
-
# Load environment variables from .env file in the project root
|
|
16
|
-
try:
|
|
17
|
-
from dotenv import load_dotenv
|
|
18
|
-
env_file_path = PACKAGE_ROOT / ".env"
|
|
19
|
-
if env_file_path.exists():
|
|
20
|
-
load_dotenv(env_file_path)
|
|
21
|
-
print(f"Loaded environment variables from: {env_file_path}")
|
|
22
|
-
else:
|
|
23
|
-
print(f"Info: No .env file found at: {env_file_path}. Relying on exported environment variables.")
|
|
24
|
-
except ImportError:
|
|
25
|
-
print("Warning: python-dotenv not installed. Cannot load .env file.")
|
|
26
|
-
|
|
27
|
-
# --- Imports for the SQLite Agent Example ---
|
|
28
|
-
try:
|
|
29
|
-
# For MCP Tool Integration
|
|
30
|
-
from autobyteus.tools.mcp import McpToolRegistrar
|
|
31
|
-
from autobyteus.tools.registry import default_tool_registry
|
|
32
|
-
|
|
33
|
-
# For Agent creation
|
|
34
|
-
from autobyteus.agent.context.agent_config import AgentConfig
|
|
35
|
-
from autobyteus.llm.models import LLMModel
|
|
36
|
-
from autobyteus.llm.llm_factory import default_llm_factory, LLMFactory
|
|
37
|
-
from autobyteus.agent.factory.agent_factory import AgentFactory
|
|
38
|
-
from autobyteus.cli import agent_cli
|
|
39
|
-
except ImportError as e:
|
|
40
|
-
print(f"Error importing autobyteus components: {e}", file=sys.stderr)
|
|
41
|
-
print("Please ensure that the autobyteus library is installed and accessible.", file=sys.stderr)
|
|
42
|
-
sys.exit(1)
|
|
43
|
-
|
|
44
|
-
# --- Logging Setup ---
|
|
45
|
-
logger = logging.getLogger("sqlite_agent_example")
|
|
46
|
-
interactive_logger = logging.getLogger("autobyteus.cli.interactive")
|
|
47
|
-
|
|
48
|
-
def setup_logging(args: argparse.Namespace):
|
|
49
|
-
"""
|
|
50
|
-
Configures logging for the interactive session.
|
|
51
|
-
"""
|
|
52
|
-
loggers_to_clear = [
|
|
53
|
-
logging.getLogger(),
|
|
54
|
-
logging.getLogger("autobyteus"),
|
|
55
|
-
logging.getLogger("autobyteus.cli"),
|
|
56
|
-
interactive_logger,
|
|
57
|
-
]
|
|
58
|
-
for l in loggers_to_clear:
|
|
59
|
-
if l.hasHandlers():
|
|
60
|
-
for handler in l.handlers[:]:
|
|
61
|
-
l.removeHandler(handler)
|
|
62
|
-
if hasattr(handler, 'close'): handler.close()
|
|
63
|
-
|
|
64
|
-
script_log_level = logging.DEBUG if args.debug else logging.INFO
|
|
65
|
-
|
|
66
|
-
# 1. Handler for unformatted interactive output
|
|
67
|
-
interactive_handler = logging.StreamHandler(sys.stdout)
|
|
68
|
-
interactive_logger.addHandler(interactive_handler)
|
|
69
|
-
interactive_logger.setLevel(logging.INFO)
|
|
70
|
-
interactive_logger.propagate = False
|
|
71
|
-
|
|
72
|
-
# 2. Handler for formatted console logs
|
|
73
|
-
console_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
|
|
74
|
-
|
|
75
|
-
class FormattedConsoleFilter(logging.Filter):
|
|
76
|
-
def filter(self, record):
|
|
77
|
-
if record.name.startswith("sqlite_agent_example") or record.name.startswith("autobyteus.cli"):
|
|
78
|
-
return True
|
|
79
|
-
if record.levelno >= logging.CRITICAL:
|
|
80
|
-
return True
|
|
81
|
-
return False
|
|
82
|
-
|
|
83
|
-
formatted_console_handler = logging.StreamHandler(sys.stdout)
|
|
84
|
-
formatted_console_handler.setFormatter(console_formatter)
|
|
85
|
-
formatted_console_handler.addFilter(FormattedConsoleFilter())
|
|
86
|
-
|
|
87
|
-
root_logger = logging.getLogger()
|
|
88
|
-
root_logger.addHandler(formatted_console_handler)
|
|
89
|
-
root_logger.setLevel(script_log_level)
|
|
90
|
-
|
|
91
|
-
# 3. Handler for the main agent log file
|
|
92
|
-
log_file_path = Path(args.agent_log_file).resolve()
|
|
93
|
-
log_file_path.parent.mkdir(parents=True, exist_ok=True)
|
|
94
|
-
agent_file_handler = logging.FileHandler(log_file_path, mode='w')
|
|
95
|
-
agent_file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s:%(lineno)d - %(message)s')
|
|
96
|
-
agent_file_handler.setFormatter(agent_file_formatter)
|
|
97
|
-
file_log_level = logging.DEBUG if args.debug else logging.INFO
|
|
98
|
-
|
|
99
|
-
autobyteus_logger = logging.getLogger("autobyteus")
|
|
100
|
-
autobyteus_logger.addHandler(agent_file_handler)
|
|
101
|
-
autobyteus_logger.setLevel(file_log_level)
|
|
102
|
-
autobyteus_logger.propagate = True
|
|
103
|
-
|
|
104
|
-
# 4. Isolate noisy queue manager logs to a separate file in debug mode
|
|
105
|
-
if args.debug:
|
|
106
|
-
queue_log_file_path = Path(log_file_path.parent / f"{log_file_path.stem}_queue.log").resolve()
|
|
107
|
-
|
|
108
|
-
queue_file_handler = logging.FileHandler(queue_log_file_path, mode='w')
|
|
109
|
-
queue_file_formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(name)s - %(message)s')
|
|
110
|
-
queue_file_handler.setFormatter(queue_file_formatter)
|
|
111
|
-
|
|
112
|
-
queue_logger = logging.getLogger("autobyteus.agent.events.agent_input_event_queue_manager")
|
|
113
|
-
|
|
114
|
-
queue_logger.setLevel(logging.DEBUG)
|
|
115
|
-
queue_logger.addHandler(queue_file_handler)
|
|
116
|
-
queue_logger.propagate = False # IMPORTANT: Stop logs from bubbling up to the main agent_logs.txt
|
|
117
|
-
|
|
118
|
-
logger.info(f"Debug mode: Redirecting noisy queue manager DEBUG logs to: {queue_log_file_path}")
|
|
119
|
-
|
|
120
|
-
# 5. Configure `autobyteus.cli` package logging
|
|
121
|
-
cli_logger = logging.getLogger("autobyteus.cli")
|
|
122
|
-
cli_logger.setLevel(script_log_level)
|
|
123
|
-
cli_logger.propagate = True
|
|
124
|
-
|
|
125
|
-
logger.info(f"Core library logs (excluding CLI) redirected to: {log_file_path} (level: {logging.getLevelName(file_log_level)})")
|
|
126
|
-
|
|
127
|
-
# --- Environment Variable Checks ---
|
|
128
|
-
def check_required_env_vars():
|
|
129
|
-
"""Checks for environment variables required by this example and returns them."""
|
|
130
|
-
required_vars = {
|
|
131
|
-
"script_path": "TEST_SQLITE_MCP_SCRIPT_PATH",
|
|
132
|
-
"db_path": "TEST_SQLITE_DB_PATH",
|
|
133
|
-
}
|
|
134
|
-
env_values = {}
|
|
135
|
-
missing_vars = []
|
|
136
|
-
for key, var_name in required_vars.items():
|
|
137
|
-
value = os.environ.get(var_name)
|
|
138
|
-
if not value:
|
|
139
|
-
missing_vars.append(var_name)
|
|
140
|
-
else:
|
|
141
|
-
env_values[key] = value
|
|
142
|
-
if missing_vars:
|
|
143
|
-
logger.error("This example requires the following environment variables to be set: %s", missing_vars)
|
|
144
|
-
logger.error("Example usage in your .env file:")
|
|
145
|
-
logger.error('TEST_SQLITE_MCP_SCRIPT_PATH="/path/to/mcp-database-server/dist/src/index.js"')
|
|
146
|
-
logger.error('TEST_SQLITE_DB_PATH="/path/to/your/database.db"')
|
|
147
|
-
sys.exit(1)
|
|
148
|
-
|
|
149
|
-
script_path_obj = Path(env_values["script_path"])
|
|
150
|
-
if not script_path_obj.exists():
|
|
151
|
-
logger.error(f"The script path specified by TEST_SQLITE_MCP_SCRIPT_PATH does not exist: {script_path_obj}")
|
|
152
|
-
sys.exit(1)
|
|
153
|
-
|
|
154
|
-
db_path_obj = Path(env_values["db_path"])
|
|
155
|
-
if not db_path_obj.exists():
|
|
156
|
-
logger.error(f"The database path specified by TEST_SQLITE_DB_PATH does not exist: {db_path_obj}")
|
|
157
|
-
logger.error("Please ensure the database file is created before running the agent.")
|
|
158
|
-
sys.exit(1)
|
|
159
|
-
|
|
160
|
-
return env_values
|
|
161
|
-
|
|
162
|
-
async def main(args: argparse.Namespace):
|
|
163
|
-
"""Main function to configure and run the SQLiteAgent."""
|
|
164
|
-
logger.info("--- Starting SQLite Agent Example ---")
|
|
165
|
-
env_vars = check_required_env_vars()
|
|
166
|
-
|
|
167
|
-
# 1. Instantiate the core MCP and registry components.
|
|
168
|
-
tool_registry = default_tool_registry
|
|
169
|
-
registrar = McpToolRegistrar()
|
|
170
|
-
|
|
171
|
-
# 2. Define the configuration for the MCP server as a dictionary.
|
|
172
|
-
server_id = "sqlite-mcp"
|
|
173
|
-
sqlite_mcp_config_dict = {
|
|
174
|
-
server_id: {
|
|
175
|
-
"transport_type": "stdio",
|
|
176
|
-
"stdio_params": {
|
|
177
|
-
"command": "node",
|
|
178
|
-
"args": [
|
|
179
|
-
env_vars["script_path"],
|
|
180
|
-
env_vars["db_path"],
|
|
181
|
-
],
|
|
182
|
-
"env": {},
|
|
183
|
-
},
|
|
184
|
-
"enabled": True,
|
|
185
|
-
"tool_name_prefix": "sqlite",
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
|
|
189
|
-
try:
|
|
190
|
-
# 3. Discover and register tools by passing the config dictionary directly.
|
|
191
|
-
logger.info(f"Performing targeted discovery for remote SQLite tools from server: '{server_id}'...")
|
|
192
|
-
await registrar.load_and_register_server(config_dict=sqlite_mcp_config_dict)
|
|
193
|
-
logger.info("Remote tool registration complete.")
|
|
194
|
-
|
|
195
|
-
# 4. Create tool instances from the registry for our agent.
|
|
196
|
-
# Use the ToolRegistry to get tools by their source server ID.
|
|
197
|
-
sqlite_tool_defs = tool_registry.get_tools_by_mcp_server(server_id)
|
|
198
|
-
sqlite_tool_names = [tool_def.name for tool_def in sqlite_tool_defs]
|
|
199
|
-
|
|
200
|
-
if not sqlite_tool_names:
|
|
201
|
-
logger.error(f"No SQLite tools were found in the registry for server '{server_id}' after discovery. Cannot create agent.")
|
|
202
|
-
return
|
|
203
|
-
|
|
204
|
-
logger.info(f"Creating instances for registered SQLite tools: {sqlite_tool_names}")
|
|
205
|
-
tools_for_agent = [tool_registry.create_tool(name) for name in sqlite_tool_names]
|
|
206
|
-
|
|
207
|
-
# 5. Configure and create the agent.
|
|
208
|
-
try:
|
|
209
|
-
_ = LLMModel[args.llm_model]
|
|
210
|
-
except (KeyError, ValueError):
|
|
211
|
-
logger.error(f"LLM Model '{args.llm_model}' is not valid or ambiguous.", file=sys.stderr)
|
|
212
|
-
try:
|
|
213
|
-
LLMFactory.ensure_initialized()
|
|
214
|
-
print("\nAvailable LLM Models (use the 'Identifier' with --llm-model):")
|
|
215
|
-
all_models = sorted(list(LLMModel), key=lambda m: m.model_identifier)
|
|
216
|
-
if not all_models:
|
|
217
|
-
print(" No models found.")
|
|
218
|
-
for model in all_models:
|
|
219
|
-
print(f" - Display Name: {model.name:<30} Identifier: {model.model_identifier}")
|
|
220
|
-
except Exception as e:
|
|
221
|
-
print(f"Additionally, an error occurred while listing models: {e}", file=sys.stderr)
|
|
222
|
-
sys.exit(1)
|
|
223
|
-
|
|
224
|
-
logger.info(f"Creating LLM instance for model: {args.llm_model}")
|
|
225
|
-
llm_instance = default_llm_factory.create_llm(model_identifier=args.llm_model)
|
|
226
|
-
|
|
227
|
-
system_prompt = (
|
|
228
|
-
"You are a database administrator assistant. Your role is to help users interact with a SQLite database "
|
|
229
|
-
"by using a specialized set of tools.\n"
|
|
230
|
-
"When a user asks to query the database, you must formulate the correct SQL statement and use the appropriate tool to execute it.\n"
|
|
231
|
-
"If a user asks about the tables or their schemas, use the tools available for listing tables or describing their structure.\n"
|
|
232
|
-
"Always analyze the user's request carefully to determine the best tool and parameters for the job.\n\n"
|
|
233
|
-
"Here is the manifest of tools available to you, including their definitions and examples:\n"
|
|
234
|
-
"{{tools}}"
|
|
235
|
-
)
|
|
236
|
-
|
|
237
|
-
sqlite_agent_config = AgentConfig(
|
|
238
|
-
name="SQLiteAgent",
|
|
239
|
-
role="DatabaseAdministrator",
|
|
240
|
-
description="An agent that can query and manage a SQLite database using a set of remote tools.",
|
|
241
|
-
llm_instance=llm_instance,
|
|
242
|
-
system_prompt=system_prompt,
|
|
243
|
-
tools=tools_for_agent,
|
|
244
|
-
auto_execute_tools=False
|
|
245
|
-
)
|
|
246
|
-
|
|
247
|
-
agent = AgentFactory().create_agent(config=sqlite_agent_config)
|
|
248
|
-
logger.info(f"SQLite Agent instance created: {agent.agent_id}")
|
|
249
|
-
|
|
250
|
-
# 6. Run the agent in an interactive CLI session.
|
|
251
|
-
logger.info(f"Starting interactive session for agent {agent.agent_id}...")
|
|
252
|
-
await agent_cli.run(agent=agent)
|
|
253
|
-
logger.info(f"Interactive session for agent {agent.agent_id} finished.")
|
|
254
|
-
|
|
255
|
-
except Exception as e:
|
|
256
|
-
logger.error(f"An error occurred during the agent workflow: {e}", exc_info=True)
|
|
257
|
-
|
|
258
|
-
logger.info("--- SQLite Agent Example Finished ---")
|
|
259
|
-
|
|
260
|
-
if __name__ == "__main__":
|
|
261
|
-
parser = argparse.ArgumentParser(description="Run the SQLiteAgent interactively.")
|
|
262
|
-
parser.add_argument("--llm-model", type=str, default="kimi-latest", help=f"The LLM model identifier to use. Call --help-models for list.")
|
|
263
|
-
parser.add_argument("--help-models", action="store_true", help="Display available LLM models and exit.")
|
|
264
|
-
parser.add_argument("--debug", action="store_true", help="Enable debug logging.")
|
|
265
|
-
parser.add_argument("--agent-log-file", type=str, default="./agent_logs_sqlite.txt",
|
|
266
|
-
help="Path to the log file for autobyteus.* library logs. (Default: ./agent_logs_sqlite.txt)")
|
|
267
|
-
parser.add_argument("--no-tool-logs", action="store_true",
|
|
268
|
-
help="Disable display of [Tool Log (...)] messages on the console by the agent_cli.")
|
|
269
|
-
|
|
270
|
-
if "--help-models" in sys.argv:
|
|
271
|
-
try:
|
|
272
|
-
LLMFactory.ensure_initialized()
|
|
273
|
-
print("Available LLM Models (use the 'Identifier' with --llm-model):")
|
|
274
|
-
all_models = sorted(list(LLMModel), key=lambda m: m.model_identifier)
|
|
275
|
-
if not all_models:
|
|
276
|
-
print(" No models found.")
|
|
277
|
-
for model in all_models:
|
|
278
|
-
print(f" - Display Name: {model.name:<30} Identifier: {model.model_identifier}")
|
|
279
|
-
except Exception as e:
|
|
280
|
-
print(f"Error listing models: {e}")
|
|
281
|
-
sys.exit(0)
|
|
282
|
-
|
|
283
|
-
parsed_args = parser.parse_args()
|
|
284
|
-
|
|
285
|
-
setup_logging(parsed_args)
|
|
286
|
-
check_required_env_vars()
|
|
287
|
-
|
|
288
|
-
try:
|
|
289
|
-
asyncio.run(main(parsed_args))
|
|
290
|
-
except (KeyboardInterrupt, SystemExit):
|
|
291
|
-
logger.info("Script interrupted by user. Exiting.")
|
|
292
|
-
except Exception as e:
|
|
293
|
-
logger.error(f"An unhandled error occurred at the top level: {e}", exc_info=True)
|
|
294
|
-
finally:
|
|
295
|
-
logger.info("Exiting script.")
|
|
File without changes
|
|
File without changes
|
|
File without changes
|