autobyteus 1.2.0__py3-none-any.whl → 1.2.3__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- autobyteus/agent/agent.py +15 -5
- autobyteus/agent/bootstrap_steps/__init__.py +1 -3
- autobyteus/agent/bootstrap_steps/agent_bootstrapper.py +3 -59
- autobyteus/agent/bootstrap_steps/base_bootstrap_step.py +1 -4
- autobyteus/agent/bootstrap_steps/mcp_server_prewarming_step.py +1 -3
- autobyteus/agent/bootstrap_steps/system_prompt_processing_step.py +16 -13
- autobyteus/agent/bootstrap_steps/workspace_context_initialization_step.py +2 -4
- autobyteus/agent/context/agent_config.py +43 -20
- autobyteus/agent/context/agent_context.py +23 -18
- autobyteus/agent/context/agent_runtime_state.py +23 -19
- autobyteus/agent/events/__init__.py +16 -1
- autobyteus/agent/events/agent_events.py +43 -3
- autobyteus/agent/events/agent_input_event_queue_manager.py +79 -26
- autobyteus/agent/events/event_store.py +57 -0
- autobyteus/agent/events/notifiers.py +74 -60
- autobyteus/agent/events/worker_event_dispatcher.py +21 -64
- autobyteus/agent/factory/agent_factory.py +52 -0
- autobyteus/agent/handlers/__init__.py +2 -0
- autobyteus/agent/handlers/approved_tool_invocation_event_handler.py +51 -34
- autobyteus/agent/handlers/bootstrap_event_handler.py +155 -0
- autobyteus/agent/handlers/inter_agent_message_event_handler.py +10 -0
- autobyteus/agent/handlers/lifecycle_event_logger.py +19 -11
- autobyteus/agent/handlers/llm_complete_response_received_event_handler.py +10 -15
- autobyteus/agent/handlers/llm_user_message_ready_event_handler.py +188 -48
- autobyteus/agent/handlers/tool_execution_approval_event_handler.py +0 -10
- autobyteus/agent/handlers/tool_invocation_request_event_handler.py +53 -48
- autobyteus/agent/handlers/tool_result_event_handler.py +7 -8
- autobyteus/agent/handlers/user_input_message_event_handler.py +10 -3
- autobyteus/agent/input_processor/memory_ingest_input_processor.py +40 -0
- autobyteus/agent/lifecycle/__init__.py +12 -0
- autobyteus/agent/lifecycle/base_processor.py +109 -0
- autobyteus/agent/lifecycle/events.py +35 -0
- autobyteus/agent/lifecycle/processor_definition.py +36 -0
- autobyteus/agent/lifecycle/processor_registry.py +106 -0
- autobyteus/agent/llm_request_assembler.py +98 -0
- autobyteus/agent/llm_response_processor/__init__.py +1 -8
- autobyteus/agent/message/context_file_type.py +1 -1
- autobyteus/agent/message/send_message_to.py +5 -4
- autobyteus/agent/runtime/agent_runtime.py +29 -21
- autobyteus/agent/runtime/agent_worker.py +98 -19
- autobyteus/agent/shutdown_steps/__init__.py +2 -0
- autobyteus/agent/shutdown_steps/agent_shutdown_orchestrator.py +2 -0
- autobyteus/agent/shutdown_steps/tool_cleanup_step.py +58 -0
- autobyteus/agent/status/__init__.py +14 -0
- autobyteus/agent/status/manager.py +93 -0
- autobyteus/agent/status/status_deriver.py +96 -0
- autobyteus/agent/{phases/phase_enum.py → status/status_enum.py} +16 -16
- autobyteus/agent/status/status_update_utils.py +73 -0
- autobyteus/agent/streaming/__init__.py +52 -5
- autobyteus/agent/streaming/adapters/__init__.py +18 -0
- autobyteus/agent/streaming/adapters/invocation_adapter.py +184 -0
- autobyteus/agent/streaming/adapters/tool_call_parsing.py +163 -0
- autobyteus/agent/streaming/adapters/tool_syntax_registry.py +67 -0
- autobyteus/agent/streaming/agent_event_stream.py +3 -178
- autobyteus/agent/streaming/api_tool_call/__init__.py +16 -0
- autobyteus/agent/streaming/api_tool_call/file_content_streamer.py +56 -0
- autobyteus/agent/streaming/api_tool_call/json_string_field_extractor.py +175 -0
- autobyteus/agent/streaming/api_tool_call_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/events/__init__.py +6 -0
- autobyteus/agent/streaming/events/stream_event_payloads.py +284 -0
- autobyteus/agent/streaming/events/stream_events.py +141 -0
- autobyteus/agent/streaming/handlers/__init__.py +15 -0
- autobyteus/agent/streaming/handlers/api_tool_call_streaming_response_handler.py +303 -0
- autobyteus/agent/streaming/handlers/parsing_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/pass_through_streaming_response_handler.py +107 -0
- autobyteus/agent/streaming/handlers/streaming_handler_factory.py +177 -0
- autobyteus/agent/streaming/handlers/streaming_response_handler.py +58 -0
- autobyteus/agent/streaming/parser/__init__.py +61 -0
- autobyteus/agent/streaming/parser/event_emitter.py +181 -0
- autobyteus/agent/streaming/parser/events.py +4 -0
- autobyteus/agent/streaming/parser/invocation_adapter.py +4 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/__init__.py +19 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/base.py +32 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/default.py +34 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/gemini.py +31 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/openai.py +64 -0
- autobyteus/agent/streaming/parser/json_parsing_strategies/registry.py +75 -0
- autobyteus/agent/streaming/parser/parser_context.py +227 -0
- autobyteus/agent/streaming/parser/parser_factory.py +132 -0
- autobyteus/agent/streaming/parser/sentinel_format.py +7 -0
- autobyteus/agent/streaming/parser/state_factory.py +62 -0
- autobyteus/agent/streaming/parser/states/__init__.py +1 -0
- autobyteus/agent/streaming/parser/states/base_state.py +60 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_run_bash_parsing_state.py +38 -0
- autobyteus/agent/streaming/parser/states/custom_xml_tag_write_file_parsing_state.py +55 -0
- autobyteus/agent/streaming/parser/states/delimited_content_state.py +146 -0
- autobyteus/agent/streaming/parser/states/json_initialization_state.py +144 -0
- autobyteus/agent/streaming/parser/states/json_tool_parsing_state.py +137 -0
- autobyteus/agent/streaming/parser/states/sentinel_content_state.py +30 -0
- autobyteus/agent/streaming/parser/states/sentinel_initialization_state.py +117 -0
- autobyteus/agent/streaming/parser/states/text_state.py +78 -0
- autobyteus/agent/streaming/parser/states/xml_patch_file_tool_parsing_state.py +328 -0
- autobyteus/agent/streaming/parser/states/xml_run_bash_tool_parsing_state.py +129 -0
- autobyteus/agent/streaming/parser/states/xml_tag_initialization_state.py +151 -0
- autobyteus/agent/streaming/parser/states/xml_tool_parsing_state.py +63 -0
- autobyteus/agent/streaming/parser/states/xml_write_file_tool_parsing_state.py +343 -0
- autobyteus/agent/streaming/parser/strategies/__init__.py +17 -0
- autobyteus/agent/streaming/parser/strategies/base.py +24 -0
- autobyteus/agent/streaming/parser/strategies/json_tool_strategy.py +26 -0
- autobyteus/agent/streaming/parser/strategies/registry.py +28 -0
- autobyteus/agent/streaming/parser/strategies/sentinel_strategy.py +23 -0
- autobyteus/agent/streaming/parser/strategies/xml_tag_strategy.py +21 -0
- autobyteus/agent/streaming/parser/stream_scanner.py +167 -0
- autobyteus/agent/streaming/parser/streaming_parser.py +212 -0
- autobyteus/agent/streaming/parser/tool_call_parsing.py +4 -0
- autobyteus/agent/streaming/parser/tool_constants.py +7 -0
- autobyteus/agent/streaming/parser/tool_syntax_registry.py +4 -0
- autobyteus/agent/streaming/parser/xml_tool_parsing_state_registry.py +55 -0
- autobyteus/agent/streaming/parsing_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/pass_through_streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/queue_streamer.py +3 -57
- autobyteus/agent/streaming/segments/__init__.py +5 -0
- autobyteus/agent/streaming/segments/segment_events.py +81 -0
- autobyteus/agent/streaming/stream_event_payloads.py +2 -198
- autobyteus/agent/streaming/stream_events.py +3 -128
- autobyteus/agent/streaming/streaming_handler_factory.py +4 -0
- autobyteus/agent/streaming/streaming_response_handler.py +4 -0
- autobyteus/agent/streaming/streams/__init__.py +5 -0
- autobyteus/agent/streaming/streams/agent_event_stream.py +197 -0
- autobyteus/agent/streaming/utils/__init__.py +5 -0
- autobyteus/agent/streaming/utils/queue_streamer.py +59 -0
- autobyteus/agent/system_prompt_processor/__init__.py +2 -0
- autobyteus/agent/system_prompt_processor/available_skills_processor.py +96 -0
- autobyteus/agent/system_prompt_processor/base_processor.py +1 -1
- autobyteus/agent/system_prompt_processor/processor_meta.py +15 -2
- autobyteus/agent/system_prompt_processor/tool_manifest_injector_processor.py +39 -58
- autobyteus/agent/token_budget.py +56 -0
- autobyteus/agent/tool_execution_result_processor/memory_ingest_tool_result_processor.py +29 -0
- autobyteus/agent/tool_invocation.py +16 -40
- autobyteus/agent/tool_invocation_preprocessor/__init__.py +9 -0
- autobyteus/agent/tool_invocation_preprocessor/base_preprocessor.py +45 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_definition.py +15 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_meta.py +33 -0
- autobyteus/agent/tool_invocation_preprocessor/processor_registry.py +60 -0
- autobyteus/agent/utils/wait_for_idle.py +12 -14
- autobyteus/agent/workspace/base_workspace.py +6 -27
- autobyteus/agent_team/agent_team.py +3 -3
- autobyteus/agent_team/agent_team_builder.py +1 -41
- autobyteus/agent_team/bootstrap_steps/__init__.py +0 -4
- autobyteus/agent_team/bootstrap_steps/agent_configuration_preparation_step.py +8 -18
- autobyteus/agent_team/bootstrap_steps/agent_team_bootstrapper.py +4 -16
- autobyteus/agent_team/bootstrap_steps/base_agent_team_bootstrap_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/coordinator_initialization_step.py +1 -2
- autobyteus/agent_team/bootstrap_steps/task_notifier_initialization_step.py +5 -6
- autobyteus/agent_team/bootstrap_steps/team_context_initialization_step.py +15 -15
- autobyteus/agent_team/context/agent_team_config.py +6 -3
- autobyteus/agent_team/context/agent_team_context.py +25 -3
- autobyteus/agent_team/context/agent_team_runtime_state.py +11 -8
- autobyteus/agent_team/events/__init__.py +11 -0
- autobyteus/agent_team/events/agent_team_event_dispatcher.py +22 -9
- autobyteus/agent_team/events/agent_team_events.py +16 -0
- autobyteus/agent_team/events/event_store.py +57 -0
- autobyteus/agent_team/factory/agent_team_factory.py +8 -0
- autobyteus/agent_team/handlers/inter_agent_message_request_event_handler.py +18 -2
- autobyteus/agent_team/handlers/lifecycle_agent_team_event_handler.py +21 -5
- autobyteus/agent_team/handlers/process_user_message_event_handler.py +17 -8
- autobyteus/agent_team/handlers/tool_approval_team_event_handler.py +19 -4
- autobyteus/agent_team/runtime/agent_team_runtime.py +41 -10
- autobyteus/agent_team/runtime/agent_team_worker.py +69 -5
- autobyteus/agent_team/status/__init__.py +14 -0
- autobyteus/agent_team/status/agent_team_status.py +18 -0
- autobyteus/agent_team/status/agent_team_status_manager.py +33 -0
- autobyteus/agent_team/status/status_deriver.py +62 -0
- autobyteus/agent_team/status/status_update_utils.py +42 -0
- autobyteus/agent_team/streaming/__init__.py +2 -2
- autobyteus/agent_team/streaming/agent_team_event_notifier.py +10 -10
- autobyteus/agent_team/streaming/agent_team_stream_event_payloads.py +7 -7
- autobyteus/agent_team/streaming/agent_team_stream_events.py +11 -11
- autobyteus/agent_team/system_prompt_processor/__init__.py +6 -0
- autobyteus/agent_team/system_prompt_processor/team_manifest_injector_processor.py +76 -0
- autobyteus/agent_team/task_notification/activation_policy.py +1 -1
- autobyteus/agent_team/task_notification/system_event_driven_agent_task_notifier.py +22 -22
- autobyteus/agent_team/task_notification/task_notification_mode.py +20 -1
- autobyteus/agent_team/utils/wait_for_idle.py +4 -4
- autobyteus/cli/agent_cli.py +18 -10
- autobyteus/cli/agent_team_tui/app.py +18 -15
- autobyteus/cli/agent_team_tui/state.py +21 -23
- autobyteus/cli/agent_team_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/agent_team_tui/widgets/focus_pane.py +146 -39
- autobyteus/cli/agent_team_tui/widgets/renderables.py +1 -1
- autobyteus/cli/agent_team_tui/widgets/shared.py +26 -26
- autobyteus/cli/agent_team_tui/widgets/{task_board_panel.py → task_plan_panel.py} +5 -5
- autobyteus/cli/cli_display.py +193 -44
- autobyteus/cli/workflow_tui/app.py +9 -10
- autobyteus/cli/workflow_tui/state.py +14 -16
- autobyteus/cli/workflow_tui/widgets/agent_list_sidebar.py +15 -15
- autobyteus/cli/workflow_tui/widgets/focus_pane.py +137 -35
- autobyteus/cli/workflow_tui/widgets/renderables.py +1 -1
- autobyteus/cli/workflow_tui/widgets/shared.py +25 -25
- autobyteus/clients/autobyteus_client.py +94 -1
- autobyteus/events/event_types.py +15 -21
- autobyteus/llm/api/autobyteus_llm.py +33 -29
- autobyteus/llm/api/claude_llm.py +142 -36
- autobyteus/llm/api/gemini_llm.py +163 -59
- autobyteus/llm/api/grok_llm.py +1 -1
- autobyteus/llm/api/minimax_llm.py +26 -0
- autobyteus/llm/api/mistral_llm.py +113 -87
- autobyteus/llm/api/ollama_llm.py +9 -42
- autobyteus/llm/api/openai_compatible_llm.py +127 -91
- autobyteus/llm/api/openai_llm.py +3 -3
- autobyteus/llm/api/openai_responses_llm.py +324 -0
- autobyteus/llm/api/zhipu_llm.py +21 -2
- autobyteus/llm/autobyteus_provider.py +70 -60
- autobyteus/llm/base_llm.py +85 -81
- autobyteus/llm/converters/__init__.py +14 -0
- autobyteus/llm/converters/anthropic_tool_call_converter.py +37 -0
- autobyteus/llm/converters/gemini_tool_call_converter.py +57 -0
- autobyteus/llm/converters/mistral_tool_call_converter.py +37 -0
- autobyteus/llm/converters/openai_tool_call_converter.py +38 -0
- autobyteus/llm/extensions/base_extension.py +6 -12
- autobyteus/llm/extensions/token_usage_tracking_extension.py +45 -18
- autobyteus/llm/llm_factory.py +282 -204
- autobyteus/llm/lmstudio_provider.py +60 -49
- autobyteus/llm/models.py +35 -2
- autobyteus/llm/ollama_provider.py +60 -49
- autobyteus/llm/ollama_provider_resolver.py +0 -1
- autobyteus/llm/prompt_renderers/__init__.py +19 -0
- autobyteus/llm/prompt_renderers/anthropic_prompt_renderer.py +104 -0
- autobyteus/llm/prompt_renderers/autobyteus_prompt_renderer.py +19 -0
- autobyteus/llm/prompt_renderers/base_prompt_renderer.py +10 -0
- autobyteus/llm/prompt_renderers/gemini_prompt_renderer.py +63 -0
- autobyteus/llm/prompt_renderers/mistral_prompt_renderer.py +87 -0
- autobyteus/llm/prompt_renderers/ollama_prompt_renderer.py +51 -0
- autobyteus/llm/prompt_renderers/openai_chat_renderer.py +97 -0
- autobyteus/llm/prompt_renderers/openai_responses_renderer.py +101 -0
- autobyteus/llm/providers.py +1 -3
- autobyteus/llm/token_counter/claude_token_counter.py +56 -25
- autobyteus/llm/token_counter/mistral_token_counter.py +12 -8
- autobyteus/llm/token_counter/openai_token_counter.py +24 -5
- autobyteus/llm/token_counter/token_counter_factory.py +12 -5
- autobyteus/llm/utils/llm_config.py +6 -12
- autobyteus/llm/utils/media_payload_formatter.py +27 -20
- autobyteus/llm/utils/messages.py +55 -3
- autobyteus/llm/utils/response_types.py +3 -0
- autobyteus/llm/utils/tool_call_delta.py +31 -0
- autobyteus/memory/__init__.py +32 -0
- autobyteus/memory/active_transcript.py +69 -0
- autobyteus/memory/compaction/__init__.py +9 -0
- autobyteus/memory/compaction/compaction_result.py +8 -0
- autobyteus/memory/compaction/compactor.py +89 -0
- autobyteus/memory/compaction/summarizer.py +11 -0
- autobyteus/memory/compaction_snapshot_builder.py +84 -0
- autobyteus/memory/memory_manager.py +183 -0
- autobyteus/memory/models/__init__.py +14 -0
- autobyteus/memory/models/episodic_item.py +41 -0
- autobyteus/memory/models/memory_types.py +7 -0
- autobyteus/memory/models/raw_trace_item.py +79 -0
- autobyteus/memory/models/semantic_item.py +41 -0
- autobyteus/memory/models/tool_interaction.py +20 -0
- autobyteus/memory/policies/__init__.py +5 -0
- autobyteus/memory/policies/compaction_policy.py +16 -0
- autobyteus/memory/retrieval/__init__.py +7 -0
- autobyteus/memory/retrieval/memory_bundle.py +11 -0
- autobyteus/memory/retrieval/retriever.py +13 -0
- autobyteus/memory/store/__init__.py +7 -0
- autobyteus/memory/store/base_store.py +14 -0
- autobyteus/memory/store/file_store.py +98 -0
- autobyteus/memory/tool_interaction_builder.py +46 -0
- autobyteus/memory/turn_tracker.py +9 -0
- autobyteus/multimedia/audio/api/__init__.py +3 -2
- autobyteus/multimedia/audio/api/autobyteus_audio_client.py +19 -5
- autobyteus/multimedia/audio/api/gemini_audio_client.py +108 -16
- autobyteus/multimedia/audio/api/openai_audio_client.py +112 -0
- autobyteus/multimedia/audio/audio_client_factory.py +84 -9
- autobyteus/multimedia/audio/audio_model.py +2 -1
- autobyteus/multimedia/image/api/autobyteus_image_client.py +19 -5
- autobyteus/multimedia/image/api/gemini_image_client.py +38 -17
- autobyteus/multimedia/image/api/openai_image_client.py +125 -43
- autobyteus/multimedia/image/autobyteus_image_provider.py +2 -1
- autobyteus/multimedia/image/image_client_factory.py +47 -15
- autobyteus/multimedia/image/image_model.py +5 -2
- autobyteus/multimedia/providers.py +3 -2
- autobyteus/skills/loader.py +71 -0
- autobyteus/skills/model.py +11 -0
- autobyteus/skills/registry.py +70 -0
- autobyteus/task_management/__init__.py +43 -20
- autobyteus/task_management/{base_task_board.py → base_task_plan.py} +16 -13
- autobyteus/task_management/converters/__init__.py +2 -2
- autobyteus/task_management/converters/{task_board_converter.py → task_plan_converter.py} +13 -13
- autobyteus/task_management/events.py +7 -7
- autobyteus/task_management/{in_memory_task_board.py → in_memory_task_plan.py} +34 -22
- autobyteus/task_management/schemas/__init__.py +3 -0
- autobyteus/task_management/schemas/task_status_report.py +2 -2
- autobyteus/task_management/schemas/todo_definition.py +15 -0
- autobyteus/task_management/todo.py +29 -0
- autobyteus/task_management/todo_list.py +75 -0
- autobyteus/task_management/tools/__init__.py +24 -8
- autobyteus/task_management/tools/task_tools/__init__.py +19 -0
- autobyteus/task_management/tools/{assign_task_to.py → task_tools/assign_task_to.py} +18 -18
- autobyteus/task_management/tools/{publish_task.py → task_tools/create_task.py} +16 -18
- autobyteus/task_management/tools/{publish_tasks.py → task_tools/create_tasks.py} +19 -19
- autobyteus/task_management/tools/{get_my_tasks.py → task_tools/get_my_tasks.py} +15 -15
- autobyteus/task_management/tools/{get_task_board_status.py → task_tools/get_task_plan_status.py} +16 -16
- autobyteus/task_management/tools/{update_task_status.py → task_tools/update_task_status.py} +16 -16
- autobyteus/task_management/tools/todo_tools/__init__.py +18 -0
- autobyteus/task_management/tools/todo_tools/add_todo.py +78 -0
- autobyteus/task_management/tools/todo_tools/create_todo_list.py +79 -0
- autobyteus/task_management/tools/todo_tools/get_todo_list.py +55 -0
- autobyteus/task_management/tools/todo_tools/update_todo_status.py +85 -0
- autobyteus/tools/__init__.py +43 -52
- autobyteus/tools/base_tool.py +7 -0
- autobyteus/tools/file/__init__.py +9 -0
- autobyteus/tools/file/patch_file.py +149 -0
- autobyteus/tools/file/{file_reader.py → read_file.py} +38 -7
- autobyteus/tools/file/{file_writer.py → write_file.py} +7 -4
- autobyteus/tools/functional_tool.py +53 -14
- autobyteus/tools/mcp/__init__.py +2 -0
- autobyteus/tools/mcp/config_service.py +5 -1
- autobyteus/tools/mcp/server/__init__.py +2 -0
- autobyteus/tools/mcp/server/http_managed_mcp_server.py +1 -1
- autobyteus/tools/mcp/server/websocket_managed_mcp_server.py +141 -0
- autobyteus/tools/mcp/server_instance_manager.py +8 -1
- autobyteus/tools/mcp/tool.py +3 -3
- autobyteus/tools/mcp/tool_registrar.py +5 -2
- autobyteus/tools/mcp/types.py +61 -0
- autobyteus/tools/multimedia/__init__.py +2 -1
- autobyteus/tools/multimedia/audio_tools.py +72 -19
- autobyteus/tools/{download_media_tool.py → multimedia/download_media_tool.py} +21 -7
- autobyteus/tools/multimedia/image_tools.py +248 -64
- autobyteus/tools/multimedia/media_reader_tool.py +1 -1
- autobyteus/tools/operation_executor/journal_manager.py +107 -0
- autobyteus/tools/operation_executor/operation_event_buffer.py +57 -0
- autobyteus/tools/operation_executor/operation_event_producer.py +29 -0
- autobyteus/tools/operation_executor/operation_executor.py +58 -0
- autobyteus/tools/registry/tool_definition.py +108 -14
- autobyteus/tools/registry/tool_registry.py +29 -0
- autobyteus/tools/search/__init__.py +17 -0
- autobyteus/tools/search/base_strategy.py +35 -0
- autobyteus/tools/search/client.py +24 -0
- autobyteus/tools/search/factory.py +81 -0
- autobyteus/tools/search/google_cse_strategy.py +68 -0
- autobyteus/tools/search/providers.py +10 -0
- autobyteus/tools/search/serpapi_strategy.py +65 -0
- autobyteus/tools/search/serper_strategy.py +87 -0
- autobyteus/tools/search_tool.py +83 -0
- autobyteus/tools/skill/load_skill.py +50 -0
- autobyteus/tools/terminal/__init__.py +45 -0
- autobyteus/tools/terminal/ansi_utils.py +32 -0
- autobyteus/tools/terminal/background_process_manager.py +233 -0
- autobyteus/tools/terminal/output_buffer.py +105 -0
- autobyteus/tools/terminal/prompt_detector.py +63 -0
- autobyteus/tools/terminal/pty_session.py +241 -0
- autobyteus/tools/terminal/session_factory.py +20 -0
- autobyteus/tools/terminal/terminal_session_manager.py +226 -0
- autobyteus/tools/terminal/tools/__init__.py +13 -0
- autobyteus/tools/terminal/tools/get_process_output.py +81 -0
- autobyteus/tools/terminal/tools/run_bash.py +109 -0
- autobyteus/tools/terminal/tools/start_background_process.py +104 -0
- autobyteus/tools/terminal/tools/stop_background_process.py +67 -0
- autobyteus/tools/terminal/types.py +54 -0
- autobyteus/tools/terminal/wsl_tmux_session.py +221 -0
- autobyteus/tools/terminal/wsl_utils.py +156 -0
- autobyteus/tools/tool_meta.py +4 -24
- autobyteus/tools/transaction_management/backup_handler.py +48 -0
- autobyteus/tools/transaction_management/operation_lifecycle_manager.py +62 -0
- autobyteus/tools/usage/__init__.py +1 -2
- autobyteus/tools/usage/formatters/__init__.py +17 -1
- autobyteus/tools/usage/formatters/base_formatter.py +8 -0
- autobyteus/tools/usage/formatters/default_xml_schema_formatter.py +2 -2
- autobyteus/tools/usage/formatters/mistral_json_schema_formatter.py +18 -0
- autobyteus/tools/usage/formatters/patch_file_xml_example_formatter.py +64 -0
- autobyteus/tools/usage/formatters/patch_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/formatters/run_bash_xml_example_formatter.py +32 -0
- autobyteus/tools/usage/formatters/run_bash_xml_schema_formatter.py +36 -0
- autobyteus/tools/usage/formatters/write_file_xml_example_formatter.py +53 -0
- autobyteus/tools/usage/formatters/write_file_xml_schema_formatter.py +31 -0
- autobyteus/tools/usage/providers/tool_manifest_provider.py +10 -10
- autobyteus/tools/usage/registries/__init__.py +1 -3
- autobyteus/tools/usage/registries/tool_formatting_registry.py +115 -8
- autobyteus/tools/usage/tool_schema_provider.py +51 -0
- autobyteus/tools/web/__init__.py +4 -0
- autobyteus/tools/web/read_url_tool.py +80 -0
- autobyteus/utils/diff_utils.py +271 -0
- autobyteus/utils/download_utils.py +109 -0
- autobyteus/utils/file_utils.py +57 -2
- autobyteus/utils/gemini_helper.py +56 -0
- autobyteus/utils/gemini_model_mapping.py +71 -0
- autobyteus/utils/llm_output_formatter.py +75 -0
- autobyteus/utils/tool_call_format.py +36 -0
- autobyteus/workflow/agentic_workflow.py +3 -3
- autobyteus/workflow/bootstrap_steps/agent_tool_injection_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/base_workflow_bootstrap_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_initialization_step.py +2 -2
- autobyteus/workflow/bootstrap_steps/coordinator_prompt_preparation_step.py +4 -11
- autobyteus/workflow/bootstrap_steps/workflow_bootstrapper.py +6 -6
- autobyteus/workflow/bootstrap_steps/workflow_runtime_queue_initialization_step.py +2 -2
- autobyteus/workflow/context/workflow_context.py +3 -3
- autobyteus/workflow/context/workflow_runtime_state.py +5 -5
- autobyteus/workflow/events/workflow_event_dispatcher.py +5 -5
- autobyteus/workflow/handlers/lifecycle_workflow_event_handler.py +3 -3
- autobyteus/workflow/handlers/process_user_message_event_handler.py +5 -5
- autobyteus/workflow/handlers/tool_approval_workflow_event_handler.py +2 -2
- autobyteus/workflow/runtime/workflow_runtime.py +8 -8
- autobyteus/workflow/runtime/workflow_worker.py +3 -3
- autobyteus/workflow/status/__init__.py +11 -0
- autobyteus/workflow/status/workflow_status.py +19 -0
- autobyteus/workflow/status/workflow_status_manager.py +48 -0
- autobyteus/workflow/streaming/__init__.py +2 -2
- autobyteus/workflow/streaming/workflow_event_notifier.py +7 -7
- autobyteus/workflow/streaming/workflow_stream_event_payloads.py +4 -4
- autobyteus/workflow/streaming/workflow_stream_events.py +3 -3
- autobyteus/workflow/utils/wait_for_idle.py +4 -4
- autobyteus-1.2.3.dist-info/METADATA +293 -0
- autobyteus-1.2.3.dist-info/RECORD +600 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/WHEEL +1 -1
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/top_level.txt +0 -1
- autobyteus/agent/bootstrap_steps/agent_runtime_queue_initialization_step.py +0 -57
- autobyteus/agent/hooks/__init__.py +0 -16
- autobyteus/agent/hooks/base_phase_hook.py +0 -78
- autobyteus/agent/hooks/hook_definition.py +0 -36
- autobyteus/agent/hooks/hook_meta.py +0 -37
- autobyteus/agent/hooks/hook_registry.py +0 -106
- autobyteus/agent/llm_response_processor/provider_aware_tool_usage_processor.py +0 -103
- autobyteus/agent/phases/__init__.py +0 -18
- autobyteus/agent/phases/discover.py +0 -53
- autobyteus/agent/phases/manager.py +0 -265
- autobyteus/agent/phases/transition_decorator.py +0 -40
- autobyteus/agent/phases/transition_info.py +0 -33
- autobyteus/agent/remote_agent.py +0 -244
- autobyteus/agent/workspace/workspace_definition.py +0 -36
- autobyteus/agent/workspace/workspace_meta.py +0 -37
- autobyteus/agent/workspace/workspace_registry.py +0 -72
- autobyteus/agent_team/bootstrap_steps/agent_team_runtime_queue_initialization_step.py +0 -25
- autobyteus/agent_team/bootstrap_steps/coordinator_prompt_preparation_step.py +0 -85
- autobyteus/agent_team/phases/__init__.py +0 -11
- autobyteus/agent_team/phases/agent_team_operational_phase.py +0 -19
- autobyteus/agent_team/phases/agent_team_phase_manager.py +0 -48
- autobyteus/llm/api/bedrock_llm.py +0 -92
- autobyteus/llm/api/groq_llm.py +0 -94
- autobyteus/llm/api/nvidia_llm.py +0 -108
- autobyteus/llm/utils/token_pricing_config.py +0 -87
- autobyteus/person/examples/sample_persons.py +0 -14
- autobyteus/person/examples/sample_roles.py +0 -14
- autobyteus/person/person.py +0 -29
- autobyteus/person/role.py +0 -14
- autobyteus/rpc/__init__.py +0 -73
- autobyteus/rpc/client/__init__.py +0 -17
- autobyteus/rpc/client/abstract_client_connection.py +0 -124
- autobyteus/rpc/client/client_connection_manager.py +0 -153
- autobyteus/rpc/client/sse_client_connection.py +0 -306
- autobyteus/rpc/client/stdio_client_connection.py +0 -280
- autobyteus/rpc/config/__init__.py +0 -13
- autobyteus/rpc/config/agent_server_config.py +0 -153
- autobyteus/rpc/config/agent_server_registry.py +0 -152
- autobyteus/rpc/hosting.py +0 -244
- autobyteus/rpc/protocol.py +0 -244
- autobyteus/rpc/server/__init__.py +0 -20
- autobyteus/rpc/server/agent_server_endpoint.py +0 -181
- autobyteus/rpc/server/base_method_handler.py +0 -40
- autobyteus/rpc/server/method_handlers.py +0 -259
- autobyteus/rpc/server/sse_server_handler.py +0 -182
- autobyteus/rpc/server/stdio_server_handler.py +0 -151
- autobyteus/rpc/server_main.py +0 -198
- autobyteus/rpc/transport_type.py +0 -13
- autobyteus/tools/bash/__init__.py +0 -2
- autobyteus/tools/bash/bash_executor.py +0 -100
- autobyteus/tools/browser/__init__.py +0 -2
- autobyteus/tools/browser/session_aware/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/browser_session_aware_navigate_to.py +0 -75
- autobyteus/tools/browser/session_aware/browser_session_aware_tool.py +0 -30
- autobyteus/tools/browser/session_aware/browser_session_aware_web_element_trigger.py +0 -154
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_reader.py +0 -89
- autobyteus/tools/browser/session_aware/browser_session_aware_webpage_screenshot_taker.py +0 -107
- autobyteus/tools/browser/session_aware/factory/__init__.py +0 -0
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_web_element_trigger_factory.py +0 -14
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_reader_factory.py +0 -26
- autobyteus/tools/browser/session_aware/factory/browser_session_aware_webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/session_aware/shared_browser_session.py +0 -11
- autobyteus/tools/browser/session_aware/shared_browser_session_manager.py +0 -25
- autobyteus/tools/browser/session_aware/web_element_action.py +0 -20
- autobyteus/tools/browser/standalone/__init__.py +0 -6
- autobyteus/tools/browser/standalone/factory/__init__.py +0 -0
- autobyteus/tools/browser/standalone/factory/webpage_reader_factory.py +0 -25
- autobyteus/tools/browser/standalone/factory/webpage_screenshot_taker_factory.py +0 -14
- autobyteus/tools/browser/standalone/navigate_to.py +0 -80
- autobyteus/tools/browser/standalone/web_page_pdf_generator.py +0 -97
- autobyteus/tools/browser/standalone/webpage_image_downloader.py +0 -165
- autobyteus/tools/browser/standalone/webpage_reader.py +0 -101
- autobyteus/tools/browser/standalone/webpage_screenshot_taker.py +0 -101
- autobyteus/tools/file/file_editor.py +0 -200
- autobyteus/tools/google_search.py +0 -149
- autobyteus/tools/timer.py +0 -171
- autobyteus/tools/usage/parsers/__init__.py +0 -22
- autobyteus/tools/usage/parsers/_json_extractor.py +0 -99
- autobyteus/tools/usage/parsers/_string_decoders.py +0 -18
- autobyteus/tools/usage/parsers/anthropic_xml_tool_usage_parser.py +0 -10
- autobyteus/tools/usage/parsers/base_parser.py +0 -41
- autobyteus/tools/usage/parsers/default_json_tool_usage_parser.py +0 -83
- autobyteus/tools/usage/parsers/default_xml_tool_usage_parser.py +0 -316
- autobyteus/tools/usage/parsers/exceptions.py +0 -13
- autobyteus/tools/usage/parsers/gemini_json_tool_usage_parser.py +0 -77
- autobyteus/tools/usage/parsers/openai_json_tool_usage_parser.py +0 -149
- autobyteus/tools/usage/parsers/provider_aware_tool_usage_parser.py +0 -59
- autobyteus/tools/usage/registries/tool_usage_parser_registry.py +0 -62
- autobyteus/workflow/phases/__init__.py +0 -11
- autobyteus/workflow/phases/workflow_operational_phase.py +0 -19
- autobyteus/workflow/phases/workflow_phase_manager.py +0 -48
- autobyteus-1.2.0.dist-info/METADATA +0 -205
- autobyteus-1.2.0.dist-info/RECORD +0 -496
- examples/__init__.py +0 -1
- examples/agent_team/__init__.py +0 -1
- examples/discover_phase_transitions.py +0 -104
- examples/run_browser_agent.py +0 -262
- examples/run_google_slides_agent.py +0 -287
- examples/run_mcp_browser_client.py +0 -174
- examples/run_mcp_google_slides_client.py +0 -270
- examples/run_mcp_list_tools.py +0 -189
- examples/run_poem_writer.py +0 -284
- examples/run_sqlite_agent.py +0 -295
- /autobyteus/{person → skills}/__init__.py +0 -0
- /autobyteus/{person/examples → tools/skill}/__init__.py +0 -0
- {autobyteus-1.2.0.dist-info → autobyteus-1.2.3.dist-info}/licenses/LICENSE +0 -0
autobyteus/llm/utils/messages.py
CHANGED
|
@@ -1,10 +1,35 @@
|
|
|
1
|
-
from
|
|
1
|
+
from dataclasses import dataclass
|
|
2
|
+
from typing import Dict, Union, List, Optional, Any
|
|
2
3
|
from enum import Enum
|
|
3
4
|
|
|
4
5
|
class MessageRole(Enum):
|
|
5
6
|
SYSTEM = "system"
|
|
6
7
|
USER = "user"
|
|
7
8
|
ASSISTANT = "assistant"
|
|
9
|
+
TOOL = "tool"
|
|
10
|
+
|
|
11
|
+
@dataclass
|
|
12
|
+
class ToolCallSpec:
|
|
13
|
+
id: str
|
|
14
|
+
name: str
|
|
15
|
+
arguments: Dict[str, Any]
|
|
16
|
+
|
|
17
|
+
|
|
18
|
+
@dataclass
|
|
19
|
+
class ToolCallPayload:
|
|
20
|
+
tool_calls: List[ToolCallSpec]
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
@dataclass
|
|
24
|
+
class ToolResultPayload:
|
|
25
|
+
tool_call_id: str
|
|
26
|
+
tool_name: str
|
|
27
|
+
tool_result: Any
|
|
28
|
+
tool_error: Optional[str] = None
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
ToolPayload = Union[ToolCallPayload, ToolResultPayload]
|
|
32
|
+
|
|
8
33
|
|
|
9
34
|
class Message:
|
|
10
35
|
def __init__(self,
|
|
@@ -13,7 +38,8 @@ class Message:
|
|
|
13
38
|
reasoning_content: Optional[str] = None,
|
|
14
39
|
image_urls: Optional[List[str]] = None,
|
|
15
40
|
audio_urls: Optional[List[str]] = None,
|
|
16
|
-
video_urls: Optional[List[str]] = None
|
|
41
|
+
video_urls: Optional[List[str]] = None,
|
|
42
|
+
tool_payload: Optional[ToolPayload] = None):
|
|
17
43
|
"""
|
|
18
44
|
Initializes a rich Message object for conversation history.
|
|
19
45
|
|
|
@@ -24,6 +50,7 @@ class Message:
|
|
|
24
50
|
image_urls: Optional list of image URIs.
|
|
25
51
|
audio_urls: Optional list of audio URIs.
|
|
26
52
|
video_urls: Optional list of video URIs.
|
|
53
|
+
tool_payload: Optional tool payload (tool calls or tool result).
|
|
27
54
|
"""
|
|
28
55
|
self.role = role
|
|
29
56
|
self.content = content
|
|
@@ -31,8 +58,32 @@ class Message:
|
|
|
31
58
|
self.image_urls = image_urls or []
|
|
32
59
|
self.audio_urls = audio_urls or []
|
|
33
60
|
self.video_urls = video_urls or []
|
|
61
|
+
self.tool_payload = tool_payload
|
|
62
|
+
|
|
63
|
+
def _serialize_tool_payload(self) -> Optional[Dict[str, Any]]:
|
|
64
|
+
if self.tool_payload is None:
|
|
65
|
+
return None
|
|
66
|
+
if isinstance(self.tool_payload, ToolCallPayload):
|
|
67
|
+
return {
|
|
68
|
+
"tool_calls": [
|
|
69
|
+
{
|
|
70
|
+
"id": call.id,
|
|
71
|
+
"name": call.name,
|
|
72
|
+
"arguments": call.arguments,
|
|
73
|
+
}
|
|
74
|
+
for call in self.tool_payload.tool_calls
|
|
75
|
+
]
|
|
76
|
+
}
|
|
77
|
+
if isinstance(self.tool_payload, ToolResultPayload):
|
|
78
|
+
return {
|
|
79
|
+
"tool_call_id": self.tool_payload.tool_call_id,
|
|
80
|
+
"tool_name": self.tool_payload.tool_name,
|
|
81
|
+
"tool_result": self.tool_payload.tool_result,
|
|
82
|
+
"tool_error": self.tool_payload.tool_error,
|
|
83
|
+
}
|
|
84
|
+
return None
|
|
34
85
|
|
|
35
|
-
def to_dict(self) -> Dict[str,
|
|
86
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
36
87
|
"""
|
|
37
88
|
Returns a simple dictionary representation of the Message object.
|
|
38
89
|
This is for internal use and does not format for any specific API.
|
|
@@ -44,4 +95,5 @@ class Message:
|
|
|
44
95
|
"image_urls": self.image_urls,
|
|
45
96
|
"audio_urls": self.audio_urls,
|
|
46
97
|
"video_urls": self.video_urls,
|
|
98
|
+
"tool_payload": self._serialize_tool_payload(),
|
|
47
99
|
}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
from dataclasses import dataclass, field
|
|
2
2
|
from typing import Optional, List
|
|
3
3
|
from autobyteus.llm.utils.token_usage import TokenUsage
|
|
4
|
+
from autobyteus.llm.utils.tool_call_delta import ToolCallDelta
|
|
4
5
|
|
|
5
6
|
@dataclass
|
|
6
7
|
class CompleteResponse:
|
|
@@ -24,3 +25,5 @@ class ChunkResponse:
|
|
|
24
25
|
image_urls: List[str] = field(default_factory=list)
|
|
25
26
|
audio_urls: List[str] = field(default_factory=list)
|
|
26
27
|
video_urls: List[str] = field(default_factory=list)
|
|
28
|
+
tool_calls: Optional[List[ToolCallDelta]] = None # API-provided tool call deltas
|
|
29
|
+
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
# file: autobyteus/autobyteus/llm/utils/tool_call_delta.py
|
|
2
|
+
"""
|
|
3
|
+
Provider-agnostic representation of streaming tool call updates.
|
|
4
|
+
|
|
5
|
+
This dataclass normalizes tool call deltas from different LLM providers
|
|
6
|
+
(OpenAI, Anthropic, Gemini) into a common format for the streaming architecture.
|
|
7
|
+
"""
|
|
8
|
+
|
|
9
|
+
from dataclasses import dataclass
|
|
10
|
+
from typing import Optional
|
|
11
|
+
|
|
12
|
+
|
|
13
|
+
@dataclass
|
|
14
|
+
class ToolCallDelta:
|
|
15
|
+
"""
|
|
16
|
+
A normalized, provider-agnostic representation of a tool call update
|
|
17
|
+
received during streaming.
|
|
18
|
+
|
|
19
|
+
Attributes:
|
|
20
|
+
index: Position in parallel tool calls (0-based). Used to track
|
|
21
|
+
multiple concurrent tool calls in the same response.
|
|
22
|
+
call_id: Unique ID for this tool call. Present only in the first
|
|
23
|
+
chunk for this index.
|
|
24
|
+
name: Tool/function name. Present only in the first chunk for this index.
|
|
25
|
+
arguments_delta: Partial JSON string of arguments. Accumulated across
|
|
26
|
+
multiple chunks to form complete arguments.
|
|
27
|
+
"""
|
|
28
|
+
index: int
|
|
29
|
+
call_id: Optional[str] = None
|
|
30
|
+
name: Optional[str] = None
|
|
31
|
+
arguments_delta: Optional[str] = None
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
from autobyteus.memory.models.memory_types import MemoryType
|
|
2
|
+
from autobyteus.memory.models.raw_trace_item import RawTraceItem
|
|
3
|
+
from autobyteus.memory.models.episodic_item import EpisodicItem
|
|
4
|
+
from autobyteus.memory.models.semantic_item import SemanticItem
|
|
5
|
+
from autobyteus.memory.models.tool_interaction import ToolInteraction, ToolInteractionStatus
|
|
6
|
+
from autobyteus.memory.store.file_store import FileMemoryStore
|
|
7
|
+
from autobyteus.memory.turn_tracker import TurnTracker
|
|
8
|
+
from autobyteus.memory.memory_manager import MemoryManager
|
|
9
|
+
from autobyteus.memory.policies.compaction_policy import CompactionPolicy
|
|
10
|
+
from autobyteus.memory.compaction.compactor import Compactor
|
|
11
|
+
from autobyteus.memory.compaction.compaction_result import CompactionResult
|
|
12
|
+
from autobyteus.memory.compaction.summarizer import Summarizer
|
|
13
|
+
from autobyteus.memory.retrieval.memory_bundle import MemoryBundle
|
|
14
|
+
from autobyteus.memory.retrieval.retriever import Retriever
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"MemoryType",
|
|
18
|
+
"RawTraceItem",
|
|
19
|
+
"EpisodicItem",
|
|
20
|
+
"SemanticItem",
|
|
21
|
+
"ToolInteraction",
|
|
22
|
+
"ToolInteractionStatus",
|
|
23
|
+
"FileMemoryStore",
|
|
24
|
+
"TurnTracker",
|
|
25
|
+
"MemoryManager",
|
|
26
|
+
"CompactionPolicy",
|
|
27
|
+
"Compactor",
|
|
28
|
+
"CompactionResult",
|
|
29
|
+
"Summarizer",
|
|
30
|
+
"MemoryBundle",
|
|
31
|
+
"Retriever",
|
|
32
|
+
]
|
|
@@ -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 ActiveTranscript:
|
|
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()
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
from autobyteus.memory.compaction.compactor import Compactor
|
|
2
|
+
from autobyteus.memory.compaction.compaction_result import CompactionResult
|
|
3
|
+
from autobyteus.memory.compaction.summarizer import Summarizer
|
|
4
|
+
|
|
5
|
+
__all__ = [
|
|
6
|
+
"Compactor",
|
|
7
|
+
"CompactionResult",
|
|
8
|
+
"Summarizer",
|
|
9
|
+
]
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from typing import List, Optional
|
|
3
|
+
|
|
4
|
+
from autobyteus.memory.models.memory_types import MemoryType
|
|
5
|
+
from autobyteus.memory.models.raw_trace_item import RawTraceItem
|
|
6
|
+
from autobyteus.memory.models.episodic_item import EpisodicItem
|
|
7
|
+
from autobyteus.memory.models.semantic_item import SemanticItem
|
|
8
|
+
from autobyteus.memory.compaction.compaction_result import CompactionResult
|
|
9
|
+
from autobyteus.memory.compaction.summarizer import Summarizer
|
|
10
|
+
from autobyteus.memory.policies.compaction_policy import CompactionPolicy
|
|
11
|
+
from autobyteus.memory.store.base_store import MemoryStore
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
class Compactor:
|
|
15
|
+
def __init__(self, store: MemoryStore, policy: CompactionPolicy, summarizer: Summarizer):
|
|
16
|
+
self.store = store
|
|
17
|
+
self.policy = policy
|
|
18
|
+
self.summarizer = summarizer
|
|
19
|
+
self.memory_types = MemoryType
|
|
20
|
+
|
|
21
|
+
def select_compaction_window(self) -> List[str]:
|
|
22
|
+
raw_items = self.store.list(MemoryType.RAW_TRACE)
|
|
23
|
+
turn_ids: List[str] = []
|
|
24
|
+
seen = set()
|
|
25
|
+
for item in raw_items:
|
|
26
|
+
if not isinstance(item, RawTraceItem):
|
|
27
|
+
continue
|
|
28
|
+
if item.turn_id not in seen:
|
|
29
|
+
seen.add(item.turn_id)
|
|
30
|
+
turn_ids.append(item.turn_id)
|
|
31
|
+
|
|
32
|
+
if self.policy.raw_tail_turns <= 0:
|
|
33
|
+
return turn_ids
|
|
34
|
+
if len(turn_ids) <= self.policy.raw_tail_turns:
|
|
35
|
+
return []
|
|
36
|
+
return turn_ids[:-self.policy.raw_tail_turns]
|
|
37
|
+
|
|
38
|
+
def get_traces_for_turns(self, turn_ids: List[str]) -> List[RawTraceItem]:
|
|
39
|
+
raw_items = self.store.list(MemoryType.RAW_TRACE)
|
|
40
|
+
turn_set = set(turn_ids)
|
|
41
|
+
return [
|
|
42
|
+
item
|
|
43
|
+
for item in raw_items
|
|
44
|
+
if isinstance(item, RawTraceItem) and item.turn_id in turn_set
|
|
45
|
+
]
|
|
46
|
+
|
|
47
|
+
def compact(self, turn_ids: List[str]) -> Optional[CompactionResult]:
|
|
48
|
+
if not turn_ids:
|
|
49
|
+
return None
|
|
50
|
+
|
|
51
|
+
traces = self.get_traces_for_turns(turn_ids)
|
|
52
|
+
result = self.summarizer.summarize(traces)
|
|
53
|
+
|
|
54
|
+
episodic_item = EpisodicItem(
|
|
55
|
+
id=f"ep_{int(time.time() * 1000)}",
|
|
56
|
+
ts=time.time(),
|
|
57
|
+
turn_ids=turn_ids,
|
|
58
|
+
summary=result.episodic_summary,
|
|
59
|
+
tags=[],
|
|
60
|
+
salience=0.0,
|
|
61
|
+
)
|
|
62
|
+
|
|
63
|
+
semantic_items = []
|
|
64
|
+
for idx, fact_data in enumerate(result.semantic_facts, start=1):
|
|
65
|
+
semantic_items.append(
|
|
66
|
+
SemanticItem(
|
|
67
|
+
id=f"sem_{int(time.time() * 1000)}_{idx}",
|
|
68
|
+
ts=time.time(),
|
|
69
|
+
fact=fact_data.get("fact", ""),
|
|
70
|
+
tags=fact_data.get("tags", []),
|
|
71
|
+
confidence=fact_data.get("confidence", 0.0),
|
|
72
|
+
salience=0.0,
|
|
73
|
+
)
|
|
74
|
+
)
|
|
75
|
+
|
|
76
|
+
self.store.add([episodic_item, *semantic_items])
|
|
77
|
+
self._prune_raw_traces(turn_ids)
|
|
78
|
+
return result
|
|
79
|
+
|
|
80
|
+
def _prune_raw_traces(self, compacted_turn_ids: List[str]) -> None:
|
|
81
|
+
raw_items = self.store.list(MemoryType.RAW_TRACE)
|
|
82
|
+
remaining_turns = {
|
|
83
|
+
item.turn_id
|
|
84
|
+
for item in raw_items
|
|
85
|
+
if isinstance(item, RawTraceItem) and item.turn_id not in compacted_turn_ids
|
|
86
|
+
}
|
|
87
|
+
prune = getattr(self.store, "prune_raw_traces", None)
|
|
88
|
+
if callable(prune):
|
|
89
|
+
prune(keep_turn_ids=remaining_turns, archive=True)
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
from abc import ABC, abstractmethod
|
|
2
|
+
from typing import List
|
|
3
|
+
|
|
4
|
+
from autobyteus.memory.models.raw_trace_item import RawTraceItem
|
|
5
|
+
from autobyteus.memory.compaction.compaction_result import CompactionResult
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class Summarizer(ABC):
|
|
9
|
+
@abstractmethod
|
|
10
|
+
def summarize(self, traces: List[RawTraceItem]) -> CompactionResult:
|
|
11
|
+
raise NotImplementedError
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
from typing import List, Dict
|
|
2
|
+
|
|
3
|
+
from autobyteus.llm.utils.messages import Message, MessageRole
|
|
4
|
+
from autobyteus.memory.models.raw_trace_item import RawTraceItem
|
|
5
|
+
from autobyteus.memory.retrieval.memory_bundle import MemoryBundle
|
|
6
|
+
from autobyteus.memory.tool_interaction_builder import build_tool_interactions
|
|
7
|
+
from autobyteus.memory.models.tool_interaction import ToolInteractionStatus
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class CompactionSnapshotBuilder:
|
|
11
|
+
def build(self, system_prompt: str, bundle: MemoryBundle, raw_tail: List[RawTraceItem]) -> List[Message]:
|
|
12
|
+
parts: List[str] = []
|
|
13
|
+
|
|
14
|
+
if bundle.episodic:
|
|
15
|
+
parts.append("[MEMORY:EPISODIC]")
|
|
16
|
+
for idx, item in enumerate(bundle.episodic, start=1):
|
|
17
|
+
parts.append(f"{idx}) {item.summary}")
|
|
18
|
+
parts.append("")
|
|
19
|
+
|
|
20
|
+
if bundle.semantic:
|
|
21
|
+
parts.append("[MEMORY:SEMANTIC]")
|
|
22
|
+
for item in bundle.semantic:
|
|
23
|
+
parts.append(f"- {item.fact}")
|
|
24
|
+
parts.append("")
|
|
25
|
+
|
|
26
|
+
if raw_tail:
|
|
27
|
+
parts.append("[RECENT TURNS]")
|
|
28
|
+
parts.extend(self._format_recent_turns(raw_tail))
|
|
29
|
+
parts.append("")
|
|
30
|
+
|
|
31
|
+
summary_text = "\n".join(parts).strip()
|
|
32
|
+
|
|
33
|
+
messages = [Message(role=MessageRole.SYSTEM, content=system_prompt)]
|
|
34
|
+
if summary_text:
|
|
35
|
+
messages.append(Message(role=MessageRole.USER, content=summary_text))
|
|
36
|
+
return messages
|
|
37
|
+
|
|
38
|
+
def _format_recent_turns(self, raw_tail: List[RawTraceItem]) -> List[str]:
|
|
39
|
+
lines: List[str] = []
|
|
40
|
+
interactions = build_tool_interactions(raw_tail)
|
|
41
|
+
interaction_ids = {interaction.tool_call_id for interaction in interactions}
|
|
42
|
+
|
|
43
|
+
first_trace_by_call_id: Dict[str, RawTraceItem] = {}
|
|
44
|
+
for item in raw_tail:
|
|
45
|
+
if item.tool_call_id and item.tool_call_id not in first_trace_by_call_id:
|
|
46
|
+
first_trace_by_call_id[item.tool_call_id] = item
|
|
47
|
+
|
|
48
|
+
def sort_key(interaction):
|
|
49
|
+
trace = first_trace_by_call_id.get(interaction.tool_call_id)
|
|
50
|
+
return trace.seq if trace else 0
|
|
51
|
+
|
|
52
|
+
for interaction in sorted(interactions, key=sort_key):
|
|
53
|
+
trace = first_trace_by_call_id.get(interaction.tool_call_id)
|
|
54
|
+
if trace:
|
|
55
|
+
prefix = f"({trace.turn_id}:{trace.seq}) TOOL:"
|
|
56
|
+
else:
|
|
57
|
+
prefix = "(unknown) TOOL:"
|
|
58
|
+
|
|
59
|
+
if interaction.status == ToolInteractionStatus.PENDING:
|
|
60
|
+
result_text = "pending"
|
|
61
|
+
elif interaction.status == ToolInteractionStatus.ERROR:
|
|
62
|
+
result_text = interaction.error or "error"
|
|
63
|
+
else:
|
|
64
|
+
result_text = interaction.result
|
|
65
|
+
|
|
66
|
+
lines.append(
|
|
67
|
+
f"{prefix} {interaction.tool_name} {interaction.arguments} -> {result_text}"
|
|
68
|
+
)
|
|
69
|
+
|
|
70
|
+
for item in raw_tail:
|
|
71
|
+
if item.trace_type in {"tool_call", "tool_result"} and item.tool_call_id in interaction_ids:
|
|
72
|
+
continue
|
|
73
|
+
lines.append(self._format_raw_trace(item))
|
|
74
|
+
|
|
75
|
+
return lines
|
|
76
|
+
|
|
77
|
+
def _format_raw_trace(self, item: RawTraceItem) -> str:
|
|
78
|
+
prefix = f"({item.turn_id}:{item.seq}) {item.trace_type.upper()}:"
|
|
79
|
+
if item.trace_type == "tool_call":
|
|
80
|
+
return f"{prefix} {item.tool_name} {item.tool_args}"
|
|
81
|
+
if item.trace_type == "tool_result":
|
|
82
|
+
result = item.tool_error if item.tool_error else item.tool_result
|
|
83
|
+
return f"{prefix} {item.tool_name} {result}"
|
|
84
|
+
return f"{prefix} {item.content}"
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import time
|
|
2
|
+
from typing import Optional, List
|
|
3
|
+
|
|
4
|
+
from autobyteus.agent.events.agent_events import ToolResultEvent
|
|
5
|
+
from autobyteus.agent.tool_invocation import ToolInvocation
|
|
6
|
+
from autobyteus.llm.user_message import LLMUserMessage
|
|
7
|
+
from autobyteus.llm.utils.messages import ToolCallSpec
|
|
8
|
+
from autobyteus.llm.utils.response_types import CompleteResponse
|
|
9
|
+
from autobyteus.memory.models.raw_trace_item import RawTraceItem
|
|
10
|
+
from autobyteus.memory.models.memory_types import MemoryType
|
|
11
|
+
from autobyteus.memory.policies.compaction_policy import CompactionPolicy
|
|
12
|
+
from autobyteus.memory.compaction.compactor import Compactor
|
|
13
|
+
from autobyteus.memory.retrieval.retriever import Retriever
|
|
14
|
+
from autobyteus.memory.store.base_store import MemoryStore
|
|
15
|
+
from autobyteus.memory.turn_tracker import TurnTracker
|
|
16
|
+
from autobyteus.memory.active_transcript import ActiveTranscript
|
|
17
|
+
from autobyteus.memory.tool_interaction_builder import build_tool_interactions
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class MemoryManager:
|
|
21
|
+
def __init__(
|
|
22
|
+
self,
|
|
23
|
+
store: MemoryStore,
|
|
24
|
+
turn_tracker: Optional[TurnTracker] = None,
|
|
25
|
+
compaction_policy: Optional[CompactionPolicy] = None,
|
|
26
|
+
compactor: Optional[Compactor] = None,
|
|
27
|
+
retriever: Optional[Retriever] = None,
|
|
28
|
+
active_transcript: Optional[ActiveTranscript] = None,
|
|
29
|
+
):
|
|
30
|
+
self.store = store
|
|
31
|
+
self.turn_tracker = turn_tracker or TurnTracker()
|
|
32
|
+
self.compaction_policy = compaction_policy or CompactionPolicy()
|
|
33
|
+
self.compactor = compactor
|
|
34
|
+
self.retriever = retriever or Retriever(store=store)
|
|
35
|
+
self.memory_types = MemoryType
|
|
36
|
+
self._seq_by_turn: dict[str, int] = {}
|
|
37
|
+
self.active_transcript = active_transcript or ActiveTranscript()
|
|
38
|
+
self.compaction_required: bool = False
|
|
39
|
+
|
|
40
|
+
def start_turn(self) -> str:
|
|
41
|
+
return self.turn_tracker.next_turn_id()
|
|
42
|
+
|
|
43
|
+
def request_compaction(self) -> None:
|
|
44
|
+
self.compaction_required = True
|
|
45
|
+
|
|
46
|
+
def clear_compaction_request(self) -> None:
|
|
47
|
+
self.compaction_required = False
|
|
48
|
+
|
|
49
|
+
def _next_seq(self, turn_id: str) -> int:
|
|
50
|
+
current = self._seq_by_turn.get(turn_id, 0) + 1
|
|
51
|
+
self._seq_by_turn[turn_id] = current
|
|
52
|
+
return current
|
|
53
|
+
|
|
54
|
+
def ingest_user_message(self, llm_user_message: LLMUserMessage, turn_id: str, source_event: str) -> None:
|
|
55
|
+
trace = RawTraceItem(
|
|
56
|
+
id=f"rt_{int(time.time() * 1000)}",
|
|
57
|
+
ts=time.time(),
|
|
58
|
+
turn_id=turn_id,
|
|
59
|
+
seq=self._next_seq(turn_id),
|
|
60
|
+
trace_type="user",
|
|
61
|
+
content=llm_user_message.content,
|
|
62
|
+
source_event=source_event,
|
|
63
|
+
media={
|
|
64
|
+
"images": llm_user_message.image_urls or [],
|
|
65
|
+
"audio": llm_user_message.audio_urls or [],
|
|
66
|
+
"video": llm_user_message.video_urls or [],
|
|
67
|
+
},
|
|
68
|
+
tags=["processed"],
|
|
69
|
+
)
|
|
70
|
+
self.store.add([trace])
|
|
71
|
+
|
|
72
|
+
def ingest_tool_intent(self, tool_invocation: ToolInvocation, turn_id: Optional[str] = None) -> None:
|
|
73
|
+
effective_turn_id = tool_invocation.turn_id or turn_id
|
|
74
|
+
if not effective_turn_id:
|
|
75
|
+
raise ValueError("turn_id is required to ingest tool intent")
|
|
76
|
+
trace = RawTraceItem(
|
|
77
|
+
id=f"rt_{int(time.time() * 1000)}",
|
|
78
|
+
ts=time.time(),
|
|
79
|
+
turn_id=effective_turn_id,
|
|
80
|
+
seq=self._next_seq(effective_turn_id),
|
|
81
|
+
trace_type="tool_call",
|
|
82
|
+
content="",
|
|
83
|
+
source_event="PendingToolInvocationEvent",
|
|
84
|
+
tool_name=tool_invocation.name,
|
|
85
|
+
tool_call_id=tool_invocation.id,
|
|
86
|
+
tool_args=tool_invocation.arguments,
|
|
87
|
+
)
|
|
88
|
+
self.store.add([trace])
|
|
89
|
+
self.active_transcript.append_tool_calls(
|
|
90
|
+
[ToolCallSpec(id=tool_invocation.id, name=tool_invocation.name, arguments=tool_invocation.arguments)]
|
|
91
|
+
)
|
|
92
|
+
|
|
93
|
+
def ingest_tool_result(self, event: ToolResultEvent, turn_id: Optional[str] = None) -> None:
|
|
94
|
+
effective_turn_id = event.turn_id or turn_id
|
|
95
|
+
if not effective_turn_id:
|
|
96
|
+
raise ValueError("turn_id is required to ingest tool result")
|
|
97
|
+
trace = RawTraceItem(
|
|
98
|
+
id=f"rt_{int(time.time() * 1000)}",
|
|
99
|
+
ts=time.time(),
|
|
100
|
+
turn_id=effective_turn_id,
|
|
101
|
+
seq=self._next_seq(effective_turn_id),
|
|
102
|
+
trace_type="tool_result",
|
|
103
|
+
content="",
|
|
104
|
+
source_event="ToolResultEvent",
|
|
105
|
+
tool_name=event.tool_name,
|
|
106
|
+
tool_call_id=event.tool_invocation_id,
|
|
107
|
+
tool_args=event.tool_args,
|
|
108
|
+
tool_result=event.result,
|
|
109
|
+
tool_error=event.error,
|
|
110
|
+
)
|
|
111
|
+
self.store.add([trace])
|
|
112
|
+
self.active_transcript.append_tool_result(
|
|
113
|
+
tool_call_id=event.tool_invocation_id or "",
|
|
114
|
+
tool_name=event.tool_name,
|
|
115
|
+
tool_result=event.result,
|
|
116
|
+
tool_error=event.error,
|
|
117
|
+
)
|
|
118
|
+
|
|
119
|
+
def ingest_assistant_response(self, response: CompleteResponse, turn_id: str, source_event: str) -> None:
|
|
120
|
+
trace = RawTraceItem(
|
|
121
|
+
id=f"rt_{int(time.time() * 1000)}",
|
|
122
|
+
ts=time.time(),
|
|
123
|
+
turn_id=turn_id,
|
|
124
|
+
seq=self._next_seq(turn_id),
|
|
125
|
+
trace_type="assistant",
|
|
126
|
+
content=response.content or "",
|
|
127
|
+
source_event=source_event,
|
|
128
|
+
tags=["final"],
|
|
129
|
+
)
|
|
130
|
+
self.store.add([trace])
|
|
131
|
+
if response.content or response.reasoning:
|
|
132
|
+
self.active_transcript.append_assistant(
|
|
133
|
+
content=response.content,
|
|
134
|
+
reasoning=response.reasoning,
|
|
135
|
+
)
|
|
136
|
+
|
|
137
|
+
def _get_raw_tail(self, tail_turns: int, exclude_turn_id: Optional[str] = None) -> List[RawTraceItem]:
|
|
138
|
+
raw_items = self.store.list(MemoryType.RAW_TRACE)
|
|
139
|
+
if tail_turns <= 0:
|
|
140
|
+
return []
|
|
141
|
+
|
|
142
|
+
ordered_turns = []
|
|
143
|
+
seen = set()
|
|
144
|
+
for item in raw_items:
|
|
145
|
+
if not isinstance(item, RawTraceItem):
|
|
146
|
+
continue
|
|
147
|
+
if exclude_turn_id and item.turn_id == exclude_turn_id:
|
|
148
|
+
continue
|
|
149
|
+
if item.turn_id not in seen:
|
|
150
|
+
seen.add(item.turn_id)
|
|
151
|
+
ordered_turns.append(item.turn_id)
|
|
152
|
+
|
|
153
|
+
if not ordered_turns:
|
|
154
|
+
return []
|
|
155
|
+
|
|
156
|
+
keep_turns = set(ordered_turns[-tail_turns:])
|
|
157
|
+
tail_items = [
|
|
158
|
+
item
|
|
159
|
+
for item in raw_items
|
|
160
|
+
if isinstance(item, RawTraceItem) and item.turn_id in keep_turns
|
|
161
|
+
]
|
|
162
|
+
|
|
163
|
+
order_index = {turn_id: idx for idx, turn_id in enumerate(ordered_turns)}
|
|
164
|
+
tail_items.sort(key=lambda item: (order_index.get(item.turn_id, 0), item.seq))
|
|
165
|
+
return tail_items
|
|
166
|
+
|
|
167
|
+
def get_raw_tail(self, tail_turns: int, exclude_turn_id: Optional[str] = None) -> List[RawTraceItem]:
|
|
168
|
+
return self._get_raw_tail(tail_turns, exclude_turn_id=exclude_turn_id)
|
|
169
|
+
|
|
170
|
+
def get_transcript_messages(self):
|
|
171
|
+
return self.active_transcript.build_messages()
|
|
172
|
+
|
|
173
|
+
def reset_transcript(self, snapshot_messages):
|
|
174
|
+
self.active_transcript.reset(snapshot_messages)
|
|
175
|
+
|
|
176
|
+
def get_tool_interactions(self, turn_id: Optional[str] = None):
|
|
177
|
+
raw_items = self.store.list(MemoryType.RAW_TRACE)
|
|
178
|
+
if turn_id:
|
|
179
|
+
raw_items = [
|
|
180
|
+
item for item in raw_items
|
|
181
|
+
if isinstance(item, RawTraceItem) and item.turn_id == turn_id
|
|
182
|
+
]
|
|
183
|
+
return build_tool_interactions([item for item in raw_items if isinstance(item, RawTraceItem)])
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
from autobyteus.memory.models.memory_types import MemoryType
|
|
2
|
+
from autobyteus.memory.models.raw_trace_item import RawTraceItem
|
|
3
|
+
from autobyteus.memory.models.episodic_item import EpisodicItem
|
|
4
|
+
from autobyteus.memory.models.semantic_item import SemanticItem
|
|
5
|
+
from autobyteus.memory.models.tool_interaction import ToolInteraction, ToolInteractionStatus
|
|
6
|
+
|
|
7
|
+
__all__ = [
|
|
8
|
+
"MemoryType",
|
|
9
|
+
"RawTraceItem",
|
|
10
|
+
"EpisodicItem",
|
|
11
|
+
"SemanticItem",
|
|
12
|
+
"ToolInteraction",
|
|
13
|
+
"ToolInteractionStatus",
|
|
14
|
+
]
|
|
@@ -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 EpisodicItem:
|
|
9
|
+
id: str
|
|
10
|
+
ts: float
|
|
11
|
+
turn_ids: List[str]
|
|
12
|
+
summary: str
|
|
13
|
+
tags: List[str] = field(default_factory=list)
|
|
14
|
+
salience: float = 0.0
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def memory_type(self) -> MemoryType:
|
|
18
|
+
return MemoryType.EPISODIC
|
|
19
|
+
|
|
20
|
+
def to_dict(self) -> Dict[str, Any]:
|
|
21
|
+
data: Dict[str, Any] = {
|
|
22
|
+
"id": self.id,
|
|
23
|
+
"ts": self.ts,
|
|
24
|
+
"turn_ids": self.turn_ids,
|
|
25
|
+
"summary": self.summary,
|
|
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]) -> "EpisodicItem":
|
|
34
|
+
return cls(
|
|
35
|
+
id=data["id"],
|
|
36
|
+
ts=data["ts"],
|
|
37
|
+
turn_ids=data.get("turn_ids", []),
|
|
38
|
+
summary=data.get("summary", ""),
|
|
39
|
+
tags=data.get("tags", []),
|
|
40
|
+
salience=data.get("salience", 0.0),
|
|
41
|
+
)
|