Python SDK for Pugmark — the durable agent runtime built on object storage
Project description
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 -b file:///tmp/pug
echo '{"kind":"input","text":"hello"}' | pugmark push
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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pugmark-0.16.2.tar.gz.
File metadata
- Download URL: pugmark-0.16.2.tar.gz
- Upload date:
- Size: 37.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f778a9cd5ddfd17c7401eee3a29104d16b03babd4fa3df0db8a27682729465f0
|
|
| MD5 |
7e19da919a9989659cf72133733b04f5
|
|
| BLAKE2b-256 |
ca0afed93ced0adc88bb11375841a524c9b579d13837af0ab9d34486379f84b1
|
Provenance
The following attestation bundles were made for pugmark-0.16.2.tar.gz:
Publisher:
release.yml on firetiger-oss/pugmark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pugmark-0.16.2.tar.gz -
Subject digest:
f778a9cd5ddfd17c7401eee3a29104d16b03babd4fa3df0db8a27682729465f0 - Sigstore transparency entry: 1590453059
- Sigstore integration time:
-
Permalink:
firetiger-oss/pugmark@9eef17d01fa4cccce4737118028104cd061c2cb4 -
Branch / Tag:
refs/tags/v0.16.2 - Owner: https://github.com/firetiger-oss
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9eef17d01fa4cccce4737118028104cd061c2cb4 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pugmark-0.16.2-py3-none-any.whl.
File metadata
- Download URL: pugmark-0.16.2-py3-none-any.whl
- Upload date:
- Size: 21.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
2f2280d7fc46ced17aba88a5a2857e1e69cf17b5259b030d783e8d59acab99df
|
|
| MD5 |
12246602244add704386a9a088e09afb
|
|
| BLAKE2b-256 |
a5205a6ea9138c435e3ff9b83635b72e768bdba0deff306dbf7215534ee6d338
|
Provenance
The following attestation bundles were made for pugmark-0.16.2-py3-none-any.whl:
Publisher:
release.yml on firetiger-oss/pugmark
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pugmark-0.16.2-py3-none-any.whl -
Subject digest:
2f2280d7fc46ced17aba88a5a2857e1e69cf17b5259b030d783e8d59acab99df - Sigstore transparency entry: 1590453112
- Sigstore integration time:
-
Permalink:
firetiger-oss/pugmark@9eef17d01fa4cccce4737118028104cd061c2cb4 -
Branch / Tag:
refs/tags/v0.16.2 - Owner: https://github.com/firetiger-oss
-
Access:
private
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
release.yml@9eef17d01fa4cccce4737118028104cd061c2cb4 -
Trigger Event:
push
-
Statement type: