Loading repository dataβ¦
Loading repository dataβ¦
sasilab / repository
π 3 AI agents roast your city's weather & pollution in sarcastic Tamil meme style! Built with CrewAI, Open-Meteo APIs (free), and Groq/Gemini/OpenAI/Ollama. Part of the AgentVerse series by @explainpannu.
A transparent discovery signal based on current public GitHub metadata.
This score does not audit code, security, maintainers, documentation quality, or suitability. Verify the repository and its current documentation before adoption.
A 3-agent CrewAI crew that pulls live weather and air-quality data for any city and turns it into a sarcastic Tanglish meme.
Part of AgentVerse by @explainpannu β an educational series teaching AI agent frameworks through small social-impact projects. One episode = one framework + one real-world problem.
Previous episode: BreezyBuddy β a simple ReAct weather agent.
You: "Chennai"
β
βΌ
ββββββββββββββββββββββββ
β Weather Reporter β β geocodes the city, fetches current weather
ββββββββββββ¬ββββββββββββ
β (lat/lon + summary)
βΌ
ββββββββββββββββββββββββ
β Pollution Analyst β β fetches AQI, PM2.5, PM10, NO2, O3
ββββββββββββ¬ββββββββββββ
β (air-quality briefing)
βΌ
ββββββββββββββββββββββββ
β Tamil Meme Writer β β writes a 4-6 line Tanglish meme
ββββββββββββββββββββββββ
All data comes from Open-Meteo (free, no API key). The only key you need is for the LLM.
.enveuropean_aqi >= 100, a hardcoded health alert is returned and the meme
writer never gets to joke about hazardous air.GROQ_API_KEY,
GEMINI_API_KEY, OPENAI_API_KEY into .env, or paste a key into the
frontend Settings panel and it's used immediately (no restart). Ollama works
with no key. Preference order: Groq β Gemini β OpenAI β Ollama./api/run to
refresh the AQI pill so the badge stays current without user interaction.# 1. Clone & enter
git clone <this-repo>
cd social_impact_crew
# 2. Virtual env
python -m venv .venv
# Windows PowerShell:
.\.venv\Scripts\Activate.ps1
# macOS / Linux:
source .venv/bin/activate
# 3. Install
pip install -e .
# 4. Add your LLM key
cp .env.example .env
# then edit .env and paste your GROQ_API_KEY (get one free at https://console.groq.com/keys)
# 5. Run
python -m social_impact_crew.main # asks for a city
python -m social_impact_crew.main Bengaluru # or pass it on the CLI
You'll get verbose CrewAI logs as each agent works, and the final meme printed at the bottom.
You don't need to pick a provider explicitly β just put your key in .env and
the app auto-detects it. All four supported providers:
| Provider | Free? | Env var to set | Default model |
|---|---|---|---|
| Groq | yes | GROQ_API_KEY | groq/llama-3.3-70b-versatile |
| Gemini | yes | GEMINI_API_KEY | gemini/gemini-2.5-flash |
| OpenAI | no | OPENAI_API_KEY | gpt-4o-mini |
| Ollama | yes (local) | (none β just run ollama serve) | ollama/llama3.2 |
If you want to pin a specific model, set MODEL=<provider>/<model> in .env.
That always wins over auto-detection. Format follows LiteLLM's provider/model convention.
social_impact_crew/
βββ pyproject.toml
βββ .env.example
βββ architecture.md # Mermaid diagram + locked API contract
βββ src/social_impact_crew/
βββ main.py # CLI entry point + IP geolocation + OpenLIT
βββ api.py # FastAPI wrapper β POST /api/run + /api/chat
βββ crew.py # @CrewBase wiring
βββ llm.py # provider auto-detection (BYOK) + runtime overrides
βββ intent.py # two-layer intent classifier (regex + LLM fallback)
βββ personality.py # 6 personalities Γ 4 languages voice blocks
βββ preferences.py # JSON-file user prefs (async lock + atomic write)
βββ safety.py # AQI safety override + prompt-injection sanitiser
βββ config/
β βββ agents.yaml # role / goal / backstory per agent
β βββ tasks.yaml # description / expected_output / context
βββ tools/
βββ custom_tool.py # GeocodeTool, WeatherTool, PollutionTool
# + ContextVar side-channel for API capture
run_api # serves on http://127.0.0.1:8000
# POST http://127.0.0.1:8000/api/run {"city": "Chennai"}
# POST http://127.0.0.1:8000/api/chat {"message": "hi"}
# /api/run returns {city, coords, weather, pollution, aqi_level, meme}
The AgentVerse PWA frontend lives in its own repo:
It's a single static PWA reused across every AgentVerse episode. To connect it to this backend:
run_api (serves on http://127.0.0.1:8000).http://127.0.0.1:8000. Paste your LLM key, pick a personality and
language, and you're done.The POST /api/run contract is stable across every AgentVerse episode, so the
same frontend works against any episode backend.
openlit.init() is called at the top of main.py and api.py. By default
it ships traces/metrics to http://127.0.0.1:4318 (OTLP). To see them, run any
OTLP collector (Jaeger, Grafana Tempo, OpenLIT UI). No collector running = silent
no-op, nothing breaks.
MIT. Built for learning β fork it, remix it, make your own episode.