diff --git a/contributors/CHANGELOG.md b/contributors/CHANGELOG.md index e3f5b8ab..b9b41797 100644 --- a/contributors/CHANGELOG.md +++ b/contributors/CHANGELOG.md @@ -8,6 +8,15 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). ### Added +- **weather-monitor-agent** by [@AKIB2005](https://github.com/AKIB2005) + - Beginner-friendly uAgent demonstrating chat protocol + REST API integration + - Fetches live temperature, humidity, wind speed, and condition from OpenWeatherMap free tier + - Configurable temperature alert threshold via `.env` + - Registers on Agentverse; works with ASI:One chat out of the box + - Zero cost barrier: no credit card required for OpenWeatherMap free tier + - Closes [#131](https://github.com/fetchai/innovation-lab-examples/issues/131) +- `contributors/` folder and contribution guide for community agent examples +- `contributors/community_agent/` — moved from repository root; AI community growth agent for events and hackathons - `gemini-research-agent/`: Added Gemini-powered research assistant demonstrating the standard Agent Chat Protocol (@Kavurubuvanesh) - `contributors/` folder and contribution guide for community agent examples - `contributors/community_agent/` — moved from repository root; AI community growth agent for events and hackathons diff --git a/contributors/weather-monitor-agent/.env.example b/contributors/weather-monitor-agent/.env.example new file mode 100644 index 00000000..b2424225 --- /dev/null +++ b/contributors/weather-monitor-agent/.env.example @@ -0,0 +1,254 @@ +# šŸŒ¤ļø Real-time Weather Monitoring Agent + +A minimal, beginner-friendly uAgent that demonstrates the **chat protocol** and **external REST API integration** using the free [OpenWeatherMap API](https://openweathermap.org/api). + +> ā±ļø **You can have this running in under 5 minutes** — no credit card, no paid API, no complex setup. + +--- + +## What it does + +Send any city name through the Agentverse chat interface (or ASI:One) and the agent will reply with: + +| Field | Example | +|---|---| +| šŸŒ”ļø Temperature | 28.4 °C (feels like 31.0 °C) | +| šŸ’§ Humidity | 72% | +| šŸ’Ø Wind speed | 14.4 km/h | +| ā˜ļø Condition | Partly cloudy | +| 🚨 Heat alert | Triggered when temp > threshold | + +--- + +## Folder structure + +``` +contributors/weather-monitor-agent/ +ā”œā”€ā”€ README.md ← you are here +ā”œā”€ā”€ requirements.txt ← Python dependencies +ā”œā”€ā”€ .env.example ← copy to .env and fill in your keys +ā”œā”€ā”€ agent.py ← the uAgent (< 200 lines, heavily commented) +└── assets/ + └── demo.png ← screenshot of the agent in action +``` + +--- + +## Prerequisites + +| Tool | Version | +|---|---| +| Python | 3.10 or higher | +| pip | latest | + +--- + +## Quick start + +### 1. Clone the repo and navigate to this folder + +```bash +git clone https://github.com/fetchai/innovation-lab-examples.git +cd innovation-lab-examples/contributors/weather-monitor-agent +``` + +### 2. Create a virtual environment + +```bash +python -m venv .venv + +# macOS / Linux +source .venv/bin/activate + +# Windows (Command Prompt) +.venv\Scripts\activate.bat + +# Windows (PowerShell) +.venv\Scripts\Activate.ps1 +``` + +### 3. Install dependencies + +```bash +pip install -r requirements.txt +``` + +### 4. Get your free API keys + +#### OpenWeatherMap (required) + +1. Go to and click **Sign In → Create an Account** (free, no credit card). +2. After signing in, go to **API keys** in your profile. +3. Copy the default key (or generate a new one). + +> āš ļø New keys can take up to **1 hour** to activate. If you get a 401 error right after signing up, wait a bit and try again. + +#### Agentverse (optional — for Agentverse / ASI:One access) + +1. Go to and sign in. +2. Navigate to **API Keys** and create a new key. + +### 5. Configure environment variables + +```bash +cp .env.example .env +``` + +Open `.env` and fill in your values: + +```env +OPENWEATHER_API_KEY=abc123... # required +AGENTVERSE_API_KEY=your_key_here # optional – leave blank for local-only mode +AGENT_SEED=my-unique-seed-phrase # any passphrase; keeps your agent address stable +AGENT_PORT=8010 # port for local HTTP endpoint +TEMP_ALERT_THRESHOLD=35.0 # °C – alert fires when temp exceeds this +``` + +### 6. Run the agent + +```bash +python agent.py +``` + +You'll see output like: + +``` +INFO [WeatherMonitorAgent] Weather Monitor Agent started | address: agent1q... +INFO [WeatherMonitorAgent] Temperature alert threshold : 35.0°C +``` + +--- + +## Talking to the agent + +### Option A — via Agentverse chat (recommended) + +1. Set `AGENTVERSE_API_KEY` in `.env` and restart the agent. +2. Open , go to **My Agents**, find **WeatherMonitorAgent**. +3. Click **Chat** and send a message: + +``` +weather in Tokyo +``` + +or just: + +``` +Mumbai +``` + +or with country code for disambiguation: + +``` +Paris,FR +``` + +### Option B — local agent-to-agent message + +Write a small test sender script using uAgents and send a `ChatMessage` to `agent1q` on port 8010. + +--- + +## Example responses + +**Normal response** + +``` +šŸŒ¤ļø Weather in Mumbai, IN +━━━━━━━━━━━━━━━━━━━━━━━━━━ +šŸŒ”ļø Temperature : 31.2°C (feels like 34.8°C) +šŸ’§ Humidity : 85% +šŸ’Ø Wind speed : 18.0 km/h +ā˜ļø Condition : Overcast clouds +``` + +**Heat alert triggered** + +``` +šŸŒ¤ļø Weather in Dubai, AE +━━━━━━━━━━━━━━━━━━━━━━━━━━ +šŸŒ”ļø Temperature : 42.0°C (feels like 47.1°C) +šŸ’§ Humidity : 40% +šŸ’Ø Wind speed : 9.0 km/h +ā˜ļø Condition : Clear sky + +🚨 Heat Alert! Temperature is above 35.0°C — stay hydrated and avoid direct sunlight. +``` + +--- + +## How it works (architecture) + +``` +User (ASI:One / Agentverse chat) + │ + │ ChatMessage (city name as free text) + ā–¼ +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ WeatherMonitorAgent │ +│ │ +│ 1. ACK the message │ +│ 2. Parse city from text │ +│ 3. httpx → OWM REST API │ +│ 4. Check temp threshold │ +│ 5. Send ChatMessage reply │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ + │ + │ ChatMessage (formatted weather + optional alert) + ā–¼ +User +``` + +### Key files explained + +| File | What it does | +|---|---| +| `agent.py` | Defines the uAgent, chat protocol handlers, `_fetch_weather()`, `_format_response()`, and `_extract_city()` | +| `.env` | Holds your API keys and configuration — never commit this file | +| `requirements.txt` | Four packages: `uagents`, `uagents-core`, `httpx`, `python-dotenv` | + +--- + +## Configuring the alert threshold + +By default the agent fires a heat alert when the temperature exceeds **35 °C**. +Change this by editing `TEMP_ALERT_THRESHOLD` in your `.env`: + +```env +TEMP_ALERT_THRESHOLD=30.0 # alert above 30 °C +``` + +No code change needed — the agent reads this at startup. + +--- + +## Demo + +![Demo screenshot](assets/demo.png) + +--- + +## Troubleshooting + +| Symptom | Fix | +|---|---| +| `401 Unauthorized` from OWM | API key is wrong or not yet active (new keys take up to 1 h) | +| `404 City not found` | Check spelling; try `City,CountryCode` e.g. `Springfield,US` | +| Agent address changes every restart | Make sure `AGENT_SEED` is set in `.env` | +| No response in Agentverse chat | Confirm `AGENTVERSE_API_KEY` is set and the agent is running | +| `ModuleNotFoundError` | Activate your virtual environment: `source .venv/bin/activate` | + +--- + +## Contributing + +Found a bug or want to extend this agent? +Ideas: multi-city comparison, hourly forecast, unit toggle (°C/°F), language support. + +Open an issue or PR — PRs referencing the parent issue with `Closes #131` are welcome! + +--- + +## License + +Apache 2.0 — see the root [LICENSE](../../LICENSE) file. \ No newline at end of file diff --git a/contributors/weather-monitor-agent/README.md b/contributors/weather-monitor-agent/README.md new file mode 100644 index 00000000..b2424225 --- /dev/null +++ b/contributors/weather-monitor-agent/README.md @@ -0,0 +1,254 @@ +# šŸŒ¤ļø Real-time Weather Monitoring Agent + +A minimal, beginner-friendly uAgent that demonstrates the **chat protocol** and **external REST API integration** using the free [OpenWeatherMap API](https://openweathermap.org/api). + +> ā±ļø **You can have this running in under 5 minutes** — no credit card, no paid API, no complex setup. + +--- + +## What it does + +Send any city name through the Agentverse chat interface (or ASI:One) and the agent will reply with: + +| Field | Example | +|---|---| +| šŸŒ”ļø Temperature | 28.4 °C (feels like 31.0 °C) | +| šŸ’§ Humidity | 72% | +| šŸ’Ø Wind speed | 14.4 km/h | +| ā˜ļø Condition | Partly cloudy | +| 🚨 Heat alert | Triggered when temp > threshold | + +--- + +## Folder structure + +``` +contributors/weather-monitor-agent/ +ā”œā”€ā”€ README.md ← you are here +ā”œā”€ā”€ requirements.txt ← Python dependencies +ā”œā”€ā”€ .env.example ← copy to .env and fill in your keys +ā”œā”€ā”€ agent.py ← the uAgent (< 200 lines, heavily commented) +└── assets/ + └── demo.png ← screenshot of the agent in action +``` + +--- + +## Prerequisites + +| Tool | Version | +|---|---| +| Python | 3.10 or higher | +| pip | latest | + +--- + +## Quick start + +### 1. Clone the repo and navigate to this folder + +```bash +git clone https://github.com/fetchai/innovation-lab-examples.git +cd innovation-lab-examples/contributors/weather-monitor-agent +``` + +### 2. Create a virtual environment + +```bash +python -m venv .venv + +# macOS / Linux +source .venv/bin/activate + +# Windows (Command Prompt) +.venv\Scripts\activate.bat + +# Windows (PowerShell) +.venv\Scripts\Activate.ps1 +``` + +### 3. Install dependencies + +```bash +pip install -r requirements.txt +``` + +### 4. Get your free API keys + +#### OpenWeatherMap (required) + +1. Go to and click **Sign In → Create an Account** (free, no credit card). +2. After signing in, go to **API keys** in your profile. +3. Copy the default key (or generate a new one). + +> āš ļø New keys can take up to **1 hour** to activate. If you get a 401 error right after signing up, wait a bit and try again. + +#### Agentverse (optional — for Agentverse / ASI:One access) + +1. Go to and sign in. +2. Navigate to **API Keys** and create a new key. + +### 5. Configure environment variables + +```bash +cp .env.example .env +``` + +Open `.env` and fill in your values: + +```env +OPENWEATHER_API_KEY=abc123... # required +AGENTVERSE_API_KEY=your_key_here # optional – leave blank for local-only mode +AGENT_SEED=my-unique-seed-phrase # any passphrase; keeps your agent address stable +AGENT_PORT=8010 # port for local HTTP endpoint +TEMP_ALERT_THRESHOLD=35.0 # °C – alert fires when temp exceeds this +``` + +### 6. Run the agent + +```bash +python agent.py +``` + +You'll see output like: + +``` +INFO [WeatherMonitorAgent] Weather Monitor Agent started | address: agent1q... +INFO [WeatherMonitorAgent] Temperature alert threshold : 35.0°C +``` + +--- + +## Talking to the agent + +### Option A — via Agentverse chat (recommended) + +1. Set `AGENTVERSE_API_KEY` in `.env` and restart the agent. +2. Open , go to **My Agents**, find **WeatherMonitorAgent**. +3. Click **Chat** and send a message: + +``` +weather in Tokyo +``` + +or just: + +``` +Mumbai +``` + +or with country code for disambiguation: + +``` +Paris,FR +``` + +### Option B — local agent-to-agent message + +Write a small test sender script using uAgents and send a `ChatMessage` to `agent1q` on port 8010. + +--- + +## Example responses + +**Normal response** + +``` +šŸŒ¤ļø Weather in Mumbai, IN +━━━━━━━━━━━━━━━━━━━━━━━━━━ +šŸŒ”ļø Temperature : 31.2°C (feels like 34.8°C) +šŸ’§ Humidity : 85% +šŸ’Ø Wind speed : 18.0 km/h +ā˜ļø Condition : Overcast clouds +``` + +**Heat alert triggered** + +``` +šŸŒ¤ļø Weather in Dubai, AE +━━━━━━━━━━━━━━━━━━━━━━━━━━ +šŸŒ”ļø Temperature : 42.0°C (feels like 47.1°C) +šŸ’§ Humidity : 40% +šŸ’Ø Wind speed : 9.0 km/h +ā˜ļø Condition : Clear sky + +🚨 Heat Alert! Temperature is above 35.0°C — stay hydrated and avoid direct sunlight. +``` + +--- + +## How it works (architecture) + +``` +User (ASI:One / Agentverse chat) + │ + │ ChatMessage (city name as free text) + ā–¼ +ā”Œā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā” +│ WeatherMonitorAgent │ +│ │ +│ 1. ACK the message │ +│ 2. Parse city from text │ +│ 3. httpx → OWM REST API │ +│ 4. Check temp threshold │ +│ 5. Send ChatMessage reply │ +ā””ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”€ā”˜ + │ + │ ChatMessage (formatted weather + optional alert) + ā–¼ +User +``` + +### Key files explained + +| File | What it does | +|---|---| +| `agent.py` | Defines the uAgent, chat protocol handlers, `_fetch_weather()`, `_format_response()`, and `_extract_city()` | +| `.env` | Holds your API keys and configuration — never commit this file | +| `requirements.txt` | Four packages: `uagents`, `uagents-core`, `httpx`, `python-dotenv` | + +--- + +## Configuring the alert threshold + +By default the agent fires a heat alert when the temperature exceeds **35 °C**. +Change this by editing `TEMP_ALERT_THRESHOLD` in your `.env`: + +```env +TEMP_ALERT_THRESHOLD=30.0 # alert above 30 °C +``` + +No code change needed — the agent reads this at startup. + +--- + +## Demo + +![Demo screenshot](assets/demo.png) + +--- + +## Troubleshooting + +| Symptom | Fix | +|---|---| +| `401 Unauthorized` from OWM | API key is wrong or not yet active (new keys take up to 1 h) | +| `404 City not found` | Check spelling; try `City,CountryCode` e.g. `Springfield,US` | +| Agent address changes every restart | Make sure `AGENT_SEED` is set in `.env` | +| No response in Agentverse chat | Confirm `AGENTVERSE_API_KEY` is set and the agent is running | +| `ModuleNotFoundError` | Activate your virtual environment: `source .venv/bin/activate` | + +--- + +## Contributing + +Found a bug or want to extend this agent? +Ideas: multi-city comparison, hourly forecast, unit toggle (°C/°F), language support. + +Open an issue or PR — PRs referencing the parent issue with `Closes #131` are welcome! + +--- + +## License + +Apache 2.0 — see the root [LICENSE](../../LICENSE) file. \ No newline at end of file diff --git a/contributors/weather-monitor-agent/agent.py b/contributors/weather-monitor-agent/agent.py new file mode 100644 index 00000000..f7391ca6 --- /dev/null +++ b/contributors/weather-monitor-agent/agent.py @@ -0,0 +1,252 @@ +""" +Real-time Weather Monitoring Agent +=================================== +Accepts a city name via the uAgents chat protocol, +fetches live data from OpenWeatherMap (free tier), +and returns temperature, humidity, wind speed, and +weather condition. Alerts the user if temperature +crosses a configurable threshold. + +Usage: + python agent.py +""" + +import os +import re +from datetime import datetime +from uuid import uuid4 + +import httpx +from dotenv import load_dotenv +from uagents import Agent, Context, Protocol +from uagents_core.contrib.protocols.chat import ( + ChatAcknowledgement, + ChatMessage, + EndSessionContent, + StartSessionContent, + TextContent, + chat_protocol_spec, +) + +load_dotenv() + +# ── Configuration ────────────────────────────────────────────────────────────── +OPENWEATHER_API_KEY: str = os.getenv("OPENWEATHER_API_KEY", "") +AGENTVERSE_API_KEY: str = os.getenv("AGENTVERSE_API_KEY", "") +AGENT_SEED: str = os.getenv("AGENT_SEED", "weather-monitor-agent-seed-phrase") +AGENT_PORT: int = int(os.getenv("AGENT_PORT", "8010")) + +# Alert when temperature exceeds this value (°C). Override via .env. +TEMP_ALERT_THRESHOLD: float = float(os.getenv("TEMP_ALERT_THRESHOLD", "35.0")) + +OWM_BASE_URL = "https://api.openweathermap.org/data/2.5/weather" + +# ── Agent initialisation ──────────────────────────────────────────────────────── +agent = Agent( + name="WeatherMonitorAgent", + seed=AGENT_SEED, + port=AGENT_PORT, + mailbox=f"{AGENTVERSE_API_KEY}@https://agentverse.ai" if AGENTVERSE_API_KEY else None, +) + +chat_proto = Protocol(spec=chat_protocol_spec) + + +# ── Helpers ───────────────────────────────────────────────────────────────────── + +def _make_chat(text: str, end_session: bool = False) -> ChatMessage: + """Wrap plain text into a ChatMessage envelope.""" + content = [TextContent(type="text", text=text)] + if end_session: + content.append(EndSessionContent(type="end-session")) + return ChatMessage( + timestamp=datetime.utcnow(), + msg_id=uuid4(), + content=content, + ) + + +def _extract_city(raw: str) -> str: + """ + Pull a city name out of free-form user text. + Examples handled: + "weather in Mumbai" + "What's the weather in New Delhi?" + "London" + "temperature of Paris" + """ + raw = raw.strip() + patterns = [ + r"(?:weather|temperature|temp|forecast)\s+(?:in|for|of)\s+(.+)", + r"(?:in|for|of)\s+(.+?)(?:\s*\?)?$", + ] + for pat in patterns: + m = re.search(pat, raw, re.IGNORECASE) + if m: + return m.group(1).strip().rstrip("?") + # Fall back: use the whole message as the city name (handles bare "Mumbai") + return raw.rstrip("?").strip() + + +async def _fetch_weather(city: str) -> dict | None: + """ + Call OpenWeatherMap and return a parsed dict, or None on failure. + Returned keys: city, country, condition, temp_c, feels_like_c, + humidity_pct, wind_kph, alert + """ + params = { + "q": city, + "appid": OPENWEATHER_API_KEY, + "units": "metric", + } + try: + async with httpx.AsyncClient(timeout=10) as client: + resp = await client.get(OWM_BASE_URL, params=params) + if resp.status_code == 401: + return {"error": "invalid_api_key"} + if resp.status_code == 404: + return {"error": "city_not_found"} + resp.raise_for_status() + data = resp.json() + except httpx.RequestError as exc: + return {"error": f"network_error: {exc}"} + + temp_c = data["main"]["temp"] + feels_like = data["main"]["feels_like"] + humidity = data["main"]["humidity"] + wind_kph = round(data["wind"]["speed"] * 3.6, 1) # m/s → km/h + condition = data["weather"][0]["description"].capitalize() + city_name = data["name"] + country = data["sys"]["country"] + + return { + "city": city_name, + "country": country, + "condition": condition, + "temp_c": temp_c, + "feels_like_c": feels_like, + "humidity_pct": humidity, + "wind_kph": wind_kph, + "alert": temp_c > TEMP_ALERT_THRESHOLD, + } + + +def _format_response(w: dict) -> str: + """Turn the weather dict into a human-readable reply.""" + alert_line = ( + f"\n🚨 *Heat Alert!* Temperature is above {TEMP_ALERT_THRESHOLD}°C — " + "stay hydrated and avoid direct sunlight." + if w["alert"] + else "" + ) + return ( + f"šŸŒ¤ļø *Weather in {w['city']}, {w['country']}*\n" + f"━━━━━━━━━━━━━━━━━━━━━━━━━━\n" + f"šŸŒ”ļø Temperature : {w['temp_c']:.1f}°C (feels like {w['feels_like_c']:.1f}°C)\n" + f"šŸ’§ Humidity : {w['humidity_pct']}%\n" + f"šŸ’Ø Wind speed : {w['wind_kph']} km/h\n" + f"ā˜ļø Condition : {w['condition']}" + f"{alert_line}" + ) + + +# ── Chat protocol handlers ────────────────────────────────────────────────────── + +@chat_proto.on_message(ChatMessage) +async def handle_message(ctx: Context, sender: str, msg: ChatMessage): + ctx.logger.info(f"Message from {sender}") + + # 1. Acknowledge immediately (protocol requirement) + await ctx.send( + sender, + ChatAcknowledgement( + timestamp=datetime.utcnow(), + acknowledged_msg_id=msg.msg_id, + ), + ) + + # 2. Extract user text + user_text = "" + for block in msg.content: + if isinstance(block, StartSessionContent): + # Session just opened – send a greeting and wait + await ctx.send( + sender, + _make_chat( + "šŸ‘‹ Hello! I'm the **Weather Monitor Agent**.\n\n" + "Send me a city name and I'll fetch live weather data for you.\n" + "Example: `weather in Mumbai` or just `Tokyo`" + ), + ) + return + if isinstance(block, TextContent): + user_text += block.text + " " + + user_text = user_text.strip() + if not user_text: + return + + # 3. Guard: API key must be set + if not OPENWEATHER_API_KEY: + await ctx.send( + sender, + _make_chat( + "āš ļø OPENWEATHER_API_KEY is not set in the environment.\n" + "Please add it to your `.env` file and restart the agent.\n" + "Get a free key at https://openweathermap.org/api" + ), + ) + return + + # 4. Identify city and call the API + city = _extract_city(user_text) + ctx.logger.info(f"Fetching weather for: {city!r}") + + result = await _fetch_weather(city) + + # 5. Build reply + if result is None or "error" in result: + err = (result or {}).get("error", "unknown") + if err == "invalid_api_key": + reply = ( + "āŒ Your OpenWeatherMap API key appears to be invalid.\n" + "Check the value of OPENWEATHER_API_KEY in your `.env` file." + ) + elif err == "city_not_found": + reply = ( + f"āŒ I couldn't find a city called **{city}**.\n" + "Try a different spelling or include the country code, e.g. `Paris,FR`." + ) + else: + reply = f"āŒ Something went wrong while fetching weather data: `{err}`" + else: + reply = _format_response(result) + + await ctx.send(sender, _make_chat(reply, end_session=True)) + + +@chat_proto.on_message(ChatAcknowledgement) +async def handle_ack(ctx: Context, sender: str, msg: ChatAcknowledgement): + ctx.logger.info(f"Acknowledgement received from {sender}") + + +# ── Startup ───────────────────────────────────────────────────────────────────── + +@agent.on_event("startup") +async def on_start(ctx: Context): + ctx.logger.info(f"Weather Monitor Agent started | address: {ctx.agent.address}") + ctx.logger.info(f"Temperature alert threshold : {TEMP_ALERT_THRESHOLD}°C") + if not OPENWEATHER_API_KEY: + ctx.logger.warning( + "OPENWEATHER_API_KEY is not set – weather queries will fail until it is added." + ) + if not AGENTVERSE_API_KEY: + ctx.logger.info( + "AGENTVERSE_API_KEY not set – running in local-only mode (no Agentverse registration)." + ) + + +agent.include(chat_proto, publish_manifest=True) + +if __name__ == "__main__": + agent.run() \ No newline at end of file diff --git a/contributors/weather-monitor-agent/requirements.txt b/contributors/weather-monitor-agent/requirements.txt new file mode 100644 index 00000000..f706e448 --- /dev/null +++ b/contributors/weather-monitor-agent/requirements.txt @@ -0,0 +1,4 @@ +uagents>=0.18.0 +uagents-core>=0.4.0 +httpx>=0.27.0 +python-dotenv>=1.0.0 \ No newline at end of file