> ## Documentation Index
> Fetch the complete documentation index at: https://docs.mem0.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Neon

> Use Neon as a vector store in Mem0, powered by PostgreSQL and pgvector.

Use [Neon](https://neon.com/) as a vector store in Mem0, powered by PostgreSQL and the
[pgvector extension](https://neon.com/docs/extensions/pgvector).

Neon is a serverless Postgres platform. Since Mem0 supports Postgres through the
`pgvector` provider, Neon can be used with a standard Postgres connection string.

## Usage

<CodeGroup>
  ```python Python theme={null}
  import os

  from dotenv import load_dotenv
  from mem0 import Memory

  load_dotenv()

  config = {
      "vector_store": {
          "provider": "pgvector",
          "config": {
              "connection_string": os.environ["DATABASE_URL"],
              "collection_name": "memories",
              "embedding_model_dims": 1536,
              "hnsw": True,
          },
      },
  }

  m = Memory.from_config(config)
  messages = [
      {"role": "user", "content": "I'm planning to watch a movie tonight. Any recommendations?"},
      {"role": "assistant", "content": "How about 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."},
  ]
  m.add(messages, user_id="alice", metadata={"category": "movies"})

  results = m.search(
      "What movies should I recommend?",
      filters={"user_id": "alice"},
  )

  print(results)
  ```

  ```typescript TypeScript theme={null}
  import "dotenv/config";
  import { Memory } from "mem0ai/oss";

  const m = new Memory({
    vectorStore: {
      provider: "pgvector",
      config: {
        connectionString: process.env.DATABASE_URL!,
        ssl: {
          rejectUnauthorized: false,
        },
        collectionName: "memories",
        dimension: 1536,
        embeddingModelDims: 1536,
        hnsw: true,
      },
    },
  });

  const messages = [
    { role: "user" as const, content: "I'm planning to watch a movie tonight. Any recommendations?" },
    { role: "assistant" as const, content: "How about thriller movies? They can be quite engaging." },
    { role: "user" as const, content: "I'm not a big fan of thriller movies but I love sci-fi movies." },
    { role: "assistant" as const, content: "Got it! I'll avoid thriller recommendations and suggest sci-fi movies in the future." },
  ];

  await m.add(messages, {
    userId: "alice",
    metadata: { category: "movies" },
  });

  const results = await m.search("What movies should I recommend?", {
    filters: { user_id: "alice" },
  });

  console.log(results);
  ```
</CodeGroup>

## SQL Migration

You don't need to run any SQL migrations. Mem0 creates the collection table when it initializes the `pgvector` store.

## Environment

```env theme={null}
OPENAI_API_KEY=sk-xx...
DATABASE_URL=postgresql://user:password@ep-example.us-east-2.aws.neon.tech/neondb?sslmode=require
```

## Config

<Tabs>
  <Tab title="Python">
    | Parameter              | Description                                  | Default Value  |
    | ---------------------- | -------------------------------------------- | -------------- |
    | `connection_string`    | Neon Postgres connection string.             | Required       |
    | `collection_name`      | Name for the vector collection.              | `mem0`         |
    | `embedding_model_dims` | Embedding model dimensions.                  | `1536`         |
    | `hnsw`                 | Enables HNSW indexing.                       | `False`        |
    | `sslmode`              | PostgreSQL SSL mode. Use `require` for Neon. | Driver default |
  </Tab>

  <Tab title="TypeScript">
    Use the Neon `DATABASE_URL` directly with `connectionString`. Set `ssl` if your runtime needs an explicit TLS config object.

    | Parameter            | Description                                    | Default        |
    | -------------------- | ---------------------------------------------- | -------------- |
    | `connectionString`   | Neon Postgres connection string.               | Required       |
    | `ssl`                | Optional TLS settings passed directly to `pg`. | Driver default |
    | `collectionName`     | Name for the vector collection.                | `memories`     |
    | `dimension`          | Vector dimension for Mem0 config.              | Auto-detected  |
    | `embeddingModelDims` | Embedding model dimensions for table creation. | Required       |
    | `hnsw`               | Enables HNSW indexing.                         | `false`        |

    **TLS note:** `ssl: true` is sufficient for most Neon connections since Neon uses valid certificates. Use `ssl: { rejectUnauthorized: false }` only when connecting through Neon's connection pooler on certain edge runtimes (e.g. Cloudflare Workers) that require it, or when your environment does not trust the Neon CA chain.
  </Tab>
</Tabs>

### Indexing

The `pgvector` provider can create an HNSW index for faster vector search.

* Set `hnsw` to `true` to enable a Hierarchical Navigable Small World index.
* Leave `hnsw` as `false` if you want to create or manage indexes yourself.

### Similarity Search

The `pgvector` provider uses cosine similarity for vector search. Make sure your
embedding dimensions match the configured `embedding_model_dims` value.

### Best Practices

1. **Index Selection**:
   * Use `hnsw` for faster search performance when memory usage is not a constraint
   * Manage indexes manually if you need a different pgvector index strategy

2. **Connection String**:
   * Always use environment variables or even better, a secret manager for sensitive information in the connection string
   * Format: `postgresql://user:password@host:port/database`
