Skip to main content

GooseBusters

Give GooseBusters a phone number and a task. It proposes a plan, asks for your approval, conducts the call, and reports what happened with supporting quotes from the conversation. A CLI and a Tauri desktop app expose the same workflow.

Built with GDK: goose-agent and the provider components, without depending on the complete goose application.

Source · Design

The clever bit​

A phone call is not a sequence of model responses and tool calls. Speech and webhooks arrive while other work is running. An earlier suggestion can become stale as soon as the person on the phone says something new.

GooseBusters expresses this as custom state-machine operations: planning, approval, dialing, call events, supervision, and final extraction. Incoming speech can preempt a supervisor turn. The application checks whether an action is still current before applying it.

The model is one part of the workflow, rather than the owner of its lifecycle. Application code controls approval, the call record, and the effects applied to it.

How it works​

  1. A planning turn produces voice-agent instructions and fields to collect.
  2. The user approves, aborts, or gives feedback for a revised plan.
  3. A Telnyx call connects to an OpenAI voice backend. The supervisor processes events and tracks progress while the conversation happens.
  4. After hangup, extraction checks the transcript for the requested fields and the callee's supporting quotes. The call record is saved as YAML.

The supervisor rebuilds the machine for each turn from a snapshot of the application's record:

let snapshot = record.snapshot();
let turn = call_cancel.child_token();
pipeline.handle.set_turn_token(turn.clone());
let machine = StateMachine::new(build_steps(pipeline), turn.clone());
let emit = Emitter::new(tx.clone(), turn.clone());

It calls machine.step, applies the returned effects to its own record, and emits UI events. The CLI and desktop app render those events differently without implementing separate agent workflows. Read the operations alongside the supervisor to see where the application controls execution.

Run it yourself​

This is an end-to-end prototype. Real calls need Rust, Telnyx and OpenAI accounts, and a publicly reachable webhook endpoint. The repository documents a Cloudflare tunnel setup and the credentials for each voice backend.

git clone https://github.com/DOsinga/goose-busters.git
cd goose-busters

Complete the account and webhook setup before starting the desktop app:

cargo run -p goosebusters

Use a number and recipient you have permission to call. Calls send audio and transcripts to external services and may incur charges. See the repository's responsible-use notes before making a real call.