Skip to main content

nocville

Python SDK for pushing status updates to Nocville.

Installation

pip install nocville

For async support:

pip install nocville[async]

Usage

Synchronous

from nocville import NocvilleClient, Status, Mood

client = NocvilleClient(
    api_key="your-api-key",
    service_id="my-service",
)

# Push a status update
response = client.push_status(
    status=Status.HEALTHY,
    mood=Mood.HAPPY,
    message="All systems operational",
    metrics={"cpu": 45, "memory": 60},
)

# Quick helpers
client.healthy("Everything is fine")
client.warning("High memory usage")
client.critical("Service down!")

Asynchronous

import asyncio
from nocville.client import AsyncNocvilleClient, Status

async def main():
    client = AsyncNocvilleClient(
        api_url="https://your-nocville-server.com",
        api_key="your-api-key",
        service_id="my-service",
    )

    response = await client.push_status(
        status=Status.HEALTHY,
        message="All systems operational",
    )

asyncio.run(main())

Configuration

Option Type Default Description
api_key str required Team API key for authentication
api_url str https://nocville.com Nocville API URL (override for development)
service_id str required The service ID this client represents
timeout float 5.0 Request timeout in seconds
retries int 3 Number of retry attempts on failure
retry_delay float 1.0 Base delay between retries in seconds
debug bool False Enable debug logging

Status Values

  • Status.HEALTHY - Service is operating normally
  • Status.WARNING - Service has non-critical issues
  • Status.CRITICAL - Service has critical issues
  • Status.UNKNOWN - Service status cannot be determined

Mood Values

  • Mood.HAPPY - NPC appears happy
  • Mood.CONCERNED - NPC appears concerned
  • Mood.STRESSED - NPC appears stressed
  • Mood.IDLE - NPC appears neutral

License

MIT

Maps, AI coworkers and shutdown

Both clients accept map="Ops" (map name or ID) and the same keyword-only status fields:

from nocville import NocvilleClient, BehaviorHints, CompanionSpec

client = NocvilleClient(api_key="your-api-key", service_id="build-agent", map="Ops")
behavior: BehaviorHints = {"activity": "busy", "busy": "seek-desk"}
companion: CompanionSpec = {
    "screenType": "desk-sign",
    "placement": "on-desk",
    "size": {"w": 3, "h": 1},
    "label": "checkout-api",
}
try:
    client.push_status(
        "healthy", name="Claude", message="Running tests",
        behavior=behavior, companion=companion,
        appearance={"family": "claude"},
        agent_stats={"added": 12, "removed": 3},
    )
finally:
    client.shutdown()

behavior["activity"] is optional (it is derived from status/mood when omitted). busy and critical move the NPC to its busy target (desk, seek-companion device or equipment); idle follows the idle hint; waiting freezes the NPC wherever it stands with a raised hand and never walks it anywhere. Reserve waiting for "blocked on a human"; send busy for a degraded (warning) service so it stays at its device.

agent_stats becomes agentStats on the wire. Behavior and companion dictionaries use API camelCase keys. offline=True immediately removes the NPC. shutdown() stops and drains heartbeats before sending an unknown/idle/offline sentinel, and returns a PushResponse; use await client.shutdown() for AsyncNocvilleClient.

auto_offline=True opts into a best-effort interpreter-exit callback (default False). For async clients this callback uses a synchronous request because the event loop may already be closed. Prefer explicit shutdown in finally; exit callbacks cannot run after SIGKILL or a crash. Python 3.9 or newer is required.

Silly office characters

The BehaviorHints type supports the built-in office routines. Use matching kind and behavior.role values so the character also gets the right appearance:

client.push_status(
    "healthy",
    kind="office-cat",
    behavior={"role": "office-cat", "activity": "idle"},
)

Keep sending heartbeats while the character should stay in the office. Available roles are receptionist, security, janitor, barista, office-cat, office-dog, plant-caretaker, it-technician, and out-of-touch-executive. The Nocville server runs movement and dialogue; it must be updated to support these routines. For ready-made CLI processes, use the @nocville/npc npm package.

Metadata

Release files for nocville 0.3.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 nocville 0.3.0
File Size Uploaded Provenance
nocville-0.3.0.tar.gz 11.9 kB With provenance Details

Built distribution (wheel)

Table of built distributions (wheels) for nocville 0.3.0
File Interpreter ABI Platform
nocville-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 22.7 kB

Release files / nocville-0.3.0.tar.gz

Download URL nocville-0.3.0.tar.gz
Size 11.9 kB
Tags Source
SHA-256 checksum
How to use checksums
46518608c4bb507783be8ba1ff5aa635c75bccfedf573057c086bed870687ddb
BLAKE2b-256 checksum
How to use checksums
a3996e57ad5e123df058653f5c6c68362e289d92686d37e8fa47139db0568574
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 / nocville-0.3.0-py3-none-any.whl

Download URL nocville-0.3.0-py3-none-any.whl
Size 10.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
034f5ec78421adb1423e3f09aca40a6b3fd0f89141fb9939937184aa7d42963e
BLAKE2b-256 checksum
How to use checksums
43a88b2450e0c2c10ddb6c441e840cdf0cb045d165d26e68a5360ad14c4e7027
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

Security for nocville 0.3.0

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.

Full provenance

All 2 files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for nocville-0.3.0.tar.gz

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

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

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