Skip to content

feat: Add OpenWeatherMap weather tool + skill#66

Closed
cemsid wants to merge 2 commits into
NousResearch:mainfrom
cemsid:main
Closed

feat: Add OpenWeatherMap weather tool + skill#66
cemsid wants to merge 2 commits into
NousResearch:mainfrom
cemsid:main

Conversation

@cemsid

@cemsid cemsid commented Feb 26, 2026

Copy link
Copy Markdown

What this PR adds

Full OpenWeatherMap integration for Hermes Agent — 3 tools covering current conditions, multi-day forecasts, and weather alerts with air quality.

Tools added:

  • weather_current — Current weather conditions
  • weather_forecast — Multi-day forecast up to 5 days
  • weather_alerts — Active weather alerts + Air Quality Index (AQI)

Setup:
Add OPENWEATHERMAP_API_KEY=your_key to ~/.hermes/.env
Free API key: https://openweathermap.org/api

Files added:

  • tools/weather.py
  • skills/weather/SKILL.md
  • tests/test_weather.py

DEV ROLE submission — OpenWeatherMap integration, all tests passing ✅

Discord: cemsid.esedov

@cemsid cemsid changed the title docs: Add MCP (Model Context Protocol) demo documentation feat: Add OpenWeatherMap weather tool + skill Feb 26, 2026
@teknium1

Copy link
Copy Markdown
Contributor

see contributing: https://github.com/NousResearch/hermes-agent/blob/main/CONTRIBUTING.md

looks like it should be on a skillshub - feel free to share it with the Nous Discord though when its on one!

@teknium1 teknium1 closed this Feb 28, 2026
sudo-yf pushed a commit to sudo-yf/hermes-agent that referenced this pull request Apr 5, 2026
…usResearch#67)

The webui stores display-only fields on messages (attachments, timestamp,
_ts) for UI rendering. These leaked into the conversation_history passed
to AIAgent.run_conversation(). Most providers ignore unknown fields, but
Z.AI/GLM tries to deserialize 'attachments' as its native ChatAttachments
type, causing HTTP 400 on every subsequent message after an image upload.

Fix: _sanitize_messages_for_api() creates a clean copy with only
API-standard keys (role, content, tool_calls, tool_call_id, name,
refusal) before passing to run_conversation(). Applied to both the
streaming path (streaming.py) and non-streaming path (routes.py).

Closes NousResearch#66

Co-authored-by: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants