bedrock-agentcore-starter-toolkit 0.1.14__py3-none-any.whl → 0.1.16__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.
- bedrock_agentcore_starter_toolkit/cli/runtime/commands.py +33 -2
- bedrock_agentcore_starter_toolkit/cli/runtime/configuration_manager.py +127 -1
- bedrock_agentcore_starter_toolkit/operations/memory/README.md +1109 -0
- bedrock_agentcore_starter_toolkit/operations/memory/constants.py +1 -9
- bedrock_agentcore_starter_toolkit/operations/memory/manager.py +248 -57
- bedrock_agentcore_starter_toolkit/operations/memory/models/__init__.py +106 -0
- bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/__init__.py +52 -0
- bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/base.py +77 -0
- bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/custom.py +194 -0
- bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/semantic.py +35 -0
- bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/summary.py +35 -0
- bedrock_agentcore_starter_toolkit/operations/memory/models/strategies/user_preference.py +34 -0
- bedrock_agentcore_starter_toolkit/operations/memory/strategy_validator.py +408 -0
- bedrock_agentcore_starter_toolkit/operations/runtime/configure.py +54 -0
- bedrock_agentcore_starter_toolkit/operations/runtime/destroy.py +43 -3
- bedrock_agentcore_starter_toolkit/operations/runtime/invoke.py +45 -0
- bedrock_agentcore_starter_toolkit/operations/runtime/launch.py +164 -0
- bedrock_agentcore_starter_toolkit/operations/runtime/models.py +7 -0
- bedrock_agentcore_starter_toolkit/operations/runtime/status.py +62 -0
- bedrock_agentcore_starter_toolkit/utils/runtime/container.py +4 -0
- bedrock_agentcore_starter_toolkit/utils/runtime/schema.py +27 -1
- bedrock_agentcore_starter_toolkit/utils/runtime/templates/Dockerfile.j2 +9 -2
- bedrock_agentcore_starter_toolkit/utils/runtime/templates/execution_role_policy.json.j2 +31 -0
- {bedrock_agentcore_starter_toolkit-0.1.14.dist-info → bedrock_agentcore_starter_toolkit-0.1.16.dist-info}/METADATA +1 -1
- {bedrock_agentcore_starter_toolkit-0.1.14.dist-info → bedrock_agentcore_starter_toolkit-0.1.16.dist-info}/RECORD +29 -20
- {bedrock_agentcore_starter_toolkit-0.1.14.dist-info → bedrock_agentcore_starter_toolkit-0.1.16.dist-info}/WHEEL +0 -0
- {bedrock_agentcore_starter_toolkit-0.1.14.dist-info → bedrock_agentcore_starter_toolkit-0.1.16.dist-info}/entry_points.txt +0 -0
- {bedrock_agentcore_starter_toolkit-0.1.14.dist-info → bedrock_agentcore_starter_toolkit-0.1.16.dist-info}/licenses/LICENSE.txt +0 -0
- {bedrock_agentcore_starter_toolkit-0.1.14.dist-info → bedrock_agentcore_starter_toolkit-0.1.16.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}
|