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.64.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.64.0
File Size Uploaded
jennah_sdk_py-0.64.0.tar.gz 122.3 kB Details

Built distribution (wheel)

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

Total release size: 250.2 kB

Release files / jennah_sdk_py-0.64.0.tar.gz

Download URL jennah_sdk_py-0.64.0.tar.gz
Size 122.3 kB
Tags Source
SHA-256 checksum
How to use checksums
6dcff3aafad6dea78d8f84ab9e7aa4f65f975587473c3d82505b500d3188f362
BLAKE2b-256 checksum
How to use checksums
95ac682833393a233a8678e2bb8591193f9700a090d009a129cd6585d6d783fb
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 / jennah_sdk_py-0.64.0-py3-none-any.whl

Download URL jennah_sdk_py-0.64.0-py3-none-any.whl
Size 127.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
9369de40a19b93871a8b8fcbb48a92e4dbe3a6adbf0f31dc449ff39f29ac294d
BLAKE2b-256 checksum
How to use checksums
fa8adc6d5e9486c62093a72d51d37c1d05fa6f06ed21dd14f393be462af03fbe
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

0.71.0

2 release files

0.70.0

2 release files

0.69.0

2 release files

This release

0.64.0 This release

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