Python SDK

jaina-sdk — sync and async clients with Pydantic typing.

Install

pip install jaina-sdk

Quickstart (sync)

import os
from jaina import JainaClient

with JainaClient(api_key=os.environ["JAINA_API_KEY"]) as jaina:
    projects = jaina.projects.list()
    for p in projects.items:
        print(p.slug)

Quickstart (async)

import asyncio, os
from jaina import AsyncJainaClient

async def main():
    async with AsyncJainaClient(api_key=os.environ["JAINA_API_KEY"]) as jaina:
        projects = await jaina.projects.list()
        for p in projects.items:
            print(p.slug)

asyncio.run(main())

Typed records with Pydantic

from pydantic import BaseModel
from jaina import JainaClient

class Enemy(BaseModel):
    name: str
    hp: int
    attack: int
    sprite: str
    rarity: str

with JainaClient(api_key="...") as jaina:
    enemies = jaina.records.list(
        "my-game",
        "enemy",
        model=Enemy,
        filter={"data.hp": {"gte": 50}},
    )
    for e in enemies.items:
        print(f"{e.data.name} (HP {e.data.hp})")

Generate the Pydantic model with jaina codegen --lang python.

Pagination

for page in jaina.records.paginate("my-game", "enemy"):
    for record in page.items:
        process(record)

Or async:

async for page in jaina.records.paginate_async("my-game", "enemy"):
    for record in page.items:
        await process(record)

Error handling

from jaina import JainaError, ValidationError

try:
    jaina.records.create("my-game", "enemy", data={"name": "Goblin"})
except ValidationError as e:
    print(e.issues)
except JainaError as e:
    print(e.status, e.code, e.message)

Context managers

JainaClient and AsyncJainaClient both implement context-manager protocols. Always use with / async with to ensure the underlying HTTP session is closed.