Skip to content

Commit fe509bd

Browse files
authored
feat: make memory retrieval config conditional on strategies (#142)
- Short-term memory (no strategies) no longer includes retrieval config - Long-term memory includes retrieval config based on configured strategies: - SEMANTIC → /users/{actor_id}/facts - USER_PREFERENCE → /users/{actor_id}/preferences - SUMMARIZATION → /summaries/{actor_id}/{session_id} - Added memoryProviders to render config with strategy information - Schema now allows empty strategies array for short-term memory
1 parent 597f227 commit fe509bd

5 files changed

Lines changed: 72 additions & 14 deletions

File tree

src/assets/python/strands/capabilities/memory/session.py

Lines changed: 18 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import os
22
from typing import Optional
33

4-
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig, RetrievalConfig
4+
from bedrock_agentcore.memory.integrations.strands.config import AgentCoreMemoryConfig{{#if memoryProviders.[0].strategies.length}}, RetrievalConfig{{/if}}
55
from bedrock_agentcore.memory.integrations.strands.session_manager import AgentCoreMemorySessionManager
66

77
MEMORY_ID = os.getenv("{{memoryProviders.[0].envVarName}}")
@@ -11,16 +11,28 @@ def get_memory_session_manager(session_id: str, actor_id: str) -> Optional[Agent
1111
if not MEMORY_ID:
1212
return None
1313

14+
{{#if memoryProviders.[0].strategies.length}}
15+
retrieval_config = {
16+
{{#if (includes memoryProviders.[0].strategies "SEMANTIC")}}
17+
f"/users/{actor_id}/facts": RetrievalConfig(top_k=3, relevance_score=0.5),
18+
{{/if}}
19+
{{#if (includes memoryProviders.[0].strategies "USER_PREFERENCE")}}
20+
f"/users/{actor_id}/preferences": RetrievalConfig(top_k=3, relevance_score=0.5),
21+
{{/if}}
22+
{{#if (includes memoryProviders.[0].strategies "SUMMARIZATION")}}
23+
f"/summaries/{actor_id}/{session_id}": RetrievalConfig(top_k=3, relevance_score=0.5),
24+
{{/if}}
25+
}
26+
{{/if}}
27+
1428
return AgentCoreMemorySessionManager(
1529
AgentCoreMemoryConfig(
1630
memory_id=MEMORY_ID,
1731
session_id=session_id,
1832
actor_id=actor_id,
19-
retrieval_config={
20-
f"/users/{actor_id}/facts": RetrievalConfig(top_k=3, relevance_score=0.5),
21-
f"/users/{actor_id}/preferences": RetrievalConfig(top_k=3, relevance_score=0.5),
22-
f"/summaries/{actor_id}/{session_id}": RetrievalConfig(top_k=3, relevance_score=0.5),
23-
}
33+
{{#if memoryProviders.[0].strategies.length}}
34+
retrieval_config=retrieval_config,
35+
{{/if}}
2436
),
2537
REGION
2638
)

src/cli/operations/agent/generate/schema-mapper.ts

Lines changed: 34 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,11 @@ import type {
88
MemoryStrategy,
99
ModelProvider,
1010
} from '../../../../schema';
11-
1211
import type {
1312
AgentRenderConfig,
1413
IdentityProviderRenderConfig,
1514
MemoryProviderRenderConfig,
1615
} from '../../../templates/types';
17-
1816
import {
1917
DEFAULT_MEMORY_EXPIRY_DAYS,
2018
DEFAULT_NETWORK_MODE,
@@ -47,8 +45,8 @@ function computeCredentialName(projectName: string, providerName: string): strin
4745
* Maps GenerateConfig memory option to v2 Memory resources.
4846
*
4947
* Memory mapping:
50-
* - "none" -> empty array
51-
* - "shortTerm" -> [Memory with Summarization strategy]
48+
* - "none" -> empty array (no memory)
49+
* - "shortTerm" -> [Memory with no strategies] (just base memory with expiration)
5250
* - "longAndShortTerm" -> [Memory with Semantic + Summarization + UserPreference strategies]
5351
*/
5452
export function mapGenerateInputToMemories(memory: MemoryOption, projectName: string): Memory[] {
@@ -58,13 +56,14 @@ export function mapGenerateInputToMemories(memory: MemoryOption, projectName: st
5856

5957
const strategies: MemoryStrategy[] = [];
6058

59+
// Short term memory has no strategies - just base memory with expiration time
60+
// Long term memory includes strategies for semantic search, summarization, and user preferences
6161
if (memory === 'longAndShortTerm') {
6262
strategies.push({ type: 'SEMANTIC' });
6363
strategies.push({ type: 'USER_PREFERENCE' });
64+
strategies.push({ type: 'SUMMARIZATION' });
6465
}
6566

66-
strategies.push({ type: 'SUMMARIZATION' });
67-
6867
return [
6968
{
7069
type: 'AgentCoreMemory',
@@ -147,6 +146,34 @@ function mapMemoryOptionToMemoryProviders(
147146
];
148147
}
149148

149+
/**
150+
* Compute the memory env var name for a memory resource.
151+
* Pattern: MEMORY_{NAME}_ID (matches CDK construct pattern)
152+
*/
153+
function computeMemoryEnvVarName(memoryName: string): string {
154+
return `MEMORY_${memoryName.toUpperCase()}_ID`;
155+
}
156+
157+
/**
158+
* Maps memory option to memory providers for template rendering.
159+
*/
160+
function mapMemoryOptionToMemoryProviders(memory: MemoryOption, projectName: string): MemoryProviderRenderConfig[] {
161+
if (memory === 'none') {
162+
return [];
163+
}
164+
165+
const memoryName = `${projectName}Memory`;
166+
const strategies = mapGenerateInputToMemories(memory, projectName)[0]?.strategies ?? [];
167+
168+
return [
169+
{
170+
name: memoryName,
171+
envVarName: computeMemoryEnvVarName(memoryName),
172+
strategies: strategies.map(s => s.type),
173+
},
174+
];
175+
}
176+
150177
/**
151178
* Maps GenerateConfig to AgentRenderConfig for template rendering.
152179
* @param config - Generate config (note: config.projectName is actually the agent name)
@@ -164,5 +191,6 @@ export function mapGenerateConfigToRenderConfig(config: GenerateConfig, actualPr
164191
hasIdentity: config.modelProvider !== 'Bedrock',
165192
memoryProviders: mapMemoryOptionToMemoryProviders(config.memory, config.projectName),
166193
identityProviders: mapModelProviderToIdentityProviders(config.modelProvider, projectNameForCredentials),
194+
memoryProviders: mapMemoryOptionToMemoryProviders(config.memory, config.projectName),
167195
};
168196
}

src/cli/templates/render.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ import * as path from 'node:path';
44

55
// Register custom Handlebars helpers
66
Handlebars.registerHelper('eq', (a: unknown, b: unknown) => a === b);
7+
Handlebars.registerHelper('includes', (array: unknown[], value: unknown) => {
8+
if (!Array.isArray(array)) return false;
9+
return array.includes(value);
10+
});
711

812
/**
913
* Renames template files to their actual names.

src/cli/templates/types.ts

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import type { ModelProvider, SDKFramework, TargetLanguage } from '../../schema';
1+
import type { MemoryStrategyType, ModelProvider, SDKFramework, TargetLanguage } from '../../schema';
22

33
/**
44
* Memory provider config for template rendering.
@@ -15,6 +15,16 @@ export interface IdentityProviderRenderConfig {
1515
envVarName: string;
1616
}
1717

18+
/**
19+
* Memory provider info for template rendering.
20+
*/
21+
export interface MemoryProviderRenderConfig {
22+
name: string;
23+
envVarName: string;
24+
/** Strategy types configured for this memory */
25+
strategies: MemoryStrategyType[];
26+
}
27+
1828
/**
1929
* Configuration needed by template renderers.
2030
* This is separate from the v2 Agent schema which only stores runtime config.
@@ -29,4 +39,6 @@ export interface AgentRenderConfig {
2939
memoryProviders: MemoryProviderRenderConfig[];
3040
/** Identity providers for template rendering (maps to credentials in schema) */
3141
identityProviders: IdentityProviderRenderConfig[];
42+
/** Memory providers for template rendering */
43+
memoryProviders: MemoryProviderRenderConfig[];
3244
}

src/schema/schemas/agentcore-project.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,11 @@ export const MemorySchema = z.object({
5252
type: MemoryTypeSchema,
5353
name: MemoryNameSchema,
5454
eventExpiryDuration: z.number().int().min(7).max(365),
55+
// Strategies array can be empty for short-term memory (just base memory with expiration)
56+
// Long-term memory includes strategies like SEMANTIC, SUMMARIZATION, USER_PREFERENCE
5557
strategies: z
5658
.array(MemoryStrategySchema)
57-
.min(1, 'At least one memory strategy is required')
59+
.default([])
5860
.superRefine(
5961
uniqueBy(
6062
strategy => strategy.type,

0 commit comments

Comments
 (0)