You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The five Greek-god agents that power Embercore's marketing pipeline.
Agent Reference
Embercore is built around five specialised agents, each named after a Greek deity. They work together in a pipeline: Athena creates the plan, Hermes orchestrates execution, Apollo writes copy, Hephaestus assembles deliverables, and Hestia manages persistence.
Athena takes a product brief or campaign goal and generates a structured YAML plan that orchestrates the other agents. Each plan contains checkpoints with dependency ordering, agent assignments, and expected outputs.
API
// New creates an Athena planner. Pass nil for h to disable persistence.funcNew(p provider.Provider, h*hestia.Hestia) *Athena// GeneratePlan takes a product brief and generates a structured plan.// Calls the LLM with a planning prompt, parses YAML, validates, and// optionally persists via Hestia.func (a*Athena) GeneratePlan(ctx context.Context, briefstring, optsPlanOpts) (*PlanSpec, error)
// ParsePlan unmarshals raw YAML bytes into a PlanSpec and validates it.funcParsePlan(yamlBytes []byte) (*PlanSpec, error)
// ValidatePlan checks structural invariants: at least one checkpoint,// no duplicate IDs, valid dependency references, no circular dependencies,// and all agents are in the known set.funcValidatePlan(plan*PlanSpec) error// ExtractYAML pulls the YAML block out of an LLM response.funcExtractYAML(rawstring) ([]byte, error)
// ToYAML marshals a PlanSpec back to YAML bytes.funcToYAML(plan*PlanSpec) ([]byte, error)
Options
typePlanOptsstruct {
Namestring// plan name (default: "untitled-plan")Workflowstring// "launch-announcement", "weekly-newsletter", or "custom"Agents []string// which agents to include (default: all five)MaxStepsint// max checkpoints (default: 10)Persistbool// save to Hestia (default: true if hestia != nil)
}
Types
PlanSpec
The top-level plan schema matching the YAML format used across all Embercore plans.
# Generate a plan
embercore plan "Launch a SaaS product for project management"# Save to file
embercore plan "Weekly newsletter campaign" -o newsletter.yaml
# Use a specific provider
embercore plan "Product launch" --provider openai --model gpt-4o
Hermes — The Executor
Package:agents/hermes
Hermes is the execution orchestrator. It takes a parsed plan and runs each step in topological order, pausing at checkpoints for human approval when a handler is configured. Hermes manages run lifecycle via Hestia and supports resume-from-checkpoint for interrupted runs.
API
// New creates a Hermes engine instance.funcNew(p provider.Provider, h*hestia.Hestia, logger*slog.Logger) *Hermes// ExecutePlan runs a plan from the beginning. Creates a Run via Hestia,// then walks topologically-sorted layers, executing steps and pausing// at checkpoints when required.func (h*Hermes) ExecutePlan(ctx context.Context, spec*plan.Spec, optsExecOpts) (*ExecResult, error)
// ResumePlan resumes a paused run from the last completed checkpoint.func (h*Hermes) ResumePlan(ctx context.Context, runIDstring) (*ExecResult, error)
// WithCheckpointHandler sets a custom handler for checkpoint pauses.// If not set, ExecutePlan pauses the run and returns status "paused".func (h*Hermes) WithCheckpointHandler(handlerCheckpointHandler) *Hermes
Types
ExecOpts
Field
Type
Description
AutoApprove
bool
Skip checkpoint approval prompts
PlanID
string
Existing plan ID (if already persisted)
InputData
map[string]interface{}
Runtime inputs for plan parameters
ExecResult
Field
Type
Description
RunID
string
UUID of this execution run
Status
string
"completed", "paused", or "failed"
Steps
[]StepResult
Per-step results
Error
error
Error details if failed
StepResult
Field
Type
Description
StepID
string
ID of the executed step
Agent
string
Agent that ran the step
Status
string
"completed", "failed", or "skipped"
Output
string
Agent output content
Elapsed
time.Duration
Wall-clock execution time
CheckpointHandler
// Called at each checkpoint pause.// Return true to approve and continue, false to reject/pause.typeCheckpointHandlerfunc(step plan.Step, outputstring) (approvedbool, feedbackstring, errerror)
# Run by plan ID
embercore run <plan-id># Run from a YAML file
embercore run my-plan.yaml
# Auto-approve all checkpoints
embercore run <plan-id> --auto-approve
# Resume a paused run
embercore resume <run-id>
Apollo — The Copywriter
Package:agents/apollo
Apollo generates marketing copy across seven content types: blog posts, emails, social media posts, headlines, ads, landing pages, and newsletters. It supports tone control, audience targeting, word count constraints, SEO keyword integration, and iterative refinement.
API
// New creates an Apollo agent with the given options.funcNew(opts...Option) *Apollo// GenerateCopy produces marketing content based on the request.// Builds a specialised prompt, calls the LLM, and parses the response// into a structured CopyResult with metadata and optional variants.func (a*Apollo) GenerateCopy(ctx context.Context, reqCopyRequest) (*CopyResult, error)
// Refine takes existing copy and feedback, then generates an improved version.// The original result is preserved; a new CopyResult is returned.func (a*Apollo) Refine(ctx context.Context, original*CopyResult, feedbackstring) (*CopyResult, error)
Options
// WithProvider sets the LLM provider.funcWithProvider(p provider.Provider) Option// WithHestia enables persistence via Hestia.funcWithHestia(h*hestia.Hestia) Option// WithModel overrides the default model for completions.funcWithModel(mstring) Option
package main
import (
"context""fmt""log""github.com/embercore-labs/embercore/packages/engine/agents/apollo""github.com/embercore-labs/embercore/packages/engine/internal/provider"
)
funcmain() {
p, _:=provider.NewFromEnv()
a:=apollo.New(
apollo.WithProvider(p),
apollo.WithModel("claude-sonnet-4-20250514"),
)
result, err:=a.GenerateCopy(context.Background(), apollo.CopyRequest{
Type: apollo.TypeBlog,
Brief: "Write a blog post about the benefits of local-first AI tools for solo founders",
Tone: "professional",
Audience: "indie hackers and solo SaaS founders",
Constraints: apollo.Constraints{
MinWords: 800,
MaxWords: 1500,
Keywords: []string{"local-first", "AI tools", "solo founder"},
CTAText: "Try Embercore today",
},
})
iferr!=nil {
log.Fatal(err)
}
fmt.Printf("Word count: %d | SEO Score: %d\n", result.WordCount, result.Metadata.SEOScore)
fmt.Println(result.Content)
// Refine based on feedbackrevised, _:=a.Refine(context.Background(), result, "Make it more conversational and add a personal anecdote intro")
fmt.Println(revised.Content)
}
Hephaestus — The Builder
Package:agents/hephaestus
Hephaestus assembles content from other agents into final deliverables: HTML emails, formatted blog posts, social media packages, campaign kits, landing pages, and newsletters. It supports three assembly strategies: named templates, LLM-enhanced assembly, and deterministic (no-LLM) assembly.
API
// New creates a Hephaestus agent with the given options.funcNew(opts...Option) *Hephaestus// Build assembles a deliverable from content pieces. It tries in order:// 1. Named template (if Template is set)// 2. LLM-enhanced assembly (if provider is available)// 3. Deterministic assembly using built-in assembler functionsfunc (h*Hephaestus) Build(ctx context.Context, reqBuildRequest) (*BuildResult, error)
// BuildFromTemplate is a convenience method that assembles content// using a named built-in template.func (h*Hephaestus) BuildFromTemplate(ctx context.Context, templateNamestring, datamap[string]string) (*BuildResult, error)
Options
// WithProvider sets the LLM provider for enhanced assembly.funcWithProvider(p provider.Provider) Option// WithHestia enables persistence via Hestia.funcWithHestia(h*hestia.Hestia) Option// WithModel overrides the default model for completions.funcWithModel(mstring) Option// WithRunID sets the run ID for artifact persistence.funcWithRunID(idstring) Option
Types
OutputType
Constant
Value
Description
TypeEmailHTML
"email-html"
HTML email
TypeBlogPost
"blog-post"
Formatted blog post
TypeSocialPack
"social-pack"
Multi-platform social package
TypeCampaignKit
"campaign-kit"
Bundle of multiple deliverables
TypeLandingPage
"landing-page"
Landing page HTML
TypeNewsletterHTML
"newsletter-html"
Newsletter HTML
OutputFormat
Constant
Value
FormatHTML
"html"
FormatMarkdown
"markdown"
FormatPlaintext
"plaintext"
FormatJSON
"json"
BuildRequest
Field
Type
Description
Type
OutputType
Kind of deliverable to build
Content
map[string]string
Keyed content pieces (e.g. "headline", "body")
Template
string
Optional named template
Format
OutputFormat
Output format override
Assets
[]Asset
Images, attachments, logos
Config
BuildConfig
Assembly configuration
BuildConfig
Field
Type
Description
Brand
BrandKit
Brand identity values
Responsive
bool
Generate responsive HTML
Inline
bool
Inline CSS (for email clients)
MinifyHTML
bool
Minify output HTML
BrandKit
Field
Type
Description
PrimaryColor
string
Primary brand colour
SecondaryColor
string
Secondary brand colour
FontFamily
string
CSS font family
LogoURL
string
URL to logo image
CompanyName
string
Company name for footer
FooterText
string
Custom footer text
BuildResult
Field
Type
Description
Output
string
Assembled content
Format
OutputFormat
Output format
Type
OutputType
Deliverable type
Artifacts
[]ArtifactRef
Persisted artifact references
Warnings
[]string
Any issues during assembly
Built-in templates
Template Name
Output Type
Format
"email-basic"
email-html
HTML
"blog-standard"
blog-post
Markdown
"social-thread"
social-pack
Plaintext
Example
package main
import (
"context""fmt""log""github.com/embercore-labs/embercore/packages/engine/agents/hephaestus""github.com/embercore-labs/embercore/packages/engine/internal/provider"
)
funcmain() {
p, _:=provider.NewFromEnv()
h:=hephaestus.New(
hephaestus.WithProvider(p),
)
// Build an HTML email from content piecesresult, err:=h.Build(context.Background(), hephaestus.BuildRequest{
Type: hephaestus.TypeEmailHTML,
Content: map[string]string{
"headline": "Introducing Embercore",
"body": "Build your marketing engine with AI agents...",
"cta_text": "Get Started Free",
"cta_url": "https://embercore.dev",
"email_subject": "Your marketing just got an upgrade",
},
Config: hephaestus.BuildConfig{
Brand: hephaestus.BrandKit{
PrimaryColor: "#FF6B35",
CompanyName: "Embercore Labs",
FontFamily: "Inter, sans-serif",
},
Inline: true,
MinifyHTML: true,
},
})
iferr!=nil {
log.Fatal(err)
}
fmt.Printf("Format: %s | Size: %d bytes\n", result.Format, len(result.Output))
// Or use a templatetmplResult, _:=h.BuildFromTemplate(context.Background(), "email-basic", map[string]string{
"headline": "Weekly Update",
"body": "Here's what happened this week...",
})
fmt.Println(tmplResult.Output)
}
Hestia — The Memory Agent
Package:agents/hestia
Hestia is the persistence layer — a thin wrapper over the SQLite store that composes storage operations into workflow patterns. All other agents use Hestia to save plans, track runs, record checkpoints, persist artifacts, and support resume-from-checkpoint.
API
// New creates a Hestia instance backed by SQLite at dbPath.funcNew(dbPathstring) (*Hestia, error)
// SavePlan creates a plan with initial metadata. Returns the plan ID.func (h*Hestia) SavePlan(ctx context.Context, name, yamlContent, briefstring) (string, error)
// StartRun creates a new run for the given plan and sets the plan to active.// Returns the run ID.func (h*Hestia) StartRun(ctx context.Context, planIDstring) (string, error)
// RecordCheckpoint creates a completed checkpoint for a run.func (h*Hestia) RecordCheckpoint(ctx context.Context, runID, stepID, agent, outputstring) error// GetRunState returns the full state tree: run, plan, checkpoints, artifacts.func (h*Hestia) GetRunState(ctx context.Context, runIDstring) (*store.RunState, error)
// ResumeRun finds the last completed checkpoint and returns the state// needed to resume execution from that point.func (h*Hestia) ResumeRun(ctx context.Context, runIDstring) (*store.RunState, error)
Hestia also embeds *store.Store, exposing these lower-level methods: