Skip to main content

OpenAI-Compatible Provider

Claude-mem can run observation extraction against any endpoint that speaks the OpenAI /chat/completions shape. Set CLAUDE_MEM_PROVIDER to openai-compatible, pick a preset (or supply a base URL), and memory runs entirely off your Claude plan.
claude-mem observer: choosing the claude-mem observer during npx claude-mem install runs memory off-plan with nothing to configure. This page is for bringing your own endpoint and key.

Why this is separate from the OpenRouter provider

CLAUDE_MEM_OPENROUTER_BASE_URL already lets the OpenRouter client talk to any OpenAI-compatible endpoint, and it keeps working — nothing on that path changed. But it carries three things that belong to openrouter.ai specifically:
  • Attribution headers. HTTP-Referer and X-Title are sent to whatever host the base URL names, so pointing it at NVIDIA announces claude-mem’s OpenRouter identity to NVIDIA.
  • usage: { include: true }, gated on the URL containing openrouter.ai.
  • The cmem.ai gateway’s credential-pinning rules, which decide when a persisted base URL pins a persisted key. Those rules exist so an account-delivered gateway credential is never sent somewhere else — correct, and irrelevant to an endpoint you configured yourself, but you still share the same three settings keys with them.
This provider has its own settings keys and sends a deliberately plain request body: model, messages, temperature, max_tokens, and nothing else. Strict servers (vLLM in particular) reject unknown fields. max_tokens is CLAUDE_MEM_OBSERVER_MAX_OUTPUT_TOKENS (4096 by default); a model that only accepts max_completion_tokens gets the request again with that field. A claude-mem observer key (cm_pro_…) is never sent to these endpoints. Use the key the endpoint issued.

Quick start: NVIDIA NIM

1

Get a key

Sign in at build.nvidia.com and create an API key. It starts with nvapi-. NVIDIA’s hosted models are free to start, which suits observation extraction: it is high-volume and structured, and does not need a frontier model.
2

Point claude-mem at it

Or keep the key out of settings.json and put it in ~/.claude-mem/.env:
3

Pick a model (optional)

The preset defaults to a small, fast NVIDIA-served model. Any model id from build.nvidia.com works and is passed verbatim:
4

Restart the worker

Presets

A preset only supplies a default base URL and a default model. Anything it sets is overridden by the matching setting, so switching preset never moves an endpoint or model you pinned yourself.
Local presets need a model id — claude-mem cannot guess which model you loaded. Set CLAUDE_MEM_OPENAI_COMPAT_MODEL to whatever ollama list (or your server) reports, or the provider reports itself unconfigured and dispatch falls through to Claude.

OpenCode Go and Zen

An OpenCode Go subscription or Zen key works here. opencode-go defaults to kimi-k3; opencode-zen ships no default, so set the model too. Pick ids from https://opencode.ai/zen/go/v1/models or https://opencode.ai/zen/v1/models. Only models served on /chat/completions work.

Settings

An unknown preset id degrades to custom rather than failing, because settings are read during status polling and a typo should not crash a poll. The viewer’s Settings → Advanced panel edits the provider, preset, base URL and model. The API key is set in ~/.claude-mem/settings.json or ~/.claude-mem/.env only, never through the viewer.

MiniMax

minimax is MiniMax’s global endpoint and minimax-cn the mainland-China one; use the preset that matches where your account lives. Both default to MiniMax-M3. Any model id MiniMax serves is passed verbatim:
Reasoning models such as the M2 family can open their reply with a <think>…</think> block. claude-mem removes a leading block like that on every preset (it also covers DeepSeek R1 or Qwen3 on Ollama and vLLM), so the reasoning is never stored or re-sent with the next request.

iFlytek Spark

iflytek points at iFlytek’s Astron MaaS platform and defaults to spark-x2.5. Keys come from the MaaS console. The preset’s base URL is the pay-as-you-go endpoint; a Token Plan key is only accepted on the Token Plan endpoint, so set the base URL as well:
A key used on the other endpoint is rejected with a 403 (11200). spark-x2.5 returns its reasoning in a separate reasoning_content field, which claude-mem ignores, so only the answer is stored.

Any other endpoint

When a key is required

Setting CLAUDE_MEM_OPENAI_COMPAT_BASE_URL replaces the preset’s endpoint, so whether a key is needed is decided by the endpoint you pointed at, not by the preset name you started from: Without an override, the preset decides — the hosted presets need a key, the local ones do not. A remote endpoint that genuinely needs no authentication still works: set CLAUDE_MEM_OPENAI_COMPAT_API_KEY to any non-empty value. The default errs toward asking for a key because the alternative is a provider that reports itself ready and then fails every observation with a 401.

OrcaRouter

OrcaRouter serves provider-scoped model ids, such as openai/gpt-4o-mini (the preset’s default) or anthropic/claude-haiku-4.5, behind one sk-orca- key. Its model list is public at https://api.orcarouter.ai/v1/models.

API Route

API Route uses the api-route preset with an API Route key. It has no default model: set CLAUDE_MEM_OPENAI_COMPAT_MODEL to an exact model id available to your account on https://global.api-route.com/v1/models. Choose a model served on /chat/completions; the id is passed verbatim.
Alternatively, store the key as OPENAI_COMPAT_API_KEY in ~/.claude-mem/.env. Restart the worker after changing the configuration. Without a model or key, this provider is unconfigured and dispatch falls through to Claude.

Opper

Opper is an EU-hosted gateway with one OpenAI-compatible API and one key for 700+ models. Model ids are pooled names such as gpt-5.4-mini (the preset’s default) or claude-haiku-4-5, and Opper picks the route per request. A provider/model id such as aws/claude-haiku-4-5-eu pins one provider and region. The catalogue is public at https://api.opper.ai/v3/models, and keys come from platform.opper.ai.

Atlas Cloud

Atlas Cloud serves models from DeepSeek, Z.ai, Moonshot, Qwen and other vendors behind one OpenAI-compatible API key. Model ids are vendor-prefixed, such as deepseek-ai/deepseek-v4-flash (the preset’s default) or zai-org/glm-5.3, and are passed verbatim. The model list is public at https://api.atlascloud.ai/v1/models, and keys come from console.atlascloud.ai.

Troubleshooting

Memory silently runs on Claude instead. Dispatch falls through to Claude when the provider is selected but not fully configured — a missing base URL, a missing model, or a missing key on a preset that needs one. That fall-through is deliberate: a half-configured endpoint should not fail every observation. Check npx claude-mem doctor. 404 from the endpoint. Almost always a wrong base URL or a model the endpoint does not serve; the error names both settings. Note that some gateways prefix model ids differently from the vendor’s own docs. Repeated timeouts. Requests are streamed, so a request is given up only after 90 seconds with no token and no keep-alive from the endpoint, or after 300 seconds in total. A self-hosted endpoint that queues requests behind a load balancer spends that queue wait silent, so the wait reads as idle; raise CLAUDE_MEM_LLM_STREAM_IDLE_TIMEOUT_MS past it. CLAUDE_MEM_LLM_TIMEOUT_MS does not apply to streamed requests; it is the deadline only for an endpoint that refuses streaming (a 400 naming stream or stream_options), which claude-mem then calls non-streamed for the rest of the worker’s life. If requests keep timing out, prefer a small, fast model: observation extraction is a high-volume structured task, not a reasoning benchmark. Empty or cut-off observations. A model that will not hold to the output schema produces nothing usable. Small instruct-tuned models generally do better here than reasoning models, whose thinking output tends to crowd out the structured reply. When the log says a reply was cut off at the output-token limit, raise CLAUDE_MEM_OBSERVER_MAX_OUTPUT_TOKENS.