[Feature]: Third-party hosts driving nvpair-ui-broker: is the JSON-RPC surface a supported contract, is the app-data layout versioned, and can the proxy expose the serving node?
维护者通常 5 天内回复
@sherief-nv 已经在做这个了。
开始于 2026年10月9日。
评估
- 难度
- 5/5
- 预计耗时
- 一周以上
- 新手友好度
- 38/100
- Issue 类型
- 功能
- 描述清晰度
- 基本清楚
- 活跃度
- 活跃
- 技术栈
- electron, go, ollama
调研方向
从 nvpair-ui-broker 的 JSON-RPC 入口点和 README 或 docs/integration.mdx 开始,然后检查 services/VERSIONING.md、node-id.json 和 cluster/identity.json。重现文档中记录的 broker 和 proxy 命令,包括 discovery:subscribe、workloads:subscribe 和 curl,以确定当前行为。完成的标准是:受支持的契约、数据格式处理以及任何 proxy 响应元数据都已按照所述验证要求记录或实现。
由索引模型根据 Issue 内容生成。
描述
Area
nvpair-ui-broker (JSON-RPC surface, --ipc mode), nvpair-cluster-manager (app-data / cluster dir layout), ollama-proxy (response headers)
User problem
We are integrating PAIR as the LAN inference layer behind our own desktop application (Magieva Desktop, an Electron app; we are an NVIDIA Inception member). Our host process supervises nvpair-ui-broker itself — spawned with piped stdio, or over --ipc — instead of the shipped PAIR UI, and relies on:
discovery:get-nodes/discovery:subscribe→discovery:nodes-changedfor the roster (members, addresses,modelsByEngine,loadedByEngine,trusted/clustered);workloads:subscribe→workloads:upsertwithworkloadInfo.scheduledOn/originatedFromto record which node actually served each request (we write it to our usage ledger);cluster:invite-node/cluster:respond-to-invite/cluster:invite-statusandengine:remote-install/engine:remote-pull-modelto drive pairing and model placement from our own UI;- the per-user app-data directory (
~/Library/Application Support/Nvidia Corporation/Personal AI Routeron macOS) and the cluster dir (identity.json,node.crt,node.key,trusted/) so an existing NVIDIA-created node keeps its identity when our host takes over supervision.
Measured on v0.1.1 (13b6811, built from source with Go 1.25, macOS 26 / Apple M4 Max): all of the above works today when the broker is driven from a plain shell over newline-delimited JSON-RPC 2.0 — app:ready in ~3 s, the roster is pushed, a real Ollama turn through the proxy yields workloads:upsert with scheduledOn set, and the invite / engine methods are routed. What we cannot determine from the repo:
- Is the broker's JSON-RPC method + notification surface a supported integration contract, with a compatibility policy across releases (additive changes only? deprecation window?), or is it considered internal to the shipped UI?
- Is the on-disk format of the app-data and cluster directories versioned?
node-id.jsonandcluster/identity.jsoncarry onlynode_uuidandcreated_at;services/VERSIONING.mdversions binaries, not the data layout. A third-party host cannot tell whether a directory written by a newer or older PAIR is safe to attach to, or refuse it cleanly. - Will the proxies expose the serving node on the HTTP response (e.g. an
X-PAIR-Served-On: <hostUuid>header)? Today it is available only through the broker event stream (proxy:proxy/request.node_id,workloads:upsert.scheduledOn), which is fine for a host that also owns the broker, but not for an Ollama-compatible client that only sees the proxy.
Desired outcome
- A short statement in the broker README (or a
docs/integration.mdx) of which methods/notifications are stable for third-party hosts and how breaking changes are announced. - A
format_version(or equivalent) field innode-id.json/cluster/identity.json, plus a documented rule for what a host should do when it does not match. - Optionally, a
X-PAIR-Served-Onresponse header onollama-proxy/lmstudio-proxyresponses.
Alternatives considered
- Pinning to a vendored
v0.1.1build and treating every upgrade as a full re-validation of the JSON-RPC surface (what we will do if the surface is declared internal). - Reading the serving node only from the broker events (works for us; leaves plain Ollama clients unable to attribute a response).
- Inferring the data-dir version from file shape (fragile; the reason for question 2).
Compatibility and security implications
Additive only: a version field and a response header change no existing behaviour. A published compatibility policy lets hosts fail closed on a surface they do not recognise instead of guessing. No change to pairing, mTLS or data handling is requested.
Validation approach
- Drive the broker from a shell exactly as we did:
./nvpair-ui-broker --cluster-dir <dir>from a directory holding the sibling binaries, send{"jsonrpc":"2.0","id":1,"method":"discovery:subscribe"}andworkloads:subscribe, run onePOST /api/chatthrough the proxy, observeworkloads:upsertwithscheduledOn. - For the version field: create a node, read
node-id.json, confirm the field; start a host against a directory carrying a higher version and confirm it refuses with a clear error. - For the header:
curl -ia successfulPOST /api/chatthrough the proxy and read the header.
Confirmations
- I searched existing issues for duplicates (#1, #4, #48, #49, #58 are adjacent — mDNS reflectors, enrichment refresh, test data dir, Linux service, headless manual nodes — none asks about contract stability, data-dir versioning or a served-on header).
- I agree to follow the Code of Conduct.
- 主要语言
- Go
- 星标
- 1.6k
- 派生
- 266
- 平均合并
- 3 天 6 小时
- 30 天内合并 PR
- 22
环境准备
- 没有 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
NVIDIA/Personal-AI-Router 的其他 Issue
-
难度 5/5 一周以上 新手友好度 20/100
NVIDIA/Personal-AI-Router#165 ·
维护者通常 5 天内回复
-
bug
难度 4/5 3-5 天 新手友好度 46/100
NVIDIA/Personal-AI-Router#164 ·
维护者通常 5 天内回复
-
enhancement
难度 4/5 一周以上 新手友好度 12/100
NVIDIA/Personal-AI-Router#162 ·
维护者通常 5 天内回复
-
enhancement
难度 4/5 3-5 天 新手友好度 25/100
NVIDIA/Personal-AI-Router#154 · 1 条评论 ·
维护者通常 5 天内回复
-
[Feature]: [Ollama] Alert the user about model pull failures可能已有人在做 @ckelseynv 于 4 天前认领。 未关闭enhancement
难度 3/5 1-2 天 新手友好度 56/100
NVIDIA/Personal-AI-Router#152 · 1 条评论 · 已指派 1 人 ·
维护者通常 5 天内回复
查看 NVIDIA/Personal-AI-Router 的全部 Issue
相似的 Issue
-
triage/pending-triage
难度 2/5 1-3 小时 新手友好度 74/100
external-secrets/external-secrets#7117 ·
维护者通常 2 天内回复
-
bug
难度 2/5 1-3 小时 新手友好度 72/100
ENTERPILOT/GoModel#1183 · 1 条评论 ·
维护者通常 1 天内回复
-
enhancement good first issue
难度 2/5 1-3 小时 新手友好度 68/100
Edwin-metcalf/MetCode#16 ·
-
Action Required: Fix Renovate Configuration可能已有人在做 @thompson-tomo 今天认领。 未关闭
难度 1/5 1 小时以内 新手友好度 78/100
open-telemetry/opentelemetry-collector#16170 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 70/100
维护者通常 1 天内回复