| 40 | 40 | | } |
| 41 | 41 | | } |
| 42 | 42 | | |
| 43 | + | /// Tokens a brief's model may spend thinking before it answers, beyond |
| 44 | + | /// the answer's own length. Current models think by default (Claude Haiku |
| 45 | + | /// 5.5 among them, at effort `medium`) and count it against `max_tokens`: |
| 46 | + | /// held to the answer's length alone, they used all of it thinking and |
| 47 | + | /// answered nothing, so session titles and the plan's suggestions came back |
| 48 | + | /// empty. Turning thinking off is refused by some (Claude Opus 5.5, Claude |
| 49 | + | /// Sonnet 5.5), so the room is given instead; callers keep only a short |
| 50 | + | /// answer whatever comes back. |
| 51 | + | const BRIEF_THINKING_ROOM: u32 = 2_048; |
| 52 | + | |
| 53 | + | /// The `max_tokens` a brief asking for an answer of `asked` tokens sends. |
| 54 | + | fn brief_room(asked: u32) -> u32 { |
| 55 | + | asked.clamp(1, MAX_BRIEF_TOKENS) + BRIEF_THINKING_ROOM |
| 56 | + | } |
| 57 | + | |
| 43 | 58 | | const NO_SUCH: &str = "No such AI provider."; |
| 44 | 59 | | const NO_SEALER: &str = "AI providers are not set up on this g1t: it has no key to keep secrets with."; |
| 45 | 60 | | |
| ⋯ |
| 672 | 687 | | rounds: &[], |
| 673 | 688 | | tools: &[], |
| 674 | 689 | | answer_now: false, |
| 675 | | − | max_tokens: a.max_tokens.clamp(1, MAX_BRIEF_TOKENS), |
| 690 | + | max_tokens: brief_room(a.max_tokens), |
| 676 | 691 | | }) { |
| 677 | 692 | | Ok(built) => built, |
| 678 | 693 | | Err(problem) => return Ok(fail(FailureCode::Invalid, problem)), |
| ⋯ |
| 757 | 772 | | use super::*; |
| 758 | 773 | | |
| 759 | 774 | | #[test] |
| 775 | + | fn a_brief_leaves_its_model_room_to_think_before_it_answers() { |
| 776 | + | assert_eq!(brief_room(40), 40 + BRIEF_THINKING_ROOM); |
| 777 | + | // Never more answer than a brief may ask for, never none. |
| 778 | + | assert_eq!(brief_room(10_000), MAX_BRIEF_TOKENS + BRIEF_THINKING_ROOM); |
| 779 | + | assert_eq!(brief_room(0), 1 + BRIEF_THINKING_ROOM); |
| 780 | + | } |
| 781 | + | |
| 782 | + | #[test] |
| 760 | 783 | | fn an_ai_provider_needs_its_key_and_its_address_when_it_has_no_known_one() { |
| 761 | 784 | | let key = Some("sk-test"); |
| 762 | 785 | | let none = None; |