Human-in-the-loop for the OpenAI Agents SDK

Human approvals for the OpenAI Agents SDK, on a phone.

Add one tool to your agent. When the model calls it, a real person approves on their phone.

The integration

Add it to your OpenAI Agents SDK agent

Run pip install pushary-openai-agents, or npm i @pushary/openai-agents in TypeScript, and add pushary_tool(user_id) to your agent. When the model calls it, Pushary sends the question to that user's phone and the call blocks until the person approves, denies, or answers. The answer is fail-closed: if nobody answers in your window it comes back not approved, so a timeout never turns into an unwanted action. The user id is bound to the tool, so a prompt-injected model cannot ask the wrong person.

pip install pushary-openai-agentstwo calls
from agents import Agent, Runner
from pushary_openai_agents import connect, pushary_tool

# Connect the user's phone once.
connect("user_123")

agent = Agent(
    name="Support",
    instructions="Call ask_human before issuing any refund.",
    tools=[pushary_tool("user_123")],  # asks a real person, blocks fail-closed
)

Why you need it

OpenAI Agents SDK pauses the agent. Pushary reaches the human.

The OpenAI Agents SDK can pause a run with its own approval interruption, and it does not deliver that pending decision to a person or keep the record. pushary_tool fills that gap. It sends the question to a phone, blocks on a fail-closed answer, and logs it, so the person who decides is your own end-user, not a value your code hardcoded.

How it works

From ask to resume

Connect the phone once, then ask a human from the tool or step that guards the action. The waiting, the delivery, and the record are handled for you.

  1. 01

    Install the adapter

    Run pip install pushary-openai-agents in Python, or npm i @pushary/openai-agents in TypeScript, and set your Pushary API key.

  2. 02

    Connect the phone

    Call connect(external_id) once per end-user. It returns a link the person taps once to turn on approvals, with no account and no app to install.

  3. 03

    Add the tool to your agent

    Put pushary_tool(user_id) in the agent's tools list. It works alongside the SDK's own tools, and the user id is bound to it so the model cannot change who gets asked.

  4. 04

    Act on the decision

    The tool returns a fail-closed answer: a decline, a timeout, or no reply all read as not approved, so the agent does not take the guarded step.

A decision is a yes or no confirm, a multiple-choice select, or a free-text input. Every one is stored with its outcome and kept in the audit log.

The Partner plan

Your agent asks your users, not just you

Ship the agent to real users and let each of them approve their own decisions from their phone, under your brand.

$99/ month, every framework included

Your users never see a Pushary login or bill.

Your users answer on their own phones

The externalId is your own id for the end-user. Connect their phone once with a keyless one-tap link, and every approval lands with the right person. No account, no app, no key on their side.

Durable, fail-closed waits

The agent stays open on a durable wait backed by a decisions ledger. If nobody answers in the window you set, the decision comes back denied, so a timeout or a restart never turns into an unapproved action.

Phone-first delivery

Pushary reaches the person on the device they carry: native app push first, then PWA push notifications, then Slack if you route it there. You do not build a delivery pipeline.

Signed webhooks and an audit trail

Every decision is written to a durable ledger you can query and export, and resolved decisions post a signed webhook to your callback URL. You have the record of who approved what and when.

FAQ

Questions, answered

Let your OpenAI Agents SDK agent ask a human.

Connect a user with one tap, ask a human with one call, and act on a fail-closed decision. Every decision is saved to a durable ledger you can audit.

Partner plan, $99 a month. Your users never see a Pushary login or bill.