Price Finder
Back to blog

Nine days of Poolside's free model in production

The most important decision in our product is which of twenty search results is actually the thing you asked for. We handed that decision to a free model from Poolside. In nine days it answered 151 of 151 calls, delivered 90 of 90 usable verdicts, and became the first model tried on three of our five pipelines. It also prints our internal field names in front of customers in a quarter of its answers.

Gheymatshenas is a price-comparison app for Iranian shoppers. You ask for something in Persian, a crawl agent running on your own machine queries Iranian marketplaces, and twenty-odd candidate listings come back. Most of them are wrong. Search for a phone and you get phone cases. Search for a fridge and you get someone advertising that they buy fridges rather than sell them. The listings are written by thousands of individual sellers, so a product's name is whatever that seller happened to type.

Something has to look at that pool and decide which rows are actually the thing you asked for, then label each survivor as an exact match, a variant, or merely related. It is the least glamorous call in the system and it is where the product lives or dies. Get it wrong one way and a 250,000-toman screen protector is presented as the cheapest offer on a 105-million-toman phone. Get it wrong the other way and a real product vanishes from the results with no trace.

Nine days ago we moved that call onto a free model from Poolside. This is every number from the log, including the two things it gets wrong.

151 / 151
production calls answered
90 / 90
verdicts parsed first time
2.5s
median — the fastest we measured
27%
of answers leaked our field names

How we measured

Every figure here comes from one of two places, and neither involves writing a new prompt for the occasion. Offline, we keep a corpus of 40 candidate pools that our production chain filtered down to nothing — the hardest cases we have, where the model looked at twenty real listings and kept zero. A harness replays each pool through a candidate using the prompt we actually ship, imported from our build output rather than copied, because scoring a model against a prompt you do not ship measures a prompt you do not ship.

In production, every upstream attempt writes a row: provider, model, latency, tokens, reasoning tokens, finish reason, and which pipeline stage asked for it. Answers are then re-scored by the same validator that runs live, so “how good is this model” and “what would we have refused” are the same question rather than two.

One note on how to read the recovery figures below: they are counts, not rates. A rate whose denominator shrinks when the provider fails rewards failing to answer. Two of the models here lost 4 of their 40 calls to their own transport and then scored 97% of the 36 they answered. Laguna answered all 40.

The comparison

Pools recovered, out of 40 our chain had discardedhigher is better
  1. GPT-5.6-lunapaid — $0.20 / $1.20 per M39
  2. Qwen3.8-27B (free)median call 48s, slowest 196s39
  3. DeepSeek-v4-flash (free)median 19s38
  4. Laguna-s-2.1 — directfree · median 2.5s · answered all 4036
  5. Laguna-s-2.1 via OpenRoutersame model, 4 of 40 calls lost35
  6. Nemotron-3-super (free)excellent filter, poor writer35
  7. Qwen3.7-plusfast but stricter29
  8. Laguna-xs-2.1998 reasoning tokens per call29
  9. Gemini 3.1 Flash Litethe model it replaced10
Nine models, one corpus, the same shipped prompt at temperature 0 with a 5000-token budget, all in one session.
ModelAnsweredKept the whole poolMedian95th pct
Laguna-s-2.1 (direct)40 / 403%2.5s7.3s
GPT-5.6-luna40 / 403%3.4s5.9s
Qwen3.8-27B (free)40 / 403%48.0s196.3s
DeepSeek-v4-flash (free)40 / 403%19.1s30.0s
Laguna-s-2.1 via OpenRouter36 / 406%4.4s13.1s
Nemotron-3-super (free)36 / 403%15.7s46.0s
Qwen3.7-plus40 / 400%2.1s
Laguna-xs-2.140 / 4011.1s30.6s
The same run, with the measures the chart cannot carry. “Kept the whole pool” means the filter did not filter — the other way this job fails.

Laguna does not top the recovery chart. It won on the combination: near-best recovery, the lowest latency of anything we tried, and the only model that answered every single call on every run. For a filter sitting inside a search a person is waiting on, that is the trade we want.

What held up

Availability first, because it is not a small claim. 151 production calls on the direct endpoint, 151 served — no 5xx, no timeout, no dropped socket, no empty reply, across all four stages we route through it. We care about this more than most, because the free-model tier churns violently: the endpoint that previously led this chain was measured at 0% available, with 29 of 30 calls rate-limited upstream. The rule we now use to predict it is that a free endpoint served by the model's own vendor holds up, and one served from a shared reseller pool does not.

Second, it does not think when it should not. Our filter is a classification with a strict output contract, and any tokens a model spends reasoning are charged against the same budget as its answer. We have been badly burned by this before — one model lost 95% of its replies to a budget that was too small, returning empty text with a success status for months before anyone noticed. Across 184 Laguna calls, exactly two used any reasoning at all. On the direct endpoint it was one call in 151, which spent 120 tokens and finished cleanly. Its own sibling model averages 998 reasoning tokens per call on the same corpus.

Third, it writes clean Persian. Our writer stage turns the filtered rows into the prose you read, and we score it with a validator that checks three things a model can get catastrophically wrong: quoting prices in the wrong unit (toman and rial differ by a factor of ten), leaking foreign scripts into Persian, and stating figures with no rows behind them. Laguna passed 26 of 26. The paid model it displaced passed 54 of 56, its two failures being one currency mislabel and one Hebrew word dropped into a Persian answer.

Reading the answers by hand, the judgement is good in ways the validator cannot see. Asked for a 110-amp battery, it opened with «در فروشگاه‌های پیگیری‌شده هیچ باتری دقیقاً ۱۱۰ آمپری موجود نیست» — no battery of exactly 110 amps is available in the shops we tracked — and explained that every result was in fact 100 Ah, before quoting a single price.

StageCallsMedianp90Slowest
Deciding what the question needs152.5s4.8s6.6s
Filtering the search results974.5s9.2s13.5s
Writing background summaries187.9s12.1s12.3s
Writing the answer you read2111.0s18.7s24.8s
Every call to Poolside's own endpoint between 21 and 30 August 2026. No errors, no timeouts, no empty replies at any stage.

Where it fell short

Both of these are instruction-following problems in a non-English language, and both were invisible to every automated check we run. We found them by reading the output, which is the only reason we can report them at all.

The first: it prints our internal machinery to customers. Each row we hand the writer carries a machine tag — match=exact, priceFreshness=old. Those are inputs, not words a shopper should ever see. Laguna echoes them into finished Persian sentences in 7 of 26 answers. The model it replaced does this in 0 of 56.

What a customer actually readWhat leaked
ارزان‌ترین: ۱۶۹٬۵۰۰٬۰۰۰ تومان – فن‌آوران امید [variant][variant]
دقیقاً همان محصول (match=exact):match=exact
قیمت‌ها به‌روز نیستند (priceFreshness: old)priceFreshness: old
Two of these three were served answers, not experiments. Our prompt never asks for the tags to be printed — it describes what they mean and asks the model to respect them. Laguna respects them, and then also quotes them.

The second is subtler and more interesting. We ask for each kept row to be labelled exact, variant, or related. Laguna sits on the middle rung almost regardless of the evidence.

ModelVerdicts“exact”“variant”“related”
Laguna-s-2.19010%69%20%
GPT-5.6-luna13055%25%20%
Gemini 3.1 Flash Lite6960%30%10%
Qwen3.6-35B-A3B1135%65%0%
Tag distribution across raw production verdicts, before our own cap is applied.

The clearest single case: a user searched «کیس کامپیوتر» — computer case. All 24 results were literal computer cases. GPT-5.6-luna, Gemini and DeepSeek all called them exact matches. Laguna called 22 of the 24 merely related.

That is not cosmetic, because the label is an instruction to the next stage: when a row is only related, our writer is told to say plainly that it is not quite what the user described. So an under-confident label becomes an answer that apologises for products that were exactly right — on one air-conditioner search it advised the user to «حتماً قبل از خرید با فروشنده تأیید کنید», to confirm with the seller before buying, about rows that were the correct model.

There is a third, milder thing worth writing down: occasional Persian misspellings, «متفاوط» for «متفاوت», and colloquial forms mixed into otherwise formal prose. Nobody has complained. It is the kind of thing a native reader notices and a benchmark does not.

And one thing we suspected and cleared it of. We flag implausible prices as outliers — a bag of cement listed at 4,805 toman when its peers are 230,000. Laguna named such a row as the cheapest in one of its two opportunities, which looked like a defect until we checked the others: the model it replaced does it three times out of three. That is a gap in our prompt, not in this model, and we are fixing it on our side.

Going direct beat going through a reseller

We reached the same model two ways in parallel — Poolside's API directly, and the free variant offered through OpenRouter. Same weights, same prompt, same corpus, same session. The direct endpoint won on every axis: 40 of 40 answered against 36, a 2.5-second median against 4.4, and a 95th percentile of 7.3 seconds against 13.1.

In production the gap was sharper. One call routed through the reseller spent 106.7 seconds and its entire output budget on reasoning, then returned truncated with a success status — exactly the silent failure we build guards against. The direct endpoint produced nothing like it in nine days. An earlier draft of this post credited the model with zero reasoning tokens; checking before publishing turned up those two calls, and the interesting part was that the bad one was not on Poolside's infrastructure. If you are evaluating a model that offers both paths, measure both: they are not the same product.

Why not the others

ModelWhy it is not our first choice
GPT-5.6-lunaGenuinely excellent and still in our chain as the paid floor. It is $0.20 and $1.20 per million tokens against Laguna's $0.09 and $0.18 — on our measured per-search shape, $0.00230 against $0.00078.
Qwen3.7-plusFast at a 2.1s median and clean, but recovers 29 of 40 — 31 on its pinned snapshot — against Laguna's 36. Meaningfully stricter on exactly the hard pools this corpus is made of. It also runs on per-model grants with fixed expiry dates, so its capacity is a countdown rather than a floor.
Qwen3.8-27B (self-hosted)The sharpest case for measuring each stage separately. With reasoning on, its verdicts are excellent and it takes 50 to 90 seconds — past our ceiling. With reasoning off it answers with an empty keep list in a median of six output tokens: fast, clean and wrong, which is the worst possible shape because nothing downstream can tell it apart from a genuine no-match.
Nemotron-3-super (free)99% recovery on filtering, genuinely top of the class — and 76% as a writer, on 16 violations where Cyrillic and CJK characters landed in Persian answers. It is why we score each stage separately instead of keeping one ranking.
Laguna-xs-2.129 of 40 at an 11.1s median, with a median of 998 reasoning tokens against its sibling's zero. On a 50-token probe it spent the entire budget reasoning and returned nothing at all. Its published sampling parameters list only temperature, so there is no thinking toggle to fix it with.
GLM-5.2 (free)The highest published intelligence rating of any free model we tested, flawless verdicts on the three pools it managed, and unusable: it throttles after roughly two consecutive calls.
Gemini 3.1 Flash LiteThe model Laguna displaced. Recovers 24 to 25% of the blanked corpus regardless of prompt or temperature.

Where it sits now

Laguna-s-2.1 is the first model tried on three of our five lists — filtering search results, deciding what a question needs, and writing the answer — and second on the other two. No other model in our system leads more than one, and those three are the lists a user waits on.

We have also added Poolside's paid model as the floor beneath the free tier, ahead of the model that previously held that slot. When our free capacity runs out, the fallback is now the same weights at roughly a third of the cost.

The honest constraint is that our first choice is a free preview with no published limit. We have probed its ceiling exactly once rather than repeatedly, because hammering a free endpoint to find its edge is a bad way to treat one. That means we are routing our most important call at a service whose terms could change without notice, and the way we have designed around it is to keep a paid path warm rather than to pretend the risk is not there.

If capacity were not the constraint, three things would change on our side:

  • Batch runs. A user uploads a spreadsheet of 150 products and each one needs its own filtering call — roughly 190 calls in a burst, and the single workload our current arrangement cannot absorb.
  • A second opinion on hard pools. Running two verdicts and comparing them would let us catch the labelling problem above automatically, instead of by reading output for an afternoon.
  • More reports like this one. Every number here exists because we could afford to replay a corpus. Persian-language failure modes are not, in our experience, well covered by public benchmarks.

Would we recommend it?

Yes, with a paid path kept warm behind it. Filter the internal vocabulary out of the prose yourself, do not treat the “related” label as calibrated, and measure your end-to-end response time rather than your per-call latency — every per-call number looked fine on an afternoon we accidentally doubled our own. Under those conditions it has been quietly, unremarkably excellent for nine days, and it is now the first model we reach for when you ask us what something costs.