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.67.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.67.0
File Size Uploaded
jennah_sdk_py-0.67.0.tar.gz 123.4 kB Details

Built distribution (wheel)

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

Total release size: 252.4 kB

Release files / jennah_sdk_py-0.67.0.tar.gz

Download URL jennah_sdk_py-0.67.0.tar.gz
Size 123.4 kB
Tags Source
SHA-256 checksum
How to use checksums
cb2129930b4657097c2d4bbcb9b629142d60f93983d9c9309e31344507b686cb
BLAKE2b-256 checksum
How to use checksums
9e940a49cb1da12aa54fc7d86ef6a74bcc3cf9735ee082a39184d033c29013a3
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 8, 2026.

Transparency log

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

Download URL jennah_sdk_py-0.67.0-py3-none-any.whl
Size 128.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
eea81c0fe59ab469aabfc1ab8c5bc51175ec30cd29a32d8ebe7d433764360980
BLAKE2b-256 checksum
How to use checksums
81c18ea74dab70c6e66c44a0ec0175d8be3fcf36887b641b4f5dc0a01525038f
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 8, 2026.

Transparency log

Release history Release notifications | RSS feed

0.71.0

2 release files

0.70.0

2 release files

0.69.0

2 release files

This release

0.67.0 This release

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