mirror of
https://github.com/supermemoryai/supermemory.git
synced 2026-10-14 05:30:36 +08:00
## Stack Context Part 2 of a 3-PR stack moving memory deduplication into the SDKs. See `sdk-dedup/tools-ts` (parent) for the full context and the TypeScript implementation this mirrors. ## What? Port the normalized, priority-ordered (`static > dynamic > search`) profile deduplication into the Python SDKs. - Each request injects one **owned memory block that replaces** the prior block rather than accumulating. - Dedup is **request-local** (no shared state), so it stays correct under concurrency. Covers OpenAI, Agent Framework (middleware + context provider), Cartesia, and Pipecat. ## Why? Keeps the Python SDKs at behavioral parity with the TypeScript SDK so all integrations deduplicate memory the same way. ## Testing - OpenAI: 31 passed, 11 skipped (live) - Agent Framework: 59 passed - Cartesia: 8 passed - Pipecat: 8 passed 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- CURSOR_SUMMARY --> --- > [!NOTE] > **Medium Risk** > Changes memory formatting and system-prompt injection across multiple SDK integrations; incorrect dedup or replacement could alter LLM context, but there is no auth or data-store risk. > > **Overview** > Ports **normalized cross-source memory deduplication** and **replace-not-append injection** into the Python OpenAI, Agent Framework, Cartesia, and Pipecat packages so they match the TypeScript SDK behavior. > > **Deduplication** uses request-local keys: strip optional `[YYYY-MM-DD]` prefixes, normalize whitespace, and compare with `casefold`, with priority **static → dynamic → search**. In **`query` mode**, profile static/dynamic are excluded from dedup input so facts that only appear in search (or overlap profile) are not dropped before formatting. > > **Injection** no longer appends memory text every turn. OpenAI and Agent Framework middleware **strip prior owned `<supermemory context="user-memories" readonly>` blocks** and **replace** them once per request while keeping the caller’s system instructions; extra system messages lose stale blocks only. New helpers (`strip`/`replace`/`wrap`) live in each package’s utils. > > Tests cover normalized fact variants, query-mode search retention, and stale block replacement. > > <sup>Reviewed by [Cursor Bugbot](https://cursor.com/bugbot) for commit 42f308b224c768afd64e6bd77048ecee9183eb4f. Bugbot is set up for automated code reviews on this repo. Configure [here](https://www.cursor.com/dashboard/bugbot).</sup> <!-- /CURSOR_SUMMARY -->
81 lines
2.1 KiB
TOML
81 lines
2.1 KiB
TOML
[build-system]
|
|
requires = ["hatchling"]
|
|
build-backend = "hatchling.build"
|
|
|
|
[project]
|
|
name = "supermemory-agent-framework"
|
|
version = "1.0.2"
|
|
description = "Memory tools and middleware for Microsoft Agent Framework with supermemory"
|
|
readme = "README.md"
|
|
license = "MIT"
|
|
license-files = ["LICENSE"]
|
|
keywords = ["agent-framework", "supermemory", "ai", "memory", "microsoft"]
|
|
classifiers = [
|
|
"Development Status :: 3 - Alpha",
|
|
"Intended Audience :: Developers",
|
|
"License :: OSI Approved :: MIT License",
|
|
"Programming Language :: Python :: 3",
|
|
"Programming Language :: Python :: 3.10",
|
|
"Programming Language :: Python :: 3.11",
|
|
"Programming Language :: Python :: 3.12",
|
|
"Programming Language :: Python :: 3.13",
|
|
"Topic :: Software Development :: Libraries :: Python Modules",
|
|
"Topic :: Scientific/Engineering :: Artificial Intelligence",
|
|
]
|
|
requires-python = ">=3.10"
|
|
dependencies = [
|
|
"agent-framework-core>=1.0.0rc3",
|
|
"supermemory>=3.16.0",
|
|
"typing-extensions>=4.0.0",
|
|
]
|
|
|
|
[dependency-groups]
|
|
dev = [
|
|
"black>=24.8.0",
|
|
"flake8>=7.1.2",
|
|
"isort>=5.13.2",
|
|
"mypy>=1.14.1",
|
|
"pytest>=8.3.5",
|
|
"pytest-asyncio>=0.24.0",
|
|
"python-dotenv>=1.0.1",
|
|
]
|
|
|
|
[project.urls]
|
|
Homepage = "https://supermemory.ai"
|
|
Repository = "https://github.com/supermemoryai/supermemory"
|
|
Documentation = "https://supermemory.ai/docs"
|
|
|
|
[tool.hatch.build]
|
|
include = ["src/*"]
|
|
|
|
[tool.hatch.build.targets.wheel]
|
|
packages = ["src/supermemory_agent_framework"]
|
|
|
|
[tool.isort]
|
|
profile = "black"
|
|
multi_line_output = 3
|
|
line_length = 88
|
|
|
|
[tool.mypy]
|
|
python_version = "3.10"
|
|
warn_return_any = true
|
|
warn_unused_configs = true
|
|
disallow_untyped_defs = true
|
|
disallow_incomplete_defs = true
|
|
check_untyped_defs = true
|
|
disallow_untyped_decorators = true
|
|
no_implicit_optional = true
|
|
warn_redundant_casts = true
|
|
warn_unused_ignores = true
|
|
warn_no_return = true
|
|
warn_unreachable = true
|
|
strict_equality = true
|
|
|
|
[tool.pytest.ini_options]
|
|
testpaths = ["tests"]
|
|
python_files = ["test_*.py", "*_test.py"]
|
|
python_classes = ["Test*"]
|
|
python_functions = ["test_*"]
|
|
addopts = "-v --tb=short"
|
|
asyncio_mode = "auto"
|