Skip to main content
Archived

This project has been archived by its maintainers, and is no longer receiving any updates.

agent-framework-goodmem

GoodMem integration for the Microsoft Agent Framework.

This package gives Agent Framework agents persistent, semantic long-term memory backed by a GoodMem server. It exposes:

  • GoodMemClient — an async REST client for the GoodMem v1 API.
  • GoodMemContextProvider — a BaseContextProvider that automatically retrieves relevant memories before each agent run and stores conversations afterwards.
  • create_goodmem_tools — a factory that returns ready-to-use function tools so the model itself can manage spaces and memories.

Installation

pip install agent-framework-goodmem

For local development:

pip install -e .

Quickstart

import asyncio
from agent_framework_goodmem import GoodMemClient, create_goodmem_tools

async def main():
    client = GoodMemClient(
        base_url="https://localhost:8080",
        api_key="gm_xxxxxxxxxxxxxxxxxxxxxxxx",
        verify_ssl=False,  # self-signed local server
    )

    embedders = await client.list_embedders()
    embedder_id = embedders[0]["embedderId"]

    space = await client.create_space(name="quickstart", embedder_id=embedder_id)
    space_id = space["spaceId"]

    await client.create_memory(
        space_id=space_id,
        text_content="The capital of France is Paris.",
    )

    results = await client.retrieve_memories(
        query="What is the capital of France?",
        space_ids=[space_id],
        max_results=3,
        wait_for_indexing=True,
    )
    print(results)

    await client.close()

asyncio.run(main())

Available tools

create_goodmem_tools(client) returns the following 11 function tools:

Tool Description
goodmem_list_embedders List embedder models available on the server
goodmem_list_spaces List all spaces accessible to the API key
goodmem_get_space Fetch a space by ID
goodmem_create_space Create a space, or reuse a same-name space that uses the same embedder
goodmem_update_space Update a space's name/labels/visibility
goodmem_delete_space Delete a space
goodmem_create_memory Store text or a file as a memory
goodmem_list_memories List memories in a space
goodmem_retrieve_memories Semantic retrieval, with optional reranker/LLM
goodmem_get_memory Fetch a memory by ID (with original content)
goodmem_delete_memory Delete a memory

Retrieval options

goodmem_retrieve_memories (and GoodMemClient.retrieve_memories) accept the GoodMem post-processor parameters:

Parameter Type Description
reranker_id UUID Reranker model to improve result ordering
llm_id UUID LLM used to generate a contextual abstract reply
relevance_threshold 0–1 Minimum score for including a result
llm_temperature 0–2 Creativity for the LLM post-processor
max_results int Cap on returned chunks
chronological_resort bool Reorder results by memory creation time

Retrieval results and server statuses

retrieve_memories returns a dict (the tool returns the same dict as JSON):

Key Description
success true unless the request itself failed (see Errors)
results Matching chunks: chunkId, chunkText, memoryId, relevanceScore, memoryIndex
memories Memory definitions (when include_memory_definition is true)
totalResults Number of entries in results
resultSetId The server's result set ID
abstractReply The LLM's reply, when an llm_id was given and it succeeded
partial true when the server reported a problem during this retrieval
statuses The problems the server reported, in stream order; empty when partial is false
message A readable summary when partial is true, or when wait_for_indexing gave up after 60 seconds

Each entry in statuses is {"code", "message", "details"}, exactly as the server sent it. These rules decide what counts as a problem:

  • FEATURE_DISABLED and LLM_CAPABILITY_INFERRED are informational (an optional feature you did not configure). They are left out of statuses and never set partial.
  • A code this package does not recognize is reported with code: "UNKNOWN" and the server's code in originalCode, and sets partial. It is never dropped and never raises.
  • A problem with hits (for example a nonexistent reranker_id): the hits are returned, with partial: true and the statuses.
  • A problem with no hits: an empty results, with partial: true and the statuses. Nothing is raised.

With wait_for_indexing=True, polling stops as soon as the server reports a problem, so a nonexistent reranker or LLM is reported at once instead of after 60 seconds. When the reranker fails (RERANKING_FAILED, or NOT_FOUND naming the reranker) the server still returns the vector search's hits: their relevanceScore values are vector-search scores, not reranker scores, and message says so.

GoodMemContextProvider logs a WARNING with the statuses when a retrieval is partial, and still uses any chunks that came back.

Space reuse

create_space (and goodmem_create_space) looks for a space with exactly the requested name, across every page of the space listing:

  • No such space: a new one is created (reused: false).
  • One space, same embedder: it is reused (reused: true). embedderId and embedderIds report the space's real embedder (embedderId is null for a space with several), and chunkingConfig its real chunking configuration (which may differ from the one requested).
  • One space, different embedder: nothing is created. The result has success: false, an error naming the space, its ID and both embedders, plus existingSpaceId, existingEmbedderIds and requestedEmbedderId.
  • Several spaces with that name: nothing is created. The result has success: false, an error listing each space and its embedders, and existingSpaceIds.

If no embedder_id is given, an existing space with that name is reused whatever its embedder, and a new space uses the server's first embedder.

Errors

Tools never raise: a failure is returned as {"success": false, "error": ...}. When the server rejects a request, GoodMemClient raises httpx.HTTPStatusError whose message includes the server's own error text, for example HTTP 409 Conflict for POST /v1/spaces: A space with this name already exists, and the tools pass that text on in error.

Context provider

from agent_framework import Agent
from agent_framework.openai import OpenAIChatClient
from agent_framework_goodmem import GoodMemClient, GoodMemContextProvider

client = GoodMemClient(base_url="https://localhost:8080", api_key="gm_...", verify_ssl=False)

provider = GoodMemContextProvider(
    client=client,
    space_id=space_id,
    max_results=5,
    store_conversations=True,
)

agent = Agent(
    client=OpenAIChatClient(model="gpt-4o"),
    name="memory-agent",
    instructions="You are a helpful assistant with persistent memory.",
    context_providers=[provider],
)

Running the tests

The offline tests replay retrieval streams captured from a live GoodMem server (tests/fixtures/) against a fake server, and need no credentials:

pip install -e ".[dev]"
pytest -v tests/test_retrieval_statuses.py tests/test_space_reuse.py

The live integration tests in tests/test_goodmem_integration.py run against a real server and are skipped when GOODMEM_API_KEY is not set. They create and delete their own spaces. GOODMEM_EMBEDDER_ID, GOODMEM_RERANKER_ID, GOODMEM_LLM_ID and GOODMEM_PDF_PATH pick the models and file they use.

export GOODMEM_API_KEY=gm_xxxxxxxxxxxxxxxxxxxxxxxx
export GOODMEM_BASE_URL=https://localhost:8080
pip install -e ".[dev]"
pytest -m integration -v tests/test_goodmem_integration.py

Continuous integration

.github/workflows/ci.yml runs on every pull request and on pushes to main, on Python 3.10, 3.11, 3.12 and 3.13. It installs the package with pip install -e ".[dev]", compiles every module and imports the public API (no linter is configured), fails if a GoodMem API key is committed, and runs python -m pytest -v with no API key set, so the live tests are skipped.

Changes

See CHANGELOG.md.

Metadata

Release files for agent-framework-goodmem 0.2.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for agent-framework-goodmem 0.2.0
File Size Uploaded
agent_framework_goodmem-0.2.0.tar.gz 20.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for agent-framework-goodmem 0.2.0
File Interpreter ABI Platform
agent_framework_goodmem-0.2.0-py3-none-any.whl Python 3 none any Details

Total release size: 40.6 kB

Release files / agent_framework_goodmem-0.2.0.tar.gz

Download URL agent_framework_goodmem-0.2.0.tar.gz
Size 20.2 kB
Tags Source
SHA-256 checksum
How to use checksums
cda3163f6cf163e1d374b7525ea706a84157d930c6fc9bd7823bbe61f5fbe01f
BLAKE2b-256 checksum
How to use checksums
bb2feef237733a7ed292f5881e1273496bfd76344b1f5ca553e8bcad4a479e76
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.

Transparency log

Release files / agent_framework_goodmem-0.2.0-py3-none-any.whl

Download URL agent_framework_goodmem-0.2.0-py3-none-any.whl
Size 20.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
3568751735786dd57d0b4abc9a3ea41515649f87317fbd53e50dce8177cad0b3
BLAKE2b-256 checksum
How to use checksums
5b84df9f443df9ffd07b314a59e1f036a40e5f09976e8a59df19966b325d87a7
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 29, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.2.0 This release

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page