The topline is blunt: gpt-oss-120b wins, 106.3 to 93.7, with 99% confidence. The task count is even harsher — 10 wins to 2 — which makes this less a stylistic preference than a real separation in day-to-day utility. If you’re picking a general-purpose text model on these results alone, the answer is straightforward.
What pushed gpt-oss-120b over the top was not one flashy category but repeated competence on practical work: proofreading for fidelity and tone, localization, strict JSON extraction, incident-note summarization, cache implementation, scheduling under constraints, and concise reasoning. Just as important, it often won by being the model that actually respected the output contract — returning clean JSON, sticking closer to requested format, or avoiding unnecessary elaboration when the prompt asked for just the answer.
DeepSeek-V4-Pro was not outclassed everywhere. It earned real wins on Precise proofreading, where it preserved wording and meaning better, and on sql_vendor_spend_q2, where one judge pass preferred its safer grouping. But those bright spots were isolated, and even several of its nominal losses came from a recurring editorial problem: adding markdown fences, extra prose, or slightly more interpretive rewrites than the prompt invited. In a benchmark like this, that’s not cosmetic; it’s the difference between usable output and cleanup work.
The per-task notes do show some judge-order instability on individual items, so this wasn’t a perfect sweep in spirit. But that caveat doesn’t rescue the overall result. When one model wins 10 of 12 tasks and the aggregate margin lands at 99% confidence, the right read is not "close, but maybe" — it’s that gpt-oss-120b was the more reliable model across a wide spread of realistic text tasks.
Final call: gpt-oss-120b is the clear winner. DeepSeek-V4-Pro shows flashes of strong judgment, but gpt-oss-120b was more dependable, more format-disciplined, and simply better across this matchup.
How they were tested
We ran 12 fresh text tasks, generated on the fly for this matchup so neither model could prepare in advance, and had gpt-5.4 score each one. DeepSeek-V4-Pro scored 93.7 to gpt-oss-120b's 106.3.
1. sql_vendor_spend_q2
You are given this PostgreSQL schema: vendors(vendor_id INT PRIMARY KEY, vendor_name TEXT, category TEXT) invoices(invoice_id INT PRIMARY KEY, vendor_id INT, invoice_date DATE, status TEXT, total_amount NUMERIC) invoice_lines(line_id INT PRIMARY KEY, invoice_id INT, cost_center TEXT, line_amount NUMERIC) Write ONE SQL query that returns, for Q2 2024 only, the top 3 vendors by total approved spend charged to the 'Field Ops' cost center. Count only invoices with status = 'approved'. Output columns: vendor_name, total_spend, invoice_count. total_spend is the sum of relevant line_amount values, invoice_count is the number of distinct approved invoices contributing to that vendor's spend. Sort by total_spend DESC, then vendor_name ASC.
Winner: DeepSeek-V4-Pro — Model A provides a fully correct query and groups by vendor_id plus vendor_name, which is safer if vendor names are duplicated. Model B is mostly correct, but grouping only by vendor_name can incorrectly merge distinct vendors with the same name. (Order-swapped judge pass: Both queries are functionally correct, but B is slightly better because it groups by vendor_id as well as vendor_name, avoiding accidental merging of vendors with the same name, and it uses a safer half-open date range. A is still strong but slightly less robust.)
2. Concurrency bug fix
This TypeScript function is meant to memoize an async but has a race: concurrent callers can each trigger the underlying fetch. Fix it so the fetch runs at most once per key, and a rejected fetch does NOT poison the cache (a later call must retry). Return ONLY the corrected function. ts const cache = new Map<string, Promise<string>>(); async function load(key: string, fetcher: (k: string) => Promise<string>) { if (cache.has(key)) return cache.get(key)!; const value = await fetcher(key); cache.set(key, Promise.resolve(value)); return value; }
Winner: gpt-oss-120b — Both fixes correctly store the in-flight promise immediately and delete it on rejection so retries work, but Model B better follows the instruction to return only the corrected function. Model A adds extra prose outside the function/code block, which is a notable instruction-following issue. (Order-swapped judge pass: Both fixes correctly store the in-flight promise immediately and delete it on rejection so retries work, but Model A better follows the instruction to return only the corrected function. Model B adds extra prose outside the function block, which is a minor instruction-following issue.)
3. proofread_client_update
Edit the passage for grammar, clarity, and professional tone WITHOUT changing its meaning. Then provide a brief note listing the main types of changes you made. Passage: Hi Marta — just wanted to let you know the draft deck is mostly done, but there is still a few numbers I need to recheck because finance sent an updated export last night which don't match the version we used Tuesday. Also, the slide about warehouse delays are probably too detailed for the client, however I left it in for now incase you think they'll ask. If your okay with it, I'll send the cleaned up version tomorrow morning before 9 and we can decide then whether we should keep appendix B or cut it entirely.
Winner: gpt-oss-120b — Model B better preserves the original meaning while improving grammar, clarity, and tone; Model A is strong but makes slightly more interpretive changes such as shifting "numbers" to "figures" and "cut it entirely" to "remove it entirely." Both follow instructions well, but B is a bit more faithful and polished. (Order-swapped judge pass: A is slightly better because it preserves the original meaning more closely while improving grammar and professionalism, and its change note is accurate and concise. B is strong, but it introduces small meaning shifts such as splitting the sentence about the export and adding 'with this plan'/'ask about it,' plus its note claims it removed 'probably' even though it retained it.)
4. Localization with tone
Translate this app onboarding line into natural, friendly European Spanish suitable for a mobile toast (keep it under 60 characters, no exclamation marks): "You're all set — your first backup starts tonight." Return only the translation, then the character count in parentheses.
Winner: gpt-oss-120b — Both are under 60 characters and natural enough, but B better matches the friendly onboarding tone and preserves the direct second-person feel of the original. A is slightly less warm and shifts the meaning a bit with a more impersonal future construction. (Order-swapped judge pass: A is more natural and friendly for European Spanish onboarding copy and stays concise while preserving the meaning well. B is acceptable, but "se hará" sounds less natural for a mobile toast and loses some of the warm, ready-to-go tone of the original.)
5. normalize_supplier_contacts
Convert the messy supplier contact data below into valid JSON as an array of objects with EXACTLY these keys in this order: company, contact_name, email, phone, city, active Rules: - active must be a JSON boolean. - Normalize emails to lowercase. - Normalize phone to digits and leading + only, preserving country code when present. - Use null for missing email or phone. - Trim surrounding whitespace from text fields. - Output only the JSON. Data: 1) Copper Finch Ltd | Ana Rios | ANA.RIOS@CopperFinch.co.uk | +44 20 7946 1182 | Leeds | active 2) Northlake Medical Supplies| Dev Malek | — | (312) 555-0189 | Chicago | inactive 3) Oriel Foods | Priya N. Shah | priyashah@orielfoods.com | | Mumbai | active 4) Hinton Rail Systems | Luca Meyer | sales@hintonrail.de | +49-30-8855-441 | Berlin | active
Winner: gpt-oss-120b — Both outputs correctly normalize the records, but Model A violates the instruction to output only JSON by wrapping the array in a Markdown code fence. Model B provides clean JSON-only output and is therefore better overall. (Order-swapped judge pass: Model A fully follows the requirement to output only valid JSON and correctly normalizes all fields without inventing missing country code information. Model B adds Markdown code fences, violating the output constraint, and appears to infer a +1 country code for a phone number that did not include one.)
6. Precise proofreading
Correct ONLY the grammar, spelling, and punctuation errors in the sentence below without changing wording, tone, or meaning, then on a second line list each change as 'was -> now'. Sentence: "Its been a long time since we seen there new office, and me and him was suprised how quite it was."
Winner: DeepSeek-V4-Pro — Model A better preserves the original wording and meaning while correcting the errors. Model B introduces a less faithful tense change ('seen' -> 'have seen') and formats the change list less clearly than requested. (Order-swapped judge pass: Both outputs fix the sentence but violate the instruction to correct only grammar, spelling, and punctuation without changing wording: A changes "seen" to "have seen," while B changes it to "saw," and both also rewrite "me and him" to "he and I." Since both make unnecessary wording changes, neither is clearly better overall.)
7. Strict JSON extraction
Extract every meeting from this text into a JSON array of {"title","day","start24","durationMinutes"}. Use 24-hour "HH:MM" for start24, integer minutes for duration, and title-case titles. Return ONLY valid JSON, no commentary. Text: "Standup is daily at 9am for a quarter hour. The design review runs thursday from 2:30-4pm. Payroll sync — first monday, 11:00 to noon."
Winner: gpt-oss-120b — Model B better preserves the requested title casing and outputs clean valid JSON only. Model A includes markdown code fences and leaves day values in lowercase, while B’s main flaw is dropping the ordinal in "first monday." (Order-swapped judge pass: Model A better follows the formatting instruction by returning raw valid JSON and correctly title-casing titles; its main flaw is losing the ordinal in "first monday." Model B preserves "first monday" but violates the requirement to return only valid JSON by wrapping the output in code fences and also fails title-casing for the day field if that is interpreted strictly.)
8. summarize_incident_notes
Summarize the following incident notes into EXACTLY 3 bullet points, each bullet no more than 14 words, faithful to the facts and without adding recommendations. Notes: - 08:42: Checkout latency jumped from ~900 ms to 6-8 s after release 2024.11.3. - 08:47: On-call noticed only EU-West shoppers were affected; US-East remained normal. - 08:55: Error rate stayed below 1%, but payment retries doubled. - 09:03: Rolled back the new tax-calculation service client in EU-West only. - 09:11: Latency fell to 1.2 s; retries began declining within ten minutes. - Follow-up: add region-by-region canarying and dashboard segmentation by release version.
Winner: gpt-oss-120b — Model B is more faithful and complete: it preserves the 6-8 s range, mentions US-East remained normal, and includes the measured recovery to 1.2 s while staying within the bullet and word limits. Model A is solid but slightly less precise and omits key factual details. (Order-swapped judge pass: Model A is more faithful to the notes, preserving key specifics like the release version, regional scope, low error rate, and post-rollback latency. Both violate the 14-word limit on some bullets, but Model B is less precise and omits important details such as EU-West-only rollback and the 1.2 s latency outcome.)
9. lru_cache_impl
Implement an LRU (least recently used) cache in Python 3. Requirements: - Class name: LRUCache - Methods: init(capacity: int), get(key: int) -> int, put(key: int, value: int) -> None - get returns -1 if the key is absent. - Both get and put must run in O(1) average time. - When capacity is exceeded, evict the least recently used key. - Use only the Python standard library. Return code only.
Winner: gpt-oss-120b — Model B provides a clean, standard-library-based O(1) implementation using OrderedDict and correctly handles updates and eviction. Model A is mostly correct, but it leaves stale nodes possible when updating existing keys and does not handle invalid capacity explicitly. (Order-swapped judge pass: Model A provides a correct, concise O(1)-average implementation using OrderedDict from the standard library and fully satisfies the prompt. Model B uses a valid hash map + doubly linked list approach, but it fails to handle zero/negative capacity safely and is slightly less polished overall.)
10. Constraint scheduling
Four talks (A, B, C, D) fill four 1-hour slots 9,10,11,12. Constraints: A is before D; C is not first; B is immediately after A; D is not at 12. Give the ONE valid schedule as 'slot: talk' lines, then a one-line justification. If impossible, say so and explain.
Winner: gpt-oss-120b — Both outputs give the unique correct schedule, but Model B adheres more closely to the requested format by providing just the schedule lines and a one-line justification. Model A is correct but adds unnecessary step-by-step reasoning beyond the instruction. (Order-swapped judge pass: Both outputs are correct, but A adheres more closely to the requested format by giving the schedule directly as slot-talk lines followed by a one-line justification. B adds unnecessary step-by-step reasoning and extra formatting beyond the instruction.)
11. Faithful rewrite
Rewrite this blunt internal note as a warm, professional Slack message to the whole engineering team (60–90 words), keeping every fact intact and adding no new commitments. Return only the message. Note: "Deploy is frozen until the memory leak in the image service is fixed. Priya is on it. Do not merge to main. ETA tomorrow noon."
Winner: gpt-oss-120b — Both are warm and professional, but each adds unsupported details beyond the note. A adds that Priya is actively working, tells others not to jump in unless asked, and says "until further notice"; B adds that Priya is leading and making good progress, and reframes the ETA as an expectation of a fix being ready. (Order-swapped judge pass: Model A is warmer and professional while preserving the core facts more faithfully. Model B adds unsupported content ('no need to jump in unless she reaches out' and 'until further notice') and weakens the stated ETA by changing it to an aim.)
12. reasoning_shift_coverage
A clinic schedules one nurse per shift for Monday. Three shifts must be covered: Morning, Afternoon, Night. Available nurses and constraints: - Imani can work Morning or Afternoon, but not both. - Pavel can work Afternoon or Night. - Sora can work Morning or Night. - Tessa can work only Night. - Exactly one of Pavel or Sora must be assigned. - Tessa is assigned if and only if Pavel is not assigned. How many valid full schedules are possible? Give the final number and a brief explanation.
Winner: gpt-oss-120b — Both outputs reach the correct answer of 1 and explain it clearly. Model B is slightly better because its reasoning is more concise and directly structured around the key constraints without unnecessary case breakdown detail. (Order-swapped judge pass: Both outputs correctly conclude that there is exactly 1 valid schedule and provide sound reasoning that satisfies the prompt. Model A is slightly more concise, while Model B is slightly more explicit, but neither is meaningfully better overall.)
See every prompt and the full side-by-side outputs in the interactive Head-to-Head.