cuopt-routing-api-python — Claude Code skill for cuOpt routing
A skill that walks your agent through vehicle routing with the cuOpt Python API: TSP, VRP and pickup-delivery. Useful when the solver runs in Python.
npx skills add NVIDIA/skills --skill cuopt-routing-api-python -a claude-codeWhat cuopt-routing-api-python does
The skill covers cuOpt routing through Python only. There is no C API for routing in cuOpt, so code in another language is out of scope. Inside you get a minimal VRP example built on cudf and cuopt.routing, plus sections on constraints and solution checking.
Before writing code, the agent asks for the problem type (TSP, VRP or PDP), the number of locations and depots, the cost or distance matrix, orders with their demand, the fleet with capacity and start/end points, and constraints such as time windows or precedence. Then it builds a DataModel, attaches matrices and calls routing.Solve with SolverSettings.
Matrices and series need explicit dtypes (float32, int32) because silent errors slip through otherwise. When the status is not 0, the skill points you at get_error_message() and the list of infeasible orders. One trap worth knowing: compute_waypoint_sequence rewrites the location column of route_df in place, so pass route_df.copy() if you still need cost-matrix indices while iterating per truck.
What it helps with
- build a VRP model from a cost matrix and a fleet
- attach time windows and service times to orders
- set capacity across several dimensions
- link pickup-delivery pairs and order precedence
- debug an empty solution or an infeasible order
Example prompts for the agent
- Solve a VRP with 4 locations and 2 vehicles, cost matrix in cudf
- Add time windows and weight capacity to the cuOpt model
- Status is not 0 — print the infeasible orders and the error message
How to install cuopt-routing-api-python
1Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill cuopt-routing-api-python -a claude-code2Manually: put the files in place
~/.claude/skills/cuopt-routing-api-python/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/cuopt-routing-api-python/
1Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill cuopt-routing-api-python -a codex2Manually: put the files in place
.agents/skills/cuopt-routing-api-python/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill cuopt-routing-api-python -a cursor2Manually: put the files in place
.cursor/skills/cuopt-routing-api-python/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install NVIDIA/skills cuopt-routing-api-python2Manually: put the files in place
.github/skills/cuopt-routing-api-python/SKILL.md1Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill cuopt-routing-api-python -a gemini-cli2Platform CLI
gemini skills install https://github.com/NVIDIA/skills --path skills/cuopt-routing-api-pythonManually: put the files in place
.devin/skills/cuopt-routing-api-python/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add NVIDIA/skills --skill cuopt-routing-api-python -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
Step by step, with commands for each platform: How to install skills in Claude Code: five ways
Questions about cuopt-routing-api-python
How do I install cuopt-routing-api-python in Claude?
Run npx skills add NVIDIA/skills --skill cuopt-routing-api-python -a claude-code. The skill file then lives at ~/.claude/skills/cuopt-routing-api-python/SKILL.md.
What does cuopt-routing-api-python do?
It guides the agent through building and solving vehicle routing problems with the cuOpt Python API: TSP, VRP and pickup-delivery, with time and capacity constraints.
Why is my solution empty or an order marked infeasible?
The skill suggests widening time windows, checking travel times, or increasing fleet size and capacity. With time windows set, you need a transit time matrix via add_transit_time_matrix().
Source text
SKILL.md · Apache-2.0
---
name: cuopt-routing-api-python
version: "26.10.00"
description: Vehicle routing (VRP, TSP, PDP) with cuOpt — Python API only. Use when the user is building or solving routing in Python.
license: Apache-2.0
metadata:
author: NVIDIA cuOpt Team
tags:
- cuopt
- routing
- vrp
- tsp
- python
---
# cuOpt Routing — Python API
This skill is **Python only**. Routing has no C API in cuOpt.
## Required questions
Ask these if not already clear:
1. **Problem type** — TSP, VRP, or PDP?
2. **Locations** — How many? Depot(s)? Cost or distance between pairs (matrix or derived)?
3. **Orders / tasks** — Which locations must be visited? Demand or service per stop?
4. **Fleet** — Number of vehicles, capacity per vehicle (and per dimension if multiple), start/end locations?
5. **Constraints** — Time windows (earliest/latest arrival), service times, precedence (order A before B)?
## Minimal VRP Example
```python
import cudf
from cuopt import routing
cost_matrix = cudf.DataFrame([...], dtype="float32")
dm = routing.DataModel(n_locations=4, n_fleet=2, n_orders=3)
dm.add_cost_matrix(cost_matrix)
dm.set_order_locations(cudf.Series([1, 2, 3], dtype="int32"))
solution = routing.Solve(dm, routing.SolverSettings())
if solution.get_status() == 0:
solution.display_routes()
```
## Adding Constraints
```python
# Time windows
dm.add_transit_time_matrix(transit_time_matrix)
dm.set_order_time_windows(earliest_series, latest_series)
# Capacities
dm.add_capacity_dimension("weight", demand_series, capacity_series)
dm.set_order_service_times(service_times)
dm.set_vehicle_locations(start_locations, end_locations)
dm.set_vehicle_time_windows(earliest_start, latest_return)
# Pickup-delivery pairs
dm.set_pickup_delivery_pairs(pickup_indices, delivery_indices)
# Precedence
dm.add_order_precedence(node_id=2, preceding_nodes=np.array([0, 1]))
```
## Solution Checking
```python
status = solution.get_status() # 0=SUCCESS, 1=FAIL, 2=TIMEOUT, 3=EMPTY
if status == 0:
route_df = solution.get_route()
total_cost = solution.get_total_objective()
else:
print(solution.get_error_message())
print(solution.get_infeasible_orders().to_list())
```
## Data Types (use explicit dtypes)
```python
cost_matrix = cost_matrix.astype("float32")
order_locations = cudf.Series([...], dtype="int32")
demand = cudf.Series([...], dtype="int32")
```
## Solver Settings
```python
ss = routing.SolverSettings()
ss.set_time_limit(30)
ss.set_verbose_mode(True)
ss.set_error_logging_mode(True)
```
## Common Issues
| Problem | Fix |
|---------|-----|
| Empty solution | Widen time windows or check travel times |
| Infeasible orders | Increase fleet or capacity |
| Status != 0 with time windows | Add `add_transit_time_matrix()` |
| Wrong cost | Check cost_matrix is symmetric |
| `compute_waypoint_sequence` alters route_df | It replaces the `location` column with waypoint ids in place — pass `route_df.copy()` if you still need cost-matrix indices (e.g. when iterating per truck) |
## Debugging
**When status != 0:** `print(solution.get_error_message())` and `print(solution.get_infeasible_orders().to_list())` to see which orders are infeasible.
**Data types:** Use explicit dtypes (float32, int32) for matrices and series to avoid silent errors.
## Examples
- [examples.md](references/examples.md) — VRP, PDP, multi-depot
- [server_examples.md](references/server_examples.md) — REST client (curl, Python)
- **Reference models:** This skill's `assets/` — [vrp_basic](assets/vrp_basic/), [pdp_basic](assets/pdp_basic/). See [assets/README.md](assets/README.md).
## Escalate
For contribution or build-from-source, see the developer skill.
© NVIDIA cuOpt Team · Apache-2.0 · NVIDIA/skills