Skip to content

Commit bac5904

Browse files
v27.3.4 (#95)
* remove mongo memory as was caching old values and confusing tools * update poetry * update poetry and readme
1 parent 96c4bab commit bac5904

File tree

6 files changed

+76
-113
lines changed

6 files changed

+76
-113
lines changed

README.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -485,6 +485,40 @@ async for response in solana_agent.process("user123", "What is the latest news o
485485
print(response, end="")
486486
```
487487

488+
### MCP
489+
490+
[Zapier](https://zapier.com) MCP has been tested, works, and is supported.
491+
492+
Other MCP servers may work but are not supported.
493+
494+
`pip install sakit`
495+
496+
```python
497+
498+
from solana_agent import SolanaAgent
499+
500+
config = {
501+
"tools": {
502+
"mcp": {
503+
"urls": ["my-zapier-mcp-url"],
504+
}
505+
},
506+
"agents": [
507+
{
508+
"name": "zapier_expert",
509+
"instructions": "You are an expert in using Zapier integrations using MCP. You always use the mcp tool to perform Zapier AI like actions.",
510+
"specialization": "Zapier service integration expert",
511+
"tools": ["mcp"], # Enable the tool for this agent
512+
}
513+
]
514+
}
515+
516+
solana_agent = SolanaAgent(config=config)
517+
518+
async for response in solana_agent.process("user123", "Send an email to bob@bob.com to clean his room!"):
519+
print(response, end="")
520+
```
521+
488522
### Inline Tool Example
489523

490524
```python

docs/index.rst

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -444,6 +444,42 @@ Internet Search
444444
print(response, end="")
445445
446446
447+
MCP
448+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
449+
450+
Zapier MCP has been tested, works, and is supported.
451+
452+
Other MCP servers may work but are not supported.
453+
454+
.. code-block:: bash
455+
456+
pip install sakit
457+
458+
.. code-block:: python
459+
460+
from solana_agent import SolanaAgent
461+
462+
config = {
463+
"tools": {
464+
"mcp": {
465+
"urls": ["my-zapier-mcp-url"],
466+
}
467+
},
468+
"agents": [
469+
{
470+
"name": "zapier_expert",
471+
"instructions": "You are an expert in using Zapier integrations using MCP. You always use the mcp tool to perform Zapier AI like actions.",
472+
"specialization": "Zapier service integration expert",
473+
"tools": ["mcp"], # Enable the tool for this agent
474+
}
475+
]
476+
}
477+
478+
solana_agent = SolanaAgent(config=config)
479+
480+
async for response in solana_agent.process("user123", "Send an email to bob@bob.com to clean his room!"):
481+
print(response, end="")
482+
447483
Inline Tool Example
448484
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
449485

poetry.lock

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[tool.poetry]
22
name = "solana-agent"
3-
version = "27.3.3"
3+
version = "27.3.4"
44
description = "Agentic IQ"
55
authors = ["Bevan Hunt <bevan@bevanhunt.com>"]
66
license = "MIT"
@@ -23,7 +23,7 @@ python_paths = [".", "tests"]
2323

2424
[tool.poetry.dependencies]
2525
python = ">=3.12,<4.0"
26-
openai = "^1.74.0"
26+
openai = "^1.75.0"
2727
pydantic = ">=2"
2828
pymongo = "^4.12.0"
2929
zep-cloud = "^2.10.1"

solana_agent/repositories/memory.py

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -127,20 +127,6 @@ async def retrieve(self, user_id: str) -> str:
127127
memory = await self.zep.memory.get(session_id=user_id)
128128
if memory and memory.context:
129129
memories = memory.context
130-
if self.mongo:
131-
mongo_memory = self.mongo.find(
132-
self.collection,
133-
{"user_id": user_id},
134-
sort=[("timestamp", -1)],
135-
limit=3
136-
)
137-
if mongo_memory:
138-
# Concatenate MongoDB memory with Zep memory
139-
mongo_memory = [
140-
f"{msg['user_message']} {msg['assistant_message']}"
141-
for msg in mongo_memory
142-
]
143-
memories += " ".join(mongo_memory)
144130
return memories
145131

146132
except Exception as e:

tests/unit/repositories/test_memory_repo.py

Lines changed: 0 additions & 93 deletions
Original file line numberDiff line numberDiff line change
@@ -422,96 +422,3 @@ def test_find_mongo_error(self, mock_mongo_adapter):
422422
result = repo.find("conversations", {})
423423
assert result == []
424424
mock_mongo_adapter.find.assert_called_once()
425-
426-
@pytest.mark.asyncio
427-
async def test_retrieve_with_zep_and_mongo(self, mock_zep, mock_mongo_adapter):
428-
"""Test retrieving memories from both Zep and MongoDB."""
429-
# Setup MongoDB mock with sample data
430-
mock_mongo_data = [
431-
{"user_message": "User1", "assistant_message": "Assistant1"},
432-
{"user_message": "User2", "assistant_message": "Assistant2"},
433-
{"user_message": "User3", "assistant_message": "Assistant3"}
434-
]
435-
mock_mongo_adapter.find.return_value = mock_mongo_data
436-
437-
# Setup Zep mock with sample data
438-
mock_memory = MagicMock(spec=Memory)
439-
mock_memory.context = "Zep memory context"
440-
mock_zep.memory.get.return_value = mock_memory
441-
442-
# Create repository with both adapters
443-
repo = MemoryRepository(
444-
mongo_adapter=mock_mongo_adapter, zep_api_key="test_key")
445-
repo.zep = mock_zep
446-
447-
# Call retrieve method
448-
result = await repo.retrieve("test_user")
449-
450-
# Verify correct data retrieval and formatting
451-
mock_zep.memory.get.assert_called_once_with(session_id="test_user")
452-
mock_mongo_adapter.find.assert_called_once()
453-
454-
# Verify the memories were combined correctly
455-
assert "Zep memory context" in result
456-
assert "User1 Assistant1" in result
457-
assert "User2 Assistant2" in result
458-
assert "User3 Assistant3" in result
459-
460-
@pytest.mark.asyncio
461-
async def test_retrieve_mongo_only(self, mock_mongo_adapter):
462-
"""Test retrieving memories from MongoDB only (no Zep)."""
463-
# Setup MongoDB mock with sample data
464-
mock_mongo_data = [
465-
{"user_message": "MongoUser1", "assistant_message": "MongoAssistant1"},
466-
{"user_message": "MongoUser2", "assistant_message": "MongoAssistant2"}
467-
]
468-
mock_mongo_adapter.find.return_value = mock_mongo_data
469-
470-
# Create repository with MongoDB only
471-
repo = MemoryRepository(mongo_adapter=mock_mongo_adapter)
472-
473-
# Call retrieve method
474-
result = await repo.retrieve("test_user")
475-
476-
# Verify correct behavior
477-
mock_mongo_adapter.find.assert_called_once_with(
478-
"conversations",
479-
{"user_id": "test_user"},
480-
sort=[("timestamp", -1)],
481-
limit=3
482-
)
483-
assert "MongoUser1 MongoAssistant1" in result
484-
assert "MongoUser2 MongoAssistant2" in result
485-
486-
@pytest.mark.asyncio
487-
async def test_retrieve_mongo_empty_results(self, mock_mongo_adapter):
488-
"""Test retrieving when MongoDB returns empty results."""
489-
# Setup MongoDB mock with empty data
490-
mock_mongo_adapter.find.return_value = []
491-
492-
# Create repository with MongoDB only
493-
repo = MemoryRepository(mongo_adapter=mock_mongo_adapter)
494-
495-
# Call retrieve method
496-
result = await repo.retrieve("test_user")
497-
498-
# Verify correct behavior
499-
mock_mongo_adapter.find.assert_called_once()
500-
assert result == "" # Should be empty string
501-
502-
@pytest.mark.asyncio
503-
async def test_retrieve_mongo_error(self, mock_mongo_adapter):
504-
"""Test handling MongoDB retrieval error."""
505-
# Setup MongoDB mock to throw an error
506-
mock_mongo_adapter.find.side_effect = Exception(
507-
"MongoDB retrieval error")
508-
509-
# Create repository with MongoDB only
510-
repo = MemoryRepository(mongo_adapter=mock_mongo_adapter)
511-
512-
# Call retrieve method - should handle the error gracefully
513-
result = await repo.retrieve("test_user")
514-
515-
# Verify behavior
516-
mock_mongo_adapter.find.assert_called_once()
517-
assert result == "" # Should return empty string on error

0 commit comments

Comments
 (0)