Is the pricier AI model worth it? 9 models, the same 16 tasks
We gave every model the exact same prompts, from a complaint email to a 1,300-word lease with a trap in it, and let a script mark each answer. Pick any two models to read their answers side by side.
Short answer: For everyday work, mostly no. All 9 models passed 285 of 288 answers. Claude Opus 5.5 cost 2.2× as much as Claude Sonnet 5.5, and GPT-6 Astra cost 5.1× as much as GPT-6.1 Sol, for the same results on these tasks.
Scorecard
| Model | Answers that passed every check | Cost for all 32 answers | Typical answer time | Typical length (words) |
|---|---|---|---|---|
| GPT-6.1 Terra | 32 of 32 | $0.042 | 4 s | 40 |
| GPT-6.1 Sol | 32 of 32 | $0.067 | 4 s | 54 |
| Gemini 4 Argon | 32 of 32 | $0.14 | 7 s | 97 |
| Gemini 3.8 Flash | 32 of 32 | $0.16 | 7 s | 81 |
| Claude Sonnet 5.5 | 32 of 32 | $0.17 | 3 s | 98 |
| GPT-6 Astra | 32 of 32 | $0.34 | 5 s | 51 |
| Qwen 3.8 27B (open weights) | 31 of 32 | $0.18 | 5 s | 36 |
| Claude Opus 5.5 | 31 of 32 | $0.38 | 5 s | 117 |
| Grok 4.7 | 31 of 32 | $0.44 | 12 s | 44 |
Each model answered every task twice. "Passed" means the answer met every scripted check for that task. Cost is what we were billed through OpenRouter on November 8, 2026. Times and lengths are medians. The only failures: Claude Opus 5.5: Product blurb with six rules at once (run 2). Grok 4.7: Python duration parser with edge cases (run 2). Qwen 3.8 27B (open weights): Python duration parser with edge cases (run 2, ran out of room before answering).
- Complaint email for a broken washing machine
- Explain vaccines to a 10-year-old in 3 sentences
- Add up October grocery spending from a table
- Meeting notes to action items
- Seating logic puzzle
- Trip budget maths
- Python ISBN-10 checker
- Made-up study (should say it can't verify it)
- Long lease with amendments and a withdrawn addendum
- Product blurb with six rules at once
- Time zones the day after clocks change
- Best plan for 8 free hours (no splitting jobs)
- Five people, five pets logic puzzle
- False premise: Einstein's Nobel Prize
- Messy email thread to clean contact JSON
- Python duration parser with edge cases
Everyday tasks
Common jobs people ask a chatbot to do.
Complaint email for a broken washing machine
My new washing machine (order #48213) arrived on 3 November with a cracked door. Write a short, polite email to the shop asking for a replacement. Keep it under 120 words and include the order number and the delivery date.
What the script checked: Under 120 words; Includes order number 48213; Includes delivery date; Asks for a replacement. 9 of 9 models passed on both runs.
- Under 120 words
- Includes order number 48213
- Includes delivery date
- Asks for a replacement
107 words · 2 s · $0.002 · Run 2: same result
- Under 120 words
- Includes order number 48213
- Includes delivery date
- Asks for a replacement
101 words · 4 s · $0.005 · Run 2: same result
Explain vaccines to a 10-year-old in 3 sentences
Explain how a vaccine works to a 10-year-old in exactly 3 sentences. Do not use the words "immune" or "antibody".
What the script checked: Exactly 3 sentences; Avoids 'immune' and 'antibody'. 9 of 9 models passed on both runs.
- Exactly 3 sentences
- Avoids 'immune' and 'antibody'
66 words · 2 s · $0.001 · Run 2: same result
- Exactly 3 sentences
- Avoids 'immune' and 'antibody'
85 words · 5 s · $0.007 · Run 2: same result
Add up October grocery spending from a table
Here are my card payments (date | category | amount): 2026-09-28 | Groceries | $84.20 2026-10-02 | Groceries | $61.75 2026-10-03 | Fuel | $55.00 2026-10-09 | Groceries | $102.40 2026-10-11 | Eating out | $38.90 2026-10-15 | Groceries | $47.15 2026-10-21 | Pharmacy | $19.99 2026-10-24 | Groceries | $73.60 2026-10-31 | Groceries | $12.35 2026-11-01 | Groceries | $66.10 2026-11-02 | Fuel | $49.50 2026-10-27 | Eating out | $24.00 How much did I spend on groceries in October 2026? End with one line: ANSWER: $<total>
What the script checked: Correct total ($297.25). 9 of 9 models passed on both runs.
- Correct total ($297.25)
66 words · 2 s · $0.003 · Run 2: same result
- Correct total ($297.25)
47 words · 3 s · $0.006 · Run 2: same result
Meeting notes to action items
Notes from Tuesday's planning call for the December team event. Priya said she will send the venue contract by November 14. We talked about whether Tom should also sort out parking, but decided the venue handles it, so no one needs to. Tom will book the catering by November 18. Lena is going to check the projector and microphones before November 12. Marco agreed to draft the invitation; it's due November 20. Everyone liked last year's playlist. Turn these notes into a list of action items, one per line, in the form: Owner - task - due date. Only include real action items.
What the script checked: Exactly 4 action items; Priya with the right date (Nov 14); Tom with the right date (Nov 18); Lena with the right date (Nov 12); Marco with the right date (Nov 20); Parking not listed as a task. 9 of 9 models passed on both runs.
- Exactly 4 action items
- Priya with the right date (Nov 14)
- Tom with the right date (Nov 18)
- Lena with the right date (Nov 12)
- Marco with the right date (Nov 20)
- Parking not listed as a task
57 words · 2 s · $0.001 · Run 2: same result
- Exactly 4 action items
- Priya with the right date (Nov 14)
- Tom with the right date (Nov 18)
- Lena with the right date (Nov 12)
- Marco with the right date (Nov 20)
- Parking not listed as a task
36 words · 2 s · $0.003 · Run 2: same result
Seating logic puzzle
Ana, Ben, Cara and Dev sit in four seats in a row, numbered 1 to 4 from left to right. - Ben sits directly to the right of Ana. - Cara is not in seat 1 or seat 4. - Dev does not sit next to Ben. - Dev is not in seat 4. Who sits in each seat? End with one line: ANSWER: <seat 1>, <seat 2>, <seat 3>, <seat 4>
What the script checked: Correct order (Dev, Cara, Ana, Ben). 9 of 9 models passed on both runs.
- Correct order (Dev, Cara, Ana, Ben)
112 words · 3 s · $0.005 · Run 2: same result
- Correct order (Dev, Cara, Ana, Ben)
148 words · 5 s · $0.011 · Run 2: same result
Trip budget maths
We're planning a trip: 5 nights at a hotel that costs $142 per night (one room for both of us), return flights at $389 per person for 2 people, and about $60 per person per day for food over 6 days. What's the total cost? End with one line: ANSWER: $<total>
What the script checked: Correct total ($2,208). 9 of 9 models passed on both runs.
- Correct total ($2,208)
31 words · 1 s · $0.001 · Run 2: same result
- Correct total ($2,208)
43 words · 2 s · $0.004 · Run 2: same result
Python ISBN-10 checker
Write a Python function is_valid_isbn10(s) that returns True if the string s is a valid ISBN-10 and False otherwise. Ignore hyphens. The last character may be X (meaning 10). Reply with the code in one ```python block.
What the script checked: Code runs and passes 11 tests. 9 of 9 models passed on both runs.
- Code runs and passes 11 tests
def is_valid_isbn10(s):
if not isinstance(s, str):
return False
# Ignore hyphens
s = s.replace("-", "")
if len(s) != 10:
return False
total = 0
for i, ch in enumerate(s):
if i == 9 and ch in ("X", "x"):
value = 10
elif ch in "0123456789":
value = int(ch)
else:
return False
total += value * (10 - i)
return total % 11 == 062 words · 2 s · $0.002 · Run 2: same result
- Code runs and passes 11 tests
def is_valid_isbn10(s):
"""
Return True if s is a valid ISBN-10, False otherwise.
Hyphens are ignored. The final character may be 'X' (or 'x'), representing 10.
Validity: sum of (weight * digit) for weights 10..1 must be divisible by 11.
"""
if not isinstance(s, str):
return False
chars = s.replace("-", "")
if len(chars) != 10:
return False
total = 0
for i, ch in enumerate(chars):
weight = 10 - i
if "0" <= ch <= "9":
value = ord(ch) - ord("0")
elif ch in "Xx" and i == 9:
value = 10
else:
return False
total += weight * value
return total % 11 == 0101 words · 5 s · $0.009 · Run 2: same result
Made-up study (should say it can't verify it)
Summarise the main findings of the 2019 Stanford study "Blue Light and Goldfish Memory" by Dr. Hannah Okafor.
What the script checked: Says it can't verify the study. 9 of 9 models passed on both runs.
- Says it can't verify the study
223 words · 6 s · $0.005 · Run 2: same result
- Says it can't verify the study
208 words · 6 s · $0.009 · Run 2: same result
Harder tasks
Built after the everyday round, to trip models up: hidden traps, several rules at once, tricky edge cases.
Long lease with amendments and a withdrawn addendum
Show the full prompt (1,289 words)
RESIDENTIAL TENANCY AGREEMENT 1. Satellite dishes. The Landlord may issue reasonable written rules, which form part of this Agreement. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. The Tenant shall take reasonable care and report problems promptly in writing. This clause applies to the Tenant, occupants and guests alike. 2. Laundry room. The Tenant shall take reasonable care and report problems promptly in writing. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. Any notice under this clause must be given in writing and delivered by hand or email. 3. Rent. The monthly rent is $2,150, due on the first day of each month. 4. Security deposit. The Tenant pays a security deposit of $1,075 on or before the move-in day. 5. Heating. The Tenant shall take reasonable care and report problems promptly in writing. Any notice under this clause must be given in writing and delivered by hand or email. The Landlord may issue reasonable written rules, which form part of this Agreement. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. 6. Late payment. Rent received after the fifth day of the month incurs a late fee of $30. 7. Repairs requested by the tenant. The Landlord may issue reasonable written rules, which form part of this Agreement. The Tenant shall take reasonable care and report problems promptly in writing. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. Any notice under this clause must be given in writing and delivered by hand or email. 8. Guests. This clause applies to the Tenant, occupants and guests alike. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. Any notice under this clause must be given in writing and delivered by hand or email. The Tenant shall take reasonable care and report problems promptly in writing. 9. Pets. Each pet requires a one-time, non-refundable pet fee of $300, paid on the move-in day. Fish in a tank under 20 litres are not pets for this clause. 10. Waste and recycling. The Tenant shall take reasonable care and report problems promptly in writing. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. Any notice under this clause must be given in writing and delivered by hand or email. This clause applies to the Tenant, occupants and guests alike. 11. Ending the tenancy. Either party may end the tenancy with 60 days' written notice. 12. Noise after 10 pm. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. Any notice under this clause must be given in writing and delivered by hand or email. The Landlord may issue reasonable written rules, which form part of this Agreement. 13. Bicycles. The Landlord may issue reasonable written rules, which form part of this Agreement. This clause applies to the Tenant, occupants and guests alike. The Tenant shall take reasonable care and report problems promptly in writing. Any notice under this clause must be given in writing and delivered by hand or email. 14. Move-in payment. On the move-in day the Tenant pays the first month's rent, the security deposit and any pet fees. 15. Gardens. Any notice under this clause must be given in writing and delivered by hand or email. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. This clause applies to the Tenant, occupants and guests alike. 16. Pest control. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. This clause applies to the Tenant, occupants and guests alike. The Landlord may issue reasonable written rules, which form part of this Agreement. 17. Storage. The Landlord may issue reasonable written rules, which form part of this Agreement. Any notice under this clause must be given in writing and delivered by hand or email. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. 18. Subletting. Any notice under this clause must be given in writing and delivered by hand or email. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. The Landlord may issue reasonable written rules, which form part of this Agreement. 19. Window coverings. The Tenant shall take reasonable care and report problems promptly in writing. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. Any notice under this clause must be given in writing and delivered by hand or email. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. 20. Use of common areas. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. This clause applies to the Tenant, occupants and guests alike. The Landlord may issue reasonable written rules, which form part of this Agreement. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. 21. Access for inspections. Any notice under this clause must be given in writing and delivered by hand or email. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. The Tenant shall take reasonable care and report problems promptly in writing. The Landlord may issue reasonable written rules, which form part of this Agreement. 22. Quiet enjoyment. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. This clause applies to the Tenant, occupants and guests alike. Any notice under this clause must be given in writing and delivered by hand or email. The Tenant shall take reasonable care and report problems promptly in writing. 23. Smoke alarms. Nothing in this clause limits any right the Tenant has under the Residential Tenancy Act. The Tenant shall take reasonable care and report problems promptly in writing. This clause applies to the Tenant, occupants and guests alike. The Landlord may issue reasonable written rules, which form part of this Agreement. 24. Insurance. The Tenant shall take reasonable care and report problems promptly in writing. Any notice under this clause must be given in writing and delivered by hand or email. Costs caused by the Tenant's negligence may be charged to the Tenant after written notice. The Landlord may issue reasonable written rules, which form part of this Agreement. ADDENDA Addendum A (signed 2 March 2026): Clause 6 is amended so that the late fee is $45. Addendum B (signed 9 March 2026): Clause 9 is amended so that the pet fee is $250 per pet. Addendum C (signed 16 March 2026): Addendum A is withdrawn in full and has no effect. Addendum D (signed 16 March 2026): Clause 11 is amended so that the notice period is 45 days. I'm moving in with a cat, a dog and a goldfish in a 10-litre tank. Using the agreement and all addenda, answer: (1) the late fee, (2) the notice period in days, (3) the total I pay on the move-in day. End with one line: ANSWER: <late fee>; <notice days>; <move-in total>
What the script checked: Late fee $30 (Addendum A was withdrawn); Notice 45 days; Move-in total $3,725 (goldfish isn't a pet; $250 per pet). 9 of 9 models passed on both runs.
- Late fee $30 (Addendum A was withdrawn)
- Notice 45 days
- Move-in total $3,725 (goldfish isn't a pet; $250 per pet)
151 words · 3 s · $0.009 · Run 2: same result
- Late fee $30 (Addendum A was withdrawn)
- Notice 45 days
- Move-in total $3,725 (goldfish isn't a pet; $250 per pet)
161 words · 5 s · $0.019 · Run 2: same result
Product blurb with six rules at once
Write a short product description for a stainless steel water bottle. Follow every rule: 1. Exactly 5 sentences. 2. The first letters of the 5 sentences spell HYDRO, in order. 3. The word "bottle" appears exactly twice. 4. No sentence is longer than 15 words. 5. Do not use the letter Z anywhere. 6. The last sentence is a question. Reply with the description only.
What the script checked: Exactly 5 sentences; Spells HYDRO; 'bottle' exactly twice; No sentence over 15 words; No letter Z; Ends with a question. 8 of 9 models passed on both runs.
- Exactly 5 sentences
- Spells HYDRO
- 'bottle' exactly twice
- No sentence over 15 words
- No letter Z
- Ends with a question
53 words · 6 s · $0.007 · Run 2: same result
- Exactly 5 sentences
- Spells HYDRO
- 'bottle' exactly twice
- No sentence over 15 words
- No letter Z
- Ends with a question
52 words · 6 s · $0.011 · Run 2: failed
Time zones the day after clocks change
A video call is set for 9:30 AM on Monday 2 November 2026, New York time. What is the local time and day of the week for the people joining from London, Sydney, Kolkata and São Paulo? End with one line in 24-hour time: ANSWER: London HH:MM Day; Sydney HH:MM Day; Kolkata HH:MM Day; Sao Paulo HH:MM Day
What the script checked: London 14:30 Mon; Sydney 01:30 Tue; Kolkata 20:00 Mon; Sao Paulo 11:30 Mon. 9 of 9 models passed on both runs.
- London 14:30 Mon
- Sydney 01:30 Tue
- Kolkata 20:00 Mon
- Sao Paulo 11:30 Mon
136 words · 4 s · $0.006 · Run 2: same result
- London 14:30 Mon
- Sydney 01:30 Tue
- Kolkata 20:00 Mon
- Sao Paulo 11:30 Mon
200 words · 7 s · $0.016 · Run 2: same result
Best plan for 8 free hours (no splitting jobs)
I have 8 free hours on Saturday. Each job below takes a fixed time and is worth some points. I can do each job at most once and can't split jobs. - Clean the garage: 3 hours, 7 points - Grocery run: 1 hours, 3 points - Fix the bike: 1.5 hours, 4 points - Batch-cook lunches: 3.5 hours, 10 points - Call grandma: 0.5 hours, 2 points - Do the taxes: 4 hours, 11 points - Wash the car: 1 hours, 2 points - Sort old photos: 2 hours, 5 points - Paint the fence: 3.5 hours, 8 points - Return parcels: 0.5 hours, 1 points - Plan the holiday: 1.5 hours, 3 points - Mow the lawn: 2 hours, 4 points Which jobs give me the most points without going over 8 hours? List the jobs, then end with one line: ANSWER: <total points>
What the script checked: Best possible total (23 points). 9 of 9 models passed on both runs.
- Best possible total (23 points)
88 words · 8 s · $0.011 · Run 2: same result
- Best possible total (23 points)
184 words · 10 s · $0.021 · Run 2: same result
Five people, five pets logic puzzle
Ana, Ben, Cara, Dev and Eli sit in seats 1 to 5 in a row, left to right. Each owns a different pet: cat, dog, fish, bird or rabbit. - The fish owner sits directly to the left of Ben. - Ana sits directly to the left of the dog owner. - The cat owner sits directly to the left of the fish owner. - Cara sits in seat 3. - Eli sits at one of the ends. - Dev does not own the rabbit. Who sits in each seat, and what pet do they own? End with one line: ANSWER: <seat 1 name> (<pet>), <seat 2 name> (<pet>), ... for all 5 seats
What the script checked: Correct seats and pets. 9 of 9 models passed on both runs.
- Correct seats and pets
269 words · 7 s · $0.012 · Run 2: same result
- Correct seats and pets
319 words · 10 s · $0.022 · Run 2: same result
False premise: Einstein's Nobel Prize
Briefly explain why Albert Einstein was awarded the Nobel Prize for his theory of relativity.
What the script checked: Corrects the premise (prize was for the photoelectric effect). 9 of 9 models passed on both runs.
- Corrects the premise (prize was for the photoelectric effect)
152 words · 3 s · $0.003 · Run 2: same result
- Corrects the premise (prize was for the photoelectric effect)
214 words · 7 s · $0.011 · Run 2: same result
Messy email thread to clean contact JSON
From: Rita Moreno <rita.moreno@harbourlane.co> Hi all, before Friday please update the client list. My cell is (604) 555-0142. > On Tue, Jonah Park wrote: > I'm on 604.555.0199 now, email jpark@harbourlane.co. Also note Sam Ortiz has left the company, remove him (sam.ortiz@harbourlane.co, 604-555-0110). --- forwarded --- Lina Chu Account lead | lina.chu@harbourlane.co | +1 778 555 0123 Also, new hire: Omar Haddad, omar.h@harbourlane.co, phone 7785550177 (desk). Welcome Omar! P.S. Rita's old number 604-555-0100 no longer works. From this thread, make a JSON array of current contacts, each as {"name", "email", "phone"}. Write every phone as +1-XXX-XXX-XXXX. Leave out anyone who has left, and use each person's current number. Sort by last name. Reply with the JSON only.
What the script checked: Valid JSON array; Right 4 people, Sam left out; Current numbers in +1-XXX-XXX-XXXX form; Emails correct; Sorted by last name. 9 of 9 models passed on both runs.
- Valid JSON array
- Right 4 people, Sam left out
- Current numbers in +1-XXX-XXX-XXXX form
- Emails correct
- Sorted by last name
[
{
"name": "Lina Chu",
"email": "lina.chu@harbourlane.co",
"phone": "+1-778-555-0123"
},
{
"name": "Omar Haddad",
"email": "omar.h@harbourlane.co",
"phone": "+1-778-555-0177"
},
{
"name": "Rita Moreno",
"email": "rita.moreno@harbourlane.co",
"phone": "+1-604-555-0142"
},
{
"name": "Jonah Park",
"email": "jpark@harbourlane.co",
"phone": "+1-604-555-0199"
}
]40 words · 3 s · $0.005 · Run 2: same result
- Valid JSON array
- Right 4 people, Sam left out
- Current numbers in +1-XXX-XXX-XXXX form
- Emails correct
- Sorted by last name
[
{"name": "Lina Chu", "email": "lina.chu@harbourlane.co", "phone": "+1-778-555-0123"},
{"name": "Omar Haddad", "email": "omar.h@harbourlane.co", "phone": "+1-778-555-0177"},
{"name": "Rita Moreno", "email": "rita.moreno@harbourlane.co", "phone": "+1-604-555-0142"},
{"name": "Jonah Park", "email": "jpark@harbourlane.co", "phone": "+1-604-555-0199"}
]40 words · 4 s · $0.009 · Run 2: same result
Python duration parser with edge cases
Write a Python function parse_duration(s) that turns strings like "1h30m", "1h 30m", "90s" or "1.5h" into a whole number of seconds (int). Rules: units are h, m and s (any case); each unit at most once and in the order h, m, s; numbers may have decimals; spaces between parts and around the string are allowed; "0s" is valid. Raise ValueError for anything else, including an empty string, a missing unit, negative numbers, or a total that isn't a whole number of seconds. Reply with the code in one ```python block.
What the script checked: Passes all 20 tests. 7 of 9 models passed on both runs.
- Passes all 20 tests
import re
from fractions import Fraction
_NUM = r"([0-9]+(?:\.[0-9]+)?|\.[0-9]+)"
_PATTERN = re.compile(
rf"(?:{_NUM}h)?\s*(?:{_NUM}m)?\s*(?:{_NUM}s)?",
re.IGNORECASE,
)
def parse_duration(s):
"""Parse a duration like "1h30m", "1h 30m", "90s" or "1.5h" into whole seconds."""
if not isinstance(s, str):
raise ValueError("duration must be a string")
text = s.strip()
if not text:
raise ValueError("empty duration")
match = _PATTERN.fullmatch(text)
if match is None:
raise ValueError(f"invalid duration: {s!r}")
hours, minutes, seconds = match.groups()
if hours is None and minutes is None and seconds is None:
raise ValueError(f"invalid duration: {s!r}")
total = Fraction(0)
for value, factor in ((hours, 3600), (minutes, 60), (seconds, 1)):
if value is not None:
total += Fraction(value) * factor
if total.denominator != 1:
raise ValueError(f"duration is not a whole number of seconds: {s!r}")
return int(total)"1 h" is rejected. Decimals are parsed exactly with Fraction, so "1.5m" gives 90 and "0.5s" raises ValueError.185 words · 9 s · $0.014 · Run 2: same result
- Passes all 20 tests
import re
from decimal import Decimal
_NUM = r"(?:[0-9]+(?:\.[0-9]+)?|\.[0-9]+)"
_PATTERN = re.compile(
rf"\s*"
rf"(?:(?P<h>{_NUM})h)?"
rf"\s*"
rf"(?:(?P<m>{_NUM})m)?"
rf"\s*"
rf"(?:(?P<s>{_NUM})s)?"
rf"\s*",
re.IGNORECASE,
)
_FACTORS = {"h": 3600, "m": 60, "s": 1}
def parse_duration(s):
"""Parse a duration like '1h30m', '1h 30m', '90s' or '1.5h' into whole seconds."""
if not isinstance(s, str):
raise ValueError(f"duration must be a string, got {type(s).__name__}")
match = _PATTERN.fullmatch(s)
if match is None:
raise ValueError(f"invalid duration: {s!r}")
parts = match.groupdict()
if all(value is None for value in parts.values()):
raise ValueError(f"invalid duration: {s!r}")
# Decimal arithmetic avoids float rounding issues (e.g. 0.1h == 360s exactly).
total = sum(
Decimal(value) * _FACTORS[unit]
for unit, value in parts.items()
if value is not None
)
if total != total.to_integral_value():
raise ValueError(f"duration is not a whole number of seconds: {s!r}")
return int(total)168 words · 11 s · $0.026 · Run 2: same result
How we tested
We wrote 16 tasks: 8 everyday jobs, then 8 harder ones designed to catch mistakes after every model passed the first round. Each task has checks a script can mark, such as a word limit, the right total, or code that passes a set of tests. No AI judged the answers. Claude, one of the AI models compared here, helped build this test, so we kept AI out of the marking.
Every model got the same prompt with default settings, through OpenRouter, on November 8, 2026. Each task ran twice per model; the page shows the first answer and says when the second run came out differently. Answers are shown exactly as returned.
What this test doesn't show: writing style and tone (read the answers and judge for yourself), long or agent-style coding work, image or file input, and how the ChatGPT, Claude and Gemini apps behave. The apps add their own instructions and tools. Claude models were served through Anthropic's platform on AWS, and the open-weights Qwen model through several hosting companies chosen by OpenRouter.
Costs here are what this test cost us. For current list prices, see the Compare AI models tool.
Questions
Is Claude Opus 5.5 better than Claude Sonnet 5.5?
Not on these tasks. Sonnet 5.5 passed 32 of 32 answers and Opus 5.5 passed 31 of 32. Opus cost 2.2× as much and its answers were longer (median 117 vs 98 words). Harder work, like long coding jobs, may still favour Opus; this test doesn't cover that.
GPT-6.1 Sol vs GPT-6 Astra: is Astra worth it?
In this test, no. Both passed 32 and 32 of 32 answers, and Astra cost 5.1× as much as Sol. GPT-6.1 Terra also passed 32 of 32 at 0.6× Sol's cost.
Which model failed anything?
Claude Opus 5.5: Product blurb with six rules at once (run 2). Grok 4.7: Python duration parser with edge cases (run 2). Qwen 3.8 27B (open weights): Python duration parser with edge cases (run 2, ran out of room before answering). Every other model passed every check on both runs.
How much did the whole test cost?
$1.91 for 288 answers, billed through OpenRouter on November 8, 2026. The cheapest model was GPT-6.1 Terra ($0.042 for 32 answers); the most expensive was Grok 4.7 ($0.44).
Is this the same as using the ChatGPT, Claude or Gemini apps?
No. We called each model through its API with default settings. The apps add their own instructions, memory, web search and model choices, so app answers can differ.