ur-agent 1.84.0 → 1.84.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -80,7 +80,7 @@ Inside an interactive session:
80
80
 
81
81
  | Trend | UR status | Current coverage | Professional next step |
82
82
  | --- | --- | --- | --- |
83
- | Provider-flexible, local-first runtime | Covered | Local Ollama; direct OpenAI, Anthropic, Gemini, OpenRouter, and OpenAI-compatible APIs; authenticated subscription-CLI adapters; explicit provider selection | Normalize capability discovery across providers and make automatic per-step routing opt-in |
83
+ | Provider-flexible, local-first runtime | Covered | Local Ollama; direct OpenAI, Anthropic, Gemini, OpenRouter, NVIDIA NIM, and OpenAI-compatible APIs; authenticated subscription-CLI adapters; explicit provider selection | Normalize capability discovery across providers and make automatic per-step routing opt-in |
84
84
  | Model Context Protocol ecosystem | Covered | Stable TypeScript SDK v2 split client/server/core runtime; `ur mcp`, OAuth/XAA, fail-closed bounded tools, final `input_required` continuation, all workspace roots with change notifications, and the opt-in stateless web server | Broaden independent-client interoperability fixtures |
85
85
  | Protocol Tasks and Apps | Covered | Negotiated Tasks lifecycle, owner-isolated durable state, and a self-contained Apps resource through `ur mcp serve-web` | Broaden independent-client interoperability fixtures |
86
86
  | A2A / Agent Card interoperability | Covered | Stable official v1.1 SDK, native ProtoJSON JSON-RPC/HTTP+JSON, SSE streaming, task resubscription, authenticated push delivery with validated destinations, negotiated cards, tenant isolation, durable artifacts, and explicit v0.3 compatibility | Broaden independent-client/TCK fixtures; keep gRPC and extended cards unadvertised until deployed and tested |
@@ -168,7 +168,7 @@ compatibility transport rather than relabeling either wire schema.
168
168
  ## Model Runtime Position
169
169
 
170
170
  UR is local-first, not local-only. Ollama supports private on-device execution;
171
- direct adapters support OpenAI, Anthropic, Gemini, OpenRouter, and compatible
171
+ direct adapters support OpenAI, Anthropic, Gemini, OpenRouter, NVIDIA NIM, and compatible
172
172
  endpoints; subscription adapters use the provider's authenticated CLI. Provider
173
173
  and model selection are explicit, credentials are resolved through the
174
174
  credential layer, and the optional fallback setting is diagnostic advice rather
@@ -88,7 +88,7 @@ receives general-purpose tools through this path.
88
88
 
89
89
  UR-Nexus supports official provider access paths only:
90
90
 
91
- - Explicit API providers: OpenAI, Anthropic, Gemini, OpenRouter, and
91
+ - Explicit API providers: OpenAI, Anthropic, Gemini, OpenRouter, NVIDIA NIM, and
92
92
  OpenAI-compatible endpoints.
93
93
  - Local/server providers: Ollama, LM Studio, llama.cpp, vLLM, and Unsloth OpenAI-compatible
94
94
  server mode.
@@ -132,6 +132,7 @@ ur config set provider openai-api
132
132
  ur config set provider anthropic-api
133
133
  ur config set provider gemini-api
134
134
  ur config set provider openrouter
135
+ ur config set provider nvidia-nim
135
136
  ur config set provider openai-compatible
136
137
  ur config set provider unsloth
137
138
  ur provider doctor agy
@@ -147,7 +148,7 @@ When the active provider fails, `ur provider doctor` shows the configured
147
148
  recovery command; changing providers remains an explicit user action.
148
149
 
149
150
  Provider values accept canonical IDs and common aliases. Examples:
150
- `openai-api`, `anthropic-api`, `gemini-api`, `openrouter`, `ollama`,
151
+ `openai-api`, `anthropic-api`, `gemini-api`, `openrouter`, `nvidia-nim` (`NVIDIA Build`), `ollama`,
151
152
  `lmstudio`, `LM Studio`, `llama.cpp`, `vllm`, `unsloth` (`Unsloth Studio`), and the subscription CLI
152
153
  providers `codex-cli` (`chatgpt`), `claude-code-cli` (`claude`), `gemini-cli`
153
154
  (`gemini`), and `antigravity-cli` (`agy`). Values with spaces should be quoted
@@ -162,35 +163,40 @@ saved provider/model pair controls the runtime backend for the next agent
162
163
  request; Ollama is only used when `ollama` is the selected provider.
163
164
 
164
165
  The configured `base_url` is provider-scoped. Setting an address while vLLM is
165
- active does not replace the saved Ollama, llama.cpp, or Unsloth address;
166
+ active does not replace the saved Ollama, llama.cpp, Unsloth, or NVIDIA NIM address;
166
167
  returning to any provider restores its own URL. Legacy `provider.baseUrl`
167
168
  settings are migrated to the old active provider on the first provider switch
168
169
  or scoped base-URL write.
169
170
  To configure a provider that is not active, use
170
171
  `ur config set base_url <provider> <url>`; the success message names the target
171
172
  provider. This applies to direct API providers and gateways (OpenAI, Anthropic,
172
- Gemini, and OpenRouter) as well as local/server providers; built-in vendor URLs
173
+ Gemini, OpenRouter, and NVIDIA NIM) as well as local/server providers; built-in vendor URLs
173
174
  are fallbacks only. Discovery, doctor output, and request dispatch all resolve
174
175
  the same per-provider override. `/model` also opens an endpoint field when a
175
176
  disconnected local/server provider is selected.
176
177
 
177
178
  In the model step, Up/Down browses, Left/Right changes the focused model's
178
- supported effort level, Enter confirms, Ctrl+R refreshes the catalog, and Esc
179
- returns to providers. OpenRouter entries show pricing tier, context size,
179
+ supported effort level, Enter confirms, Ctrl+R refreshes the catalog, `E`
180
+ edits the provider endpoint, `K` adds or replaces its API key, and Esc returns
181
+ to providers. OpenRouter entries show pricing tier, context size,
180
182
  tool/reasoning capability, compact names, and the exact ID for the focused
181
183
  entry. Its endpoint-scoped catalog is reused for five minutes, while Ctrl+R
182
184
  forces an immediate live refresh; a failed forced refresh never silently
183
185
  displays cached entries. API-provider secret
184
186
  entry stays on one masked row and stores the value through the keychain flow.
185
- Ollama and llama.cpp capabilities are loaded lazily for the focused model from
186
- `/api/show` and `/props`, respectively, so the arrow selector reflects the
187
- actual model rather than a provider-wide guess.
187
+ Ollama, llama.cpp, and vLLM capabilities are loaded lazily for the focused
188
+ model from `/api/show`, `/props`, and `/server_info?config_format=json`,
189
+ respectively, so the arrow selector reflects live runtime evidence rather than
190
+ a provider-wide guess. llama.cpp's current boolean support flag does not name
191
+ accepted levels, while a configured vLLM reasoning parser exposes its
192
+ documented `minimal→none|low|medium|high` mapping.
188
193
 
189
194
  The effort row contains only capability-backed selectors UR can map to native
190
195
  provider values. Ultra appears only when metadata advertises `ultra`, `max`,
191
196
  `xhigh`, or an explicit alias; mappings such as `ultra→max` are shown and sent
192
- exactly. Models that top out at `high`, boolean-thinking models, and unknown
193
- capabilities omit Ultra. See [Reasoning effort](providers.md#reasoning-effort).
197
+ exactly. Models that top out at `high`, models without an advertised
198
+ beyond-high value, and unknown capabilities omit Ultra. See
199
+ [Reasoning effort](providers.md#reasoning-effort).
194
200
 
195
201
  Boolean-thinking models on runtimes with a native toggle expose a two-state
196
202
  control instead: Left selects off, Right selects on, and `t` toggles in
@@ -226,6 +232,7 @@ OPENAI_COMPATIBLE_API_KEY=...
226
232
  ANTHROPIC_API_KEY=...
227
233
  GEMINI_API_KEY=...
228
234
  OPENROUTER_API_KEY=...
235
+ NVIDIA_API_KEY=...
229
236
  OLLAMA_API_KEY=... # optional for authenticated Ollama gateways
230
237
  LMSTUDIO_API_KEY=... # optional when required by the endpoint
231
238
  LLAMA_CPP_API_KEY=... # optional when required by the endpoint
@@ -233,6 +240,13 @@ VLLM_API_KEY=... # optional when required by the endpoint
233
240
  UNSLOTH_API_KEY=...
234
241
  ```
235
242
 
243
+ NVIDIA NIM defaults to `https://integrate.api.nvidia.com/v1`, discovers the
244
+ connected account's models live, and accepts a provider-scoped override for an
245
+ enterprise or self-hosted NIM. Generic `openai-compatible` authentication is
246
+ optional: `ur connect openai-compatible` or the picker's `K` key stores a
247
+ credential when the chosen gateway needs one, without breaking anonymous
248
+ local endpoints.
249
+
236
250
  Unsloth is an inference-provider integration only. Start Unsloth Studio and
237
251
  load the model outside UR, connect its generated key with `ur connect unsloth`,
238
252
  then select a model discovered from `http://localhost:8888/v1` (or your
@@ -500,6 +514,15 @@ before the agent can declare the task complete. A failing command surfaces
500
514
  to the model as a structured reminder with the command name and the trimmed
501
515
  stdout/stderr.
502
516
 
517
+ ## Shell command deadlines
518
+
519
+ Set the Bash tool's `timeout` input in milliseconds for a whole-command
520
+ deadline. If a generated command uses the common Linux form `timeout 60 cmd`,
521
+ UR also makes that command work on macOS: it uses Homebrew `gtimeout` when
522
+ installed, otherwise supplies an in-process compatibility implementation with
523
+ process-group cleanup and GNU-style status 124 on expiry. No package install or
524
+ shell-profile change is required. Native Linux `timeout` remains untouched.
525
+
503
526
  ## Project Safety Policy
504
527
 
505
528
  `ur safety` exposes the project shell safety policy:
@@ -200,10 +200,16 @@ ur provider doctor <provider-id>
200
200
  curl http://localhost:11434/api/tags # Ollama
201
201
  curl http://localhost:1234/v1/models # LM Studio (llama.cpp: 8080, vLLM: 8000)
202
202
  curl -H "Authorization: Bearer $UNSLOTH_API_KEY" http://localhost:8888/v1/models
203
+ curl -H "Authorization: Bearer $NVIDIA_API_KEY" https://integrate.api.nvidia.com/v1/models
203
204
  ur connect openai-api # store an API key securely
204
205
  ur provider doctor
205
206
  ```
206
207
 
208
+ For an authenticated generic gateway, run `ur connect openai-compatible` or
209
+ press `K` on its `/model` screen; the key is optional and stored separately
210
+ from `OPENAI_API_KEY`. NVIDIA NIM uses `ur connect nvidia-nim` and keeps any
211
+ custom `base_url` scoped to that provider.
212
+
207
213
  ### Unsloth is selected but unavailable
208
214
 
209
215
  - Likely cause: Studio is not running, no model is loaded, its generated API
package/docs/USAGE.md CHANGED
@@ -207,7 +207,7 @@ Use `ur provider status` or `ur provider doctor <provider>` to see provider
207
207
  kind, external CLI usage, native tool/streaming support, and the boundary text.
208
208
 
209
209
  Provider values accept canonical IDs and common aliases. For example,
210
- `openai-api`, `anthropic-api`, `gemini-api`, `openrouter`, `ollama`,
210
+ `openai-api`, `anthropic-api`, `gemini-api`, `openrouter`, `nvidia-nim`, `ollama`,
211
211
  `lmstudio`, `llama.cpp`, `vllm`, and `unsloth` are UR-native runtime providers, and
212
212
  `codex-cli` (`chatgpt`), `claude-code-cli` (`claude`), `gemini-cli` (`gemini`),
213
213
  and `antigravity-cli` (`agy`) are subscription CLI providers.
@@ -215,7 +215,7 @@ and `antigravity-cli` (`agy`) are subscription CLI providers.
215
215
  API modes are explicit. Keys are read from a key stored via
216
216
  `ur connect <provider>` (OS keychain) or from the environment variables
217
217
  `OPENAI_API_KEY`, `ANTHROPIC_API_KEY`, `GEMINI_API_KEY`,
218
- `OPENROUTER_API_KEY`, and `UNSLOTH_API_KEY`. Subscription CLIs are optional, never required
218
+ `OPENROUTER_API_KEY`, `NVIDIA_API_KEY`, and `UNSLOTH_API_KEY`. Subscription CLIs are optional, never required
219
219
  dependencies, and never used as a silent fallback. UR-Nexus never scrapes
220
220
  browser sessions, extracts OAuth tokens, or bypasses provider restrictions.
221
221
  OpenAI-compatible local or cloud endpoints use `base_url` plus `model`.
@@ -224,7 +224,7 @@ and is inference-only: UR does not manage Unsloth and disables its server-side
224
224
  tools while retaining standard function calls inside UR's guarded tool loop.
225
225
 
226
226
  UR stores `base_url` per provider. You can set different addresses for
227
- Ollama, LM Studio, llama.cpp, vLLM, and Unsloth once, then switch providers without
227
+ Ollama, LM Studio, llama.cpp, vLLM, Unsloth, and NVIDIA NIM once, then switch providers without
228
228
  re-entering any of them. `ur config get base_url` reports the active provider's
229
229
  saved scoped override when one exists; use `ur provider status` or
230
230
  `ur provider doctor <provider>` to inspect the effective endpoint.
@@ -233,10 +233,17 @@ without making it active first. The `/model` picker offers the same endpoint
233
233
  entry flow for a disconnected local/server provider.
234
234
 
235
235
  Use `/model` in an interactive session to select provider first and model
236
- second. OpenAI API, Claude API, Gemini API, OpenRouter, Ollama, and
236
+ second. OpenAI API, Claude API, Gemini API, OpenRouter, NVIDIA NIM, Ollama, and
237
237
  OpenAI-compatible endpoints stay separate; a subscription login does not grant
238
238
  API-key access, and an API key does not grant subscription CLI access.
239
239
 
240
+ NVIDIA NIM uses the build.nvidia.com key and hosted
241
+ `https://integrate.api.nvidia.com/v1` endpoint by default. Connect it with
242
+ `ur connect nvidia-nim`; use `ur config set base_url nvidia-nim <url>` for a
243
+ different NIM deployment. On the `/model` model screen, `K` adds or replaces a
244
+ provider API key and `E` edits its endpoint. This also makes optional
245
+ authentication practical for generic OpenAI-compatible gateways.
246
+
240
247
  ## Project Instructions
241
248
 
242
249
  Add a `UR.md` file to the repository root for team-shared instructions. UR loads it as project context.
@@ -19,7 +19,7 @@ You need:
19
19
 
20
20
  ```sh
21
21
  ur --version
22
- # expected for this release: "1.84.0 (UR-Nexus)"
22
+ # expected for this release: "1.84.2 (UR-Nexus)"
23
23
  ```
24
24
 
25
25
  ### 0.0 Redteam mode and Reverse Skills (1.81.0)
@@ -82,15 +82,18 @@ between models that top out at high, xhigh, max, and native-ultra models; the le
82
82
  selected ceiling must update immediately. Models that top out at high must omit Ultra, while
83
83
  xhigh/max entries must show `ultra→xhigh` or `ultra→max`, and the
84
84
  confirmation must match `/effort status` and the request wire value. For
85
- an Ollama model that advertises boolean thinking without a ladder, verify that
85
+ an Ollama model that advertises thinking without a model-specific ladder, verify that
86
86
  Left selects off, Right selects on, `t` toggles, and `/effort max` reports that
87
87
  max was not sent while enabling `think: true`; `/thinking off` must produce
88
88
  `think: false`. For
89
- llama.cpp, verify focus requests
90
- `/props?model=<focused-id>` and that a template reporting
91
- `supports_reasoning_effort: false` has no graded selector. Open the OpenAI API or Claude
92
- API connection flow and verify the masked `API key` label and entry remain on
93
- one horizontal row.
89
+ llama.cpp, verify focus requests `/props?model=<focused-id>` and that both an
90
+ unsupported template and a bare `supports_reasoning_effort: true` flag have no
91
+ graded selector unless exact levels are also returned. For vLLM, verify one
92
+ focus request to `/server_info?config_format=json`; a non-empty reasoning parser
93
+ must expose `minimal→none`, `low`, `medium`, and `high`, serialize
94
+ `minimal` as `reasoning_effort: "none"`, and omit Ultra. Open the OpenAI API or
95
+ Claude API connection flow and verify the masked `API key` label and entry
96
+ remain on one horizontal row.
94
97
 
95
98
  Then ask UR to research a current topic with WebSearch and WebFetch. Expected:
96
99
  the auxiliary request stays on the active OpenRouter model, no `modelH` error
@@ -176,6 +179,29 @@ file. Expected: UR asks once whether to run the detected compile/test/lint
176
179
  commands. After answering, the same approval question is not shown again. A
177
180
  separate user task that edits files may ask once for its own verification.
178
181
 
182
+ ### 0.1.3 Portable deadlines and provider tool images (1.84.2)
183
+
184
+ Run the deterministic adapter and shell coverage:
185
+
186
+ ```sh
187
+ bun test test/bashCommandExecution.test.ts \
188
+ test/providerNvidiaNim.test.ts \
189
+ test/providerMultimodal.test.ts \
190
+ test/openaiResponses.test.ts \
191
+ test/ollamaToolResultImages.test.ts
192
+ ```
193
+
194
+ Expected: macOS can execute `timeout 0.1 …` without GNU coreutils and reports
195
+ 124 when the deadline expires. Image-bearing tool results retain their text and
196
+ image bytes across OpenAI Chat/Responses, Anthropic, Gemini, OpenRouter,
197
+ NVIDIA NIM, Ollama, LM Studio, llama.cpp, vLLM, Unsloth, and generic OpenAI-compatible
198
+ request shapes.
199
+
200
+ The NVIDIA fixture also verifies hosted/default and overridden endpoints,
201
+ Bearer discovery, native dispatch, documented effort aliases, and no Ultra on
202
+ an unknown model. In `/model`, select `openai-compatible` and verify `K` can
203
+ add or replace its optional key while `E` continues to edit only its endpoint.
204
+
179
205
  ## 0.2 Permission safety and context pack (1.19.0)
180
206
 
181
207
  In a project checkout:
package/docs/providers.md CHANGED
@@ -37,6 +37,7 @@ multimodal input, external CLI boundary, and sandbox scope:
37
37
  | Claude API | API | UR-native | no | yes | yes | yes | UR Bash/File sandbox | `api:anthropic` | `ANTHROPIC_API_KEY` |
38
38
  | Gemini API | API | UR-native | no | yes | yes | yes | UR Bash/File sandbox | `api:gemini` | `GEMINI_API_KEY` |
39
39
  | OpenRouter | API/router | UR-native | no | yes | yes | yes | UR Bash/File sandbox | `api:openrouter` | `OPENROUTER_API_KEY` |
40
+ | NVIDIA NIM | hosted/server API | UR-native | no | yes | yes | model-dependent | UR Bash/File sandbox | `api:nvidia-nim` | `NVIDIA_API_KEY`; configurable NIM endpoint |
40
41
  | OpenAI-compatible | server/API | UR-native | no | yes | yes | endpoint-dependent | UR Bash/File sandbox | `openai-compatible` | optional `OPENAI_COMPATIBLE_API_KEY`; never reuses `OPENAI_API_KEY` |
41
42
  | Ollama | local/server | UR-native | no | yes | yes | yes* | UR Bash/File sandbox | `ollama` | configured local, LAN, or hosted endpoint; optional `OLLAMA_API_KEY` |
42
43
  | LM Studio | local/server | UR-native | no | yes | yes | yes | UR Bash/File sandbox | `openai-compatible:lmstudio` | configured endpoint; optional `LMSTUDIO_API_KEY` |
@@ -69,6 +70,17 @@ or `ollama show <model>`.
69
70
  official CLI, so image blocks are not forwarded, and UR-native tool/streaming/
70
71
  sandbox guarantees stop at UR-run tools and final UR output.
71
72
 
73
+ All UR-native adapters preserve images returned by tools without putting image
74
+ content into a wire field that rejects it. Anthropic keeps the image inside its
75
+ native `tool_result`; OpenAI Responses uses rich function-call output; Gemini
76
+ nests `inlineData` in the matching function response; Ollama uses the
77
+ following native user message; and OpenAI Chat Completions, OpenRouter, NVIDIA
78
+ NIM, LM Studio, llama.cpp, vLLM, Unsloth, and generic compatible endpoints emit the
79
+ required textual `role: tool` message followed immediately by a multimodal
80
+ `role: user` message. This preserves tool-call ordering and every image byte.
81
+ It does not turn a text-only model into a vision model: select a model whose
82
+ live provider metadata or runtime supports image input.
83
+
72
84
  Tool search (deferred tool loading) is disabled on every provider above. It
73
85
  depends on `tool_reference` content blocks being expanded into tool definitions
74
86
  by the API, which is a URHQ-native beta feature with no equivalent on a local
@@ -149,7 +161,7 @@ migrated to the previously active provider on the first provider switch or
149
161
  scoped base-URL write.
150
162
 
151
163
  The override is not limited to local runtimes. OpenAI API, Anthropic API,
152
- Gemini API, and OpenRouter can each target a separate compatible gateway using
164
+ Gemini API, OpenRouter, and NVIDIA NIM can each target a separate compatible gateway using
153
165
  the same command. Their official URLs are defaults, not hardcoded dispatch
154
166
  destinations; model discovery and inference use the selected provider's saved
155
167
  URL. Subscription CLI providers remain vendor-managed and do not accept a base
@@ -182,8 +194,9 @@ For OpenRouter, UR preserves the live `/models` reasoning metadata and sends
182
194
  the unified `reasoning.effort` request. OpenAI-compatible servers receive the
183
195
  resolved value as `reasoning_effort`. The command confirmation, status
184
196
  indicator, active-work spinner, SDK settings response, and provider request all
185
- use the same resolved value. If a provider advertises only boolean thinking and
186
- its runtime has a real native on/off mapping, UR does not invent a graded effort
197
+ use the same resolved value. If a provider advertises thinking without a
198
+ model-specific graded ladder and its runtime has a real native on/off mapping,
199
+ UR does not invent a graded effort
187
200
  selector. Use `/thinking on|off` directly;
188
201
  in `/model`, Left selects off, Right selects on, and `t` toggles. A graded
189
202
  `/effort` request on that model enables boolean thinking while clearly reporting
@@ -194,10 +207,17 @@ so metadata alone does not make this toggle appear and UR sends no invented para
194
207
  when the provider/model advertises `ultra`, `max`, `xhigh`, or an explicit
195
208
  provider-authored equivalent. UR shows the native mapping (for example,
196
209
  `ultra→max`) and sends that exact wire value; it never enables Ultra for a model
197
- whose graded ladder tops out at `high`, boolean thinking, or unknown capability metadata. Arbitrary
210
+ whose graded ladder tops out at `high`, lacks an advertised beyond-high value,
211
+ or has unknown capability metadata. Arbitrary
198
212
  labels such as `deep` still require an explicit provider alias because UR
199
213
  cannot infer their rank.
200
214
 
215
+ NVIDIA NIM is live-discovery first. UR enriches a discovered model only when
216
+ NVIDIA's current model API reference documents that exact model's
217
+ `reasoning_effort` values. Documented `none` appears as Minimal and `max`
218
+ appears as Ultra while the request preserves NVIDIA's wire values. An unknown
219
+ NIM model never inherits an invented graded ladder.
220
+
201
221
  For an unknown or newly released model, UR waits for provider-authored model
202
222
  metadata or a supported model-scoped probe before adding thinking parameters.
203
223
  If the provider does not establish support, thinking stays off for request
@@ -209,16 +229,30 @@ the model advertises `supports_max_tokens`.
209
229
 
210
230
  For Ollama, UR lazily reads the focused model's `/api/show` capabilities and
211
231
  sends the resolved control through native `think`. A generic `thinking`
212
- capability means boolean thinking only. GPT-OSS uses Ollama's documented
232
+ capability proves thinking support but does not identify a model-specific
233
+ graded ladder; UR therefore exposes the verified native on/off control without
234
+ claiming that the model cannot also support levels. GPT-OSS uses Ollama's documented
213
235
  `low|medium|high` ladder and does not expose Ultra. Other graded ladders and
214
236
  Ultra aliases are used only when the endpoint explicitly returns them in model
215
- reasoning metadata. Direct OpenAI,
237
+ reasoning metadata.
238
+
239
+ For vLLM, UR lazily reads the non-generating
240
+ `/server_info?config_format=json` endpoint for the focused model. A configured
241
+ reasoning parser establishes vLLM's documented Chat Completions contract:
242
+ `none|low|medium|high`, displayed as `minimal→none|low|medium|high` and sent
243
+ through `reasoning_effort`. This discovery never launches a completion and
244
+ does not add Ultra. A richer provider-authored model record can add exact
245
+ levels or aliases. For llama.cpp, `/props` can establish that the active chat
246
+ template consumes reasoning effort, but the current capability flag does not
247
+ publish its finite accepted values; UR does not fabricate a ladder from that
248
+ boolean. Direct OpenAI,
216
249
  Anthropic, and Gemini models use curated model-specific ladders from their
217
250
  official documentation; live discovery rows are merged with those contracts.
218
251
  See [Ollama thinking](https://docs.ollama.com/capabilities/thinking),
219
252
  [OpenAI model guidance](https://developers.openai.com/api/docs/guides/latest-model),
220
253
  [Claude effort](https://platform.claude.com/docs/en/build-with-claude/effort),
221
- and [Gemini thinking](https://ai.google.dev/gemini-api/docs/thinking).
254
+ [Gemini thinking](https://ai.google.dev/gemini-api/docs/thinking), and
255
+ [vLLM reasoning outputs](https://docs.vllm.ai/en/latest/features/reasoning_outputs/).
222
256
 
223
257
  The provider-first `/model` picker supports the same control directly: use
224
258
  Left/Right to move through the capability-backed selectors UR can map to a
@@ -233,15 +267,18 @@ forced refresh fails. Interactive requests default to OpenRouter's latency
233
267
  sorting, promote UR's stable session ID for sticky routing, and preserve safe
234
268
  provider prompt-cache markers. Explicit routing preferences and the `:nitro`,
235
269
  `:floor`, and `:exacto` model variants remain authoritative. API-key entry for
236
- OpenAI, Claude, Gemini, and OpenRouter is a single aligned masked row; the key
237
- is stored in the OS keychain flow and is never written to settings.
270
+ OpenAI, Claude, Gemini, OpenRouter, NVIDIA NIM, and authenticated compatible
271
+ endpoints is a single aligned masked row; the key is stored in the OS keychain
272
+ flow and is never written to settings. On the model screen, `K` adds or
273
+ replaces the selected HTTP provider's key and `E` edits its endpoint. Generic
274
+ OpenAI-compatible endpoints may remain anonymous.
238
275
 
239
276
  ### Token counting
240
277
 
241
278
  UR uses each provider's non-generating count endpoint when one covers the full
242
279
  request: OpenAI Responses input tokens, Anthropic Messages token counting,
243
- Gemini `countTokens`, llama.cpp chat input tokens, and vLLM Messages token
244
- counting. Ollama, OpenRouter, LM Studio, Unsloth, and subscription CLIs use a
280
+ Gemini `countTokens`, llama.cpp chat input tokens, and vLLM/NVIDIA NIM Messages
281
+ token counting. Ollama, OpenRouter, LM Studio, Unsloth, and subscription CLIs use a
245
282
  provider-wire local estimate because those runtimes do not share a dependable
246
283
  preflight tokenizer for complete chat history plus tools. UR never launches a
247
284
  hidden completion for token counting. If a native count call is unavailable,
@@ -249,12 +286,13 @@ file and MCP size checks retain the local estimate rather than disabling their
249
286
  limits.
250
287
 
251
288
  For llama.cpp, `/v1/models` metadata is preserved when the server supplies it.
252
- Because stock llama.cpp exposes chat-template effort support per loaded model,
253
289
  UR also resolves the model currently under the Up/Down cursor through
254
- `/props?model=<id>`. Left/Right is enabled only after that focused template
255
- advertises `supports_reasoning_effort`; the selected value is then sent
256
- unchanged in `reasoning_effort`. This works with llama.cpp router/cluster mode
257
- and does not assume that port 8080 limits UR to one worker.
290
+ `/props?model=<id>`. `supports_reasoning_effort` establishes template support,
291
+ but current llama.cpp does not expose the accepted value set through that flag,
292
+ so it does not by itself enable Left/Right. Exact effort metadata from the
293
+ model endpoint still enables the corresponding selectors and is sent unchanged
294
+ as `reasoning_effort`. This works with llama.cpp router/cluster mode and does
295
+ not assume that port 8080 limits UR to one worker.
258
296
 
259
297
  ### Provider-aware research calls
260
298
 
@@ -271,7 +309,7 @@ error, not a successful `Did 0 searches` result.
271
309
  When you select a UR-native provider and model, every agent request is routed
272
310
  through that provider's backend:
273
311
 
274
- - **API providers** make direct HTTP calls in each provider's native wire format: Anthropic uses `x-api-key` + `anthropic-version` against `/v1/messages`; OpenAI uses `Authorization: Bearer` against `/v1/chat/completions` by default or `/v1/responses` when explicitly selected; Gemini uses `x-goog-api-key` against `…:generateContent`; OpenRouter uses its OpenAI-compatible chat endpoint.
312
+ - **API providers** make direct HTTP calls in each provider's native wire format: Anthropic uses `x-api-key` + `anthropic-version` against `/v1/messages`; OpenAI uses `Authorization: Bearer` against `/v1/chat/completions` by default or `/v1/responses` when explicitly selected; Gemini uses `x-goog-api-key` against `…:generateContent`; OpenRouter and NVIDIA NIM use their OpenAI-compatible chat endpoints.
275
313
  - **Local/server providers** connect to the configured local or OpenAI-compatible endpoint (`/v1/chat/completions` for LM Studio, llama.cpp and vLLM; the native tags/chat API for Ollama)
276
314
  - **Subscription CLI providers** (Codex CLI, Claude Code, Gemini CLI,
277
315
  Antigravity) dispatch the turn through the vendor's official CLI using your
@@ -382,6 +420,7 @@ ur config set provider anthropic-api
382
420
  | --- | --- | --- |
383
421
  | API providers (openai-api, anthropic-api, gemini-api) | Live discovery from the provider's `/models` endpoint using your connected key (curated fallback until connected) | live |
384
422
  | OpenRouter | Live `/models` discovery with an endpoint-scoped five-minute cache; Ctrl+R forces a fresh request with no stale fallback | live/cache |
423
+ | NVIDIA NIM | Live `/models` discovery from the hosted or configured NIM endpoint; no stale offline model catalog | live |
385
424
  | Local/server providers (ollama, lmstudio, llama.cpp, vllm, unsloth) | Dynamic discovery from the selected provider endpoint | live |
386
425
  | OpenAI-compatible | Dynamic discovery from configured endpoint | live |
387
426
  | Subscription CLIs (codex-cli, claude-code-cli, gemini-cli, antigravity-cli) | Curated list (the official CLIs expose no models API); first-class in `/model`, dispatched via the official CLI. External CLI behavior depends on the vendor CLI. Log in with `ur auth <provider>` | static |
@@ -408,6 +447,7 @@ provider's successful live catalog remains authoritative for that account.
408
447
  - `anthropic-api` — requires `ANTHROPIC_API_KEY`
409
448
  - `gemini-api` — requires `GEMINI_API_KEY`
410
449
  - `openrouter` — requires `OPENROUTER_API_KEY`
450
+ - `nvidia-nim` — requires `NVIDIA_API_KEY` for build.nvidia.com; endpoint is configurable
411
451
 
412
452
  **Local/server providers** require local runtime or endpoint:
413
453
  - `ollama` — configurable local, LAN, or hosted Ollama server
@@ -540,6 +580,7 @@ Provider config and doctor commands accept canonical IDs and common aliases:
540
580
  | `anthropic-api` | `anthropic`, `claude api` |
541
581
  | `gemini-api` | `gemini api`, `google gemini api` |
542
582
  | `openrouter` | `openrouter api` |
583
+ | `nvidia-nim` | `nvidia`, `NVIDIA Build`, `nvidia api`, `nim` |
543
584
  | `openai-compatible` | `compatible`, `openai compatible` |
544
585
  | `ollama` | `ollama local` |
545
586
  | `lmstudio` | `LM Studio`, `lm-studio` |
@@ -580,6 +621,7 @@ OPENAI_COMPATIBLE_API_KEY=...
580
621
  ANTHROPIC_API_KEY=...
581
622
  GEMINI_API_KEY=...
582
623
  OPENROUTER_API_KEY=...
624
+ NVIDIA_API_KEY=...
583
625
  OLLAMA_API_KEY=... # optional for authenticated Ollama gateways
584
626
  LMSTUDIO_API_KEY=... # optional when the endpoint requires it
585
627
  LLAMA_CPP_API_KEY=... # optional when the endpoint requires it
@@ -599,6 +641,32 @@ ur config set model local-model-name
599
641
  `OPENAI_API_KEY`; selecting an arbitrary compatible base URL never forwards
600
642
  the OpenAI credential to that host.
601
643
 
644
+ The compatible provider's key is optional and provider-scoped. Add or replace
645
+ it with `ur connect openai-compatible`, `/connect openai-compatible`, or `K`
646
+ in the `/model` model screen. Anonymous endpoints continue to work without it.
647
+
648
+ ### NVIDIA NIM / build.nvidia.com
649
+
650
+ NVIDIA NIM is a UR-native, OpenAI-compatible provider with live discovery:
651
+
652
+ ```sh
653
+ echo "$NVIDIA_API_KEY" | ur connect nvidia-nim
654
+ ur config set provider nvidia-nim
655
+ ur provider doctor nvidia-nim
656
+ # Optional self-hosted/enterprise gateway:
657
+ ur config set base_url nvidia-nim https://nim-gateway.example/v1
658
+ ```
659
+
660
+ The default is `https://integrate.api.nvidia.com/v1`. UR calls `/models`,
661
+ `/chat/completions`, and, when available, `/messages/count_tokens`; native
662
+ count failure falls back to a provider-wire estimate and never launches a
663
+ hidden completion. Streaming, standard tool calls, and image input use the
664
+ same OpenAI-compatible adapter. Vision and tools remain model-dependent. For
665
+ documented Nemotron coding-agent models, UR includes NVIDIA's
666
+ `force_nonempty_content` template option when tools are present. See NVIDIA's
667
+ [NIM LLM API reference](https://docs.api.nvidia.com/nim/reference/llm-apis)
668
+ and [NIM function-calling API](https://docs.nvidia.com/nim/large-language-models/latest/function-calling.html).
669
+
602
670
  Local/server providers use their normal endpoints:
603
671
 
604
672
  - Ollama: `http://localhost:11434`
@@ -655,6 +723,7 @@ Required variables:
655
723
  | --- | --- | --- |
656
724
  | OpenAI-compatible | `OPENAI_COMPATIBLE_BASE_URL`, `OPENAI_COMPATIBLE_MODEL` | `OPENAI_COMPATIBLE_API_KEY` |
657
725
  | Unsloth | `UNSLOTH_API_KEY`, `UNSLOTH_MODEL` | `UNSLOTH_BASE_URL` (defaults to `http://localhost:8888/v1`) |
726
+ | NVIDIA NIM | `NVIDIA_API_KEY`, `NVIDIA_MODEL` | `NVIDIA_BASE_URL` (defaults to `https://integrate.api.nvidia.com/v1`) |
658
727
  | OpenAI | `OPENAI_API_KEY`, `OPENAI_MODEL` | `OPENAI_BASE_URL` |
659
728
  | OpenRouter | `OPENROUTER_API_KEY`, `OPENROUTER_MODEL` | `OPENROUTER_BASE_URL` |
660
729
  | Anthropic | `ANTHROPIC_API_KEY`, `ANTHROPIC_MODEL` | `ANTHROPIC_BASE_URL` |
@@ -68,8 +68,8 @@ const featureGroups = [
68
68
  {
69
69
  title: 'Providers and auth',
70
70
  tags: ['subscription', 'API', 'local', 'effort', 'status bar'],
71
- text: 'UR-native API/local/OpenAI-compatible runtimes, provider-scoped endpoints, provider-only Unsloth inference, capability-driven reasoning effort, responsive OpenRouter routing, first-class subscription CLI providers dispatched through the official vendor CLIs, provider doctor checks, secure API-key connect, non-secret config, fallback hints, and provider-aware status-bar output.',
72
- commands: ['ur provider list', 'ur provider status', 'ur provider doctor agy', 'ur connect status', 'ur config set provider openai-api', 'ur config set provider ollama', 'ur config set base_url llama.cpp http://localhost:9931/v1', '/effort ultra', '/thinking on'],
71
+ text: 'UR-native API/local/OpenAI-compatible runtimes, provider-scoped endpoints, live NVIDIA NIM and provider-only Unsloth inference, optional compatible-gateway keys, capability-driven reasoning effort, responsive OpenRouter routing, first-class subscription CLI providers dispatched through the official vendor CLIs, provider doctor checks, secure API-key connect, non-secret config, fallback hints, and provider-aware status-bar output.',
72
+ commands: ['ur provider list', 'ur provider status', 'ur provider doctor agy', 'ur connect status', 'ur config set provider nvidia-nim', 'ur config set provider openai-api', 'ur config set provider ollama', 'ur config set base_url llama.cpp http://localhost:9931/v1', '/effort ultra', '/thinking on'],
73
73
  },
74
74
  {
75
75
  title: 'Security and operations',
@@ -548,7 +548,7 @@ const slashGroups = [
548
548
  {
549
549
  title: 'Models, tools, and interop',
550
550
  items: ['/model', '/provider', '/effort', '/thinking', '/fast', '/model-doctor', '/model-route', '/escalate', '/mcp', '/plugin', '/skills', '/skill', '/sdk', '/a2a-card'],
551
- text: 'Pick providers and models, cycle only capability-backed effort selectors or provider-native boolean thinking, inspect capabilities, manage MCP/plugin extensions, browse prompt skills with /skills, run executable workflows with /skill, and expose interop surfaces.',
551
+ text: 'Pick providers and models, cycle only capability-backed effort selectors or a verified provider-native thinking toggle, inspect capabilities, manage MCP/plugin extensions, browse prompt skills with /skills, run executable workflows with /skill, and expose interop surfaces.',
552
552
  },
553
553
  {
554
554
  title: 'Security operations',
@@ -45,7 +45,7 @@
45
45
  <main id="content" class="content">
46
46
  <header class="topbar">
47
47
  <div>
48
- <p class="eyebrow">Version 1.84.0</p>
48
+ <p class="eyebrow">Version 1.84.2</p>
49
49
  <h1>UR-Nexus Documentation</h1>
50
50
  <p class="lead">A practical, tutorial-style reference for installing, configuring, automating, extending, and operating UR-Nexus.</p>
51
51
  </div>
@@ -165,6 +165,7 @@ ur provider doctor agy</code></pre>
165
165
  <h3>API and local providers</h3>
166
166
  <pre><code>ur config set provider openai-compatible
167
167
  ur config set provider openai-api
168
+ ur config set provider nvidia-nim
168
169
  ur config set base_url ollama http://localhost:11434
169
170
  ur config set base_url llama.cpp http://localhost:9931/v1
170
171
  ur config set provider unsloth
@@ -172,15 +173,15 @@ ur config set model qwen3-coder:480b-cloud
172
173
  ur config set provider.fallback ollama
173
174
  ur config set openai_transport responses
174
175
  ur config set responses.store false</code></pre>
175
- <p>API providers require explicit selection and read keys from a key stored via <code>ur connect</code> (OS keychain) or from environment variables. Each configurable provider keeps its own <code>base_url</code>, so switching among Ollama, LM Studio, llama.cpp, vLLM, Unsloth, and API gateways restores the matching address. OpenAI Responses is opt-in and privacy-first; Chat Completions remains the default. Unsloth is an authenticated inference provider only.</p>
176
+ <p>API providers require explicit selection and read keys from a key stored via <code>ur connect</code> (OS keychain) or from environment variables. Each configurable provider keeps its own <code>base_url</code>, so switching among Ollama, LM Studio, llama.cpp, vLLM, Unsloth, NVIDIA NIM, and API gateways restores the matching address. NVIDIA NIM uses live discovery from build.nvidia.com's official OpenAI-compatible API. OpenAI Responses is opt-in and privacy-first; Chat Completions remains the default. Unsloth is an authenticated inference provider only.</p>
176
177
  </article>
177
178
  <article>
178
179
  <h3>Capability-driven reasoning effort</h3>
179
180
  <pre><code>/effort ultra
180
181
  /thinking on
181
182
  ur --model kimi-k3:cloud --effort high
182
- /model # Up/Down model · Left/Right effort or boolean thinking · Enter apply</code></pre>
183
- <p>The normalized vocabulary is <code>minimal</code>, <code>low</code>, <code>medium</code>, <code>high</code>, <code>xhigh</code>, <code>max</code>, and <code>ultra</code>; <code>/effort auto</code> clears an explicit choice. UR lists only capability-backed selectors it can map to the focused model's provider-native levels. <code>max</code> resolves to the highest supported non-Ultra tier. Ultra appears only for native <code>ultra</code>, advertised <code>max</code>/<code>xhigh</code>, or an explicit provider alias; the picker shows translations such as <code>ultra→max</code> and sends that exact provider value. Models that top out at <code>high</code>, boolean-thinking models, and unknown capabilities do not get Ultra. For boolean-thinking models on runtimes with a native toggle, Left selects off, Right selects on, and <code>t</code> toggles; <code>/thinking on|off</code> is the direct control. A graded <code>/effort</code> request on such a model enables thinking while reporting that no graded value was sent. Generic OpenAI-compatible runtimes receive no invented boolean field.</p>
183
+ /model # Up/Down model · Left/Right effort or thinking on/off · Enter apply</code></pre>
184
+ <p>The normalized vocabulary is <code>minimal</code>, <code>low</code>, <code>medium</code>, <code>high</code>, <code>xhigh</code>, <code>max</code>, and <code>ultra</code>; <code>/effort auto</code> clears an explicit choice. UR lists only capability-backed selectors it can map to the focused model's provider-native levels. <code>max</code> resolves to the highest supported non-Ultra tier. Ultra appears only for native <code>ultra</code>, advertised <code>max</code>/<code>xhigh</code>, or an explicit provider alias; the picker shows translations such as <code>ultra→max</code> and sends that exact provider value. Models that top out at <code>high</code>, lack an advertised beyond-high value, or have unknown capabilities do not get Ultra. For models with thinking but no advertised graded ladder on runtimes with a native toggle, Left selects off, Right selects on, and <code>t</code> toggles; <code>/thinking on|off</code> is the direct control. A graded <code>/effort</code> request on such a model enables thinking while reporting that no graded value was sent. Focused vLLM models use non-generating <code>/server_info</code> discovery for the documented <code>minimal→none|low|medium|high</code> mapping; llama.cpp's bare support flag creates no invented ladder. Generic OpenAI-compatible runtimes receive no invented boolean field.</p>
184
185
  </article>
185
186
  <article>
186
187
  <h3>OpenRouter responsive routing</h3>
@@ -188,6 +189,25 @@ ur --model kimi-k3:cloud --effort high
188
189
  /model # cached catalog; Ctrl+R forces live refresh</code></pre>
189
190
  <p>The endpoint-scoped model catalog is reused for five minutes, while forced refresh never substitutes stale data. Interactive requests prefer OpenRouter latency routing, a stable session ID, and provider-authored prompt-cache markers; explicit routing preferences and model variants still win.</p>
190
191
  </article>
192
+ <article>
193
+ <h3>NVIDIA NIM and compatible API keys</h3>
194
+ <pre><code>ur connect nvidia-nim
195
+ ur config set provider nvidia-nim
196
+ ur config set base_url nvidia-nim https://integrate.api.nvidia.com/v1
197
+ /model # K API key · E endpoint</code></pre>
198
+ <p>NVIDIA NIM is a UR-native provider with live models, streaming, tools, images, configurable endpoints, and only NVIDIA-documented effort ladders. Generic OpenAI-compatible endpoints can also store an optional dedicated key; anonymous endpoints remain valid.</p>
199
+ </article>
200
+ <article>
201
+ <h3>Portable shell deadlines</h3>
202
+ <pre><code>timeout 60 long-command
203
+ # or use the Bash tool timeout field in milliseconds</code></pre>
204
+ <p>Generated Linux-style timeout commands also work on macOS. UR uses Homebrew <code>gtimeout</code> when present or supplies a process-group-aware compatibility command with status 124 on expiry; it does not modify your shell profile.</p>
205
+ </article>
206
+ <article>
207
+ <h3>Tool images across providers</h3>
208
+ <pre><code>Computer screenshot → tool result → vision model</code></pre>
209
+ <p>Every UR-native provider preserves image-bearing tool output in its valid wire shape. OpenRouter, NVIDIA NIM, and other Chat-Completions backends keep the tool result textual and send the image in the next multimodal user turn; Gemini, OpenAI Responses, Anthropic, and Ollama use their native rich forms. Vision still depends on the selected model.</p>
210
+ </article>
191
211
  <article>
192
212
  <h3>Status bar and updates</h3>
193
213
  <pre><code>Ollama | llama3 | ask | main | update available</code></pre>
@@ -7,7 +7,7 @@ plugins {
7
7
  }
8
8
 
9
9
  group = "dev.urnexus"
10
- version = "1.84.0"
10
+ version = "1.84.2"
11
11
 
12
12
  repositories {
13
13
  mavenCentral()
@@ -2,7 +2,7 @@
2
2
  "name": "ur-inline-diffs",
3
3
  "displayName": "UR Inline Diffs",
4
4
  "description": "Review, apply, and reject UR inline diff bundles from .ur/ide/diffs inside VS Code.",
5
- "version": "1.84.0",
5
+ "version": "1.84.2",
6
6
  "publisher": "ur-nexus",
7
7
  "engines": {
8
8
  "vscode": "^1.92.0"
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ur-agent",
3
- "version": "1.84.0",
3
+ "version": "1.84.2",
4
4
  "description": "UR-Nexus — autonomous engineering workflow engine (plan, execute, test, verify, document, benchmark, reproduce)",
5
5
  "type": "module",
6
6
  "packageManager": "bun@1.3.14",