Bijhouden wat concurrenten doen is nuttig. Er elke week een middag aan kwijt zijn is dat minder. Met CrewAI bouw je een monitor die het zoekwerk overneemt: een researcher-agent verzamelt productnieuws, prijzen en vacatures, een analist-agent maakt er een briefing van één pagina van. Deze gids gaat over die toepassing. Installatie en het idee achter een crew staan in CrewAI voor beginners: je eerste multi-agent-crew; die stappen herhalen we hier niet.
Wat je bouwt
Twee agents, twee taken, in vaste volgorde. De researcher krijgt twee tools: een zoektool om recente berichten te vinden en een scrapetool om de pagina’s van de concurrent zelf te lezen. De analist krijgt geen tools, alleen de output van de researcher, en schrijft daar een briefing van met de drie belangrijkste signalen. Dat is het standaardpatroon uit de CrewAI-docs: de tweede taak krijgt de eerste als context mee (Bron: CrewAI Docs).
Onder de motorkap draait elke agent dezelfde tool-calling-lus die je in de agent-loop met Gemini zelf nabouwt; CrewAI regelt die lus en de overdracht voor je. Waarom twee agents en niet één prompt? Zoeken en oordelen zijn verschillende klussen. Een agent die alleen hoeft te verzamelen, met bron-URL erbij, levert controleerbaarder materiaal op dan een agent die tegelijk moet zoeken én conclusies trekken.
Stap 1 — Project aanmaken
CrewAI installeer je als CLI via uv. Nieuwe projecten zijn tegenwoordig JSON-first: agents staan in agents/*.jsonc, taken en crew-instellingen in crew.jsonc (Bron: CrewAI Docs).
uv tool install crewai
crewai create crew concurrentie_monitor
cd concurrentie_monitor
💡 Beginner-tip: zie je in andere tutorials
crew.py,config/agents.yamlenconfig/tasks.yaml? Dat is de oudere indeling. Die maak je nog aan metcrewai create crew concurrentie_monitor --classic. Deze gids gebruikt de JSON-opzet die de docs nu aanraden.
Stap 2 — De twee agents
Vervang agents/researcher.jsonc en maak er agents/analist.jsonc naast. De bestandsnaam is de naam waarmee je de agent in crew.jsonc aanroept. Tools geef je op met hun klassenaam (Bron: CrewAI Docs).
// agents/researcher.jsonc
{
"role": "Concurrentie-onderzoeker voor {concurrent}",
"goal": "Verzamel recente, controleerbare signalen over {concurrent}: productnieuws, prijswijzigingen en vacatures, steeds met bron-URL.",
"backstory": "Je bent een nauwkeurige marktonderzoeker. Je noemt alleen wat je in een bron hebt gelezen en verzint niets.",
"llm": "openai/gpt-4o",
"tools": ["SerperDevTool", "ScrapeWebsiteTool"],
"settings": { "verbose": true, "allow_delegation": false }
}
// agents/analist.jsonc
{
"role": "Marktanalist",
"goal": "Maak van de bevindingen over {concurrent} een briefing van één pagina met de drie belangrijkste signalen.",
"backstory": "Je schrijft bondige briefings voor drukke ondernemers, zonder jargon, en je vermeldt bij elk signaal de bron.",
"llm": "openai/gpt-4o",
"settings": { "verbose": true, "allow_delegation": false }
}
Het llm-veld volgt het patroon provider/model-id; vervang het door het model dat je gebruikt (Bron: CrewAI Docs).
Stap 3 — De tools
SerperDevTool doorzoekt het web via de Serper-API en verwacht je sleutel in de omgevingsvariabele SERPER_API_KEY (Bron: CrewAI Docs). ScrapeWebsiteTool haalt een pagina op en leest de tekst eruit. Zonder vaste URL mag de agent elke site lezen die hij tegenkomt (Bron: CrewAI Docs).
Zet beide sleutels in .env:
OPENAI_API_KEY=sk-...
SERPER_API_KEY=jouw_serper_sleutel
Liever een zoek-API die meteen opgeschoonde paginatekst teruggeeft? Kijk naar Exa koppelen aan je agent. Voor zwaardere scrapeklussen werkt Firecrawl.
Stap 4 — Taken en volgorde
In crew.jsonc leg je de taken vast. Bij "process": "sequential" draaien ze in de volgorde van de lijst. Via context krijgt de analist de output van de zoektaak mee, en inputs geeft standaardwaarden voor je placeholders (Bron: CrewAI Docs).
// crew.jsonc
{
"name": "Concurrentie Monitor",
"agents": ["researcher", "analist"],
"tasks": [
{
"name": "zoektaak",
"description": "Zoek nieuws, prijswijzigingen en vacatures van {concurrent} uit de afgelopen maand. Lees ook {website}.",
"expected_output": "Een lijst bevindingen, elk met datum, korte omschrijving en bron-URL.",
"agent": "researcher"
},
{
"name": "briefing",
"description": "Analyseer de bevindingen over {concurrent} en kies de drie signalen die er voor ons toe doen.",
"expected_output": "Een markdown-briefing van maximaal één pagina: drie signalen, per signaal de bron en een advies.",
"agent": "analist",
"context": ["zoektaak"],
"output_file": "output/briefing.md",
"markdown": true
}
],
"process": "sequential",
"verbose": true,
"inputs": { "concurrent": "Voorbeeld B.V.", "website": "https://www.voorbeeld.nl" }
}
Draaien gaat met twee commando’s. Haal je een standaardwaarde uit inputs weg, dan vraagt crewai run er zelf om, zodat je per run een andere concurrent kunt opgeven (Bron: CrewAI Docs).
crewai install
crewai run
⚡ Gevorderden: wil je meerdere concurrenten achter elkaar volgen, met vaste stappen eromheen (vergelijken met vorige week, alleen mailen bij verandering)? Dan is een Flow de logische volgende stap. Een Flow houdt de regie en status, de crew doet het werk binnen één stap. Liever een agent-team dat lokaal draait zonder API-kosten: zie multi-agent bouwen met Ollama.
Waar de grens ligt bij scrapen
Een concurrent volgen is legitiem, maar je agent leest wel andermans site. Drie regels houden je aan de goede kant.
Respecteer robots.txt. Het protocol zegt zelf dat het geen vorm van toegangsautorisatie is (Bron: RFC 9309), dus het is geen slot op de deur. Het is wel het duidelijkste signaal van wat een site-eigenaar niet wil. De ScrapeWebsiteTool-docs noemen geen robots.txt-controle, dus dat moet je zelf doen, bijvoorbeeld door alleen pagina’s op te nemen die je vooraf hebt gecontroleerd.
Lees de gebruiksvoorwaarden. Het Europese Hof oordeelde dat een site-eigenaar hergebruik van zijn gegevens via de voorwaarden contractueel kan beperken, ook als die gegevens geen databankbescherming hebben (Bron: HvJ EU, C-30/14).
Geen persoonsgegevens. Volgens de Autoriteit Persoonsgegevens is scraping door bedrijven vrijwel nooit toegestaan zodra er persoonsgegevens in zitten. Gericht nieuws over een organisatie verzamelen kan wel (Bron: Autoriteit Persoonsgegevens). Laat de researcher dus prijzen en persberichten lezen, en geen LinkedIn-profielen van medewerkers.
Wie geen Python wil schrijven, kan een vergelijkbare analyse met de Notion Agent laten maken. Wil je eerst scherp hebben wat een AI-agent wel en niet zelfstandig doet, lees dan de achtergrond op onze zustersite: AI-agents in 2026: wat zijn ze en wat kun je er echt mee?
Checklist
- Project aangemaakt met
crewai create crew -
researcher.jsoncenanalist.jsoncingevuld, met je eigen model inllm -
OPENAI_API_KEY(of je eigen provider) enSERPER_API_KEYin.env - Taken met
contextenoutput_fileincrew.jsonc - robots.txt en voorwaarden van de concurrent-site gecontroleerd
- Eerste briefing gelezen en elke bron-URL met de hand nagelopen
Stand van zaken — bijgewerkt 2026-10-07
De opzet hierboven blijft bruikbaar zolang CrewAI agents, taken en crews kent. De versies en cijfers hieronder veranderen vaker; die ververs je hier.
| Onderwerp | Stand |
|---|---|
Laatste versie crewai op PyPI | 1.15.24 (Bron: PyPI) |
| Ondersteunde Python-versies | 3.10 tot en met 3.13 (>=3.10, <3.14) (Bron: CrewAI Docs) |
| Standaard projectindeling | JSON-first (crew.jsonc + agents/*.jsonc); YAML via --classic |
| Licentie framework | MIT, gratis (Bron: GitHub) |
| Serper gratis instap | 2.500 gratis zoekopdrachten bij aanmelding (Bron: Serper) |
