jev-memory-selector

September 18, 2026 ยท View on GitHub

Filters memories an agent already retrieved, so only what fits the budget is sent.

Author: Pinuts. MIT license.

Stack: Python 3.10+, HTTP, MCP stdio, Docker, HTML demo.

After jev-memory serve: demo

Local, no keys

git clone https://github.com/Pinutss/jev-memory-selector
cd jev-memory-selector
uv sync
uv run jev-memory demo
uv run jev-memory serve

No agent and no LLM are required. JEV_PROVIDER=auto (the default) stays on the local heuristic. If JEV and a gateway are configured, they are used as the judge. Docker:

docker compose up

Cursor and Hermes plugin

This repository is an Agent Plugin. Cursor and Hermes can install it directly.

Hermes

hermes plugins install Pinutss/jev-memory-selector --enable

Cursor

Install from the JEV plugins marketplace, or copy this folder to ~/.cursor/plugins/local/jev-memory-selector.

One tool: memory_select. Pass query + memories. Keys stay in the process environment, not in the call.

Requires uv. JEV_PROVIDER defaults to local.

Hermes and OpenClaw

Yes, locally. The MCP process does not need JEV or a gateway:

uv run jev-memory mcp

One tool: memory_select. Pass query + memories. Keys stay in the process environment, not in the call.

Hermes (~/.hermes/config.yaml):

mcp_servers:
  jev-memory:
    command: uv
    args: ["run", "--directory", "/path/to/jev-memory-selector", "jev-memory", "mcp"]
    env:
      JEV_PROVIDER: local

Then hermes mcp test jev-memory and /reload-mcp.

OpenClaw (~/.openclaw/openclaw.json, or Settings > MCP > Stdio):

{
  "mcp": {
    "servers": {
      "jev-memory": {
        "command": "uv",
        "args": ["run", "--directory", "/path/to/jev-memory-selector", "jev-memory", "mcp"],
        "env": { "JEV_PROVIDER": "local" }
      }
    }
  }
}

Python

from jev_memory_selector import MemorySelector

result = MemorySelector(provider="local").select(
    query="How does my backend work?",
    memories=[{"id": "1", "content": "Backend FastAPI"}],
    max_memories=8,
    max_tokens=3000,
)
print(result.texts)

JEV + gateway (optional)

If you wire the cloud later, two keys are enough: JEV_API_KEY / JEV_BASE_URL, and your gateway (GATEWAY_API_KEY, GATEWAY_BASE_URL, GATEWAY_MODEL). No OpenAI / Anthropic / Gemini key in this repo.

If you have several LLMs or a multi-model key (OpenRouter, Groq), pick the judge model with jev-model-router, then set GATEWAY_* to that endpoint. Keys stay in the environment, never in the request body.

cp .env.example .env

JEV_PROVIDER=jev will not start if either side is missing. With auto, missing keys just keep the local heuristic.

HTTP

uv run jev-memory serve

GET /healthz, POST /v1/select. Binds 127.0.0.1. The body must not contain keys.

Limits

The default counter is about 4 characters per token. In local mode, ranking is lexical. Scope isolates lists, it is not auth. No store, no PyPI yet.

docs/vision.md is a long-term target, not the current contract.