Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
4318663697 | ||
|
|
5606c3ffb8 | ||
|
|
c1aba35884 | ||
|
|
d9b48191de |
@@ -8,16 +8,18 @@ Config in mem0 is a dictionary that specifies the settings for your embedding mo
|
|||||||
|
|
||||||
## How to define configurations?
|
## How to define configurations?
|
||||||
|
|
||||||
The config is defined as a Python dictionary with two main keys:
|
The config is defined as an object (or dictionary) with two main keys:
|
||||||
- `embedder`: Specifies the embedder provider and its configuration
|
- `embedder`: Specifies the embedder provider and its configuration
|
||||||
- `provider`: The name of the embedder (e.g., "openai", "ollama")
|
- `provider`: The name of the embedder (e.g., "openai", "ollama")
|
||||||
- `config`: A nested dictionary containing provider-specific settings
|
- `config`: A nested object or dictionary containing provider-specific settings
|
||||||
|
|
||||||
|
|
||||||
## How to use configurations?
|
## How to use configurations?
|
||||||
|
|
||||||
Here's a general example of how to use the config with mem0:
|
Here's a general example of how to use the config with mem0:
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -36,6 +38,25 @@ m = Memory.from_config(config)
|
|||||||
m.add("Your text here", user_id="user", metadata={"category": "example"})
|
m.add("Your text here", user_id="user", metadata={"category": "example"})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
embedder: {
|
||||||
|
provider: 'openai',
|
||||||
|
config: {
|
||||||
|
apiKey: process.env.OPENAI_API_KEY || '',
|
||||||
|
model: 'text-embedding-3-small',
|
||||||
|
// Provider-specific settings go here
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
await memory.add("Your text here", { userId: "user", metadata: { category: "example" } });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
## Why is Config Needed?
|
## Why is Config Needed?
|
||||||
|
|
||||||
Config is essential for:
|
Config is essential for:
|
||||||
@@ -47,21 +68,31 @@ Config is essential for:
|
|||||||
|
|
||||||
Here's a comprehensive list of all parameters that can be used across different embedders:
|
Here's a comprehensive list of all parameters that can be used across different embedders:
|
||||||
|
|
||||||
| Parameter | Description |
|
<Tabs>
|
||||||
|-----------|-------------|
|
<Tab title="Python">
|
||||||
| `model` | Embedding model to use |
|
| Parameter | Description | Provider |
|
||||||
| `api_key` | API key of the provider |
|
|-----------|-------------|----------|
|
||||||
| `embedding_dims` | Dimensions of the embedding model |
|
| `model` | Embedding model to use | All |
|
||||||
| `http_client_proxies` | Allow proxy server settings |
|
| `api_key` | API key of the provider | All |
|
||||||
| `ollama_base_url` | Base URL for the Ollama embedding model |
|
| `embedding_dims` | Dimensions of the embedding model | All |
|
||||||
| `model_kwargs` | Key-Value arguments for the Huggingface embedding model |
|
| `http_client_proxies` | Allow proxy server settings | All |
|
||||||
| `azure_kwargs` | Key-Value arguments for the AzureOpenAI embedding model |
|
| `ollama_base_url` | Base URL for the Ollama embedding model | Ollama |
|
||||||
|
| `model_kwargs` | Key-Value arguments for the Huggingface embedding model | Huggingface |
|
||||||
|
| `azure_kwargs` | Key-Value arguments for the AzureOpenAI embedding model | Azure OpenAI |
|
||||||
| `openai_base_url` | Base URL for OpenAI API | OpenAI |
|
| `openai_base_url` | Base URL for OpenAI API | OpenAI |
|
||||||
| `vertex_credentials_json` | Path to the Google Cloud credentials JSON file for VertexAI | VertexAI |
|
| `vertex_credentials_json` | Path to the Google Cloud credentials JSON file for VertexAI | VertexAI |
|
||||||
| `memory_add_embedding_type` | The type of embedding to use for the add memory action | VertexAI |
|
| `memory_add_embedding_type` | The type of embedding to use for the add memory action | VertexAI |
|
||||||
| `memory_update_embedding_type` | The type of embedding to use for the update memory action | VertexAI |
|
| `memory_update_embedding_type` | The type of embedding to use for the update memory action | VertexAI |
|
||||||
| `memory_search_embedding_type` | The type of embedding to use for the search memory action | VertexAI |
|
| `memory_search_embedding_type` | The type of embedding to use for the search memory action | VertexAI |
|
||||||
|
</Tab>
|
||||||
|
<Tab title="TypeScript">
|
||||||
|
| Parameter | Description | Provider |
|
||||||
|
|-----------|-------------|----------|
|
||||||
|
| `model` | Embedding model to use | All |
|
||||||
|
| `apiKey` | API key of the provider | All |
|
||||||
|
| `embeddingDims` | Dimensions of the embedding model | All |
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
## Supported Embedding Models
|
## Supported Embedding Models
|
||||||
|
|
||||||
|
|||||||
@@ -6,7 +6,8 @@ To use OpenAI embedding models, set the `OPENAI_API_KEY` environment variable. Y
|
|||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -25,12 +26,41 @@ m = Memory.from_config(config)
|
|||||||
m.add("I'm visiting Paris", user_id="john")
|
m.add("I'm visiting Paris", user_id="john")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
embedder: {
|
||||||
|
provider: 'openai',
|
||||||
|
config: {
|
||||||
|
apiKey: 'your-openai-api-key',
|
||||||
|
model: 'text-embedding-3-large',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
await memory.add("I'm visiting Paris", { userId: "john" });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
### Config
|
### Config
|
||||||
|
|
||||||
Here are the parameters available for configuring OpenAI embedder:
|
Here are the parameters available for configuring OpenAI embedder:
|
||||||
|
|
||||||
|
<Tabs>
|
||||||
|
<Tab title="Python">
|
||||||
| Parameter | Description | Default Value |
|
| Parameter | Description | Default Value |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `model` | The name of the embedding model to use | `text-embedding-3-small` |
|
| `model` | The name of the embedding model to use | `text-embedding-3-small` |
|
||||||
| `embedding_dims` | Dimensions of the embedding model | `1536` |
|
| `embedding_dims` | Dimensions of the embedding model | `1536` |
|
||||||
| `api_key` | The OpenAI API key | `None` |
|
| `api_key` | The OpenAI API key | `None` |
|
||||||
|
</Tab>
|
||||||
|
<Tab title="TypeScript">
|
||||||
|
| Parameter | Description | Default Value |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `model` | The name of the embedding model to use | `text-embedding-3-small` |
|
||||||
|
| `embeddingDims` | Dimensions of the embedding model | `1536` |
|
||||||
|
| `apiKey` | The OpenAI API key | `None` |
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
|
|||||||
@@ -10,6 +10,10 @@ Mem0 offers support for various embedding models, allowing users to choose the o
|
|||||||
|
|
||||||
See the list of supported embedders below.
|
See the list of supported embedders below.
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
The following embedders are supported in the Python implementation. The TypeScript implementation currently only supports OpenAI.
|
||||||
|
</Note>
|
||||||
|
|
||||||
<CardGroup cols={4}>
|
<CardGroup cols={4}>
|
||||||
<Card title="OpenAI" href="/components/embedders/models/openai"></Card>
|
<Card title="OpenAI" href="/components/embedders/models/openai"></Card>
|
||||||
<Card title="Azure OpenAI" href="/components/embedders/models/azure_openai"></Card>
|
<Card title="Azure OpenAI" href="/components/embedders/models/azure_openai"></Card>
|
||||||
|
|||||||
@@ -6,26 +6,40 @@ iconType: "solid"
|
|||||||
|
|
||||||
## How to define configurations?
|
## How to define configurations?
|
||||||
|
|
||||||
The `config` is defined as a Python dictionary with two main keys:
|
<Tabs>
|
||||||
- `llm`: Specifies the llm provider and its configuration
|
<Tab title="Python">
|
||||||
- `provider`: The name of the llm (e.g., "openai", "groq")
|
The `config` is defined as a Python dictionary with two main keys:
|
||||||
- `config`: A nested dictionary containing provider-specific settings
|
- `llm`: Specifies the llm provider and its configuration
|
||||||
|
- `provider`: The name of the llm (e.g., "openai", "groq")
|
||||||
|
- `config`: A nested dictionary containing provider-specific settings
|
||||||
|
</Tab>
|
||||||
|
<Tab title="TypeScript">
|
||||||
|
The `config` is defined as a TypeScript object with these keys:
|
||||||
|
- `llm`: Specifies the LLM provider and its configuration (required)
|
||||||
|
- `provider`: The name of the LLM (e.g., "openai", "groq")
|
||||||
|
- `config`: A nested object containing provider-specific settings
|
||||||
|
- `embedder`: Specifies the embedder provider and its configuration (optional)
|
||||||
|
- `vectorStore`: Specifies the vector store provider and its configuration (optional)
|
||||||
|
- `historyDbPath`: Path to the history database file (optional)
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
### Config Values Precedence
|
### Config Values Precedence
|
||||||
|
|
||||||
Config values are applied in the following order of precedence (from highest to lowest):
|
Config values are applied in the following order of precedence (from highest to lowest):
|
||||||
|
|
||||||
1. Values explicitly set in the `config` dictionary
|
1. Values explicitly set in the `config` object/dictionary
|
||||||
2. Environment variables (e.g., `OPENAI_API_KEY`, `OPENAI_API_BASE`)
|
2. Environment variables (e.g., `OPENAI_API_KEY`, `OPENAI_API_BASE`)
|
||||||
3. Default values defined in the LLM implementation
|
3. Default values defined in the LLM implementation
|
||||||
|
|
||||||
This means that values specified in the `config` dictionary will override corresponding environment variables, which in turn override default values.
|
This means that values specified in the `config` will override corresponding environment variables, which in turn override default values.
|
||||||
|
|
||||||
## How to Use Config
|
## How to Use Config
|
||||||
|
|
||||||
Here's a general example of how to use the config with mem0:
|
Here's a general example of how to use the config with Mem0:
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -44,39 +58,70 @@ m = Memory.from_config(config)
|
|||||||
m.add("Your text here", user_id="user", metadata={"category": "example"})
|
m.add("Your text here", user_id="user", metadata={"category": "example"})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
// Minimal configuration with just the LLM settings
|
||||||
|
const config = {
|
||||||
|
llm: {
|
||||||
|
provider: 'your_chosen_provider',
|
||||||
|
config: {
|
||||||
|
// Provider-specific settings go here
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
await memory.add("Your text here", { userId: "user123", metadata: { category: "example" } });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
## Why is Config Needed?
|
## Why is Config Needed?
|
||||||
|
|
||||||
Config is essential for:
|
Config is essential for:
|
||||||
1. Specifying which llm to use.
|
1. Specifying which LLM to use.
|
||||||
2. Providing necessary connection details (e.g., model, api_key, temperature).
|
2. Providing necessary connection details (e.g., model, api_key, temperature).
|
||||||
3. Ensuring proper initialization and connection to your chosen llm.
|
3. Ensuring proper initialization and connection to your chosen LLM.
|
||||||
|
|
||||||
## Master List of All Params in Config
|
## Master List of All Params in Config
|
||||||
|
|
||||||
Here's a comprehensive list of all parameters that can be used across different llms:
|
Here's a comprehensive list of all parameters that can be used across different LLMs:
|
||||||
|
|
||||||
Here's the table based on the provided parameters:
|
<Tabs>
|
||||||
|
<Tab title="Python">
|
||||||
| Parameter | Description | Provider |
|
| Parameter | Description | Provider |
|
||||||
|----------------------|-----------------------------------------------|-------------------|
|
|----------------------|-----------------------------------------------|-------------------|
|
||||||
| `model` | Embedding model to use | All |
|
| `model` | Embedding model to use | All |
|
||||||
| `temperature` | Temperature of the model | All |
|
| `temperature` | Temperature of the model | All |
|
||||||
| `api_key` | API key to use | All |
|
| `api_key` | API key to use | All |
|
||||||
| `max_tokens` | Tokens to generate | All |
|
| `max_tokens` | Tokens to generate | All |
|
||||||
| `top_p` | Probability threshold for nucleus sampling | All |
|
| `top_p` | Probability threshold for nucleus sampling | All |
|
||||||
| `top_k` | Number of highest probability tokens to keep | All |
|
| `top_k` | Number of highest probability tokens to keep | All |
|
||||||
| `http_client_proxies`| Allow proxy server settings | AzureOpenAI |
|
| `http_client_proxies`| Allow proxy server settings | AzureOpenAI |
|
||||||
| `models` | List of models | Openrouter |
|
| `models` | List of models | Openrouter |
|
||||||
| `route` | Routing strategy | Openrouter |
|
| `route` | Routing strategy | Openrouter |
|
||||||
| `openrouter_base_url`| Base URL for Openrouter API | Openrouter |
|
| `openrouter_base_url`| Base URL for Openrouter API | Openrouter |
|
||||||
| `site_url` | Site URL | Openrouter |
|
| `site_url` | Site URL | Openrouter |
|
||||||
| `app_name` | Application name | Openrouter |
|
| `app_name` | Application name | Openrouter |
|
||||||
| `ollama_base_url` | Base URL for Ollama API | Ollama |
|
| `ollama_base_url` | Base URL for Ollama API | Ollama |
|
||||||
| `openai_base_url` | Base URL for OpenAI API | OpenAI |
|
| `openai_base_url` | Base URL for OpenAI API | OpenAI |
|
||||||
| `azure_kwargs` | Azure LLM args for initialization | AzureOpenAI |
|
| `azure_kwargs` | Azure LLM args for initialization | AzureOpenAI |
|
||||||
| `deepseek_base_url` | Base URL for DeepSeek API | DeepSeek |
|
| `deepseek_base_url` | Base URL for DeepSeek API | DeepSeek |
|
||||||
| `xai_base_url` | Base URL for XAI API | XAI |
|
| `xai_base_url` | Base URL for XAI API | XAI |
|
||||||
|
</Tab>
|
||||||
|
<Tab title="TypeScript">
|
||||||
|
| Parameter | Description | Provider |
|
||||||
|
|----------------------|-----------------------------------------------|-------------------|
|
||||||
|
| `model` | Embedding model to use | All |
|
||||||
|
| `temperature` | Temperature of the model | All |
|
||||||
|
| `apiKey` | API key to use | All |
|
||||||
|
| `maxTokens` | Tokens to generate | All |
|
||||||
|
| `topP` | Probability threshold for nucleus sampling | All |
|
||||||
|
| `topK` | Number of highest probability tokens to keep | All |
|
||||||
|
| `openaiBaseUrl` | Base URL for OpenAI API | OpenAI |
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
## Supported LLMs
|
## Supported LLMs
|
||||||
|
|
||||||
For detailed information on configuring specific llms, please visit the [LLMs](./models) section. There you'll find information for each supported llm with provider-specific usage examples and configuration details.
|
For detailed information on configuring specific LLMs, please visit the [LLMs](./models) section. There you'll find information for each supported LLM with provider-specific usage examples and configuration details.
|
||||||
|
|||||||
@@ -1,8 +1,13 @@
|
|||||||
|
---
|
||||||
|
title: Anthropic
|
||||||
|
---
|
||||||
|
|
||||||
To use anthropic's models, please set the `ANTHROPIC_API_KEY` which you find on their [Account Settings Page](https://console.anthropic.com/account/keys).
|
To use anthropic's models, please set the `ANTHROPIC_API_KEY` which you find on their [Account Settings Page](https://console.anthropic.com/account/keys).
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -24,6 +29,26 @@ m = Memory.from_config(config)
|
|||||||
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
llm: {
|
||||||
|
provider: 'anthropic',
|
||||||
|
config: {
|
||||||
|
apiKey: process.env.ANTHROPIC_API_KEY || '',
|
||||||
|
model: 'claude-3-7-sonnet-latest',
|
||||||
|
temperature: 0.1,
|
||||||
|
maxTokens: 2000,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
## Config
|
## Config
|
||||||
|
|
||||||
All available parameters for the `anthropic` config are present in [Master List of All Params in Config](../config).
|
All available parameters for the `anthropic` config are present in [Master List of All Params in Config](../config).
|
||||||
@@ -1,10 +1,15 @@
|
|||||||
|
---
|
||||||
|
title: Groq
|
||||||
|
---
|
||||||
|
|
||||||
[Groq](https://groq.com/) is the creator of the world's first Language Processing Unit (LPU), providing exceptional speed performance for AI workloads running on their LPU Inference Engine.
|
[Groq](https://groq.com/) is the creator of the world's first Language Processing Unit (LPU), providing exceptional speed performance for AI workloads running on their LPU Inference Engine.
|
||||||
|
|
||||||
In order to use LLMs from Groq, go to their [platform](https://console.groq.com/keys) and get the API key. Set the API key as `GROQ_API_KEY` environment variable to use the model as given below in the example.
|
In order to use LLMs from Groq, go to their [platform](https://console.groq.com/keys) and get the API key. Set the API key as `GROQ_API_KEY` environment variable to use the model as given below in the example.
|
||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -26,6 +31,26 @@ m = Memory.from_config(config)
|
|||||||
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
llm: {
|
||||||
|
provider: 'groq',
|
||||||
|
config: {
|
||||||
|
apiKey: process.env.GROQ_API_KEY || '',
|
||||||
|
model: 'mixtral-8x7b-32768',
|
||||||
|
temperature: 0.1,
|
||||||
|
maxTokens: 1000,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
## Config
|
## Config
|
||||||
|
|
||||||
All available parameters for the `groq` config are present in [Master List of All Params in Config](../config).
|
All available parameters for the `groq` config are present in [Master List of All Params in Config](../config).
|
||||||
@@ -6,7 +6,8 @@ To use OpenAI LLM models, you have to set the `OPENAI_API_KEY` environment varia
|
|||||||
|
|
||||||
## Usage
|
## Usage
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -38,6 +39,26 @@ m = Memory.from_config(config)
|
|||||||
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
llm: {
|
||||||
|
provider: 'openai',
|
||||||
|
config: {
|
||||||
|
apiKey: process.env.OPENAI_API_KEY || '',
|
||||||
|
model: 'gpt-4-turbo-preview',
|
||||||
|
temperature: 0.2,
|
||||||
|
maxTokens: 1500,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
We also support the new [OpenAI structured-outputs](https://platform.openai.com/docs/guides/structured-outputs/introduction) model.
|
We also support the new [OpenAI structured-outputs](https://platform.openai.com/docs/guides/structured-outputs/introduction) model.
|
||||||
|
|
||||||
```python
|
```python
|
||||||
@@ -59,7 +80,9 @@ config = {
|
|||||||
m = Memory.from_config(config)
|
m = Memory.from_config(config)
|
||||||
```
|
```
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
OpenAI structured-outputs is currently only available in the Python implementation.
|
||||||
|
</Note>
|
||||||
|
|
||||||
## Config
|
## Config
|
||||||
|
|
||||||
|
|||||||
@@ -14,20 +14,24 @@ For a comprehensive list of available parameters for llm configuration, please r
|
|||||||
|
|
||||||
To view all supported llms, visit the [Supported LLMs](./models).
|
To view all supported llms, visit the [Supported LLMs](./models).
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
All LLMs are supported in Python. The following LLMs are also supported in TypeScript: **OpenAI**, **Anthropic**, and **Groq**.
|
||||||
|
</Note>
|
||||||
|
|
||||||
<CardGroup cols={4}>
|
<CardGroup cols={4}>
|
||||||
<Card title="OpenAI" href="/components/llms/models/openai"></Card>
|
<Card title="OpenAI" href="/components/llms/models/openai" />
|
||||||
<Card title="Ollama" href="/components/llms/models/ollama"></Card>
|
<Card title="Ollama" href="/components/llms/models/ollama" />
|
||||||
<Card title="Azure OpenAI" href="/components/llms/models/azure_openai"></Card>
|
<Card title="Azure OpenAI" href="/components/llms/models/azure_openai" />
|
||||||
<Card title="Anthropic" href="/components/llms/models/anthropic"></Card>
|
<Card title="Anthropic" href="/components/llms/models/anthropic" />
|
||||||
<Card title="Together" href="/components/llms/models/together"></Card>
|
<Card title="Together" href="/components/llms/models/together" />
|
||||||
<Card title="Groq" href="/components/llms/models/groq"></Card>
|
<Card title="Groq" href="/components/llms/models/groq" />
|
||||||
<Card title="Litellm" href="/components/llms/models/litellm"></Card>
|
<Card title="Litellm" href="/components/llms/models/litellm" />
|
||||||
<Card title="Mistral AI" href="/components/llms/models/mistral_ai"></Card>
|
<Card title="Mistral AI" href="/components/llms/models/mistral_ai" />
|
||||||
<Card title="Google AI" href="/components/llms/models/google_ai"></Card>
|
<Card title="Google AI" href="/components/llms/models/google_ai" />
|
||||||
<Card title="AWS bedrock" href="/components/llms/models/aws_bedrock"></Card>
|
<Card title="AWS bedrock" href="/components/llms/models/aws_bedrock" />
|
||||||
<Card title="Gemini" href="/components/llms/models/gemini"></Card>
|
<Card title="Gemini" href="/components/llms/models/gemini" />
|
||||||
<Card title="DeepSeek" href="/components/llms/models/deepseek"></Card>
|
<Card title="DeepSeek" href="/components/llms/models/deepseek" />
|
||||||
<Card title="xAI" href="/components/llms/models/xAI"></Card>
|
<Card title="xAI" href="/components/llms/models/xAI" />
|
||||||
</CardGroup>
|
</CardGroup>
|
||||||
|
|
||||||
## Structured vs Unstructured Outputs
|
## Structured vs Unstructured Outputs
|
||||||
|
|||||||
@@ -6,16 +6,17 @@ iconType: "solid"
|
|||||||
|
|
||||||
## How to define configurations?
|
## How to define configurations?
|
||||||
|
|
||||||
The `config` is defined as a Python dictionary with two main keys:
|
The `config` is defined as an object with two main keys:
|
||||||
- `vector_store`: Specifies the vector database provider and its configuration
|
- `vector_store`: Specifies the vector database provider and its configuration
|
||||||
- `provider`: The name of the vector database (e.g., "chroma", "pgvector", "qdrant", "milvus","azure_ai_search")
|
- `provider`: The name of the vector database (e.g., "chroma", "pgvector", "qdrant", "milvus", "azure_ai_search")
|
||||||
- `config`: A nested dictionary containing provider-specific settings
|
- `config`: A nested object containing provider-specific settings
|
||||||
|
|
||||||
## How to Use Config
|
## How to Use Config
|
||||||
|
|
||||||
Here's a general example of how to use the config with mem0:
|
Here's a general example of how to use the config with mem0:
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -34,6 +35,29 @@ m = Memory.from_config(config)
|
|||||||
m.add("Your text here", user_id="user", metadata={"category": "example"})
|
m.add("Your text here", user_id="user", metadata={"category": "example"})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
// Example for in-memory vector database (Only supported in TypeScript)
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const configMemory = {
|
||||||
|
vector_store: {
|
||||||
|
provider: 'memory',
|
||||||
|
config: {
|
||||||
|
collectionName: 'memories',
|
||||||
|
dimension: 1536,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(configMemory);
|
||||||
|
await memory.add("Your text here", { userId: "user", metadata: { category: "example" } });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
The in-memory vector database is only supported in the TypeScript implementation.
|
||||||
|
</Note>
|
||||||
|
|
||||||
## Why is Config Needed?
|
## Why is Config Needed?
|
||||||
|
|
||||||
Config is essential for:
|
Config is essential for:
|
||||||
@@ -46,6 +70,8 @@ Config is essential for:
|
|||||||
|
|
||||||
Here's a comprehensive list of all parameters that can be used across different vector databases:
|
Here's a comprehensive list of all parameters that can be used across different vector databases:
|
||||||
|
|
||||||
|
<Tabs>
|
||||||
|
<Tab title="Python">
|
||||||
| Parameter | Description |
|
| Parameter | Description |
|
||||||
|-----------|-------------|
|
|-----------|-------------|
|
||||||
| `collection_name` | Name of the collection |
|
| `collection_name` | Name of the collection |
|
||||||
@@ -60,6 +86,24 @@ Here's a comprehensive list of all parameters that can be used across different
|
|||||||
| `url` | Full URL for the server |
|
| `url` | Full URL for the server |
|
||||||
| `api_key` | API key for the server |
|
| `api_key` | API key for the server |
|
||||||
| `on_disk` | Enable persistent storage |
|
| `on_disk` | Enable persistent storage |
|
||||||
|
</Tab>
|
||||||
|
<Tab title="TypeScript">
|
||||||
|
| Parameter | Description |
|
||||||
|
|-----------|-------------|
|
||||||
|
| `collectionName` | Name of the collection |
|
||||||
|
| `embeddingModelDims` | Dimensions of the embedding model |
|
||||||
|
| `dimension` | Dimensions of the embedding model (for memory provider) |
|
||||||
|
| `host` | Host where the server is running |
|
||||||
|
| `port` | Port where the server is running |
|
||||||
|
| `url` | URL for the server |
|
||||||
|
| `apiKey` | API key for the server |
|
||||||
|
| `path` | Path for the database |
|
||||||
|
| `onDisk` | Enable persistent storage |
|
||||||
|
| `redisUrl` | URL for the Redis server |
|
||||||
|
| `username` | Username for database connection |
|
||||||
|
| `password` | Password for database connection |
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
|
|
||||||
## Customizing Config
|
## Customizing Config
|
||||||
|
|
||||||
|
|||||||
@@ -2,7 +2,8 @@
|
|||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -23,10 +24,32 @@ m = Memory.from_config(config)
|
|||||||
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
vectorStore: {
|
||||||
|
provider: 'qdrant',
|
||||||
|
config: {
|
||||||
|
collectionName: 'memories',
|
||||||
|
embeddingModelDims: 1536,
|
||||||
|
host: 'localhost',
|
||||||
|
port: 6333,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
### Config
|
### Config
|
||||||
|
|
||||||
Let's see the available parameters for the `qdrant` config:
|
Let's see the available parameters for the `qdrant` config:
|
||||||
|
|
||||||
|
<Tabs>
|
||||||
|
<Tab title="Python">
|
||||||
| Parameter | Description | Default Value |
|
| Parameter | Description | Default Value |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `collection_name` | The name of the collection to store the vectors | `mem0` |
|
| `collection_name` | The name of the collection to store the vectors | `mem0` |
|
||||||
@@ -37,4 +60,18 @@ Let's see the available parameters for the `qdrant` config:
|
|||||||
| `path` | Path for the qdrant database | `/tmp/qdrant` |
|
| `path` | Path for the qdrant database | `/tmp/qdrant` |
|
||||||
| `url` | Full URL for the qdrant server | `None` |
|
| `url` | Full URL for the qdrant server | `None` |
|
||||||
| `api_key` | API key for the qdrant server | `None` |
|
| `api_key` | API key for the qdrant server | `None` |
|
||||||
| `on_disk` | For enabling persistent storage | `False` |
|
| `on_disk` | For enabling persistent storage | `False` |
|
||||||
|
</Tab>
|
||||||
|
<Tab title="TypeScript">
|
||||||
|
| Parameter | Description | Default Value |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `collectionName` | The name of the collection to store the vectors | `mem0` |
|
||||||
|
| `embeddingModelDims` | Dimensions of the embedding model | `1536` |
|
||||||
|
| `host` | The host where the Qdrant server is running | `None` |
|
||||||
|
| `port` | The port where the Qdrant server is running | `None` |
|
||||||
|
| `path` | Path for the Qdrant database | `/tmp/qdrant` |
|
||||||
|
| `url` | Full URL for the Qdrant server | `None` |
|
||||||
|
| `apiKey` | API key for the Qdrant server | `None` |
|
||||||
|
| `onDisk` | For enabling persistent storage | `False` |
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
@@ -12,7 +12,8 @@ docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:lat
|
|||||||
|
|
||||||
### Usage
|
### Usage
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
import os
|
import os
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
@@ -34,12 +35,46 @@ m = Memory.from_config(config)
|
|||||||
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
m.add("Likes to play cricket on weekends", user_id="alice", metadata={"category": "hobbies"})
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
vectorStore: {
|
||||||
|
provider: 'redis',
|
||||||
|
config: {
|
||||||
|
collectionName: 'memories',
|
||||||
|
embeddingModelDims: 1536,
|
||||||
|
redisUrl: 'redis://localhost:6379',
|
||||||
|
username: 'your-redis-username',
|
||||||
|
password: 'your-redis-password',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
### Config
|
### Config
|
||||||
|
|
||||||
Let's see the available parameters for the `redis` config:
|
Let's see the available parameters for the `redis` config:
|
||||||
|
|
||||||
|
<Tabs>
|
||||||
|
<Tab title="Python">
|
||||||
| Parameter | Description | Default Value |
|
| Parameter | Description | Default Value |
|
||||||
| --- | --- | --- |
|
| --- | --- | --- |
|
||||||
| `collection_name` | The name of the collection to store the vectors | `mem0` |
|
| `collection_name` | The name of the collection to store the vectors | `mem0` |
|
||||||
| `embedding_model_dims` | Dimensions of the embedding model | `1536` |
|
| `embedding_model_dims` | Dimensions of the embedding model | `1536` |
|
||||||
| `redis_url` | The URL of the Redis server | `None` |
|
| `redis_url` | The URL of the Redis server | `None` |
|
||||||
|
</Tab>
|
||||||
|
<Tab title="TypeScript">
|
||||||
|
| Parameter | Description | Default Value |
|
||||||
|
| --- | --- | --- |
|
||||||
|
| `collectionName` | The name of the collection to store the vectors | `mem0` |
|
||||||
|
| `embeddingModelDims` | Dimensions of the embedding model | `1536` |
|
||||||
|
| `redisUrl` | The URL of the Redis server | `None` |
|
||||||
|
| `username` | Username for Redis connection | `None` |
|
||||||
|
| `password` | Password for Redis connection | `None` |
|
||||||
|
</Tab>
|
||||||
|
</Tabs>
|
||||||
@@ -10,6 +10,10 @@ Mem0 includes built-in support for various popular databases. Memory can utilize
|
|||||||
|
|
||||||
See the list of supported vector databases below.
|
See the list of supported vector databases below.
|
||||||
|
|
||||||
|
<Note>
|
||||||
|
The following vector databases are supported in the Python implementation. The TypeScript implementation currently only supports Qdrant, Redis and in-memory vector database.
|
||||||
|
</Note>
|
||||||
|
|
||||||
<CardGroup cols={3}>
|
<CardGroup cols={3}>
|
||||||
<Card title="Qdrant" href="/components/vectordbs/dbs/qdrant"></Card>
|
<Card title="Qdrant" href="/components/vectordbs/dbs/qdrant"></Card>
|
||||||
<Card title="Chroma" href="/components/vectordbs/dbs/chroma"></Card>
|
<Card title="Chroma" href="/components/vectordbs/dbs/chroma"></Card>
|
||||||
|
|||||||
+1
-61
@@ -65,6 +65,7 @@
|
|||||||
"pages": [
|
"pages": [
|
||||||
"open-source/quickstart",
|
"open-source/quickstart",
|
||||||
"open-source/python-quickstart",
|
"open-source/python-quickstart",
|
||||||
|
"open-source-typescript/quickstart",
|
||||||
{
|
{
|
||||||
"group": "Features",
|
"group": "Features",
|
||||||
"icon": "wrench",
|
"icon": "wrench",
|
||||||
@@ -151,67 +152,6 @@
|
|||||||
]
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Node.js",
|
|
||||||
"icon": "js",
|
|
||||||
"pages": [
|
|
||||||
"open-source-typescript/quickstart",
|
|
||||||
{
|
|
||||||
"group": "Features",
|
|
||||||
"icon": "wrench",
|
|
||||||
"pages": [
|
|
||||||
"open-source-typescript/features/custom-prompts"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "LLMs",
|
|
||||||
"icon": "brain",
|
|
||||||
"pages": [
|
|
||||||
"open-source-typescript/components/llms/overview",
|
|
||||||
"open-source-typescript/components/llms/config",
|
|
||||||
{
|
|
||||||
"group": "Supported LLMs",
|
|
||||||
"icon": "list",
|
|
||||||
"pages": [
|
|
||||||
"open-source-typescript/components/llms/models/openai",
|
|
||||||
"open-source-typescript/components/llms/models/anthropic",
|
|
||||||
"open-source-typescript/components/llms/models/groq"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},{
|
|
||||||
"group": "Vector Databases",
|
|
||||||
"icon": "database",
|
|
||||||
"pages": [
|
|
||||||
"open-source-typescript/components/vectordbs/overview",
|
|
||||||
"open-source-typescript/components/vectordbs/config",
|
|
||||||
{
|
|
||||||
"group": "Supported Vector Databases",
|
|
||||||
"icon": "server",
|
|
||||||
"pages": [
|
|
||||||
"open-source-typescript/components/vectordbs/dbs/qdrant",
|
|
||||||
"open-source-typescript/components/vectordbs/dbs/redis"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"group": "Embedding Models",
|
|
||||||
"icon": "layer-group",
|
|
||||||
"pages": [
|
|
||||||
"open-source-typescript/components/embedders/overview",
|
|
||||||
"open-source-typescript/components/embedders/config",
|
|
||||||
{
|
|
||||||
"group": "Supported Embedding Models",
|
|
||||||
"icon": "list",
|
|
||||||
"pages": [
|
|
||||||
"open-source-typescript/components/embedders/models/openai"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -29,7 +29,7 @@ const openaiClient = new OpenAI();
|
|||||||
const memory = new Memory();
|
const memory = new Memory();
|
||||||
|
|
||||||
async function chatWithMemories(message, userId = "default_user") {
|
async function chatWithMemories(message, userId = "default_user") {
|
||||||
const relevantMemories = await memory.search(message, userId);
|
const relevantMemories = await memory.search(message, { userId: userId });
|
||||||
|
|
||||||
const memoriesStr = relevantMemories.results
|
const memoriesStr = relevantMemories.results
|
||||||
.map(entry => `- ${entry.memory}`)
|
.map(entry => `- ${entry.memory}`)
|
||||||
@@ -52,7 +52,7 @@ ${memoriesStr}`;
|
|||||||
const assistantResponse = response.choices[0].message.content || "";
|
const assistantResponse = response.choices[0].message.content || "";
|
||||||
|
|
||||||
messages.push({ role: "assistant", content: assistantResponse });
|
messages.push({ role: "assistant", content: assistantResponse });
|
||||||
await memory.add(messages, userId);
|
await memory.add(messages, { userId: userId });
|
||||||
|
|
||||||
return assistantResponse;
|
return assistantResponse;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,7 +17,8 @@ To create an effective custom prompt:
|
|||||||
|
|
||||||
Example of a custom prompt:
|
Example of a custom prompt:
|
||||||
|
|
||||||
```python
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
custom_prompt = """
|
custom_prompt = """
|
||||||
Please only extract entities containing customer support information, order details, and user information.
|
Please only extract entities containing customer support information, order details, and user information.
|
||||||
Here are some few shot examples:
|
Here are some few shot examples:
|
||||||
@@ -39,12 +40,37 @@ Output: {{"facts" : ["Ordered red shirt, size medium", "Received blue shirt inst
|
|||||||
|
|
||||||
Return the facts and customer information in a json format as shown above.
|
Return the facts and customer information in a json format as shown above.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Here we initialize the custom prompt in the config.
|
```typescript TypeScript
|
||||||
|
const customPrompt = `
|
||||||
|
Please only extract entities containing customer support information, order details, and user information.
|
||||||
|
Here are some few shot examples:
|
||||||
|
|
||||||
```python
|
Input: Hi.
|
||||||
|
Output: {"facts" : []}
|
||||||
|
|
||||||
|
Input: The weather is nice today.
|
||||||
|
Output: {"facts" : []}
|
||||||
|
|
||||||
|
Input: My order #12345 hasn't arrived yet.
|
||||||
|
Output: {"facts" : ["Order #12345 not received"]}
|
||||||
|
|
||||||
|
Input: I am John Doe, and I would like to return the shoes I bought last week.
|
||||||
|
Output: {"facts" : ["Customer name: John Doe", "Wants to return shoes", "Purchase made last week"]}
|
||||||
|
|
||||||
|
Input: I ordered a red shirt, size medium, but received a blue one instead.
|
||||||
|
Output: {"facts" : ["Ordered red shirt, size medium", "Received blue shirt instead"]}
|
||||||
|
|
||||||
|
Return the facts and customer information in a json format as shown above.
|
||||||
|
`;
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
|
Here we initialize the custom prompt in the config:
|
||||||
|
|
||||||
|
<CodeGroup>
|
||||||
|
```python Python
|
||||||
from mem0 import Memory
|
from mem0 import Memory
|
||||||
|
|
||||||
config = {
|
config = {
|
||||||
@@ -63,15 +89,40 @@ config = {
|
|||||||
m = Memory.from_config(config_dict=config, user_id="alice")
|
m = Memory.from_config(config_dict=config, user_id="alice")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
import { Memory } from 'mem0ai/oss';
|
||||||
|
|
||||||
|
const config = {
|
||||||
|
version: 'v1.1',
|
||||||
|
llm: {
|
||||||
|
provider: 'openai',
|
||||||
|
config: {
|
||||||
|
apiKey: process.env.OPENAI_API_KEY || '',
|
||||||
|
model: 'gpt-4-turbo-preview',
|
||||||
|
temperature: 0.2,
|
||||||
|
maxTokens: 1500,
|
||||||
|
},
|
||||||
|
},
|
||||||
|
customPrompt: customPrompt
|
||||||
|
};
|
||||||
|
|
||||||
|
const memory = new Memory(config);
|
||||||
|
```
|
||||||
|
</CodeGroup>
|
||||||
|
|
||||||
### Example 1
|
### Example 1
|
||||||
|
|
||||||
In this example, we are adding a memory of a user ordering a laptop. As seen in the output, the custom prompt is used to extract the relevant information from the user's message.
|
In this example, we are adding a memory of a user ordering a laptop. As seen in the output, the custom prompt is used to extract the relevant information from the user's message.
|
||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```python Code
|
```python Python
|
||||||
m.add("Yesterday, I ordered a laptop, the order id is 12345", user_id="alice")
|
m.add("Yesterday, I ordered a laptop, the order id is 12345", user_id="alice")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
await memory.add('Yesterday, I ordered a laptop, the order id is 12345', { userId: "user123" });
|
||||||
|
```
|
||||||
|
|
||||||
```json Output
|
```json Output
|
||||||
{
|
{
|
||||||
"results": [
|
"results": [
|
||||||
@@ -97,11 +148,16 @@ m.add("Yesterday, I ordered a laptop, the order id is 12345", user_id="alice")
|
|||||||
|
|
||||||
In this example, we are adding a memory of a user liking to go on hikes. This add message is not specific to the use-case mentioned in the custom prompt.
|
In this example, we are adding a memory of a user liking to go on hikes. This add message is not specific to the use-case mentioned in the custom prompt.
|
||||||
Hence, the memory is not added.
|
Hence, the memory is not added.
|
||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```python Code
|
```python Python
|
||||||
m.add("I like going to hikes", user_id="alice")
|
m.add("I like going to hikes", user_id="alice")
|
||||||
```
|
```
|
||||||
|
|
||||||
|
```typescript TypeScript
|
||||||
|
await memory.add('I like going to hikes', { userId: "user123" });
|
||||||
|
```
|
||||||
|
|
||||||
```json Output
|
```json Output
|
||||||
{
|
{
|
||||||
"results": [],
|
"results": [],
|
||||||
@@ -109,3 +165,5 @@ m.add("I like going to hikes", user_id="alice")
|
|||||||
}
|
}
|
||||||
```
|
```
|
||||||
</CodeGroup>
|
</CodeGroup>
|
||||||
|
|
||||||
|
The custom prompt will process both the user and assistant messages to extract relevant information according to the defined format.
|
||||||
|
|||||||
@@ -1,56 +0,0 @@
|
|||||||
---
|
|
||||||
title: Configurations
|
|
||||||
icon: "gear"
|
|
||||||
iconType: "solid"
|
|
||||||
---
|
|
||||||
|
|
||||||
Config in Mem0 is a dictionary that specifies the settings for your embedding models. It allows you to customize the behavior and connection details of your chosen embedder.
|
|
||||||
|
|
||||||
## How to define configurations?
|
|
||||||
|
|
||||||
The config is defined as a TypeScript object with two main keys:
|
|
||||||
- `embedder`: Specifies the embedder provider and its configuration
|
|
||||||
- `provider`: The name of the embedder (e.g., "openai", "ollama")
|
|
||||||
- `config`: A nested object containing provider-specific settings
|
|
||||||
|
|
||||||
## How to use configurations?
|
|
||||||
|
|
||||||
Here's a general example of how to use the config with Mem0:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
embedder: {
|
|
||||||
provider: 'openai',
|
|
||||||
config: {
|
|
||||||
apiKey: 'your-openai-api-key',
|
|
||||||
model: 'text-embedding-3-small',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
await memory.add("Your text here", { userId: "user", metadata: { category: "example" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
## Why is Config Needed?
|
|
||||||
|
|
||||||
Config is essential for:
|
|
||||||
1. Specifying which embedding model to use.
|
|
||||||
2. Providing necessary connection details (e.g., model, api_key, embedding_dims).
|
|
||||||
3. Ensuring proper initialization and connection to your chosen embedder.
|
|
||||||
|
|
||||||
## Master List of All Params in Config
|
|
||||||
|
|
||||||
Here's a comprehensive list of all parameters that can be used across different embedders:
|
|
||||||
|
|
||||||
| Parameter | Description |
|
|
||||||
|------------------------|--------------------------------------------------|
|
|
||||||
| `model` | Embedding model to use |
|
|
||||||
| `apiKey` | API key of the provider |
|
|
||||||
| `embeddingDims` | Dimensions of the embedding model |
|
|
||||||
|
|
||||||
## Supported Embedding Models
|
|
||||||
|
|
||||||
For detailed information on configuring specific embedders, please visit the [Embedding Models](./models) section. There you'll find information for each supported embedder with provider-specific usage examples and configuration details.
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
---
|
|
||||||
title: OpenAI
|
|
||||||
---
|
|
||||||
|
|
||||||
To use OpenAI embedding models, you need to provide the API key directly in your configuration. You can obtain the OpenAI API key from the [OpenAI Platform](https://platform.openai.com/account/api-keys).
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
Here's how to configure OpenAI embedding models in your application:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
embedder: {
|
|
||||||
provider: 'openai',
|
|
||||||
config: {
|
|
||||||
apiKey: 'your-openai-api-key',
|
|
||||||
model: 'text-embedding-3-large',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
await memory.add("I'm visiting Paris", { userId: "john" });
|
|
||||||
```
|
|
||||||
|
|
||||||
### Config
|
|
||||||
|
|
||||||
Here are the parameters available for configuring the OpenAI embedder:
|
|
||||||
|
|
||||||
| Parameter | Description | Default Value |
|
|
||||||
|------------------------|--------------------------------------------------|---------------|
|
|
||||||
| `model` | The name of the embedding model to use | `text-embedding-3-small` |
|
|
||||||
| `embedding_dims` | Dimensions of the embedding model | `1536` |
|
|
||||||
| `api_key` | The OpenAI API key | `None` |
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
---
|
|
||||||
title: Overview
|
|
||||||
icon: "info"
|
|
||||||
iconType: "solid"
|
|
||||||
---
|
|
||||||
|
|
||||||
Mem0 offers support for various embedding models, allowing users to choose the one that best suits their needs.
|
|
||||||
|
|
||||||
## Supported Embedders
|
|
||||||
|
|
||||||
See the list of supported embedders below.
|
|
||||||
|
|
||||||
<CardGroup cols={1}>
|
|
||||||
<Card title="OpenAI" href="/components/embedders/models/openai"></Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
To utilize a embedder, you must provide a configuration to customize its usage. If no configuration is supplied, a default configuration will be applied, and `OpenAI` will be used as the embedder.
|
|
||||||
|
|
||||||
For a comprehensive list of available parameters for embedder configuration, please refer to [Config](./config).
|
|
||||||
@@ -1,85 +0,0 @@
|
|||||||
---
|
|
||||||
title: Configurations
|
|
||||||
icon: "gear"
|
|
||||||
iconType: "solid"
|
|
||||||
---
|
|
||||||
|
|
||||||
## How to define configurations?
|
|
||||||
|
|
||||||
The `config` is defined as a TypeScript object with two main keys:
|
|
||||||
- `llm`: Specifies the LLM provider and its configuration
|
|
||||||
- `provider`: The name of the LLM (e.g., "openai", "groq")
|
|
||||||
- `config`: A nested object containing provider-specific settings
|
|
||||||
|
|
||||||
### Config Values Precedence
|
|
||||||
|
|
||||||
Config values are applied in the following order of precedence (from highest to lowest):
|
|
||||||
|
|
||||||
1. Values explicitly set in the `config` object
|
|
||||||
2. Environment variables (e.g., `OPENAI_API_KEY`, `OPENAI_API_BASE`)
|
|
||||||
3. Default values defined in the LLM implementation
|
|
||||||
|
|
||||||
This means that values specified in the `config` object will override corresponding environment variables, which in turn override default values.
|
|
||||||
|
|
||||||
## How to Use Config
|
|
||||||
|
|
||||||
Here's a general example of how to use the config with Mem0:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
llm: {
|
|
||||||
provider: 'openai',
|
|
||||||
config: {
|
|
||||||
apiKey: process.env.OPENAI_API_KEY || '',
|
|
||||||
model: 'gpt-4-turbo-preview',
|
|
||||||
temperature: 0.2,
|
|
||||||
maxTokens: 1500,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
embedder: {
|
|
||||||
provider: 'openai',
|
|
||||||
config: {
|
|
||||||
apiKey: process.env.OPENAI_API_KEY || '',
|
|
||||||
model: 'text-embedding-3-small',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
vectorStore: {
|
|
||||||
provider: 'memory',
|
|
||||||
config: {
|
|
||||||
collectionName: 'memories',
|
|
||||||
dimension: 1536,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
historyDbPath: 'memory.db',
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
memory.add("Your text here", { userId: "user123", metadata: { category: "example" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
## Why is Config Needed?
|
|
||||||
|
|
||||||
Config is essential for:
|
|
||||||
1. Specifying which LLM to use.
|
|
||||||
2. Providing necessary connection details (e.g., model, api_key, temperature).
|
|
||||||
3. Ensuring proper initialization and connection to your chosen LLM.
|
|
||||||
|
|
||||||
## Master List of All Params in Config
|
|
||||||
|
|
||||||
Here's a comprehensive list of all parameters that can be used across different LLMs:
|
|
||||||
|
|
||||||
| Parameter | Description | Provider |
|
|
||||||
|----------------------|-----------------------------------------------|-------------------|
|
|
||||||
| `model` | Embedding model to use | All |
|
|
||||||
| `temperature` | Temperature of the model | All |
|
|
||||||
| `apiKey` | API key to use | All |
|
|
||||||
| `maxTokens` | Tokens to generate | All |
|
|
||||||
| `topP` | Probability threshold for nucleus sampling | All |
|
|
||||||
| `topK` | Number of highest probability tokens to keep | All |
|
|
||||||
| `openaiBaseUrl` | Base URL for OpenAI API | OpenAI |
|
|
||||||
|
|
||||||
## Supported LLMs
|
|
||||||
|
|
||||||
For detailed information on configuring specific LLMs, please visit the [LLMs](./models) section. There you'll find information for each supported LLM with provider-specific usage examples and configuration details.
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
title: Anthropic
|
|
||||||
---
|
|
||||||
|
|
||||||
To use Anthropic's models, please set the `ANTHROPIC_API_KEY`, which you can find on their [Account Settings Page](https://console.anthropic.com/account/keys).
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
llm: {
|
|
||||||
provider: 'anthropic',
|
|
||||||
config: {
|
|
||||||
apiKey: process.env.ANTHROPIC_API_KEY || '',
|
|
||||||
model: 'claude-3-7-sonnet-latest',
|
|
||||||
temperature: 0.1,
|
|
||||||
maxTokens: 2000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
## Config
|
|
||||||
|
|
||||||
All available parameters for the `anthropic` config are present in the [Master List of All Params in Config](../config).
|
|
||||||
@@ -1,32 +0,0 @@
|
|||||||
---
|
|
||||||
title: Groq
|
|
||||||
---
|
|
||||||
|
|
||||||
[Groq](https://groq.com/) is the creator of the world's first Language Processing Unit (LPU), providing exceptional speed performance for AI workloads running on their LPU Inference Engine.
|
|
||||||
|
|
||||||
In order to use LLMs from Groq, go to their [platform](https://console.groq.com/keys) and get the API key. Set the API key as `GROQ_API_KEY` environment variable to use the model as given below in the example.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
llm: {
|
|
||||||
provider: 'groq',
|
|
||||||
config: {
|
|
||||||
apiKey: process.env.GROQ_API_KEY || '',
|
|
||||||
model: 'mixtral-8x7b-32768',
|
|
||||||
temperature: 0.1,
|
|
||||||
maxTokens: 1000,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
## Config
|
|
||||||
|
|
||||||
All available parameters for the `groq` config are present in the [Master List of All Params in Config](../config).
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
---
|
|
||||||
title: OpenAI
|
|
||||||
---
|
|
||||||
|
|
||||||
To use OpenAI LLM models, you need to set the `OPENAI_API_KEY` environment variable. You can obtain the OpenAI API key from the [OpenAI Platform](https://platform.openai.com/account/api-keys).
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
llm: {
|
|
||||||
provider: 'openai',
|
|
||||||
config: {
|
|
||||||
apiKey: process.env.OPENAI_API_KEY || '',
|
|
||||||
model: 'gpt-4-turbo-preview',
|
|
||||||
temperature: 0.2,
|
|
||||||
maxTokens: 1500,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
## Config
|
|
||||||
|
|
||||||
All available parameters for the `openai` config are present in the [Master List of All Params in Config](../config).
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
---
|
|
||||||
title: Overview
|
|
||||||
icon: "info"
|
|
||||||
iconType: "solid"
|
|
||||||
---
|
|
||||||
|
|
||||||
Mem0 includes built-in support for various popular large language models. Memory can utilize the LLM provided by the user, ensuring efficient use for specific needs.
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
To use a llm, you must provide a configuration to customize its usage. If no configuration is supplied, a default configuration will be applied, and `OpenAI` will be used as the llm.
|
|
||||||
|
|
||||||
For a comprehensive list of available parameters for llm configuration, please refer to [Config](./config).
|
|
||||||
|
|
||||||
To view all supported llms, visit the [Supported LLMs](./models).
|
|
||||||
|
|
||||||
<CardGroup cols={3}>
|
|
||||||
<Card title="OpenAI" href="/open-source-typescript/components/llms/models/openai"></Card>
|
|
||||||
<Card title="Anthropic" href="/open-source-typescript/components/llms/models/anthropic"></Card>
|
|
||||||
<Card title="Groq" href="/open-source-typescript/components/llms/models/groq"></Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Structured vs Unstructured Outputs
|
|
||||||
|
|
||||||
Mem0 supports two types of OpenAI LLM formats, each with its own strengths and use cases:
|
|
||||||
|
|
||||||
### Structured Outputs
|
|
||||||
|
|
||||||
Structured outputs are LLMs that align with OpenAI's structured outputs model:
|
|
||||||
|
|
||||||
- **Optimized for:** Returning structured responses (e.g., JSON objects)
|
|
||||||
- **Benefits:** Precise, easily parseable data
|
|
||||||
- **Ideal for:** Data extraction, form filling, API responses
|
|
||||||
- **Learn more:** [OpenAI Structured Outputs Guide](https://platform.openai.com/docs/guides/structured-outputs/introduction)
|
|
||||||
|
|
||||||
### Unstructured Outputs
|
|
||||||
|
|
||||||
Unstructured outputs correspond to OpenAI's standard, free-form text model:
|
|
||||||
|
|
||||||
- **Flexibility:** Returns open-ended, natural language responses
|
|
||||||
- **Customization:** Use the `response_format` parameter to guide output
|
|
||||||
- **Trade-off:** Less efficient than structured outputs for specific data needs
|
|
||||||
- **Best for:** Creative writing, explanations, general conversation
|
|
||||||
|
|
||||||
Choose the format that best suits your application's requirements for optimal performance and usability.
|
|
||||||
@@ -1,100 +0,0 @@
|
|||||||
---
|
|
||||||
title: Configurations
|
|
||||||
icon: "gear"
|
|
||||||
iconType: "solid"
|
|
||||||
---
|
|
||||||
|
|
||||||
## How to define configurations?
|
|
||||||
|
|
||||||
The `config` is defined as a TypeScript object with two main keys:
|
|
||||||
- `vectorStore`: Specifies the vector database provider and its configuration
|
|
||||||
- `provider`: The name of the vector database (e.g., "chroma", "pgvector", "qdrant", "milvus", "azure_ai_search", "redis", "memory")
|
|
||||||
- `config`: A nested object containing provider-specific settings
|
|
||||||
|
|
||||||
## In-Memory Storage Option
|
|
||||||
|
|
||||||
We also support an in-memory storage option for the vector store, which is useful for reduced overhead and faster access times. Here's how to configure it:
|
|
||||||
|
|
||||||
### Example for In-Memory Storage
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const configMemory = {
|
|
||||||
vector_store: {
|
|
||||||
provider: 'memory',
|
|
||||||
config: {
|
|
||||||
collectionName: 'memories',
|
|
||||||
dimension: 1536,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(configMemory);
|
|
||||||
await memory.add("Your text here", { userId: "user", metadata: { category: "example" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
## How to Use Config
|
|
||||||
|
|
||||||
Here's a general example of how to use the config with Mem0:
|
|
||||||
|
|
||||||
### Example for qdrant
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
vector_store: {
|
|
||||||
provider: 'qdrant',
|
|
||||||
config: {
|
|
||||||
collectionName: 'memories',
|
|
||||||
embeddingModelDims: 1536,
|
|
||||||
host: 'localhost',
|
|
||||||
port: 6333,
|
|
||||||
url: 'https://your-qdrant-url.com',
|
|
||||||
apiKey: 'your-qdrant-api-key',
|
|
||||||
onDisk: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
await memory.add("Your text here", { userId: "user", metadata: { category: "example" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
## Why is Config Needed?
|
|
||||||
|
|
||||||
Config is essential for:
|
|
||||||
1. Specifying which vector database to use.
|
|
||||||
2. Providing necessary connection details (e.g., host, port, credentials).
|
|
||||||
3. Customizing database-specific settings (e.g., collection name, path).
|
|
||||||
4. Ensuring proper initialization and connection to your chosen vector store.
|
|
||||||
|
|
||||||
## Master List of All Params in Config
|
|
||||||
|
|
||||||
Here's a comprehensive list of all parameters that can be used across different vector databases:
|
|
||||||
|
|
||||||
| Parameter | Description |
|
|
||||||
|------------------------|--------------------------------------|
|
|
||||||
| `collectionName` | Name of the collection |
|
|
||||||
| `dimension` | Dimensions of the embedding model |
|
|
||||||
| `host` | Host where the server is running |
|
|
||||||
| `port` | Port where the server is running |
|
|
||||||
| `embeddingModelDims` | Dimensions of the embedding model |
|
|
||||||
| `url` | URL for the Qdrant server |
|
|
||||||
| `apiKey` | API key for the Qdrant server |
|
|
||||||
| `path` | Path for the Qdrant server |
|
|
||||||
| `onDisk` | Enable persistent storage (for Qdrant) |
|
|
||||||
| `redisUrl` | URL for the Redis server |
|
|
||||||
| `username` | Username for Redis connection |
|
|
||||||
| `password` | Password for Redis connection |
|
|
||||||
|
|
||||||
## Customizing Config
|
|
||||||
|
|
||||||
Each vector database has its own specific configuration requirements. To customize the config for your chosen vector store:
|
|
||||||
|
|
||||||
1. Identify the vector database you want to use from [supported vector databases](./dbs).
|
|
||||||
2. Refer to the `Config` section in the respective vector database's documentation.
|
|
||||||
3. Include only the relevant parameters for your chosen database in the `config` object.
|
|
||||||
|
|
||||||
## Supported Vector Databases
|
|
||||||
|
|
||||||
For detailed information on configuring specific vector databases, please visit the [Supported Vector Databases](./dbs) section. There you'll find individual pages for each supported vector store with provider-specific usage examples and configuration details.
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
[pgvector](https://github.com/pgvector/pgvector) is open-source vector similarity search for Postgres. After connecting with Postgres, run `CREATE EXTENSION IF NOT EXISTS vector;` to create the vector extension.
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
Here's how to configure pgvector in your application:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
vector_store: {
|
|
||||||
provider: 'pgvector',
|
|
||||||
config: {
|
|
||||||
collectionName: 'memories',
|
|
||||||
dimension: 1536,
|
|
||||||
dbname: 'vectordb',
|
|
||||||
user: 'postgres',
|
|
||||||
password: 'postgres',
|
|
||||||
host: 'localhost',
|
|
||||||
port: 5432,
|
|
||||||
embeddingModelDims: 1536,
|
|
||||||
hnsw: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
### Config
|
|
||||||
|
|
||||||
Here's the parameters available for configuring pgvector:
|
|
||||||
|
|
||||||
| Parameter | Description | Default Value |
|
|
||||||
|------------------------|--------------------------------------------------|---------------|
|
|
||||||
| `dbname` | The name of the database | `postgres` |
|
|
||||||
| `collectionName` | The name of the collection | `mem0` |
|
|
||||||
| `embeddingModelDims` | Dimensions of the embedding model | `1536` |
|
|
||||||
| `user` | Username to connect to the database | `None` |
|
|
||||||
| `password` | Password to connect to the database | `None` |
|
|
||||||
| `host` | The host where the Postgres server is running | `None` |
|
|
||||||
| `port` | The port where the Postgres server is running | `None` |
|
|
||||||
| `hnsw` | Enable HNSW indexing | `False` |
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
[Qdrant](https://qdrant.tech/) is an open-source vector search engine. It is designed to work with large-scale datasets and provides a high-performance search engine for vector data.
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
Here's how to configure Qdrant in your application:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
vector_store: {
|
|
||||||
provider: 'qdrant',
|
|
||||||
config: {
|
|
||||||
collectionName: 'memories',
|
|
||||||
embeddingModelDims: 1536,
|
|
||||||
host: 'localhost',
|
|
||||||
port: 6333,
|
|
||||||
url: 'https://your-qdrant-url.com',
|
|
||||||
apiKey: 'your-qdrant-api-key',
|
|
||||||
onDisk: true,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
await memory.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
### Config
|
|
||||||
|
|
||||||
Let's see the available parameters for the `qdrant` config:
|
|
||||||
|
|
||||||
| Parameter | Description | Default Value |
|
|
||||||
|------------------------|--------------------------------------------------|---------------|
|
|
||||||
| `collectionName` | The name of the collection to store the vectors | `mem0` |
|
|
||||||
| `embeddingModelDims` | Dimensions of the embedding model | `1536` |
|
|
||||||
| `host` | The host where the Qdrant server is running | `None` |
|
|
||||||
| `port` | The port where the Qdrant server is running | `None` |
|
|
||||||
| `path` | Path for the Qdrant database | `/tmp/qdrant` |
|
|
||||||
| `url` | Full URL for the Qdrant server | `None` |
|
|
||||||
| `apiKey` | API key for the Qdrant server | `None` |
|
|
||||||
| `onDisk` | For enabling persistent storage | `False` |
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
[Redis](https://redis.io/) is a scalable, real-time database that can store, search, and analyze vector data.
|
|
||||||
|
|
||||||
### Installation
|
|
||||||
```bash
|
|
||||||
pip install redis redisvl
|
|
||||||
```
|
|
||||||
|
|
||||||
Redis Stack using Docker:
|
|
||||||
```bash
|
|
||||||
docker run -d --name redis-stack -p 6379:6379 -p 8001:8001 redis/redis-stack:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
Here's how to configure Redis in your application:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
vector_store: {
|
|
||||||
provider: 'redis',
|
|
||||||
config: {
|
|
||||||
collectionName: 'memories',
|
|
||||||
embeddingModelDims: 1536,
|
|
||||||
redisUrl: 'redis://localhost:6379',
|
|
||||||
username: 'your-redis-username',
|
|
||||||
password: 'your-redis-password',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
const memoryRedis = new Memory(config);
|
|
||||||
await memoryRedis.add("Likes to play cricket on weekends", { userId: "alice", metadata: { category: "hobbies" } });
|
|
||||||
```
|
|
||||||
|
|
||||||
### Config
|
|
||||||
|
|
||||||
Let's see the available parameters for the `redis` config:
|
|
||||||
|
|
||||||
| Parameter | Description | Default Value |
|
|
||||||
|------------------------|--------------------------------------------------|---------------|
|
|
||||||
| `collectionName` | The name of the collection to store the vectors | `mem0` |
|
|
||||||
| `embeddingModelDims` | Dimensions of the embedding model | `1536` |
|
|
||||||
| `redisUrl` | The URL of the Redis server | `None` |
|
|
||||||
| `username` | Username for Redis connection | `None` |
|
|
||||||
| `password` | Password for Redis connection | `None` |
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
---
|
|
||||||
title: Overview
|
|
||||||
icon: "info"
|
|
||||||
iconType: "solid"
|
|
||||||
---
|
|
||||||
|
|
||||||
Mem0 includes built-in support for various popular databases. Memory can utilize the database provided by the user, ensuring efficient use for specific needs.
|
|
||||||
|
|
||||||
## Supported Vector Databases
|
|
||||||
|
|
||||||
See the list of supported vector databases below.
|
|
||||||
|
|
||||||
<CardGroup cols={2}>
|
|
||||||
<Card title="Memory" href="/components/vectordbs/dbs/memory"></Card>
|
|
||||||
<Card title="Qdrant" href="/components/vectordbs/dbs/qdrant"></Card>
|
|
||||||
<Card title="Redis" href="/components/vectordbs/dbs/redis"></Card>
|
|
||||||
<Card title="Pgvector" href="/components/vectordbs/dbs/pgvector"></Card>
|
|
||||||
</CardGroup>
|
|
||||||
|
|
||||||
## Usage
|
|
||||||
|
|
||||||
To utilize a vector database, you must provide a configuration to customize its usage. If no configuration is supplied, a default configuration will be applied, and `Memory` will be used as the vector database.
|
|
||||||
|
|
||||||
For a comprehensive list of available parameters for vector database configuration, please refer to [Config](./config).
|
|
||||||
|
|
||||||
## Common issues
|
|
||||||
|
|
||||||
### Using model with different dimensions
|
|
||||||
|
|
||||||
If you are using customized model, which is having different dimensions other than 1536
|
|
||||||
for example 768, you may encounter below error:
|
|
||||||
|
|
||||||
`ValueError: shapes (0,1536) and (768,) not aligned: 1536 (dim 1) != 768 (dim 0)`
|
|
||||||
|
|
||||||
you could add `"embedding_model_dims": 768,` to the config of the vector_store to overcome this issue.
|
|
||||||
|
|
||||||
@@ -1,141 +0,0 @@
|
|||||||
---
|
|
||||||
title: Custom Prompts
|
|
||||||
description: 'Enhance your product experience by adding custom prompts tailored to your needs'
|
|
||||||
icon: "pencil"
|
|
||||||
iconType: "solid"
|
|
||||||
---
|
|
||||||
|
|
||||||
## Introduction to Custom Prompts
|
|
||||||
|
|
||||||
Custom prompts allow you to tailor the behavior of your Mem0 instance to specific use cases or domains.
|
|
||||||
By defining a custom prompt, you can control how information is extracted, processed, and stored in your memory system.
|
|
||||||
|
|
||||||
To create an effective custom prompt:
|
|
||||||
1. Be specific about the information to extract.
|
|
||||||
2. Provide few-shot examples to guide the LLM.
|
|
||||||
3. Ensure examples follow the format shown below.
|
|
||||||
|
|
||||||
Example of a custom prompt:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const customPrompt = `
|
|
||||||
Please only extract entities containing customer support information, order details, and user information.
|
|
||||||
Here are some few shot examples:
|
|
||||||
|
|
||||||
Input: Hi.
|
|
||||||
Output: {"facts" : []}
|
|
||||||
|
|
||||||
Input: The weather is nice today.
|
|
||||||
Output: {"facts" : []}
|
|
||||||
|
|
||||||
Input: My order #12345 hasn't arrived yet.
|
|
||||||
Output: {"facts" : ["Order #12345 not received"]}
|
|
||||||
|
|
||||||
Input: I'm John Doe, and I'd like to return the shoes I bought last week.
|
|
||||||
Output: {"facts" : ["Customer name: John Doe", "Wants to return shoes", "Purchase made last week"]}
|
|
||||||
|
|
||||||
Input: I ordered a red shirt, size medium, but received a blue one instead.
|
|
||||||
Output: {"facts" : ["Ordered red shirt, size medium", "Received blue shirt instead"]}
|
|
||||||
|
|
||||||
Return the facts and customer information in a json format as shown above.
|
|
||||||
`;
|
|
||||||
```
|
|
||||||
|
|
||||||
Here we initialize the custom prompt in the config:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
import { Memory } from 'mem0ai/oss';
|
|
||||||
|
|
||||||
const config = {
|
|
||||||
version: 'v1.1',
|
|
||||||
embedder: {
|
|
||||||
provider: 'openai',
|
|
||||||
config: {
|
|
||||||
apiKey: process.env.OPENAI_API_KEY || '',
|
|
||||||
model: 'text-embedding-3-small',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
vectorStore: {
|
|
||||||
provider: 'memory',
|
|
||||||
config: {
|
|
||||||
collectionName: 'memories',
|
|
||||||
dimension: 1536,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
llm: {
|
|
||||||
provider: 'openai',
|
|
||||||
config: {
|
|
||||||
apiKey: process.env.OPENAI_API_KEY || '',
|
|
||||||
model: 'gpt-4-turbo-preview',
|
|
||||||
temperature: 0.2,
|
|
||||||
maxTokens: 1500,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
customPrompt: customPrompt,
|
|
||||||
historyDbPath: 'memory.db',
|
|
||||||
};
|
|
||||||
|
|
||||||
const memory = new Memory(config);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Example 1
|
|
||||||
|
|
||||||
In this example, we are adding a memory of a user ordering a laptop. As seen in the output, the custom prompt is used to extract the relevant information from the user's message.
|
|
||||||
|
|
||||||
<CodeGroup>
|
|
||||||
```typescript Code
|
|
||||||
await memory.add('Yesterday, I ordered a laptop, the order id is 12345', 'user123');
|
|
||||||
```
|
|
||||||
|
|
||||||
```json Output
|
|
||||||
{
|
|
||||||
"results": [
|
|
||||||
{
|
|
||||||
"id": "c03c9045-df76-4949-bbc5-d5dc1932aa5c",
|
|
||||||
"memory": "Ordered a laptop",
|
|
||||||
"metadata": {}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4",
|
|
||||||
"memory": "Order ID: 12345",
|
|
||||||
"metadata": {}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": "e5f2a012-3b45-4c67-9d8e-123456789abc",
|
|
||||||
"memory": "Order placed yesterday",
|
|
||||||
"metadata": {}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
</CodeGroup>
|
|
||||||
|
|
||||||
### Example 2
|
|
||||||
|
|
||||||
In this example, we are adding a memory of a user liking to go on hikes. This add message is not specific to the use-case mentioned in the custom prompt.
|
|
||||||
Hence, the memory is not added.
|
|
||||||
|
|
||||||
<CodeGroup>
|
|
||||||
```typescript Code
|
|
||||||
await memory.add('I like going to hikes', 'user123');
|
|
||||||
```
|
|
||||||
|
|
||||||
```json Output
|
|
||||||
{
|
|
||||||
"results": []
|
|
||||||
}
|
|
||||||
```
|
|
||||||
</CodeGroup>
|
|
||||||
|
|
||||||
You can also use custom prompts with chat messages:
|
|
||||||
|
|
||||||
```typescript
|
|
||||||
const messages = [
|
|
||||||
{ role: 'user', content: 'Hi, I ordered item #54321 last week but haven\'t received it yet.' },
|
|
||||||
{ role: 'assistant', content: 'I understand you\'re concerned about your order #54321. Let me help track that for you.' }
|
|
||||||
];
|
|
||||||
|
|
||||||
await memory.add(messages, 'user123');
|
|
||||||
```
|
|
||||||
|
|
||||||
The custom prompt will process both the user and assistant messages to extract relevant information according to the defined format.
|
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: Node.js Guide
|
title: Node SDK
|
||||||
description: 'Get started with Mem0 quickly!'
|
description: 'Get started with Mem0 quickly!'
|
||||||
icon: "node"
|
icon: "node"
|
||||||
iconType: "solid"
|
iconType: "solid"
|
||||||
@@ -67,15 +67,14 @@ const memory = new Memory({
|
|||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```typescript Code
|
```typescript Code
|
||||||
// For a user
|
const messages = [
|
||||||
const result = await memory.add('Hi, my name is John and I am a software', 'user123');
|
{"role": "user", "content": "I'm planning to watch a movie tonight. Any recommendations?"},
|
||||||
console.log(result);
|
{"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."}
|
||||||
|
]
|
||||||
|
|
||||||
// const messages = [
|
await memory.add(messages, { userId: "user123", metadata: { category: "movie_recommendations" } });
|
||||||
// {"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."}
|
|
||||||
// ]
|
|
||||||
// await memory.add(messages, 'user123');
|
|
||||||
```
|
```
|
||||||
|
|
||||||
```json Output
|
```json Output
|
||||||
@@ -83,13 +82,24 @@ console.log(result);
|
|||||||
"results": [
|
"results": [
|
||||||
{
|
{
|
||||||
"id": "c03c9045-df76-4949-bbc5-d5dc1932aa5c",
|
"id": "c03c9045-df76-4949-bbc5-d5dc1932aa5c",
|
||||||
"memory": "Name is John",
|
"memory": "User is planning to watch a movie tonight.",
|
||||||
"metadata": [Object]
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
}
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4",
|
"id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4",
|
||||||
"memory": "Is a software",
|
"memory": "User is not a big fan of thriller movies.",
|
||||||
"metadata": [Object]
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "475bde34-21e6-42ab-8bef-0ab84474f156",
|
||||||
|
"memory": "User loves sci-fi movies.",
|
||||||
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
}
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
@@ -101,7 +111,7 @@ console.log(result);
|
|||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```typescript Code
|
```typescript Code
|
||||||
// Get all memories
|
// Get all memories
|
||||||
const allMemories = await memory.getAll('user123');
|
const allMemories = await memory.getAll({ userId: "user123" });
|
||||||
console.log(allMemories)
|
console.log(allMemories)
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -110,20 +120,35 @@ console.log(allMemories)
|
|||||||
"results": [
|
"results": [
|
||||||
{
|
{
|
||||||
"id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e",
|
"id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e",
|
||||||
"memory": "Name is Alex Jones",
|
"memory": "User is planning to watch a movie tonight.",
|
||||||
"hash": "1a271c007316c94377175ee80e746a19",
|
"hash": "1a271c007316c94377175ee80e746a19",
|
||||||
"createdAt": "2025-02-27T16:33:20.557Z",
|
"createdAt": "2025-02-27T16:33:20.557Z",
|
||||||
"updatedAt": "2025-02-27T16:33:27.051Z",
|
"updatedAt": "2025-02-27T16:33:27.051Z",
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
},
|
||||||
"userId": "user123"
|
"userId": "user123"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "475bde34-21e6-42ab-8bef-0ab84474f156",
|
"id": "475bde34-21e6-42ab-8bef-0ab84474f156",
|
||||||
"memory": "Likes to play cricket on weekends",
|
"memory": "User loves sci-fi movies.",
|
||||||
"hash": "285d07801ae42054732314853e9eadd7",
|
"hash": "285d07801ae42054732314853e9eadd7",
|
||||||
"createdAt": "2025-02-27T16:33:20.560Z",
|
"createdAt": "2025-02-27T16:33:20.560Z",
|
||||||
"updatedAt": undefined,
|
"updatedAt": undefined,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
},
|
||||||
|
"userId": "user123"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4",
|
||||||
|
"memory": "User is not a big fan of thriller movies.",
|
||||||
|
"hash": "285d07801ae42054732314853e9eadd7",
|
||||||
|
"createdAt": "2025-02-27T16:33:20.560Z",
|
||||||
|
"updatedAt": undefined,
|
||||||
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
},
|
||||||
"userId": "user123"
|
"userId": "user123"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -137,18 +162,20 @@ console.log(allMemories)
|
|||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```typescript Code
|
```typescript Code
|
||||||
// Get a single memory by ID
|
// Get a single memory by ID
|
||||||
const singleMemory = await memory.get('6c1c11a2-4fbc-4a2b-8e8a-d60e67e57aaa');
|
const singleMemory = await memory.get('892db2ae-06d9-49e5-8b3e-585ef9b85b8e');
|
||||||
console.log(singleMemory);
|
console.log(singleMemory);
|
||||||
```
|
```
|
||||||
|
|
||||||
```json Output
|
```json Output
|
||||||
{
|
{
|
||||||
"id": "6c1c11a2-4fbc-4a2b-8e8a-d60e67e57aaa",
|
"id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e",
|
||||||
"memory": "Name is Alex",
|
"memory": "User is planning to watch a movie tonight.",
|
||||||
"hash": "d0fccc8fa47f7a149ee95750c37bb0ca",
|
"hash": "1a271c007316c94377175ee80e746a19",
|
||||||
"createdAt": "2025-02-27T16:37:04.378Z",
|
"createdAt": "2025-02-27T16:33:20.557Z",
|
||||||
"updatedAt": undefined,
|
"updatedAt": undefined,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
},
|
||||||
"userId": "user123"
|
"userId": "user123"
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -158,7 +185,7 @@ console.log(singleMemory);
|
|||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```typescript Code
|
```typescript Code
|
||||||
const result = await memory.search('What do you know about me?', 'user123');
|
const result = await memory.search('What do you know about me?', { userId: "user123" });
|
||||||
console.log(result);
|
console.log(result);
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -166,23 +193,39 @@ console.log(result);
|
|||||||
{
|
{
|
||||||
"results": [
|
"results": [
|
||||||
{
|
{
|
||||||
"id": "28c3eee7-186e-4644-8c5d-13b306233d4e",
|
"id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e",
|
||||||
"memory": "Name is Alex",
|
"memory": "User is planning to watch a movie tonight.",
|
||||||
"hash": "d0fccc8fa47f7a149ee95750c37bb0ca",
|
"hash": "1a271c007316c94377175ee80e746a19",
|
||||||
"createdAt": "2025-02-27T16:43:56.310Z",
|
"createdAt": "2025-02-27T16:33:20.557Z",
|
||||||
"updatedAt": undefined,
|
"updatedAt": undefined,
|
||||||
"score": 0.08920719231944799,
|
"score": 0.38920719231944799,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
},
|
||||||
"userId": "user123"
|
"userId": "user123"
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": "f3433da0-45f4-444f-a4bc-59a170890a1f",
|
"id": "475bde34-21e6-42ab-8bef-0ab84474f156",
|
||||||
"memory": "Likes to play cricket on weekends",
|
"memory": "User loves sci-fi movies.",
|
||||||
"hash": "285d07801ae42054732314853e9eadd7",
|
"hash": "285d07801ae42054732314853e9eadd7",
|
||||||
"createdAt": "2025-02-27T16:43:56.314Z",
|
"createdAt": "2025-02-27T16:33:20.560Z",
|
||||||
"updatedAt": undefined,
|
"updatedAt": undefined,
|
||||||
"score": 0.06869761478135689,
|
"score": 0.36869761478135689,
|
||||||
"metadata": {},
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
},
|
||||||
|
"userId": "user123"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "cbb1fe73-0bf1-4067-8c1f-63aa53e7b1a4",
|
||||||
|
"memory": "User is not a big fan of thriller movies.",
|
||||||
|
"hash": "285d07801ae42054732314853e9eadd7",
|
||||||
|
"createdAt": "2025-02-27T16:33:20.560Z",
|
||||||
|
"updatedAt": undefined,
|
||||||
|
"score": 0.33855272141248272,
|
||||||
|
"metadata": {
|
||||||
|
"category": "movie_recommendations"
|
||||||
|
},
|
||||||
"userId": "user123"
|
"userId": "user123"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
@@ -195,9 +238,8 @@ console.log(result);
|
|||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```typescript Code
|
```typescript Code
|
||||||
const result = await memory.update(
|
const result = await memory.update(
|
||||||
'6c1c11a2-4fbc-4a2b-8e8a-d60e67e57aaa',
|
'892db2ae-06d9-49e5-8b3e-585ef9b85b8e',
|
||||||
'I love India, it is my favorite country.',
|
'I love India, it is my favorite country.'
|
||||||
'user123'
|
|
||||||
);
|
);
|
||||||
console.log(result);
|
console.log(result);
|
||||||
```
|
```
|
||||||
@@ -213,7 +255,7 @@ console.log(result);
|
|||||||
|
|
||||||
<CodeGroup>
|
<CodeGroup>
|
||||||
```typescript Code
|
```typescript Code
|
||||||
const history = await memory.history('d2cc4cef-e0c1-47dd-948a-677030482e9e');
|
const history = await memory.history('892db2ae-06d9-49e5-8b3e-585ef9b85b8e');
|
||||||
console.log(history);
|
console.log(history);
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -221,21 +263,21 @@ console.log(history);
|
|||||||
[
|
[
|
||||||
{
|
{
|
||||||
"id": 39,
|
"id": 39,
|
||||||
"memory_id": "d2cc4cef-e0c1-47dd-948a-677030482e9e",
|
"memory_id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e",
|
||||||
"previous_value": "Name is Alex",
|
"previous_value": "User is planning to watch a movie tonight.",
|
||||||
"new_value": "Name is Alex Jones",
|
"new_value": "I love India, it is my favorite country.",
|
||||||
"action": "UPDATE",
|
"action": "UPDATE",
|
||||||
"created_at": "2025-02-27T16:46:15.853Z",
|
"created_at": "2025-02-27T16:33:20.557Z",
|
||||||
"updated_at": "2025-02-27T16:46:20.909Z",
|
"updated_at": "2025-02-27T16:33:27.051Z",
|
||||||
"is_deleted": 0
|
"is_deleted": 0
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"id": 37,
|
"id": 37,
|
||||||
"memory_id": "d2cc4cef-e0c1-47dd-948a-677030482e9e",
|
"memory_id": "892db2ae-06d9-49e5-8b3e-585ef9b85b8e",
|
||||||
"previous_value": null,
|
"previous_value": null,
|
||||||
"new_value": "Name is Alex",
|
"new_value": "User is planning to watch a movie tonight.",
|
||||||
"action": "ADD",
|
"action": "ADD",
|
||||||
"created_at": "2025-02-27T16:46:15.853Z",
|
"created_at": "2025-02-27T16:33:20.557Z",
|
||||||
"updated_at": null,
|
"updated_at": null,
|
||||||
"is_deleted": 0
|
"is_deleted": 0
|
||||||
}
|
}
|
||||||
@@ -247,10 +289,10 @@ console.log(history);
|
|||||||
|
|
||||||
```typescript
|
```typescript
|
||||||
// Delete a memory by id
|
// Delete a memory by id
|
||||||
await memory.delete('bf4d4092-cf91-4181-bfeb-b6fa2ed3061b');
|
await memory.delete('892db2ae-06d9-49e5-8b3e-585ef9b85b8e');
|
||||||
|
|
||||||
// Delete all memories for a user
|
// Delete all memories for a user
|
||||||
await memory.deleteAll('alice');
|
await memory.deleteAll({ userId: "user123" });
|
||||||
```
|
```
|
||||||
|
|
||||||
### Reset Memory
|
### Reset Memory
|
||||||
|
|||||||
@@ -28,8 +28,7 @@ config = {
|
|||||||
"password": "xxx"
|
"password": "xxx"
|
||||||
},
|
},
|
||||||
"custom_prompt": "Please only extract entities containing sports related relationships and nothing else.",
|
"custom_prompt": "Please only extract entities containing sports related relationships and nothing else.",
|
||||||
},
|
}
|
||||||
"version": "v1.1"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m = Memory.from_config(config_dict=config)
|
m = Memory.from_config(config_dict=config)
|
||||||
|
|||||||
@@ -38,8 +38,7 @@ allowfullscreen
|
|||||||
## Initialize Graph Memory
|
## Initialize Graph Memory
|
||||||
|
|
||||||
To initialize Graph Memory you'll need to set up your configuration with graph store providers.
|
To initialize Graph Memory you'll need to set up your configuration with graph store providers.
|
||||||
Currently, we support Neo4j as a graph store provider. You can setup [Neo4j](https://neo4j.com/) locally or use the hosted [Neo4j AuraDB](https://neo4j.com/product/auradb/).
|
Currently, we support Neo4j as a graph store provider. You can setup [Neo4j](https://neo4j.com/) locally or use the hosted [Neo4j AuraDB](https://neo4j.com/product/auradb/).
|
||||||
Moreover, you also need to set the version to `v1.1` (*prior versions are not supported*).
|
|
||||||
|
|
||||||
<Note>If you are using Neo4j locally, then you need to install [APOC plugins](https://neo4j.com/labs/apoc/4.1/installation/).</Note>
|
<Note>If you are using Neo4j locally, then you need to install [APOC plugins](https://neo4j.com/labs/apoc/4.1/installation/).</Note>
|
||||||
|
|
||||||
@@ -65,8 +64,7 @@ config = {
|
|||||||
"username": "neo4j",
|
"username": "neo4j",
|
||||||
"password": "xxx"
|
"password": "xxx"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"version": "v1.1"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m = Memory.from_config(config_dict=config)
|
m = Memory.from_config(config_dict=config)
|
||||||
@@ -98,8 +96,7 @@ config = {
|
|||||||
"temperature": 0.0,
|
"temperature": 0.0,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"version": "v1.1"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m = Memory.from_config(config_dict=config)
|
m = Memory.from_config(config_dict=config)
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
title: Python Guide
|
title: Python SDK
|
||||||
description: 'Get started with Mem0 quickly!'
|
description: 'Get started with Mem0 quickly!'
|
||||||
icon: "python"
|
icon: "python"
|
||||||
iconType: "solid"
|
iconType: "solid"
|
||||||
@@ -71,8 +71,7 @@ config = {
|
|||||||
"username": "neo4j",
|
"username": "neo4j",
|
||||||
"password": "---"
|
"password": "---"
|
||||||
}
|
}
|
||||||
},
|
}
|
||||||
"version": "v1.1"
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m = Memory.from_config(config_dict=config)
|
m = Memory.from_config(config_dict=config)
|
||||||
@@ -100,10 +99,6 @@ result = m.add("Likes to play cricket on weekends", user_id="alice", metadata={"
|
|||||||
{
|
{
|
||||||
"results": [
|
"results": [
|
||||||
{"id": "bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", "memory": "Likes to play cricket on weekends", "event": "ADD"}
|
{"id": "bf4d4092-cf91-4181-bfeb-b6fa2ed3061b", "memory": "Likes to play cricket on weekends", "event": "ADD"}
|
||||||
],
|
|
||||||
"relations": [
|
|
||||||
{"source": "alice", "relationship": "likes_to_play", "target": "cricket"},
|
|
||||||
{"source": "alice", "relationship": "plays_on", "target": "weekends"}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -129,10 +124,6 @@ all_memories = m.get_all(user_id="alice")
|
|||||||
"updated_at": None,
|
"updated_at": None,
|
||||||
"user_id": "alice"
|
"user_id": "alice"
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"relations": [
|
|
||||||
{"source": "alice", "relationship": "likes_to_play", "target": "cricket"},
|
|
||||||
{"source": "alice", "relationship": "plays_on", "target": "weekends"}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -180,10 +171,6 @@ related_memories = m.search(query="What are Alice's hobbies?", user_id="alice")
|
|||||||
"updated_at": None,
|
"updated_at": None,
|
||||||
"user_id": "alice"
|
"user_id": "alice"
|
||||||
}
|
}
|
||||||
],
|
|
||||||
"relations": [
|
|
||||||
{"source": "alice", "relationship": "plays_on", "target": "weekends"},
|
|
||||||
{"source": "alice", "relationship": "likes_to_play", "target": "cricket"}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
@@ -303,7 +290,7 @@ Mem0 offers extensive configuration options to customize its behavior according
|
|||||||
| Parameter | Description | Default |
|
| Parameter | Description | Default |
|
||||||
|------------------|--------------------------------------|----------------------------|
|
|------------------|--------------------------------------|----------------------------|
|
||||||
| `history_db_path` | Path to the history database | "{mem0_dir}/history.db" |
|
| `history_db_path` | Path to the history database | "{mem0_dir}/history.db" |
|
||||||
| `version` | API version | "v1.0" |
|
| `version` | API version | "v1.1" |
|
||||||
| `custom_prompt` | Custom prompt for memory processing | None |
|
| `custom_prompt` | Custom prompt for memory processing | None |
|
||||||
</Accordion>
|
</Accordion>
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -330,7 +330,7 @@ result = m.add("I like to drink coffee in the morning and go for a walk.", user_
|
|||||||
```
|
```
|
||||||
|
|
||||||
```typescript TypeScript
|
```typescript TypeScript
|
||||||
const result = memory.add("I like to drink coffee in the morning and go for a walk.", 'alice');
|
const result = memory.add("I like to drink coffee in the morning and go for a walk.", { userId: "alice", metadata: { category: "preferences" } });
|
||||||
```
|
```
|
||||||
|
|
||||||
```json Output
|
```json Output
|
||||||
@@ -361,7 +361,7 @@ related_memories = m.search("Should I drink coffee or tea?", user_id="alice")
|
|||||||
```
|
```
|
||||||
|
|
||||||
```typescript TypeScript
|
```typescript TypeScript
|
||||||
const relatedMemories = memory.search("Should I drink coffee or tea?", "alice");
|
const relatedMemories = memory.search("Should I drink coffee or tea?", { userId: "alice" });
|
||||||
```
|
```
|
||||||
|
|
||||||
```json Output
|
```json Output
|
||||||
|
|||||||
@@ -2,6 +2,9 @@
|
|||||||
|
|
||||||
Mem0 is a self-improving memory layer for LLM applications, enabling personalized AI experiences that save costs and delight users. We offer both cloud and open-source solutions to cater to different needs.
|
Mem0 is a self-improving memory layer for LLM applications, enabling personalized AI experiences that save costs and delight users. We offer both cloud and open-source solutions to cater to different needs.
|
||||||
|
|
||||||
|
See the complete [OSS Docs](https://docs.mem0.ai/open-source-typescript/quickstart).
|
||||||
|
See the complete [Platform API Reference](https://docs.mem0.ai/api-reference/overview).
|
||||||
|
|
||||||
## 1. Installation
|
## 1. Installation
|
||||||
|
|
||||||
For the open-source version, you can install the Mem0 package using npm:
|
For the open-source version, you can install the Mem0 package using npm:
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "mem0ai",
|
"name": "mem0ai",
|
||||||
"version": "2.0.0",
|
"version": "2.0.1",
|
||||||
"description": "The Memory Layer For Your AI Apps",
|
"description": "The Memory Layer For Your AI Apps",
|
||||||
"main": "./dist/index.js",
|
"main": "./dist/index.js",
|
||||||
"module": "./dist/index.mjs",
|
"module": "./dist/index.mjs",
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
export * from "./memory";
|
export * from "./memory";
|
||||||
|
export * from "./memory/memory.types";
|
||||||
export * from "./types";
|
export * from "./types";
|
||||||
export * from "./embeddings/base";
|
export * from "./embeddings/base";
|
||||||
export * from "./embeddings/openai";
|
export * from "./embeddings/openai";
|
||||||
@@ -9,4 +10,6 @@ export * from "./llms/anthropic";
|
|||||||
export * from "./llms/groq";
|
export * from "./llms/groq";
|
||||||
export * from "./vector_stores/base";
|
export * from "./vector_stores/base";
|
||||||
export * from "./vector_stores/memory";
|
export * from "./vector_stores/memory";
|
||||||
|
export * from "./vector_stores/qdrant";
|
||||||
|
export * from "./vector_stores/redis";
|
||||||
export * from "./utils/factory";
|
export * from "./utils/factory";
|
||||||
|
|||||||
@@ -24,6 +24,12 @@ import { Embedder } from "../embeddings/base";
|
|||||||
import { LLM } from "../llms/base";
|
import { LLM } from "../llms/base";
|
||||||
import { VectorStore } from "../vector_stores/base";
|
import { VectorStore } from "../vector_stores/base";
|
||||||
import { ConfigManager } from "../config/manager";
|
import { ConfigManager } from "../config/manager";
|
||||||
|
import {
|
||||||
|
AddMemoryOptions,
|
||||||
|
SearchMemoryOptions,
|
||||||
|
DeleteAllMemoryOptions,
|
||||||
|
GetAllMemoryOptions,
|
||||||
|
} from "./memory.types";
|
||||||
|
|
||||||
export class Memory {
|
export class Memory {
|
||||||
private config: MemoryConfig;
|
private config: MemoryConfig;
|
||||||
@@ -69,13 +75,17 @@ export class Memory {
|
|||||||
|
|
||||||
async add(
|
async add(
|
||||||
messages: string | Message[],
|
messages: string | Message[],
|
||||||
userId?: string,
|
config: AddMemoryOptions,
|
||||||
agentId?: string,
|
|
||||||
runId?: string,
|
|
||||||
metadata: Record<string, any> = {},
|
|
||||||
filters: SearchFilters = {},
|
|
||||||
prompt?: string,
|
|
||||||
): Promise<SearchResult> {
|
): Promise<SearchResult> {
|
||||||
|
const {
|
||||||
|
userId,
|
||||||
|
agentId,
|
||||||
|
runId,
|
||||||
|
metadata = {},
|
||||||
|
filters = {},
|
||||||
|
prompt,
|
||||||
|
} = config;
|
||||||
|
|
||||||
if (userId) filters.userId = metadata.userId = userId;
|
if (userId) filters.userId = metadata.userId = userId;
|
||||||
if (agentId) filters.agentId = metadata.agentId = agentId;
|
if (agentId) filters.agentId = metadata.agentId = agentId;
|
||||||
if (runId) filters.runId = metadata.runId = runId;
|
if (runId) filters.runId = metadata.runId = runId;
|
||||||
@@ -87,7 +97,7 @@ export class Memory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const parsedMessages = Array.isArray(messages)
|
const parsedMessages = Array.isArray(messages)
|
||||||
? messages
|
? (messages as Message[])
|
||||||
: [{ role: "user", content: messages }];
|
: [{ role: "user", content: messages }];
|
||||||
|
|
||||||
const vectorStoreResult = await this.addToVectorStore(
|
const vectorStoreResult = await this.addToVectorStore(
|
||||||
@@ -260,12 +270,10 @@ export class Memory {
|
|||||||
|
|
||||||
async search(
|
async search(
|
||||||
query: string,
|
query: string,
|
||||||
userId?: string,
|
config: SearchMemoryOptions,
|
||||||
agentId?: string,
|
|
||||||
runId?: string,
|
|
||||||
limit: number = 100,
|
|
||||||
filters: SearchFilters = {},
|
|
||||||
): Promise<SearchResult> {
|
): Promise<SearchResult> {
|
||||||
|
const { userId, agentId, runId, limit = 100, filters = {} } = config;
|
||||||
|
|
||||||
if (userId) filters.userId = userId;
|
if (userId) filters.userId = userId;
|
||||||
if (agentId) filters.agentId = agentId;
|
if (agentId) filters.agentId = agentId;
|
||||||
if (runId) filters.runId = runId;
|
if (runId) filters.runId = runId;
|
||||||
@@ -322,10 +330,10 @@ export class Memory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async deleteAll(
|
async deleteAll(
|
||||||
userId?: string,
|
config: DeleteAllMemoryOptions,
|
||||||
agentId?: string,
|
|
||||||
runId?: string,
|
|
||||||
): Promise<{ message: string }> {
|
): Promise<{ message: string }> {
|
||||||
|
const { userId, agentId, runId } = config;
|
||||||
|
|
||||||
const filters: SearchFilters = {};
|
const filters: SearchFilters = {};
|
||||||
if (userId) filters.userId = userId;
|
if (userId) filters.userId = userId;
|
||||||
if (agentId) filters.agentId = agentId;
|
if (agentId) filters.agentId = agentId;
|
||||||
@@ -358,12 +366,9 @@ export class Memory {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
async getAll(
|
async getAll(config: GetAllMemoryOptions): Promise<SearchResult> {
|
||||||
userId?: string,
|
const { userId, agentId, runId, limit = 100 } = config;
|
||||||
agentId?: string,
|
|
||||||
runId?: string,
|
|
||||||
limit: number = 100,
|
|
||||||
): Promise<SearchResult> {
|
|
||||||
const filters: SearchFilters = {};
|
const filters: SearchFilters = {};
|
||||||
if (userId) filters.userId = userId;
|
if (userId) filters.userId = userId;
|
||||||
if (agentId) filters.agentId = agentId;
|
if (agentId) filters.agentId = agentId;
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { Message } from "../types";
|
||||||
|
import { SearchFilters } from "../types";
|
||||||
|
|
||||||
|
export interface Entity {
|
||||||
|
userId?: string;
|
||||||
|
agentId?: string;
|
||||||
|
runId?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface AddMemoryOptions extends Entity {
|
||||||
|
metadata?: Record<string, any>;
|
||||||
|
filters?: SearchFilters;
|
||||||
|
prompt?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SearchMemoryOptions extends Entity {
|
||||||
|
query: string;
|
||||||
|
limit?: number;
|
||||||
|
filters?: SearchFilters;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface GetAllMemoryOptions extends Entity {
|
||||||
|
limit?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface DeleteAllMemoryOptions extends Entity {}
|
||||||
@@ -46,7 +46,7 @@ class MemoryConfig(BaseModel):
|
|||||||
)
|
)
|
||||||
version: str = Field(
|
version: str = Field(
|
||||||
description="The version of the API",
|
description="The version of the API",
|
||||||
default="v1.0",
|
default="v1.1",
|
||||||
)
|
)
|
||||||
custom_prompt: Optional[str] = Field(
|
custom_prompt: Optional[str] = Field(
|
||||||
description="Custom prompt for the memory",
|
description="Custom prompt for the memory",
|
||||||
|
|||||||
+27
-30
@@ -46,7 +46,7 @@ class Memory(MemoryBase):
|
|||||||
|
|
||||||
self.enable_graph = False
|
self.enable_graph = False
|
||||||
|
|
||||||
if self.api_version == "v1.1" and self.config.graph_store.config:
|
if self.config.graph_store.config:
|
||||||
from mem0.memory.graph_memory import MemoryGraph
|
from mem0.memory.graph_memory import MemoryGraph
|
||||||
|
|
||||||
self.graph = MemoryGraph(self.config)
|
self.graph = MemoryGraph(self.config)
|
||||||
@@ -126,12 +126,7 @@ class Memory(MemoryBase):
|
|||||||
vector_store_result = future1.result()
|
vector_store_result = future1.result()
|
||||||
graph_result = future2.result()
|
graph_result = future2.result()
|
||||||
|
|
||||||
if self.api_version == "v1.1":
|
if self.api_version == "v1.0":
|
||||||
return {
|
|
||||||
"results": vector_store_result,
|
|
||||||
"relations": graph_result,
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"The current add API output format is deprecated. "
|
"The current add API output format is deprecated. "
|
||||||
"To use the latest format, set `api_version='v1.1'`. "
|
"To use the latest format, set `api_version='v1.1'`. "
|
||||||
@@ -141,6 +136,14 @@ class Memory(MemoryBase):
|
|||||||
)
|
)
|
||||||
return vector_store_result
|
return vector_store_result
|
||||||
|
|
||||||
|
if self.enable_graph:
|
||||||
|
return {
|
||||||
|
"results": vector_store_result,
|
||||||
|
"relations": graph_result,
|
||||||
|
}
|
||||||
|
|
||||||
|
return {"results": vector_store_result}
|
||||||
|
|
||||||
def _add_to_vector_store(self, messages, metadata, filters):
|
def _add_to_vector_store(self, messages, metadata, filters):
|
||||||
parsed_messages = parse_messages(messages)
|
parsed_messages = parse_messages(messages)
|
||||||
|
|
||||||
@@ -252,7 +255,7 @@ class Memory(MemoryBase):
|
|||||||
|
|
||||||
def _add_to_graph(self, messages, filters):
|
def _add_to_graph(self, messages, filters):
|
||||||
added_entities = []
|
added_entities = []
|
||||||
if self.api_version == "v1.1" and self.enable_graph:
|
if self.enable_graph:
|
||||||
if filters.get("user_id") is None:
|
if filters.get("user_id") is None:
|
||||||
filters["user_id"] = "user"
|
filters["user_id"] = "user"
|
||||||
|
|
||||||
@@ -324,11 +327,7 @@ class Memory(MemoryBase):
|
|||||||
|
|
||||||
with concurrent.futures.ThreadPoolExecutor() as executor:
|
with concurrent.futures.ThreadPoolExecutor() as executor:
|
||||||
future_memories = executor.submit(self._get_all_from_vector_store, filters, limit)
|
future_memories = executor.submit(self._get_all_from_vector_store, filters, limit)
|
||||||
future_graph_entities = (
|
future_graph_entities = executor.submit(self.graph.get_all, filters, limit) if self.enable_graph else None
|
||||||
executor.submit(self.graph.get_all, filters, limit)
|
|
||||||
if self.api_version == "v1.1" and self.enable_graph
|
|
||||||
else None
|
|
||||||
)
|
|
||||||
|
|
||||||
concurrent.futures.wait(
|
concurrent.futures.wait(
|
||||||
[future_memories, future_graph_entities] if future_graph_entities else [future_memories]
|
[future_memories, future_graph_entities] if future_graph_entities else [future_memories]
|
||||||
@@ -337,12 +336,10 @@ class Memory(MemoryBase):
|
|||||||
all_memories = future_memories.result()
|
all_memories = future_memories.result()
|
||||||
graph_entities = future_graph_entities.result() if future_graph_entities else None
|
graph_entities = future_graph_entities.result() if future_graph_entities else None
|
||||||
|
|
||||||
if self.api_version == "v1.1":
|
if self.enable_graph:
|
||||||
if self.enable_graph:
|
return {"results": all_memories, "relations": graph_entities}
|
||||||
return {"results": all_memories, "relations": graph_entities}
|
|
||||||
else:
|
if self.api_version == "v1.0":
|
||||||
return {"results": all_memories}
|
|
||||||
else:
|
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"The current get_all API output format is deprecated. "
|
"The current get_all API output format is deprecated. "
|
||||||
"To use the latest format, set `api_version='v1.1'`. "
|
"To use the latest format, set `api_version='v1.1'`. "
|
||||||
@@ -351,6 +348,8 @@ class Memory(MemoryBase):
|
|||||||
stacklevel=2,
|
stacklevel=2,
|
||||||
)
|
)
|
||||||
return all_memories
|
return all_memories
|
||||||
|
else:
|
||||||
|
return {"results": all_memories}
|
||||||
|
|
||||||
def _get_all_from_vector_store(self, filters, limit):
|
def _get_all_from_vector_store(self, filters, limit):
|
||||||
memories = self.vector_store.list(filters=filters, limit=limit)
|
memories = self.vector_store.list(filters=filters, limit=limit)
|
||||||
@@ -419,9 +418,7 @@ class Memory(MemoryBase):
|
|||||||
with concurrent.futures.ThreadPoolExecutor() as executor:
|
with concurrent.futures.ThreadPoolExecutor() as executor:
|
||||||
future_memories = executor.submit(self._search_vector_store, query, filters, limit)
|
future_memories = executor.submit(self._search_vector_store, query, filters, limit)
|
||||||
future_graph_entities = (
|
future_graph_entities = (
|
||||||
executor.submit(self.graph.search, query, filters, limit)
|
executor.submit(self.graph.search, query, filters, limit) if self.enable_graph else None
|
||||||
if self.api_version == "v1.1" and self.enable_graph
|
|
||||||
else None
|
|
||||||
)
|
)
|
||||||
|
|
||||||
concurrent.futures.wait(
|
concurrent.futures.wait(
|
||||||
@@ -431,20 +428,20 @@ class Memory(MemoryBase):
|
|||||||
original_memories = future_memories.result()
|
original_memories = future_memories.result()
|
||||||
graph_entities = future_graph_entities.result() if future_graph_entities else None
|
graph_entities = future_graph_entities.result() if future_graph_entities else None
|
||||||
|
|
||||||
if self.api_version == "v1.1":
|
if self.enable_graph:
|
||||||
if self.enable_graph:
|
return {"results": original_memories, "relations": graph_entities}
|
||||||
return {"results": original_memories, "relations": graph_entities}
|
|
||||||
else:
|
if self.api_version == "v1.0":
|
||||||
return {"results": original_memories}
|
|
||||||
else:
|
|
||||||
warnings.warn(
|
warnings.warn(
|
||||||
"The current search API output format is deprecated. "
|
"The current get_all API output format is deprecated. "
|
||||||
"To use the latest format, set `api_version='v1.1'`. "
|
"To use the latest format, set `api_version='v1.1'`. "
|
||||||
"The current format will be removed in mem0ai 1.1.0 and later versions.",
|
"The current format will be removed in mem0ai 1.1.0 and later versions.",
|
||||||
category=DeprecationWarning,
|
category=DeprecationWarning,
|
||||||
stacklevel=2,
|
stacklevel=2,
|
||||||
)
|
)
|
||||||
return original_memories
|
return original_memories
|
||||||
|
else:
|
||||||
|
return {"results": original_memories}
|
||||||
|
|
||||||
def _search_vector_store(self, query, filters, limit):
|
def _search_vector_store(self, query, filters, limit):
|
||||||
embeddings = self.embedding_model.embed(query, "search")
|
embeddings = self.embedding_model.embed(query, "search")
|
||||||
@@ -540,7 +537,7 @@ class Memory(MemoryBase):
|
|||||||
|
|
||||||
logger.info(f"Deleted {len(memories)} memories")
|
logger.info(f"Deleted {len(memories)} memories")
|
||||||
|
|
||||||
if self.api_version == "v1.1" and self.enable_graph:
|
if self.enable_graph:
|
||||||
self.graph.delete_all(filters)
|
self.graph.delete_all(filters)
|
||||||
|
|
||||||
return {"message": "Memories deleted successfully!"}
|
return {"message": "Memories deleted successfully!"}
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
[tool.poetry]
|
[tool.poetry]
|
||||||
name = "mem0ai"
|
name = "mem0ai"
|
||||||
version = "0.1.58"
|
version = "0.1.59"
|
||||||
description = "Long-term memory for AI Agents"
|
description = "Long-term memory for AI Agents"
|
||||||
authors = ["Mem0 <founders@mem0.ai>"]
|
authors = ["Mem0 <founders@mem0.ai>"]
|
||||||
exclude = [
|
exclude = [
|
||||||
|
|||||||
+8
-4
@@ -41,10 +41,14 @@ def test_add(memory_instance, version, enable_graph):
|
|||||||
|
|
||||||
result = memory_instance.add(messages=[{"role": "user", "content": "Test message"}], user_id="test_user")
|
result = memory_instance.add(messages=[{"role": "user", "content": "Test message"}], user_id="test_user")
|
||||||
|
|
||||||
assert "results" in result
|
if enable_graph:
|
||||||
assert result["results"] == [{"memory": "Test memory", "event": "ADD"}]
|
assert "results" in result
|
||||||
assert "relations" in result
|
assert result["results"] == [{"memory": "Test memory", "event": "ADD"}]
|
||||||
assert result["relations"] == []
|
assert "relations" in result
|
||||||
|
assert result["relations"] == []
|
||||||
|
else:
|
||||||
|
assert "results" in result
|
||||||
|
assert result["results"] == [{"memory": "Test memory", "event": "ADD"}]
|
||||||
|
|
||||||
memory_instance._add_to_vector_store.assert_called_once_with(
|
memory_instance._add_to_vector_store.assert_called_once_with(
|
||||||
[{"role": "user", "content": "Test message"}], {"user_id": "test_user"}, {"user_id": "test_user"}
|
[{"role": "user", "content": "Test message"}], {"user_id": "test_user"}, {"user_id": "test_user"}
|
||||||
|
|||||||
@@ -55,9 +55,9 @@ class TestQdrant(unittest.TestCase):
|
|||||||
|
|
||||||
results = self.qdrant.search(query=query_vector, limit=1)
|
results = self.qdrant.search(query=query_vector, limit=1)
|
||||||
|
|
||||||
self.client_mock.search.assert_called_once_with(
|
self.client_mock.query_points.assert_called_once_with(
|
||||||
collection_name="test_collection",
|
collection_name="test_collection",
|
||||||
query_vector=query_vector,
|
query=query_vector,
|
||||||
query_filter=None,
|
query_filter=None,
|
||||||
limit=1,
|
limit=1,
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user