Skip to content

Commit 1381918

Browse files
author
Ayan Ray
committed
Merge origin/main into feature/mongodb-atlas-memory-tool
- Resolve conflicts in README.md by merging MongoDB Atlas Memory Tool and Retrieve Tool sections - Resolve conflicts in pyproject.toml by including both elasticsearch_memory and mongodb_memory dependencies
2 parents eb17be8 + 8e663df commit 1381918

File tree

10 files changed

+632
-60
lines changed

10 files changed

+632
-60
lines changed

README.md

Lines changed: 48 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ Below is a comprehensive table of all available tools, how to use them with an a
114114
| calculator | `agent.tool.calculator(expression="2 * sin(pi/4) + log(e**2)")` | Performing mathematical operations, symbolic math, equation solving |
115115
| code_interpreter | `code_interpreter = AgentCoreCodeInterpreter(region="us-west-2"); agent = Agent(tools=[code_interpreter.code_interpreter])` | Execute code in isolated sandbox environments with multi-language support (Python, JavaScript, TypeScript), persistent sessions, and file operations |
116116
| use_aws | `agent.tool.use_aws(service_name="s3", operation_name="list_buckets", parameters={}, region="us-west-2")` | Interacting with AWS services, cloud resource management |
117-
| retrieve | `agent.tool.retrieve(text="What is STRANDS?")` | Retrieving information from Amazon Bedrock Knowledge Bases |
117+
| retrieve | `agent.tool.retrieve(text="What is STRANDS?")` | Retrieving information from Amazon Bedrock Knowledge Bases with optional metadata |
118118
| nova_reels | `agent.tool.nova_reels(action="create", text="A cinematic shot of mountains", s3_bucket="my-bucket")` | Create high-quality videos using Amazon Bedrock Nova Reel with configurable parameters via environment variables |
119119
| agent_core_memory | `agent.tool.agent_core_memory(action="record", content="Hello, I like vegetarian food")` | Store and retrieve memories with Amazon Bedrock Agent Core Memory service |
120120
| mem0_memory | `agent.tool.mem0_memory(action="store", content="Remember I like to play tennis", user_id="alex")` | Store user and agent memories across agent runs to provide personalized experience |
@@ -504,6 +504,33 @@ result = agent.tool.use_aws(
504504
)
505505
```
506506

507+
### Retrieve Tool
508+
509+
```python
510+
from strands import Agent
511+
from strands_tools import retrieve
512+
513+
agent = Agent(tools=[retrieve])
514+
515+
# Basic retrieval without metadata
516+
result = agent.tool.retrieve(
517+
text="What is artificial intelligence?"
518+
)
519+
520+
# Retrieval with metadata enabled
521+
result = agent.tool.retrieve(
522+
text="What are the latest developments in machine learning?",
523+
enableMetadata=True
524+
)
525+
526+
# Using environment variable to set default metadata behavior
527+
# Set RETRIEVE_ENABLE_METADATA_DEFAULT=true in your environment
528+
result = agent.tool.retrieve(
529+
text="Tell me about cloud computing"
530+
# enableMetadata will default to the environment variable value
531+
)
532+
```
533+
507534
### Batch Tool
508535

509536
```python
@@ -1099,6 +1126,7 @@ The Mem0 Memory Tool supports three different backend configurations:
10991126
| EDITOR_DIR_TREE_MAX_DEPTH | Maximum depth for directory tree visualization | 2 |
11001127
| EDITOR_DEFAULT_STYLE | Default style for output panels | default |
11011128
| EDITOR_DEFAULT_LANGUAGE | Default language for syntax highlighting | python |
1129+
| EDITOR_DISABLE_BACKUP | Skip creating .bak backup files during edit operations | false |
11021130

11031131
#### Environment Tool
11041132

@@ -1145,6 +1173,12 @@ The Mem0 Memory Tool supports three different backend configurations:
11451173
| STRANDS_RSS_UPDATE_INTERVAL | Default amount of time between updating rss feeds in minutes | 60 |
11461174
| STRANDS_RSS_STORAGE_PATH | Default storage path where rss feeds are stored locally | strands_rss_feeds (this may vary based on your system) |
11471175

1176+
#### Retrieve Tool
1177+
1178+
| Environment Variable | Description | Default |
1179+
|----------------------|-------------|---------|
1180+
| RETRIEVE_ENABLE_METADATA_DEFAULT | Default setting for enabling metadata in retrieve tool responses | false |
1181+
>>>>>>> origin/main
11481182
#### MongoDB Atlas Memory Tool
11491183

11501184
| Environment Variable | Description | Default |
@@ -1155,6 +1189,19 @@ The Mem0 Memory Tool supports three different backend configurations:
11551189
| MONGODB_NAMESPACE | Default namespace for memory isolation | default |
11561190
| MONGODB_EMBEDDING_MODEL | Bedrock model for generating embeddings | amazon.titan-embed-text-v2:0 |
11571191

1192+
#### Retrieve Tool
1193+
1194+
| Environment Variable | Description | Default |
1195+
|----------------------|-------------|---------|
1196+
| RETRIEVE_ENABLE_METADATA_DEFAULT | Default setting for enabling metadata in retrieve tool responses | false |
1197+
=======
1198+
#### Retrieve Tool
1199+
1200+
| Environment Variable | Description | Default |
1201+
|----------------------|-------------|---------|
1202+
| RETRIEVE_ENABLE_METADATA_DEFAULT | Default setting for enabling metadata in retrieve tool responses | false |
1203+
>>>>>>> origin/main
1204+
11581205
#### Video Tools
11591206

11601207
| Environment Variable | Description | Default |

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ dependencies = [
3838
"markdownify>=1.0.0,<2.0.0",
3939
"requests>=2.28.0,<3.0.0",
4040
"aiohttp>=3.8.0,<4.0.0",
41+
"typing_extensions>=4.0.0,<5.0.0",
4142
# Note: Always want the latest tzdata
4243
"tzdata ; platform_system == 'Windows'",
4344
"botocore>=1.39.7,<2.0.0",

src/strands_tools/browser/agent_core_browser.py

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
from bedrock_agentcore.tools.browser_client import BrowserClient as AgentCoreBrowserClient
1212
from playwright.async_api import Browser as PlaywrightBrowser
13+
from typing_extensions import override
1314

1415
from ..utils.aws_util import resolve_region
1516
from .browser import Browser
@@ -59,6 +60,34 @@ async def create_browser_session(self) -> PlaywrightBrowser:
5960

6061
return browser
6162

63+
@override
64+
async def _setup_session_from_browser(self, browser_or_context):
65+
"""Setup session for AgentCoreBrowser using existing CDP context.
66+
67+
AgentCoreBrowser connects via CDP and uses the default context
68+
that comes with the connection, avoiding the need to create a new one.
69+
70+
Args:
71+
browser_or_context: PlaywrightBrowser from CDP connection
72+
73+
Returns:
74+
Tuple of (browser, context, page)
75+
"""
76+
session_browser = browser_or_context
77+
78+
# CDP connections should have a default context
79+
if not session_browser.contexts:
80+
raise RuntimeError(
81+
"AgentCoreBrowser CDP connection has no contexts. "
82+
"This may indicate a connection issue with the remote browser."
83+
)
84+
85+
# Use the existing default context from CDP connection
86+
session_context = session_browser.contexts[0]
87+
session_page = await session_context.new_page()
88+
89+
return session_browser, session_context, session_page
90+
6291
def close_platform(self) -> None:
6392
for client in self._client_dict.values():
6493
try:

src/strands_tools/browser/browser.py

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -221,6 +221,31 @@ async def create_browser_session(self) -> PlaywrightBrowser:
221221
"""
222222
...
223223

224+
async def _setup_session_from_browser(self, browser_or_context):
225+
"""Setup session components from browser or context.
226+
227+
This method can be overridden by subclasses to customize how
228+
browser, context, and page are extracted from the session object.
229+
230+
Args:
231+
browser_or_context: The object returned by create_browser_session()
232+
233+
Returns:
234+
Tuple of (browser, context, page)
235+
"""
236+
if isinstance(browser_or_context, PlaywrightBrowser):
237+
# Normal non-persistent case
238+
session_browser = browser_or_context
239+
session_context = await session_browser.new_context()
240+
session_page = await session_context.new_page()
241+
else:
242+
# Persistent context case
243+
session_context = browser_or_context
244+
session_browser = session_context.browser
245+
session_page = await session_context.new_page()
246+
247+
return session_browser, session_context, session_page
248+
224249
# Session Management Methods
225250
def init_session(self, action: InitSessionAction) -> Dict[str, Any]:
226251
"""Initialize a new browser session."""
@@ -238,19 +263,10 @@ async def _async_init_session(self, action: InitSessionAction) -> Dict[str, Any]
238263

239264
try:
240265
# Create new browser instance for this session
241-
session = await self.create_browser_session()
266+
browser_or_context = await self.create_browser_session()
242267

243-
if isinstance(session, PlaywrightBrowser):
244-
# Normal non-persistent case
245-
session_browser = session
246-
session_context = await session_browser.new_context()
247-
session_page = await session_context.new_page()
248-
249-
else:
250-
# Persistent context case
251-
session_context = session
252-
session_browser = session_context.browser
253-
session_page = await session_context.new_page()
268+
# Let subclasses customize how to extract browser, context, and page
269+
session_browser, session_context, session_page = await self._setup_session_from_browser(browser_or_context)
254270

255271
# Create and store session object
256272
session = BrowserSession(

src/strands_tools/editor.py

Lines changed: 14 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -536,8 +536,10 @@ def editor(
536536

537537
# Make replacements and backup
538538
new_content = content.replace(old_str, new_str)
539-
backup_path = f"{path}.bak"
540-
shutil.copy2(path, backup_path)
539+
disable_backup = os.environ.get("EDITOR_DISABLE_BACKUP", "").lower() == "true"
540+
if not disable_backup:
541+
backup_path = f"{path}.bak"
542+
shutil.copy2(path, backup_path)
541543

542544
# Write new content and update cache
543545
with open(path, "w") as f:
@@ -606,8 +608,12 @@ def editor(
606608

607609
# Make replacements and backup
608610
new_content = regex.sub(new_str, content)
609-
backup_path = f"{path}.bak"
610-
shutil.copy2(path, backup_path)
611+
disable_backup = os.environ.get("EDITOR_DISABLE_BACKUP", "").lower() == "true"
612+
if not disable_backup:
613+
backup_path = f"{path}.bak"
614+
shutil.copy2(path, backup_path)
615+
else:
616+
backup_path = "Disabled"
611617

612618
# Write new content and update cache
613619
with open(path, "w") as f:
@@ -678,8 +684,10 @@ def editor(
678684
raise ValueError(f"insert_line {insert_line} is out of range")
679685

680686
# Make backup
681-
backup_path = f"{path}.bak"
682-
shutil.copy2(path, backup_path)
687+
disable_backup = os.environ.get("EDITOR_DISABLE_BACKUP", "").lower() == "true"
688+
if not disable_backup:
689+
backup_path = f"{path}.bak"
690+
shutil.copy2(path, backup_path)
683691

684692
# Insert and write
685693
lines.insert(insert_line, new_str)

0 commit comments

Comments
 (0)