Branch, loop, await and fan out — parallel and sequential, sync and async — without writing orchestration code. Call SQL, REST, tools, agents or other functions, and transform data between steps with Go templates.
Most business processes are five to fifteen steps with a few branches and a couple of async waits. Writing that as a microservice every time is overkill. eru-functions runs as JSON workflows with parallel, sequential, conditional, loop and async control flow — through one engine.
Call SQL, REST, agents, tools or other functions from any step, and move data between steps with Go templates.
Steps — QUERY, APIS, AGENTS, TOOLS, FUNCTIONS — composed via nesting into one declarative spec.
Run independent branches in parallel, chain dependent steps in sequence — both in the same group.
Run a step only when a condition matches. Handle failed consitions as ERROR, STOP or IGNORE.
Long-running steps can spin off diffrent execution thread on chosen async eventing framework like Kafka, AWS SQS and more.
Iterate any step based on previous step results — sequentially or in parallel.
Reshape request and response between steps by manipulating JSON requests and responses of previous steps.
Remove sensitive information or large data values before they leak into logs or next steps.
An eru-ai Agent can produce workflow JSON based on user's prompt.
Configure additional headers, query params, form data and file attachments for any function step.
A trigger flows into the eru-functions engine, which executes each step — drawing on five step types — then transforms and awaits as needed before emitting a single result.
No orchestration code. Add steps, branches and async waits by editing config.
// On new order: look up the company, then WhatsApp the customer { "name": "order_notify_flow", "func_steps": { "fetch_company": { "query_name": "get_company_by_phone", "query_params": ["{{.Vars.OrgBody.phone_number}}"] }, "notify_whatsapp": { "tool_name": "artfine_wa", "tool_action": "send_message", "async": true, "async_event": "whatsapp_dispatch", "condition": "{{ ne .Vars.OrgBody.phone_number \"\" }}", "transform_request": "{\"to\":\"{{.Vars.OrgBody.phone_number}}\",\"message\":\"Hello {{.ResVars.fetch_company.Body.entity_data.cn}}\"}" } } }