WaveAssist Python SDK for storing and retrieving structured data, LLM integration, and credit management
Project description
WaveAssist SDK & CLI ๐
WaveAssist SDK makes it simple to store and retrieve data in your automation workflows. Access your projects through our Python SDK or CLI.
โจ Features
- ๐ One-line
init()to connect with your WaveAssist project - โ๏ธ Automatically works on local and WaveAssist Cloud (worker) environments
- ๐ฆ Store and retrieve data (DataFrames, JSON, strings)
- ๐ง LLM-friendly function names (
init,store_data,fetch_data) - ๐ Auto-serialization for common Python objects
- ๐ Publish HTML dashboards with shareable public URLs
- ๐ค LLM integration with structured outputs via Instructor and OpenRouter
- ๐ณ Credit management and automatic email notifications
- ๐ฅ๏ธ Command-line interface for project management
- โ Built for automation workflows, cron jobs, and AI pipelines
๐ Getting Started
1. Install
pip install waveassist
2. Initialize the SDK
import waveassist
# Option 1: Use no arguments (recommended)
waveassist.init()
# Option 2: With explicit parameters
waveassist.init(
token="your-user-id",
project_key="your-project-key",
environment_key="your-env-key", # optional
run_id="run-123", # optional
check_credits=True # optional: raises RuntimeError if credits_available is "0"
)
# When check_credits=True, a missing credits_available key is treated as credits available (default "1").
# Will auto-resolve from:
# 1. Explicit args (if passed)
# 2. .env file (uid, project_key, environment_key)
# 3. Worker-injected credentials (on [WaveAssist Cloud](https://waveassist.io))
๐ Setting up .env (for local runs)
uid=your-user-id
project_key=your-project-key
# optional
environment_key=your-env-key
This file will be ignored by Git if you use our default .gitignore.
3. Store Data
Data is serialized by type. You can rely on type-safe storage and retrieval.
๐งพ Store a string
waveassist.store_data("welcome_message", "Hello, world!")
๐ Store a DataFrame
import pandas as pd
df = pd.DataFrame({"name": ["Alice", "Bob"], "score": [95, 88]})
waveassist.store_data("user_scores", df)
๐ง Store JSON/dict/array
profile = {"name": "Alice", "age": 30}
waveassist.store_data("profile_data", profile)
๐ Optional: Force storage type
Store data as a specific type regardless of input:
# Store a dict as a string
waveassist.store_data("config", {"a": 1}, data_type="string")
# Store a string as JSON (wraps as {"value": "..."})
waveassist.store_data("greeting", "Hello", data_type="json")
Parameters: store_data(key, data, run_based=False, data_type=None). Use data_type="string", "json", or "dataframe" to force that storage type.
4. Fetch Data
result = waveassist.fetch_data("user_scores")
# Returns the correct type:
# - pd.DataFrame (if stored as dataframe)
# - dict or list (if stored as JSON)
# - str (if stored as string)
Use a default when the key might be missing:
# Return a default if key is missing or API fails
count = waveassist.fetch_data("failure_count", default=0)
greeting = waveassist.fetch_data("welcome", default="Hello")
df = waveassist.fetch_data("results", default=pd.DataFrame()) # empty DataFrame
Parameters: fetch_data(key, run_based=False, default=None).
5. Send Email
Send emails (e.g. for notifications) via the WaveAssist backend:
waveassist.send_email(
subject="Daily report",
html_content="<p>Summary: ...</p>",
attachment_file=open("report.pdf", "rb"), # optional
raise_on_failure=True # default: raise WaveAssistEmailError on validation or API failure
)
- Validation: Subject and HTML body must be non-empty (and within length limits). Attachments must be file-like with a
.read()method. - Retry: The SDK retries the send once on transient failure.
- Errors: By default, validation failures raise
ValueErrorand API failures raiseRuntimeError. Passraise_on_failure=Falseto returnFalseinstead.
6. Publish an HTML Dashboard
Generate a shareable public URL for an HTML dashboard. Anyone with the link can view it โ no login required.
import waveassist
waveassist.init()
html = """
<html>
<head><title>Weekly Report</title></head>
<body>
<h1>Sales Summary</h1>
<p>Total revenue: $12,340</p>
</body>
</html>
"""
# Publish and get a shareable URL
url = waveassist.publish_dashboard(html)
print(url) # https://api.waveassist.io/d/a3f8c2d19e7b4f2ab5c8.../
# Email the link to yourself
waveassist.send_email(
subject="Your Dashboard is Ready",
html_content=f'<p>View your dashboard: <a href="{url}">{url}</a></p>'
)
Static vs Per-Run Dashboards:
# Static โ same data_key, URL always shows the latest content
url = waveassist.publish_dashboard(html, data_key="weekly_report")
# Per-run โ each run gets its own unique dashboard URL
url = waveassist.publish_dashboard(html, run_based=True)
Parameters: publish_dashboard(html_content, data_key="dashboard_html", run_based=False). Returns the public URL string, or None on failure.
7. Check Credits and Notify
Check OpenRouter credits and automatically send email notifications if insufficient credits are available:
# Check if you have enough credits for an operation
has_credits = waveassist.check_credits_and_notify(
required_credits=10.5,
assistant_name="WavePredict"
)
if has_credits:
# Proceed with your operation
print("Credits available, proceeding...")
else:
# Credits insufficient - email notification sent (max 3 times)
print("Insufficient credits, operation skipped")
Features:
- Automatically checks OpenRouter credit balance
- Sends email notification if credits are insufficient (max 3 times)
- Resets notification count when credits become sufficient
- Stores credit availability status for workflow control
8. Call LLM with Structured Outputs
Get structured responses from LLMs via OpenRouter with Pydantic models:
from pydantic import BaseModel
# Define your response structure
class UserInfo(BaseModel):
name: str
age: int
email: str
# Call LLM with structured output
result = waveassist.call_llm(
model="gpt-4o",
prompt="Extract user info: John Doe, 30, john@example.com",
response_model=UserInfo
)
print(result.name) # "John Doe"
print(result.age) # 30
print(result.email) # "john@example.com"
Setup:
- Store your OpenRouter API key:
waveassist.store_data('open_router_key', 'your_openrouter_api_key')
- Use
call_llm()with any Pydantic model for structured outputs
Advanced Usage:
result = waveassist.call_llm(
model="anthropic/claude-3-opus",
prompt="Analyze this data...",
response_model=MyModel,
should_retry=True, # retry once on JSON/format errors
max_tokens=3000,
extra_body={"web_search_options": {"search_context_size": "medium"}}
)
Errors: RuntimeError (API/network failure), ValueError (invalid or non-JSON response). Transport errors are retried once automatically.
๐ฅ๏ธ Command Line Interface
WaveAssist CLI comes bundled with the Python package. After installation, you can use the following commands:
๐ Authentication
waveassist login
This will open your browser for authentication and store the token locally.
๐ค Push Code
waveassist push PROJECT_KEY [--force]
Push your local Python code to a WaveAssist project.
๐ฅ Pull Code
waveassist pull PROJECT_KEY [--force]
Pull Python code from a WaveAssist project to your local machine.
โน๏ธ Version Info
waveassist version
Display CLI version and environment information.
๐งช Running Tests
Run with pytest (recommended) or the test scripts:
# All tests (use project Python if you have a venv)
python -m pytest tests/ -v
# Or run modules directly
python tests/test_core.py
python tests/test_json_generate.py
python tests/test_json_extract.py
โ Includes tests for:
- String, JSON, and DataFrame roundtrips;
store_datawith explicitdata_type;fetch_datawithdefault send_emailvalidation, attachments, andraise_on_failure- Error handling when
init()is not called (RuntimeError) - Environment variable and
.envfile resolution - JSON template generation for Pydantic models
- JSON extraction from various formats (pure JSON, markdown code blocks, embedded text)
- Soft parsing with missing required fields (safety fallback for LLM responses)
- Type coercion and nested model handling
๐ Project Structure
WaveAssist/
โโโ waveassist/
โ โโโ __init__.py # Public API: init(), store_data(), fetch_data(), publish_dashboard(),
โ โ # send_email(), check_credits_and_notify(), call_llm()
โ โโโ _config.py # Global config and version
โ โโโ constants.py # API_BASE_URL, OpenRouter, dashboard URLs
โ โโโ utils.py # API helpers, JSON parsing, soft_parse, exception classes
โ โโโ core.py # CLI: login, pull, push (uses constants for URLs)
โ โโโ cli.py # Command-line entry (waveassist login/push/pull/version)
โโโ tests/
โ โโโ test_core.py # Core SDK + send_email tests
โ โโโ test_json_generate.py # JSON template generation tests
โ โโโ test_json_extract.py # JSON extraction/parsing tests
โ โโโ test_llm_call.py # call_llm integration tests (skipped without API key)
๐ Notes
- Data is stored in your WaveAssist backend (e.g. MongoDB) as serialized content
store_data()auto-detects the object type and serializes it (dataframe/JSON/string), or usedata_typeto force a typefetch_data()returns the correct Python type and supports adefaultwhen the key is missing or the API fails- Logging: The SDK uses the standard library
loggingmodule (logger name"waveassist"). Configure level or handlers to control or suppress SDK messages (e.g.logging.getLogger("waveassist").setLevel(logging.WARNING)). - Errors: The SDK raises standard exceptions:
ValueErrorfor bad or missing input (e.g. missing uid/project_key in init, email validation, OpenRouter key not found, LLM JSON/format failure) andRuntimeErrorfor invalid state or API failures (e.g. not initialized, credits not available, send email failed, LLM API/network failure). CatchValueErrororRuntimeError(orException) as needed.
๐ง Example Use Cases
Basic Data Storage
import waveassist
waveassist.init() # Auto-initialized from .env or worker
# Store GitHub PR data
waveassist.store_data("latest_pr", {
"title": "Fix bug in auth",
"author": "alice",
"status": "open"
})
# Later, fetch it for further processing
pr = waveassist.fetch_data("latest_pr")
print(pr["title"])
LLM Integration with Credit Management
import waveassist
from pydantic import BaseModel
waveassist.init()
# Store OpenRouter API key
waveassist.store_data('open_router_key', 'your_api_key')
# Check credits before expensive operation
required_credits = 5.0
if waveassist.check_credits_and_notify(required_credits, "MyAssistant"):
# Use LLM with structured output
class AnalysisResult(BaseModel):
summary: str
confidence: float
recommendations: list[str]
result = waveassist.call_llm(
model="gpt-4o",
prompt="Analyze this data and provide recommendations...",
response_model=AnalysisResult
)
# Store the structured result
waveassist.store_data("analysis_result", result.dict())
๐ค Contributing
Want to add formats, features, or cloud extensions? PRs welcome!
๐ฌ Contact
Need help or have feedback? Reach out at connect@waveassist.io, visit WaveAssist.io, or open an issue.
ยฉ 2026 WaveAssist
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 waveassist-0.7.1.tar.gz.
File metadata
- Download URL: waveassist-0.7.1.tar.gz
- Upload date:
- Size: 37.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
691b878f4c6bbffd2117ffc5a2e383f052281c1647a307e94a14777427b0ca60
|
|
| MD5 |
c6f3cdf83003157a91bf6349e3d76302
|
|
| BLAKE2b-256 |
02f6df3b642c39108ee4c8a012190b604fa6ae64f0d88c309e9e295f862dbff7
|
Provenance
The following attestation bundles were made for waveassist-0.7.1.tar.gz:
Publisher:
python-publish.yml on WaveAssist/WaveAssist
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
waveassist-0.7.1.tar.gz -
Subject digest:
691b878f4c6bbffd2117ffc5a2e383f052281c1647a307e94a14777427b0ca60 - Sigstore transparency entry: 1103945144
- Sigstore integration time:
-
Permalink:
WaveAssist/WaveAssist@7623949b626bb91243819a98df96ca6ead4467b1 -
Branch / Tag:
refs/tags/0.7.1 - Owner: https://github.com/WaveAssist
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@7623949b626bb91243819a98df96ca6ead4467b1 -
Trigger Event:
release
-
Statement type:
File details
Details for the file waveassist-0.7.1-py3-none-any.whl.
File metadata
- Download URL: waveassist-0.7.1-py3-none-any.whl
- Upload date:
- Size: 21.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3041b2e3dc1a69cd47621a4d8bc818e32334198a4b7748c690ddfd57825e2ddd
|
|
| MD5 |
b016c54df269794c2fbc9f55b011ee8e
|
|
| BLAKE2b-256 |
21da9d69c2db97187ed244cc318f122c312508add9226b32e91efa51273973d3
|
Provenance
The following attestation bundles were made for waveassist-0.7.1-py3-none-any.whl:
Publisher:
python-publish.yml on WaveAssist/WaveAssist
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
waveassist-0.7.1-py3-none-any.whl -
Subject digest:
3041b2e3dc1a69cd47621a4d8bc818e32334198a4b7748c690ddfd57825e2ddd - Sigstore transparency entry: 1103945208
- Sigstore integration time:
-
Permalink:
WaveAssist/WaveAssist@7623949b626bb91243819a98df96ca6ead4467b1 -
Branch / Tag:
refs/tags/0.7.1 - Owner: https://github.com/WaveAssist
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@7623949b626bb91243819a98df96ca6ead4467b1 -
Trigger Event:
release
-
Statement type: