Workers do the work. The hive knows when to call in the frontier.

Most of what an agent does is worker work — classify, extract, route, summarise, pick the next step. Bees runs that on a hive of small models and escalates automatically when a task turns out not to be worker work.

We do not replace the frontier model. We decide when you need it.

To bees or not to bees

We do not agonise over it. We run the hive and let the answer decide.

Every task arrives as the same question: is this worker work, or does it need the frontier? The usual approach is to guess from the request before running anything. We think that is the wrong move, and the rest of this page is why.

You cannot know which tasks are hard until you try them

Difficulty is not something you can read off a request. Anything that predicts which tasks deserve the expensive model will be wrong sometimes, and wrong silently.

So Bees does not predict. It does the work and reads the result. When the result is not solid, it escalates on its own.

Where a hive beats a single specialist

Not on raw answer quality — a frontier model will often answer better than any of our workers. Where a hive wins is structural.

Failures do not hide A single model fails the same way across every request, invisibly. Independent failures show up instead of hiding.
Nothing is load-bearing A worker down, rate-limited or retired does not stop the hive.
Composed per task Membership changes with the work. A single model is the same model for everything.
A signal from outside The signal comes from outside any one model, so it is something we can act on rather than something a model asserts about itself.

And it holds as models improve: fluency is rising faster than correctness, so wrong answers get better camouflaged. A signal from outside any one model matters more, not less.

Built for work that runs unattended

For a chat product a wrong answer is embarrassing. For an agent it is executed. A hive convening takes longer than one call — disqualifying for a chat box, irrelevant at three in the morning.

What you get back is which of your tasks were routine, which needed the frontier, and which needed a person. In our own shorthand:

Answeredroutine work, answered where it belonged
Escalateda stronger model was called in
Needs a personnothing was solid, so nothing was served

Integration

Anthropic or OpenAI, keep the client you already use. Only the base URL and key change.

client = OpenAI(base_url="https://api.bees.riif.com/v1", api_key=BEES_KEY)

r = client.chat.completions.create(..., extra_body={"policy": "verified"})

if r.choices[0].finish_reason == "needs_review":
    queue_for_human(task, r.bees)     # not solid, so it was not served
else:
    proceed(r.choices[0].message.content)

Models, failover, retirements and spend ceilings are ours to manage. Your code does not move when a provider changes.

How we start

With a measurement on your real traffic, changing nothing about your product. After two weeks you will know what the hive would have caught. If that is not compelling, we will say so.