bedrock-agentcore-starter-toolkit 0.1.13__py3-none-any.whl → 0.1.15__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.

Potentially problematic release.


This version of bedrock-agentcore-starter-toolkit might be problematic. Click here for more details.

Files changed (30) hide show
  1. bedrock_agentcore_starter_toolkit/cli/runtime/commands.py +35 -2
  2. bedrock_agentcore_starter_toolkit/cli/runtime/configuration_manager.py +127 -1
  3. bedrock_agentcore_starter_toolkit/notebook/runtime/bedrock_agentcore.py +3 -0
  4. bedrock_agentcore_starter_toolkit/operations/memory/README.md +1109 -0
  5. bedrock_agentcore_starter_toolkit/operations/memory/constants.py +1 -9
  6. bedrock_agentcore_starter_toolkit/operations/memory/manager.py +248 -57
  7. bedrock_agentcore_starter_toolkit/operations/memory/models/__init__.py +106 -0
  8. bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/__init__.py +52 -0
  9. bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/base.py +77 -0
  10. bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/custom.py +194 -0
  11. bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/semantic.py +35 -0
  12. bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/summary.py +35 -0
  13. bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/user_preference.py +34 -0
  14. bedrock_agentcore_starter_toolkit/operations/memory/strategy_validator.py +395 -0
  15. bedrock_agentcore_starter_toolkit/operations/runtime/configure.py +78 -0
  16. bedrock_agentcore_starter_toolkit/operations/runtime/destroy.py +43 -3
  17. bedrock_agentcore_starter_toolkit/operations/runtime/invoke.py +45 -0
  18. bedrock_agentcore_starter_toolkit/operations/runtime/launch.py +164 -0
  19. bedrock_agentcore_starter_toolkit/operations/runtime/models.py +7 -0
  20. bedrock_agentcore_starter_toolkit/operations/runtime/status.py +62 -0
  21. bedrock_agentcore_starter_toolkit/utils/runtime/container.py +4 -0
  22. bedrock_agentcore_starter_toolkit/utils/runtime/schema.py +27 -1
  23. bedrock_agentcore_starter_toolkit/utils/runtime/templates/Dockerfile.j2 +10 -3
  24. bedrock_agentcore_starter_toolkit/utils/runtime/templates/execution_role_policy.json.j2 +31 -0
  25. {bedrock_agentcore_starter_toolkit-0.1.13.dist-info → bedrock_agentcore_starter_toolkit-0.1.15.dist-info}/METADATA +1 -1
  26. {bedrock_agentcore_starter_toolkit-0.1.13.dist-info → bedrock_agentcore_starter_toolkit-0.1.15.dist-info}/RECORD +30 -21
  27. {bedrock_agentcore_starter_toolkit-0.1.13.dist-info → bedrock_agentcore_starter_toolkit-0.1.15.dist-info}/WHEEL +0 -0
  28. {bedrock_agentcore_starter_toolkit-0.1.13.dist-info → bedrock_agentcore_starter_toolkit-0.1.15.dist-info}/entry_points.txt +0 -0
  29. {bedrock_agentcore_starter_toolkit-0.1.13.dist-info → bedrock_agentcore_starter_toolkit-0.1.15.dist-info}/licenses/LICENSE.txt +0 -0
  30. {bedrock_agentcore_starter_toolkit-0.1.13.dist-info → bedrock_agentcore_starter_toolkit-0.1.15.dist-info}/licenses/NOTICE.txt +0 -0
@@ -0,0 +1,77 @@
1
+ """Base classes and types for memory strategies."""
2
+
3
+ from abc import ABC, abstractmethod
4
+ from typing import TYPE_CHECKING, Any, Dict, List, Optional, Union
5
+
6
+ from pydantic import BaseModel, ConfigDict, Field
7
+
8
+ if TYPE_CHECKING:
9
+ from .custom import CustomSemanticStrategy, CustomSummaryStrategy, CustomUserPreferenceStrategy
10
+ from .semantic import SemanticStrategy
11
+ from .summary import SummaryStrategy
12
+ from .user_preference import UserPreferenceStrategy
13
+
14
+
15
+ class ExtractionConfig(BaseModel):
16
+ """Configuration for memory extraction operations.
17
+
18
+ Attributes:
19
+ append_to_prompt: Additional prompt text for extraction
20
+ model_id: Model identifier for extraction operations
21
+ """
22
+
23
+ append_to_prompt: Optional[str] = Field(None, description="Additional prompt text for extraction")
24
+ model_id: Optional[str] = Field(None, description="Model identifier for extraction operations")
25
+
26
+ model_config = ConfigDict(validate_by_name=True)
27
+
28
+
29
+ class ConsolidationConfig(BaseModel):
30
+ """Configuration for memory consolidation operations.
31
+
32
+ Attributes:
33
+ append_to_prompt: Additional prompt text for consolidation
34
+ model_id: Model identifier for consolidation operations
35
+ """
36
+
37
+ append_to_prompt: Optional[str] = Field(None, description="Additional prompt text for consolidation")
38
+ model_id: Optional[str] = Field(None, description="Model identifier for consolidation operations")
39
+
40
+ model_config = ConfigDict(validate_by_name=True)
41
+
42
+
43
+ class BaseStrategy(BaseModel, ABC):
44
+ """Abstract base class for all memory strategies.
45
+
46
+ Attributes:
47
+ name: Strategy name (required)
48
+ description: Optional strategy description
49
+ namespaces: List of namespace patterns for the strategy
50
+ """
51
+
52
+ name: str = Field(..., description="Strategy name")
53
+ description: Optional[str] = Field(None, description="Strategy description")
54
+ namespaces: Optional[List[str]] = Field(None, description="Strategy namespaces")
55
+
56
+ @abstractmethod
57
+ def to_dict(self) -> Dict[str, Any]:
58
+ """Convert strategy to dictionary format for API calls.
59
+
60
+ Returns:
61
+ Dictionary representation compatible with the AgentCore Memory API
62
+ """
63
+ pass
64
+
65
+ model_config = ConfigDict(validate_assignment=True)
66
+
67
+
68
+ # Type union for all strategy types (including backward compatibility)
69
+ StrategyType = Union[
70
+ "SemanticStrategy",
71
+ "SummaryStrategy",
72
+ "CustomSemanticStrategy",
73
+ "CustomSummaryStrategy",
74
+ "CustomUserPreferenceStrategy",
75
+ "UserPreferenceStrategy",
76
+ Dict[str, Any], # Backward compatibility with dict-based strategies
77
+ ]
@@ -0,0 +1,194 @@
1
+ """Custom memory strategy implementation."""
2
+
3
+ from typing import Any, Dict
4
+
5
+ from pydantic import Field
6
+
7
+ from .base import BaseStrategy, ConsolidationConfig, ExtractionConfig
8
+
9
+
10
+ class CustomSemanticStrategy(BaseStrategy):
11
+ """Custom semantic strategy with configurable extraction and consolidation.
12
+
13
+ This strategy allows customization of both extraction and consolidation
14
+ processes using custom prompts and models.
15
+
16
+ Attributes:
17
+ extraction_config: Configuration for extraction operations
18
+ consolidation_config: Configuration for consolidation operations
19
+
20
+ Example:
21
+ strategy = CustomSemanticStrategy(
22
+ name="CustomExtraction",
23
+ description="Custom semantic extraction with specific prompts",
24
+ extraction_config=ExtractionConfig(
25
+ append_to_prompt="Extract key business insights",
26
+ model_id="anthropic.claude-3-sonnet-20240229-v1:0"
27
+ ),
28
+ consolidation_config=ConsolidationConfig(
29
+ append_to_prompt="Consolidate business insights",
30
+ model_id="anthropic.claude-3-haiku-20240307-v1:0"
31
+ ),
32
+ namespaces=["custom/{actorId}/{sessionId}"]
33
+ )
34
+ """
35
+
36
+ extraction_config: ExtractionConfig = Field(..., description="Extraction configuration")
37
+ consolidation_config: ConsolidationConfig = Field(..., description="Consolidation configuration")
38
+
39
+ def to_dict(self) -> Dict[str, Any]:
40
+ """Convert to dictionary format for API calls."""
41
+ config = {
42
+ "name": self.name,
43
+ "configuration": {
44
+ "semanticOverride": {
45
+ "extraction": self._convert_extraction_config(),
46
+ "consolidation": self._convert_consolidation_config(),
47
+ }
48
+ },
49
+ }
50
+
51
+ if self.description is not None:
52
+ config["description"] = self.description
53
+
54
+ if self.namespaces is not None:
55
+ config["namespaces"] = self.namespaces
56
+
57
+ return {"customMemoryStrategy": config}
58
+
59
+ def _convert_extraction_config(self) -> Dict[str, Any]:
60
+ """Convert extraction config to API format."""
61
+ config = {}
62
+ if self.extraction_config.append_to_prompt is not None:
63
+ config["appendToPrompt"] = self.extraction_config.append_to_prompt
64
+ if self.extraction_config.model_id is not None:
65
+ config["modelId"] = self.extraction_config.model_id
66
+ return config
67
+
68
+ def _convert_consolidation_config(self) -> Dict[str, Any]:
69
+ """Convert consolidation config to API format."""
70
+ config = {}
71
+ if self.consolidation_config.append_to_prompt is not None:
72
+ config["appendToPrompt"] = self.consolidation_config.append_to_prompt
73
+ if self.consolidation_config.model_id is not None:
74
+ config["modelId"] = self.consolidation_config.model_id
75
+ return config
76
+
77
+
78
+ class CustomSummaryStrategy(BaseStrategy):
79
+ """Custom summary strategy with configurable consolidation.
80
+
81
+ This strategy allows customization of consolidation using custom prompts and models.
82
+
83
+ Attributes:
84
+ consolidation_config: Configuration for consolidation operations
85
+
86
+ Example:
87
+ strategy = CustomSummaryStrategy(
88
+ name="CustomSummary",
89
+ description="Custom summary extraction with specific prompts",
90
+ consolidation_config=ConsolidationConfig(
91
+ append_to_prompt="Consolidate business insights",
92
+ model_id="anthropic.claude-3-haiku-20240307-v1:0"
93
+ ),
94
+ namespaces=["custom/{actorId}/{sessionId}"]
95
+ )
96
+ """
97
+
98
+ consolidation_config: ConsolidationConfig = Field(..., description="Consolidation configuration")
99
+
100
+ def to_dict(self) -> Dict[str, Any]:
101
+ """Convert to dictionary format for API calls."""
102
+ config = {
103
+ "name": self.name,
104
+ "configuration": {
105
+ "summaryOverride": {
106
+ "consolidation": self._convert_consolidation_config(),
107
+ }
108
+ },
109
+ }
110
+
111
+ if self.description is not None:
112
+ config["description"] = self.description
113
+
114
+ if self.namespaces is not None:
115
+ config["namespaces"] = self.namespaces
116
+
117
+ return {"customMemoryStrategy": config}
118
+
119
+ def _convert_consolidation_config(self) -> Dict[str, Any]:
120
+ """Convert consolidation config to API format."""
121
+ config = {}
122
+ if self.consolidation_config.append_to_prompt is not None:
123
+ config["appendToPrompt"] = self.consolidation_config.append_to_prompt
124
+ if self.consolidation_config.model_id is not None:
125
+ config["modelId"] = self.consolidation_config.model_id
126
+ return config
127
+
128
+
129
+ class CustomUserPreferenceStrategy(BaseStrategy):
130
+ """Custom userPreference strategy with configurable extraction and consolidation.
131
+
132
+ This strategy allows customization of both extraction and consolidation
133
+ processes using custom prompts and models.
134
+
135
+ Attributes:
136
+ extraction_config: Configuration for extraction operations
137
+ consolidation_config: Configuration for consolidation operations
138
+
139
+ Example:
140
+ strategy = CustomUserPreferenceStrategy(
141
+ name="CustomUserPreference",
142
+ description="Custom user preference extraction with specific prompts",
143
+ extraction_config=ExtractionConfig(
144
+ append_to_prompt="Extract key business insights",
145
+ model_id="anthropic.claude-3-sonnet-20240229-v1:0"
146
+ ),
147
+ consolidation_config=ConsolidationConfig(
148
+ append_to_prompt="Consolidate business insights",
149
+ model_id="anthropic.claude-3-haiku-20240307-v1:0"
150
+ ),
151
+ namespaces=["custom/{actorId}/{sessionId}"]
152
+ )
153
+ """
154
+
155
+ extraction_config: ExtractionConfig = Field(..., description="Extraction configuration")
156
+ consolidation_config: ConsolidationConfig = Field(..., description="Consolidation configuration")
157
+
158
+ def to_dict(self) -> Dict[str, Any]:
159
+ """Convert to dictionary format for API calls."""
160
+ config = {
161
+ "name": self.name,
162
+ "configuration": {
163
+ "userPreferenceOverride": {
164
+ "extraction": self._convert_extraction_config(),
165
+ "consolidation": self._convert_consolidation_config(),
166
+ }
167
+ },
168
+ }
169
+
170
+ if self.description is not None:
171
+ config["description"] = self.description
172
+
173
+ if self.namespaces is not None:
174
+ config["namespaces"] = self.namespaces
175
+
176
+ return {"customMemoryStrategy": config}
177
+
178
+ def _convert_extraction_config(self) -> Dict[str, Any]:
179
+ """Convert extraction config to API format."""
180
+ config = {}
181
+ if self.extraction_config.append_to_prompt is not None:
182
+ config["appendToPrompt"] = self.extraction_config.append_to_prompt
183
+ if self.extraction_config.model_id is not None:
184
+ config["modelId"] = self.extraction_config.model_id
185
+ return config
186
+
187
+ def _convert_consolidation_config(self) -> Dict[str, Any]:
188
+ """Convert consolidation config to API format."""
189
+ config = {}
190
+ if self.consolidation_config.append_to_prompt is not None:
191
+ config["appendToPrompt"] = self.consolidation_config.append_to_prompt
192
+ if self.consolidation_config.model_id is not None:
193
+ config["modelId"] = self.consolidation_config.model_id
194
+ return config
@@ -0,0 +1,35 @@
1
+ """Semantic memory strategy implementation."""
2
+
3
+ from typing import Any, Dict
4
+
5
+ from .base import BaseStrategy
6
+
7
+
8
+ class SemanticStrategy(BaseStrategy):
9
+ """Semantic memory strategy for extracting and storing semantic information.
10
+
11
+ This strategy extracts semantic meaning from conversations and stores it
12
+ for later retrieval. It's ideal for capturing facts, concepts, and
13
+ contextual information from user interactions.
14
+
15
+ Example:
16
+ strategy = SemanticStrategy(
17
+ name="ConversationSemantics",
18
+ description="Extract semantic information from conversations",
19
+ namespaces=["semantics/{actorId}/{sessionId}"]
20
+ )
21
+ """
22
+
23
+ def to_dict(self) -> Dict[str, Any]:
24
+ """Convert to dictionary format for API calls."""
25
+ config = {
26
+ "name": self.name,
27
+ }
28
+
29
+ if self.description is not None:
30
+ config["description"] = self.description
31
+
32
+ if self.namespaces is not None:
33
+ config["namespaces"] = self.namespaces
34
+
35
+ return {"semanticMemoryStrategy": config}
@@ -0,0 +1,35 @@
1
+ """Summary memory strategy implementation."""
2
+
3
+ from typing import Any, Dict
4
+
5
+ from .base import BaseStrategy
6
+
7
+
8
+ class SummaryStrategy(BaseStrategy):
9
+ """Summary memory strategy for creating conversation summaries.
10
+
11
+ This strategy creates summaries of conversations, helping to maintain
12
+ context over long interactions and reducing the need to process
13
+ entire conversation histories.
14
+
15
+ Example:
16
+ strategy = SummaryStrategy(
17
+ name="ConversationSummary",
18
+ description="Summarize conversation content",
19
+ namespaces=["summaries/{actorId}/{sessionId}"]
20
+ )
21
+ """
22
+
23
+ def to_dict(self) -> Dict[str, Any]:
24
+ """Convert to dictionary format for API calls."""
25
+ config = {
26
+ "name": self.name,
27
+ }
28
+
29
+ if self.description is not None:
30
+ config["description"] = self.description
31
+
32
+ if self.namespaces is not None:
33
+ config["namespaces"] = self.namespaces
34
+
35
+ return {"summaryMemoryStrategy": config}
@@ -0,0 +1,34 @@
1
+ """User preference memory strategy implementation."""
2
+
3
+ from typing import Any, Dict
4
+
5
+ from .base import BaseStrategy
6
+
7
+
8
+ class UserPreferenceStrategy(BaseStrategy):
9
+ """User preference memory strategy for storing user preferences and settings.
10
+
11
+ This strategy captures and stores user preferences, settings, and
12
+ behavioral patterns that persist across sessions.
13
+
14
+ Example:
15
+ strategy = UserPreferenceStrategy(
16
+ name="UserPreferences",
17
+ description="Store user preferences and settings",
18
+ namespaces=["preferences/{actorId}"]
19
+ )
20
+ """
21
+
22
+ def to_dict(self) -> Dict[str, Any]:
23
+ """Convert to dictionary format for API calls."""
24
+ config = {
25
+ "name": self.name,
26
+ }
27
+
28
+ if self.description is not None:
29
+ config["description"] = self.description
30
+
31
+ if self.namespaces is not None:
32
+ config["namespaces"] = self.namespaces
33
+
34
+ return {"userPreferenceMemoryStrategy": config}