The best HumanLayer alternative for human-in-the-loop AI agents

HumanLayer now builds a coding agent IDE and calls its old repo deprecated. If you need agent approvals over Slack, SMS or voice, here is what to use instead.

Written by
Published
Reading time
2 min

HumanLayer was one of the first products built for human-in-the-loop AI agents. Its SDK let a function be wrapped with an approval decorator so that, when an agent called it, a person was asked in Slack or by email before it ran. Plenty of teams built on that idea.

In 2026 the company changed direction. Its website now sells a multiplayer coding agent IDE and cloud, and the README of its original GitHub repository says the code there is “pretty much all deprecated”. If you came looking for agent approvals, you need another option.

What HumanLayer did

  • Wrapped functions so they required approval before an agent could run them.
  • Let an agent ask a person a free-form question (“human as a tool”).
  • Delivered requests over Slack, email and other chat channels, and returned the answer to the agent.

Those are still exactly the right primitives. The question is who provides them now.

The closest replacement: redphonr

redphonr covers the same ground and adds what HumanLayer users often asked for.

HumanLayer (original SDK)redphonr
Current focusCoding agent IDEHuman approvals for agents
IntegrationPython and TypeScript SDK decoratorsNative MCP server, plus HTTP API
Approve or denyYesYes (request_approval)
Ask a questionYesYes (ask_human, collect_input)
Review output before sendingBuild itYes (verify_output)
ChannelsSlack, email, chatSlack, SMS, WhatsApp, Telegram, Discord, email, voice
EscalationNot in its current docsLadders, on-call and backup, weekly rotation
Timeout defaultNot in its current docsDeny by default

The biggest change is the integration model. Instead of decorating functions in one SDK, redphonr is an MCP server, so any MCP-capable agent (Claude, Cursor, the OpenAI Agents SDK, LangChain, CrewAI, Mastra) can call it without a library.

Migrating a require_approval function

Before, with a decorator:

@hl.require_approval()
def send_invoice_reminders(customer_ids: list[str]) -> str:
    ...

After, with an explicit gate:

async def send_invoice_reminders(session, customer_ids: list[str]) -> str:
    result = await session.call_tool("request_approval", {
        "message": f"Send payment reminders to {len(customer_ids)} customers?",
        "timeout_seconds": 3600,
        "default": "deny",
    })
    if result["decision"] != "approved":
        return f"Not sent: {result.get('note') or 'not approved'}"
    ...

Or, if your agent already speaks MCP, add the server and let the model decide when to ask, guided by your system prompt. The 5-minute tutorial shows the prompt.

Other alternatives

Frequently asked questions

Is HumanLayer deprecated?

As of October 2026, the README of the public humanlayer/humanlayer GitHub repository says the code there is pretty much all deprecated and points to a rebuild, and humanlayer.dev markets a multiplayer coding agent IDE and cloud. Check with HumanLayer directly before relying on its original approval SDK.

What is the best alternative to HumanLayer?

For the original use case, letting an agent ask a person for approval over chat, SMS or email and wait for the answer, redphonr is a close match. It runs as an MCP server, adds SMS, WhatsApp and voice calls, and escalates through an on-call rota.

How do I migrate from HumanLayer's require_approval to redphonr?

Replace the decorator with an explicit call to redphonr's request_approval tool before the function runs, return early if the decision is not approved, and set the timeout default to deny. If your agent uses MCP, add the redphonr server and the model can call the tool itself.