Skip to content
jeff.agents.assistant-routingv1.4.0

Assistant reasoning check

Predicts whether an assistant's next response requires careful reasoning or can be answered directly. Use it to route simpler turns to a faster, cheaper response path.

Open in playground

Example

Context

accounts
Work account [work], Personal account [personal]
date_and_time_zone
It is Tuesday 3 November 2026, 16:20, and the user is in London (UK time).
conversation
User: Can you move my 4 pm call with Priya to Thursday at the same time? Assistant: (calls calendar.move_event) Result: the call is now on Thursday 5 November at 16:00. Assistant: Done, your call with Priya is now on Thursday at 4 pm. User: Great, thanks!

Input

Reply to the user in words.

Answer (JSON)
value false, confidence 0.951
Top options
  1. false 0.951
  2. true 0.049

The user only says thank you after a finished task, so the reply needs no careful thinking and the answer is false.

Open in playground

import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.agents.assistant-routing.needs_thinking", context={        "accounts": "Work account [work], Personal account [personal]",        "date_and_time_zone": "It is Tuesday 3 November 2026, 16:20, and the user is in London (UK time).",        "conversation": "User: Can you move my 4 pm call with Priya to Thursday at the same time? Assistant: (calls calendar.move_event) Result: the call is now on Thursday 5 November at 16:00. Assistant: Done, your call with Priya is now on Thursday at 4 pm. User: Great, thanks!",    })     decision = decide("Reply to the user in words.")     print(decision.value, decision.confidence)

More examples

  • Plan a week around three clashing meetingsanswer true · confidence 0.721

    Context

    accounts
    Work account [work], Personal account [personal]
    date_and_time_zone
    It is Tuesday 3 November 2026, 16:20, and the user is in London (UK time).
    conversation
    User: Next week I have the board meeting on Monday 10:00-12:00, a client workshop in Leeds on Tuesday all day, and the dentist on Wednesday 9:00. The Leeds train takes 2 h 20 min. Our new hire, Priya, needs two hours with me before Wednesday, and I never take calls before 9 or after 18. Can you find a slot and tell me which other meetings have to move? Assistant: (calls calendar.list_events for 9-13 November) Result: 14 events, including a 1:1 with Tom on Monday 14:00-15:00, a supplier call on Monday 16:00-17:30 and a team lunch on Wednesday 12:00-13:30.

    Input

    Reply to the user in words.

    Answer (JSON)
    value true, confidence 0.721
    Top options
    1. true 0.721
    2. false 0.279

    Fitting a two-hour slot around a board meeting, a trip, the dentist and fixed hours takes careful thought, so the answer is true.

    Open in playground

    import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.agents.assistant-routing.needs_thinking", context={        "accounts": "Work account [work], Personal account [personal]",        "date_and_time_zone": "It is Tuesday 3 November 2026, 16:20, and the user is in London (UK time).",        "conversation": "User: Next week I have the board meeting on Monday 10:00-12:00, a client workshop in Leeds on Tuesday all day, and the dentist on Wednesday 9:00. The Leeds train takes 2 h 20 min. Our new hire, Priya, needs two hours with me before Wednesday, and I never take calls before 9 or after 18. Can you find a slot and tell me which other meetings have to move? Assistant: (calls calendar.list_events for 9-13 November) Result: 14 events, including a 1:1 with Tom on Monday 14:00-15:00, a supplier call on Monday 16:00-17:30 and a team lunch on Wednesday 12:00-13:30.",    })     decision = decide("Reply to the user in words.")     print(decision.value, decision.confidence)
  • A simple good morninganswer false · confidence 0.556

    Context

    accounts
    Work account [work], Personal account [personal]
    date_and_time_zone
    It is Wednesday 4 November 2026, 08:05, and the user is in London (UK time).
    conversation
    User: Good morning!

    Input

    Reply to the user in words.

    Answer (JSON)
    value false, confidence 0.556
    Top options
    1. false 0.556
    2. true 0.444

    A good morning needs only a friendly reply, so the answer is false.

    Open in playground

    import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.agents.assistant-routing.needs_thinking", context={        "accounts": "Work account [work], Personal account [personal]",        "date_and_time_zone": "It is Wednesday 4 November 2026, 08:05, and the user is in London (UK time).",        "conversation": "User: Good morning!",    })     decision = decide("Reply to the user in words.")     print(decision.value, decision.confidence)
  • Compare two offers against a budgetanswer true · confidence 0.876

    Context

    accounts
    Work account [work], Personal account [personal]
    date_and_time_zone
    It is Tuesday 3 November 2026, 16:20, and the user is in London (UK time).
    conversation
    User: Two caterers quoted for our 120-person summer party. Brightfork: 38 a head, plus 450 for staff, plus 12% service, drinks not included. Larder & Lime: 44 a head all in, drinks included up to 15 a head, but a 1,200 deposit we lose if we cancel within 30 days. Our budget is 6,000 and we may need to cancel if the venue falls through. Which should we choose, and why?

    Input

    Reply to the user in words.

    Answer (JSON)
    value true, confidence 0.876
    Top options
    1. true 0.876
    2. false 0.124

    Comparing two caterers' prices, a deposit and the risk of cancelling against a budget takes careful thought, so the answer is true.

    Open in playground

    import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.agents.assistant-routing.needs_thinking", context={        "accounts": "Work account [work], Personal account [personal]",        "date_and_time_zone": "It is Tuesday 3 November 2026, 16:20, and the user is in London (UK time).",        "conversation": "User: Two caterers quoted for our 120-person summer party. Brightfork: 38 a head, plus 450 for staff, plus 12% service, drinks not included. Larder & Lime: 44 a head all in, drinks included up to 15 a head, but a 1,200 deposit we lose if we cancel within 30 days. Our budget is 6,000 and we may need to cancel if the venue falls through. Which should we choose, and why?",    })     decision = decide("Reply to the user in words.")     print(decision.value, decision.confidence)
  • Confirm a reminder was setanswer false · confidence 0.962

    Context

    accounts
    Work account [work], Personal account [personal]
    date_and_time_zone
    It is Tuesday 3 November 2026, 16:20, and the user is in London (UK time).
    conversation
    User: Remind me to call the plumber at 5 pm. Assistant: (calls reminders.create) Result: reminder created for 17:00 today, "Call the plumber".

    Input

    Reply to the user in words.

    Answer (JSON)
    value false, confidence 0.962
    Top options
    1. false 0.962
    2. true 0.038

    The reminder was created and the assistant only has to say so, so the answer is false.

    Open in playground

    import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.agents.assistant-routing.needs_thinking", context={        "accounts": "Work account [work], Personal account [personal]",        "date_and_time_zone": "It is Tuesday 3 November 2026, 16:20, and the user is in London (UK time).",        "conversation": "User: Remind me to call the plumber at 5 pm. Assistant: (calls reminders.create) Result: reminder created for 17:00 today, \"Call the plumber\".",    })     decision = decide("Reply to the user in words.")     print(decision.value, decision.confidence)

Use when

  • Your assistant has a separate reasoning step and needs to decide when to use it.

Avoid when

  • You need to choose a tool or specialist; this adapter only checks whether reasoning is needed.

Context and input

FieldKindDescription
turn
inputWhat the main assistant must do next in this turn (for example "Reply to the user in words.").
accounts
contextThe user's accounts the assistant can act on, as one text (for example "Work account [work], Personal account [personal]").
date_and_time_zone
contextToday's date and time and the user's time zone, as one sentence.
conversation
contextThe conversation so far as one text, including the user's messages and the tool calls and results.

Functions

KeyInterfaceInstructionsLabels
needs_thinkingdetectDoes the main assistant need to think carefully before writing this turn, rather than answering straight away?false, true

How it was measured

Test accuracy: the share of test rows whose top answer was right.

  • 86.6% on held-out simulated conversations (771 rows). in-house: same generator as the training data

When confident

From the calibration set: at or above the threshold confidence, how often the answer is right, and how often the adapter is that confident. Below it, escalate.

FunctionRight when confidentConfident onThresholdCalibration rows
needs_thinking95.2%54.8%0.88341

Caveats

  • The label is a stand-in: whether a large LLM chose to think before answering, not a human judgement.

Base: Jeff v1.4. Adapter trained: 25 October 2026.

Base

jeff-base v1.4

Call it

jeff.agents.assistant-routing.needs_thinking, with placeholders for its input and context.

import os import jeff with jeff.Jeff.remote("https://api.jeffhub.ai", token=os.environ["JEFF_API_KEY"], timeout_s=30) as client:     decide = client.function("jeff.agents.assistant-routing.needs_thinking", context={        "accounts": "<accounts>",        "date_and_time_zone": "<date_and_time_zone>",        "conversation": "<conversation>",    })     decision = decide("<turn>")     print(decision.value, decision.confidence)

Download

Weights: mstrasser/jeff-adapter-assistant-routing (v1.4)

Licence: Apache-2.0