From b717e38785dd8bcc6542ad88212ffca33f573f10 Mon Sep 17 00:00:00 2001 From: Kartik Date: Mon, 24 Aug 2026 19:21:23 +0530 Subject: [PATCH] refactor(integrations): rename dsh-mem0 to deepseek-plugin, strands-mem0 to mem0-strands (#7098) --- .github/AGENTS.md | 8 ++--- .github/workflows/ci-gate.yml | 34 +++++++++---------- ...dsh-mem0-cd.yml => deepseek-plugin-cd.yml} | 14 ++++---- ...-checks.yml => deepseek-plugin-checks.yml} | 28 +++++++-------- ...trands-mem0-cd.yml => mem0-strands-cd.yml} | 16 ++++----- ...em0-checks.yml => mem0-strands-checks.yml} | 24 ++++++------- .github/workflows/release.yml | 4 +-- .gitignore | 2 +- docs/changelog/highlights.mdx | 6 ++-- docs/changelog/sdk.mdx | 10 +++--- docs/docs.json | 2 +- .../{dsh-mem0.mdx => deepseek-plugin.mdx} | 12 +++---- docs/integrations/strands.mdx | 8 ++--- docs/llms.txt | 2 +- integrations/AGENTS.md | 10 +++--- .../{dsh-mem0 => deepseek-plugin}/.npmrc | 0 .../{dsh-mem0 => deepseek-plugin}/LICENSE | 0 .../{dsh-mem0 => deepseek-plugin}/README.md | 8 ++--- .../cordis.example.yml | 6 ++-- .../package.json | 4 +-- .../pnpm-lock.yaml | 0 .../src/formatting.ts | 0 .../src/index.ts | 6 ++-- .../src/output.ts | 0 .../src/scoping.ts | 0 .../tests/apply.test.ts | 0 .../tests/formatting.test.ts | 0 .../tests/output.test.ts | 0 .../tests/scoping.test.ts | 0 .../tsconfig.json | 0 .../tsup.config.ts | 0 .../{strands-mem0 => mem0-strands}/.gitignore | 0 .../{strands-mem0 => mem0-strands}/LICENSE | 0 .../{strands-mem0 => mem0-strands}/NOTICE | 2 +- .../{strands-mem0 => mem0-strands}/README.md | 8 ++--- .../python/README.md | 10 +++--- .../python/pyproject.toml | 6 ++-- .../python/src/mem0_strands}/__init__.py | 6 ++-- .../python/src/mem0_strands}/client.py | 6 ++-- .../python/src/mem0_strands}/py.typed | 0 .../python/src/mem0_strands}/store.py | 6 ++-- .../python/tests/test_client.py | 2 +- .../python/tests/test_store.py | 4 +-- 43 files changed, 127 insertions(+), 127 deletions(-) rename .github/workflows/{dsh-mem0-cd.yml => deepseek-plugin-cd.yml} (74%) rename .github/workflows/{dsh-mem0-checks.yml => deepseek-plugin-checks.yml} (58%) rename .github/workflows/{strands-mem0-cd.yml => mem0-strands-cd.yml} (69%) rename .github/workflows/{strands-mem0-checks.yml => mem0-strands-checks.yml} (69%) rename docs/integrations/{dsh-mem0.mdx => deepseek-plugin.mdx} (81%) rename integrations/{dsh-mem0 => deepseek-plugin}/.npmrc (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/LICENSE (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/README.md (93%) rename integrations/{dsh-mem0 => deepseek-plugin}/cordis.example.yml (72%) rename integrations/{dsh-mem0 => deepseek-plugin}/package.json (93%) rename integrations/{dsh-mem0 => deepseek-plugin}/pnpm-lock.yaml (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/src/formatting.ts (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/src/index.ts (95%) rename integrations/{dsh-mem0 => deepseek-plugin}/src/output.ts (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/src/scoping.ts (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/tests/apply.test.ts (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/tests/formatting.test.ts (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/tests/output.test.ts (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/tests/scoping.test.ts (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/tsconfig.json (100%) rename integrations/{dsh-mem0 => deepseek-plugin}/tsup.config.ts (100%) rename integrations/{strands-mem0 => mem0-strands}/.gitignore (100%) rename integrations/{strands-mem0 => mem0-strands}/LICENSE (100%) rename integrations/{strands-mem0 => mem0-strands}/NOTICE (95%) rename integrations/{strands-mem0 => mem0-strands}/README.md (96%) rename integrations/{strands-mem0 => mem0-strands}/python/README.md (77%) rename integrations/{strands-mem0 => mem0-strands}/python/pyproject.toml (96%) rename integrations/{strands-mem0/python/src/strands_mem0 => mem0-strands/python/src/mem0_strands}/__init__.py (85%) rename integrations/{strands-mem0/python/src/strands_mem0 => mem0-strands/python/src/mem0_strands}/client.py (97%) rename integrations/{strands-mem0/python/src/strands_mem0 => mem0-strands/python/src/mem0_strands}/py.typed (100%) rename integrations/{strands-mem0/python/src/strands_mem0 => mem0-strands/python/src/mem0_strands}/store.py (98%) rename integrations/{strands-mem0 => mem0-strands}/python/tests/test_client.py (99%) rename integrations/{strands-mem0 => mem0-strands}/python/tests/test_store.py (98%) diff --git a/.github/AGENTS.md b/.github/AGENTS.md index e3c5ceaf1..57b17e4c2 100644 --- a/.github/AGENTS.md +++ b/.github/AGENTS.md @@ -21,10 +21,10 @@ Package workflows keep their own push-to-main and manual triggers. Their `pull_r | Mem0 Plugin | `mem0-plugin-checks.yml` | Push to main (`integrations/mem0-plugin/`, excluding `.opencode-plugin/`), manual | pytest + hook exec bits + JSON manifest validation on Python 3.10, 3.11, 3.12 | | OpenCode Plugin | `opencode-plugin-checks.yml` | Push to main (`.opencode-plugin/`), manual | Bun: tsc + build + dist artifact check | | Pi Agent Plugin | `pi-agent-plugin-checks.yml` | Push to main (`integrations/pi-agent-plugin/`), manual | tsc + vitest + tsup on Node 20, 22 | -| DeepSeek Harness Plugin | `dsh-mem0-checks.yml` | Push to main (`integrations/dsh-mem0/`), manual | tsc + vitest + tsup on Node 20, 22 | +| DeepSeek Harness Plugin | `deepseek-plugin-checks.yml` | Push to main (`integrations/deepseek-plugin/`), manual | tsc + vitest + tsup on Node 20, 22 | | n8n Node | `n8n-nodes-mem0-checks.yml` | Push to main (`integrations/n8n-nodes-mem0/`), manual | ESLint + tsc build on Node 20 | | Zapier App | `zapier-mem0-checks.yml` | Push to main (`integrations/zapier-mem0/`), manual | tsc + `zapier validate` + offline unit tests on Node 22 | -| strands-mem0 | `strands-mem0-checks.yml` | Push to main (`integrations/strands-mem0/`), manual | Ruff + mypy + pytest + hatch build on Python 3.10, 3.11, 3.12 | +| mem0-strands | `mem0-strands-checks.yml` | Push to main (`integrations/mem0-strands/`), manual | Ruff + mypy + pytest + hatch build on Python 3.10, 3.11, 3.12 | | docs llms.txt | `docs-llms-txt-check.yml` | Manual | `docs/llms.txt` coverage | | GitHub Scripts | inline in `ci-gate.yml` | none | `node` over every `.github/scripts/*.test.js` | @@ -60,9 +60,9 @@ Requiring `CI Gate` also means fork PRs from first-time contributors cannot merg | OpenClaw | `openclaw-cd.yml` | `openclaw-v*` | npm (`@mem0/openclaw-mem0`) | | OpenCode Plugin | `opencode-plugin-cd.yml` | `opencode-v*` | npm (`@mem0/opencode-plugin`) | | Pi Agent Plugin | `pi-agent-plugin-cd.yml` | `pi-agent-v*` | npm (`@mem0/pi-agent-plugin`) | -| DeepSeek Harness Plugin | `dsh-mem0-cd.yml` | `dsh-mem0-v*` | npm (`@mem0/dsh-mem0`) | +| DeepSeek Harness Plugin | `deepseek-plugin-cd.yml` | `deepseek-plugin-v*` | npm (`@mem0/deepseek-plugin`) | | n8n Node | `n8n-nodes-mem0-cd.yml` | `n8n-nodes-mem0-v*` | npm (`@mem0/n8n-nodes-mem0`) | -| strands-mem0 | `strands-mem0-cd.yml` | `strands-mem0-v*` | PyPI (`strands-mem0`) | +| mem0-strands | `mem0-strands-cd.yml` | `mem0-strands-v*` | PyPI (`mem0-strands`) | - Package CD workflows are `workflow_dispatch`-only, with `tag` and `prerelease` inputs. They check out and build the given tag. - All publishing uses **OIDC trusted publishing**. No tokens, no secrets. diff --git a/.github/workflows/ci-gate.yml b/.github/workflows/ci-gate.yml index 93a2c755d..cf32c083c 100644 --- a/.github/workflows/ci-gate.yml +++ b/.github/workflows/ci-gate.yml @@ -41,10 +41,10 @@ jobs: mem0_plugin: ${{ steps.filter.outputs.mem0_plugin }} opencode_plugin: ${{ steps.filter.outputs.opencode_plugin }} pi_agent_plugin: ${{ steps.filter.outputs.pi_agent_plugin }} - dsh_mem0: ${{ steps.filter.outputs.dsh_mem0 }} + deepseek_plugin: ${{ steps.filter.outputs.deepseek_plugin }} n8n_nodes_mem0: ${{ steps.filter.outputs.n8n_nodes_mem0 }} zapier_mem0: ${{ steps.filter.outputs.zapier_mem0 }} - strands_mem0: ${{ steps.filter.outputs.strands_mem0 }} + mem0_strands: ${{ steps.filter.outputs.mem0_strands }} docs_llms_txt: ${{ steps.filter.outputs.docs_llms_txt }} github_scripts: ${{ steps.filter.outputs.github_scripts }} steps: @@ -90,9 +90,9 @@ jobs: - 'integrations/pi-agent-plugin/**' - '.github/workflows/pi-agent-plugin-checks.yml' - '.github/workflows/ci-gate.yml' - dsh_mem0: - - 'integrations/dsh-mem0/**' - - '.github/workflows/dsh-mem0-checks.yml' + deepseek_plugin: + - 'integrations/deepseek-plugin/**' + - '.github/workflows/deepseek-plugin-checks.yml' - '.github/workflows/ci-gate.yml' n8n_nodes_mem0: - 'integrations/n8n-nodes-mem0/**' @@ -101,9 +101,9 @@ jobs: - 'integrations/zapier-mem0/**' - '.github/workflows/zapier-mem0-checks.yml' - '.github/workflows/ci-gate.yml' - strands_mem0: - - 'integrations/strands-mem0/**' - - '.github/workflows/strands-mem0-checks.yml' + mem0_strands: + - 'integrations/mem0-strands/**' + - '.github/workflows/mem0-strands-checks.yml' - '.github/workflows/ci-gate.yml' docs_llms_txt: - 'docs/**/*.mdx' @@ -176,11 +176,11 @@ jobs: uses: ./.github/workflows/pi-agent-plugin-checks.yml secrets: inherit - dsh-mem0: + deepseek-plugin: name: DeepSeek Harness Plugin needs: changes - if: needs.changes.outputs.dsh_mem0 == 'true' - uses: ./.github/workflows/dsh-mem0-checks.yml + if: needs.changes.outputs.deepseek_plugin == 'true' + uses: ./.github/workflows/deepseek-plugin-checks.yml secrets: inherit n8n-nodes-mem0: @@ -195,11 +195,11 @@ jobs: uses: ./.github/workflows/zapier-mem0-checks.yml secrets: inherit - strands-mem0: - name: strands-mem0 + mem0-strands: + name: mem0-strands needs: changes - if: needs.changes.outputs.strands_mem0 == 'true' - uses: ./.github/workflows/strands-mem0-checks.yml + if: needs.changes.outputs.mem0_strands == 'true' + uses: ./.github/workflows/mem0-strands-checks.yml secrets: inherit docs-llms-txt: @@ -239,10 +239,10 @@ jobs: - mem0-plugin - opencode-plugin - pi-agent-plugin - - dsh-mem0 + - deepseek-plugin - n8n-nodes-mem0 - zapier-mem0 - - strands-mem0 + - mem0-strands - docs-llms-txt - github-scripts if: always() diff --git a/.github/workflows/dsh-mem0-cd.yml b/.github/workflows/deepseek-plugin-cd.yml similarity index 74% rename from .github/workflows/dsh-mem0-cd.yml rename to .github/workflows/deepseek-plugin-cd.yml index 68021fc9d..aa2d43af6 100644 --- a/.github/workflows/dsh-mem0-cd.yml +++ b/.github/workflows/deepseek-plugin-cd.yml @@ -1,13 +1,13 @@ -name: Publish @mem0/dsh-mem0 📦 to npm +name: Publish @mem0/deepseek-plugin 📦 to npm # Dispatched by release.yml (Release Router) when a release tagged -# dsh-mem0-v* is published. Can also be dispatched manually to re-publish +# deepseek-plugin-v* is published. Can also be dispatched manually to re-publish # a tag. on: workflow_dispatch: inputs: tag: - description: 'Release tag to build and publish (e.g. dsh-mem0-v0.1.1)' + description: 'Release tag to build and publish (e.g. deepseek-plugin-v0.1.1)' required: true type: string prerelease: @@ -18,14 +18,14 @@ on: jobs: build-n-publish: - name: Build and publish @mem0/dsh-mem0 📦 to npm - if: startsWith(inputs.tag, 'dsh-mem0-v') + name: Build and publish @mem0/deepseek-plugin 📦 to npm + if: startsWith(inputs.tag, 'deepseek-plugin-v') runs-on: ubuntu-latest permissions: id-token: write defaults: run: - working-directory: integrations/dsh-mem0 + working-directory: integrations/deepseek-plugin steps: - uses: actions/checkout@v4 with: @@ -42,7 +42,7 @@ jobs: node-version: '22' registry-url: 'https://registry.npmjs.org' cache: 'pnpm' - cache-dependency-path: integrations/dsh-mem0/pnpm-lock.yaml + cache-dependency-path: integrations/deepseek-plugin/pnpm-lock.yaml - name: Install dependencies run: pnpm install --frozen-lockfile diff --git a/.github/workflows/dsh-mem0-checks.yml b/.github/workflows/deepseek-plugin-checks.yml similarity index 58% rename from .github/workflows/dsh-mem0-checks.yml rename to .github/workflows/deepseek-plugin-checks.yml index a81997982..ecaeb6da6 100644 --- a/.github/workflows/dsh-mem0-checks.yml +++ b/.github/workflows/deepseek-plugin-checks.yml @@ -1,4 +1,4 @@ -name: dsh-mem0 checks +name: deepseek-plugin checks # On PRs this is invoked by ci-gate.yml (the single required check); # push-to-main and manual runs remain standalone. @@ -7,8 +7,8 @@ on: push: branches: [main] paths: - - 'integrations/dsh-mem0/**' - - '.github/workflows/dsh-mem0-checks.yml' + - 'integrations/deepseek-plugin/**' + - '.github/workflows/deepseek-plugin-checks.yml' workflow_call: jobs: @@ -27,13 +27,13 @@ jobs: with: node-version: 20 cache: 'pnpm' - cache-dependency-path: integrations/dsh-mem0/pnpm-lock.yaml + cache-dependency-path: integrations/deepseek-plugin/pnpm-lock.yaml - name: Install dependencies - run: cd integrations/dsh-mem0 && pnpm install --frozen-lockfile + run: cd integrations/deepseek-plugin && pnpm install --frozen-lockfile - name: Type check - run: cd integrations/dsh-mem0 && pnpm exec tsc --noEmit + run: cd integrations/deepseek-plugin && pnpm exec tsc --noEmit test: runs-on: ubuntu-latest @@ -53,13 +53,13 @@ jobs: with: node-version: ${{ matrix.node-version }} cache: 'pnpm' - cache-dependency-path: integrations/dsh-mem0/pnpm-lock.yaml + cache-dependency-path: integrations/deepseek-plugin/pnpm-lock.yaml - name: Install dependencies - run: cd integrations/dsh-mem0 && pnpm install --frozen-lockfile + run: cd integrations/deepseek-plugin && pnpm install --frozen-lockfile - name: Run tests - run: cd integrations/dsh-mem0 && pnpm exec vitest run + run: cd integrations/deepseek-plugin && pnpm exec vitest run build: runs-on: ubuntu-latest @@ -76,15 +76,15 @@ jobs: with: node-version: 20 cache: 'pnpm' - cache-dependency-path: integrations/dsh-mem0/pnpm-lock.yaml + cache-dependency-path: integrations/deepseek-plugin/pnpm-lock.yaml - name: Install dependencies - run: cd integrations/dsh-mem0 && pnpm install --frozen-lockfile + run: cd integrations/deepseek-plugin && pnpm install --frozen-lockfile - name: Build - run: cd integrations/dsh-mem0 && pnpm build + run: cd integrations/deepseek-plugin && pnpm build - name: Verify dist output exists run: | - test -f integrations/dsh-mem0/dist/index.js || (echo "Build output missing: dist/index.js" && exit 1) - test -f integrations/dsh-mem0/dist/index.d.ts || (echo "Build output missing: dist/index.d.ts" && exit 1) + test -f integrations/deepseek-plugin/dist/index.js || (echo "Build output missing: dist/index.js" && exit 1) + test -f integrations/deepseek-plugin/dist/index.d.ts || (echo "Build output missing: dist/index.d.ts" && exit 1) diff --git a/.github/workflows/strands-mem0-cd.yml b/.github/workflows/mem0-strands-cd.yml similarity index 69% rename from .github/workflows/strands-mem0-cd.yml rename to .github/workflows/mem0-strands-cd.yml index ee80101a1..626c75fb8 100644 --- a/.github/workflows/strands-mem0-cd.yml +++ b/.github/workflows/mem0-strands-cd.yml @@ -1,15 +1,15 @@ -name: Publish strands-mem0 🐍 distribution 📦 to PyPI +name: Publish mem0-strands 🐍 distribution 📦 to PyPI # Dispatched by release.yml (Release Router) when a release tagged -# strands-mem0-v* is published. Can also be dispatched manually to re-publish +# mem0-strands-v* is published. Can also be dispatched manually to re-publish # a tag. Publishing uses PyPI Trusted Publishing (OIDC), so no API token is -# stored; the `strands-mem0` PyPI project must have a trusted publisher +# stored; the `mem0-strands` PyPI project must have a trusted publisher # configured for mem0ai/mem0 + this workflow. on: workflow_dispatch: inputs: tag: - description: 'Release tag to build and publish (e.g. strands-mem0-v0.1.0)' + description: 'Release tag to build and publish (e.g. mem0-strands-v0.1.0)' required: true type: string prerelease: @@ -20,14 +20,14 @@ on: jobs: build-n-publish: - name: Build and publish strands-mem0 📦 to PyPI - if: startsWith(inputs.tag, 'strands-mem0-v') + name: Build and publish mem0-strands 📦 to PyPI + if: startsWith(inputs.tag, 'mem0-strands-v') runs-on: ubuntu-latest permissions: id-token: write defaults: run: - working-directory: integrations/strands-mem0/python + working-directory: integrations/mem0-strands/python steps: - uses: actions/checkout@v4 with: @@ -47,4 +47,4 @@ jobs: - name: Publish distribution 📦 to PyPI uses: pypa/gh-action-pypi-publish@release/v1 with: - packages-dir: integrations/strands-mem0/python/dist/ + packages-dir: integrations/mem0-strands/python/dist/ diff --git a/.github/workflows/strands-mem0-checks.yml b/.github/workflows/mem0-strands-checks.yml similarity index 69% rename from .github/workflows/strands-mem0-checks.yml rename to .github/workflows/mem0-strands-checks.yml index 2a45d80b5..feb958899 100644 --- a/.github/workflows/strands-mem0-checks.yml +++ b/.github/workflows/mem0-strands-checks.yml @@ -1,4 +1,4 @@ -name: strands-mem0 CI +name: mem0-strands CI # On PRs this is invoked by ci-gate.yml (the single required check); # push-to-main and manual runs remain standalone. @@ -7,8 +7,8 @@ on: push: branches: [main] paths: - - 'integrations/strands-mem0/**' - - '.github/workflows/strands-mem0-checks.yml' + - 'integrations/mem0-strands/**' + - '.github/workflows/mem0-strands-checks.yml' workflow_call: jobs: @@ -23,19 +23,19 @@ jobs: python-version: '3.12' - name: Install dev dependencies - working-directory: integrations/strands-mem0/python + working-directory: integrations/mem0-strands/python run: pip install -e ".[dev]" - name: Lint with ruff - working-directory: integrations/strands-mem0/python + working-directory: integrations/mem0-strands/python run: ruff check . - name: Check formatting - working-directory: integrations/strands-mem0/python + working-directory: integrations/mem0-strands/python run: ruff format --check . - name: Type-check with mypy - working-directory: integrations/strands-mem0/python + working-directory: integrations/mem0-strands/python run: mypy src test: @@ -52,11 +52,11 @@ jobs: python-version: ${{ matrix.python-version }} - name: Install dev dependencies - working-directory: integrations/strands-mem0/python + working-directory: integrations/mem0-strands/python run: pip install -e ".[dev]" - name: Run tests - working-directory: integrations/strands-mem0/python + working-directory: integrations/mem0-strands/python run: pytest build: @@ -73,10 +73,10 @@ jobs: run: pip install hatch - name: Build - working-directory: integrations/strands-mem0/python + working-directory: integrations/mem0-strands/python run: hatch build --clean - name: Verify dist output run: | - ls integrations/strands-mem0/python/dist/*.whl || (echo "Wheel file missing" && exit 1) - ls integrations/strands-mem0/python/dist/*.tar.gz || (echo "Source dist missing" && exit 1) + ls integrations/mem0-strands/python/dist/*.whl || (echo "Wheel file missing" && exit 1) + ls integrations/mem0-strands/python/dist/*.tar.gz || (echo "Source dist missing" && exit 1) diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 50e76ea5e..0cbb086e4 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -45,9 +45,9 @@ jobs: openclaw-v*) workflow="openclaw-cd.yml" ;; opencode-v*) workflow="opencode-plugin-cd.yml" ;; pi-agent-v*) workflow="pi-agent-plugin-cd.yml" ;; - dsh-mem0-v*) workflow="dsh-mem0-cd.yml" ;; + deepseek-plugin-v*) workflow="deepseek-plugin-cd.yml" ;; n8n-nodes-mem0-v*) workflow="n8n-nodes-mem0-cd.yml" ;; - strands-mem0-v*) workflow="strands-mem0-cd.yml" ;; + mem0-strands-v*) workflow="mem0-strands-cd.yml" ;; v*) workflow="cd.yml" ;; *) echo "::error::Release tag '$TAG' does not match any known package prefix — nothing will be published. See the tag prefix table in AGENTS.md." diff --git a/.gitignore b/.gitignore index 133f6cae2..01ee55a0c 100644 --- a/.gitignore +++ b/.gitignore @@ -192,6 +192,6 @@ testing.ipynb .weave/ -# TypeScript incremental build info and local, uncommitted e2e scripts (used by the integrations, e.g. integrations/dsh-mem0) +# TypeScript incremental build info and local, uncommitted e2e scripts (used by the integrations, e.g. integrations/deepseek-plugin) *.tsbuildinfo *.local.mjs diff --git a/docs/changelog/highlights.mdx b/docs/changelog/highlights.mdx index dce7c16e5..5fd6c2575 100644 --- a/docs/changelog/highlights.mdx +++ b/docs/changelog/highlights.mdx @@ -8,14 +8,14 @@ mode: "wide" **DeepSeek Harness: Mem0 as a Native Cordis Plugin** -The DeepSeek Harness agent forgets everything between sessions. [`@mem0/dsh-mem0`](https://www.npmjs.com/package/@mem0/dsh-mem0) gives it two Mem0-backed tools, so recall and writes persist across runs against the same memory bank you already use from Claude Code, Codex, and every other connected agent. +The DeepSeek Harness agent forgets everything between sessions. [`@mem0/deepseek-plugin`](https://www.npmjs.com/package/@mem0/deepseek-plugin) gives it two Mem0-backed tools, so recall and writes persist across runs against the same memory bank you already use from Claude Code, Codex, and every other connected agent. - **Two agent-callable tools:** `search_memory` recalls facts relevant to a query, `add_memory` stores a fact for future sessions. Both accept per-call `userId` / `agentId` / `runId` scope overrides. - **Native Cordis lifecycle:** The plugin declares `inject = ['tools']` so it waits for the harness tool registry, then registers through `ctx.tools.register()`. Unmounting the plugin removes the tools automatically. - **Managed backend, not a memory file:** Server-side extraction, semantic dedup, and conflict resolution, rather than a Markdown file the agent has to maintain itself. - **Config:** `userId` is required, `apiKey` defaults to `$MEM0_API_KEY`, and `host` optionally targets a dedicated Mem0 Platform base URL. -See [DeepSeek Harness](/integrations/dsh-mem0) for setup and [SDK & Tools](/changelog/sdk) for PR links. +See [DeepSeek Harness](/integrations/deepseek-plugin) for setup and [SDK & Tools](/changelog/sdk) for PR links. Developer preview. Auto-capture and auto-recall, where memory reaches the context with no explicit tool call, are planned but not yet built. @@ -27,7 +27,7 @@ See [DeepSeek Harness](/integrations/dsh-mem0) for setup and [SDK & Tools](/chan **Strands Agents: Mem0 as a Native MemoryStore** -[`strands-mem0`](https://pypi.org/project/strands-mem0/) plugs Mem0 into AWS's [Strands Agents](https://strandsagents.com/) SDK as a native `MemoryStore`, so recall and writes happen inside the agent loop rather than as tool calls the model has to remember to make. +[`mem0-strands`](https://pypi.org/project/mem0-strands/) plugs Mem0 into AWS's [Strands Agents](https://strandsagents.com/) SDK as a native `MemoryStore`, so recall and writes happen inside the agent loop rather than as tool calls the model has to remember to make. - **Automatic recall:** The `MemoryManager` drives the store on every turn, searching Mem0 and injecting the results into the prompt with no tool call required. - **Server-side extraction:** Because the store implements `add_messages`, enabling extraction routes raw conversation turns straight to Mem0's extraction pipeline, skipping the extra client-side model call needed to distill facts first. diff --git a/docs/changelog/sdk.mdx b/docs/changelog/sdk.mdx index e5be4cb73..f97a07461 100644 --- a/docs/changelog/sdk.mdx +++ b/docs/changelog/sdk.mdx @@ -2841,9 +2841,9 @@ Existing memories written by the previous versions are not rewritten. If your me - + -**Initial release** of [`strands-mem0`](https://pypi.org/project/strands-mem0/), a native `MemoryStore` that plugs Mem0 into the [Strands Agents](https://strandsagents.com/) `MemoryManager` ([#7021](https://github.com/mem0ai/mem0/pull/7021)) +**Initial release** of [`mem0-strands`](https://pypi.org/project/mem0-strands/), a native `MemoryStore` that plugs Mem0 into the [Strands Agents](https://strandsagents.com/) `MemoryManager` ([#7021](https://github.com/mem0ai/mem0/pull/7021)) **New Features:** - **Automatic recall and injection:** `Mem0MemoryStore.search()` runs every turn through the `MemoryManager`, so relevant memories are searched and prepended to the prompt with no explicit tool call required. @@ -2863,9 +2863,9 @@ Existing memories written by the previous versions are not rewritten. If your me - + -**Initial release** of [`dsh-mem0`](https://www.npmjs.com/package/@mem0/dsh-mem0), a native DeepSeek Harness (Cordis) plugin that registers Mem0 as two agent-callable tools ([#7027](https://github.com/mem0ai/mem0/pull/7027)) +**Initial release** of [`deepseek-plugin`](https://www.npmjs.com/package/@mem0/deepseek-plugin), a native DeepSeek Harness (Cordis) plugin that registers Mem0 as two agent-callable tools ([#7027](https://github.com/mem0ai/mem0/pull/7027)) **New Features:** - **`search_memory`:** Recalls facts relevant to a query, with an optional `limit` (default 10) and per-call `userId` / `agentId` / `runId` scope overrides. @@ -2874,7 +2874,7 @@ Existing memories written by the previous versions are not rewritten. If your me - **Config:** `userId` is required; `apiKey` defaults to `$MEM0_API_KEY`; `host` optionally points at a dedicated Mem0 Platform base URL (not a switch to self-hosted Mem0 OSS). - Developer preview: auto-capture and auto-recall (memory injected into context automatically, without an explicit tool call) are planned but not yet built. The backend's `KNOWN_EVENT_SOURCES` allowlist also needs `"DEEPSEEK_HARNESS"` added before usage surfaces by name in telemetry rather than bucketing into "OTHERS". See [DeepSeek Harness](/integrations/dsh-mem0) for setup. + Developer preview: auto-capture and auto-recall (memory injected into context automatically, without an explicit tool call) are planned but not yet built. The backend's `KNOWN_EVENT_SOURCES` allowlist also needs `"DEEPSEEK_HARNESS"` added before usage surfaces by name in telemetry rather than bucketing into "OTHERS". See [DeepSeek Harness](/integrations/deepseek-plugin) for setup. diff --git a/docs/docs.json b/docs/docs.json index 1b914e263..6d2fc0123 100644 --- a/docs/docs.json +++ b/docs/docs.json @@ -383,7 +383,7 @@ "integrations/openclaw", "integrations/hermes", "integrations/pi-agent", - "integrations/dsh-mem0" + "integrations/deepseek-plugin" ] } ] diff --git a/docs/integrations/dsh-mem0.mdx b/docs/integrations/deepseek-plugin.mdx similarity index 81% rename from docs/integrations/dsh-mem0.mdx rename to docs/integrations/deepseek-plugin.mdx index 40d63ced1..12779e1a2 100644 --- a/docs/integrations/dsh-mem0.mdx +++ b/docs/integrations/deepseek-plugin.mdx @@ -3,7 +3,7 @@ title: DeepSeek Harness description: "Add persistent Mem0 memory to the DeepSeek Harness (Cordis) agent with two native tools: search and add." --- -Add persistent memory to the [**DeepSeek Harness**](https://github.com/deepseek-ai/deepseek-harness) with `@mem0/dsh-mem0`. The Harness agent forgets everything between sessions. This plugin gives it two Mem0-backed tools so recall and writes persist across runs, sharing the same memory bank you already use from Claude Code, Codex, and other agents. +Add persistent memory to the [**DeepSeek Harness**](https://github.com/deepseek-ai/deepseek-harness) with `@mem0/deepseek-plugin`. The Harness agent forgets everything between sessions. This plugin gives it two Mem0-backed tools so recall and writes persist across runs, sharing the same memory bank you already use from Claude Code, Codex, and other agents. ## Overview @@ -23,8 +23,8 @@ A Cordis plugin is a module exporting `apply(ctx, config)`. This one declares `i ## Prerequisites 1. A Mem0 Platform account and API key: - - Sign up at app.mem0.ai - - Get your API key (starts with `m0-`) + - Sign up at app.mem0.ai + - Get your API key (starts with `m0-`) 2. The DeepSeek Harness installed. @@ -46,14 +46,14 @@ source ~/.bashrc 1. Build the plugin: ```sh - cd integrations/dsh-mem0 + cd integrations/deepseek-plugin pnpm install pnpm build ``` 2. Point the Harness at it. Copy `cordis.example.yml`, set the absolute path to `dist/index.js` and your `userId`, then load it: ```sh - pnpm dsh web --patch ./integrations/dsh-mem0/cordis.example.yml + pnpm dsh web --patch ./integrations/deepseek-plugin/cordis.example.yml ``` 3. Open the web UI and ask the agent to remember something, then recall it in a later turn. @@ -65,7 +65,7 @@ The `cordis.yml` entry looks like this: - name: "@deepseek-ai/dsh-tools" - insert: - id: mem0 - name: "/absolute/path/to/integrations/dsh-mem0/dist/index.js" + name: "/absolute/path/to/integrations/deepseek-plugin/dist/index.js" config: # apiKey is read from MEM0_API_KEY when omitted here. userId: "your-user-id" diff --git a/docs/integrations/strands.mdx b/docs/integrations/strands.mdx index 51675625a..33c402aec 100644 --- a/docs/integrations/strands.mdx +++ b/docs/integrations/strands.mdx @@ -3,7 +3,7 @@ title: Strands Agents description: "Add persistent long-term memory to AWS Strands agents with Mem0, as a native MemoryStore that plugs into the agent loop." --- -Integrate [**Mem0**](https://github.com/mem0ai/mem0) with [Strands Agents](https://github.com/strands-agents/sdk-python), AWS's open-source SDK for building AI agents. The [`strands-mem0`](https://github.com/mem0ai/mem0/tree/main/integrations/strands-mem0) package ships a native `MemoryStore`, so recall and writes happen automatically inside the agent loop, not as tool calls the model has to remember. +Integrate [**Mem0**](https://github.com/mem0ai/mem0) with [Strands Agents](https://github.com/strands-agents/sdk-python), AWS's open-source SDK for building AI agents. The [`mem0-strands`](https://github.com/mem0ai/mem0/tree/main/integrations/mem0-strands) package ships a native `MemoryStore`, so recall and writes happen automatically inside the agent loop, not as tool calls the model has to remember. ## Overview @@ -17,7 +17,7 @@ Before setting up Mem0 with Strands, ensure you have: 1. Installed the required packages: ```bash -pip install strands-mem0 +pip install mem0-strands ``` 2. A valid API key: @@ -31,7 +31,7 @@ Hand a `Mem0MemoryStore` to a `MemoryManager`, and the agent gets automatic reca import os from strands import Agent from strands.memory import MemoryManager -from strands_mem0 import Mem0MemoryStore +from mem0_strands import Mem0MemoryStore os.environ["MEM0_API_KEY"] = "your-mem0-api-key" @@ -65,5 +65,5 @@ If you want the model to call memory explicitly instead of (or alongside) the au ## Learn more -- [strands-mem0 on GitHub](https://github.com/mem0ai/mem0/tree/main/integrations/strands-mem0) +- [mem0-strands on GitHub](https://github.com/mem0ai/mem0/tree/main/integrations/mem0-strands) - [Strands Agents documentation](https://strandsagents.com) diff --git a/docs/llms.txt b/docs/llms.txt index 45087e438..67ccbf257 100644 --- a/docs/llms.txt +++ b/docs/llms.txt @@ -257,7 +257,7 @@ If the user is on a pre-current major (Python < 2, TS < 3, or a Platform call st - [ChatDev](https://docs.mem0.ai/integrations/chatdev) [Platform]: Use when the user is on ChatDev. - [Hermes](https://docs.mem0.ai/integrations/hermes) [Both]: Use when the user is on Hermes. - [Pi Agent](https://docs.mem0.ai/integrations/pi-agent) [Platform]: Use when adding persistent memory to Pi Agent with the Mem0 plugin. -- [DeepSeek Harness](https://docs.mem0.ai/integrations/dsh-mem0) [Platform]: Use when adding persistent memory to the DeepSeek Harness (Cordis) agent via the Mem0 plugin. +- [DeepSeek Harness](https://docs.mem0.ai/integrations/deepseek-plugin) [Platform]: Use when adding persistent memory to the DeepSeek Harness (Cordis) agent via the Mem0 plugin. - [OpenAI Agents SDK](https://docs.mem0.ai/integrations/openai-agents-sdk) [Platform]: Use when the user is on the OpenAI Agents SDK. - [Google AI ADK](https://docs.mem0.ai/integrations/google-ai-adk) [Platform]: Use when the user is on Google's Agent Development Kit. - [Mastra](https://docs.mem0.ai/integrations/mastra) [Platform]: Use when the user is on Mastra (TypeScript). diff --git a/integrations/AGENTS.md b/integrations/AGENTS.md index 71f0211dd..1b62295ba 100644 --- a/integrations/AGENTS.md +++ b/integrations/AGENTS.md @@ -9,12 +9,12 @@ Agent and editor integrations. Each subdirectory is self-contained: its own `pac | `mem0-plugin/` | Claude Code / Cursor / Codex plugin | none | none | pytest | | `mem0-plugin/.opencode-plugin/` | `@mem0/opencode-plugin` | Bun | none | tsc type-check | | `pi-agent-plugin/` | `@mem0/pi-agent-plugin` | tsup | none | vitest | -| `dsh-mem0/` | `@mem0/dsh-mem0` | tsup (ESM) | none | vitest | +| `deepseek-plugin/` | `@mem0/deepseek-plugin` | tsup (ESM) | none | vitest | | `n8n-nodes-mem0/` | `@mem0/n8n-nodes-mem0` | tsc | ESLint (n8n-nodes-base) | none | | `zapier-mem0/` | `@mem0/zapier` | tsc | none | offline unit tests + `zapier validate` | -| `strands-mem0/` | `strands-mem0` (PyPI) | hatch | Ruff + mypy | pytest | +| `mem0-strands/` | `mem0-strands` (PyPI) | hatch | Ruff + mypy | pytest | -pnpm everywhere except `.opencode-plugin/` (Bun) and `strands-mem0/` (Python: pip / hatch). Never npm, never yarn. +pnpm everywhere except `.opencode-plugin/` (Bun) and `mem0-strands/` (Python: pip / hatch). Never npm, never yarn. ## Commands @@ -41,10 +41,10 @@ Run the type check after every TypeScript change: `pnpm run typecheck` or `tsc - - **`vercel-ai-sdk/`** wraps the Vercel AI SDK through a `createMem0` provider. Integrations for AI-SDK repos go through this wrapper, not raw `MemoryClient`. - **`mem0-plugin/`** connects Claude Code, Cursor, and Codex to the MCP server at `mcp.mem0.ai` and installs lifecycle hooks for automatic memory capture. Exposes 9 MCP tools: `add_memory`, `search_memories`, `get_memories`, `get_memory`, `update_memory`, `delete_memory`, `delete_all_memories`, `delete_entities`, `list_entities`. -- **`openclaw/`**, **`pi-agent-plugin/`**, **`dsh-mem0/`** are editor and agent plugins with the same shape. `dsh-mem0/` registers Mem0 search/add tools as a native DeepSeek Harness (Cordis) plugin. +- **`openclaw/`**, **`pi-agent-plugin/`**, **`deepseek-plugin/`** are editor and agent plugins with the same shape. `deepseek-plugin/` registers Mem0 search/add tools as a native DeepSeek Harness (Cordis) plugin. - **`n8n-nodes-mem0/`** is an n8n community node: add, search, get, update, delete. - **`zapier-mem0/`** is a Zapier Platform CLI app: add, search, get, delete. It deploys to Zapier, not npm, so it is **not** in the release router. Deploy it with `gh workflow run zapier-mem0-cd.yml --ref main` (needs the `ZAPIER_DEPLOY_KEY` secret). -- **`strands-mem0/`** is a native Strands `MemoryStore` (Python, published to PyPI as `strands-mem0`). It plugs into the Strands `MemoryManager` for automatic recall and server-side extraction, over the hosted Mem0 platform or self-hosted Mem0 OSS. The package lives under `strands-mem0/python/`. +- **`mem0-strands/`** is a native Strands `MemoryStore` (Python, published to PyPI as `mem0-strands`). It plugs into the Strands `MemoryManager` for automatic recall and server-side extraction, over the hosted Mem0 platform or self-hosted Mem0 OSS. The package lives under `mem0-strands/python/`. ## Adding an integration diff --git a/integrations/dsh-mem0/.npmrc b/integrations/deepseek-plugin/.npmrc similarity index 100% rename from integrations/dsh-mem0/.npmrc rename to integrations/deepseek-plugin/.npmrc diff --git a/integrations/dsh-mem0/LICENSE b/integrations/deepseek-plugin/LICENSE similarity index 100% rename from integrations/dsh-mem0/LICENSE rename to integrations/deepseek-plugin/LICENSE diff --git a/integrations/dsh-mem0/README.md b/integrations/deepseek-plugin/README.md similarity index 93% rename from integrations/dsh-mem0/README.md rename to integrations/deepseek-plugin/README.md index 29ea45a7c..e9d41c43b 100644 --- a/integrations/dsh-mem0/README.md +++ b/integrations/deepseek-plugin/README.md @@ -1,4 +1,4 @@ -# dsh-mem0 +# deepseek-plugin [Mem0](https://mem0.ai) long-term memory as a native [DeepSeek Harness](https://github.com/deepseek-ai/deepseek-harness) (Cordis) plugin. @@ -18,7 +18,7 @@ A Cordis plugin is a module exporting `apply(ctx, config)`. This one declares `i ``` [ mem0ai SDK ] <-- managed memory, owned by Mem0 | -[ dsh-mem0: apply(ctx) -> ctx.tools.register(...) ] <-- this package +[ deepseek-plugin: apply(ctx) -> ctx.tools.register(...) ] <-- this package | [ DeepSeek Harness ] <-- the agent, loaded via cordis.yml ``` @@ -27,7 +27,7 @@ A Cordis plugin is a module exporting `apply(ctx, config)`. This one declares `i 1. Build the plugin: ```sh - cd integrations/dsh-mem0 + cd integrations/deepseek-plugin pnpm install pnpm build ``` @@ -37,7 +37,7 @@ A Cordis plugin is a module exporting `apply(ctx, config)`. This one declares `i ``` 3. Point Harness at it. Copy `cordis.example.yml`, set the absolute path to `dist/index.js` and your `userId`, then: ```sh - pnpm dsh web --patch ./integrations/dsh-mem0/cordis.example.yml + pnpm dsh web --patch ./integrations/deepseek-plugin/cordis.example.yml ``` 4. Open http://127.0.0.1:3080 and ask the agent to remember something, then recall it in a later turn. diff --git a/integrations/dsh-mem0/cordis.example.yml b/integrations/deepseek-plugin/cordis.example.yml similarity index 72% rename from integrations/dsh-mem0/cordis.example.yml rename to integrations/deepseek-plugin/cordis.example.yml index 38dc4aaa5..7a0ac3bb9 100644 --- a/integrations/dsh-mem0/cordis.example.yml +++ b/integrations/deepseek-plugin/cordis.example.yml @@ -1,7 +1,7 @@ -# Example DeepSeek Harness config that loads dsh-mem0 alongside the built-in +# Example DeepSeek Harness config that loads deepseek-plugin alongside the built-in # tools plugin. Load with: # -# pnpm dsh web --patch ./integrations/dsh-mem0/cordis.example.yml +# pnpm dsh web --patch ./integrations/deepseek-plugin/cordis.example.yml # # The tools plugin (and its system-prompt dependency) must be present, because # the memory tools contribute schemas the system prompt renders. @@ -12,7 +12,7 @@ - id: mem0 # Absolute path to the built plugin (run `pnpm build` first), or point # at src/index.ts when running through tsx during development. - name: "/absolute/path/to/mem0/integrations/dsh-mem0/dist/index.js" + name: "/absolute/path/to/mem0/integrations/deepseek-plugin/dist/index.js" config: # apiKey is read from the MEM0_API_KEY env var when omitted here. userId: "your-user-id" diff --git a/integrations/dsh-mem0/package.json b/integrations/deepseek-plugin/package.json similarity index 93% rename from integrations/dsh-mem0/package.json rename to integrations/deepseek-plugin/package.json index 4e9e563f0..6586d2cde 100644 --- a/integrations/dsh-mem0/package.json +++ b/integrations/deepseek-plugin/package.json @@ -1,5 +1,5 @@ { - "name": "@mem0/dsh-mem0", + "name": "@mem0/deepseek-plugin", "version": "0.1.0", "description": "Mem0 long-term memory as a native DeepSeek Harness (Cordis) plugin.", "type": "module", @@ -7,7 +7,7 @@ "repository": { "type": "git", "url": "https://github.com/mem0ai/mem0", - "directory": "integrations/dsh-mem0" + "directory": "integrations/deepseek-plugin" }, "keywords": [ "deepseek-harness", diff --git a/integrations/dsh-mem0/pnpm-lock.yaml b/integrations/deepseek-plugin/pnpm-lock.yaml similarity index 100% rename from integrations/dsh-mem0/pnpm-lock.yaml rename to integrations/deepseek-plugin/pnpm-lock.yaml diff --git a/integrations/dsh-mem0/src/formatting.ts b/integrations/deepseek-plugin/src/formatting.ts similarity index 100% rename from integrations/dsh-mem0/src/formatting.ts rename to integrations/deepseek-plugin/src/formatting.ts diff --git a/integrations/dsh-mem0/src/index.ts b/integrations/deepseek-plugin/src/index.ts similarity index 95% rename from integrations/dsh-mem0/src/index.ts rename to integrations/deepseek-plugin/src/index.ts index 47f98eaaa..997002043 100644 --- a/integrations/dsh-mem0/src/index.ts +++ b/integrations/deepseek-plugin/src/index.ts @@ -1,5 +1,5 @@ /** - * dsh-mem0: Mem0 long-term memory as a native DeepSeek Harness (Cordis) plugin. + * deepseek-plugin: Mem0 long-term memory as a native DeepSeek Harness (Cordis) plugin. * * Registers two agent-callable tools backed by the Mem0 SDK: * - `search_memory` recalls facts relevant to a query @@ -69,11 +69,11 @@ const scopeParams = { export function apply(ctx: Context, config: Config): void { const apiKey = config.apiKey ?? process.env.MEM0_API_KEY; if (!apiKey) { - throw new Error("dsh-mem0: set config.apiKey or the MEM0_API_KEY env var"); + throw new Error("deepseek-plugin: set config.apiKey or the MEM0_API_KEY env var"); } const userId = config.userId; if (!userId) { - throw new Error("dsh-mem0: config.userId is required"); + throw new Error("deepseek-plugin: config.userId is required"); } const client = new MemoryClient({ diff --git a/integrations/dsh-mem0/src/output.ts b/integrations/deepseek-plugin/src/output.ts similarity index 100% rename from integrations/dsh-mem0/src/output.ts rename to integrations/deepseek-plugin/src/output.ts diff --git a/integrations/dsh-mem0/src/scoping.ts b/integrations/deepseek-plugin/src/scoping.ts similarity index 100% rename from integrations/dsh-mem0/src/scoping.ts rename to integrations/deepseek-plugin/src/scoping.ts diff --git a/integrations/dsh-mem0/tests/apply.test.ts b/integrations/deepseek-plugin/tests/apply.test.ts similarity index 100% rename from integrations/dsh-mem0/tests/apply.test.ts rename to integrations/deepseek-plugin/tests/apply.test.ts diff --git a/integrations/dsh-mem0/tests/formatting.test.ts b/integrations/deepseek-plugin/tests/formatting.test.ts similarity index 100% rename from integrations/dsh-mem0/tests/formatting.test.ts rename to integrations/deepseek-plugin/tests/formatting.test.ts diff --git a/integrations/dsh-mem0/tests/output.test.ts b/integrations/deepseek-plugin/tests/output.test.ts similarity index 100% rename from integrations/dsh-mem0/tests/output.test.ts rename to integrations/deepseek-plugin/tests/output.test.ts diff --git a/integrations/dsh-mem0/tests/scoping.test.ts b/integrations/deepseek-plugin/tests/scoping.test.ts similarity index 100% rename from integrations/dsh-mem0/tests/scoping.test.ts rename to integrations/deepseek-plugin/tests/scoping.test.ts diff --git a/integrations/dsh-mem0/tsconfig.json b/integrations/deepseek-plugin/tsconfig.json similarity index 100% rename from integrations/dsh-mem0/tsconfig.json rename to integrations/deepseek-plugin/tsconfig.json diff --git a/integrations/dsh-mem0/tsup.config.ts b/integrations/deepseek-plugin/tsup.config.ts similarity index 100% rename from integrations/dsh-mem0/tsup.config.ts rename to integrations/deepseek-plugin/tsup.config.ts diff --git a/integrations/strands-mem0/.gitignore b/integrations/mem0-strands/.gitignore similarity index 100% rename from integrations/strands-mem0/.gitignore rename to integrations/mem0-strands/.gitignore diff --git a/integrations/strands-mem0/LICENSE b/integrations/mem0-strands/LICENSE similarity index 100% rename from integrations/strands-mem0/LICENSE rename to integrations/mem0-strands/LICENSE diff --git a/integrations/strands-mem0/NOTICE b/integrations/mem0-strands/NOTICE similarity index 95% rename from integrations/strands-mem0/NOTICE rename to integrations/mem0-strands/NOTICE index b0bfc7889..c9d36f253 100644 --- a/integrations/strands-mem0/NOTICE +++ b/integrations/mem0-strands/NOTICE @@ -1,4 +1,4 @@ -strands-mem0 +mem0-strands Copyright 2026 Mem0 This product includes software developed at Mem0 (https://mem0.ai). diff --git a/integrations/strands-mem0/README.md b/integrations/mem0-strands/README.md similarity index 96% rename from integrations/strands-mem0/README.md rename to integrations/mem0-strands/README.md index 550206852..eae2c7e19 100644 --- a/integrations/strands-mem0/README.md +++ b/integrations/mem0-strands/README.md @@ -1,5 +1,5 @@
-

strands-mem0

+

mem0-strands

Persistent long-term memory for Strands Agents, backed by Mem0

A community Strands Agents integration that plugs @@ -9,7 +9,7 @@ --- -`strands-mem0` gives [Strands](https://github.com/strands-agents/sdk-python) agents durable memory +`mem0-strands` gives [Strands](https://github.com/strands-agents/sdk-python) agents durable memory that survives across sessions, backed by [Mem0](https://mem0.ai). Where the `mem0_memory` tool is called explicitly by the model, `Mem0MemoryStore` plugs into the **agent loop** directly: the manager recalls context and injects it automatically, and writes new memories, either @@ -22,7 +22,7 @@ verbatim or by extracting facts from the conversation. ## Install ```bash -pip install strands-mem0 +pip install mem0-strands ``` ## Usage @@ -30,7 +30,7 @@ pip install strands-mem0 ```python from strands import Agent from strands.memory import MemoryManager -from strands_mem0 import Mem0MemoryStore +from mem0_strands import Mem0MemoryStore # Recall + write, distilling facts from the conversation via Mem0's server-side extraction. store = Mem0MemoryStore(user_id="alex", writable=True, extraction=True) diff --git a/integrations/strands-mem0/python/README.md b/integrations/mem0-strands/python/README.md similarity index 77% rename from integrations/strands-mem0/python/README.md rename to integrations/mem0-strands/python/README.md index f9faeee22..1bf84ec67 100644 --- a/integrations/strands-mem0/python/README.md +++ b/integrations/mem0-strands/python/README.md @@ -1,4 +1,4 @@ -# strands-mem0 (Python) +# mem0-strands (Python) Persistent long-term memory for [Strands Agents](https://github.com/strands-agents/sdk-python), backed by [Mem0](https://mem0.ai). @@ -6,7 +6,7 @@ backed by [Mem0](https://mem0.ai). See the [repository README](../README.md) for full usage. Quick start: ```bash -pip install strands-mem0 +pip install mem0-strands ``` As a `MemoryStore` that plugs into the agent loop (Strands >= 1.45): @@ -14,7 +14,7 @@ As a `MemoryStore` that plugs into the agent loop (Strands >= 1.45): ```python from strands import Agent from strands.memory import MemoryManager -from strands_mem0 import Mem0MemoryStore +from mem0_strands import Mem0MemoryStore store = Mem0MemoryStore(user_id="alex", writable=True, extraction=True) agent = Agent(memory_manager=MemoryManager(stores=[store])) @@ -32,6 +32,6 @@ hatch run prepare # format + lint + typecheck + test ## Release -Publish a GitHub release tagged `strands-mem0-v*` (e.g. `strands-mem0-v0.1.0`). The -release router (`.github/workflows/release.yml`) dispatches `strands-mem0-cd.yml`, +Publish a GitHub release tagged `mem0-strands-v*` (e.g. `mem0-strands-v0.1.0`). The +release router (`.github/workflows/release.yml`) dispatches `mem0-strands-cd.yml`, which builds the wheel and publishes it to PyPI via trusted publishing (OIDC). diff --git a/integrations/strands-mem0/python/pyproject.toml b/integrations/mem0-strands/python/pyproject.toml similarity index 96% rename from integrations/strands-mem0/python/pyproject.toml rename to integrations/mem0-strands/python/pyproject.toml index 78d2823bc..9392f2cd6 100644 --- a/integrations/strands-mem0/python/pyproject.toml +++ b/integrations/mem0-strands/python/pyproject.toml @@ -3,7 +3,7 @@ requires = ["hatchling"] build-backend = "hatchling.build" [project] -name = "strands-mem0" +name = "mem0-strands" version = "0.1.0" description = "Persistent long-term memory for Strands agents, backed by Mem0." readme = "README.md" @@ -33,7 +33,7 @@ dependencies = [ [project.urls] Homepage = "https://mem0.ai" -Documentation = "https://github.com/mem0ai/mem0/tree/main/integrations/strands-mem0#readme" +Documentation = "https://github.com/mem0ai/mem0/tree/main/integrations/mem0-strands#readme" Repository = "https://github.com/mem0ai/mem0" Issues = "https://github.com/mem0ai/mem0/issues" @@ -47,7 +47,7 @@ dev = [ ] [tool.hatch.build.targets.wheel] -packages = ["src/strands_mem0"] +packages = ["src/mem0_strands"] [tool.hatch.envs.default] dependencies = [ diff --git a/integrations/strands-mem0/python/src/strands_mem0/__init__.py b/integrations/mem0-strands/python/src/mem0_strands/__init__.py similarity index 85% rename from integrations/strands-mem0/python/src/strands_mem0/__init__.py rename to integrations/mem0-strands/python/src/mem0_strands/__init__.py index 18dea99e6..3ab443318 100644 --- a/integrations/strands-mem0/python/src/strands_mem0/__init__.py +++ b/integrations/mem0-strands/python/src/mem0_strands/__init__.py @@ -12,8 +12,8 @@ share one Mem0 backend and namespace. from importlib.metadata import PackageNotFoundError, version -from strands_mem0.client import Mem0ServiceClient -from strands_mem0.store import Mem0MemoryStore +from mem0_strands.client import Mem0ServiceClient +from mem0_strands.store import Mem0MemoryStore __all__ = [ "Mem0MemoryStore", @@ -21,6 +21,6 @@ __all__ = [ ] try: - __version__ = version("strands-mem0") + __version__ = version("mem0-strands") except PackageNotFoundError: # pragma: no cover - only when running from a source tree __version__ = "0.0.0+unknown" diff --git a/integrations/strands-mem0/python/src/strands_mem0/client.py b/integrations/mem0-strands/python/src/mem0_strands/client.py similarity index 97% rename from integrations/strands-mem0/python/src/strands_mem0/client.py rename to integrations/mem0-strands/python/src/mem0_strands/client.py index 637001b46..bc0099f0e 100644 --- a/integrations/strands-mem0/python/src/strands_mem0/client.py +++ b/integrations/mem0-strands/python/src/mem0_strands/client.py @@ -1,4 +1,4 @@ -"""A thin wrapper around the Mem0 SDK used by :class:`~strands_mem0.store.Mem0MemoryStore`. +"""A thin wrapper around the Mem0 SDK used by :class:`~mem0_strands.store.Mem0MemoryStore`. Both Mem0 backends -- the hosted platform (:class:`mem0.MemoryClient`) and self-hosted OSS (:class:`mem0.Memory`) -- expose the same call shape to the store: @@ -95,7 +95,7 @@ class Mem0ServiceClient: from mem0 import Memory except ImportError as err: # pragma: no cover - exercised via install docs raise ImportError( - "The mem0ai package is required. Install it with: pip install 'strands-mem0'" + "The mem0ai package is required. Install it with: pip install 'mem0-strands'" ) from err self.mem0 = Memory.from_config(config) self.is_platform = False @@ -104,7 +104,7 @@ class Mem0ServiceClient: try: from mem0 import MemoryClient except ImportError as err: # pragma: no cover - exercised via install docs - raise ImportError("The mem0ai package is required. Install it with: pip install 'strands-mem0'") from err + raise ImportError("The mem0ai package is required. Install it with: pip install 'mem0-strands'") from err api_key = api_key or os.environ.get("MEM0_API_KEY") # MemoryClient(host=None) would override the SDK default with None, so only # pass host when the caller actually set one. diff --git a/integrations/strands-mem0/python/src/strands_mem0/py.typed b/integrations/mem0-strands/python/src/mem0_strands/py.typed similarity index 100% rename from integrations/strands-mem0/python/src/strands_mem0/py.typed rename to integrations/mem0-strands/python/src/mem0_strands/py.typed diff --git a/integrations/strands-mem0/python/src/strands_mem0/store.py b/integrations/mem0-strands/python/src/mem0_strands/store.py similarity index 98% rename from integrations/strands-mem0/python/src/strands_mem0/store.py rename to integrations/mem0-strands/python/src/mem0_strands/store.py index c86278e2a..c7695e488 100644 --- a/integrations/strands-mem0/python/src/strands_mem0/store.py +++ b/integrations/mem0-strands/python/src/mem0_strands/store.py @@ -21,7 +21,7 @@ Example: ```python from strands import Agent from strands.memory import MemoryManager - from strands_mem0 import Mem0MemoryStore + from mem0_strands import Mem0MemoryStore # Recall + write, with Mem0 extracting facts from the conversation server-side. store = Mem0MemoryStore(user_id="alex", writable=True, extraction=True) @@ -41,7 +41,7 @@ from typing import Any from strands.memory import AddMessagesContext, MemoryEntry, MemoryStore, SearchOptions from strands.types.content import Message -from strands_mem0.client import Mem0ServiceClient +from mem0_strands.client import Mem0ServiceClient DEFAULT_MAX_SEARCH_RESULTS = 5 # Entity fields that scope a memory in Mem0. At least one must be set. @@ -92,7 +92,7 @@ class Mem0MemoryStore(MemoryStore): api_key: Mem0 platform API key (defaults to ``$MEM0_API_KEY``). host: Mem0 platform base URL. config: Mem0 OSS config dict for a self-hosted backend. - client: A pre-built :class:`~strands_mem0.client.Mem0ServiceClient` + client: A pre-built :class:`~mem0_strands.client.Mem0ServiceClient` (for testing, or to wrap your own raw Mem0 client via ``Mem0ServiceClient(client=...)``); when omitted, one is constructed lazily on first use from ``api_key`` / ``config``. diff --git a/integrations/strands-mem0/python/tests/test_client.py b/integrations/mem0-strands/python/tests/test_client.py similarity index 99% rename from integrations/strands-mem0/python/tests/test_client.py rename to integrations/mem0-strands/python/tests/test_client.py index 412255244..134518d9b 100644 --- a/integrations/strands-mem0/python/tests/test_client.py +++ b/integrations/mem0-strands/python/tests/test_client.py @@ -8,7 +8,7 @@ what the earlier permissive fakes did not do. import pytest -from strands_mem0.client import Mem0ServiceClient, _extract_results, _is_platform_client +from mem0_strands.client import Mem0ServiceClient, _extract_results, _is_platform_client class FakeMemoryClient: diff --git a/integrations/strands-mem0/python/tests/test_store.py b/integrations/mem0-strands/python/tests/test_store.py similarity index 98% rename from integrations/strands-mem0/python/tests/test_store.py rename to integrations/mem0-strands/python/tests/test_store.py index 2018ee8c1..1e2fede53 100644 --- a/integrations/strands-mem0/python/tests/test_store.py +++ b/integrations/mem0-strands/python/tests/test_store.py @@ -10,7 +10,7 @@ import pytest from strands.memory import MemoryEntry, MemoryStore from strands.memory.types import _has_method, _has_write_sink -from strands_mem0 import Mem0MemoryStore +from mem0_strands import Mem0MemoryStore @pytest.fixture @@ -241,7 +241,7 @@ def test_client_constructed_lazily(monkeypatch): calls["n"] += 1 self.api_key = api_key - monkeypatch.setattr("strands_mem0.store.Mem0ServiceClient", FakeClient) + monkeypatch.setattr("mem0_strands.store.Mem0ServiceClient", FakeClient) store = Mem0MemoryStore(user_id="alex", api_key="m0-x") assert calls["n"] == 0 # not built yet