Exercise 8 of 10 · 0 passed
The Service Layer
Services orchestrate. They sit between your interfaces (CLI, API, bot) and your infrastructure (LLM providers, databases).
A service:
- Accepts interfaces (Protocol types), not concrete implementations — this is dependency injection
- Handles the "what" — call LLM → parse → save → return
- Is ignorant of how storage works or which model is called
Why care? The same ClassificationService powers the cohort's CLI, Telegram bot, and REST API without any changes. Swap MockProvider for ClaudeProvider at the call site — nothing else changes.
Task
Complete classify_and_save(description, amount):
- Build a message asking the LLM to classify the description, requesting JSON
{"category": "..."} - Call
self.provider.complete(messages) - Parse the JSON to extract the category
- Create and save an
Expenseviaself.repo.add() - Return the saved expense
Click "Run tests". First time loads Python in your browser (~5s). After that, runs are instant on this page and ~1s on the others.
Loading tests…
Pass the tests to reveal the reference solution.
The point of the exercise is the struggle, not the answer. Once your tests are green, the reference solution unlocks here so you can compare patterns.
Loading solution…
That's the warm-up.
You ran ten exercises against a mocked SDK. The cohort builds the real thing: an AI agent shipped to production with 150+ passing tests, Telegram bot, FastAPI, Streamlit, Docker. Six weeks. Every PR reviewed.