A newer version of the Gradio SDK is available: 6.19.0
title: RouteOpt Agent
emoji: 🧭
colorFrom: blue
colorTo: green
sdk: gradio
python_version: 3.11
app_file: app.py
pinned: false
short_description: Tool-calling route optimizer
RouteOpt Agent
基于公开大模型 API + 轻量工具调用的小规模路线优化智能体。它把用户自然语言转成路线优化任务,调用地理编码和路径矩阵工具,再用本地算法求解访问顺序,并自动生成 PDF 报告。
一键运行
chmod +x run.sh
./run.sh
启动后打开:
http://localhost:7860
首次运行会创建 conda 环境 routeopt-agent 并安装依赖。脚本会先尝试使用 environment.yml 创建标准环境;如果 conda 镜像下载不稳定,会自动克隆本机 base 环境,再用 pip 安装 requirements.txt。
LLM 配置
默认配置不需要你注册任何网站,也不需要提供 API token:
- LLM:Pollinations OpenAI-compatible API,无需 token。失败时系统自动切换到本地解析和本地报告模板。
- 地理编码:OpenStreetMap Nominatim 公共接口,内置缓存并限制请求频率。
- 路径矩阵:OSRM public demo server。失败时自动切换到直线距离近似矩阵。
- 部署:Hugging Face Spaces 免费 Gradio Space。
如果本机出现 ProxyError('Unable to connect to proxy'),说明 Python 请求走了不可用代理。默认 LLM_IGNORE_PROXY=1 会让 LLM 请求忽略系统代理;如果你的网络必须使用代理访问外网,可在 .env 中改成:
LLM_IGNORE_PROXY=0
更稳定的做法是使用正规 API key 服务,并把 key 放到 .env 或 Hugging Face Secrets。老师访问公开页面时不需要知道 token。
复制配置模板:
cp .env.example .env
推荐方案:
# Groq:国际网络通常较稳,OpenAI-compatible
LLM_PROVIDER=groq
GROQ_API_KEY=gsk_xxx
GROQ_MODEL=openai/gpt-oss-20b
# SiliconFlow:国内网络通常更友好,OpenAI-compatible
LLM_PROVIDER=siliconflow
SILICONFLOW_API_KEY=sk-xxx
SILICONFLOW_MODEL=THUDM/GLM-Z1-9B-0414
# Gemini:Google 官方免费额度,国内网络可能需要代理
LLM_PROVIDER=gemini
GEMINI_API_KEY=AIza...
GEMINI_MODEL=gemini-2.5-flash
也可以用 LLM_PROVIDER=auto,程序会按已配置的 key 自动选择:Groq -> SiliconFlow -> Gemini -> OpenRouter;没有 key 时退回 Pollinations。
推荐演示输入
自然语言需求:
我从上海交通大学闵行校区出发,想一天内逛完徐家汇、人民广场、外滩、陆家嘴,最后回到起点,尽量总时间短。
起点:
上海交通大学闵行校区
目的地:
徐家汇
人民广场
外滩
陆家嘴
这个样例的上海地点内置了离线坐标兜底,所以即使 Nominatim 临时限流,也能完成演示。
也可以使用北京样例:
我从北京邮电大学出发,想一天内逛完国家大剧院、鼓楼、北海、国家植物园,最后回到起点,尽量总时间短。
输入失败时如何处理
页面不会直接抛出 Python 错误;如果任务无法完成,会说明失败发生在哪个工具,以及应该如何修改输入。
常见原因:
- 起点或目的地为空。
- 目的地里只有起点,或者重复地点过多。
- 地点不在内置演示坐标中,同时在线地理编码服务超时、限流或找不到结果。
- 地名太泛,例如只写“鼓楼”“植物园”,在某些城市可能有多个匹配。
当前内置演示城市:上海、北京。
如果要演示其他城市,建议把地点写得更完整,例如“南京夫子庙”“广州塔”“深圳大学粤海校区”。如果在线地理编码仍然失败,可以直接输入坐标:
某景点@39.9042,116.4074
Agent Workflow
LLM tool_call: submit_route_task:把自然语言和表单提示抽取成结构化任务。geocode_places:把地点转换为经纬度。build_route_matrix:调用 OSRM 获取距离/时间矩阵。solve_route:用 Held-Karp 动态规划精确求解小规模 TSP。LLM compose_summary:生成中文解释。generate_pdf_report:输出包含问题定义、工具调用轨迹、算法和结果的 PDF。
公开部署到 Hugging Face Spaces
- 打开 Hugging Face,新建一个 Space。
- Space SDK 选择
Gradio。 - Visibility 可选
Public。 - 上传本仓库所有文件,或把仓库推送到 Space。
- Space 会根据
requirements.txt自动安装依赖,入口文件是app.py。
老师访问 Space 链接即可运行,不需要知道任何 token。
文件结构
app.py # Gradio 页面入口
routeopt_agent/agent.py # Agent 编排和工具调用轨迹
routeopt_agent/geo_tools.py# 地理编码、OSRM 矩阵、兜底矩阵
routeopt_agent/solver.py # Held-Karp 路线优化
routeopt_agent/report.py # PDF 报告生成
routeopt_agent/parsing.py # 本地自然语言解析兜底
routeopt_agent/viz.py # SVG 路线示意图
environment.yml # 本地 conda 环境
requirements.txt # Hugging Face Spaces 依赖
run.sh # 一键运行脚本