Skip to main content

Installation

pip install nined-memory
Zero dependencies. Uses only Python standard library.

Quick Start

from nined.memory import MemoryClient

client = MemoryClient(base_url="https://api.9dlabs.xyz", api_key="your-key")

# Ingest a document
client.ingest(
    workspace_id="ws-1",
    actor_id="agent-1",
    artifact_type="document",
    raw_payload={"title": "Runbook", "content": "If auth fails, restart the pod."},
)

# Retrieve context (deterministic, budget-enforced)
pack = client.context_pack(query="What should I do about auth?", workspace_id="ws-1")
print(pack["context_text"])
print(f"Confidence: {pack['confidence']}")

# Audit trail
receipt = client.get_receipt(pack["receipt_id"])

Constructor

MemoryClient(
    base_url: str = "https://api.9dlabs.xyz",
    api_key: str = "",
    timeout: int = 30,
)
ParameterTypeDefaultDescription
base_urlstrhttps://api.9dlabs.xyzServer URL
api_keystr""API key for X-API-Key header
timeoutint30HTTP timeout in seconds

Methods

ingest()

Store a single artifact in workspace memory.
result = client.ingest(
    workspace_id="ws-1",
    actor_id="user-1",
    artifact_type="document",
    raw_payload={"title": "...", "content": "..."},
    permissions={"visibility": "restricted", "rbac_tags": ["sales"]},
    idempotency_key="doc_001",
    session_id="session_1",
    thread_id="thread_1",
    timestamp="2026-03-09T14:30:00Z",
    callback_url="https://example.com/webhook",
)
# Returns: {"artifact_id": "...", "content_hash": "sha256:...", "indexed": True}
ParameterTypeRequiredDescription
workspace_idstrYesWorkspace identifier
actor_idstrYesCreator identifier
artifact_typestrYesOne of 9 types (see artifact types)
raw_payloaddict | str | listNoContent to store
blob_pointerstrNoPointer to external blob
permissionsdictNoAccess control
idempotency_keystrNoDeduplication key
session_idstrNoSession grouping
thread_idstrNoThread grouping
timestampstrNoISO 8601 datetime
callback_urlstrNoWebhook for async indexing completion

context_pack()

Retrieve a deterministic context pack for a query.
pack = client.context_pack(
    query="What is the discount cap?",
    workspace_id="ws-1",
    max_tokens=4096,
    actor_id="user-1",
    mode="relevance",
)
# Returns: {"context_text": "...", "citations": [...], "confidence": 0.87, ...}
ParameterTypeRequiredDefaultDescription
querystrYesQuery to retrieve evidence for
workspace_idstrYesWorkspace scope
max_tokensintNo4096Token budget
actor_idstrNoActor’s permission scope
modestrNorelevance or coverage
max_latency_msintNoLatency constraint
max_cost_usdfloatNoCost constraint
min_evidence_tokensintNoMinimum evidence required
min_confidencefloatNoMinimum confidence threshold
max_spans_per_artifactintNoCap spans per artifact
diversity_decayfloatNoDiversity enforcement factor
redundancy_jaccard_thresholdfloatNoJaccard threshold for dedup
temporal_half_life_hoursfloatNoTemporal decay half-life

feedback()

Submit a correction event.
client.feedback(
    workspace_id="ws-1",
    actor_id="user-1",
    action="pin",
    artifact_id="a1b2c3d4-...",
    span_id="s1e2f3g4-...",
    reason="Authoritative pricing policy",
)
# Returns: {"feedback_id": "...", "action": "pin", "applied": True}

list_receipts()

result = client.list_receipts(workspace_id="ws-1", limit=50, offset=0)
# Returns: {"receipts": [...], "total_count": int, "limit": int, "offset": int}

get_receipt()

receipt = client.get_receipt("receipt-uuid")

artifact_status()

status = client.artifact_status("artifact-uuid")
# Returns: {"artifact_id": "...", "indexed": True, "span_count": 3, "total_tokens": 187}

delete_workspace()

result = client.delete_workspace("ws-1")
# Returns: {"workspace_id": "ws-1", "deleted_artifacts": 42}

ask()

Get an LLM-synthesized answer from workspace memory.
answer = client.ask(query="What happened in the Q2 meeting?", workspace_id="ws-1")
# Returns: {"answer": "...", "confidence": 0.85, "citations": [...], "receipt_id": "...", "abstain_flag": False}

health()

client.health()
# Returns: {"status": "ok", "service": "memory-runtime", ...}

register()

Register a new tenant (multi-tenant mode).
result = client.register("team@example.com")
# Returns: {"tenant_id": "...", "api_key": "9d_sk_...", "message": "..."}

regenerate_key()

result = client.regenerate_key("team@example.com")
# Returns: {"tenant_id": "...", "api_key": "9d_sk_...", "message": "..."}

billing_usage()

usage = client.billing_usage()

billing_plan()

plan = client.billing_plan()