The waveassist SDK.
The Python library your agent imports. Your coding agent writes against it; this is what it's writing.
Install
Agents built over MCP already run against the SDK, so you rarely install it by hand. When you do, work locally, or read the source:
$ pip install waveassist
Call init() once at the top of every node. It resolves your credentials from arguments, environment variables, or a local .env.
Anatomy of an agent
An agent is a Python module WaveAssist runs on a schedule. Your coding agent writes it; these are the parts it uses.
import waveassist
from pydantic import BaseModel
waveassist.init()
class Summary(BaseModel):
items: list[str]
def run():
data = waveassist.fetch_data("inbox")
out = waveassist.call_llm(
model="anthropic/claude-haiku-4.5",
prompt=summarize(data),
response_model=Summary,
)
waveassist.send_email("Daily summary", render(out))
waveassist.store_data("last", out, data_type="json")State
store_data and fetch_data carry values between runs, so each fire resumes from the last instead of starting cold. Values can be strings, JSON-serializable objects, or pandas DataFrames. Pass run_based=True to scope a value to a single run.
waveassist.store_data("last_review", review, data_type="json")
pr = waveassist.fetch_data("pull_request", default={})Full signatures on the API reference.
Intelligence
call_llm is the one place the model runs at runtime. It takes a response_model, a Pydantic class, and returns a typed instance of it. The model fills the content; the schema locks the shape. That is what makes the output deterministic in structure, run after run.
class Review(BaseModel):
summary: str
risk: str
comments: list[str]
review = waveassist.call_llm(
model="anthropic/claude-haiku-4.5",
prompt=review_prompt(pr),
response_model=Review,
)Guard side effects during the verify pass with is_test_run(), which is True on the dry run before the schedule arms.
Output
Ship results with the output helpers: send_email for HTML mail, and publish_dashboard to store an HTML dashboard and get back a public shareable URL.
waveassist.send_email("Daily summary", render(out))
url = waveassist.publish_dashboard(html)