Skip to main content

jennah-sdk-py

The Python SDK for Jennah, the memory and context platform for AI agents.

pip install jennah-sdk-py

Store and recall a memory

Sign in once with the jnh CLI (jnh login), or set JENNAH_API_KEY. Then:

import uuid

from jennah import Client
from jennah.agent.v1 import agent_pb2, memory_pb2

with Client() as client:  # uses `jnh login`, or $JENNAH_API_KEY
    agent_id = f"quickstart-{uuid.uuid4().hex[:8]}"
    client.agents.CreateAgent(
        agent_pb2.CreateAgentRequest(agent_instance_id=agent_id)
    )
    agent = client.agent(agent_id)

    # Store a memory. The platform embeds raw_content for you.
    agent.vectors.upsert(memory_pb2.VectorChunk(
        chunk_id="pref-1",
        raw_content="The customer prefers invoices in Japanese yen, "
        "sent on the 5th.",
    ))

    # Recall it by meaning, not by keyword.
    result = agent.vectors.search(memory_pb2.SemanticQuery(
        query_text="what currency does the customer want to be "
        "billed in?",
        limit=3,
    ))
    for m in result.matches:
        print(f"{m.distance:.3f}  {m.raw_content}")

    client.agents.DeleteAgent(
        agent_pb2.DeleteAgentRequest(agent_instance_id=agent_id)
    )
0.235  The customer prefers invoices in Japanese yen, sent on the 5th.

Async

AsyncClient has the same operations, awaited, over grpc.aio. Nothing it does blocks the event loop, credential renewal included.

import asyncio

from jennah import AsyncClient
from jennah.agent.v1 import memory_pb2


async def main():
    async with AsyncClient() as client:
        query = memory_pb2.SemanticQuery(
            query_text="billing preferences", limit=3
        )
        result = await client.agent("my-agent").vectors.search(query)
        print(result.matches)


asyncio.run(main())

Use Client in scripts, notebooks and evaluation harnesses; use AsyncClient inside an agent framework or any other asyncio program.

Every operation, already authenticated

Each service in the API is a generated stub on the client, already bound to the credentialed connection, so every operation is callable without a wrapper:

from jennah.agent.v1 import scope_pb2

client.scopes.ListScopes(scope_pb2.ListScopesRequest())
client.memory.InspectMemory(...)
client.datasets.ListDatasets(...)

The services are agents, memory, scopes, datasets, schema, data, auth, approvals, billing and platform. For a service added after your SDK version, client.stub(SomeServiceStub) binds it the same way. Never build your own channel to reach one: you would lose credential renewal.

client.agent(id) adds the memory shortcuts, each one single-section call: memory.commit(...) and memory.query(...) (any request field, as keywords), logs.create/logs.recent, vectors.upsert/vectors.search, and graph.write/graph.query.

Credentials

The client takes the first credential it finds, in this order:

  1. credentials=, a source your program supplies.
  2. api_key=.
  3. The JENNAH_API_KEY environment variable.
  4. The session stored by jnh login.

A signed-in session renews itself: a rejected call is renewed once and retried, and the renewed session is written back to the shared credentials file, so jnh on the same machine stays signed in. client.credential reports what authenticated the client, and where it came from, without the secret.

Development

The generated code is not committed. With jennah-api checked out next to this repository:

scripts/dev-generate.sh      # generate and lay the stubs and conformance suite in place
pip install -e '.[test]'
pytest

Metadata

Release files for jennah-sdk-py 0.70.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 jennah-sdk-py 0.70.0
File Size Uploaded
jennah_sdk_py-0.70.0.tar.gz 127.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for jennah-sdk-py 0.70.0
File Interpreter ABI Platform
jennah_sdk_py-0.70.0-py3-none-any.whl Python 3 none any Details

Total release size: 259.3 kB

Release files / jennah_sdk_py-0.70.0.tar.gz

Download URL jennah_sdk_py-0.70.0.tar.gz
Size 127.1 kB
Tags Source
SHA-256 checksum
How to use checksums
189d6a3bf5d0dc6b6d157ede3c5396da8ea79624538405b95671d8224e6bb90d
BLAKE2b-256 checksum
How to use checksums
fdc78f19efee2dcb69aab7bc64e94c55ca46fc30422e9201f69c666700225f9b
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 Oct 12, 2026.

Transparency log

Release files / jennah_sdk_py-0.70.0-py3-none-any.whl

Download URL jennah_sdk_py-0.70.0-py3-none-any.whl
Size 132.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
d62a711cf7c2b5ea54618bcbcde2228697f00811506d524d2b69eacdb6f80adb
BLAKE2b-256 checksum
How to use checksums
afd6b5e19a341bac5a9bc4229086aec57b4f8e1cd9227676f797a6674f4afb42
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 Oct 12, 2026.

Transparency log

Release history Release notifications | RSS feed

0.71.0

2 release files

This release

0.70.0 This release

2 release files

0.69.0

2 release files

0.64.0

2 release files

0.63.0

2 release files

0.62.0

2 release files

0.61.0

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