Skip to main content

Python SDK for HEBBS cognitive memory engine

Project description

HEBBS Python SDK

Python client for the HEBBS cognitive memory engine. Provides an async gRPC client with a Pythonic interface -- no protobuf in the public API.

HEBBS gives your AI agents real memory: sub-10ms writes, sub-10ms recalls, four recall strategies, entity-scoped multitenancy, and GDPR-compliant erasure. This SDK wraps the gRPC API in idiomatic Python so you can integrate HEBBS in minutes.

Quick Start

1. Install the HEBBS Server

curl -sSf https://hebbs.ai/install | sh

This installs hebbs-server, hebbs-cli, and hebbs-bench to ~/.hebbs/bin/. The server runs BGE-small-en-v1.5 (ONNX) for embeddings internally -- no external embedding API needed.

2. Start the Server

hebbs-server

The server listens on localhost:6380 (gRPC) and localhost:6381 (REST) by default. On first start it prints a bootstrap API key -- save it.

3. Install the Python SDK

pip install hebbs

To include the demo app and all LLM providers:

pip install "hebbs[demo]"

4. Use the SDK

import asyncio
from hebbs import HebbsClient

async def main():
    # api_key falls back to HEBBS_API_KEY env var if not passed
    async with HebbsClient("localhost:6380", api_key="hb_...") as h:
        # Store a memory (entity-scoped)
        mem = await h.remember(
            content="Acme Corp uses Salesforce CRM and has 200 engineers",
            importance=0.8,
            context={"company": "Acme Corp", "topic": "tech_stack"},
            entity_id="acme_corp",
        )

        # Recall by semantic similarity
        results = await h.recall(
            cue="What CRM does Acme use?",
            strategies=["similarity"],
            top_k=5,
            entity_id="acme_corp",
        )
        for r in results.results:
            print(f"  [{r.score:.2f}] {r.memory.content}")

        # Prime a session (load relevant context for an entity)
        prime = await h.prime(entity_id="acme_corp", max_memories=50)
        print(f"Primed {len(prime.results)} memories")

        # Generate insights from memory clusters (uses LLM server-side)
        reflect = await h.reflect(entity_id="acme_corp")
        print(f"Created {reflect.insights_created} insights")

        # GDPR-compliant cryptographic erasure
        forget = await h.forget(entity_id="acme_corp")
        print(f"Forgot {forget.forgotten_count} memories")

asyncio.run(main())

SDK Reference

HebbsClient

Method Description
remember(content, importance, context, entity_id, edges) Store a memory
get(memory_id) Retrieve a memory by ID (bytes)
recall(cue, strategies, top_k, entity_id, scoring_weights, cue_context) Multi-strategy recall
prime(entity_id, max_memories, similarity_cue, scoring_weights) Session warm-up
revise(memory_id, content, importance, context, entity_id) Update a memory
forget(entity_id, memory_ids) GDPR-compliant erasure (by entity or by IDs)
set_policy(max_snapshots_per_memory, auto_forget_threshold, decay_half_life_days) Configure tenant policies
subscribe(entity_id, confidence_threshold) Real-time memory surfacing
reflect(entity_id) Generate insights from clusters (LLM server-side)
insights(entity_id, max_results) Retrieve accumulated insights
health() Server health check
count() Total memory count

Recall Strategies

  • similarity -- semantic vector search (HNSW, entity-filtered)
  • temporal -- time-ordered retrieval
  • causal -- cause-and-effect graph traversal
  • analogical -- cross-domain pattern matching (blends embedding + structural similarity)

Pass strategy names as strings for basic usage. For advanced tuning, pass RecallStrategyConfig objects. You can mix both in the same call:

results = await h.recall(
    cue="What happened with Acme?",
    strategies=["temporal", RecallStrategyConfig("similarity", top_k=3, ef_search=200)],
    entity_id="acme_corp",
)

RecallStrategyConfig

Per-strategy tuning parameters for advanced recall. Most users should just pass strategy names as strings. Use this when you need fine-grained control.

Field Type Default Used By Description
strategy str (required) all Strategy name: "similarity", "temporal", "causal", "analogical"
entity_id str | None None all Override entity scope for this strategy
top_k int | None None all Per-strategy result limit (separate from the top-level top_k)
ef_search int | None 50 similarity HNSW candidate count. Higher = more accurate, slower.
time_range tuple[int, int] | None None (unbounded) temporal (start_us, end_us) microsecond timestamps. When omitted, returns all memories newest-first.
seed_memory_id bytes | None None (auto) causal Starting node for graph traversal. When omitted, the engine picks the best seed.
max_depth int | None 5 (max 10) causal Maximum hops in graph traversal.
edge_types list[EdgeType] | None None (all) causal Restrict traversal to specific edge types.
analogical_alpha float | None 0.5 analogical Blend weight: 0.0 = pure structural, 1.0 = pure embedding similarity.

Causal recall -- trace cause-and-effect chains from a seed memory:

from hebbs import RecallStrategyConfig, EdgeType

results = await h.recall(
    cue="What led to the pricing pushback?",
    strategies=[
        RecallStrategyConfig(
            "causal",
            seed_memory_id=mem.id,
            max_depth=3,
            edge_types=[EdgeType.CAUSED_BY, EdgeType.FOLLOWED_BY],
        )
    ],
)

Analogical recall -- find structurally similar patterns across entities:

results = await h.recall(
    cue="enterprise CRM evaluation",
    strategies=[RecallStrategyConfig("analogical", analogical_alpha=0.7)],
    cue_context={"industry": "technology", "stage": "evaluation"},
    top_k=5,
)

Scoring Weights

Recall results are ranked by a composite score blending relevance, recency, importance, and reinforcement. Pass scoring_weights to tune the blend:

from hebbs import ScoringWeights

# Pure semantic match
results = await h.recall(
    cue="competitor pricing",
    scoring_weights=ScoringWeights(w_relevance=1.0, w_recency=0.0, w_importance=0.0, w_reinforcement=0.0),
)

# Recency-biased -- "what just happened?"
results = await h.recall(
    cue="latest updates",
    scoring_weights=ScoringWeights(w_relevance=0.2, w_recency=0.8, w_importance=0.0, w_reinforcement=0.0),
)

# Also works as a plain dict
results = await h.recall(
    cue="latest updates",
    scoring_weights={"w_relevance": 0.2, "w_recency": 0.8, "w_importance": 0.0, "w_reinforcement": 0.0},
)

Omit scoring_weights for the default blend (relevance 0.5, recency 0.2, importance 0.2, reinforcement 0.1).

Authentication

The server generates a bootstrap API key on first start and prints it to stderr. Pass it to the client:

async with HebbsClient("localhost:6380", api_key="hb_...") as h:
    ...

Or set the HEBBS_API_KEY environment variable and omit api_key -- the SDK picks it up automatically. To explicitly connect without auth, pass api_key="".

Entity Isolation (Multitenancy)

All HEBBS operations are scoped by entity_id. Memories stored under one entity are never returned when querying a different entity -- this applies to all four recall strategies, prime, reflect, and insights. No configuration needed; isolation is structural.

await h.remember(content="Uses Salesforce", entity_id="acme_corp")
await h.remember(content="Uses HubSpot", entity_id="techflow_inc")

results = await h.recall(cue="What CRM?", entity_id="acme_corp")
# Only returns "Uses Salesforce" -- techflow_inc data is invisible

Demo App

The demo ships an AI sales agent ("Atlas") that uses HEBBS for memory-augmented conversations. It shows every HEBBS operation in real-time panels: remember latency, recall scores, prime context, and session metrics.

Configure an LLM

# Pick one:
export GEMINI_API_KEY="your-key"        # Gemini (default)
export OPENAI_API_KEY="your-key"        # OpenAI
export ANTHROPIC_API_KEY="your-key"     # Anthropic
# Or use Ollama / mock (no keys needed)

Run Interactive Chat

hebbs-demo interactive

Or specify a config:

hebbs-demo interactive --config gemini-vertex  # Gemini via Vertex AI
hebbs-demo interactive --config gemini         # Gemini via API key
hebbs-demo interactive --config openai         # GPT-4o
hebbs-demo interactive --config local          # Ollama (no API key)
hebbs-demo interactive --mock-llm              # Mock LLM (no API key)

Switch entities mid-session to demonstrate multitenancy:

hebbs-demo interactive --entity acme_corp
# In-session: /session techflow_inc

Run Scenarios

hebbs-demo scenarios --all                # Run all 7 scenarios
hebbs-demo scenarios --run discovery_call # Run a specific one

Available scenarios: discovery_call, objection_handling, multi_session, reflect_learning, subscribe_realtime, forget_gdpr, multi_entity.

LLM Providers

Provider Config Env Variable
Gemini (Vertex AI) gemini-vertex.toml GOOGLE_APPLICATION_CREDENTIALS, GOOGLE_CLOUD_PROJECT
Gemini (API key) gemini.toml GEMINI_API_KEY
OpenAI openai.toml OPENAI_API_KEY
Anthropic (custom toml) ANTHROPIC_API_KEY
Ollama local.toml (none -- Ollama must be running)

Requirements

  • Python >= 3.10
  • A running HEBBS server (gRPC on port 6380)

Contributing

Contributions are welcome. By submitting a pull request, you agree to the Contributor License Agreement.

License

Copyright 2025 Parag Arora. Apache 2.0 -- see LICENSE.

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

hebbs-0.3.1.tar.gz (173.5 kB view details)

Uploaded Source

Built Distribution

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

hebbs-0.3.1-py3-none-any.whl (74.7 kB view details)

Uploaded Python 3

File details

Details for the file hebbs-0.3.1.tar.gz.

File metadata

  • Download URL: hebbs-0.3.1.tar.gz
  • Upload date:
  • Size: 173.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for hebbs-0.3.1.tar.gz
Algorithm Hash digest
SHA256 45840ed581b49a5507acb9fbfd56d30d64c62049e18d237b404718f517c15b57
MD5 48abf92284116f30de5036a20e628a1b
BLAKE2b-256 30452e020b0cdfff91fa862d7e9185381c759e6f0fd59fc1a3537a29bb7dfd62

See more details on using hashes here.

Provenance

The following attestation bundles were made for hebbs-0.3.1.tar.gz:

Publisher: publish.yml on hebbs-ai/hebbs-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file hebbs-0.3.1-py3-none-any.whl.

File metadata

  • Download URL: hebbs-0.3.1-py3-none-any.whl
  • Upload date:
  • Size: 74.7 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.7

File hashes

Hashes for hebbs-0.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 308b9177a536ee9b7c9a1ad94fef3a6885997a582f8581a04e3e337e1a67d01d
MD5 7906ed359a0c1248b611b3062b578004
BLAKE2b-256 ceb333e26cf67768234c93468ff0a5a799e3b13b9264237c2a04cd8b3a321711

See more details on using hashes here.

Provenance

The following attestation bundles were made for hebbs-0.3.1-py3-none-any.whl:

Publisher: publish.yml on hebbs-ai/hebbs-python

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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