Skip to content

Commit 88eb9a0

Browse files
nv-kasikritcliveaverageOpenShell-Community Dev
authored
feat: openshell improvements (#33)
* Add rebrand for welcome UI, include launch.sh script * Remove BASH_SOURCE dependency * Address silent fail on launch.sh * Add favicon, handle ghcr.io login if params present, fix logo * Init LiteLLM implementation * LiteLLM working * Update welcome UI icon assets * Add on-demand nemoclaw build; improve auto-pair * Logo fixup, improve auto-approve cycle, NO_PROXY for localhost * Bump defualt context window, set NO_PROXY widely * Extend timer for device auto approval, minimize wait * Reload dashboard once after pairing approval * Revert nemoclaw runtime back to inference.local * Keep pairing watcher alive until approval * Add proxy request tracing for sandbox launch * Add override to skip nemoclaw image build * Add revised policy and NO_PROXY * Fix unconditional chown * Added guarded reload for pairing; ensure custom policy.yaml bake-in * Add console logging for device pairing; extend NO_PROXY * Handle context mod for inference.local * Fix k3s image import on build; force reload on first pass timeout * Revise Brev README * Cleanup Brev section * Revert policy.yaml to orig * Added policy recommender * nemoclaw: inference UX overhaul, inline API keys, partner logos, denial watcher, preview tooling Made-with: Cursor --------- Co-authored-by: JR Morgan <liveaverage@gmail.com> Co-authored-by: OpenShell-Community Dev <dev@openshell-community.local>
1 parent b72a4ec commit 88eb9a0

34 files changed

+3853
-482
lines changed

.gitignore

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
node_modules/
2-
AGENTS.md
2+
AGENTS.md

brev/launch.sh

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -568,12 +568,12 @@
568568
set_inference_route() {
569569
log "Configuring inference route..."
570570

571-
if "$CLI_BIN" inference set --provider nvidia-endpoints --model qwen/qwen3.5-397b-a17b >/dev/null 2>&1; then
571+
if "$CLI_BIN" inference set --provider nvidia-endpoints --model minimaxai/minimax-m2.5 >/dev/null 2>&1; then
572572
log "Configured inference via '$CLI_BIN inference set'."
573573
return
574574
fi
575575

576-
if "$CLI_BIN" cluster inference set --provider nvidia-endpoints --model qwen/qwen3.5-397b-a17b >/dev/null 2>&1; then
576+
if "$CLI_BIN" cluster inference set --provider nvidia-endpoints --model minimaxai/minimax-m2.5 >/dev/null 2>&1; then
577577
log "Configured inference via legacy '$CLI_BIN cluster inference set'."
578578
return
579579
fi
@@ -706,12 +706,6 @@
706706
import_nemoclaw_image_into_cluster_if_needed
707707

708708
step "Configuring providers"
709-
run_provider_create_or_replace \
710-
nvidia-inference \
711-
--type openai \
712-
--credential OPENAI_API_KEY=unused \
713-
--config OPENAI_BASE_URL=https://inference-api.nvidia.com/v1
714-
715709
run_provider_create_or_replace \
716710
nvidia-endpoints \
717711
--type nvidia \

brev/welcome-ui/SERVER_ARCHITECTURE.md

Lines changed: 21 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,6 @@ main()
148148
├── 1. _bootstrap_config_cache()
149149
│ If /tmp/nemoclaw-provider-config-cache.json does NOT exist:
150150
│ Write defaults for:
151-
│ - nvidia-inference → OPENAI_BASE_URL=https://inference-api.nvidia.com/v1
152151
│ - nvidia-endpoints → NVIDIA_BASE_URL=https://integrate.api.nvidia.com/v1
153152
│ If it already exists: skip (no-op)
154153
@@ -436,13 +435,12 @@ Step 10: Cleanup temp policy file
436435
```
437436
Step 1: Log receipt (hash prefix)
438437
Step 2: Run CLI command:
439-
nemoclaw provider update nvidia-inference \
440-
--type openai \
441-
--credential OPENAI_API_KEY=<key> \
442-
--config OPENAI_BASE_URL=https://inference-api.nvidia.com/v1
438+
nemoclaw provider update nvidia-endpoints \
439+
--credential NVIDIA_API_KEY=<key> \
440+
--config NVIDIA_BASE_URL=https://integrate.api.nvidia.com/v1
443441
Timeout: 120s
444442
Step 3: If success:
445-
- Cache config {"OPENAI_BASE_URL": "https://inference-api.nvidia.com/v1"} under name "nvidia-inference"
443+
- Cache config under name "nvidia-endpoints"
446444
- State → "done"
447445
If failure:
448446
- State → "error" with stderr/stdout message
@@ -537,10 +535,10 @@ Step 3: Merge with config cache values
537535
The CLI outputs text like:
538536
```
539537
Id: abc-123
540-
Name: nvidia-inference
541-
Type: openai
542-
Credential keys: OPENAI_API_KEY
543-
Config keys: OPENAI_BASE_URL
538+
Name: nvidia-endpoints
539+
Type: nvidia
540+
Credential keys: NVIDIA_API_KEY
541+
Config keys: NVIDIA_BASE_URL
544542
```
545543

546544
Parsing rules:
@@ -560,11 +558,11 @@ After parsing, if the provider name has an entry in the config cache, a `configV
560558
"providers": [
561559
{
562560
"id": "abc-123",
563-
"name": "nvidia-inference",
564-
"type": "openai",
565-
"credentialKeys": ["OPENAI_API_KEY"],
566-
"configKeys": ["OPENAI_BASE_URL"],
567-
"configValues": {"OPENAI_BASE_URL": "https://inference-api.nvidia.com/v1"}
561+
"name": "nvidia-endpoints",
562+
"type": "nvidia",
563+
"credentialKeys": ["NVIDIA_API_KEY"],
564+
"configKeys": ["NVIDIA_BASE_URL"],
565+
"configValues": {"NVIDIA_BASE_URL": "https://integrate.api.nvidia.com/v1"}
568566
}
569567
]
570568
}
@@ -671,7 +669,7 @@ nemoclaw cluster inference get
671669

672670
**Output Parsing (`_parse_cluster_inference`):**
673671
```
674-
Provider: nvidia-inference
672+
Provider: nvidia-endpoints
675673
Model: meta/llama-3.1-70b-instruct
676674
Version: 2
677675
```
@@ -688,7 +686,7 @@ Version: 2
688686
```json
689687
{
690688
"ok": true,
691-
"providerName": "nvidia-inference",
689+
"providerName": "nvidia-endpoints",
692690
"modelId": "meta/llama-3.1-70b-instruct",
693691
"version": 2
694692
}
@@ -703,7 +701,7 @@ Version: 2
703701
**Request Body:**
704702
```json
705703
{
706-
"providerName": "nvidia-inference",
704+
"providerName": "nvidia-endpoints",
707705
"modelId": "meta/llama-3.1-70b-instruct"
708706
}
709707
```
@@ -721,7 +719,7 @@ nemoclaw cluster inference set --provider <name> --model <model>
721719
```json
722720
{
723721
"ok": true,
724-
"providerName": "nvidia-inference",
722+
"providerName": "nvidia-endpoints",
725723
"modelId": "meta/llama-3.1-70b-instruct",
726724
"version": 3
727725
}
@@ -925,7 +923,7 @@ The `nemoclaw provider get` CLI only returns config **key names**, not their val
925923
- Read on every `GET /api/providers` request
926924
- Written on every `POST` (create) and `PUT` (update) that includes config values
927925
- Cleaned up on `DELETE`
928-
- Bootstrapped at server startup with a default for `nvidia-inference`
926+
- Bootstrapped at server startup with a default for `nvidia-endpoints`
929927
930928
---
931929
@@ -948,8 +946,8 @@ Output is parsed the same way as provider detail (line-by-line, prefix matching,
948946
**Format:**
949947
```json
950948
{
951-
"nvidia-inference": {
952-
"OPENAI_BASE_URL": "https://inference-api.nvidia.com/v1"
949+
"nvidia-endpoints": {
950+
"NVIDIA_BASE_URL": "https://integrate.api.nvidia.com/v1"
953951
},
954952
"my-custom-provider": {
955953
"CUSTOM_URL": "https://example.com"
@@ -1237,7 +1235,7 @@ This means it uses a local sandbox name rather than a container image reference.
12371235

12381236
### 18.10 Inject Key Hardcodes Provider Name
12391237

1240-
The `_run_inject_key` function hardcodes `nvidia-inference` as the provider name. This is not configurable via the API.
1238+
The `_run_inject_key` function hardcodes `nvidia-endpoints` as the provider name. This is not configurable via the API.
12411239

12421240
### 18.11 Error State Truncation
12431241

brev/welcome-ui/__tests__/cli-parsing.test.js

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ describe("parseProviderDetail", () => {
3333
const result = parseProviderDetail(FIXTURES.providerGetOutput);
3434
expect(result).toEqual({
3535
id: "abc-123",
36-
name: "nvidia-inference",
36+
name: "nvidia-endpoints",
3737
type: "openai",
3838
credentialKeys: ["OPENAI_API_KEY"],
3939
configKeys: ["OPENAI_BASE_URL"],
@@ -63,7 +63,7 @@ describe("parseProviderDetail", () => {
6363
it("TC-CL09: ANSI codes in output are stripped before parsing", () => {
6464
const result = parseProviderDetail(FIXTURES.providerGetAnsi);
6565
expect(result).not.toBeNull();
66-
expect(result.name).toBe("nvidia-inference");
66+
expect(result.name).toBe("nvidia-endpoints");
6767
expect(result.type).toBe("openai");
6868
});
6969
});
@@ -72,7 +72,7 @@ describe("parseClusterInference", () => {
7272
it("TC-CL10: parses Provider, Model, Version lines", () => {
7373
const result = parseClusterInference(FIXTURES.clusterInferenceOutput);
7474
expect(result).toEqual({
75-
providerName: "nvidia-inference",
75+
providerName: "nvidia-endpoints",
7676
modelId: "meta/llama-3.1-70b-instruct",
7777
version: 2,
7878
});

brev/welcome-ui/__tests__/cluster-inference.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ describe("GET /api/cluster-inference", () => {
4040
const res = await request(server).get("/api/cluster-inference");
4141
expect(res.status).toBe(200);
4242
expect(res.body.ok).toBe(true);
43-
expect(res.body.providerName).toBe("nvidia-inference");
43+
expect(res.body.providerName).toBe("nvidia-endpoints");
4444
expect(res.body.modelId).toBe("meta/llama-3.1-70b-instruct");
4545
expect(res.body.version).toBe(2);
4646
});
@@ -95,7 +95,7 @@ describe("GET /api/cluster-inference", () => {
9595

9696
const res = await request(server).get("/api/cluster-inference");
9797
expect(res.status).toBe(200);
98-
expect(res.body.providerName).toBe("nvidia-inference");
98+
expect(res.body.providerName).toBe("nvidia-endpoints");
9999
expect(res.body.modelId).toBe("meta/llama-3.1-70b-instruct");
100100
});
101101
});

brev/welcome-ui/__tests__/config-cache.test.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ describe("config cache", () => {
1919
bootstrapConfigCache();
2020
const cache = readCacheFile();
2121
expect(cache).not.toBeNull();
22-
expect(cache["nvidia-inference"]).toBeDefined();
22+
expect(cache["nvidia-endpoints"]).toBeDefined();
2323
});
2424

2525
it("TC-CC02: bootstrapConfigCache is no-op when file already exists", () => {
@@ -29,13 +29,10 @@ describe("config cache", () => {
2929
expect(cache).toEqual({ custom: { x: 1 } });
3030
});
3131

32-
it("TC-CC03: default bootstrap content seeds both NVIDIA inference providers", () => {
32+
it("TC-CC03: default bootstrap content seeds NVIDIA endpoints provider", () => {
3333
bootstrapConfigCache();
3434
const cache = readCacheFile();
3535
expect(cache).toEqual({
36-
"nvidia-inference": {
37-
OPENAI_BASE_URL: "https://inference-api.nvidia.com/v1",
38-
},
3936
"nvidia-endpoints": {
4037
NVIDIA_BASE_URL: "https://integrate.api.nvidia.com/v1",
4138
},

brev/welcome-ui/__tests__/inject-key.test.js

Lines changed: 3 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -145,7 +145,7 @@ describe("inject-key background process", () => {
145145
execFile.mockClear();
146146
});
147147

148-
it("TC-K10: updates both default inference providers with the submitted key", async () => {
148+
it("TC-K10: updates default NVIDIA endpoints provider with the submitted key", async () => {
149149
execFile.mockImplementation((cmd, args, opts, cb) => {
150150
if (typeof opts === "function") { cb = opts; opts = {}; }
151151
cb(null, "", "");
@@ -161,15 +161,9 @@ describe("inject-key background process", () => {
161161
const updateCalls = execFile.mock.calls.filter(
162162
(c) => c[0] === "nemoclaw" && c[1]?.includes("update")
163163
);
164-
expect(updateCalls.length).toBeGreaterThanOrEqual(2);
164+
expect(updateCalls.length).toBeGreaterThanOrEqual(1);
165165

166-
const inferenceArgs = updateCalls.find((c) => c[1].includes("nvidia-inference"))?.[1] || [];
167166
const endpointsArgs = updateCalls.find((c) => c[1].includes("nvidia-endpoints"))?.[1] || [];
168-
169-
expect(inferenceArgs).toContain("nvidia-inference");
170-
expect(inferenceArgs.some((a) => a.startsWith("OPENAI_API_KEY="))).toBe(true);
171-
expect(inferenceArgs.some((a) => a.includes("inference-api.nvidia.com"))).toBe(true);
172-
173167
expect(endpointsArgs).toContain("nvidia-endpoints");
174168
expect(endpointsArgs.some((a) => a.startsWith("NVIDIA_API_KEY="))).toBe(true);
175169
expect(endpointsArgs.some((a) => a.includes("integrate.api.nvidia.com"))).toBe(true);
@@ -245,7 +239,7 @@ describe("key hashing", () => {
245239
expect(hashKey("abc")).toBe(hashKey("abc"));
246240
});
247241

248-
it("TC-K16: provider updates cover both nvidia-inference and nvidia-endpoints", async () => {
242+
it("TC-K16: provider updates cover nvidia-endpoints", async () => {
249243
execFile.mockImplementation((cmd, args, opts, cb) => {
250244
if (typeof opts === "function") { cb = opts; opts = {}; }
251245
cb(null, "", "");
@@ -260,7 +254,6 @@ describe("key hashing", () => {
260254
const updateCalls = execFile.mock.calls.filter(
261255
(c) => c[0] === "nemoclaw" && c[1]?.includes("update")
262256
);
263-
expect(updateCalls.some((c) => c[1].includes("nvidia-inference"))).toBe(true);
264257
expect(updateCalls.some((c) => c[1].includes("nvidia-endpoints"))).toBe(true);
265258
});
266259
});

brev/welcome-ui/__tests__/providers.test.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ describe("GET /api/providers", () => {
4141
execFile.mockImplementation((cmd, args, opts, cb) => {
4242
if (typeof opts === "function") { cb = opts; opts = {}; }
4343
if (args?.[1] === "list") {
44-
return cb(null, "nvidia-inference\n", "");
44+
return cb(null, "nvidia-endpoints\n", "");
4545
}
4646
if (args?.[1] === "get") {
4747
return cb(null, FIXTURES.providerGetOutput, "");
@@ -54,7 +54,7 @@ describe("GET /api/providers", () => {
5454
expect(res.body.ok).toBe(true);
5555
expect(Array.isArray(res.body.providers)).toBe(true);
5656
expect(res.body.providers.length).toBe(1);
57-
expect(res.body.providers[0].name).toBe("nvidia-inference");
57+
expect(res.body.providers[0].name).toBe("nvidia-endpoints");
5858
});
5959

6060
it("TC-PR02: provider list CLI failure returns 502", async () => {

brev/welcome-ui/__tests__/setup.js

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,11 @@ function readCacheFile() {
3535
// CLI output fixtures matching the nemoclaw CLI text format
3636

3737
const FIXTURES = {
38-
providerListOutput: "nvidia-inference\ncustom-provider\n",
38+
providerListOutput: "nvidia-endpoints\ncustom-provider\n",
3939

4040
providerGetOutput: [
4141
"Id: abc-123",
42-
"Name: nvidia-inference",
42+
"Name: nvidia-endpoints",
4343
"Type: openai",
4444
"Credential keys: OPENAI_API_KEY",
4545
"Config keys: OPENAI_BASE_URL",
@@ -55,19 +55,19 @@ const FIXTURES = {
5555

5656
providerGetAnsi:
5757
"\x1b[32mId:\x1b[0m abc-123\n" +
58-
"\x1b[32mName:\x1b[0m nvidia-inference\n" +
58+
"\x1b[32mName:\x1b[0m nvidia-endpoints\n" +
5959
"\x1b[32mType:\x1b[0m openai\n" +
6060
"\x1b[32mCredential keys:\x1b[0m OPENAI_API_KEY\n" +
6161
"\x1b[32mConfig keys:\x1b[0m OPENAI_BASE_URL\n",
6262

6363
clusterInferenceOutput: [
64-
"Provider: nvidia-inference",
64+
"Provider: nvidia-endpoints",
6565
"Model: meta/llama-3.1-70b-instruct",
6666
"Version: 2",
6767
].join("\n"),
6868

6969
clusterInferenceAnsi:
70-
"\x1b[1;34mProvider:\x1b[0m nvidia-inference\n" +
70+
"\x1b[1;34mProvider:\x1b[0m nvidia-endpoints\n" +
7171
"\x1b[1;34mModel:\x1b[0m meta/llama-3.1-70b-instruct\n" +
7272
"\x1b[1;34mVersion:\x1b[0m 2\n",
7373

0 commit comments

Comments
 (0)