
Cuopt Server Api Python
- 1.9k installs
- 2.8k repo stars
- Updated August 4, 2026
- nvidia/skills
cuopt-server-api-python is an agent skill that cuopt rest server — start server, endpoints, python/curl client examples. use when the user is deploying or calling the rest api.
About
cuopt-server-api-python is an agent skill from nvidia/skills that cuopt rest server — start server, endpoints, python/curl client examples. use when the user is deploying or calling the rest api. # cuOpt Server — Deploy and client (Python/curl) This skill covers **starting the server** and **client examples** (curl, Python). Server has no separate C API (clients can be any language). ## Start server ```bash # Development python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000 # Docker docker run --gpus all -d -p 8000:8000 -e CUOPT Developers invoke cuopt-server-api-python during build/integrations work for data science & ml tasks. The skill documents triggers, prerequisites, and step-by-step workflows grounded in SKILL.md. Compatible with Claude Code, Cursor, and Codex agent runtimes that load marketplace skills.
- cuOpt Server — Deploy and client (Python/curl)
- This skill covers **starting the server** and **client examples** (curl, Python). Server has no separate C API (clients
- python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000
- docker run --gpus all -d -p 8000:8000 -e CUOPT_SERVER_PORT=8000 \
- nvidia/cuopt:latest-cuda12.9-py3.13
Cuopt Server Api Python by the numbers
- 1,894 all-time installs (skills.sh)
- +45 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #81 of 2,064 Data Science & ML skills by installs in the Skillselion catalog
- Security screen: LOW risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
cuopt-server-api-python capabilities & compatibility
- Capabilities
- cuopt server — deploy and client (python/curl) · this skill covers **starting the server** and ** · python m cuopt_server.cuopt_service ip 0.0.0. · docker run gpus all d p 8000:8000 e cuopt_s · nvidia/cuopt:latest cuda12.9 py3.13
- Use cases
- orchestration
What cuopt-server-api-python says it does
This skill covers **starting the server** and **client examples** (curl, Python). Server has no separate C API (clients can be any language).
python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000
docker run --gpus all -d -p 8000:8000 -e CUOPT_SERVER_PORT=8000 \
npx skills add https://github.com/nvidia/skills --skill cuopt-server-api-pythonAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.9k |
|---|---|
| repo stars | ★ 2.8k |
| Security audit | 3 / 3 scanners passed |
| Last updated | August 4, 2026 |
| Repository | nvidia/skills ↗ |
What it does
cuOpt REST server — start server, endpoints, Python/curl client examples. Use when the user is deploying or calling the REST API.
Who is it for?
Developers working on data science & ml during build tasks.
Skip if: Tasks outside Data Science & ML scope described in SKILL.md.
When should I use this skill?
cuOpt REST server — start server, endpoints, Python/curl client examples. Use when the user is deploying or calling the REST API.
What you get
Completed data science & ml workflow aligned with SKILL.md steps.
- Python REST client integration
- Optimization API response handling
By the numbers
- Default CUOPT_SERVER_URL http://localhost:8000
- Health check timeout set to 2 seconds in client.py
Files
cuOpt Server — Deploy and client (Python/curl)
This skill covers starting the server and client examples (curl, Python). Server has no separate C API (clients can be any language).
Start server
# Development
python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000
# Docker
docker run --gpus all -d -p 8000:8000 -e CUOPT_SERVER_PORT=8000 \
nvidia/cuopt:latest-cuda12.9-py3.13Verify
curl http://localhost:8000/cuopt/healthWorkflow
1. POST to /cuopt/request → get reqId 2. Poll /cuopt/solution/{reqId} until solution ready 3. Parse response
Python client (routing)
import requests, time
SERVER = "http://localhost:8000"
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
payload = {
"cost_matrix_data": {"data": {"0": [[0,10,15],[10,0,12],[15,12,0]]}},
"travel_time_matrix_data": {"data": {"0": [[0,10,15],[10,0,12],[15,12,0]]}},
"task_data": {"task_locations": [1, 2], "demand": [[10, 20]], "task_time_windows": [[0,100],[0,100]], "service_times": [5, 5]},
"fleet_data": {"vehicle_locations": [[0, 0]], "capacities": [[50]], "vehicle_time_windows": [[0, 200]]},
"solver_config": {"time_limit": 5}
}
r = requests.post(f"{SERVER}/cuopt/request", json=payload, headers=HEADERS)
req_id = r.json()["reqId"]
# Poll: GET /cuopt/solution/{req_id}Terminology: REST vs Python API
| Python API | REST |
|---|---|
| order_locations | task_locations |
| set_order_time_windows() | task_time_windows |
| service_times | service_times |
Use travel_time_matrix_data (not transit_time_matrix_data). Capacities: [[50, 50]] not [[50], [50]].
Debugging (422 / payload)
Validation errors: Check field names against OpenAPI (/cuopt.yaml). Common mistakes: transit_time_matrix_data → travel_time_matrix_data; capacities per dimension [[50, 50]] not per vehicle [[50], [50]]. Capture reqId and response body for failed requests.
Runnable assets
Run from each asset directory (server must be running; scripts exit 0 if server unreachable). All use Python requests:
- assets/vrp_simple/ — Basic VRP (no time windows)
- assets/vrp_basic/ — VRP with time windows
- assets/pdp_basic/ — Pickup and delivery
- assets/lp_basic/ — LP via REST (CSR format)
- assets/milp_basic/ — MILP via REST
See assets/README.md for overview.
Escalate
For contribution or build-from-source, see the developer skill.
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""
REST client: LP request (maximize 40x + 30y s.t. 2x+3y<=240, 4x+2y<=200). Requires cuOpt server running.
Usage: python client.py
Set CUOPT_SERVER_URL (default http://localhost:8000). Exits 0 if server unreachable (e.g. in CI without server).
"""
import os
import sys
import time
import requests
SERVER = os.environ.get("CUOPT_SERVER_URL", "http://localhost:8000")
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
def server_ok():
try:
r = requests.get(f"{SERVER}/cuopt/health", timeout=2)
return r.status_code == 200
except Exception:
return False
def main():
if not server_ok():
print(
"Server not running, skipping. Start with: python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000"
)
sys.exit(0)
payload = {
"csr_constraint_matrix": {
"offsets": [0, 2, 4],
"indices": [0, 1, 0, 1],
"values": [2.0, 3.0, 4.0, 2.0],
},
"constraint_bounds": {
"upper_bounds": [240.0, 200.0],
"lower_bounds": ["ninf", "ninf"],
},
"objective_data": {
"coefficients": [40.0, 30.0],
},
"variable_bounds": {
"upper_bounds": ["inf", "inf"],
"lower_bounds": [0.0, 0.0],
},
"maximize": True,
"solver_config": {
"time_limit": 60,
},
}
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response.raise_for_status()
req_id = response.json()["reqId"]
print(f"Submitted: {req_id}")
for _ in range(30):
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)
result = response.json()
if "response" in result:
print(f"Status: {result['response'].get('status')}")
print(f"Objective: {result['response'].get('objective_value')}")
print(f"Solution: {result['response'].get('primal_solution')}")
return
time.sleep(1)
print("Timeout waiting for solution")
sys.exit(1)
if __name__ == "__main__":
main()
LP via REST (maximize 40x + 30y)
Submit an LP to the cuOpt server (CSR format) and poll for the solution.
Requires: cuOpt server running (e.g. python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000).
Run: python client.py If the server is not reachable, the script exits 0 (skip).
Env: CUOPT_SERVER_URL (default http://localhost:8000).
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""
REST client: MILP (same constraints as LP but variable_types: integer, continuous).
Requires cuOpt server running. Exits 0 if server unreachable.
"""
import os
import sys
import time
import requests
SERVER = os.environ.get("CUOPT_SERVER_URL", "http://localhost:8000")
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
def server_ok():
try:
r = requests.get(f"{SERVER}/cuopt/health", timeout=2)
return r.status_code == 200
except Exception:
return False
def main():
if not server_ok():
print(
"Server not running, skipping. Start with: python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000"
)
sys.exit(0)
payload = {
"csr_constraint_matrix": {
"offsets": [0, 2, 4],
"indices": [0, 1, 0, 1],
"values": [2.0, 3.0, 4.0, 2.0],
},
"constraint_bounds": {
"upper_bounds": [240.0, 200.0],
"lower_bounds": ["ninf", "ninf"],
},
"objective_data": {"coefficients": [40.0, 30.0]},
"variable_bounds": {
"upper_bounds": ["inf", "inf"],
"lower_bounds": [0.0, 0.0],
},
"variable_types": ["integer", "continuous"],
"maximize": True,
"solver_config": {
"time_limit": 120,
"tolerances": {"mip_relative_gap": 0.01},
},
}
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response.raise_for_status()
req_id = response.json()["reqId"]
print(f"Submitted: {req_id}")
for _ in range(60):
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)
result = response.json()
if "response" in result:
print(f"Status: {result['response'].get('status')}")
print(f"Objective: {result['response'].get('objective_value')}")
print(f"Solution: {result['response'].get('primal_solution')}")
return
time.sleep(1)
print("Timeout waiting for solution")
sys.exit(1)
if __name__ == "__main__":
main()
MILP via REST
Same problem as LP (maximize 40x + 30y, 2x+3y≤240, 4x+2y≤200) with variable_types: first variable integer, second continuous.
Requires: cuOpt server running. Run: python client.py (exits 0 if server unreachable). Env: CUOPT_SERVER_URL (default http://localhost:8000). Variable types: continuous, integer, binary.
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""REST client for the cuOpt pickup-and-delivery (PDP) example. See README.md."""
import os
import sys
import time
import requests
SERVER = os.environ.get("CUOPT_SERVER_URL", "http://localhost:8000")
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
def server_ok():
try:
r = requests.get(f"{SERVER}/cuopt/health", timeout=2)
return r.status_code == 200
except Exception:
return False
def main():
if not server_ok():
print(
"Server not running, skipping. Start with: python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000"
)
sys.exit(0)
payload = {
"cost_matrix_data": {
"data": {
"0": [
[0, 10, 20, 30, 40],
[10, 0, 15, 25, 35],
[20, 15, 0, 10, 20],
[30, 25, 10, 0, 15],
[40, 35, 20, 15, 0],
]
}
},
"travel_time_matrix_data": {
"data": {
"0": [
[0, 10, 20, 30, 40],
[10, 0, 15, 25, 35],
[20, 15, 0, 10, 20],
[30, 25, 10, 0, 15],
[40, 35, 20, 15, 0],
]
}
},
"task_data": {
"task_locations": [1, 2, 3, 4],
"demand": [[10, -10, 15, -15]],
"pickup_and_delivery_pairs": [[0, 1], [2, 3]],
},
"fleet_data": {
"vehicle_locations": [[0, 0]],
"capacities": [[50]],
},
"solver_config": {"time_limit": 10},
}
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response.raise_for_status()
req_id = response.json()["reqId"]
print(f"Submitted: {req_id}")
for _ in range(30):
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)
result = response.json()
if "response" in result:
solver_response = result["response"].get("solver_response", {})
print(f"Status: {solver_response.get('status')}")
print(f"Cost: {solver_response.get('solution_cost')}")
if "vehicle_data" in solver_response:
for vid, vdata in solver_response["vehicle_data"].items():
print(f"Vehicle {vid}: {vdata.get('route', [])}")
return
time.sleep(1)
print("Timeout waiting for solution")
sys.exit(1)
if __name__ == "__main__":
main()
Pickup and delivery (PDP)
Pickup-delivery pairs: (0,1) and (2,3). Pickup must be visited before the corresponding delivery.
Requires: cuOpt server running. Run: python client.py (exits 0 if server unreachable). Env: CUOPT_SERVER_URL (default http://localhost:8000).
Server API Python — runnable assets
REST client examples (Python requests). Each runs against a cuOpt server; if the server is not reachable, the script exits 0 (skip).
| Asset | Description |
|---|---|
vrp_simple/ | Basic VRP (no time windows) |
vrp_basic/ | VRP with time windows |
pdp_basic/ | Pickup and delivery (pairs) |
lp_basic/ | LP (CSR format) |
milp_basic/ | MILP (integer + continuous variables) |
Start server: python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000 Env: CUOPT_SERVER_URL (default http://localhost:8000).
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""
REST client: VRP with time windows. Requires cuOpt server running.
Usage: python client.py
Set CUOPT_SERVER_URL (default http://localhost:8000). Exits 0 if server unreachable (e.g. in CI without server).
"""
import os
import sys
import time
import requests
SERVER = os.environ.get("CUOPT_SERVER_URL", "http://localhost:8000")
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
def server_ok():
try:
r = requests.get(f"{SERVER}/cuopt/health", timeout=2)
return r.status_code == 200
except Exception:
return False
def main():
if not server_ok():
print(
"Server not running, skipping. Start with: python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000"
)
sys.exit(0)
payload = {
"cost_matrix_data": {
"data": {
"0": [
[0, 10, 15, 20, 25],
[10, 0, 12, 18, 22],
[15, 12, 0, 10, 15],
[20, 18, 10, 0, 8],
[25, 22, 15, 8, 0],
]
}
},
"travel_time_matrix_data": {
"data": {
"0": [
[0, 10, 15, 20, 25],
[10, 0, 12, 18, 22],
[15, 12, 0, 10, 15],
[20, 18, 10, 0, 8],
[25, 22, 15, 8, 0],
]
}
},
"task_data": {
"task_locations": [1, 2, 3, 4],
"demand": [[20, 30, 25, 15]],
"task_time_windows": [[0, 50], [10, 60], [20, 70], [0, 80]],
"service_times": [5, 5, 5, 5],
},
"fleet_data": {
"vehicle_locations": [[0, 0], [0, 0]],
"capacities": [[100, 100]],
"vehicle_time_windows": [[0, 200], [0, 200]],
},
"solver_config": {"time_limit": 10},
}
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response.raise_for_status()
req_id = response.json()["reqId"]
print(f"Submitted: {req_id}")
for _ in range(30):
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)
result = response.json()
if "response" in result:
solver_response = result["response"].get("solver_response", {})
print(f"Status: {solver_response.get('status')}")
print(f"Cost: {solver_response.get('solution_cost')}")
if "vehicle_data" in solver_response:
for vid, vdata in solver_response["vehicle_data"].items():
print(f"Vehicle {vid}: {vdata.get('route', [])}")
return
time.sleep(1)
print("Timeout waiting for solution")
sys.exit(1)
if __name__ == "__main__":
main()
VRP with time windows (REST client)
Submit a VRP with time windows to the cuOpt server and poll for the solution.
Requires: cuOpt server running (e.g. python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000).
Run: python client.py If the server is not reachable, the script exits 0 (skip).
Env: CUOPT_SERVER_URL (default http://localhost:8000).
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
# SPDX-License-Identifier: Apache-2.0
"""
REST client: Basic VRP (no time windows). 4 locations, 3 tasks, 2 vehicles.
Requires cuOpt server running. Exits 0 if server unreachable.
"""
import os
import sys
import time
import requests
SERVER = os.environ.get("CUOPT_SERVER_URL", "http://localhost:8000")
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
def server_ok():
try:
r = requests.get(f"{SERVER}/cuopt/health", timeout=2)
return r.status_code == 200
except Exception:
return False
def main():
if not server_ok():
print(
"Server not running, skipping. Start with: python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000"
)
sys.exit(0)
payload = {
"cost_matrix_data": {
"data": {
"0": [
[0, 10, 15, 20],
[10, 0, 12, 18],
[15, 12, 0, 10],
[20, 18, 10, 0],
]
}
},
"travel_time_matrix_data": {
"data": {
"0": [
[0, 10, 15, 20],
[10, 0, 12, 18],
[15, 12, 0, 10],
[20, 18, 10, 0],
]
}
},
"task_data": {
"task_locations": [1, 2, 3],
"demand": [[10, 15, 20]],
"service_times": [5, 5, 5],
},
"fleet_data": {
"vehicle_locations": [[0, 0], [0, 0]],
"capacities": [[50, 50]],
},
"solver_config": {"time_limit": 5},
}
response = requests.post(
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
)
response.raise_for_status()
req_id = response.json()["reqId"]
print(f"Submitted: {req_id}")
for _ in range(30):
response = requests.get(
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
)
result = response.json()
if "response" in result:
solver_response = result["response"].get("solver_response", {})
print(f"Status: {solver_response.get('status')}")
print(f"Cost: {solver_response.get('solution_cost')}")
if "vehicle_data" in solver_response:
for vid, vdata in solver_response["vehicle_data"].items():
print(f"Vehicle {vid}: {vdata.get('route', [])}")
return
time.sleep(1)
print("Timeout waiting for solution")
sys.exit(1)
if __name__ == "__main__":
main()
Basic VRP (no time windows)
Simple VRP: 4 locations, 3 tasks, 2 vehicles. No time windows.
Requires: cuOpt server running. Run: python client.py (exits 0 if server unreachable). Env: CUOPT_SERVER_URL (default http://localhost:8000).
Evaluation Report
Evaluation of the cuopt-server-api-python skill before publication through NVSkills-Eval.
This benchmark summarizes 3-Tier Evaluation from NVSkills-Eval results for the skill. The goal is to document whether the skill is safe, discoverable, effective, and useful for agents before it is published for broader workflow use.
Evaluation Summary
- Skill:
cuopt-server-api-python - Evaluation date: 2026-05-29
- NVSkills-Eval profile:
external - Environment:
local - Dataset: 1 evaluation tasks
- Attempts per task: 2
- Pass threshold: 50%
- Overall verdict: PASS
Agents Used
claude-codecodex
Metrics Used
Reported benchmark dimensions:
- Security: checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access.
- Correctness: checks whether the agent follows the expected workflow and produces the correct final output.
- Discoverability: checks whether the agent loads the skill when relevant and avoids using it when irrelevant.
- Effectiveness: checks whether the agent performs measurably better with the skill than without it.
- Efficiency: checks whether the agent uses fewer tokens and avoids redundant work.
Underlying evaluation signals used in this run:
security(Security): checks for unsafe operations, secret leakage, and unauthorized access.skill_execution(Skill Execution): verifies that the agent loaded the expected skill and workflow.skill_efficiency(Efficiency): checks routing quality, decoy avoidance, and redundant tool usage.accuracy(Accuracy): grades final-answer correctness against the reference answer.goal_accuracy(Goal Accuracy): checks whether the overall user task completed successfully.behavior_check(Behavior Check): verifies expected behavior steps, including safety expectations.token_efficiency(Token Efficiency): compares token usage with and without the skill.
Test Tasks
The benchmark dataset contained 1 evaluation tasks:
- Positive tasks: 1 tasks where the skill was expected to activate.
- Negative tasks: 0 tasks where no skill was expected.
- Unlabeled tasks: 0 tasks where positive/negative intent could not be inferred.
Task composition is derived from the evaluation dataset when possible. Entries with expected_skill set are treated as positive skill-activation cases, while entries with expected_skill: null are treated as negative activation cases.
Results
| Dimension | Num | claude-code | codex |
|---|---|---|---|
| Security | 2 | 100% (+0%) | 100% (+0%) |
| Correctness | 2 | 100% (+0%) | 97% (+0%) |
| Discoverability | 2 | 100% (+0%) | 72% (+0%) |
| Effectiveness | 2 | 100% (+0%) | 100% (+0%) |
| Efficiency | 2 | 93% (-0%) | 56% (-1%) |
Score values show skill-assisted performance. Values in parentheses show uplift versus the no-skill baseline when baseline data is available.
Tier 1: Static Validation Summary
Tier 1 validation passed with observations. NVSkills-Eval ran 9 checks and found 15 total findings.
Top findings:
- MEDIUM PII/gps_coordinates: GPS coordinates (location information) (
assets/lp_basic/client.py:40) - MEDIUM PII/gps_coordinates: GPS coordinates (location information) (
assets/lp_basic/client.py:47) - MEDIUM PII/gps_coordinates: GPS coordinates (location information) (
assets/lp_basic/client.py:51) - MEDIUM PII/gps_coordinates: GPS coordinates (location information) (
assets/milp_basic/client.py:38) - MEDIUM PII/gps_coordinates: GPS coordinates (location information) (
assets/milp_basic/client.py:44)
Tier 2: Deduplication Summary
Tier 2 validation passed. NVSkills-Eval ran 2 checks and found 0 total findings.
Notable observations:
- Context Deduplication: Collected 12 file(s)
- Inter-Skill Deduplication: Parsed skill 'cuopt-server-api-python': 129 char description
Publication Recommendation
The skill is suitable to proceed toward NVSkills-Eval publication based on this benchmark. Skill owners should keep this file with the skill and refresh it when the evaluation dataset, skill behavior, or target agents materially change.
[
{
"id": "srv-py-eval-001-rest-routing-workflow",
"question": "I have the cuOpt REST server running locally. List the HTTP endpoints I need to call to submit a routing problem and retrieve the solution, and the key payload field names for VRP with time windows. No full client script.",
"expected_skill": "cuopt-server-api-python",
"expected_script": null,
"ground_truth": "The agent describes the asynchronous submit-then-poll pattern: POST /cuopt/request returns a reqId, then GET /cuopt/solution/{reqId} until the solution is ready. The top-level VRPTW payload fields are cost_matrix_data, travel_time_matrix_data (note: REST uses travel_time_matrix_data, not the Python-API name transit_time_matrix_data), task_data, fleet_data, and solver_config. Does not produce a runnable client script.",
"expected_behavior": [
"Describes the POST /cuopt/request → reqId → GET /cuopt/solution/{reqId} polling flow",
"Names cost_matrix_data, travel_time_matrix_data, task_data, fleet_data, solver_config as the VRPTW payload fields and flags the travel_time_matrix_data (REST) vs transit_time_matrix_data (Python) naming",
"Does not produce a full runnable client script"
]
}
]
Description: <br>
cuOpt REST server — start server, endpoints, Python/curl client examples. Use when the user is deploying or calling the REST API. <br>
This skill is ready for commercial/non-commercial use. <br>
Owner
NVIDIA <br>
License/Terms of Use: <br>
Apache-2.0 <br>
Use Case: <br>
Developers and engineers deploying, configuring, or calling the NVIDIA cuOpt REST server for vehicle routing (VRP, PDP), linear programming (LP), and mixed-integer linear programming (MILP) optimization workloads. <br>
Deployment Geography for Use: <br>
Global <br>
Known Risks and Mitigations: <br>
Risk: Review before execution as proposals could introduce incorrect or misleading guidance into skills. <br> Mitigation: Review and scan skill before deployment. <br>
Reference(s): <br>
- cuOpt User Guide <br>
- cuOpt Examples <br>
- cuOpt Docker Hub <br>
- Runnable Assets (README) <br>
Skill Output: <br>
Output Type(s): [API Calls, Code, Shell commands, Configuration instructions] <br> Output Format: [Markdown with inline Python and bash code blocks] <br> Output Parameters: [1D] <br> Other Properties Related to Output: [None] <br>
Evaluation Agents Used: <br>
- Claude Code (
claude-code) <br> - Codex (
codex) <br>
Evaluation Tasks: <br>
Evaluated against 1 internal evaluation task (positive skill-activation) with 2 attempts per task via NVSkills-Eval (external profile, local environment). Pass threshold: 50%. <br>
Evaluation Metrics Used: <br>
Reported benchmark dimensions: <br>
- Security: Checks whether skill-assisted execution avoids unsafe behavior such as secret leakage, destructive commands, or unauthorized access. <br>
- Correctness: Checks whether the agent follows the expected workflow and produces the correct final output. <br>
- Discoverability: Checks whether the agent loads the skill when relevant and avoids using it when irrelevant. <br>
- Effectiveness: Checks whether the agent performs measurably better with the skill than without it. <br>
- Efficiency: Checks whether the agent uses fewer tokens and avoids redundant work. <br>
Underlying evaluation signals used in this run: <br>
security: Checks for unsafe operations, secret leakage, and unauthorized access. <br>skill_execution: Verifies that the agent loaded the expected skill and workflow. <br>skill_efficiency: Checks routing quality, decoy avoidance, and redundant tool usage. <br>accuracy: Grades final-answer correctness against the reference answer. <br>goal_accuracy: Checks whether the overall user task completed successfully. <br>behavior_check: Verifies expected behavior steps, including safety expectations. <br>token_efficiency: Compares token usage with and without the skill. <br>
Evaluation Results: <br>
| Dimension | Num | claude-code | codex |
|---|---|---|---|
| Security | 2 | 100% (+0%) | 100% (+0%) |
| Correctness | 2 | 100% (+0%) | 97% (+0%) |
| Discoverability | 2 | 100% (+0%) | 72% (+0%) |
| Effectiveness | 2 | 100% (+0%) | 100% (+0%) |
| Efficiency | 2 | 93% (-0%) | 56% (-1%) |
Skill Version(s): <br>
26.08.00 (source: frontmatter) <br>
Ethical Considerations: <br>
NVIDIA believes Trustworthy AI is a shared responsibility and we have established policies and practices to enable development for a wide array of AI applications. When downloaded or used in accordance with our terms of service, developers should work with their internal team to ensure this skill meets requirements for the relevant industry and use case and addresses unforeseen product misuse. <br>
(For Release on NVIDIA Platforms Only) <br> Please report quality, risk, security vulnerabilities or NVIDIA AI Concerns here. <br>
{"mediaType":"application/vnd.dev.sigstore.bundle.v0.3+json","verificationMaterial":{"x509CertificateChain":{"certificates":[{"rawBytes":"MIICgzCCAgmgAwIBAgIUKIyS7SxNteQIiWzK1dWj85E6520wCgYIKoZIzj0EAwMwVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwHhcNMjYwNDAxMDAwMDAwWhcNMjgwNDIyMTUzMzA5WjBUMQswCQYDVQQGEwJVUzEbMBkGA1UECgwSTlZJRElBIENvcnBvcmF0aW9uMSgwJgYDVQQDDB9OVklESUEgQWdlbnQgU2tpbGxzIFNpZ25pbmcgMDAxMHYwEAYHKoZIzj0CAQYFK4EEACIDYgAEYoRM9bQl/dGlwSRNi6bTpIJUXH8Nv9GciP6LSflJYYMLCc296kpyuTSsk5ddbAWiDcFX3C/ydX3jwc+qCLYP6uHy9XphyLjOQ27Yb2J6rBLVtRBS1mgGco/Gr7fL6ODco4GaMIGXMB0GA1UdDgQWBBRQ/5ZW3nJ6lmo9SVk7I15o7UGmpTAfBgNVHSMEGDAWgBRPGpILxMBBleJSsBGjrMKsby1CgjAMBgNVHRMBAf8EAjAAMA4GA1UdDwEB/wQEAwIHgDA3BggrBgEFBQcBAQQrMCkwJwYIKwYBBQUHMAGGG2h0dHA6Ly9vY3NwLm5kaXMubnZpZGlhLmNvbTAKBggqhkjOPQQDAwNoADBlAjAUygu/GiOCIXrgGr4SmLgeEVDcEitfFUv7ALbvLVGVyMysB3mxmO/uInZfXzWcJZsCMQDxuoxj4ZmO30jhkPIcCxGFCOvnUsnfU3TfGcouYm4M6iRpbKvtVnHPiy4bi6pcKf0="},{"rawBytes":"MIICiDCCAg6gAwIBAgIUZsIuSv9NkpJCNqtYEfCouVv5BzowCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowVTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjEpMCcGA1UEAwwgTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBJQ0EgMDEwdjAQBgcqhkjOPQIBBgUrgQQAIgNiAASI72cR3ctKGg4VWnB3bNja6g1Z2PnOmFEopkPof+QeIcPk9rT+g9MjJnq51EQXL93a7C2GJ9J985G4o2V85VD7wJ1RaXhluHW2rf3y8bQGeAYaKMr5s/hUgn+M3/9WlWejgaAwgZ0wHQYDVR0OBBYEFE8akgvEwEGV4lKwEaOswqxvLUKCMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMBIGA1UdEwEB/wQIMAYBAf8CAQAwDgYDVR0PAQH/BAQDAgEGMDcGCCsGAQUFBwEBBCswKTAnBggrBgEFBQcwAYYbaHR0cDovL29jc3AubmRpcy5udmlkaWEuY29tMAoGCCqGSM49BAMDA2gAMGUCMQCeIMMfAbyzPDacw2MxG+Yt1cikrJX/DVxiGfXuHmkkXn6VgSzE79+lkqDErpVO2gYCMCNEColOyvUvkzZGUEI1hQ3PfMgi3FIo9tHoBKMw4/wGBLFpu/0ubtmbBXM6/UMOEw=="},{"rawBytes":"MIICRTCCAcygAwIBAgIUeJdY3rV86EdvFmG7L8LJBsyQFYkwCgYIKoZIzj0EAwMwUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTAgFw0yNjA0MDEwMDAwMDBaGA85OTk5MTIzMTIzNTk1OVowUTELMAkGA1UEBhMCVVMxGzAZBgNVBAoMEk5WSURJQSBDb3Jwb3JhdGlvbjElMCMGA1UEAwwcTlZJRElBIEFnZW50IENhcGFiaWxpdGllcyBDQTB2MBAGByqGSM49AgEGBSuBBAAiA2IABAYpiXCDjJ9NT2eSDhyHJVSw1Tbze18cGG2F/578oWvHxg23eQAhNRYdq88i1iOshZSO6C29doKui5Xpmo/7Ctw9Sx4PP2RzOmIuOLCuTdNtKcTRwi4GEsd5BAFvWj42M6NjMGEwHQYDVR0OBBYEFItnoAjjfuCEUvzyvWyI2vOGvwPjMB8GA1UdIwQYMBaAFItnoAjjfuCEUvzyvWyI2vOGvwPjMA8GA1UdEwEB/wQFMAMBAf8wDgYDVR0PAQH/BAQDAgEGMAoGCCqGSM49BAMDA2cAMGQCMCwtAjWLaNwgGWNCgdyNoTyvNhqWRECRJV2r3+7w8g0PL6NHLOsbkgE09BH95h8XlgIwTaQmbbUh2ChAJ5TA1wRiVDnCcvbzHlZl2jM2FcwQQZlk19LOAbyGMRixbu2Ww/rj"}]},"tlogEntries":[]},"dsseEnvelope":{"payload":"ewogICJfdHlwZSI6ICJodHRwczovL2luLXRvdG8uaW8vU3RhdGVtZW50L3YxIiwKICAic3ViamVjdCI6IFsKICAgIHsKICAgICAgIm5hbWUiOiAiY3VvcHQtc2VydmVyLWFwaS1weXRob24iLAogICAgICAiZGlnZXN0IjogewogICAgICAgICJzaGEyNTYiOiAiZDYwOTgzMDYyN2M0ZTQ3YTJmMmM0NjM2ZDg5YzIwMWQ3MDczMWFjMzQxZDQ0ZTczODkzM2E1YjVjZjE5MWViOSIKICAgICAgfQogICAgfQogIF0sCiAgInByZWRpY2F0ZVR5cGUiOiAiaHR0cHM6Ly9tb2RlbF9zaWduaW5nL3NpZ25hdHVyZS92MS4wIiwKICAicHJlZGljYXRlIjogewogICAgInNlcmlhbGl6YXRpb24iOiB7CiAgICAgICJhbGxvd19zeW1saW5rcyI6IGZhbHNlLAogICAgICAiaWdub3JlX3BhdGhzIjogWwogICAgICAgICIuZ2l0aHViIiwKICAgICAgICAiLmdpdGF0dHJpYnV0ZXMiLAogICAgICAgICIuZ2l0IiwKICAgICAgICAiLmdpdGlnbm9yZSIKICAgICAgXSwKICAgICAgImhhc2hfdHlwZSI6ICJzaGEyNTYiLAogICAgICAibWV0aG9kIjogImZpbGVzIgogICAgfSwKICAgICJyZXNvdXJjZXMiOiBbCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiQkVOQ0hNQVJLLm1kIiwKICAgICAgICAiZGlnZXN0IjogIjNhZmNiZTk1OWYwYTE3MjJkYzA3OGM1NzA0OWJhNDZhMTc4NTExMTcyNjgxMDNmMTVmZjA4ZjUwOTFkZmFhOTMiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiU0tJTEwubWQiLAogICAgICAgICJkaWdlc3QiOiAiYWQ0NDk1ODMzMWM3MGM3NjEzNzFiMWQ1MTc5NGYxMDcyMDM1OGQ2YmMxNmNjOWU0YjM1ZGJjNzlmYWQ2NWM4OSIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvUkVBRE1FLm1kIiwKICAgICAgICAiZGlnZXN0IjogImE4M2NjZWIxMDFmZWIyODk1M2JlOWZhMDY4OWY3MzE3NDY3NDkxNGU2ZWNhYTJjZWE5M2RmMTAyZTAwMTE0ZmYiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiYXNzZXRzL2xwX2Jhc2ljL1JFQURNRS5tZCIsCiAgICAgICAgImRpZ2VzdCI6ICIxYzZlODllZWVlODhkZTdkMjk2OGM2ODRjZjhiNDViYTliZTBjMmU0MjQxZTA5NGYzMGY3MmM2NzAzNGYxZjdiIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9scF9iYXNpYy9jbGllbnQucHkiLAogICAgICAgICJkaWdlc3QiOiAiNmE2ZmY1MmZlYzVjOGZjMmQ1YzUyZjI4YjkwZDYzYjg1NWI0NTk1ZTg0NzFmZTVkMjhhNTA3MTkwMDA3NmVlYiIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbWlscF9iYXNpYy9SRUFETUUubWQiLAogICAgICAgICJkaWdlc3QiOiAiZmFhNGVlMTBhNjU4NTgzOWFlYjQ0OTJlMDc3MTM2MDM4ZWVlYjBiY2RlYmI5MmExOGIyNGVhYTVkZWQyZTY1OSIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvbWlscF9iYXNpYy9jbGllbnQucHkiLAogICAgICAgICJkaWdlc3QiOiAiZTZkY2VkMWVjNWRjNjcyZDMzYjI4M2UwOTJiMzkwNGE0ODcwYWUxMDVmYjE3ZTM5MDQzMGQ1ODNmNzI0MDlhNyIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvcGRwX2Jhc2ljL1JFQURNRS5tZCIsCiAgICAgICAgImRpZ2VzdCI6ICI1YzBiN2UzYzM1ZWIxMTFmOTI0NmQ0OWE4MDIyMTA4YjRkNGU0ZWUyODRiZWYyODNmNWFhMjEyMGZiYzNlZDBkIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogImFzc2V0cy9wZHBfYmFzaWMvY2xpZW50LnB5IiwKICAgICAgICAiZGlnZXN0IjogIjk4MWJjYTA5NTFhYzlkODUwMDc0YmNjMzA1YmE2ZjIxYTcwOTQ1ZjA4MGM4MjkwOTQ3Y2U3ODQwMjhiZTE5ZmUiCiAgICAgIH0sCiAgICAgIHsKICAgICAgICAiYWxnb3JpdGhtIjogInNoYTI1NiIsCiAgICAgICAgIm5hbWUiOiAiYXNzZXRzL3ZycF9iYXNpYy9SRUFETUUubWQiLAogICAgICAgICJkaWdlc3QiOiAiNjkyODA3NDQxM2RmZTFlYTQxNWJmMWRlZTc5Y2ViYzE4NjU0NmZlY2E4ZGM0MGZlZTFlNDJhMjk2NTFlNTE2NCIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJhc3NldHMvdnJwX2Jhc2ljL2NsaWVudC5weSIsCiAgICAgICAgImRpZ2VzdCI6ICI2M2QxZWI2ZGYwYzg0MTc3MDkzODA0YTY2MTg5ZmI2YWFlNTBhN2VhNGQ3Y2RiNzQyNWU3YTYxOWNjYzBiMTM2IgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogImFzc2V0cy92cnBfc2ltcGxlL1JFQURNRS5tZCIsCiAgICAgICAgImRpZ2VzdCI6ICI2ZWM0NWJiNWE1ZTBmMWExMjJmMjQxMTc5MTg3YzRlNjA4Y2JjYTg4ZDgwODFkYTQyMjkxNjRkMjgxMzE2YjVjIgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogImFzc2V0cy92cnBfc2ltcGxlL2NsaWVudC5weSIsCiAgICAgICAgImRpZ2VzdCI6ICJmN2UxYWU0OTYwN2M5NGUzYzgxOGIxNjkwMDZhMzgzNGM3NjJjMTU4ZmZjMmY0MzYyOTVkMTgwYzgyNTllZTU5IgogICAgICB9LAogICAgICB7CiAgICAgICAgImFsZ29yaXRobSI6ICJzaGEyNTYiLAogICAgICAgICJuYW1lIjogImV2YWxzL2V2YWxzLmpzb24iLAogICAgICAgICJkaWdlc3QiOiAiYjY5NTliYWIxMDNhNWFkM2M2ODY2NTdjZTBkNDVkNzllYWE4OTliNmYzYjk2ZDEwZDg3MjFiZmY4ZWYzNjcxOSIKICAgICAgfSwKICAgICAgewogICAgICAgICJhbGdvcml0aG0iOiAic2hhMjU2IiwKICAgICAgICAibmFtZSI6ICJza2lsbC1jYXJkLm1kIiwKICAgICAgICAiZGlnZXN0IjogIjUxZDZkYWExYTAyMDRlMzc0Njk2MzI5YjY4ODQxM2VmMWEzNjk4YTIwMTg1OTQzNmEwNGMzZTE0OGExZGE2MmUiCiAgICAgIH0KICAgIF0KICB9Cn0=","payloadType":"application/vnd.in-toto+json","signatures":[{"sig":"MGQCMD9XlXXfUjWnSotdcJo8X67QmnqfH2KPf3zBDiAKb7lVAglL8x8Jcy5BjiGmOwN4TAIwHwNJSUzG0ikdSCDIZ6+gO+fl6TjrOyfXngbDKegwc1cxfdLl6bz/avOpXngP7gii","keyid":""}]}}Related skills
FAQ
What does cuopt-server-api-python do?
cuOpt REST server — start server, endpoints, Python/curl client examples. Use when the user is deploying or calling the REST API.
When should I use cuopt-server-api-python?
During build integrations work for data science & ml.
Is cuopt-server-api-python safe to install?
Review the Security Audits panel on this listing before production use.