Skip to main content

GoodMem's Convenient SDK for Python

Project description

GoodMem Python SDK

A Python SDK designed to be easy to use and easy to maintain. OpenAI-style API with auto-inference of model parameters, streaming retrieval, async support, and auto-pagination.

The SDK stays in sync with the server's OpenAPI spec — except for hand-written convenience methods (model registry auto-inference, flat post-processor kwargs, etc.) that wrap the generated layer.

Installation

pip install goodmem

Usage

from goodmem import Goodmem

client = Goodmem(
    base_url="http://localhost:8080",
    api_key="gm_..."
)

embedder = client.embedders.create(
    display_name="OpenAI Embedder",
    model_identifier="text-embedding-3-large",
    api_key="sk-your-openai-key",
)

print(f"Created: {embedder.embedder_id}")

Project structure

clients/python2/
├── goodmem/                        # Installable package
│   ├── client.py                   # Goodmem / AsyncGoodmem entry points
│   ├── errors.py                   # Typed exception hierarchy (APIError, NotFoundError, …)
│   ├── pagination.py               # Paginator / AsyncPaginator (auto next_token)
│   ├── streaming.py                # RetrieveMemoryStream (SSE → typed events)
│   ├── _base.py                    # CRUDNamespace / AsyncCRUDNamespace base classes
│   ├── _schema_bridge.py           # Generated constants (credential builders, enums)
│   ├── _registries.py              # Generated model-registry loader
│   ├── api/                        # Tier-3: hand-written convenience overrides
│   │   ├── embedders.py            #   5 override classes (embedders, llms, rerankers,
│   │   ├── llms.py                 #     spaces, memories) call apply_convenience_transforms
│   │   ├── rerankers.py            #     then super()
│   │   ├── spaces.py               #   5 thin pass-throughs (apikeys, users, ocr,
│   │   ├── memories.py             #     system, admin) — just `pass`
│   │   └── ...
│   ├── registries/                 # Declarative config (no code generation)
│   │   ├── convenience.py          #   Source of truth for transforms, param descriptions,
│   │   │                           #     defaults, maps_to/replaces semantics
│   │   ├── embedders.json          #   29 embedder models (provider, dims, modalities)
│   │   ├── llms.json               #   34 LLM models
│   │   └── rerankers.json          #   16 reranker models
│   └── _generated/                 # Auto-generated — do not edit
│       ├── models/                 #   Tier-1: pydantic v2 models (openapi-generator)
│       └── api/                    #   Tier-2: structural API bases (_sdk_gen/ output)
│           ├── embedders_base.py
│           ├── memories_base.py
│           └── ...
├── _sdk_gen/                       # Tier-2 code generator (reads OpenAPI spec → emits bases)
│   ├── emitters.py                 #   Method emitters (input×output shape composition)
│   ├── spec.py                     #   Route classification, streaming/merge configs
│   ├── bridge.py                   #   Generates _schema_bridge.py + _registries.py
│   ├── docstrings.py               #   Docstring builder from OpenAPI summaries/params
│   ├── metadata.py                 #   REST metadata extraction (paths, models, params)
│   └── validate.py                 #   9 structural validation checks
├── tests/                          # Unit + validation tests (run without server)
│   ├── test_convenience_registry.py
│   ├── test_validate.py            #   Wraps _sdk_gen/validate.py checks as pytest
│   ├── test_*.py
│   └── integration/                # Live server tests (auto-skip without env vars)
│       ├── conftest.py
│       ├── test_full_flow.py
│       └── ...
├── docs/                           # Internal dev docs
│   ├── sdk_gen.md                  #   Architecture + regeneration guide
│   ├── doc_gen.md                  #   Doc generation + docstring authoring
│   └── ...
├── _doc_gen/                       # Doc generation scripts (called via doc_gen.sh)
│   ├── generate_ref.py             #   SDK ref doc generator (griffe + convenience registry → MDX)
│   ├── generate_skill.py           #   Claude Code skill reference generator → goodmem/skills/
│   └── sync_rag_snippets.py        #   Sync examples/basic_rag.py snippets → goodmem-docs tutorial
├── examples/
│   └── basic_rag.py                # End-to-end RAG example (source for basic RAG tutorial in goodmem-docs)
├── vibe/                           # Claude Code non-interactive prompts
│   ├── audit_ref_doc.sh            #   Audit generated MDX docs for accuracy
│   ├── audit_ref_doc.md            #   Audit prompt + known issues list
│   ├── sdk2rest.sh                 #   Generate REST equivalents from SDK test snippets
│   └── sdk2rest.md                 #   SDK→REST conversion prompt
├── sdk_gen.sh                      # SDK generation: compile server → Tier-1 → Tier-2 → tests
├── doc_gen.sh                      # Doc generation: ref pages + tutorial sync + skill ref + tests
├── goodmem-reset.sh                # Delete all resources on a GoodMem server (test cleanup)
└── pyproject.toml

For architecture details, see docs/sdk_gen.md.

Development commands

# SDK generation (compile server → Tier-1 models → Tier-2 bases → tests)
./sdk_gen.sh
./sdk_gen.sh --check           # drift detection only (no file changes)

# Documentation generation (doc_gen.sh runs all three + validation)
./doc_gen.sh                   # ref pages + tutorial sync + skill ref + tests
./doc_gen.sh --ref-only        # SDK reference pages only
./doc_gen.sh --sync-only       # tutorial snippet sync only

# Vibe auditing (Claude Code non-interactive)
./vibe/audit_ref_doc.sh        # audit generated MDX docs for accuracy
./vibe/sdk2rest.sh             # generate REST equivalents from SDK test snippets

# Reset live test server (deletes ALL resources — never use on production)
./goodmem-reset.sh             # interactive (prompts for confirmation)
./goodmem-reset.sh -y          # unattended (CI, scripts)

# Tests
python -m pytest tests/ -v     # unit + validation (integration auto-skips without server)

Warning: When GOODMEM_BASE_URL is set, sdk_gen.sh, vibe/sdk2rest.sh, and CI all run goodmem-reset.sh which deletes ALL resources on the target server before integration tests. Never point GOODMEM_BASE_URL at a production server.

See docs/sdk_gen.md for the full regeneration workflow and docs/doc_gen.md for the doc and auditing pipelines.

Claude Code integration

The SDK ships with a Claude Code skill so Claude can operate GoodMem on your behalf via natural language.

# One-time setup — copy the skill into your Claude Code skills directory
cp -r $(python -c "import goodmem; print(goodmem.__path__[0])")/skills ~/.claude/skills/goodmem

Once installed, Claude Code automatically loads the GoodMem SDK reference when you ask it to create embedders, store memories, run retrieval, etc.

Documentation

TODO

  1. Add CI/CD pipeline to publish to PyPI. Integrate into ../build_all.sh and build_client.sh.
  2. Add CI/CD pipeline to trigger SDK regeneration when server's OpenAPI spec changes.
  3. How do we integrate the CI/CD for python2/ SDK with the pan-language SDK build system? build_all.sh and build_client.sh.
  4. Add gemini-embedding-001 to embedder registry once backend adds OPENAI_COMPATIBLE to ProviderType.
  5. Add Anthropic, Google, Cohere, and Mistral LLMs to registry once backend adds matching LLMProviderType values.
  6. Support GET /v1/memories/{id}/pages and GET /v1/memories/{id}/pages/{pageIndex}/image endpoints. Done — paginator emitter now handles non-list paginators with standard path_query input.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

goodmem-0.1.7.tar.gz (131.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

goodmem-0.1.7-py3-none-any.whl (258.3 kB view details)

Uploaded Python 3

File details

Details for the file goodmem-0.1.7.tar.gz.

File metadata

  • Download URL: goodmem-0.1.7.tar.gz
  • Upload date:
  • Size: 131.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for goodmem-0.1.7.tar.gz
Algorithm Hash digest
SHA256 f107bc237c85b0aca5d6100544686b2ec5aa961a9347a491b63dd7477b37eecb
MD5 4447aa1f2d471cb7fc292d32c04db22f
BLAKE2b-256 86727015be51aa15728e57c2af650dc79ee72003878ba16083aad108c18454c5

See more details on using hashes here.

File details

Details for the file goodmem-0.1.7-py3-none-any.whl.

File metadata

  • Download URL: goodmem-0.1.7-py3-none-any.whl
  • Upload date:
  • Size: 258.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.11

File hashes

Hashes for goodmem-0.1.7-py3-none-any.whl
Algorithm Hash digest
SHA256 b0ef62f8f145836c86b9132dc8c009ed45f34e47a6eafaf264089a9eac803e4f
MD5 390212e54e36632c584a6cf88dfba600
BLAKE2b-256 48b521039f570db1259dfc19b7860113224684d429af295184d996dd0b700091

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page