Skip to main content

SDK & shared models

Type-safe async Python SDK and the shared Pydantic models for the youSleep sleep-analysis platform. Published to PyPI as yousleep-common.

Analyze a sleep recording in three lines:

from yousleep_common.client import AsyncClient

async with AsyncClient(base_url="https://api.yousleep.ai", token="...") as client:
    result = await client.workflows.analyze_file(
        file="night.edf", analysis_config_id="u-sleep-research-v1"
    )
    print(result.biomarkers.biomarkers.tst_min, len(result.events))

What it covers

Area Detail
Workflows client.workflows runs upload → submit → poll → fetch in one call; the _temporary variants delete what they created on block exit, including on exception
Multi-file batches analyze_files submits and polls through the server's batch endpoints; per-file outcomes are returned rather than raised, so one bad file does not abort the batch. The server caps a batch at 500 items
Endpoint namespaces admin, analyses, auth, batch, billing, legal, projects, recordings, reports, status, studies, user, workflows — checked against the server's OpenAPI spec in CI (make verify-routes)
Uploads Presigned S3 PUT, streamed in 64 KiB chunks with an optional progress callback, so the file is not held in memory
Typing Pydantic v2 request/response models, py.typed, mypy strict
Auth and errors JWT with automatic refresh, retry with exponential backoff on rate limits, and one exception per failure mode (see below)

Installation

pip install yousleep-common

Requires Python 3.12+.

Quick start

Authenticate

from yousleep_common.client import AsyncClient
from yousleep_common.models import UserAuthentication

client = await AsyncClient.from_credentials(
    base_url="https://api.yousleep.ai",
    credentials=UserAuthentication(email="you@example.com", password="..."),
)

Or pass a JWT directly: AsyncClient(base_url=..., token=...).

Analyze a file end-to-end

result = await client.workflows.analyze_file(
    file="night.edf",
    analysis_config_id="u-sleep-research-v1",
    study_name="Subject 001",   # optional; inferred from filename if omitted
    age=35, sex="male",         # optional subject metadata
)
result.events                 # list[Event] | None
result.biomarkers             # BiomarkerResult | None
result.biomarkers.biomarkers  # Biomarkers: tst_min, tib_min, sleep_efficiency_pct, …

analyze_file_temporary is the ephemeral variant: it deletes everything it created when the block exits, including on error.

async with client.workflows.analyze_file_temporary(
    file="night.edf", analysis_config_id="u-sleep-research-v1"
) as result:
    export(result.biomarkers)
# project, study, recording, and analysis no longer exist

Score many files at once

result = await client.workflows.analyze_files(
    files=["sub-01.edf", "sub-02.edf", "sub-03.edf"],
    analysis_config_id="u-sleep-research-v1",
)
for ok in result.succeeded:
    print(ok.file, ok.result.biomarkers)
for bad in result.failed:
    print(bad.file, bad.status, bad.error)   # per-file; never aborts the batch

Use the low-level client

Every REST resource is a typed namespace on the client:

from pathlib import Path

from yousleep_common.models import ProjectCreate, StudyCreate, AnalysisRequest

project = await client.projects.create(ProjectCreate(name="My Study 2026"))
study = await client.studies.create(project.id, StudyCreate(name="Subject 001"))
# `upload` takes a Path or an open binary file — not a str path.
recording = await client.recordings.upload(project.id, study.id, Path("night.edf"))
analysis = await client.analyses.submit(
    project.id, study.id, recording.id,
    AnalysisRequest(analysis_config_id="u-sleep-research-v1"),
)
analysis = await client.analyses.wait_for(
    project.id, study.id, recording.id, analysis.id, timeout=3600
)
events = await client.analyses.get_events(project.id, study.id, recording.id, analysis.id)

wait_for raises ClientTimeoutError — not the builtin TimeoutError — when timeout elapses before a terminal status.

Error handling & usage limits

All SDK errors derive from YouSleepClientError:

from yousleep_common.client import (
    AnalysisWorkflowError,   # analysis ended failed/cancelled (carries logs)
    AuthenticationError,     # 401
    InsufficientCreditsError,  # 402 — not enough credits
    NotFoundError,           # 404
    QuotaExceededError,      # usage quota hit (projects/studies/analyses/hours)
    RateLimitError,          # 429 throttling (retried automatically first)
    ValidationError,         # 422
)

Quota errors are raised immediately rather than retried. Check limits and current consumption up front:

limits = await client.user.usage_limits()     # your account's usage limits (None = unlimited)
usage = await client.user.usage_detailed()    # your current usage
print(usage.storage.active, "/", limits.storage.active, "bytes")

In multi-file workflows, a quota hit on one file fails only that file's outcome — the rest of the batch continues.

Shared models

yousleep_common.models and yousleep_common.types are the platform's shared contract — the same Pydantic models and enums used by the youSleep API server. Import them for type-safe request building and response handling:

from yousleep_common.models import AnalysisRequest, Event, StudyCreate
from yousleep_common.types import AnalysisStatus, AnalysisType, EventLabel

Documentation

  • SDK guide — installing, authenticating, the shape of the client
  • Workflows guide — the high-level helpers in depth
  • API reference — generated from the source; serve it locally with make docs-serve

Development

make install   # uv sync
make check     # ruff, mypy (strict), deptry, lock check
make test      # pytest
make verify-routes  # SDK ↔ OpenAPI spec coverage check

Releases are automated with python-semantic-release (Angular commit convention).

License

Apache-2.0.

Support

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distribution

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

yousleep_common-12.13.0-py3-none-any.whl (152.5 kB view details)

Uploaded Python 3

File details

Details for the file yousleep_common-12.13.0-py3-none-any.whl.

File metadata

File hashes

Hashes for yousleep_common-12.13.0-py3-none-any.whl
Algorithm Hash digest
SHA256 3aacb8dbfd2fd3a38bcf021bd7ee6dd847aa6b49edfef18528f77b686763b0bd
MD5 20d0e1f8cf320fb5dc9e067036c2c1ae
BLAKE2b-256 f52678b492d5754e0ea200fb7c111347a8abf9c4758dacebe17eb331d6965337

See more details on using hashes here.

Provenance

The following attestation bundles were made for yousleep_common-12.13.0-py3-none-any.whl:

Publisher: publish-pypi.yml on yousleep-ai/common

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

Release history Release notifications | RSS feed

12.29.0

1 file

12.28.0

1 file

12.27.0

1 file

12.25.0

1 file

12.24.0

1 file

12.23.0

1 file

12.22.0

1 file

12.21.0

1 file

12.20.1

1 file

12.19.1

1 file

12.19.0

1 file

12.18.0

1 file

12.17.1

1 file

12.17.0

1 file

12.16.0

1 file

12.15.0

1 file

12.14.0

1 file

This release

12.13.0 This release

1 file

12.12.0

1 file

12.11.0

1 file

12.10.3

1 file

12.10.0

1 file

12.9.1

1 file

12.6.0

1 file

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page