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
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import Any, Dict, List, Optional
|
|
3
|
+
|
|
4
|
+
from .memory_types import MemoryType
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class RawTraceItem:
|
|
9
|
+
id: str
|
|
10
|
+
ts: float
|
|
11
|
+
turn_id: str
|
|
12
|
+
seq: int
|
|
13
|
+
trace_type: str
|
|
14
|
+
content: str
|
|
15
|
+
source_event: str
|
|
16
|
+
media: Optional[Dict[str, List[str]]] = None
|
|
17
|
+
tool_name: Optional[str] = None
|
|
18
|
+
tool_call_id: Optional[str] = None
|
|
19
|
+
tool_args: Optional[Dict[str, Any]] = None
|
|
20
|
+
tool_result: Optional[Any] = None
|
|
21
|
+
tool_error: Optional[str] = None
|
|
22
|
+
correlation_id: Optional[str] = None
|
|
23
|
+
tags: List[str] = field(default_factory=list)
|
|
24
|
+
tool_result_ref: Optional[str] = None
|
|
25
|
+
|
|
26
|
+
@property
|
|
27
|
+
def memory_type(self) -> MemoryType:
|
|
28
|
+
return MemoryType.RAW_TRACE
|
|
29
|
+
|
|
30
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
31
|
+
data: Dict[str, Any] = {
|
|
32
|
+
"id": self.id,
|
|
33
|
+
"ts": self.ts,
|
|
34
|
+
"turn_id": self.turn_id,
|
|
35
|
+
"seq": self.seq,
|
|
36
|
+
"trace_type": self.trace_type,
|
|
37
|
+
"content": self.content,
|
|
38
|
+
"source_event": self.source_event,
|
|
39
|
+
}
|
|
40
|
+
if self.media is not None:
|
|
41
|
+
data["media"] = self.media
|
|
42
|
+
if self.tool_name is not None:
|
|
43
|
+
data["tool_name"] = self.tool_name
|
|
44
|
+
if self.tool_call_id is not None:
|
|
45
|
+
data["tool_call_id"] = self.tool_call_id
|
|
46
|
+
if self.tool_args is not None:
|
|
47
|
+
data["tool_args"] = self.tool_args
|
|
48
|
+
if self.tool_result is not None:
|
|
49
|
+
data["tool_result"] = self.tool_result
|
|
50
|
+
if self.tool_error is not None:
|
|
51
|
+
data["tool_error"] = self.tool_error
|
|
52
|
+
if self.correlation_id is not None:
|
|
53
|
+
data["correlation_id"] = self.correlation_id
|
|
54
|
+
if self.tags:
|
|
55
|
+
data["tags"] = self.tags
|
|
56
|
+
if self.tool_result_ref is not None:
|
|
57
|
+
data["tool_result_ref"] = self.tool_result_ref
|
|
58
|
+
return data
|
|
59
|
+
|
|
60
|
+
@classmethod
|
|
61
|
+
def from_dict(cls, data: Dict[str, Any]) -> "RawTraceItem":
|
|
62
|
+
return cls(
|
|
63
|
+
id=data["id"],
|
|
64
|
+
ts=data["ts"],
|
|
65
|
+
turn_id=data["turn_id"],
|
|
66
|
+
seq=data["seq"],
|
|
67
|
+
trace_type=data["trace_type"],
|
|
68
|
+
content=data.get("content", ""),
|
|
69
|
+
source_event=data["source_event"],
|
|
70
|
+
media=data.get("media"),
|
|
71
|
+
tool_name=data.get("tool_name"),
|
|
72
|
+
tool_call_id=data.get("tool_call_id"),
|
|
73
|
+
tool_args=data.get("tool_args"),
|
|
74
|
+
tool_result=data.get("tool_result"),
|
|
75
|
+
tool_error=data.get("tool_error"),
|
|
76
|
+
correlation_id=data.get("correlation_id"),
|
|
77
|
+
tags=data.get("tags", []),
|
|
78
|
+
tool_result_ref=data.get("tool_result_ref"),
|
|
79
|
+
)
|
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import Any, Dict, List
|
|
3
|
+
|
|
4
|
+
from .memory_types import MemoryType
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class SemanticItem:
|
|
9
|
+
id: str
|
|
10
|
+
ts: float
|
|
11
|
+
fact: str
|
|
12
|
+
tags: List[str] = field(default_factory=list)
|
|
13
|
+
confidence: float = 0.0
|
|
14
|
+
salience: float = 0.0
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def memory_type(self) -> MemoryType:
|
|
18
|
+
return MemoryType.SEMANTIC
|
|
19
|
+
|
|
20
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
21
|
+
data: Dict[str, Any] = {
|
|
22
|
+
"id": self.id,
|
|
23
|
+
"ts": self.ts,
|
|
24
|
+
"fact": self.fact,
|
|
25
|
+
"confidence": self.confidence,
|
|
26
|
+
"salience": self.salience,
|
|
27
|
+
}
|
|
28
|
+
if self.tags:
|
|
29
|
+
data["tags"] = self.tags
|
|
30
|
+
return data
|
|
31
|
+
|
|
32
|
+
@classmethod
|
|
33
|
+
def from_dict(cls, data: Dict[str, Any]) -> "SemanticItem":
|
|
34
|
+
return cls(
|
|
35
|
+
id=data["id"],
|
|
36
|
+
ts=data["ts"],
|
|
37
|
+
fact=data.get("fact", ""),
|
|
38
|
+
tags=data.get("tags", []),
|
|
39
|
+
confidence=data.get("confidence", 0.0),
|
|
40
|
+
salience=data.get("salience", 0.0),
|
|
41
|
+
)
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from enum import Enum
|
|
3
|
+
from typing import Any, Optional, Dict
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class ToolInteractionStatus(Enum):
|
|
7
|
+
PENDING = "pending"
|
|
8
|
+
SUCCESS = "success"
|
|
9
|
+
ERROR = "error"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
@dataclass
|
|
13
|
+
class ToolInteraction:
|
|
14
|
+
tool_call_id: str
|
|
15
|
+
turn_id: Optional[str]
|
|
16
|
+
tool_name: Optional[str]
|
|
17
|
+
arguments: Optional[Dict[str, Any]]
|
|
18
|
+
result: Optional[Any]
|
|
19
|
+
error: Optional[str]
|
|
20
|
+
status: ToolInteractionStatus
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import os
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Mapping, Optional, Union
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
def resolve_memory_base_dir(
|
|
7
|
+
override_dir: Optional[str] = None,
|
|
8
|
+
env: Optional[Mapping[str, str]] = None,
|
|
9
|
+
fallback_dir: Optional[Union[str, Path]] = None,
|
|
10
|
+
) -> str:
|
|
11
|
+
override_value = override_dir.strip() if override_dir else ""
|
|
12
|
+
if override_value:
|
|
13
|
+
return override_value
|
|
14
|
+
|
|
15
|
+
env_values = env if env is not None else os.environ
|
|
16
|
+
env_value = env_values.get("AUTOBYTEUS_MEMORY_DIR", "").strip()
|
|
17
|
+
if env_value:
|
|
18
|
+
return env_value
|
|
19
|
+
|
|
20
|
+
if fallback_dir is not None:
|
|
21
|
+
return str(fallback_dir)
|
|
22
|
+
|
|
23
|
+
return str(Path.cwd() / "memory")
|
|
24
|
+
|
|
25
|
+
|
|
26
|
+
def resolve_agent_memory_dir(base_dir: Union[str, Path], agent_id: str) -> str:
|
|
27
|
+
return str(Path(base_dir) / "agents" / agent_id)
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
@dataclass
|
|
5
|
+
class CompactionPolicy:
|
|
6
|
+
trigger_ratio: float = 0.8
|
|
7
|
+
raw_tail_turns: int = 4
|
|
8
|
+
max_item_chars: int = 2000
|
|
9
|
+
safety_margin_tokens: int = 256
|
|
10
|
+
|
|
11
|
+
def should_compact(self, prompt_tokens: int, input_budget: int) -> bool:
|
|
12
|
+
if input_budget <= 0:
|
|
13
|
+
return True
|
|
14
|
+
if prompt_tokens >= input_budget:
|
|
15
|
+
return True
|
|
16
|
+
return prompt_tokens >= int(self.trigger_ratio * input_budget)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
# restore package
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Optional
|
|
3
|
+
|
|
4
|
+
from autobyteus.memory.working_context_snapshot_serializer import WorkingContextSnapshotSerializer
|
|
5
|
+
from autobyteus.memory.compaction_snapshot_builder import CompactionSnapshotBuilder
|
|
6
|
+
from autobyteus.memory.store.working_context_snapshot_store import WorkingContextSnapshotStore
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
@dataclass
|
|
10
|
+
class WorkingContextSnapshotBootstrapOptions:
|
|
11
|
+
max_episodic: int = 3
|
|
12
|
+
max_semantic: int = 20
|
|
13
|
+
raw_tail_turns: Optional[int] = None
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class WorkingContextSnapshotBootstrapper:
|
|
17
|
+
def __init__(
|
|
18
|
+
self,
|
|
19
|
+
working_context_snapshot_store: Optional[WorkingContextSnapshotStore] = None,
|
|
20
|
+
snapshot_builder: Optional[CompactionSnapshotBuilder] = None,
|
|
21
|
+
) -> None:
|
|
22
|
+
self.working_context_snapshot_store = working_context_snapshot_store
|
|
23
|
+
self.snapshot_builder = snapshot_builder or CompactionSnapshotBuilder()
|
|
24
|
+
|
|
25
|
+
def bootstrap(self, memory_manager, system_prompt: str, options: WorkingContextSnapshotBootstrapOptions) -> None:
|
|
26
|
+
store = self._resolve_store(memory_manager)
|
|
27
|
+
agent_id = self._resolve_agent_id(memory_manager, store)
|
|
28
|
+
|
|
29
|
+
if store and agent_id and store.exists(agent_id):
|
|
30
|
+
payload = store.read(agent_id)
|
|
31
|
+
if payload and WorkingContextSnapshotSerializer.validate(payload):
|
|
32
|
+
snapshot, _meta = WorkingContextSnapshotSerializer.deserialize(payload)
|
|
33
|
+
memory_manager.reset_working_context_snapshot(snapshot.build_messages())
|
|
34
|
+
return
|
|
35
|
+
|
|
36
|
+
bundle = memory_manager.retriever.retrieve(
|
|
37
|
+
max_episodic=options.max_episodic,
|
|
38
|
+
max_semantic=options.max_semantic,
|
|
39
|
+
)
|
|
40
|
+
tail_turns = options.raw_tail_turns
|
|
41
|
+
if tail_turns is None:
|
|
42
|
+
policy = getattr(memory_manager, "compaction_policy", None)
|
|
43
|
+
tail_turns = getattr(policy, "raw_tail_turns", 0) if policy else 0
|
|
44
|
+
raw_tail = memory_manager.get_raw_tail(tail_turns or 0, exclude_turn_id=None)
|
|
45
|
+
snapshot_messages = self.snapshot_builder.build(
|
|
46
|
+
system_prompt=system_prompt,
|
|
47
|
+
bundle=bundle,
|
|
48
|
+
raw_tail=raw_tail,
|
|
49
|
+
)
|
|
50
|
+
memory_manager.reset_working_context_snapshot(snapshot_messages)
|
|
51
|
+
|
|
52
|
+
def _resolve_store(self, memory_manager) -> Optional[WorkingContextSnapshotStore]:
|
|
53
|
+
if self.working_context_snapshot_store is not None:
|
|
54
|
+
return self.working_context_snapshot_store
|
|
55
|
+
return getattr(memory_manager, "working_context_snapshot_store", None)
|
|
56
|
+
|
|
57
|
+
def _resolve_agent_id(self, memory_manager, store: Optional[WorkingContextSnapshotStore]) -> Optional[str]:
|
|
58
|
+
if store and getattr(store, "agent_id", None):
|
|
59
|
+
return store.agent_id
|
|
60
|
+
store_obj = getattr(memory_manager, "store", None)
|
|
61
|
+
return getattr(store_obj, "agent_id", None)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from dataclasses import dataclass, field
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
from autobyteus.memory.models.episodic_item import EpisodicItem
|
|
5
|
+
from autobyteus.memory.models.semantic_item import SemanticItem
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
@dataclass
|
|
9
|
+
class MemoryBundle:
|
|
10
|
+
episodic: List[EpisodicItem] = field(default_factory=list)
|
|
11
|
+
semantic: List[SemanticItem] = field(default_factory=list)
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
from autobyteus.memory.models.memory_types import MemoryType
|
|
2
|
+
from autobyteus.memory.retrieval.memory_bundle import MemoryBundle
|
|
3
|
+
from autobyteus.memory.store.base_store import MemoryStore
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class Retriever:
|
|
7
|
+
def __init__(self, store: MemoryStore):
|
|
8
|
+
self.store = store
|
|
9
|
+
|
|
10
|
+
def retrieve(self, max_episodic: int, max_semantic: int) -> MemoryBundle:
|
|
11
|
+
episodic = self.store.list(MemoryType.EPISODIC, limit=max_episodic)
|
|
12
|
+
semantic = self.store.list(MemoryType.SEMANTIC, limit=max_semantic)
|
|
13
|
+
return MemoryBundle(episodic=episodic, semantic=semantic)
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from autobyteus.memory.store.base_store import MemoryStore
|
|
2
|
+
from autobyteus.memory.store.file_store import FileMemoryStore
|
|
3
|
+
from autobyteus.memory.store.working_context_snapshot_store import WorkingContextSnapshotStore
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"MemoryStore",
|
|
7
|
+
"FileMemoryStore",
|
|
8
|
+
"WorkingContextSnapshotStore",
|
|
9
|
+
]
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import Iterable, List, Optional
|
|
3
|
+
|
|
4
|
+
from autobyteus.memory.models.memory_types import MemoryType
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class MemoryStore(ABC):
|
|
8
|
+
@abstractmethod
|
|
9
|
+
def add(self, items: Iterable[object]) -> None:
|
|
10
|
+
raise NotImplementedError
|
|
11
|
+
|
|
12
|
+
@abstractmethod
|
|
13
|
+
def list(self, memory_type: MemoryType, limit: Optional[int] = None) -> List[object]:
|
|
14
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Iterable, List, Optional, Union
|
|
4
|
+
|
|
5
|
+
from autobyteus.memory.models.memory_types import MemoryType
|
|
6
|
+
from autobyteus.memory.models.raw_trace_item import RawTraceItem
|
|
7
|
+
from autobyteus.memory.models.episodic_item import EpisodicItem
|
|
8
|
+
from autobyteus.memory.models.semantic_item import SemanticItem
|
|
9
|
+
from autobyteus.memory.store.base_store import MemoryStore
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class FileMemoryStore(MemoryStore):
|
|
13
|
+
def __init__(self, base_dir: Union[str, Path], agent_id: str):
|
|
14
|
+
self.base_dir = Path(base_dir)
|
|
15
|
+
self.agent_id = agent_id
|
|
16
|
+
self.agent_dir = self.base_dir / "agents" / agent_id
|
|
17
|
+
self.agent_dir.mkdir(parents=True, exist_ok=True)
|
|
18
|
+
|
|
19
|
+
def add(self, items: Iterable[object]) -> None:
|
|
20
|
+
for item in items:
|
|
21
|
+
memory_type = getattr(item, "memory_type", None)
|
|
22
|
+
if memory_type is None:
|
|
23
|
+
raise ValueError("Memory item missing memory_type")
|
|
24
|
+
path = self._get_file_path(memory_type)
|
|
25
|
+
record = item.to_dict() if hasattr(item, "to_dict") else item
|
|
26
|
+
with path.open("a", encoding="utf-8") as handle:
|
|
27
|
+
handle.write(json.dumps(record) + "\n")
|
|
28
|
+
|
|
29
|
+
def list(self, memory_type: MemoryType, limit: Optional[int] = None) -> List[object]:
|
|
30
|
+
path = self._get_file_path(memory_type)
|
|
31
|
+
if not path.exists():
|
|
32
|
+
return []
|
|
33
|
+
with path.open("r", encoding="utf-8") as handle:
|
|
34
|
+
lines = [line.strip() for line in handle.readlines() if line.strip()]
|
|
35
|
+
if limit is not None:
|
|
36
|
+
lines = lines[-limit:]
|
|
37
|
+
return [self._deserialize(memory_type, json.loads(line)) for line in lines]
|
|
38
|
+
|
|
39
|
+
def list_raw_trace_dicts(self) -> List[dict]:
|
|
40
|
+
path = self._get_file_path(MemoryType.RAW_TRACE)
|
|
41
|
+
if not path.exists():
|
|
42
|
+
return []
|
|
43
|
+
with path.open("r", encoding="utf-8") as handle:
|
|
44
|
+
return [json.loads(line) for line in handle if line.strip()]
|
|
45
|
+
|
|
46
|
+
def read_archive_raw_traces(self) -> List[dict]:
|
|
47
|
+
path = self._get_archive_path()
|
|
48
|
+
if not path.exists():
|
|
49
|
+
return []
|
|
50
|
+
with path.open("r", encoding="utf-8") as handle:
|
|
51
|
+
return [json.loads(line) for line in handle if line.strip()]
|
|
52
|
+
|
|
53
|
+
def prune_raw_traces(self, keep_turn_ids: set[str], archive: bool = True) -> None:
|
|
54
|
+
raw_items = self.list_raw_trace_dicts()
|
|
55
|
+
if not raw_items:
|
|
56
|
+
return
|
|
57
|
+
|
|
58
|
+
keep = []
|
|
59
|
+
removed = []
|
|
60
|
+
for item in raw_items:
|
|
61
|
+
if item.get("turn_id") in keep_turn_ids:
|
|
62
|
+
keep.append(item)
|
|
63
|
+
else:
|
|
64
|
+
removed.append(item)
|
|
65
|
+
|
|
66
|
+
raw_path = self._get_file_path(MemoryType.RAW_TRACE)
|
|
67
|
+
tmp_path = raw_path.with_suffix(".jsonl.tmp")
|
|
68
|
+
with tmp_path.open("w", encoding="utf-8") as handle:
|
|
69
|
+
for item in keep:
|
|
70
|
+
handle.write(json.dumps(item) + "\n")
|
|
71
|
+
tmp_path.replace(raw_path)
|
|
72
|
+
|
|
73
|
+
if archive and removed:
|
|
74
|
+
archive_path = self._get_archive_path()
|
|
75
|
+
with archive_path.open("a", encoding="utf-8") as handle:
|
|
76
|
+
for item in removed:
|
|
77
|
+
handle.write(json.dumps(item) + "\n")
|
|
78
|
+
|
|
79
|
+
def _get_file_path(self, memory_type: MemoryType) -> Path:
|
|
80
|
+
if memory_type == MemoryType.RAW_TRACE:
|
|
81
|
+
return self.agent_dir / "raw_traces.jsonl"
|
|
82
|
+
if memory_type == MemoryType.EPISODIC:
|
|
83
|
+
return self.agent_dir / "episodic.jsonl"
|
|
84
|
+
if memory_type == MemoryType.SEMANTIC:
|
|
85
|
+
return self.agent_dir / "semantic.jsonl"
|
|
86
|
+
raise ValueError(f"Unknown memory type: {memory_type}")
|
|
87
|
+
|
|
88
|
+
def _deserialize(self, memory_type: MemoryType, data: dict) -> object:
|
|
89
|
+
if memory_type == MemoryType.RAW_TRACE:
|
|
90
|
+
return RawTraceItem.from_dict(data)
|
|
91
|
+
if memory_type == MemoryType.EPISODIC:
|
|
92
|
+
return EpisodicItem.from_dict(data)
|
|
93
|
+
if memory_type == MemoryType.SEMANTIC:
|
|
94
|
+
return SemanticItem.from_dict(data)
|
|
95
|
+
raise ValueError(f"Unknown memory type: {memory_type}")
|
|
96
|
+
|
|
97
|
+
def _get_archive_path(self) -> Path:
|
|
98
|
+
return self.agent_dir / "raw_traces_archive.jsonl"
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import json
|
|
2
|
+
from pathlib import Path
|
|
3
|
+
from typing import Optional, Union, Dict, Any
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
class WorkingContextSnapshotStore:
|
|
7
|
+
def __init__(self, base_dir: Union[str, Path], agent_id: str) -> None:
|
|
8
|
+
self.base_dir = Path(base_dir)
|
|
9
|
+
self.agent_id = agent_id
|
|
10
|
+
|
|
11
|
+
def exists(self, agent_id: str) -> bool:
|
|
12
|
+
return self._get_path(agent_id).exists()
|
|
13
|
+
|
|
14
|
+
def read(self, agent_id: str) -> Optional[Dict[str, Any]]:
|
|
15
|
+
path = self._get_path(agent_id)
|
|
16
|
+
if not path.exists():
|
|
17
|
+
return None
|
|
18
|
+
with path.open("r", encoding="utf-8") as handle:
|
|
19
|
+
return json.load(handle)
|
|
20
|
+
|
|
21
|
+
def write(self, agent_id: str, payload: Dict[str, Any]) -> None:
|
|
22
|
+
path = self._get_path(agent_id)
|
|
23
|
+
path.parent.mkdir(parents=True, exist_ok=True)
|
|
24
|
+
with path.open("w", encoding="utf-8") as handle:
|
|
25
|
+
json.dump(payload, handle)
|
|
26
|
+
|
|
27
|
+
def _get_path(self, agent_id: str) -> Path:
|
|
28
|
+
return self.base_dir / "agents" / agent_id / "working_context_snapshot.json"
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
from typing import Dict, List
|
|
2
|
+
|
|
3
|
+
from autobyteus.memory.models.raw_trace_item import RawTraceItem
|
|
4
|
+
from autobyteus.memory.models.tool_interaction import ToolInteraction, ToolInteractionStatus
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
def build_tool_interactions(raw_traces: List[RawTraceItem]) -> List[ToolInteraction]:
|
|
8
|
+
interactions: Dict[str, ToolInteraction] = {}
|
|
9
|
+
|
|
10
|
+
for trace in raw_traces:
|
|
11
|
+
if trace.trace_type not in {"tool_call", "tool_result"}:
|
|
12
|
+
continue
|
|
13
|
+
|
|
14
|
+
tool_call_id = trace.tool_call_id
|
|
15
|
+
if not tool_call_id:
|
|
16
|
+
continue
|
|
17
|
+
|
|
18
|
+
interaction = interactions.get(tool_call_id)
|
|
19
|
+
if interaction is None:
|
|
20
|
+
interaction = ToolInteraction(
|
|
21
|
+
tool_call_id=tool_call_id,
|
|
22
|
+
turn_id=trace.turn_id,
|
|
23
|
+
tool_name=trace.tool_name,
|
|
24
|
+
arguments=None,
|
|
25
|
+
result=None,
|
|
26
|
+
error=None,
|
|
27
|
+
status=ToolInteractionStatus.PENDING,
|
|
28
|
+
)
|
|
29
|
+
interactions[tool_call_id] = interaction
|
|
30
|
+
|
|
31
|
+
if trace.trace_type == "tool_call":
|
|
32
|
+
interaction.tool_name = trace.tool_name
|
|
33
|
+
interaction.arguments = trace.tool_args
|
|
34
|
+
if interaction.status == ToolInteractionStatus.PENDING and interaction.error:
|
|
35
|
+
interaction.status = ToolInteractionStatus.ERROR
|
|
36
|
+
continue
|
|
37
|
+
|
|
38
|
+
if trace.trace_type == "tool_result":
|
|
39
|
+
interaction.tool_name = trace.tool_name or interaction.tool_name
|
|
40
|
+
interaction.result = trace.tool_result
|
|
41
|
+
interaction.error = trace.tool_error
|
|
42
|
+
interaction.status = (
|
|
43
|
+
ToolInteractionStatus.ERROR if trace.tool_error else ToolInteractionStatus.SUCCESS
|
|
44
|
+
)
|
|
45
|
+
|
|
46
|
+
return list(interactions.values())
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from typing import List, Optional, Iterable, Any
|
|
3
|
+
|
|
4
|
+
from autobyteus.llm.utils.messages import (
|
|
5
|
+
Message,
|
|
6
|
+
MessageRole,
|
|
7
|
+
ToolCallPayload,
|
|
8
|
+
ToolCallSpec,
|
|
9
|
+
ToolResultPayload,
|
|
10
|
+
)
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
class WorkingContextSnapshot:
|
|
14
|
+
def __init__(self, initial_messages: Optional[Iterable[Message]] = None):
|
|
15
|
+
self._messages: List[Message] = list(initial_messages) if initial_messages else []
|
|
16
|
+
self.epoch_id: int = 1
|
|
17
|
+
self.last_compaction_ts: Optional[float] = None
|
|
18
|
+
|
|
19
|
+
def append_message(self, message: Message) -> None:
|
|
20
|
+
self._messages.append(message)
|
|
21
|
+
|
|
22
|
+
def append_user(self, content: str) -> None:
|
|
23
|
+
self._messages.append(Message(role=MessageRole.USER, content=content))
|
|
24
|
+
|
|
25
|
+
def append_assistant(self, content: Optional[str], reasoning: Optional[str] = None) -> None:
|
|
26
|
+
self._messages.append(
|
|
27
|
+
Message(
|
|
28
|
+
role=MessageRole.ASSISTANT,
|
|
29
|
+
content=content,
|
|
30
|
+
reasoning_content=reasoning,
|
|
31
|
+
)
|
|
32
|
+
)
|
|
33
|
+
|
|
34
|
+
def append_tool_calls(self, tool_calls: List[ToolCallSpec]) -> None:
|
|
35
|
+
self._messages.append(
|
|
36
|
+
Message(
|
|
37
|
+
role=MessageRole.ASSISTANT,
|
|
38
|
+
content=None,
|
|
39
|
+
tool_payload=ToolCallPayload(tool_calls=tool_calls),
|
|
40
|
+
)
|
|
41
|
+
)
|
|
42
|
+
|
|
43
|
+
def append_tool_result(
|
|
44
|
+
self,
|
|
45
|
+
tool_call_id: str,
|
|
46
|
+
tool_name: str,
|
|
47
|
+
tool_result: Any,
|
|
48
|
+
tool_error: Optional[str] = None,
|
|
49
|
+
) -> None:
|
|
50
|
+
self._messages.append(
|
|
51
|
+
Message(
|
|
52
|
+
role=MessageRole.TOOL,
|
|
53
|
+
content=None,
|
|
54
|
+
tool_payload=ToolResultPayload(
|
|
55
|
+
tool_call_id=tool_call_id,
|
|
56
|
+
tool_name=tool_name,
|
|
57
|
+
tool_result=tool_result,
|
|
58
|
+
tool_error=tool_error,
|
|
59
|
+
),
|
|
60
|
+
)
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
def build_messages(self) -> List[Message]:
|
|
64
|
+
return list(self._messages)
|
|
65
|
+
|
|
66
|
+
def reset(self, snapshot_messages: Iterable[Message], last_compaction_ts: Optional[float] = None) -> None:
|
|
67
|
+
self._messages = list(snapshot_messages)
|
|
68
|
+
self.epoch_id += 1
|
|
69
|
+
self.last_compaction_ts = last_compaction_ts if last_compaction_ts is not None else time.time()
|