feat: use datetime ranges for archival memory query (#4398)
This commit is contained in:
@@ -993,8 +993,8 @@ async def search_archival_memory(
|
||||
"any", description="How to match tags - 'any' to match passages with any of the tags, 'all' to match only passages with all tags"
|
||||
),
|
||||
top_k: Optional[int] = Query(None, description="Maximum number of results to return. Uses system default if not specified"),
|
||||
start_datetime: Optional[str] = Query(None, description="Filter results to passages created after this datetime. ISO 8601 format"),
|
||||
end_datetime: Optional[str] = Query(None, description="Filter results to passages created before this datetime. ISO 8601 format"),
|
||||
start_datetime: Optional[datetime] = Query(None, description="Filter results to passages created after this datetime"),
|
||||
end_datetime: Optional[datetime] = Query(None, description="Filter results to passages created before this datetime"),
|
||||
server: "SyncServer" = Depends(get_letta_server),
|
||||
actor_id: str | None = Header(None, alias="user_id"),
|
||||
):
|
||||
@@ -1008,6 +1008,10 @@ async def search_archival_memory(
|
||||
actor = await server.user_manager.get_actor_or_default_async(actor_id=actor_id)
|
||||
|
||||
try:
|
||||
# convert datetime to string in ISO 8601 format
|
||||
start_datetime = start_datetime.isoformat() if start_datetime else None
|
||||
end_datetime = end_datetime.isoformat() if end_datetime else None
|
||||
|
||||
# Use the shared agent manager method
|
||||
formatted_results, count = await server.agent_manager.search_agent_archival_memory_async(
|
||||
agent_id=agent_id,
|
||||
|
||||
@@ -45,7 +45,7 @@ dependencies = [
|
||||
"llama-index>=0.12.2",
|
||||
"llama-index-embeddings-openai>=0.3.1",
|
||||
"anthropic>=0.49.0",
|
||||
"letta_client>=0.1.301",
|
||||
"letta-client==0.1.307",
|
||||
"openai>=1.99.9",
|
||||
"opentelemetry-api==1.30.0",
|
||||
"opentelemetry-sdk==1.30.0",
|
||||
|
||||
@@ -558,6 +558,48 @@ def test_insert_archival_memory(client: LettaSDKClient, agent: AgentState):
|
||||
assert "This is a test passage" not in passage_texts, f"Memory was not deleted: {passage_texts}"
|
||||
|
||||
|
||||
def test_search_archival_memory(client: LettaSDKClient, agent: AgentState):
|
||||
from datetime import datetime, timezone
|
||||
|
||||
client.agents.passages.create(
|
||||
agent_id=agent.id,
|
||||
text="This is a test passage",
|
||||
)
|
||||
client.agents.passages.create(
|
||||
agent_id=agent.id,
|
||||
text="This is another test passage",
|
||||
)
|
||||
client.agents.passages.create(agent_id=agent.id, text="cats")
|
||||
# insert old passage: 09/03/2001
|
||||
old_passage = "OLD PASSAGE"
|
||||
client.agents.passages.create(
|
||||
agent_id=agent.id,
|
||||
text=old_passage,
|
||||
created_at=datetime(2001, 9, 3, 0, 0, 0, 0, timezone.utc),
|
||||
)
|
||||
|
||||
# test seaching for old passage
|
||||
search_results = client.agents.passages.search(agent_id=agent.id, query="cats", top_k=1)
|
||||
assert len(search_results.results) == 1
|
||||
assert search_results.results[0].content == "cats"
|
||||
|
||||
# test seaching for old passage
|
||||
search_results = client.agents.passages.search(agent_id=agent.id, query="cats", top_k=4)
|
||||
assert len(search_results.results) == 4
|
||||
assert search_results.results[0].content == "cats"
|
||||
|
||||
# search for old passage
|
||||
search_results = client.agents.passages.search(
|
||||
agent_id=agent.id,
|
||||
query="cats",
|
||||
top_k=4,
|
||||
start_datetime=datetime(2001, 8, 3, 0, 0, 0, 0, timezone.utc),
|
||||
end_datetime=datetime(2001, 10, 3, 0, 0, 0, 0, timezone.utc),
|
||||
)
|
||||
assert len(search_results.results) == 1
|
||||
assert search_results.results[0].content == old_passage
|
||||
|
||||
|
||||
def test_function_return_limit(disable_e2b_api_key, client: LettaSDKClient, agent: AgentState):
|
||||
"""Test to see if the function return limit works"""
|
||||
|
||||
|
||||
10
uv.lock
generated
10
uv.lock
generated
@@ -1,5 +1,5 @@
|
||||
version = 1
|
||||
revision = 3
|
||||
revision = 2
|
||||
requires-python = ">=3.11, <3.14"
|
||||
resolution-markers = [
|
||||
"python_full_version >= '3.13'",
|
||||
@@ -2608,7 +2608,7 @@ requires-dist = [
|
||||
{ name = "langchain", marker = "extra == 'external-tools'", specifier = ">=0.3.7" },
|
||||
{ name = "langchain-community", marker = "extra == 'desktop'", specifier = ">=0.3.7" },
|
||||
{ name = "langchain-community", marker = "extra == 'external-tools'", specifier = ">=0.3.7" },
|
||||
{ name = "letta-client", specifier = ">=0.1.301" },
|
||||
{ name = "letta-client", specifier = "==0.1.307" },
|
||||
{ name = "llama-index", specifier = ">=0.12.2" },
|
||||
{ name = "llama-index-embeddings-openai", specifier = ">=0.3.1" },
|
||||
{ name = "locust", marker = "extra == 'desktop'", specifier = ">=2.31.5" },
|
||||
@@ -2684,7 +2684,7 @@ provides-extras = ["postgres", "redis", "pinecone", "sqlite", "experimental", "s
|
||||
|
||||
[[package]]
|
||||
name = "letta-client"
|
||||
version = "0.1.301"
|
||||
version = "0.1.307"
|
||||
source = { registry = "https://pypi.org/simple" }
|
||||
dependencies = [
|
||||
{ name = "httpx" },
|
||||
@@ -2693,9 +2693,9 @@ dependencies = [
|
||||
{ name = "pydantic-core" },
|
||||
{ name = "typing-extensions" },
|
||||
]
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/0b/12/4d01a3be45460e6e1ed4a8c1c4a97ba2e45deeba793dbfae06e2d634c7de/letta_client-0.1.301.tar.gz", hash = "sha256:0de9be3d3128ce06bb7880ea2796adcdcf1db70ca3a11182ebaee2c4a3749d8f", size = 187394, upload-time = "2025-08-30T00:01:42.805Z" }
|
||||
sdist = { url = "https://files.pythonhosted.org/packages/4d/ea/e6148fefa2f2925c49cd0569c9235c73f7699871d4b1be456f899774cdfd/letta_client-0.1.307.tar.gz", hash = "sha256:215b6d23cfc28a79812490ddb991bd979057ca28cd8491576873473b140086a7", size = 190679, upload-time = "2025-09-03T18:30:09.634Z" }
|
||||
wheels = [
|
||||
{ url = "https://files.pythonhosted.org/packages/2d/44/f4a5831bcf451c0933d23bf2c571d2ccc3bd9257239340a8fd877bb27de8/letta_client-0.1.301-py3-none-any.whl", hash = "sha256:e000a7d0ac8ea6300a2dc374976a33f3272ff4714d76d13fccfcd1d9c7bef195", size = 472687, upload-time = "2025-08-30T00:01:40.882Z" },
|
||||
{ url = "https://files.pythonhosted.org/packages/df/3f/cdc1d401037970d83c45a212d66a0319608c0e2f1da1536074e5de5353ed/letta_client-0.1.307-py3-none-any.whl", hash = "sha256:f07c3d58f2767e9ad9ecb11ca9227ba368e466ad05b48a7a49b5a1edd15b4cbc", size = 478428, upload-time = "2025-09-03T18:30:08.092Z" },
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
||||
Reference in New Issue
Block a user