Blog

How Jev took my AI bill from $2 a day to $0.01

Oct 22, 2026aillmfrontlines

I run frontlines.et, a free map that tracks Ethiopia's armed conflicts. It's a side project, and it doesn't make money.

The whole thing runs on its own. Every 15 minutes it collects posts from news sites, Telegram channels and officials' accounts. An LLM reads each post and pulls out the events (who, where, what happened). The pipeline then grades each event by its source and publishes it to the map:

  • Reports from credible independent sources go up as verified.
  • A side's own statements go up as claims, which never move the control map.
  • Unconfirmed reports go to a separate Unverified layer. A later job keeps searching for independent confirmation, and only accepts a source that has an exact quote about the same incident.

No one has to press publish.

The bill

The weak spot was the LLM step. It was costing me about $2 a day. That's $60 a month for a project with no income, and it would keep running for as long as the conflict does.

So I looked at what I was paying the model to read. Most of it wasn't war news. It was adverts, business news, ceremonies, general politics, and the same story forwarded by one channel after another. I was paying an LLM to read posts I'd have thrown away at a glance.

Free filters first

Before a post reaches the model, it now has to get through three checks that cost nothing:

  1. Same text as a post I've already read? Skip it.
  2. Links to a news article another post already brought in? Skip it.
  3. No war keywords? Skip it. The list covers English, Amharic, Tigrinya and Afaan Oromo, and I tested it on 249 posts I'd read by hand. It didn't drop a single news post.

Keywords are blunt, though. Plenty of posts mention the right words without being news a tracker should record.

One question to a small model

Whatever passes the keywords goes to Jev, TypeSafe's System One model. I don't ask it to write anything. I ask it one yes/no question, and it returns a probability:

POST https://api.typesafe.ai/v1/systemone
{
  "state": "<the post>",
  "model": "jev-latest",
  "questions": {
    "about_war": {
      "type": "noul",
      "instructions": "Is this post news about Ethiopia's armed conflicts ...?",
      "criteria": {
        "true":  "News a conflict tracker should record",
        "false": "Adverts, sport, business, ceremonies, general politics ..."
      }
    }
  }
}

It answers in about 0.4 seconds. If the score is under 0.2, the post never reaches the expensive model.

I tested it on 246 posts I'd already read myself:

  • 55% fewer posts went to the extraction model.
  • 48 of 50 real news posts were kept.

Losing 2 in 50 is a trade I'm happy with. A real event gets reported by many channels, so if Jev drops one post, another post carries the same news in.

It also fails open. If Jev is down or returns an error, the post goes through and gets read in full. The filter can make the pipeline cheaper. It can't make it blind.

The result

Once less than half the posts were left to read, my daily AI spend dropped from about $2 to about $0.01.

That's the difference between a side project I have to justify every month and one I can just leave running.

The takeaway

Don't pay a big model to decide whether something deserves a big model. Throw out duplicates and obvious junk with hashes, links and keywords. Ask a small model one yes/no question. Then spend real tokens only on what's left.

The map is live at frontlines.et.