diff --git a/docs/api-reference/memory/get-memories.mdx b/docs/api-reference/memory/v1-get-memories.mdx similarity index 58% rename from docs/api-reference/memory/get-memories.mdx rename to docs/api-reference/memory/v1-get-memories.mdx index 50a58881..d980625e 100644 --- a/docs/api-reference/memory/get-memories.mdx +++ b/docs/api-reference/memory/v1-get-memories.mdx @@ -1,4 +1,4 @@ --- -title: 'Get Memories' +title: 'V1 Get Memories' openapi: get /v1/memories/ --- diff --git a/docs/api-reference/memory/v2-get-memories.mdx b/docs/api-reference/memory/v2-get-memories.mdx new file mode 100644 index 00000000..b16fd861 --- /dev/null +++ b/docs/api-reference/memory/v2-get-memories.mdx @@ -0,0 +1,74 @@ +--- +title: 'V2 Get Memories' +openapi: post /v2/memories/ +--- + + +Mem0 offers two versions of the get memories API: v1 and v2. Here's how they differ: + + + + + ```python Code + memories = m.get_all(user_id="alex") + ``` + + ```json Output + [ + { + "id":"f38b689d-6b24-45b7-bced-17fbb4d8bac7", + "memory":"travelling to Paris", + "user_id":"alex", + "hash":"62bc074f56d1f909f1b4c2b639f56f6a", + "metadata":null, + "created_at":"2023-02-25T23:57:00.108347-07:00", + "updated_at":"2024-07-25T23:57:00.108367-07:00" + } +] + ``` + + + + + + ```python Code + memories = m.get_all( + filters={ + "AND": [ + { + "user_id": "alex" + }, + { + "created_at": { + "gte": "2024-07-01", + "lte": "2024-07-31" + } + } + ] + }, + version="v2" + ) + ``` + + ```json Output + [ + { + "id":"f38b689d-6b24-45b7-bced-17fbb4d8bac7", + "memory":"Name: Alex. Vegetarian. Allergic to nuts.", + "user_id":"alex", + "hash":"62bc074f56d1f909f1b4c2b639f56f6a", + "metadata":null, + "created_at":"2024-07-25T23:57:00.108347-07:00", + "updated_at":"2024-07-25T23:57:00.108367-07:00" + } +] + ``` + + + + +Key difference between v1 and v2 get memories: + +• **Filters**: v2 allows you to apply filters to narrow down memory retrieval based on specific criteria. This includes support for complex logical operations (AND, OR) and comparison operators (IN, gte, lte, gt, lt, ne, icontains) for advanced filtering capabilities. + +The v2 get memories API is more powerful and flexible, allowing for more precise memory retrieval without the need for a search query. diff --git a/docs/api-reference/memory/v2-search-memories.mdx b/docs/api-reference/memory/v2-search-memories.mdx index 0c340399..220c27d7 100644 --- a/docs/api-reference/memory/v2-search-memories.mdx +++ b/docs/api-reference/memory/v2-search-memories.mdx @@ -34,7 +34,7 @@ Mem0 offers two versions of the search API: v1 and v2. Here's how they differ: ```python Code - related_memories = m.v2_search( + related_memories = m.vsearch( query="What are Alice's hobbies?", filters={ "AND":[ @@ -50,7 +50,8 @@ Mem0 offers two versions of the search API: v1 and v2. Here's how they differ: } } ] - } + }, + version="v2" ) ``` diff --git a/docs/mint.json b/docs/mint.json index f5a168f7..97c6625b 100644 --- a/docs/mint.json +++ b/docs/mint.json @@ -145,7 +145,8 @@ { "group": "Memory APIs", "pages": [ - "api-reference/memory/get-memories", + "api-reference/memory/v1-get-memories", + "api-reference/memory/v2-get-memories", "api-reference/memory/add-memories", "api-reference/memory/delete-memories", "api-reference/memory/get-memory", diff --git a/docs/openapi.json b/docs/openapi.json index e318e75f..2c287e73 100644 --- a/docs/openapi.json +++ b/docs/openapi.json @@ -730,6 +730,145 @@ "x-codegen-request-body-name": "data" } }, + "/v2/memories/": { + "post": { + "tags": [ + "memories" + ], + "description": "Get all memories", + "operationId": "memories_list_v2", + "parameters": [ + { + "name": "filters", + "in": "query", + "schema": { + "type": "object" + }, + "description": "Filters to apply to the memories", + "style": "deepObject", + "explode": true + }, + { + "name": "org_name", + "in": "query", + "schema": { + "type": "string" + }, + "description": "Filter memories by organization name" + }, + { + "name": "project_name", + "in": "query", + "schema": { + "type": "string" + }, + "description": "Filter memories by project name" + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "type": "array", + "items": { + "type": "object", + "properties": { + "id": { + "type": "string" + }, + "name": { + "type": "string" + }, + "created_at": { + "type": "string", + "format": "date-time" + }, + "updated_at": { + "type": "string", + "format": "date-time" + }, + "total_memories": { + "type": "integer" + }, + "owner": { + "type": "string" + }, + "organization": { + "type": "string" + }, + "metadata": { + "type": "object" + }, + "type": { + "type": "string", + "enum": [ + "user", + "agent" + ] + } + }, + "required": [ + "id", + "name", + "created_at", + "updated_at", + "total_memories", + "owner", + "organization", + "type" + ] + } + } + } + } + }, + "400": { + "description": "Bad Request", + "content": { + "application/json": { + "schema": { + "type": "object", + "properties": { + "message": { + "type": "string", + "example": "One of the filters: app_id, user_id, agent_id, run_id is required!" + } + } + } + } + } + } + }, + "x-code-samples": [ + { + "lang": "Python", + "source": "# To use the Python SDK, install the package:\n# pip install mem0ai\n\nfrom mem0 import MemoryClient\nclient = MemoryClient(api_key=\"your-api-key\")\n\n# Retrieve memories with filters\nmemories = client.get_all(\n filters={\n \"AND\": [\n {\n \"user_id\": \"alex\"\n },\n {\n \"created_at\": {\n \"gte\": \"2024-07-01\",\n \"lte\": \"2024-07-31\"\n }\n }\n ]\n },\n version=\"v2\"\n)\n\nprint(memories)" + }, + { + "lang": "JavaScript", + "source": "const axios = require('axios');\n\nconst filters = {\n AND: [\n { user_id: 'alex' },\n { created_at: { gte: '2024-07-01', lte: '2024-07-31' } }\n ]\n};\n\naxios.post('https://api.mem0.ai/v2/memories/', { filters }, {\n headers: { 'Authorization': 'Token your-api-key' }\n})\n.then(response => console.log(response.data))\n.catch(error => console.error(error));" + }, + { + "lang": "cURL", + "source": "curl -X POST 'https://api.mem0.ai/v2/memories/' \\\n-H 'Authorization: Token your-api-key' \\\n-H 'Content-Type: application/json' \\\n-d '{\n \"filters\": {\n \"AND\": [\n { \"user_id\": \"alex\" },\n { \"created_at\": { \"gte\": \"2024-07-01\", \"lte\": \"2024-07-31\" } }\n ]\n }\n}'" + }, + { + "lang": "Go", + "source": "package main\n\nimport (\n\t\"bytes\"\n\t\"encoding/json\"\n\t\"fmt\"\n\t\"io/ioutil\"\n\t\"net/http\"\n)\n\nfunc main() {\n\turl := \"https://api.mem0.ai/v2/memories/\"\n\tfilters := map[string]interface{}{\n\t\t\"AND\": []map[string]interface{}{\n\t\t\t{\"user_id\": \"alex\"},\n\t\t\t{\"created_at\": map[string]string{\n\t\t\t\t\"gte\": \"2024-07-01\",\n\t\t\t\t\"lte\": \"2024-07-31\",\n\t\t\t}},\n\t\t},\n\t}\n\tpayload, _ := json.Marshal(map[string]interface{}{\"filters\": filters})\n\treq, _ := http.NewRequest(\"POST\", url, bytes.NewBuffer(payload))\n\treq.Header.Add(\"Authorization\", \"Token your-api-key\")\n\treq.Header.Add(\"Content-Type\", \"application/json\")\n\n\tres, _ := http.DefaultClient.Do(req)\n\tdefer res.Body.Close()\n\tbody, _ := ioutil.ReadAll(res.Body)\n\n\tfmt.Println(string(body))\n}" + }, + { + "lang": "PHP", + "source": " [\n ['user_id' => 'alex'],\n ['created_at' => ['gte' => '2024-07-01', 'lte' => '2024-07-31']]\n ]\n];\n\ncurl_setopt_array($curl, [\n CURLOPT_URL => \"https://api.mem0.ai/v2/memories/\",\n CURLOPT_RETURNTRANSFER => true,\n CURLOPT_ENCODING => \"\",\n CURLOPT_MAXREDIRS => 10,\n CURLOPT_TIMEOUT => 30,\n CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,\n CURLOPT_CUSTOMREQUEST => \"POST\",\n CURLOPT_POSTFIELDS => json_encode(['filters' => $filters]),\n CURLOPT_HTTPHEADER => [\n \"Authorization: Token your-api-key\",\n \"Content-Type: application/json\"\n ],\n]);\n\n$response = curl_exec($curl);\n$err = curl_error($curl);\n\ncurl_close($curl);\n\nif ($err) {\n echo \"cURL Error #:\" . $err;\n} else {\n echo $response;\n}" + }, + { + "lang": "Java", + "source": "import com.konghq.unirest.http.HttpResponse;\nimport com.konghq.unirest.http.Unirest;\nimport org.json.JSONObject;\n\nJSONObject filters = new JSONObject()\n .put(\"AND\", new JSONArray()\n .put(new JSONObject().put(\"user_id\", \"alex\"))\n .put(new JSONObject().put(\"created_at\", new JSONObject()\n .put(\"gte\", \"2024-07-01\")\n .put(\"lte\", \"2024-07-31\")\n ))\n );\n\nHttpResponse response = Unirest.post(\"https://api.mem0.ai/v2/memories/\")\n .header(\"Authorization\", \"Token your-api-key\")\n .header(\"Content-Type\", \"application/json\")\n .body(new JSONObject().put(\"filters\", filters).toString())\n .asString();\n\nSystem.out.println(response.getBody());" + } + ] + } + }, "/v1/memories/events/": { "get": { "tags": [ diff --git a/docs/platform/quickstart.mdx b/docs/platform/quickstart.mdx index 353b045a..606aff3d 100644 --- a/docs/platform/quickstart.mdx +++ b/docs/platform/quickstart.mdx @@ -861,6 +861,88 @@ curl -X GET "https://api.mem0.ai/v1/memories/582bbe6d-506b-48c6-a4c6-5df3b1e6342 ``` +#### Get all memories using custom filters + +Our advanced retrieval allows you to set custom filters when fetching memories. You can filter by user_id, agent_id, app_id, date, and more. + +Here you need to define `version` as `v2` in the get_all method. + +Example: Get all memories using user_id and date filters + + + +```python Python +filters = { + "AND":[ + { + "user_id":"alex" + }, + { + "created_at":{ + "gte":"2024-07-01", + "lte":"2024-07-31" + } + } + ] +} +client.get_all(version="v2", filters=filters) +``` + +```javascript JavaScript +const filters = { + "AND":[ + { + "user_id":"alex" + }, + { + "created_at":{ + "gte":"2024-07-01", + "lte":"2024-07-31" + } + } + ] +}; +client.getAll({ version: "v2", filters }) + .then(memories => console.log(memories)) + .catch(error => console.error(error)); +``` + +```bash cURL +curl -X GET "https://api.mem0.ai/v1/memories/?version=v2" \ + -H "Authorization: Token your-api-key" \ + -H "Content-Type: application/json" \ + -d '{ + "filters": { + "AND": [ + { + "user_id": "alex" + }, + { + "created_at": { + "gte": "2024-07-01", + "lte": "2024-07-31" + } + } + ] + } + }' +``` + +```json Output +[ + { + "id":"f38b689d-6b24-45b7-bced-17fbb4d8bac7", + "memory":"Name: Alex. Vegetarian. Allergic to nuts.", + "user_id":"alex", + "hash":"62bc074f56d1f909f1b4c2b639f56f6a", + "metadata":null, + "created_at":"2024-07-25T23:57:00.108347-07:00", + "updated_at":"2024-07-25T23:57:00.108367-07:00" + } +] +``` + + ### 4.5 Memory History Get history of how a memory has changed over time. diff --git a/mem0/client/main.py b/mem0/client/main.py index 2de59cc2..99500eff 100644 --- a/mem0/client/main.py +++ b/mem0/client/main.py @@ -139,10 +139,11 @@ class MemoryClient: return response.json() @api_error_handler - def get_all(self, **kwargs) -> List[Dict[str, Any]]: + def get_all(self, version: str = "v1", **kwargs) -> List[Dict[str, Any]]: """Retrieve all memories, with optional filtering. Args: + version: The API version to use for the search endpoint. **kwargs: Optional parameters for filtering (user_id, agent_id, app_id, limit). Returns: @@ -153,7 +154,10 @@ class MemoryClient: """ kwargs.update({"org_name": self.organization, "project_name": self.project}) params = self._prepare_params(kwargs) - response = self.client.get("/v1/memories/", params=params) + if version == "v1": + response = self.client.get(f"/{version}/memories/", params=params) + elif version == "v2": + response = self.client.post(f"/{version}/memories/", json=params) response.raise_for_status() capture_client_event( "client.get_all",