Digital health

Agent infrastructure for digital health products.

Write your health agents as code and let Health Loops run them: steps that survive restarts, waits that use no compute, phone and SMS built in, memory shared across every loop, and a record your governance team can read.
Teams that already run on Ollie
The problem

The plumbing nobody wants to build

“Our roadmap is retries and timeouts.”

Every agent needs state, retries, call handling and logging before it does anything useful.

“The agent forgets people between sessions.”

Context stuck in one chat thread means users repeat themselves on every channel.

“A six-week programme can’t live in one request.”

Journeys that wait days for a user need state that outlives deploys and restarts.

“Governance asks why, and we can’t answer.”

Without a step-by-step record, nobody can show what the agent did and why.
How the loop works

What the runtime does for you

  1. Write the loop. A TypeScript class: a workflow with named steps, a chat agent or a voice agent.
  2. Trigger it from your backend. One authenticated POST with a JSON body. The response carries the run id, and a scan link when the loop uses one.
  3. Steps are checkpointed. Each step’s result is saved. If a run restarts, finished steps are replayed, not repeated, and failed steps are retried.
  4. Waits use no compute. A run parked on a scan or a call uses no compute until the user finishes.
  5. Loops call loops. A chat agent can start a scan workflow or a phone call as a tool, in the middle of a conversation.
  6. Deploy without breaking runs. Each deploy is a version. Runs in flight finish on the version they started on, and rollback rebuilds nothing.
programme-coach.tsTypeScript
export class HealthLoop extends Agent {
  async onChatMessage({ messages, ctx }) {
    const user = await ctx.USER.getUser({ id: ctx.body.userId });

    // Another loop, offered to the model as a tool.
    const checkIn = ctx.workflow({
      loopId: "scan-check-in",
      description: "Start a wellness scan check-in for this user",
      inputSchema: z.object({ userId: z.string() }),
    });

    const result = await ctx.OLLIE.chat({
      thinking: "medium",
      messages,
      user,
      tools: ctx.tools({ loops: { start_check_in: checkIn } }),
      options: { useLatestScan: true },
    });

    return result.toUIMessageStreamResponse();
  }
}
Channels and integrations

What the loop works with

Your app. Agent loops answer over the same trigger API and stream replies into your own chat interface.
Phone calls. Outbound calls to a phone number, or a browser call from your app. Each call ends with a transcript and a summary.
SMS. One message or up to 500 at once, with opt-out checks and timed delivery.
Wellness scans. A phone-camera scan behind a consent screen, with a hosted PDF report. The scan link works from your app, a text message or WhatsApp.
Member memory. One record per person, shared by every loop, so each journey starts with what the last one learned.
Health reference tools. Published adult reference ranges, public medicine label data, plain-language health topics, packaged-food lookups and nearby care.
Data and compliance

How data is handled

Your own data plane. Each organisation’s loops, runs, members and keys live in that organisation’s own store, apart from every other customer.
Sandboxed code. Each loop runs in its own isolated runtime and can reach only the tools you give it.
Keys you control. An API key only reaches loops in the organisation that made it, and you can revoke it at any time. Secrets are encrypted and only admins can see them.
A record of every run. The trigger, each step and its result, every tool call, every log line and every error are kept for your team to review.
FAQ

Questions

What is Health Loops?

Health Loops is a runtime for stateful health agents written as code. A loop can call, text, run a wellness scan, wait for the person to respond and report back, with every step checkpointed and recorded. Ollie calls it the agent operating system for healthcare.

What language are loops written in?

TypeScript. A loop is a class that extends Workflow, Agent or VoiceAgent from the Loops SDK, and the docs at docs.ollie.health cover every tool and primitive.

How is a loop different from calling a model API?

A model API answers one prompt. A loop is a whole journey: it holds state across days, waits for a scan or a call, retries failed steps, remembers the user across loops and keeps a record of every step.

Which model do agent loops use?

Model calls go through ctx.OLLIE.chat for chat and ctx.OLLIE.reply for voice, which the platform manages. You set the reasoning depth for each turn.

Can we test a loop before it reaches users?

Yes. The playground runs loops with sample data, a scan can return mock results while you build, and SMS has a test mode that sends nothing.

Show us the journey costing you the most. We’ll show you the loop.