Skip to main content

README.md

# MnemosyneZvex

A [Mnemosyne](https://github.com/edlontech/mnemosyne) `GraphBackend` backed by
[Zvex](https://github.com/edlontech/zvex), an in-process vector database, plus
a DETS sidecar for typed links and mutable per-node metadata.

## Installation

```elixir
def deps do
  [
    {:mnemosyne_zvex, "~> 0.1.0"} # x-release-please-version
  ]
end
```

## Usage

```elixir
# Configure Mnemosyne's shared adapters once in your supervisor
children = [
  {Mnemosyne.Supervisor,
    config: %Mnemosyne.Config{
      llm: %{model: "gpt-4o", opts: %{}},
      embedding: %{model: "text-embedding-3-small", opts: %{}}
    },
    llm: MyApp.LLMAdapter,
    embedding: MyApp.EmbeddingAdapter}
]

# Then open a repo backed by MnemosyneZvex
{:ok, _pid} =
  Mnemosyne.open_repo("my-project",
    backend: {MnemosyneZvex.Backend,
      path: "/var/data/mnemosyne/my-project",
      dimension: 1536}
  )

# Use Mnemosyne normally
{:ok, session} = Mnemosyne.start_session("Help user plan a trip", repo: "my-project")
:ok = Mnemosyne.append(session, "User says they want to visit Tokyo", "Asking dates")
:ok = Mnemosyne.close_and_commit(session)

{:ok, memories} = Mnemosyne.recall("my-project", "What does the user want?")
```

## Options

| Option | Required | Default | Description |
|---|---|---|---|
| `:path` | yes || Directory under which `zvex/` and `sidecar.dets` will live |
| `:dimension` | yes || Embedding dimension (must match your `embedding` adapter) |
| `:index` | no | `:hnsw` | Vector index type: `:hnsw`, `:ivf`, or `:flat` |
| `:metric` | no | `:cosine` | Distance metric: `:cosine`, `:l2`, or `:ip` |
| `:index_opts` | no | `[m: 16, ef_construction: 200]` | Index-specific parameters |
| `:fetch_multiplier` | no | `3` | Over-fetch factor for value function reranking |