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.
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
- false 0.951
- 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.
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
- true 0.721
- 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.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
- false 0.556
- true 0.444
A good morning needs only a friendly reply, so the answer is
false.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
- true 0.876
- 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.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
- false 0.962
- true 0.038
The reminder was created and the assistant only has to say so, so the answer is
false.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
| Field | Kind | Description |
|---|---|---|
turn | input | What the main assistant must do next in this turn (for example "Reply to the user in words."). |
accounts | context | The user's accounts the assistant can act on, as one text (for example "Work account [work], Personal account [personal]"). |
date_and_time_zone | context | Today's date and time and the user's time zone, as one sentence. |
conversation | context | The conversation so far as one text, including the user's messages and the tool calls and results. |
Functions
| Key | Interface | Instructions | Labels |
|---|---|---|---|
| needs_thinking | detect | Does 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.
| Function | Right when confident | Confident on | Threshold | Calibration rows |
|---|---|---|---|---|
| needs_thinking | 95.2% | 54.8% | 0.88 | 341 |
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