diff --git a/letta/server/rest_api/routers/v1/agents.py b/letta/server/rest_api/routers/v1/agents.py index 06a66067..41e72e46 100644 --- a/letta/server/rest_api/routers/v1/agents.py +++ b/letta/server/rest_api/routers/v1/agents.py @@ -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, diff --git a/pyproject.toml b/pyproject.toml index e1d93eb1..f030fe4b 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -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", diff --git a/tests/test_sdk_client.py b/tests/test_sdk_client.py index 83522f6e..bea64ea5 100644 --- a/tests/test_sdk_client.py +++ b/tests/test_sdk_client.py @@ -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""" diff --git a/uv.lock b/uv.lock index 97f53be2..85b5a04d 100644 --- a/uv.lock +++ b/uv.lock @@ -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]]