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
|
@@ -1,287 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/examples/run_google_slides_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 Google Slides 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("google_slides_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("google_slides_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_GOOGLE_SLIDES_MCP_SCRIPT_PATH",
|
|
132
|
-
"google_client_id": "GOOGLE_CLIENT_ID",
|
|
133
|
-
"google_client_secret": "GOOGLE_CLIENT_SECRET",
|
|
134
|
-
"google_refresh_token": "GOOGLE_REFRESH_TOKEN",
|
|
135
|
-
}
|
|
136
|
-
env_values = {}
|
|
137
|
-
missing_vars = []
|
|
138
|
-
for key, var_name in required_vars.items():
|
|
139
|
-
value = os.environ.get(var_name)
|
|
140
|
-
if not value:
|
|
141
|
-
missing_vars.append(var_name)
|
|
142
|
-
else:
|
|
143
|
-
env_values[key] = value
|
|
144
|
-
if missing_vars:
|
|
145
|
-
logger.error("This example requires the following environment variables to be set: %s", missing_vars)
|
|
146
|
-
sys.exit(1)
|
|
147
|
-
if not Path(env_values["script_path"]).exists():
|
|
148
|
-
logger.error(f"The script path specified by TEST_GOOGLE_SLIDES_MCP_SCRIPT_PATH does not exist: {env_values['script_path']}")
|
|
149
|
-
sys.exit(1)
|
|
150
|
-
return env_values
|
|
151
|
-
|
|
152
|
-
async def main(args: argparse.Namespace):
|
|
153
|
-
"""Main function to configure and run the GoogleSlidesAgent."""
|
|
154
|
-
logger.info("--- Starting Google Slides Agent Example ---")
|
|
155
|
-
env_vars = check_required_env_vars()
|
|
156
|
-
|
|
157
|
-
# 1. Instantiate the core MCP and registry components.
|
|
158
|
-
tool_registry = default_tool_registry
|
|
159
|
-
registrar = McpToolRegistrar()
|
|
160
|
-
|
|
161
|
-
# 2. Define the configuration for the MCP server using a clear dictionary format.
|
|
162
|
-
server_id = "google-slides-mcp"
|
|
163
|
-
google_slides_mcp_config_dict = {
|
|
164
|
-
server_id: {
|
|
165
|
-
"transport_type": "stdio",
|
|
166
|
-
"stdio_params": {
|
|
167
|
-
"command": "node",
|
|
168
|
-
"args": [env_vars["script_path"]],
|
|
169
|
-
"env": {
|
|
170
|
-
"GOOGLE_CLIENT_ID": env_vars["google_client_id"],
|
|
171
|
-
"GOOGLE_CLIENT_SECRET": env_vars["google_client_secret"],
|
|
172
|
-
"GOOGLE_REFRESH_TOKEN": env_vars["google_refresh_token"],
|
|
173
|
-
}
|
|
174
|
-
},
|
|
175
|
-
"enabled": True,
|
|
176
|
-
"tool_name_prefix": "gslide",
|
|
177
|
-
}
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
try:
|
|
181
|
-
# 3. Discover and register tools by passing the config dictionary directly.
|
|
182
|
-
# The registrar will handle parsing, validation, and storage.
|
|
183
|
-
logger.info(f"Performing targeted discovery for remote Google Slides tools from server: '{server_id}'...")
|
|
184
|
-
await registrar.load_and_register_server(config_dict=google_slides_mcp_config_dict)
|
|
185
|
-
logger.info("Remote tool registration complete.")
|
|
186
|
-
|
|
187
|
-
# 4. Create tool instances from the registry for our agent.
|
|
188
|
-
# Use the ToolRegistry to get tools by their source server ID.
|
|
189
|
-
gslides_tool_defs = tool_registry.get_tools_by_mcp_server(server_id)
|
|
190
|
-
gslides_tool_names = [tool_def.name for tool_def in gslides_tool_defs]
|
|
191
|
-
|
|
192
|
-
if not gslides_tool_names:
|
|
193
|
-
logger.error(f"No Google Slides tools were found in the registry for server '{server_id}' after discovery. Cannot create agent.")
|
|
194
|
-
return
|
|
195
|
-
|
|
196
|
-
logger.info(f"Creating instances for registered Google Slides tools: {gslides_tool_names}")
|
|
197
|
-
tools_for_agent = [tool_registry.create_tool(name) for name in gslides_tool_names]
|
|
198
|
-
|
|
199
|
-
# 5. Configure and create the agent.
|
|
200
|
-
try:
|
|
201
|
-
_ = LLMModel[args.llm_model]
|
|
202
|
-
except (KeyError, ValueError):
|
|
203
|
-
logger.error(f"LLM Model '{args.llm_model}' is not valid or ambiguous.", file=sys.stderr)
|
|
204
|
-
try:
|
|
205
|
-
LLMFactory.ensure_initialized()
|
|
206
|
-
print("\nAvailable LLM Models (use the 'Identifier' with --llm-model):")
|
|
207
|
-
all_models = sorted(list(LLMModel), key=lambda m: m.model_identifier)
|
|
208
|
-
if not all_models:
|
|
209
|
-
print(" No models found.")
|
|
210
|
-
for model in all_models:
|
|
211
|
-
print(f" - Display Name: {model.name:<30} Identifier: {model.model_identifier}")
|
|
212
|
-
except Exception as e:
|
|
213
|
-
print(f"Additionally, an error occurred while listing models: {e}", file=sys.stderr)
|
|
214
|
-
sys.exit(1)
|
|
215
|
-
|
|
216
|
-
logger.info(f"Creating LLM instance for model: {args.llm_model}")
|
|
217
|
-
llm_instance = default_llm_factory.create_llm(model_identifier=args.llm_model)
|
|
218
|
-
|
|
219
|
-
system_prompt = (
|
|
220
|
-
"You are a helpful assistant with expertise in creating and managing Google Slides presentations.\n"
|
|
221
|
-
"You have access to a set of specialized tools for this purpose.\n\n"
|
|
222
|
-
"When asked to create a presentation, you should use the 'gslides_create_presentation' tool.\n"
|
|
223
|
-
"When asked to add content, you should find out what kind of content and use the 'gslides_batch_update_presentation' tool with the correct request objects.\n"
|
|
224
|
-
"When asked to summarize a presentation, use the 'gslides_summarize_presentation' tool.\n\n"
|
|
225
|
-
"Here is the manifest of tools available to you, including their definitions and examples:\n"
|
|
226
|
-
"{{tools}}"
|
|
227
|
-
)
|
|
228
|
-
|
|
229
|
-
gslides_agent_config = AgentConfig(
|
|
230
|
-
name="GoogleSlidesAgent",
|
|
231
|
-
role="GoogleSlidesExpert",
|
|
232
|
-
description="An agent that can create and manage Google Slides presentations using a set of remote tools.",
|
|
233
|
-
llm_instance=llm_instance,
|
|
234
|
-
system_prompt=system_prompt,
|
|
235
|
-
tools=tools_for_agent,
|
|
236
|
-
auto_execute_tools=False
|
|
237
|
-
)
|
|
238
|
-
|
|
239
|
-
agent = AgentFactory().create_agent(config=gslides_agent_config)
|
|
240
|
-
logger.info(f"Google Slides Agent instance created: {agent.agent_id}")
|
|
241
|
-
|
|
242
|
-
# 6. Run the agent in an interactive CLI session.
|
|
243
|
-
logger.info(f"Starting interactive session for agent {agent.agent_id}...")
|
|
244
|
-
await agent_cli.run(agent=agent)
|
|
245
|
-
logger.info(f"Interactive session for agent {agent.agent_id} finished.")
|
|
246
|
-
|
|
247
|
-
except Exception as e:
|
|
248
|
-
logger.error(f"An error occurred during the agent workflow: {e}", exc_info=True)
|
|
249
|
-
|
|
250
|
-
logger.info("--- Google Slides Agent Example Finished ---")
|
|
251
|
-
|
|
252
|
-
if __name__ == "__main__":
|
|
253
|
-
parser = argparse.ArgumentParser(description="Run the GoogleSlidesAgent interactively.")
|
|
254
|
-
parser.add_argument("--llm-model", type=str, default="kimi-latest", help=f"The LLM model identifier to use. Call --help-models for list.")
|
|
255
|
-
parser.add_argument("--help-models", action="store_true", help="Display available LLM models and exit.")
|
|
256
|
-
parser.add_argument("--debug", action="store_true", help="Enable debug logging.")
|
|
257
|
-
parser.add_argument("--agent-log-file", type=str, default="./agent_logs_gslides.txt",
|
|
258
|
-
help="Path to the log file for autobyteus.* library logs. (Default: ./agent_logs_gslides.txt)")
|
|
259
|
-
parser.add_argument("--no-tool-logs", action="store_true",
|
|
260
|
-
help="Disable display of [Tool Log (...)] messages on the console by the agent_cli.")
|
|
261
|
-
|
|
262
|
-
if "--help-models" in sys.argv:
|
|
263
|
-
try:
|
|
264
|
-
LLMFactory.ensure_initialized()
|
|
265
|
-
print("Available LLM Models (use the 'Identifier' with --llm-model):")
|
|
266
|
-
all_models = sorted(list(LLMModel), key=lambda m: m.model_identifier)
|
|
267
|
-
if not all_models:
|
|
268
|
-
print(" No models found.")
|
|
269
|
-
for model in all_models:
|
|
270
|
-
print(f" - Display Name: {model.name:<30} Identifier: {model.model_identifier}")
|
|
271
|
-
except Exception as e:
|
|
272
|
-
print(f"Error listing models: {e}")
|
|
273
|
-
sys.exit(0)
|
|
274
|
-
|
|
275
|
-
parsed_args = parser.parse_args()
|
|
276
|
-
|
|
277
|
-
setup_logging(parsed_args)
|
|
278
|
-
check_required_env_vars()
|
|
279
|
-
|
|
280
|
-
try:
|
|
281
|
-
asyncio.run(main(parsed_args))
|
|
282
|
-
except (KeyboardInterrupt, SystemExit):
|
|
283
|
-
logger.info("Script interrupted by user. Exiting.")
|
|
284
|
-
except Exception as e:
|
|
285
|
-
logger.error(f"An unhandled error occurred at the top level: {e}", exc_info=True)
|
|
286
|
-
finally:
|
|
287
|
-
logger.info("Exiting script.")
|
|
@@ -1,174 +0,0 @@
|
|
|
1
|
-
# file: autobyteus/examples/run_mcp_browser_client.py
|
|
2
|
-
"""
|
|
3
|
-
This example script demonstrates how to create a standalone MCP client in Python
|
|
4
|
-
to connect to and interact with the Browser MCP server.
|
|
5
|
-
|
|
6
|
-
This script uses only the 'mcp' library and standard Python libraries,
|
|
7
|
-
intentionally avoiding the 'autobyteus' framework abstractions.
|
|
8
|
-
This approach is useful for understanding the low-level communication
|
|
9
|
-
with an MCP server.
|
|
10
|
-
|
|
11
|
-
The script will:
|
|
12
|
-
1. Define the parameters to launch the Browser MCP server (`npx @browsermcp/mcp@latest`).
|
|
13
|
-
2. Start the server process and establish an stdio transport.
|
|
14
|
-
3. Initialize an MCP client session.
|
|
15
|
-
4. List the available tools from the server.
|
|
16
|
-
5. Call the 'open_page' tool to open a website.
|
|
17
|
-
6. Call the 'get_page_content' tool to retrieve the page's text.
|
|
18
|
-
7. Properly clean up the session and server process.
|
|
19
|
-
"""
|
|
20
|
-
|
|
21
|
-
import asyncio
|
|
22
|
-
import logging
|
|
23
|
-
import sys
|
|
24
|
-
import json
|
|
25
|
-
from contextlib import AsyncExitStack
|
|
26
|
-
from mcp import ClientSession, StdioServerParameters
|
|
27
|
-
from mcp.client.stdio import stdio_client
|
|
28
|
-
|
|
29
|
-
# --- Logging Setup ---
|
|
30
|
-
logging.basicConfig(
|
|
31
|
-
level=logging.INFO,
|
|
32
|
-
format='%(asctime)s - %(levelname)s - %(name)s - %(message)s',
|
|
33
|
-
stream=sys.stdout,
|
|
34
|
-
)
|
|
35
|
-
logger = logging.getLogger("mcp_browser_client")
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
class MCPBrowserClient:
|
|
39
|
-
"""
|
|
40
|
-
A client for interacting with a Browser MCP server over stdio.
|
|
41
|
-
"""
|
|
42
|
-
|
|
43
|
-
def __init__(self):
|
|
44
|
-
self.session: ClientSession | None = None
|
|
45
|
-
self.exit_stack = AsyncExitStack()
|
|
46
|
-
self.page_id: str | None = None
|
|
47
|
-
|
|
48
|
-
async def connect(self):
|
|
49
|
-
"""
|
|
50
|
-
Starts the browser MCP server and connects to it.
|
|
51
|
-
"""
|
|
52
|
-
logger.info("Defining server parameters for Browser MCP...")
|
|
53
|
-
# These parameters specify how to run the MCP server.
|
|
54
|
-
# This is the same command used by the `run_browser_agent.py` example.
|
|
55
|
-
server_params = StdioServerParameters(
|
|
56
|
-
command="npx",
|
|
57
|
-
args=["@browsermcp/mcp@latest"],
|
|
58
|
-
env=None,
|
|
59
|
-
)
|
|
60
|
-
|
|
61
|
-
logger.info(f"Starting server with command: '{server_params.command} {' '.join(server_params.args)}'")
|
|
62
|
-
|
|
63
|
-
# `stdio_client` is a context manager that starts the process
|
|
64
|
-
# and provides reader/writer streams for communication.
|
|
65
|
-
stdio_transport = await self.exit_stack.enter_async_context(stdio_client(server_params))
|
|
66
|
-
read, write = stdio_transport
|
|
67
|
-
|
|
68
|
-
logger.info("Server process started. Establishing MCP session...")
|
|
69
|
-
|
|
70
|
-
# `ClientSession` is another context manager that handles the MCP protocol.
|
|
71
|
-
self.session = await self.exit_stack.enter_async_context(ClientSession(read, write))
|
|
72
|
-
|
|
73
|
-
# The initialize handshake must be performed after connection.
|
|
74
|
-
await self.session.initialize()
|
|
75
|
-
logger.info("MCP session initialized successfully.")
|
|
76
|
-
|
|
77
|
-
# Let's see what tools the server offers.
|
|
78
|
-
response = await self.session.list_tools()
|
|
79
|
-
tool_names = [tool.name for tool in response.tools]
|
|
80
|
-
logger.info(f"Connected to server. Available tools: {tool_names}")
|
|
81
|
-
|
|
82
|
-
async def call_tool(self, tool_name: str, **kwargs):
|
|
83
|
-
"""
|
|
84
|
-
A wrapper to call a tool on the server and print the result.
|
|
85
|
-
"""
|
|
86
|
-
if not self.session:
|
|
87
|
-
raise RuntimeError("Client not connected. Call connect() first.")
|
|
88
|
-
|
|
89
|
-
logger.info(f"Calling tool '{tool_name}' with arguments: {kwargs}")
|
|
90
|
-
try:
|
|
91
|
-
result = await self.session.call_tool(tool_name, kwargs)
|
|
92
|
-
logger.info(f"Tool '{tool_name}' executed successfully.")
|
|
93
|
-
|
|
94
|
-
# The result content is a list of blocks. For many tools, it's a single text block.
|
|
95
|
-
if result.content and hasattr(result.content[0], 'text'):
|
|
96
|
-
tool_output = result.content[0].text
|
|
97
|
-
logger.info(f"--> Result from '{tool_name}':\n{tool_output[:500]}...")
|
|
98
|
-
return tool_output
|
|
99
|
-
else:
|
|
100
|
-
logger.info(f"--> Result from '{tool_name}' has no text content: {result.content}")
|
|
101
|
-
return result.content
|
|
102
|
-
except Exception as e:
|
|
103
|
-
logger.error(f"An error occurred while calling tool '{tool_name}': {e}", exc_info=True)
|
|
104
|
-
raise
|
|
105
|
-
|
|
106
|
-
async def cleanup(self):
|
|
107
|
-
"""
|
|
108
|
-
Closes the session and stops the server process.
|
|
109
|
-
The AsyncExitStack handles this automatically.
|
|
110
|
-
"""
|
|
111
|
-
logger.info("Cleaning up resources and closing server connection...")
|
|
112
|
-
await self.exit_stack.aclose()
|
|
113
|
-
logger.info("Cleanup complete.")
|
|
114
|
-
|
|
115
|
-
async def run_demo_flow(self):
|
|
116
|
-
"""
|
|
117
|
-
Executes a simple workflow: open a page, get its content, and close it.
|
|
118
|
-
"""
|
|
119
|
-
try:
|
|
120
|
-
# 1. Open a page
|
|
121
|
-
open_page_result = await self.call_tool("open_page", url="https://www.google.com/search?q=mcp+protocol")
|
|
122
|
-
|
|
123
|
-
# The 'open_page' tool returns a JSON string with the pageId.
|
|
124
|
-
# We need to parse it to use in subsequent calls.
|
|
125
|
-
if not isinstance(open_page_result, str):
|
|
126
|
-
logger.error(f"Expected a string from 'open_page', but got {type(open_page_result)}")
|
|
127
|
-
return
|
|
128
|
-
|
|
129
|
-
try:
|
|
130
|
-
page_info = json.loads(open_page_result)
|
|
131
|
-
self.page_id = page_info.get("pageId")
|
|
132
|
-
if not self.page_id:
|
|
133
|
-
logger.error("Could not find 'pageId' in the result from 'open_page'.")
|
|
134
|
-
return
|
|
135
|
-
logger.info(f"Successfully opened page. Page ID: {self.page_id}")
|
|
136
|
-
except (json.JSONDecodeError, AttributeError) as e:
|
|
137
|
-
logger.error(f"Failed to parse pageId from 'open_page' result: {e}")
|
|
138
|
-
return
|
|
139
|
-
|
|
140
|
-
# 2. Get the page content
|
|
141
|
-
# Add a small delay for the page to potentially load dynamic content.
|
|
142
|
-
logger.info("Waiting for 2 seconds before getting content...")
|
|
143
|
-
await asyncio.sleep(2)
|
|
144
|
-
|
|
145
|
-
await self.call_tool("get_page_content", pageId=self.page_id)
|
|
146
|
-
|
|
147
|
-
# 3. Close the page
|
|
148
|
-
await self.call_tool("close_page", pageId=self.page_id)
|
|
149
|
-
logger.info(f"Page {self.page_id} closed.")
|
|
150
|
-
|
|
151
|
-
except Exception as e:
|
|
152
|
-
logger.error(f"An error occurred during the demo flow: {e}")
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
async def main():
|
|
156
|
-
"""
|
|
157
|
-
Main function to run the MCP Browser Client.
|
|
158
|
-
"""
|
|
159
|
-
logger.info("--- Starting Standalone MCP Browser Client Example ---")
|
|
160
|
-
client = MCPBrowserClient()
|
|
161
|
-
try:
|
|
162
|
-
await client.connect()
|
|
163
|
-
await client.run_demo_flow()
|
|
164
|
-
finally:
|
|
165
|
-
await client.cleanup()
|
|
166
|
-
logger.info("--- Standalone MCP Browser Client Example Finished ---")
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
if __name__ == "__main__":
|
|
170
|
-
try:
|
|
171
|
-
asyncio.run(main())
|
|
172
|
-
except (KeyboardInterrupt, SystemExit):
|
|
173
|
-
logger.info("Script interrupted by user. Exiting.")
|
|
174
|
-
|