基于 LangGraph 构建的智能天气 Agent,具备 Generative UI 功能,支持自然语言交互和动态 React 组件生成。
- ✅ 智能自然语言处理 - 优化的两层城市提取算法,支持复杂自然语言表达
- ✅ 动态 UI 生成 - 后端动态生成带动画效果的 React 天气卡片组件
- ✅ 多种表达支持 - 支持直接查询、询问模式、查询模式、时间模式等
- ✅ 无 LLM 依赖 - 使用静态数据和正则表达式,响应速度快
- ✅ 响应式设计 - 现代化UI设计,支持移动端适配
- ✅ 完整测试覆盖 - 34个单元测试,100%通过率
# 使用 uv(推荐) uv sync --group dev # 或使用 pip pip install -e . "langgraph-cli[inmem]" # Python 版本要求 uv python pin 3.11# 查看功能演示 uv run python examples/weather_demo.py # 启动开发服务器 uv run langgraph devfrom langchain_core.messages import HumanMessage from agent.graph import graph, AgentState # 创建用户查询 state = AgentState( messages=[HumanMessage(content="北京天气怎么样?")], ui=[] ) # 调用 agent result = await graph.ainvoke(state, {"configurable": {}}) # 获取结果 ai_message = result["messages"][-1].content # AI 回复 "☀️ 今天北京天气晴朗..." ui_data = result["ui"][-1]["props"] # UI 组件数据 {"city": "北京", ...}. ├── src/agent/ # 核心 Agent 代码 │ ├── graph.py # 主要 graph 定义和天气节点 │ ├── ui.tsx # React UI 组件(带动画效果) │ └── __init__.py # 模块初始化 ├── tests/ # 测试套件 │ ├── unit_tests/ # 34个单元测试 (100% 通过) │ │ ├── test_message_parsing.py # 自然语言解析测试 │ │ ├── test_weather_node.py # 天气节点功能测试 │ │ ├── test_ui_data.py # UI组件数据测试 │ │ └── test_configuration.py # 配置结构测试 │ └── integration_tests/ # 集成测试 ├── examples/ # 示例和演示 │ └── weather_demo.py # 完整功能演示脚本 ├── docs/ # 项目文档 │ ├── development/ # 开发文档 │ │ ├── ARCHITECTURE.md # 技术架构文档 │ │ └── README.md # 开发文档导航 │ ├── features/ # 功能文档 │ │ ├── generative-ui-guide.md │ │ └── message-parsing.md │ └── testing/ # 测试文档 │ └── test-structure.md ├── CLAUDE.md # 项目指导文件 ├── langgraph.json # LangGraph 配置 ├── pyproject.toml # Python 项目配置 ├── Makefile # 智能工具选择 └── .python-version # Python 版本锁定 (3.11) 第一层:直接匹配(性能最优)
- "北京天气" → 直接识别 "北京"
- "上海的温度" → 直接识别 "上海"
- "深圳" → 直接识别 "深圳"
第二层:正则表达式模式匹配(支持复杂自然语言)
- "查询北京的天气"
- "查看上海天气"
- "了解深圳的温度"
- "知道广州天气"
- "北京的天气怎么样?"
- "上海天气如何?"
- "深圳的温度怎样?"
- "广州天气怎么样?"
- "今天北京天气"
- "明天上海的温度"
- "现在深圳天气"
- "我想知道北京今天的天气情况"
- "请告诉我上海的天气预报"
- "能帮我查一下深圳的天气吗"
- 消息解析: 10个测试 - 自然语言模式识别
- 天气节点: 8个测试 - 异步功能和错误处理
- UI数据: 12个测试 - 组件数据结构验证
- 配置: 4个测试 - 图结构和设置
# 使用 make 命令(推荐,自动优先使用 uv) make test # 运行所有单元测试 make integration_tests # 运行集成测试 make test_watch # 监视模式运行测试 # 代码质量检查 make format # 代码格式化 make lint # 代码检查 # 直接使用 uv 或 python uv run pytest tests/unit_tests/ -v # 使用 uv(推荐) python -m pytest tests/unit_tests/ -v # 使用 python天气 agent 生成的 UI 组件包含:
- 📍 城市名称 - 支持的5个中国城市
- 🌡️ 温度信息 - 精准的温度显示 (如:22°C)
- ☁️ 天气状况 - 动态图标映射 (☀️晴天 ⛅多云 🌧️小雨)
- 💧 湿度数据 - 百分比显示 (如:45%)
- 💨 风速信息 - 统一windSpeed字段 (如:3km/h)
- 📝 天气描述 - 贴心的生活建议
- 动画效果: 卡片入场动画、图标弹跳、闪烁特效
- 响应式设计: 移动端适配,自动缩放
- 背景渐变: 根据天气状况动态调整背景色
- 类型安全: 完整的TypeScript接口定义
import { LoadExternalComponent } from "@langchain/langgraph-sdk/react-ui"; <LoadExternalComponent stream={thread} message={ui} fallback={<div>Loading weather...</div>} />interface WeatherProps { city: string; // 城市名称 temperature: string; // 温度 "22°C" condition: string; // 天气状况 "晴天" humidity: string; // 湿度 "45%" windSpeed: string; // 风速 "3km/h" description: string; // 详细描述 }当前支持以下5个中国城市的天气查询:
| 城市 | 天气状况 | 温度 | 湿度 | 风速 | 特色描述 |
|---|---|---|---|---|---|
| 北京 | 晴天 ☀️ | 22°C | 45% | 3km/h | 天气晴朗,温度适宜,适合外出活动 |
| 上海 | 多云 ⛅ | 18°C | 68% | 5km/h | 多云转阴,温度稍凉,建议增添衣物 |
| 深圳 | 小雨 🌧️ | 26°C | 78% | 7km/h | 有小雨,湿度较高,出门记得带伞 |
| 广州 | 阴天 ☁️ | 24°C | 72% | 4km/h | 阴天,温度舒适,适合室内活动 |
| 杭州 | 晴天 ☀️ | 20°C | 55% | 6km/h | 晴空万里,温度宜人,是游览的好天气 |
- 不支持的城市: 自动回退到默认城市(北京)
- 无城市指定: 默认显示北京天气
- 多城市同时出现: 返回消息中最先出现的城市
{ "graphs": { "agent": "./src/agent/graph.py:graph" }, "ui": { "agent": "./src/agent/ui.tsx" } }[project] requires-python = ">=3.11" dependencies = [ "langgraph>=0.2.6", "langchain-core>=0.3.0" ] [tool.uv.dev-dependencies] pytest = ">=8.3.5" mypy = ">=1.13.0" ruff = ">=0.8.2"PYTHON_CMD := $(shell command -v uv >/dev/null 2>&1 && echo "uv run" || echo "python -m")自动选择 uv 或 python 命令,优先使用性能更好的 uv。
- 技术架构文档 - 完整的系统架构和技术实现详解
- Generative UI 功能指南 - 详细的 UI 组件开发指南
- 消息解析功能 - 自然语言处理实现详解
- 测试结构文档 - 测试套件结构和使用说明
- 在
src/agent/graph.py的WEATHER_DATA数组中添加城市数据 - 确保包含所有必需字段:
city,temperature,condition,humidity,windSpeed,description - 更新相关测试用例(
test_ui_data.py,test_weather_node.py) - 运行
make test验证所有测试通过
- 在
extract_city_from_message()函数的basic_patterns数组中添加新的正则表达式 - 在
test_message_parsing.py中添加对应的测试用例 - 使用
uv run python examples/weather_demo.py验证功能 - 确保向后兼容性,不破坏现有模式
- 修改
src/agent/ui.tsx中的WeatherComponent - 更新
WeatherProps接口定义(如需要) - 使用内联样式或扩展现有动画效果
- 保持与后端
WeatherOutput数据结构的一致性 - 在移动端测试响应式布局
# 检查前后端数据结构一致性 make test # UI数据测试会验证字段匹配- Fork 项目
- 创建功能分支
- 提交更改
- 运行测试确保通过
- 提交 Pull Request
MIT License - 详见 LICENSE 文件
如有问题或建议,请:
- 查看文档目录中的详细指南
- 运行示例脚本了解用法
- 查看测试用例作为参考
- 提交 Issue 反馈问题
开始使用: uv run python examples/weather_demo.py 🚀