diff --git a/README.md b/README.md index a85144b7..2863e0c5 100644 --- a/README.md +++ b/README.md @@ -16,6 +16,8 @@ Learn more · Join Discord + · + Demo

@@ -129,15 +131,17 @@ For more advanced usage and API documentation, visit our [documentation](https:/ ## Demos -- AI Companion: Experience personalized conversations with an AI that remembers your preferences and past interactions +- Mem0 - ChatGPT with Memory: A personalized AI chat app powered by Mem0 that remembers your preferences, facts, and memories. -[AI Companion Demo](https://github.com/user-attachments/assets/3fc72023-a72c-4593-8be0-3cee3ba744da) +[Mem0 - ChatGPT with Memory](https://github.com/user-attachments/assets/cebc4f8e-bdb9-4837-868d-13c5ab7bb433) + +Try live [demo](https://mem0.dev/demo/)

-- Mem0 Demo: A personalized AI chat app powered by Mem0 that remembers your preferences, facts, and memories. +- AI Companion: Experience personalized conversations with an AI that remembers your preferences and past interactions -[Mem0 Demo](https://github.com/user-attachments/assets/cebc4f8e-bdb9-4837-868d-13c5ab7bb433) +[AI Companion Demo](https://github.com/user-attachments/assets/3fc72023-a72c-4593-8be0-3cee3ba744da)

diff --git a/docs/docs.json b/docs/docs.json index 1b50d8c3..2b14c619 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -277,7 +277,7 @@ }, { "anchor": "Demo", - "href": "https://demo.mem0.ai", + "href": "https://mem0.dev/demo", "icon": "play" }, { diff --git a/docs/examples/mem0-demo.mdx b/docs/examples/mem0-demo.mdx index 7b5b31c5..e5d2a379 100644 --- a/docs/examples/mem0-demo.mdx +++ b/docs/examples/mem0-demo.mdx @@ -13,6 +13,8 @@ You can create a personalized AI Companion using Mem0. This guide will walk you src="https://github.com/user-attachments/assets/cebc4f8e-bdb9-4837-868d-13c5ab7bb433" > +You can try the [Mem0 Demo](https://mem0.dev/demo) live here. + ## Overview The Personalized AI Companion leverages Mem0 to retain information across interactions, enabling a tailored learning experience. It creates memories for each user interaction and integrates with OpenAI's GPT models to provide detailed and context-aware responses to user queries. diff --git a/docs/open-source/graph_memory/overview.mdx b/docs/open-source/graph_memory/overview.mdx index 0e3bfe67..1867539b 100644 --- a/docs/open-source/graph_memory/overview.mdx +++ b/docs/open-source/graph_memory/overview.mdx @@ -52,10 +52,6 @@ Currently, we support Neo4j as a graph store provider. You can setup [Neo4j](htt If you are using Neo4j locally, then you need to install [APOC plugins](https://neo4j.com/labs/apoc/4.1/installation/). - -If you are using NodeSDK, you need to pass `enableGraph` as `true` in the `config` object. - - User can also customize the LLM for Graph Memory from the [Supported LLM list](https://docs.mem0.ai/components/llms/overview) with three levels of configuration: 1. **Main Configuration**: If `llm` is set in the main config, it will be used for all graph operations. @@ -163,6 +159,10 @@ const memory = new Memory(config); ``` + +If you are using NodeSDK, you need to pass `enableGraph` as `true` in the `config` object. + + ## Graph Operations The Mem0's graph supports the following operations: diff --git a/docs/open-source/node-quickstart.mdx b/docs/open-source/node-quickstart.mdx index 0dc4cf62..1fc1abd7 100644 --- a/docs/open-source/node-quickstart.mdx +++ b/docs/open-source/node-quickstart.mdx @@ -74,14 +74,14 @@ const messages = [ {"role": "assistant", "content": "Got it! I'll avoid thriller recommendations and suggest sci-fi movies in the future."} ] -await memory.add(messages, { userId: "user123", metadata: { category: "movie_recommendations" } }); +await memory.add(messages, { userId: "alice", metadata: { category: "movie_recommendations" } }); ``` ```json Output { "results": [ { - "id": "c03c9045-df76-4949-bbc5-d5dc1932aa5c", + "id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", "memory": "User is planning to watch a movie tonight.", "metadata": { "category": "movie_recommendations" @@ -111,7 +111,7 @@ await memory.add(messages, { userId: "user123", metadata: { category: "movie_rec ```typescript Code // Get all memories -const allMemories = await memory.getAll({ userId: "user123" }); +const allMemories = await memory.getAll({ userId: "alice" }); console.log(allMemories) ``` @@ -127,7 +127,7 @@ console.log(allMemories) "metadata": { "category": "movie_recommendations" }, - "userId": "user123" + "userId": "alice" }, { "id": "475bde34-21e6-42ab-8bef-0ab84474f156", @@ -138,7 +138,7 @@ console.log(allMemories) "metadata": { "category": "movie_recommendations" }, - "userId": "user123" + "userId": "alice" }, { "id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4", @@ -149,7 +149,7 @@ console.log(allMemories) "metadata": { "category": "movie_recommendations" }, - "userId": "user123" + "userId": "alice" } ] } @@ -176,7 +176,7 @@ console.log(singleMemory); "metadata": { "category": "movie_recommendations" }, - "userId": "user123" + "userId": "alice" } ``` @@ -185,7 +185,7 @@ console.log(singleMemory); ```typescript Code -const result = await memory.search('What do you know about me?', { userId: "user123" }); +const result = await memory.search('What do you know about me?', { userId: "alice" }); console.log(result); ``` @@ -202,7 +202,7 @@ console.log(result); "metadata": { "category": "movie_recommendations" }, - "userId": "user123" + "userId": "alice" }, { "id": "475bde34-21e6-42ab-8bef-0ab84474f156", @@ -214,7 +214,7 @@ console.log(result); "metadata": { "category": "movie_recommendations" }, - "userId": "user123" + "userId": "alice" }, { "id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4", @@ -226,7 +226,7 @@ console.log(result); "metadata": { "category": "movie_recommendations" }, - "userId": "user123" + "userId": "alice" } ] } @@ -263,23 +263,23 @@ console.log(history); [ { "id": 39, - "memory_id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", - "previous_value": "User is planning to watch a movie tonight.", - "new_value": "I love India, it is my favorite country.", + "memoryId": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", + "previousValue": "User is planning to watch a movie tonight.", + "newValue": "I love India, it is my favorite country.", "action": "UPDATE", - "created_at": "2025-02-27T16:33:20.557Z", - "updated_at": "2025-02-27T16:33:27.051Z", - "is_deleted": 0 + "createdAt": "2025-02-27T16:33:20.557Z", + "updatedAt": "2025-02-27T16:33:27.051Z", + "isDeleted": 0 }, { "id": 37, - "memory_id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", - "previous_value": null, - "new_value": "User is planning to watch a movie tonight.", + "memoryId": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", + "previousValue": null, + "newValue": "User is planning to watch a movie tonight.", "action": "ADD", - "created_at": "2025-02-27T16:33:20.557Z", - "updated_at": null, - "is_deleted": 0 + "createdAt": "2025-02-27T16:33:20.557Z", + "updatedAt": null, + "isDeleted": 0 } ] ``` @@ -292,7 +292,7 @@ console.log(history); await memory.delete('892db2ae-06d9-49e5-8b3e-585ef9b85b8e'); // Delete all memories for a user -await memory.deleteAll({ userId: "user123" }); +await memory.deleteAll({ userId: "alice" }); ``` ### Reset Memory @@ -327,6 +327,15 @@ Mem0 offers extensive configuration options to customize its behavior according | `openaiBaseUrl` | Base URL for OpenAI API | OpenAI | + +| Parameter | Description | Default | +|-------------|---------------------------------|-------------| +| `provider` | Graph store provider (e.g., "neo4j") | "neo4j" | +| `url` | Connection URL | env.NEO4J_URL | +| `username` | Authentication username | env.NEO4J_USERNAME | +| `password` | Authentication password | env.NEO4J_PASSWORD | + + | Parameter | Description | Default | |-------------|---------------------------------|------------------------------| diff --git a/docs/open-source/python-quickstart.mdx b/docs/open-source/python-quickstart.mdx index b52399db..eec2b6c0 100644 --- a/docs/open-source/python-quickstart.mdx +++ b/docs/open-source/python-quickstart.mdx @@ -85,20 +85,43 @@ m = Memory.from_config(config_dict=config) ```python Code -# For a user -result = m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"}) +const messages = [ + {"role": "user", "content": "I'm planning to watch a movie tonight. Any recommendations?"}, + {"role": "assistant", "content": "How about a thriller movies? They can be quite engaging."}, + {"role": "user", "content": "I'm not a big fan of thriller movies but I love sci-fi movies."}, + {"role": "assistant", "content": "Got it! I'll avoid thriller recommendations and suggest sci-fi movies in the future."} +] -# messages = [ -# {"role": "user", "content": "Hi, I'm Alex. I like to play cricket on weekends."}, -# {"role": "assistant", "content": "Hello Alex! It's great to know that you enjoy playing cricket on weekends. I'll remember that for future reference."} -# ] -# client.add(messages, user_id="alice") +result = m.add(messages, user_id="alice", metadata={"category": "movie_recommendations"}) ``` ```json Output { "results": [ - {"id": "bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", "memory": "Likes to play cricket on weekends", "event": "ADD"} + { + "id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", + "memory": "User is planning to watch a movie tonight.", + "metadata": { + "category": "movie_recommendations" + }, + "event": "ADD" + }, + { + "id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4", + "memory": "User is not a big fan of thriller movies.", + "metadata": { + "category": "movie_recommendations" + }, + "event": "ADD" + }, + { + "id": "475bde34-21e6-42ab-8bef-0ab84474f156", + "memory": "User loves sci-fi movies.", + "metadata": { + "category": "movie_recommendations" + }, + "event": "ADD" + } ] } ``` @@ -115,14 +138,38 @@ all_memories = m.get_all(user_id="alice") ```json Output { "results": [ + { + "id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", + "memory": "User is planning to watch a movie tonight.", + "hash": "1a271c007316c94377175ee80e746a19", + "created_at": "2025-02-27T16:33:20.557Z", + "updated_at": "2025-02-27T16:33:27.051Z", + "metadata": { + "category": "movie_recommendations" + }, + "user_id": "alice" + }, { - "id": "bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", - "memory": "Likes to play cricket on weekends", - "hash": "285d07801ae42054732314853e9eadd7", - "metadata": {"category": "hobbies"}, - "created_at": "2024-10-28T12:32:07.744891-07:00", - "updated_at": None, - "user_id": "alice" + "id": "475bde34-21e6-42ab-8bef-0ab84474f156", + "memory": "User loves sci-fi movies.", + "hash": "285d07801ae42054732314853e9eadd7", + "created_at": "2025-02-27T16:33:20.560Z", + "updated_at": None, + "metadata": { + "category": "movie_recommendations" + }, + "user_id": "alice" + }, + { + "id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4", + "memory": "User is not a big fan of thriller movies.", + "hash": "285d07801ae42054732314853e9eadd7", + "created_at": "2025-02-27T16:33:20.560Z", + "updated_at": None, + "metadata": { + "category": "movie_recommendations" + }, + "user_id": "alice" } ] } @@ -135,18 +182,20 @@ all_memories = m.get_all(user_id="alice") ```python Code # Get a single memory by ID -specific_memory = m.get("bf4d4092-cf91-4181-bfeb-b6fa2ed3061b") +specific_memory = m.get("892db2ae-06d9-49e5-8b3e-585ef9b85b8e") ``` ```json Output { - "id": "bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", - "memory": "Likes to play cricket on weekends", - "hash": "285d07801ae42054732314853e9eadd7", - "metadata": {"category": "hobbies"}, - "created_at": "2024-10-28T12:32:07.744891-07:00", - "updated_at": None, - "user_id": "alice" + "id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", + "memory": "User is planning to watch a movie tonight.", + "hash": "1a271c007316c94377175ee80e746a19", + "created_at": "2025-02-27T16:33:20.557Z", + "updated_at": None, + "metadata": { + "category": "movie_recommendations" + }, + "user_id": "alice" } ``` @@ -155,23 +204,49 @@ specific_memory = m.get("bf4d4092-cf91-4181-bfeb-b6fa2ed3061b") ```python Code -related_memories = m.search(query="What are Alice's hobbies?", user_id="alice") +related_memories = m.search(query="What do you know about me?", user_id="alice") ``` ```json Output { - "results": [ - { - "id": "bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", - "memory": "Likes to play cricket on weekends", - "hash": "285d07801ae42054732314853e9eadd7", - "metadata": {"category": "hobbies"}, - "score": 0.30808347, - "created_at": "2024-10-28T12:32:07.744891-07:00", - "updated_at": None, - "user_id": "alice" - } - ] + "results": [ + { + "id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", + "memory": "User is planning to watch a movie tonight.", + "hash": "1a271c007316c94377175ee80e746a19", + "created_at": "2025-02-27T16:33:20.557Z", + "updated_at": None, + "score": 0.38920719231944799, + "metadata": { + "category": "movie_recommendations" + }, + "user_id": "alice" + }, + { + "id": "475bde34-21e6-42ab-8bef-0ab84474f156", + "memory": "User loves sci-fi movies.", + "hash": "285d07801ae42054732314853e9eadd7", + "created_at": "2025-02-27T16:33:20.560Z", + "updated_at": None, + "score": 0.36869761478135689, + "metadata": { + "category": "movie_recommendations" + }, + "user_id": "alice" + }, + { + "id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4", + "memory": "User is not a big fan of thriller movies.", + "hash": "285d07801ae42054732314853e9eadd7", + "created_at": "2025-02-27T16:33:20.560Z", + "updated_at": None, + "score": 0.33855272141248272, + "metadata": { + "category": "movie_recommendations" + }, + "user_id": "alice" + } + ] } ``` @@ -180,7 +255,7 @@ related_memories = m.search(query="What are Alice's hobbies?", user_id="alice") ```python Code -result = m.update(memory_id="bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", data="Likes to play tennis on weekends") +result = m.update(memory_id="892db2ae-06d9-49e5-8b3e-585ef9b85b8e", data="I love India, it is my favorite country.") ``` ```json Output @@ -192,29 +267,31 @@ result = m.update(memory_id="bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", data="Likes ```python Code -history = m.history(memory_id="bf4d4092-cf91-4181-bfeb-b6fa2ed3061b") +history = m.history(memory_id="892db2ae-06d9-49e5-8b3e-585ef9b85b8e") ``` ```json Output [ - { - "id": "96d2821d-e551-4089-aa57-9398c421d450", - "memory_id": "bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", - "old_memory": None, - "new_memory": "Likes to play cricket on weekends", - "event": "ADD", - "created_at": "2024-10-28T12:32:07.744891-07:00", - "updated_at": None - }, - { - "id": "3db4cb58-c0f1-4dd0-b62a-8123068ebfe7", - "memory_id": "bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", - "old_memory": "Likes to play cricket on weekends", - "new_memory": "Likes to play tennis on weekends", - "event": "UPDATE", - "created_at": "2024-10-28T12:32:07.744891-07:00", - "updated_at": "2024-10-28T13:05:46.987978-07:00" - } + { + "id": 39, + "memory_id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", + "previous_value": "User is planning to watch a movie tonight.", + "new_value": "I love India, it is my favorite country.", + "action": "UPDATE", + "created_at": "2025-02-27T16:33:20.557Z", + "updated_at": "2025-02-27T16:33:27.051Z", + "is_deleted": 0 + }, + { + "id": 37, + "memory_id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e", + "previous_value": null, + "new_value": "User is planning to watch a movie tonight.", + "action": "ADD", + "created_at": "2025-02-27T16:33:20.557Z", + "updated_at": null, + "is_deleted": 0 + } ] ``` @@ -223,7 +300,7 @@ history = m.history(memory_id="bf4d4092-cf91-4181-bfeb-b6fa2ed3061b") ```python # Delete a memory by id -m.delete(memory_id="bf4d4092-cf91-4181-bfeb-b6fa2ed3061b") +m.delete(memory_id="892db2ae-06d9-49e5-8b3e-585ef9b85b8e") # Delete all memories for a user m.delete_all(user_id="alice") ``` diff --git a/examples/mem0-demo/app/assistant.tsx b/examples/mem0-demo/app/assistant.tsx index 2dc79391..89ee5448 100644 --- a/examples/mem0-demo/app/assistant.tsx +++ b/examples/mem0-demo/app/assistant.tsx @@ -92,8 +92,8 @@ export const Assistant = () => {
- - + +
diff --git a/examples/mem0-demo/app/layout.tsx b/examples/mem0-demo/app/layout.tsx index 3d954690..8ccf822f 100644 --- a/examples/mem0-demo/app/layout.tsx +++ b/examples/mem0-demo/app/layout.tsx @@ -13,8 +13,8 @@ const geistMono = Geist_Mono({ }); export const metadata: Metadata = { - title: "Mem0-Demo", - description: "Mem0-Demo: By Mem0", + title: "Mem0 - ChatGPT with Memory", + description: "Mem0 - ChatGPT with Memory is a personalized AI chat app powered by Mem0 that remembers your preferences, facts, and memories.", }; export default function RootLayout({ diff --git a/examples/mem0-demo/components/assistant-ui/thread-list.tsx b/examples/mem0-demo/components/assistant-ui/thread-list.tsx index 87dcef51..2457634c 100644 --- a/examples/mem0-demo/components/assistant-ui/thread-list.tsx +++ b/examples/mem0-demo/components/assistant-ui/thread-list.tsx @@ -19,55 +19,73 @@ import { AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; - +import ThemeAwareLogo from "@/components/assistant-ui/theme-aware-logo"; +import Link from "next/link"; interface ThreadListProps { onResetUserId?: () => void; + isDarkMode: boolean; } -export const ThreadList: FC = ({ onResetUserId }) => { +export const ThreadList: FC = ({ onResetUserId, isDarkMode }) => { const [open, setOpen] = useState(false); return (
- - -
-

Recent Chats

- {onResetUserId && ( - - - - - - - - - Reset Memory - - This will permanently delete all your chat history and memories. This action cannot be undone. - - - - Cancel - { - onResetUserId(); - setOpen(false); - }} - className="bg-[#4f46e5] hover:bg-[#4338ca] dark:bg-[#6366f1] dark:hover:bg-[#4f46e5] text-white" + +
+ +
+

+ Recent Chats +

+ {onResetUserId && ( + + + - Reset - - - - - )} + + + + + + + Reset Memory + + + This will permanently delete all your chat history and + memories. This action cannot be undone. + + + + + Cancel + + { + onResetUserId(); + setOpen(false); + }} + className="bg-[#4f46e5] hover:bg-[#4338ca] dark:bg-[#6366f1] dark:hover:bg-[#4f46e5] text-white" + > + Reset + + + + + )} +
+ +
+
+ +

built using

+ +

assistant-ui

+
-
); diff --git a/examples/mem0-demo/components/assistant-ui/thread.tsx b/examples/mem0-demo/components/assistant-ui/thread.tsx index 096e7788..3dc7e944 100644 --- a/examples/mem0-demo/components/assistant-ui/thread.tsx +++ b/examples/mem0-demo/components/assistant-ui/thread.tsx @@ -1,4 +1,4 @@ -"use client" +"use client"; import { ActionBarPrimitive, @@ -42,14 +42,22 @@ import { AlertDialogTitle, AlertDialogTrigger, } from "@/components/ui/alert-dialog"; +import Link from "next/link"; +import ThemeAwareLogo from "./theme-aware-logo"; interface ThreadProps { sidebarOpen: boolean; setSidebarOpen: Dispatch>; onResetUserId?: () => void; + isDarkMode: boolean; } -export const Thread: FC = ({ sidebarOpen, setSidebarOpen, onResetUserId }) => { +export const Thread: FC = ({ + sidebarOpen, + setSidebarOpen, + onResetUserId, + isDarkMode, +}) => { const [resetDialogOpen, setResetDialogOpen] = useState(false); return ( @@ -61,23 +69,28 @@ export const Thread: FC = ({ sidebarOpen, setSidebarOpen, onResetUs > {/* Mobile sidebar overlay */} {sidebarOpen && ( -
setSidebarOpen(false)} >
)} {/* Mobile sidebar drawer */} -
+

Recent Chats

{onResetUserId && ( - + = ({ sidebarOpen, setSidebarOpen, onResetUs - Reset Memory + + Reset Memory + - This will permanently delete all your chat history and memories. This action cannot be undone. + This will permanently delete all your chat history and + memories. This action cannot be undone. - Cancel + + Cancel + { onResetUserId(); @@ -109,9 +127,9 @@ export const Thread: FC = ({ sidebarOpen, setSidebarOpen, onResetUs )} -
- - - + +
+

+ Recent Chats +

+
+ +
+
+ - - New Thread - - -
-

Recent Chats

+

+ built using +

+ +

+ assistant-ui +

+
- - +
@@ -185,19 +222,20 @@ const ThreadWelcome: FC = () => {
-
- Mem0 Demo +
+ Mem0 - ChatGPT with memory

- A personalized AI chat app powered by Mem0 that remembers your preferences, facts, and memories. + A personalized AI chat app powered by Mem0 that remembers your + preferences, facts, and memories.

-

+

How can I help you today?

- +
@@ -212,21 +250,27 @@ const ThreadWelcomeSuggestions: FC = () => { prompt="I like to travel to " method="replace" > - Travel + + Travel + - Food + + Food + - Project details + + Project details +
); @@ -335,22 +379,22 @@ const EditComposer: FC = () => { const AssistantMessage: FC = () => { const content = useMessage((m) => m.content); const markdownText = React.useMemo(() => { - if (!content) return ''; - if (typeof content === 'string') return content; - if (Array.isArray(content) && content.length > 0 && 'text' in content[0]) { - return content[0].text || ''; + if (!content) return ""; + if (typeof content === "string") return content; + if (Array.isArray(content) && content.length > 0 && "text" in content[0]) { + return content[0].text || ""; } - return ''; + return ""; }, [content]); return (
-
@@ -400,7 +444,10 @@ const BranchPicker: FC = ({ return ( @@ -428,7 +475,13 @@ const BranchPicker: FC = ({ const CircleStopIcon = () => { return ( - + ); diff --git a/examples/mem0-demo/public/images/assistant-ui-dark.svg b/examples/mem0-demo/public/images/assistant-ui-dark.svg new file mode 100644 index 00000000..b01214a8 --- /dev/null +++ b/examples/mem0-demo/public/images/assistant-ui-dark.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/examples/mem0-demo/public/images/assistant-ui.svg b/examples/mem0-demo/public/images/assistant-ui.svg new file mode 100644 index 00000000..3a30a53f --- /dev/null +++ b/examples/mem0-demo/public/images/assistant-ui.svg @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file