Skip to main content

Pugmark Python SDK

Python SDK for writing Pugmark handlers. A handler is a process the Pugmark runtime invokes on each new event in a session; it reads inputs from stdin, fetches object bodies over HTTP, and writes outputs back to stdout.

Install

pip install pugmark

Minimal handler

A pugmark session is an append-only log of JSON events. On every invocation pugmark feeds the handler the full log on stdin. Walk it, decide one next event, append it.

import pugmark

log = list(pugmark.read())
last = log[-1].decode_json() if log else None
match last:
    case {"kind": "input", "text": text}:
        pugmark.write({"kind": "echo", "text": text.upper()})
    case _:
        pugmark.pause("nothing to echo")

Run it under the Pugmark CLI:

pugmark start
pugmark push <<<'{"kind":"input","text":"hello"}'
pugmark run --once -- python handler.py
pugmark log -A           # input event, then echo event ({"text":"HELLO"})

Writing outputs

pugmark.write accepts either a pugmark.Object or a raw Python value. Content type is auto-detected unless overridden.

pugmark.write("hello", name="reply")                  # text/plain
pugmark.write({"answer": 42}, name="result")          # application/json
pugmark.write(b"\x00\x01", name="bin")                # application/octet-stream
pugmark.write("# Title", name="doc", content_type="text/markdown")

Explicit helpers when you'd rather not rely on type dispatch:

pugmark.write_text("hello", name="reply")
pugmark.write_json({"answer": 42}, name="result")
pugmark.write_bytes(b"\x00\x01", name="bin")

Reading inputs

pugmark.read() walks the full session log in order — including any inherited parent-session entries. This is the primary primitive for log-replay handlers; iterate it once per invocation to reconstruct everything you need.

for obj in pugmark.read():
    event = obj.decode_json()       # every entry is JSON
    fold(state, event)              # accumulate whatever the handler needs

For ad-hoc named lookups (slot-filling workflows where each name appears at most once), pugmark.state() returns a dict-like view of the session keyed by object name. Note that names are collapsing — only the most recently written object per name survives — so this isn't appropriate for conversations or any log with repeated entry kinds.

state = pugmark.state()             # dict-like; one entry per unique name
if "config" in state:
    cfg = state["config"].decode_json()

Named loads with the right decoder built in:

text  = pugmark.load_text("greeting")
reply = pugmark.load_json("result")
blob  = pugmark.load_bytes("bin")

Object methods

Every object (local or remote) supports:

Method Returns
body() raw bytes (auto-decompressed)
content_type() MIME type string
name() optional name set by the writer
metadata() Dict[str, str]
decode_text() UTF-8 decoded str
decode_json() parsed JSON value
decode_data() raw bytes

Control flow

pugmark.pause("waiting for next user message")     # suspend until next event
pugmark.sleep(60, reason="rate-limited")           # suspend for 60 seconds

Events

Each handler invocation is triggered by an event. Iterate pugmark.events() to inspect:

for event in pugmark.events():
    match event:
        case pugmark.StartEvent():       ...    # new root session
        case pugmark.ForkEvent():        ...    # forked from a parent
        case pugmark.WakeEvent():        ...    # resumed from pause/sleep
        case pugmark.PushEvent() as e:   ...    # object was pushed; e.object is the Object

OpenTelemetry

The SDK ships optional OpenTelemetry trace context propagation. Install with the otel extra to enable:

pip install 'pugmark[otel]'

Requirements

  • Python 3.11+
  • zstandard (installed automatically)

License

Apache License 2.0.

Metadata

Release files for pugmark 0.16.7

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for pugmark 0.16.7
File Size Uploaded
pugmark-0.16.7.tar.gz 37.8 kB Details

Built distribution (wheel)

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

Total release size: 59.7 kB

Release files / pugmark-0.16.7.tar.gz

Download URL pugmark-0.16.7.tar.gz
Size 37.8 kB
Tags Source
SHA-256 checksum
How to use checksums
69c6d5a9e833f49e9e5a2cf9f891cc8839c322863a8b5ed0301ffae0619e0934
BLAKE2b-256 checksum
How to use checksums
bd5f049e1e7877e309043c1376ae90f7b8c171f2ea4c3c1432fa2150f73323d0
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jun 26, 2026.

Transparency log

Release files / pugmark-0.16.7-py3-none-any.whl

Download URL pugmark-0.16.7-py3-none-any.whl
Size 21.9 kB
Tags Python 3
SHA-256 checksum
How to use checksums
6dfb025ce2e4dede3eac0dd31e1fffa9d036bc875460daee128cad8226799e82
BLAKE2b-256 checksum
How to use checksums
f40757720e78e1cf5e3d5b5d83fd788de0939483ae962ed9fbadf823dc7f1b16
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

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 Jun 26, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.16.7 This release

2 release files

0.16.6

2 release files

0.16.5

2 release files

0.16.4

2 release files

0.16.3

2 release files

0.16.2

2 release files

0.1.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