Zyphr Muse — AI Authoring
Zyphr Muse is the AI assistant baked into the dashboard. It writes subject lines, drafts templates, rewrites blocks, generates whole workflows from a sentence, and analyzes broadcasts before you send — all grounded in your project's real data, not generic templates.
Muse is a paid-plan entitlement. Free accounts see the entry points with an upgrade prompt; only Starter+ plans can invoke.
What Muse can do
| Surface | What it does | Model tier | Where it lives |
|---|---|---|---|
| Subject suggestions | Ranks 5 candidate subject lines for an email or push template by predicted open rate | Haiku 4.5 | Template editor → "Suggest with Muse" |
| Draft template | Generates a full template (subject + HTML + text, or push/SMS bodies) from a one-paragraph brief | Sonnet 4.6 | Templates → "Generate with AI" |
| Rewrite block | Rewrites a selected block per a natural-language instruction ("make it shorter", "more formal") | Sonnet 4.6 | Template editor → selection toolbar |
| Generate workflow | Turns a sentence into a fully-structured workflow with triggers, delays, branches, and channel steps | Opus 4.7 | Workflows → "Generate with AI" |
| Analyze before sending | Pre-send advisory citing deliverability risks, frequency conflicts, audience warnings, content notes, and a recommended action | Opus 4.7 | Template editor → "Analyze before sending" |
Plan tiers and monthly quotas
Each paid plan grants per-action monthly quotas. Quotas reset on the first of each calendar month UTC.
| Action | Starter | Pro | Scale | Enterprise |
|---|---|---|---|---|
| Subject suggestions | 200 | 1,000 | 5,000 | Unlimited |
| Template drafts | 25 | 150 | 750 | Unlimited |
| Block rewrites | 50 | 300 | 1,500 | Unlimited |
| Workflow generations | 5 | 25 | 100 | Unlimited |
| Broadcast analyses | 4 | 30 | 150 | Unlimited |
Free plan is not eligible — Muse entry points show an upgrade prompt.
Once any per-action quota is exhausted, calls to that action return a muse_quota_exceeded error until the next month. Other actions continue to work — running out of workflow generations does NOT stop you from drafting templates. The dashboard's Usage tab shows real-time progress against every quota.
Enterprise quotas are unlimited; overage above a customer-specific monthly volume is billed at a negotiated per-call rate.
Per-call cost is shown in the dashboard for transparency, but customers pay for calls, not Bedrock dollars — we absorb the underlying model cost.
What Muse can see — grounding
Muse never sees other customers' data. Every prompt is scoped to a single project_id, and the grounding context is pulled from your project's own database rows:
- Subject suggestions — your project's send history (open rates by pattern, spammy-word frequency, brand-voice examples from recent subjects)
- Draft template / Rewrite — your template library (available Handlebars variables, tone examples from your existing templates, optional reference template)
- Generate workflow — your configured channels, known event types from existing triggers, names of existing workflows (to mirror naming style)
- Analyze broadcast — your project's reputation metrics (bounce rate, complaint rate, rolling send counters), suppression list breakdown by reason, 24h and 7d send activity, topic health, scheduled-overlap window, and sender-domain verification status
Project isolation is enforced at the query layer: every grounding fetch requires project_id and every query filters on it. There is no cross-project leakage.
Privacy and PII
Muse uses AWS Bedrock as the model gateway, running Claude models in your AWS region. Anthropic does not retain prompts or completions submitted via Bedrock.
The audit layer logs only scrubbed request data — counts and shapes, not raw content. For example, the audit row for a "draft template" call includes the brief length and the number of available variables, but never the brief text or the recipient list. The full response text is persisted on the audit row because it's the generated artifact itself — review it from the dashboard audit log.
If a brief or block you paste into Muse contains real PII (a customer's name, email, support ticket text), that content is sent to Bedrock as part of the prompt. We scrub on the way in and warn you when we detect PII-shaped input in a brief, but the safest practice is to avoid pasting customer data into AI fields when you can paraphrase instead.
Invoking from the dashboard
Every Muse entry point is an "AI" sparkle button next to the existing manual control:
- Template subject field → "Suggest with Muse" popover (5 ranked candidates with rationale)
- Templates page → "Generate with AI" → brief-input modal with streaming preview
- Template editor → "Analyze before sending" → severity-coded advisory card stack
- Workflows page → "Generate with AI" → describes-in-English → step-tree preview with per-step accept/reject
Streaming endpoints emit tokens as they arrive (SSE), then a final complete event with the validated payload and cost metadata. The dashboard renders the streaming text so you see progress.
Invoking from the API
Muse endpoints live under /v1/muse/ and use the same auth as the rest of the API (JWT or API key).
Entitlement check
curl https://api.zyphr.dev/v1/muse/entitlement \
-H "X-API-Key: zy_live_your_key"
{
"enabled": true,
"plan": "pro",
"required_plan": "starter",
"quotas": {
"suggest_subjects": 1000,
"draft_template": 150,
"rewrite_template": 300,
"generate_workflow": 25,
"analyze_broadcast": 30
}
}
Suggest subject lines
curl -X POST https://api.zyphr.dev/v1/muse/subjects/suggest \
-H "X-API-Key: zy_live_your_key" \
-H "Content-Type: application/json" \
-d '{
"channel": "email",
"project_id": "your-project-uuid",
"template_body": "Welcome to Acme! Click below to verify your email."
}'
Stream a generated template
curl -N -X POST https://api.zyphr.dev/v1/muse/templates/draft \
-H "X-API-Key: zy_live_your_key" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"channel": "email",
"project_id": "your-project-uuid",
"brief": "Order confirmation email mentioning the order total and estimated delivery date."
}'
The response is a Server-Sent Events stream. Events:
token— chunked model outputvariables_validated— post-processor list of auto-corrected variables and flagged unknownscomplete— final{ template, metadata }payloadparse_failed— model emitted unparseable JSON; the dashboard retries onceerror— plan gate, budget, throttling, or internal failuredone— stream terminator
Stream a generated workflow
curl -N -X POST https://api.zyphr.dev/v1/muse/workflows/generate \
-H "X-API-Key: zy_live_your_key" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"project_id": "your-project-uuid",
"description": "When a user signs up but doesn'\''t verify their email within 48 hours, send a reminder email. If they still haven'\''t verified after another 48 hours, escalate to SMS."
}'
Returns a strict-schema workflow JSON object after Opus emits tokens. The schema validator rejects malformed output before it reaches you — the platform never auto-creates workflows from unvalidated AI output.
Analyze a broadcast before sending
curl -N -X POST https://api.zyphr.dev/v1/muse/broadcasts/analyze \
-H "X-API-Key: zy_live_your_key" \
-H "Content-Type: application/json" \
-H "Accept: text/event-stream" \
-d '{
"project_id": "your-project-uuid",
"draft": {
"channel": "email",
"subject": "Welcome to Acme",
"body": "<h1>Welcome!</h1><p>Get started by verifying your email.</p>",
"topic_key": "welcome",
"audience_size_estimate": 250
}
}'
Final advisory shape:
{
"summary": "...",
"recommended_action": "send" | "send_with_caution" | "delay" | "revise_before_send",
"deliverability_risks": [ { "severity": "high|medium|low", "title": "...", "detail": "...", "fix": "..." } ],
"frequency_conflicts": [ ... ],
"audience_warnings": [ ... ],
"send_time_suggestions": [ { "suggested_at": "...", "reason": "..." } ],
"content_notes": [ ... ]
}
The advisory is advisory only. Zyphr never blocks a send based on AI output — it's a second pair of eyes, not a gate.
Usage and budget
curl https://api.zyphr.dev/v1/muse/usage \
-H "X-API-Key: zy_live_your_key"
Returns month-to-date spend, remaining budget, projected month-end spend, and breakdowns by action and model tier.
Limits and errors
| Error code | HTTP | Meaning |
|---|---|---|
feature_not_enabled | 403 | Your plan doesn't include Muse — upgrade required |
muse_quota_exceeded | 402 | Per-action monthly quota reached for your plan. Response includes action, used, limit |
muse_budget_exceeded | 402 | Internal safety ceiling reached (should never happen before quota under normal use) |
muse_rate_limited | 429 | Per-user generation cap hit (default 60/hour); retry after Retry-After seconds |
bedrock_throttled | 503 | AWS Bedrock returned ThrottlingException; back off with jitter |
muse_workflow_invalid | 502 | Generated workflow failed schema validation; the dashboard will surface the error |
muse_advisory_invalid | 502 | Generated broadcast advisory failed schema validation |
Rate limiting is keyed per user-per-action, so a buggy script can't burn through your whole account's budget by spawning many "users".
Eval harness and quality
Every Muse prompt has a committed eval baseline in source control. Each prompt is judged across 5–6 rubric dimensions by Claude Sonnet against 20+ fixtures covering edge cases. CI fails on baseline regressions. Current overall scores (higher is better, 1.0 max):
| Prompt | Overall baseline |
|---|---|
suggest-subjects.v1 | ~0.93 |
draft-template.v1 | ~0.91 |
rewrite-block.v1 | ~0.92 |
generate-workflow.v1 | 0.94 |
analyze-broadcast.v1 | 0.90 |
If a prompt regresses by more than 5% in production traffic, we ship a patched prompt version (e.g. v1 → v1.1) without changing the public contract.