Head to head: Kimi-K2.7-Code vs DeepSeek-V4-Flash

Kimi-K2.7-Code vs DeepSeek-V4-Flash

This wasn’t a blowout, but Kimi-K2.7-Code did enough across the right tasks to finish ahead. It won more often, posted the higher aggregate score, and looked slightly steadier on instruction-following and exactness, even if DeepSeek-V4-Flash stayed competitive throughout.

Kimi-K2.7-Code takes this matchup on points, not by demolition. The aggregate score favors A **112.4 to 99.8**, the task tally goes **5–3 with 4 ties**, and the statistical read is a **75% confidence lean**—which is exactly the right framing here. This is a real edge, not a rout. Where Kimi earned the verdict was on tasks that punish sloppiness. It was better on **nuanced classification**, **constraint scheduling**, **find the contradiction**, and **summarizing a dense passage**—all areas where exact compliance and precise reading matter more than polish. In several of those, DeepSeek didn’t just lose on style; it lost on correctness or format discipline, from wrapping JSON incorrectly to producing a schedule that violated the stated constraint to missing the actual contradictory pair. DeepSeek-V4-Flash absolutely had its moments. It was the stronger pick on **localization with tone**, **es-mx support translation**, and **meeting-notes summarization**, where its phrasing was often a touch more natural or more faithful to the source notes. And the four ties matter: on **inventory math**, **messy-orders JSON normalization**, **python bug-fixing**, and effectively the straightforward calculation work, neither model created meaningful separation. The interesting wrinkle is that several order-swapped judge passes flipped individual task calls, which tells you this matchup is closer than the raw win count alone suggests. But even after accounting for that noise, Kimi still comes out ahead because its wins cluster around higher-value failure modes: instruction-following, logical consistency, and extracting the exact requested detail. **Final call: Kimi-K2.7-Code wins, but this is a lean verdict—not a landslide.**

Nuanced classification

Classify each review's sentiment as "positive", "negative", or "mixed", and give a 6-word-max reason. Return ONLY a JSON array of {"text","label","reason"} in input order. Reviews: ["Fast shipping but the fabric feels cheap.", "Absolutely love it, wearing it daily!", "It broke after a week. Refund was quick and painless though."]

Kimi-K2.7-Code: [ {"text": "Fast shipping but the fabric feels cheap.", "label": "mixed", "reason": "Fast shipping but cheap fabric feel"}, {"text": "Absolutely love it, wearing it daily!", "label": "positive", "reason": "User loves and wears it daily"}, {"text": "It broke after a week. Refund was quick and painless though.", "label": "mixed", "reason": "Broke quickly but refund was easy"} ]
DeepSeek-V4-Flash: ```json [ {"text": "Fast shipping but the fabric feels cheap.", "label": "mixed", "reason": "Positive shipping, negative fabric quality."}, {"text": "Absolutely love it, wearing it daily!", "label": "positive", "reason": "Enthusiastic approval and frequent use."}, {"text": "It broke after a week. Refund was quick and painless though.", "label": "mixed", "reason": "Product failure, but good refund experience."} ] ```

Both models classify the sentiments correctly, but Model A follows the output-format instruction exactly. Model B violates the requirement to return only a JSON array by wrapping the answer in a Markdown code block, despite having slightly more polished reasons. (Order-swapped judge pass: Both models classify all three reviews correctly, but B follows the 6-word-max reason constraint exactly and returns plain JSON. A violates the word-limit on every reason and includes Markdown code fences, making it less compliant.)

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.

Kimi-K2.7-Code: 9: A 10: B 11: D 12: C A is immediately followed by B, C is not first, and D is after A but not in the last slot.
DeepSeek-V4-Flash: 9: B 10: A 11: D 12: C **Justification:** A must be immediately before B, so the only possible AB block is at 9–10 or 10–11. If AB is at 10–11, then D (after A) could be at 12, but D cannot be at 12, so AB must be at 9–10. Then D after A can only be at 11, leaving 12 for C (which also satisfies C not first).

Model A gives the unique valid schedule and a concise justification. Model B's schedule violates the constraint that B is immediately after A, and its explanation contradicts its own output. (Order-swapped judge pass: Model B gives the unique valid schedule satisfying all constraints. Model A reverses the immediate-order constraint between A and B and therefore produces an invalid schedule despite a clear explanation.)

Find the contradiction

The following spec contains exactly one internal contradiction. Quote the two conflicting sentences verbatim and explain the conflict in one sentence. Do not fix it. Spec: "Free accounts may create up to three projects. Every account, regardless of tier, may archive unlimited projects. Archiving a project does not count against the project limit. Free accounts are limited to three projects total, including archived ones."

Kimi-K2.7-Code: “Archiving a project does not count against the project limit.” “Free accounts are limited to three projects total, including archived ones.” The first sentence says archived projects are excluded from the limit, while the second sentence says they are included in the limit.
DeepSeek-V4-Flash: **Conflicting sentences:** 1. "Free accounts may create up to three projects." 2. "Free accounts are limited to three projects total, including archived ones." **Conflict explanation:** The first sentence implies that archiving a project does not affect the limit (since it only counts projects created), while the second sentence contradicts this by counting archived projects against the same limit.

Model A identifies the actual contradictory pair verbatim and explains the conflict accurately in one sentence. Model B quotes one non-conflicting sentence and adds an explanation that is not supported by that sentence. (Order-swapped judge pass: Model B identifies the actual contradictory pair verbatim and explains the conflict directly. Model A quotes a non-contradictory sentence pair and adds an interpretation instead of isolating the exact contradiction.)

Unit-aware math

A pump moves 3.5 liters every 8 seconds. A tank holds 0.9 cubic meters. Starting empty, how long to fill it, in minutes and seconds (mm:ss), rounded to the nearest second? Show the key steps, then give the final answer on its own line.

Kimi-K2.7-Code: Key steps: 1. Convert tank volume to liters: \(0.9\ \text{m}^3 \times 1000 = 900\ \text{L}\) 2. Find pump rate: \(\frac{3.5\ \text{L}}{8\ \text{s}} = 0.4375\ \text{L/s}\) 3. Calculate fill time in seconds: \(\frac{900\ \text{L}}{0.4375\ \text{L/s}} = 2057.142857\ \text{s}\) 4. Round to nearest second: \(2057\ \text{s}\) 5. Convert to minutes and seconds: \(2057 \div 60 = 34\) minutes with \(17\) seconds remaining 34:17
DeepSeek-V4-Flash: We need to fill a tank of 0.9 cubic meters. First, convert cubic meters to liters: 1 m³ = 1000 L, so 0.9 m³ = 900 L. The pump moves 3.5 liters every 8 seconds. That’s a rate of: \( \frac{3.5}{8} \) liters per second = 0.4375 L/s. Time to fill 900 liters: \[ t = \frac{900}{0.4375} = 2057.142857 \text{ seconds} \] Convert seconds to minutes: 2057.142857 ÷ 60 = 34.285714… minutes. That’s 34 whole minutes plus 0.285714… × 60 = 17.142857 seconds. Rounding to the nearest second gives 17 seconds. **Final answer:** 34:17

Both outputs are correct, show the key steps clearly, and provide the final answer as 34:17. Model A is slightly more concise, while Model B is slightly more explanatory, but neither is meaningfully better for this task. (Order-swapped judge pass: Both outputs are correct and arrive at 34:17, but Model B follows the requested format more cleanly by explicitly labeling key steps and placing the final answer alone on its own line without extra text.)

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.

Kimi-K2.7-Code: Listo: tu primera copia de seguridad empieza esta noche. (56)
DeepSeek-V4-Flash: Listo, tu primera copia empieza esta noche. (42)

Both are natural and within the limit, but B is more concise and toast-friendly while preserving the meaning. A is slightly more formal/heavy with "copia de seguridad" and uses a character count that appears off by one. (Order-swapped judge pass: A is more concise and toast-friendly while staying natural and under the character limit. B is accurate and still within limit, but it is wordier and less suitable for a short mobile toast.)

inventory-reorder-math

A café tracks beans for three drinks. Each latte uses 18 g, each cappuccino 16 g, each flat white 20 g. Yesterday they sold 74 lattes, 51 cappuccinos, and 39 flat whites. They start today with 4.8 kg of beans. A shipment of 1.25 kg arrives at noon, but 0.35 kg must be discarded due to a torn bag. They want to end the day with at least 0.9 kg in reserve. Assuming today’s sales match yesterday exactly, how many additional grams of beans can they use for staff training samples today without dropping below the reserve? Show your calculation.

Kimi-K2.7-Code: **Beans needed for today’s drinks (same as yesterday)** - Lattes: \(74 \times 18 = 1{,}332\) g - Cappuccinos: \(51 \times 16 = 816\) g - Flat whites: \(39 \times 20 = 780\) g \[ 1{,}332 + 816 + 780 = 2{,}928 \text{ g} \] **Total beans available today** - Starting stock: \(4.8\) kg \(= 4{,}800\) g - Shipment: \(1.25\) kg \(= 1{,}250\) g - Discarded: \(0.35\) kg \(= 350\) g \[ 4{,}800 + 1{,}250 - 350 = 5{,}700 \text{ g} \] **Beans that can be used while keeping the 0.9 kg reserve** Reserve required: \(0.9\) kg \(= 900\) g \[ 5{,}700 - 900 = 4{,}800 \text{ g available for use} \] **Additional beans for staff training samples** \[ 4{,}800 - 2{,}928 = 1{,}872 \text{ g} \] They can use **1,872 grams** of beans for staff training samples today without dropping below the reserve.
DeepSeek-V4-Flash: We first calculate yesterday’s total bean usage: - Lattes: \(74 \times 18 = 1332\) g - Cappuccinos: \(51 \times 16 = 816\) g - Flat whites: \(39 \times 20 = 780\) g Total = \(1332 + 816 + 780 = 2928\) g. --- **Starting beans today:** They begin with 4.8 kg = \(4800\) g. **Shipment:** +1.25 kg = \(+1250\) g But \(-0.35\) kg = \(-350\) g due to torn bag Net from shipment = \(1250 - 350 = 900\) g. **Total beans available today:** \(4800 + 900 = 5700\) g. --- **Expected sales:** Same as yesterday = \(2928\) g. **Reserve required:** At least \(0.9\) kg = \(900\) g. Beans left after sales: \(5700 - 2928 = 2772\) g. To keep at least \(900\) g as reserve: Maximum extra for training = \(2772 - 900 = 1872\) g. --- \[ \boxed{1872} \] grams

Both outputs are fully correct, show the calculation clearly, and follow the instruction exactly. Model B is slightly more streamlined, while Model A is equally clear and well-structured, so neither is meaningfully better overall. (Order-swapped judge pass: Both outputs are fully correct, show the calculation clearly, and arrive at the same correct result of 1,872 grams. Model B is slightly more concise, while Model A is slightly more step-by-step, but neither is meaningfully better overall.)

es-mx-support-translation

Translate this customer-support message into Spanish (Mexico). Keep the meaning, sound calm and professional, and use 28–34 words total. Do not mention regions other than Mexico. Text: “We’ve confirmed your refund, but your bank may take 3 to 5 business days to post it. If the charge still appears after that, reply with the last four digits of the card.”

Kimi-K2.7-Code: Hemos confirmado su reembolso, pero su banco puede tardar de 3 a 5 días hábiles en reflejarlo. Si el cargo aún aparece después, responda con los últimos cuatro dígitos de su tarjeta.
DeepSeek-V4-Flash: Hemos confirmado su reembolso. Su banco puede tardar de 3 a 5 días hábiles en aplicarlo. Si el cargo aún aparece después de ese plazo, responda con los últimos cuatro dígitos de su tarjeta.

Both translations are accurate, calm, professional, and within the 28–34 word limit. Model B reads slightly more naturally and precisely in Spanish by using “después de ese plazo,” which better matches the original timing condition. (Order-swapped judge pass: Both are accurate and professional, but A better preserves the original meaning by explicitly conveying 'after that period' and stays within the 28–34 word limit. B is also strong, but 'después' is slightly less precise than 'after that' and the phrasing is a bit less complete.)

messy-orders-to-json

Clean this inline order log into VALID JSON only. Output an array of objects using this exact schema and key order: {"order_id": string, "customer": string, "email": string|null, "ship_date": "YYYY-MM-DD"|null, "items": [{"sku": string, "qty": integer}], "priority": boolean}. Rules: trim spaces, uppercase SKUs, combine duplicate SKUs within an order by summing qty, normalize dates, and convert missing email/ship date to null. Data: [Order A-104 | customer: Nila Ortega | email: nila.ortega@brimco.io | ship: 4/9/25 | items: qz-11 x2; qz-11 x 1; lm-3 x4 | priority: yes] [Order B-017 | customer: Rowan Pike | email: none | ship: pending | items: aa-9 x 10 | priority: no] [Order C-882 | customer: Petra Senn | email: petra@north-glen.net | ship: 2025-04-11 | items: tk-7 x1; LM-3 x 2; tk-7 x 3 | priority: true]

Kimi-K2.7-Code: ```json [ { "order_id": "A-104", "customer": "Nila Ortega", "email": "nila.ortega@brimco.io", "ship_date": "2025-04-09", "items": [ { "sku": "QZ-11", "qty": 3 }, { "sku": "LM-3", "qty": 4 } ], "priority": true }, { "order_id": "B-017", "customer": "Rowan Pike", "email": null, "ship_date": null, "items": [ { "sku": "AA-9", "qty": 10 } ], "priority": false }, { "order_id": "C-882", "customer": "Petra Senn", "email": "petra@north-glen.net", "ship_date": "2025-04-11", "items": [ { "sku": "TK-7", "qty": 4 }, { "sku": "LM-3", "qty": 2 } ], "priority": true } ] ```
DeepSeek-V4-Flash: ```json [ { "order_id": "A-104", "customer": "Nila Ortega", "email": "nila.ortega@brimco.io", "ship_date": "2025-04-09", "items": [ {"sku": "QZ-11", "qty": 3}, {"sku": "LM-3", "qty": 4} ], "priority": true }, { "order_id": "B-017", "customer": "Rowan Pike", "email": null, "ship_date": null, "items": [ {"sku": "AA-9", "qty": 10} ], "priority": false }, { "order_id": "C-882", "customer": "Petra Senn", "email": "petra@north-glen.net", "ship_date": "2025-04-11", "items": [ {"sku": "TK-7", "qty": 4}, {"sku": "LM-3", "qty": 2} ], "priority": true } ] ```

Both outputs are valid JSON and correctly normalize dates, trim fields, uppercase and combine duplicate SKUs, and convert missing values to null while preserving the required schema and key order. The only difference is formatting style, which does not affect quality for this task. (Order-swapped judge pass: Both outputs are valid JSON arrays matching the exact schema and key order, with correctly normalized dates, trimmed fields, uppercased and merged SKUs, and proper null/boolean conversions. The only differences are insignificant formatting choices.)

meeting-notes-3-bullets

Summarize these meeting notes into EXACTLY 3 bullet points. Each bullet must be one sentence, start with a bolded topic tag like **Timeline:**, and contain only information supported by the notes. Notes: “Monday sync, Harbor Rail redesign. Mina said the vendor images won’t be licensed until May 14, so the homepage mock can’t be finalized this week. Dev lead Ivo confirmed the mobile nav fix is ready for QA today, and desktop search speed improved from 1.8s to 0.9s after caching changes. Priya wants pricing copy reviewed by legal before launch; she will send the draft by Wednesday noon. The team moved the public beta target from May 20 to May 27. No decision yet on whether testimonials stay on the landing page.”

Kimi-K2.7-Code: **Timeline:** The team delayed the public beta target from May 20 to May 27 because vendor images will not be licensed until May 14, preventing the homepage mock from being finalized this week. **Development:** Ivo confirmed the mobile nav fix is ready for QA today, and desktop search speed improved from 1.8s to 0.9s after caching changes. **Content:** Priya will send the pricing copy draft to legal by Wednesday noon for pre-launch review, though the team has not yet decided whether testimonials will remain on the landing page.
DeepSeek-V4-Flash: **Timeline:** The public beta target was moved from May 20 to May 27. **Assets:** The homepage mock cannot be finalized this week because vendor images won't be licensed until May 14. **Development:** The mobile nav fix is ready for QA today, and desktop search speed improved from 1.8s to 0.9s after caching changes.

Model B is more faithful to the notes and avoids unsupported causation, while still meeting the exact formatting requirements. Model A incorrectly implies the beta delay was caused by the image licensing issue and slightly distorts Priya's action by saying she will send the draft to legal rather than simply send the draft by Wednesday noon. (Order-swapped judge pass: Model A is fully supported by the notes and cleanly follows the exact 3-bullet, one-sentence format. Model B is mostly strong but introduces an unsupported causal link between the beta delay and the image licensing issue, reducing correctness.)

python-dedupe-fix

The Python function below should return a list with duplicates removed while preserving the first occurrence order. It mostly works but has a subtle bug for some inputs. Find the bug and return ONLY the corrected code. ```python def unique_ids(values, seen=set()): result = [] for v in values: if v not in seen: seen.add(v) result.append(v) return result ```

Kimi-K2.7-Code: ```python def unique_ids(values, seen=None): if seen is None: seen = set() result = [] for v in values: if v not in seen: seen.add(v) result.append(v) return result ```
DeepSeek-V4-Flash: ```python def unique_ids(values, seen=None): if seen is None: seen = set() result = [] for v in values: if v not in seen: seen.add(v) result.append(v) return result ```

Both outputs provide the same correct fix for the mutable default argument bug and follow the instruction to return only corrected code.

Summarize dense passage

Summarize the passage below in exactly three bullet points, each one sentence, capturing the mechanism, the tradeoff, and the caveat — no jargon a non-specialist couldn't follow. Return only the bullets. Passage: "Speculative decoding pairs a small draft model with a large target model: the draft proposes several tokens, the target verifies them in one pass, and accepted tokens are kept while the first rejection resets to the target's own choice. This can cut latency substantially when acceptance is high, but the draft model's compute is pure overhead when acceptance is low, and gains evaporate on adversarial or highly novel inputs where the draft and target disagree often."

Kimi-K2.7-Code: - A small helper model guesses several next words, and the bigger model checks them all at once; if the guesses look good they are used, but the first wrong guess causes the system to fall back to the bigger model’s own answer. - This guessing-and-checking approach can make responses much faster when the helper model is usually right, but the helper’s work is wasted effort when its guesses are frequently rejected. - On tricky or unfamiliar inputs where the helper and the big model often disagree, the speed advantage disappears.
DeepSeek-V4-Flash: - A small, fast model guesses several words, and a large, accurate model checks them all at once, keeping the correct guesses. - This speeds things up if the small model guesses correctly most of the time, but it wastes time if it guesses wrong often. - The speed advantage disappears on tricky or unusual text where the small model’s guesses don’t match the large model’s preferences.

Model A better captures all three requested elements, especially the mechanism and caveat, including the fallback behavior after a rejected guess. Model B is clear and concise but omits the key detail that the first rejection resets to the large model's own choice. (Order-swapped judge pass: Both follow the format and explain the idea clearly, but B is slightly better because it preserves the key caveat in the mechanism that the first rejected guess triggers a fallback to the larger model's own choice. A is very good but omits that reset behavior and is a bit less precise overall.)

ticket-labeling

Classify each support ticket into exactly one category: billing, bug, feature_request, account_access. Return a JSON array; each object must have keys in this order: id, category, justification. Keep each justification to 8 words or fewer. Tickets: T1: “After yesterday’s update, exporting to CSV creates a blank file on both Chrome and Edge.” T2: “Can you add an approval step before invoices are sent to clients?” T3: “I was charged twice for order 7714 and need one payment reversed.” T4: “The password reset link says expired immediately, even when I open it right away.” T5: “Please let us hide archived projects from the left sidebar without deleting them.”

Kimi-K2.7-Code: ```json [ { "id": "T1", "category": "bug", "justification": "Export produces blank file after update." }, { "id": "T2", "category": "feature_request", "justification": "Requesting a new invoice approval step." }, { "id": "T3", "category": "billing", "justification": "Duplicate charge needs a refund reversal." }, { "id": "T4", "category": "account_access", "justification": "Password reset link expires before use." }, { "id": "T5", "category": "feature_request", "justification": "Asking to hide archived sidebar projects." } ] ```
DeepSeek-V4-Flash: [ { "id": "T1", "category": "bug", "justification": "Export creates blank file after update." }, { "id": "T2", "category": "feature_request", "justification": "Requesting approval step before invoice sending." }, { "id": "T3", "category": "billing", "justification": "Double charge for order 7714." }, { "id": "T4", "category": "bug", "justification": "Password reset link expires immediately." }, { "id": "T5", "category": "feature_request", "justification": "Hide archived projects without deleting." } ]

Model A correctly classifies all five tickets and follows the required JSON structure with concise justifications. Model B misclassifies T4 as a bug instead of account_access, though its formatting and brevity are otherwise strong. (Order-swapped judge pass: Model A correctly classifies all tickets and follows the required plain JSON format. Model B misclassifies T4 as account_access instead of bug and wraps the JSON in code fences, which is less compliant.)

Matchup powered by OpenRouter.