nored/weather-intel

GitHub: nored/weather-intel

一个聚合全球开放天气与地球物理数据并提供交互式地图、结构化 API 和自然语言问答能力的开源态势感知平台。

Stars: 0 | Forks: 0

# weather-intel **一目了然地查看整个地球的天气——并用自然语言提出任何天气问题。** weather-intel 是构建在**免费、开放的公共天气和地球物理数据**之上的全球级态势感知层。它将全球降雨雷达、卫星图像、所有活跃的热带气旋、恶劣天气警报、地震、灾害、野火和太空天气整合到**一个交互式世界地图**和**一个结构化数据 API** 中——并且可以使用可插拔的 LLM 来**回答任何受天气影响的问题**(针对特定地点或全球范围)。 它的构建旨在同时实现三大功能: - 一个你可以直接观看的**地图**(动画降雨雷达、卫星、实时事件); - 一个 AI agent 或脚本可以调用的**数据源**(干净的 JSON,核心功能无需 key); - 一个**问答引擎** —— 问 *“伦敦什么时候下雨?”*、*“东京这个周末的天气预报?”*,或者 *“波尔多附近的葡萄园这周会遭遇霜冻吗?”*,就能得到一个具体的、基于预报的答案。 ``` git clone weather-intel && cd weather-intel npm install npm start # → http://localhost:8090 # 问任何问题 — 从天气角度回答 (geocode → forecast → answer): node server/cli.js ask "when will it rain in London?" node server/cli.js ask "what's the forecast for Tokyo this weekend?" node server/cli.js ask "will the vineyards near Bordeaux get frost this week?" # 原始全球数据 (无需 key): node server/cli.js world --json --quiet # whole Earth snapshot node server/cli.js world --bbox -31,34,45,72 # clip to a bbox (Europe) node server/cli.js quakes --time hour # one domain node server/cli.js sources # list sources + status ``` `ask` 命令(以及 Web UI 中的 **Ask** 面板)需要一个 LLM。默认情况下,它使用你本地的 **Claude Code CLI**(`claude -p`,无需 API key);你也可以配置一个 Anthropic 或 OpenAI 兼容的 key。其他所有功能——地图、原始数据、快照——完全**不需要任何 key** 即可工作。 ## 四种接口,一个核心 | 接口 | 用途 | | --- | --- | | **Web 地图** (`/`) | MapLibre 世界视图:动画雷达、卫星、事件叠加层、实时信息流、点击任意位置查看天气、Ask 面板 | | **CLI** (`server/cli.js`) | `ask` 回答问题;`world --json` 用于 pipeline;`--watch` NDJSON 数据流 | | **HTTP API** | `GET /api/answer?q=`、`/api/world`、`/api/point`、`/api/features/:domain`、`/api/tiles/*`,SSE `POST /api/world` | | **Agent 技能** | 内置技能,使 AI agent 能够回答受天气影响的问题或提取实时数据 | ## `ask` pipeline 任何其答案直接或间接取决于天气的问题,都会按以下方式处理: 1. **定位** —— LLM 提取出问题所指的地点(州/地区将解析为代表性城市,例如 California → Los Angeles)。 2. **地理编码** —— Open-Meteo 地理编码 → lat/lon/timezone。 3. **预报** —— 该地点的当前状况 + 72 小时逐小时预报 + 7 天每日预报。 4. **回答** —— LLM 从天气角度进行回答:具体的当地时间、温度、降雨量、概率。如果没有隐含地点,则回退到全球快照。 `GET /api/answer?q=...` 和 `weather-intel ask "..."` 都会返回此结果;使用 `--json` 你会得到 `{ answer, locations:[{name,country,lat,lon,timezone}], scope, provider_used }`。 ## 地图的工作原理 一个包含可插拔适配器的**源注册表**(`server/lib/sources/`)——每个适配器都声明了其域、覆盖范围、功能、速率限制和缓存 TTL。请求会并发地扇出到相关适配器上,**隔离故障**(一个失效的信息源永远不会导致全球数据空白),在每个数据上盖上来源戳(`source`/`fetchedAt`/`validTime`),并将所有内容合并为一个全球快照。后台轮询器保持该快照随时可用;一个双层(内存 + 磁盘)缓存以及针对每个源的速率限制和 stale-while-revalidate 策略位于每次上游调用的前方。瓦片图层是针对每个源的开关(可叠加多个雷达、卫星、空气质量);事件图层按域合并。添加一个源只需在 `server/lib/sources/` 中添加一个文件以及一个副作用导入——然后它会自动出现在 CLI、API、地图和技能中。 ## 数据源 所有核心源都是**无需 key** 的。需要 key 的源会被控制(显示为“需要 key”),直到在 ⚙ 面板中设置了 key 为止;任何 token 都在服务器端注入,永远不会到达浏览器。 | 源 | 域 | 覆盖范围 | 认证 | | --- | --- | --- | --- | | RainViewer | 降雨雷达(动画) | 全球 | 无 | | NASA GIBS | 卫星(真彩色) | 全球 | 无 | | IEM NEXRAD | 雷达 | 美国 | 无 | | DWD | 雷达 + 闪电 (WMS) | 德国 | 无 | | Open-Meteo | 预报 / 定点天气 | 全球 | 无 | | USGS | 地震 | 全球 | 无 | | NOAA NHC | 热带气旋 | 全球(大西洋/东太平洋) | 无 | | US NWS | 恶劣天气警报 | 美国 | 无 | | Meteoalarm | 恶劣天气警报 | 欧洲 | 无 | | GDACS | 灾害(洪水/地震/气旋/火山等) | 全球 | 无 | | NOAA SWPC | 太空天气 | 全球 | 无 | | NASA FIRMS | 野火热点 | 全球 | 免费 key | | WAQI | 空气质量(瓦片) | 全球 | 免费 token | | OpenWeatherMap | 温度 / 风力 / 云量(瓦片) | 全球 | 免费 key | 部分来源需要**署名**(例如 Open-Meteo、DWD、RainViewer、NASA GIBS、WAQI)——请参阅 `GET /api/sources` 中的 `attribution` 字段以及各个适配器文件。请尊重每个提供商的服务条款;某些需要 key 的来源限制商业使用。本项目不捆绑任何数据——它只链接到实时信息源。 ## 配置 由环境变量驱动(`server/config.js`):`PORT` (8090)、`LLM_PROVIDER` (`claude-cli`)、`SOURCES` 白名单、`CACHE_TTL`、`TILES_CACHE_TTL`、`FANOUT_CONCURRENCY`、`SOURCE_TIMEOUT`、`POLL_INTERVAL`、`WI_USER_AGENT`。API key(用于需要 key 的来源 / LLM 提供商)位于 `data/credentials.json` (mode 0600) 中,可通过 ⚙ 面板或环境变量进行设置。 ## 要求 - Node 22+ - 对于 `ask` / Ask 面板:需要一个 LLM 提供商——默认使用 [Claude Code CLI](https://claude.com/claude-code) (`claude -p`,无需 API key),或者一个 Anthropic / OpenAI 兼容的 key。 ## 许可证 MIT —— 请参阅 [LICENSE](LICENSE)。按“原样”提供;不适用于生死攸关的决策。遇到恶劣天气时,请务必与官方来源交叉核实。
标签:GNU通用公共许可证, LLM集成, MITM代理, Node.js, 可视化地图, 气象监测, 结构化API, 自定义脚本, 自然灾害预警, 自然语言查询