Skip to content

Commit 1287d43

Browse files
committed
chore: sync skills (CUDA-Q,DALI,DeepStream,Megatron-Bridge,Megatron-Core,Model-Optimizer,NeMo Evaluator,NeMo Gym,NeMo-Evaluator,NeMo-Evaluator-Launcher,NeMo-Gym,NeMo-RL,NemoClaw,Nemotron Voice Agent,RAG Blueprint,Skill Card Generator,TensorRT-LLM,TileGym,Video Search and Summarization,cuOpt,cuopt,nemotron-voice-agent,rag,video-search-and-summarization)
1 parent c6204c1 commit 1287d43

95 files changed

Lines changed: 24406 additions & 1 deletion

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

README.md

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -98,7 +98,9 @@ For non-interactive installs, global installs, agent-specific installs, updates,
9898
| Product | Description | Skills | Catalog | Source | Version |
9999
|---------|-------------|:------:|---------|--------|---------|
100100
| **AIQ** | NVIDIA AI-Q Blueprint - deploy local AI-Q services and run shallow or deep research workflows as agent skills. | 2 | [`skills/aiq-research/`](skills/aiq-research) | [Source](https://github.com/NVIDIA-AI-Blueprints/aiq/tree/develop/skills/aiq-research) | [`66b009e`](https://github.com/NVIDIA-AI-Blueprints/aiq/commit/66b009e3b28219eb2a09910c347d84c0675c2028) · 2026-05-27 |
101-
| **cuOpt** | GPU-accelerated optimization — vehicle routing, linear programming, quadratic programming, installation, server deployment, and developer tools. | 6 | [`skills/cuopt/`](skills/cuopt) | [Source](https://github.com/NVIDIA/cuopt/tree/main/skills) | [`d415bb6`](https://github.com/NVIDIA/cuopt/commit/d415bb6447a86cd268e824ef64ac05dcbc140ca0) · 2026-05-27 |
101+
| **cuOpt** | GPU-accelerated optimization — vehicle routing, linear programming, quadratic programming, installation, server deployment, and developer tools. | 10 | [`skills/cuopt/`](skills/cuopt) | [Source](https://github.com/NVIDIA/cuopt/tree/main/skills) | [`8e534f1`](https://github.com/NVIDIA/cuopt/commit/8e534f19c7f0ba20ba74196480f8a2b2f3fbe278) · 2026-05-28 |
102+
| **DeepStream** | Agentic skills for guided DeepStream development. | 2 | [`skills/deepstream/`](skills/deepstream) | [Source](https://github.com/NVIDIA-AI-IOT/DeepStream_Coding_Agent/tree/main/skills) | [`3daf16a`](https://github.com/NVIDIA-AI-IOT/DeepStream_Coding_Agent/commit/3daf16ae5168dd685608bb929fb4f5513f308045) · 2026-05-28 |
103+
| **Skill Card Generator** | Reads an agent skill's source files and produces a skill card plus a review table. Use when a skill directory exists and a governance card needs to be generated or updated. | 1 | [`skills/skill-card-generator/`](skills/skill-card-generator) | [Source](https://github.com/NVIDIA/Trustworthy-AI/tree/main/skills/skill-card-generator) | [`09b0d6b`](https://github.com/NVIDIA/Trustworthy-AI/commit/09b0d6b03ee587cc8672ad3133a4eb84aeadbd2a) · 2026-05-28 |
102104
<!-- skills-table-end -->
103105

104106
---
@@ -112,6 +114,8 @@ For skill-related issues, feature requests, new skill ideas, discussions, and co
112114
|---------|--------|-------------|--------------|----------|
113115
| **AIQ** | [Issues](https://github.com/NVIDIA-AI-Blueprints/aiq/issues) | [Discussions](https://github.com/NVIDIA-AI-Blueprints/aiq/discussions) | [Contributing](https://github.com/NVIDIA-AI-Blueprints/aiq/blob/develop/CONTRIBUTING.md) | [Security](https://github.com/NVIDIA-AI-Blueprints/aiq/blob/develop/SECURITY.md) |
114116
| **cuOpt** | [Issues](https://github.com/NVIDIA/cuopt/issues) | [Discussions](https://github.com/NVIDIA/cuopt/discussions) | [Contributing](https://github.com/NVIDIA/cuopt/blob/main/CONTRIBUTING.md) | [Security](https://github.com/NVIDIA/cuopt/blob/main/SECURITY.md) |
117+
| **DeepStream** | [Issues](https://github.com/NVIDIA-AI-IOT/DeepStream_Coding_Agent/issues) | [Discussions](https://github.com/NVIDIA-AI-IOT/DeepStream_Coding_Agent/discussions) | [Contributing](https://github.com/NVIDIA-AI-IOT/DeepStream_Coding_Agent/blob/main/CONTRIBUTING.md) | [Security](https://github.com/NVIDIA-AI-IOT/DeepStream_Coding_Agent/blob/main/SECURITY.md) |
118+
| **Skill Card Generator** | [Issues](https://github.com/NVIDIA/Trustworthy-AI/issues) | [Discussions](https://github.com/NVIDIA/Trustworthy-AI/discussions) | [Contributing](https://github.com/NVIDIA/Trustworthy-AI/blob/main/CONTRIBUTING.md) | [Security](https://github.com/NVIDIA/Trustworthy-AI/blob/main/SECURITY.md) |
115119
<!-- help-table-end -->
116120

117121
For issues with **this catalog repo itself** (README, structure, listing a new product): [open an issue here](../../issues).
Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,90 @@
1+
---
2+
name: cuopt-server-api-python
3+
version: "26.08.00"
4+
description: cuOpt REST server — start server, endpoints, Python/curl client examples. Use when the user is deploying or calling the REST API.
5+
license: Apache-2.0
6+
metadata:
7+
author: NVIDIA cuOpt Team
8+
tags:
9+
- cuopt
10+
- server
11+
- rest-api
12+
- python
13+
- deployment
14+
---
15+
16+
17+
# cuOpt Server — Deploy and client (Python/curl)
18+
19+
This skill covers **starting the server** and **client examples** (curl, Python). Server has no separate C API (clients can be any language).
20+
21+
## Start server
22+
23+
```bash
24+
# Development
25+
python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000
26+
27+
# Docker
28+
docker run --gpus all -d -p 8000:8000 -e CUOPT_SERVER_PORT=8000 \
29+
nvidia/cuopt:latest-cuda12.9-py3.13
30+
```
31+
32+
## Verify
33+
34+
```bash
35+
curl http://localhost:8000/cuopt/health
36+
```
37+
38+
## Workflow
39+
40+
1. POST to `/cuopt/request` → get `reqId`
41+
2. Poll `/cuopt/solution/{reqId}` until solution ready
42+
3. Parse response
43+
44+
## Python client (routing)
45+
46+
```python
47+
import requests, time
48+
SERVER = "http://localhost:8000"
49+
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
50+
payload = {
51+
"cost_matrix_data": {"data": {"0": [[0,10,15],[10,0,12],[15,12,0]]}},
52+
"travel_time_matrix_data": {"data": {"0": [[0,10,15],[10,0,12],[15,12,0]]}},
53+
"task_data": {"task_locations": [1, 2], "demand": [[10, 20]], "task_time_windows": [[0,100],[0,100]], "service_times": [5, 5]},
54+
"fleet_data": {"vehicle_locations": [[0, 0]], "capacities": [[50]], "vehicle_time_windows": [[0, 200]]},
55+
"solver_config": {"time_limit": 5}
56+
}
57+
r = requests.post(f"{SERVER}/cuopt/request", json=payload, headers=HEADERS)
58+
req_id = r.json()["reqId"]
59+
# Poll: GET /cuopt/solution/{req_id}
60+
```
61+
62+
## Terminology: REST vs Python API
63+
64+
| Python API | REST |
65+
|------------|------|
66+
| order_locations | task_locations |
67+
| set_order_time_windows() | task_time_windows |
68+
| service_times | service_times |
69+
70+
Use `travel_time_matrix_data` (not transit_time_matrix_data). Capacities: `[[50, 50]]` not `[[50], [50]]`.
71+
72+
## Debugging (422 / payload)
73+
74+
**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.
75+
76+
## Runnable assets
77+
78+
Run from each asset directory (server must be running; scripts exit 0 if server unreachable). All use Python `requests`:
79+
80+
- [assets/vrp_simple/](assets/vrp_simple/) — Basic VRP (no time windows)
81+
- [assets/vrp_basic/](assets/vrp_basic/) — VRP with time windows
82+
- [assets/pdp_basic/](assets/pdp_basic/) — Pickup and delivery
83+
- [assets/lp_basic/](assets/lp_basic/) — LP via REST (CSR format)
84+
- [assets/milp_basic/](assets/milp_basic/) — MILP via REST
85+
86+
See [assets/README.md](assets/README.md) for overview.
87+
88+
## Escalate
89+
90+
For contribution or build-from-source, see the developer skill.
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
# Server API Python — runnable assets
2+
3+
REST client examples (Python requests). Each runs against a cuOpt server; if the server is not reachable, the script exits 0 (skip).
4+
5+
| Asset | Description |
6+
|---------------|-------------|
7+
| `vrp_simple/` | Basic VRP (no time windows) |
8+
| `vrp_basic/` | VRP with time windows |
9+
| `pdp_basic/` | Pickup and delivery (pairs) |
10+
| `lp_basic/` | LP (CSR format) |
11+
| `milp_basic/` | MILP (integer + continuous variables) |
12+
13+
Start server: `python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000`
14+
Env: `CUOPT_SERVER_URL` (default `http://localhost:8000`).
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
# LP via REST (maximize 40x + 30y)
2+
3+
Submit an LP to the cuOpt server (CSR format) and poll for the solution.
4+
5+
**Requires:** cuOpt server running (e.g. `python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000`).
6+
7+
**Run:** `python client.py`
8+
If the server is not reachable, the script exits 0 (skip).
9+
10+
**Env:** `CUOPT_SERVER_URL` (default `http://localhost:8000`).
Lines changed: 84 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,84 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
"""
5+
REST client: LP request (maximize 40x + 30y s.t. 2x+3y<=240, 4x+2y<=200). Requires cuOpt server running.
6+
7+
Usage: python client.py
8+
Set CUOPT_SERVER_URL (default http://localhost:8000). Exits 0 if server unreachable (e.g. in CI without server).
9+
"""
10+
11+
import os
12+
import sys
13+
import time
14+
15+
import requests
16+
17+
SERVER = os.environ.get("CUOPT_SERVER_URL", "http://localhost:8000")
18+
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
19+
20+
21+
def server_ok():
22+
try:
23+
r = requests.get(f"{SERVER}/cuopt/health", timeout=2)
24+
return r.status_code == 200
25+
except Exception:
26+
return False
27+
28+
29+
def main():
30+
if not server_ok():
31+
print(
32+
"Server not running, skipping. Start with: python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000"
33+
)
34+
sys.exit(0)
35+
36+
payload = {
37+
"csr_constraint_matrix": {
38+
"offsets": [0, 2, 4],
39+
"indices": [0, 1, 0, 1],
40+
"values": [2.0, 3.0, 4.0, 2.0],
41+
},
42+
"constraint_bounds": {
43+
"upper_bounds": [240.0, 200.0],
44+
"lower_bounds": ["ninf", "ninf"],
45+
},
46+
"objective_data": {
47+
"coefficients": [40.0, 30.0],
48+
},
49+
"variable_bounds": {
50+
"upper_bounds": ["inf", "inf"],
51+
"lower_bounds": [0.0, 0.0],
52+
},
53+
"maximize": True,
54+
"solver_config": {
55+
"time_limit": 60,
56+
},
57+
}
58+
59+
response = requests.post(
60+
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
61+
)
62+
response.raise_for_status()
63+
req_id = response.json()["reqId"]
64+
print(f"Submitted: {req_id}")
65+
66+
for _ in range(30):
67+
response = requests.get(
68+
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
69+
)
70+
result = response.json()
71+
72+
if "response" in result:
73+
print(f"Status: {result['response'].get('status')}")
74+
print(f"Objective: {result['response'].get('objective_value')}")
75+
print(f"Solution: {result['response'].get('primal_solution')}")
76+
return
77+
time.sleep(1)
78+
79+
print("Timeout waiting for solution")
80+
sys.exit(1)
81+
82+
83+
if __name__ == "__main__":
84+
main()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# MILP via REST
2+
3+
Same problem as LP (maximize 40x + 30y, 2x+3y≤240, 4x+2y≤200) with `variable_types`: first variable integer, second continuous.
4+
5+
**Requires:** cuOpt server running. **Run:** `python client.py` (exits 0 if server unreachable).
6+
**Env:** `CUOPT_SERVER_URL` (default `http://localhost:8000`). Variable types: `continuous`, `integer`, `binary`.
Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
# SPDX-FileCopyrightText: Copyright (c) 2026, NVIDIA CORPORATION & AFFILIATES. All rights reserved.
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
"""
5+
REST client: MILP (same constraints as LP but variable_types: integer, continuous).
6+
Requires cuOpt server running. Exits 0 if server unreachable.
7+
"""
8+
9+
import os
10+
import sys
11+
import time
12+
13+
import requests
14+
15+
SERVER = os.environ.get("CUOPT_SERVER_URL", "http://localhost:8000")
16+
HEADERS = {"Content-Type": "application/json", "CLIENT-VERSION": "custom"}
17+
18+
19+
def server_ok():
20+
try:
21+
r = requests.get(f"{SERVER}/cuopt/health", timeout=2)
22+
return r.status_code == 200
23+
except Exception:
24+
return False
25+
26+
27+
def main():
28+
if not server_ok():
29+
print(
30+
"Server not running, skipping. Start with: python -m cuopt_server.cuopt_service --ip 0.0.0.0 --port 8000"
31+
)
32+
sys.exit(0)
33+
34+
payload = {
35+
"csr_constraint_matrix": {
36+
"offsets": [0, 2, 4],
37+
"indices": [0, 1, 0, 1],
38+
"values": [2.0, 3.0, 4.0, 2.0],
39+
},
40+
"constraint_bounds": {
41+
"upper_bounds": [240.0, 200.0],
42+
"lower_bounds": ["ninf", "ninf"],
43+
},
44+
"objective_data": {"coefficients": [40.0, 30.0]},
45+
"variable_bounds": {
46+
"upper_bounds": ["inf", "inf"],
47+
"lower_bounds": [0.0, 0.0],
48+
},
49+
"variable_types": ["integer", "continuous"],
50+
"maximize": True,
51+
"solver_config": {
52+
"time_limit": 120,
53+
"tolerances": {"mip_relative_gap": 0.01},
54+
},
55+
}
56+
57+
response = requests.post(
58+
f"{SERVER}/cuopt/request", json=payload, headers=HEADERS
59+
)
60+
response.raise_for_status()
61+
req_id = response.json()["reqId"]
62+
print(f"Submitted: {req_id}")
63+
64+
for _ in range(60):
65+
response = requests.get(
66+
f"{SERVER}/cuopt/solution/{req_id}", headers=HEADERS
67+
)
68+
result = response.json()
69+
70+
if "response" in result:
71+
print(f"Status: {result['response'].get('status')}")
72+
print(f"Objective: {result['response'].get('objective_value')}")
73+
print(f"Solution: {result['response'].get('primal_solution')}")
74+
return
75+
time.sleep(1)
76+
77+
print("Timeout waiting for solution")
78+
sys.exit(1)
79+
80+
81+
if __name__ == "__main__":
82+
main()
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Pickup and delivery (PDP)
2+
3+
Pickup-delivery pairs: (0,1) and (2,3). Pickup must be visited before the corresponding delivery.
4+
5+
**Requires:** cuOpt server running. **Run:** `python client.py` (exits 0 if server unreachable).
6+
**Env:** `CUOPT_SERVER_URL` (default `http://localhost:8000`).

0 commit comments

Comments
 (0)