资讯详情

资讯详情

NemoClaw Inference 模块深度解析:模型/Provider 配置、健康探测与 Ollama 认证代理的源码验证机制

【免费下载链接】NemoClawRun agents like Hermes, LangChain Deep Agents, and OpenClaw more securely inside NVIDIA OpenShell with managed inference项目地址https://gitcode.com/gh_mirrors/ne/NemoClaw点击查看免费下载src/lib/inference是 NemoClaw 中负责模型与推理 Provider的核心代码库覆盖推理配置归一化、端点健康检查、本地推理运行时编排、模型目录拉取以及 NVIDIA 特色模型回退等能力。本文基于该目录的 README.md 展开结合仓库源码与测试用例系统讲解其模块划分、关键数据结构、Provider 路由协商以及最具代表性的 Ollama 认证代理在 v1alpha1 配置导出前的源码观察source observation验证链路帮助你在接手 NemoClaw 推理相关开发或排障时快速定位代码。模块定位一个目录承载的四类职责从 src/lib/inference/README.md 的定位描述看src/lib/inference是模型/Provider 配置、推理健康检查、本地运行时支持与模型目录辅助的统一家园。四个职责被刻意拆分到不同文件形成清晰的分层config.ts 推理配置与归一化纯函数无 I/O health.ts 推理端点健康检查本地 远程统一入口 local.ts 本地推理编排辅助Ollama / vLLM provider-models.ts Provider 模型目录支持NVIDIA / Gemini / OpenAI 兼容 / Anthropic nvidia-featured-models.ts NVIDIA 特色模型目录解析与回退 model-prompts.ts prompt/模型展示辅助 nim.ts NIM 目录与生命周期支持 ollama/model-size.ts Ollama 模型大小解析 ollama/proxy.ts Ollama 认证代理支持 ollama/windows.ts Windows 版 Ollama 支持 vllm.ts vLLM 支持 web-search.ts 网络搜索能力辅助 onboard-probes.ts 上线期推理验证探针README 同时给出了明确的演进方向纯推理决策pure inference decisions长期应迁移到src/lib/domain/inference/**HTTP 与进程边界则应迁移到src/lib/adapters/**。从源码结构看当前src/lib/inference/下已出现serving/、runtime-adapter/、platform-identity/等子目录见 src/lib/inference正是这一演进的中途状态——例如vllm-station-cluster-lifecycle.ts、vllm-station-runtime-receipt.ts等文件把推理决策与容器生命周期副作用混在同一目录下后续会按 README 所述逐步拆解。配置归一化从 Provider 选择到沙箱可见的推理契约config.ts 是整个模块的纯函数核心文件头注释明确约定所有函数均为纯函数All functions are pure即不执行文件系统 I/O避免在推理配置路径上引入副作用。关键常量与默认值常量值说明INFERENCE_ROUTE_URLhttps://inference.local/v1沙箱内网关统一推理路由的 OpenAI 兼容基址DEFAULT_CLOUD_MODELnvidia/nemotron-3-super-120b-a12b云端默认模型DEFAULT_CONTEXT_WINDOW131072无逐模型元数据时的回退上下文窗口云端 Provider 无逐模型上下文元数据与 scripts/generate-openclaw-config.mts 的上线默认构建值一致DEFAULT_ROUTE_PROFILEinference-local默认路由 profileDEFAULT_ROUTE_CREDENTIAL_ENVOPENAI_API_KEY云端路由默认凭证环境变量MANAGED_PROVIDER_IDinferenceNemoClaw 托管 Provider 标识值得注意的安全设计本地推理vLLM / llama.cpp / Ollama不使用OPENAI_API_KEY而是各自独立的专用凭证环境变量VLLM_LOCAL_CREDENTIAL_ENV、LLAMA_CPP_CREDENTIAL_ENV、OLLAMA_LOCAL_CREDENTIAL_ENV代码注释GH #2519说明这是为了沙箱侧 OpenClaw 与主机侧网关永远不读取用户主机上的 OpenAI key 来访问本地 Provider。Provider → 配置映射表getProviderSelectionConfig(provider, model)返回ProviderSelectionConfig含endpointType、endpointUrl、model、profile、credentialEnv、providerLabel。完整映射如下Provider key默认模型凭证环境变量providerLabelnvidia-prod/nvidia-nimDEFAULT_CLOUD_MODELOPENAI_API_KEYNVIDIA Endpointsopenai-apigpt-5.4OPENAI_API_KEYOpenAIopenrouterDEFAULT_CLOUD_MODELOPENROUTER_CREDENTIAL_ENVOpenRouteranthropic-prodclaude-sonnet-4-6ANTHROPIC_API_KEYAnthropiccompatible-anthropic-endpointcustom-anthropic-modelCOMPATIBLE_ANTHROPIC_API_KEYOther Anthropic-compatible endpointgemini-apigemini-3.6-flashGEMINI_API_KEYGoogle Geminicompatible-endpointcustom-modelCOMPATIBLE_API_KEYOther OpenAI-compatible endpointhermes-providerDEFAULT_HERMES_PROVIDER_MODELOPENAI_API_KEYHermes Providervllm-localvllm-localVLLM_LOCAL_CREDENTIAL_ENVLocal vLLMollama-localDEFAULT_OLLAMA_MODELOLLAMA_LOCAL_CREDENTIAL_ENVLocal Ollamallama-cpp-local必须为安全别名LLAMA_CPP_CREDENTIAL_ENVLocal llama.cppllama-cpp-local是唯一会返回null的 case——模型 ID 必须通过isSafeLlamaCppServedModelAlias校验防止注入任意模型名。沙箱推理配置与协议强制getSandboxInferenceConfig(model, provider)决定沙箱侧 OpenClaw 实际看到的providerKey、primaryModelRef、inferenceBaseUrl与inferenceApi。几个关键规则除openai-api、anthropic-prod外绝大多数 Provider包括本地 vLLM / Ollama / llama.cpp都被映射到托管 ProviderproviderKey inference即流量统一经过inference.local网关而不是直连 Provideranthropic-prod强制inferenceApi anthropic-messages基址为https://inference.local无/v1后缀由 Anthropic Messages 协议决定不支持/v1/responses的 Provider 必须强制回退到openai-completions否则切换 Provider 时旧 Provider 的openai-responses会被继承导致每个请求 404ollama-local会注入inferenceCompat.supportsUsageInStreaming true一旦本地 Ollama 路由进托管 ProviderOpenClaw 不再看到ollama/ollama-local的 provider key无法再应用 Ollama 流式用量回退需要在 NemoClaw 侧保留该兼容标志resolveAgentInferenceApi()处理 Hermes 的特殊性Hermes 使用自定义 Anthropic 路由时必须走 OpenAI 兼容前端因为托管 Anthropic SSE 前端可能产生重复的message_start事件#6289。路由协商三种修复计划planInferenceRouteReconcile(live, recorded)比较网关实时路由与沙箱记录路由返回三种计划aligned实时路由与记录一致repair无可用实时路由缺失或不完整静默修复而非大声告警diverged实时路由合法但不同必须由调用方大声暴露——代码注释明确这是对 #3726曾静默覆盖的修正。配套的formatInferenceRouteDriftForDisplay会先经sanitizeRouteValueForDisplay剥离控制字符防止不可信路由值向终端注入转义序列。健康检查让探测结果真正证明模型可调用health.ts 实现了统一的推理健康探测入口是probeProviderHealth(provider, options)先尝试本地 Provider再探测远程 Provider仅对完全无法识别的 Provider 返回null。远程 Provider真实调用而非网络可达性远程探测probeRemoteProviderHealth的关键设计是对云端 Provider 发起带认证的真实模型调用chat-completions 或 Anthropic Messages使探测结果能证明配置的模型确实可调用而不只是端点可达。各 Provider 的探测端点与认证形态Provider端点认证NVIDIA 托管nvidia-prod/nvidia-nim${BUILD_ENDPOINT_URL}/chat/completions即https://integrate.api.nvidia.com/v1BearerNVIDIA_INFERENCE_API_KEY使用 NVIDIA 专用探测载荷openai-apihttps://api.openai.com/v1/chat/completionsBearergemini-apihttps://generativelanguage.googleapis.com/v1beta/openai/chat/completionsBearer走 OpenAI 兼容 shim而非原生 RESTanthropic-prodhttps://api.anthropic.com/v1/messagesx-api-keyanthropic-version: 2023-06-01Gemini 必须走 OpenAI 兼容 shim 的原因在源码注释中有明确交代Gemini 原生 REST 面v1/models、v1beta/models要求?key/x-goog-api-key认证并拒绝纯 Bearer token其/v1beta/openai/shim 接受 Bearer因此健康探测使用它而不是一个会误报为未授权的原生 URL。hermes-provider与openrouter被有意排除在远程探测之外前者 OAuth 流程签发短期 key主机侧读取环境变量的探测观察不到后者是全新集成面当前零健康信号。响应体验证三种协议各自的严格校验validateInferenceResponseBody(inferenceApi, body)按协议分派Chat Completions要求 JSON 含非空choices且至少一个 choice 的 message 携带文本内容、reasoning_content、reasoning、refusal 或合法 tool_calls同时识别流式 SSEdata:行至少一个结构化 chunk 才算健康——DeepSeek V4 Pro 的模型特定探测就请求流式输出裸 2xx 或畸形 SSE 不算健康证明Responsesopenai-responses要求 JSON 含非空output数组且至少一个type: message条目带合法output_text/refusal内容块Anthropic Messages要求含非空content数组元素必须是合法 text / thinking / redacted_thinking / tool_use 块。失败分类与状态渲染探测失败通过classifyHealthProbeFailureLabel归类为unreachablecurl 非零退出含超时、unauthorizedHTTP 401/403、unhealthy其他。ProviderHealthStatus还支持probeLabel与subprobes#3265多跳健康如 Ollama 后端 vs 认证代理会在状态行渲染为Inference (auth proxy):使 401/不可达的代理不会被健康的后端掩盖。健康探测超时预算固定为 connect-timeout 3s、max-time 5s超时返回未验证而非健康。本地运行时编排Ollama 主机发现与 vLLM 托管local.ts2626 行是本地推理编排的核心职责包括 URL 映射、Ollama 解析、健康检查以及 vLLM/Ollama 的命令生成。Ollama 主机发现与持久化收据findReachableOllamaHost依次探测候选主机WSL 下为localhost与host.docker.internal两个候选的/api/tags结果在单次上线运行内缓存发现结果通过ollama-host.json收据持久化persistResolvedOllamaHost后续 CLI 进程优先读收据仅当记录目标失效才重新探测校验/api/tags响应必须符合 Ollama 线格式{models: [...]}#4275——一个 200 响应本身不足以证明健康因为被劫持的 HTTP_PROXY、陈旧监听器或环回端口上的 stub 都能返回任意 2xx 体。Windows 主机 Ollama 的保护性路由Windows 上通过 Docker Desktop 访问主机 Ollama 存在明显的暴露面local.ts实现了一套三层保护probeWindowsHostOllamaRouteProtection仅环回监听windowsProcessListensOnlyOnLoopback可达性Docker 内 curl 探/api/tagsHost 头校验发送Host: rebinding.invalid必须得到 403。三者同时成立才判定protected。每次实际请求prepareOllamaApiExecution还会重新验证 Docker context 是否为本地默认 context、保护探针是否仍然通过否则直接抛错并重置缓存。端口与环境变量getOllamaContainerPort()Windows 主机 Ollama 用原始限定路由OLLAMA_PORTWSL 本地及其他主机本地守护进程用认证代理OLLAMA_PROXY_PORTvalidateOllamaPortConfiguration()非 WSL 下若NEMOCLAW_OLLAMA_PORT与NEMOCLAW_OLLAMA_PROXY_PORT解析到同一端口会直接报错防止认证代理路由回自身vLLM 模型清单探测probeVllmModels通过createBearerAuthConfig携带 key 但不把它暴露在进程 argv 中且对托管双 Station 端点使用pinnedAddresses: []禁止走环境代理。NIM 与 vLLMnim.ts 负责 NIM 容器生命周期pull/start/stop/health-check并定义GpuDetection含totalMemoryMB、availableMemoryMB、computeConstrained等字段用于驱动 Ollama 引导模型选择器避开计算受限主机上的 30B 模型。vllm.ts 则从onboard.ts的是否提供 vLLM判定接管按平台选 profile 并执行安装支持双 Station 集群、托管集群运行收据runtime receipt恢复、Hugging Face 模型获取model-acquisition/hugging-face.ts等。模型目录拉取、校验与回退provider-models.ts 提供四类模型目录能力全部基于 curl 探测实现fetchNvidiaEndpointModels/validateNvidiaEndpointModel从https://integrate.api.nvidia.com/v1/models拉取可用模型并校验选中模型是否在列fetchGeminiModels/validateGeminiModel从 Gemini 原生目录https://generativelanguage.googleapis.com/v1beta/models分页拉取上限 25 页仅收录支持generateContent的模型expandGeminiModelIds同时保留models/xxx与xxx两种形式fetchOpenAiLikeModels/validateOpenAiLikeModel通用 OpenAI 兼容/models若端点 hostname 是 Gemini则自动转派给 Gemini 校验404/405 视为目录不可用而非失败部分 Provider 不提供/models端点fetchAnthropicModels/validateAnthropicModelMessages API 的/v1/models带anthropic-version: 2023-06-01头。nvidia-featured-models.ts 提供 NVIDIA 特色模型目录解析从https://assets.ngc.nvidia.com/products/api-catalog/featured-models.json拉取公开无凭证目录做大小上限1 MiB、模型数上限100、ID 长度256、标签长度160及 ANSI/控制字符清洗后再经isSafeModelId与退役模型 deny-list过滤。当前 deny-list 明确列出的退役模型包括z-ai/glm-5.1#6069、z-ai/glm-5.2#10222、moonshotai/kimi-k2.6、deepseek-ai/deepseek-v4-pro2026-08-07 退役路由返回 HTTP 410。拉取失败时getNvidiaFeaturedModelOptions回退到内置的CLOUD_MODEL_OPTIONSNemotron 3 Ultra 550B / Nemotron 3 Super 120B / Minimax M3并打印警告保证上线流程不被目录抖动阻断。nemotron-3-*裸 ID 到nvidia/命名空间的桥接转换#5827也在此处理。model-prompts.ts 承载交互式模型选择 UIpromptCloudModel、promptRemoteModel支持Other 打开完整列表的二级菜单、promptManualModelId与promptInputModel所有手动输入都经isSafeModelId校验并支持back/exit导航手动输入的 NVIDIA 模型会先经validateNvidiaEndpointModel用NVIDIA_INFERENCE_API_KEY实时校验。Ollama 导出观察v1alpha1 导出前的源码验证链路README 用一整节Ollama export observations描述了一个非常值得注意的机制V1alpha1 配置导出目前会在发布publication前拒绝附加的 Ollamaattached Ollama。也就是说下面的源码观察检查并不建立输出兼容性——成功导出还依赖 #11928 的命名服务契约与 #12012 的导出器映射。这是两个相互独立的问题源码观察解决我是否如实记录了当前真实运行的 Ollama 路由v1alpha1 输出支持解决这个快照能否发布为 V1alpha1 配置。导出快照的组成与权限边界README 说明原生 Linux Docker 导出切片在 adapters/config/live-export-source.ts 中组合当前代理属主proxy owner与非秘密观察者nonsecret observer。每次快照都会向 ollama/proxy.ts 请求对保留描述符retained descriptor、端口、PID 以及三次固定端点读取进行一次全新探测。流程如下权限边界设计非常严格token 不离开属主token 保留在代理属主对象内部通过 stdin 进入 curlrunCurlWithAuthConfig用--config -注入Authorization: Bearer ...头配置token 经转义后写入 stdin绝不进入 argv固定环回读取固定环回读取-q --noproxy *connect-timeout 3s / max-time 5s / max-filesize 64 KiB绕过环境 HTTP 代理响应有界无生命周期副作用这些读取不得获取生命周期锁、不得迁移状态、不得重启进程也不得调用可能采用遗留状态的 token getter——即只读观察绝不干预。观察者验证observeOllamaProxy的六重约束ollama/proxy-observation.ts 是观察逻辑的实现observeOllamaProxy(input)在不接收任何凭证的前提下验证保留意图retained intent与当前代理/模型读取是否一致失败一律fail()抛错live Ollama daemon, proxy mapping, or model could not be verified for export。约束包括平台仅原生 Linuxos.platform() ! linux || isWsl()即拒绝且守护进程端口必须是http://127.0.0.1:port形式类型校验backend kind 必须为ollama模型、守护进程端口、代理端口、PID 均须通过 TypeBox schema 校验且daemonPort ! proxyPort进程匹配PID 必须通过processMatches(pid)即确认为 Ollama 认证代理进程活动配置一致性读取代理的GET /_nemoclaw/proxy-config活动配置其pid、listener.port、backendOrigin必须与保留意图深度相等isDeepStrictEqual模型摘要一致性从代理/api/tags与守护进程/api/tags分别读取所选模型的 digest二者必须一致sha256:前缀归一化后比较且必须恰好命中一个条目无凭证该函数签名不接收任何 token纯靠端点读取完成验证。验证通过后返回的ObservedOllamaProxy.serving记录为backend: ollama、daemon: { management: external, hostPort }、proxy: { management: nemoclaw, hostPort }、model: { servedName, digest }——即守护进程被标记为外部管理、认证代理被标记为 NemoClaw 托管。/_nemoclaw/proxy-config代理的自证端点README 特别强调代理的认证GET /_nemoclaw/proxy-config报告其当前 PID、实际监听器与后端来源origin并且永不转发该请求、绝不返回后端 userinfo、路径、查询或凭证。这使观察者可以拿代理的自述与保留意图、两侧模型清单交叉验证。较老的、未实现该响应的运行中代理会无法通过源码验证——升级或重启它们是操作员的生命周期动作README 明示older running proxies without this response fail source verification; upgrading or restarting them remains an operator lifecycle action。源码验证的适用前提与边界README 给出了严格的适用前提与边界声明这些都是可以安全引用的项目事实前提serving.backend: ollama源码模型只在原生 Linux Docker 托管 OpenClaw 无直接沙箱 GPU的组合上覆盖所选模型不声明所有权NemoClaw 不声称拥有守护进程、软件安装或模型缓存——management: external即为此意只读二级代理只读二级代理必须共享一级代理已验证的路由、模型与调优参数profile 证据两次快照都包含 profile 证据导出期间添加或替换 profile 会阻止发布已存在的 profile 仍需通过完整边界校验绑定行为固定的 OpenShell 版本可在无 provider profile 的情况下把 Ollama 路由绑定到其openaiprovider 类型全局或 provider 自身工作区均可仅当绑定处的读取返回 not found 时才记录显式的无 profile 观察其他读取失败与绑定到外部工作区则保持终结性terminal。凭证契约NEMOCLAW_OLLAMA_PROXY_TOKENOllama 上线不记录任何用户凭证。源码验证要求网关 provider 声明托管代理使用的内部凭证NEMOCLAW_OLLAMA_PROXY_TOKEN且仅接受用户凭证选择缺失或显式声明该内部凭证名两种情况验证实时代理后凭证值始终留在代理属主内部。这保证了用户主机上的 Ollama 服务不要求也不获得用户级 API 凭证所有流量经由 NemoClaw 托管的带认证代理转发proxy.ts 中 token 以 0600 权限写入共享状态目录ollama-proxy-token并受host-global-ollama-auth-proxy生命周期锁保护。网络搜索与上线探针web-search.ts 提供网络搜索能力辅助支持 Brave默认与 Tavily 两个 Provider环境变量NEMOCLAW_WEB_SEARCH_PROVIDER显式选择brave/tavily/none其中none等同禁用对应凭证变量为BRAVE_API_KEY与TAVILY_API_KEY。onboard-probes.ts则是上线期的推理验证探针集与 onboard-probes.test.ts、onboard-probes-curl-harness.ts 配套负责在 onboarding 阶段对推理端点做 curl 级验证工具调用重试、响应回退等场景均有对应测试覆盖。测试保障行为契约的守护者src/lib/inference/下测试与实现几乎一一对应几个最能说明模块行为的测试文件health.test.ts 与 probe-anthropic.test.ts验证响应体校验逻辑与远程探测local-windows-ollama-host-validation.test.ts 与 local-windows-ollama-transport.test.ts验证 Windows 主机 Ollama 的保护性路由与 Docker 传输隔离ollama-proxy-observation.test.ts覆盖observeOllamaProxy的各失败分支平台、schema、digest 不一致、进程不匹配nvidia-featured-models.test.ts验证退役模型过滤与目录解析config.test.ts验证退役模型 ID 不会出现在 NVIDIA Endpoints 选项里vllm-station-cluster.test.ts、vllm-station-runtime-receipt.test.ts验证双 Station vLLM 集群生命周期与运行收据恢复。小结如何在这个模块里安全地做改动回到 README 的核心精神在src/lib/inference中做改动时应当遵守几条既有边界配置层保持纯函数config.ts的所有导出都是纯函数唯一例外getLlamaCppRouteDetails通过注入的inspectManagedLlamaCppOwnership而非直接文件 I/O完成 llama.cpp 所有权查询观察与副作用分离导出/快照路径的读取createOllamaExportProbe必须无锁、无状态迁移、无进程重启、不调 token gettertoken 只经 stdin 进入 curl本地 Provider 凭证解耦本地推理不使用OPENAI_API_KEY保持沙箱侧与主机侧凭证隔离演进方向新代码尽量把纯推理决策放src/lib/domain/inference/**、把 HTTP/进程边界放src/lib/adapters/**逐步收敛 README 描述的中间态退役模型策略修改nvidia-featured-models.ts的 deny-list 时必须同步更新config.ts的CLOUD_MODEL_OPTIONS与测试保持目录、选项、测试三方一致。理解这套配置归一化 → 健康探测 → 本地编排 → 目录辅助 → 源码观察的分层你就能在 NemoClaw 中准确判断一次推理故障应该定位到哪个文件路由漂移查config.ts的planInferenceRouteReconcile端点假健康查health.ts的响应校验Ollama 导出失败查proxy-observation.ts的六重约束模型选项异常查nvidia-featured-models.ts的退役列表与回退逻辑。赞分享【免费下载链接】NemoClawRun agents like Hermes, LangChain Deep Agents, and OpenClaw more securely inside NVIDIA OpenShell with managed inference项目地址https://gitcode.com/gh_mirrors/ne/NemoClaw点击查看免费下载相关推荐vLLM 请求调度详解一条请求怎样拿到 GPU 算力vLLM 请求调度详解一条请求怎样拿到 GPU 算力 高峰期上百个推理请求同时涌向一张 GPU谁先跑、谁让步、显存不够时踢谁出局——这些决定的集合就是人工智能大模型模型推理服务推理引擎Darklang密码验证安全认证机制深度解析Darklang密码验证安全认证机制深度解析 概述 Darklang作为一门现代化的函数式编程语言在安全认证方面采用了业界领先的密码哈希技术。本文将深入探讨RESTler认证机制配置令牌刷新和模块化认证详解RESTler认证机制配置令牌刷新和模块化认证详解 RESTler是首个用于自动测试云服务REST API的有状态模糊测试工具能够发现服务中的安全和可靠性漏网络安全开发工具创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
觉得有用,分享给同行:

为您的企业打造数字门面

稳重轻奢商务风格,端正雅致视觉,长效耐看不易过时。

立即咨询 →