ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

SkillSpector v2.7.0 解析:推断用量归一化加固(Inference Usage Normalization)技术指南

SkillSpector v2.7.0 解析:推断用量归一化加固(Inference Usage Normalization)技术指南 SkillSpector v2.7.0 解析推断用量归一化加固Inference Usage Normalization技术指南【免费下载链接】SkillSpectorSecurity scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.项目地址: https://gitcode.com/GitHub_Trending/sk/SkillSpectorSkillSpector 是一个面向 AI Agent Skills 的安全扫描器用于在安装 Claude Code、Codex 与 MCP Skills 之前检测漏洞、恶意模式、提示注入、数据外泄与供应链风险。v2.7.0 是 2026-08-06 发布的单变更版本唯一公开变更是fix(telemetry): harden inference usage normalization——即在 v2.6.0 引入的“推断用量Inference Usage遥测”能力基础上对 provider 上报 token 计数的归一化与净化逻辑做了一次系统性加固。读完本文你将理解 SkillSpector 如何把不同 LLM Provider 的用量数据统一成一份可供 CI 做成本核算的 JSON 契约掌握其字段语义、缓存与 total token 计算规则、模型溯源判定以及数据净化sanitization在隐私与信任边界上的实现细节。版本概览v2.7.0 在做什么依据 CHANGELOG.md 与版本说明 docs/release/skillspector-2.7.0.mdv2.7.0Released: 2026-08-06自 release/2.6.0 以来仅包含 1 个公开面向的变更段落内容Highlightsfix(telemetry): harden inference usage normalizationAdded / ChangedNoneFixedfix(telemetry): harden inference usage normalizationSecurity / Breaking Changes / DeprecationsNoneValidation由发布驱动基于 2.6.0 之后的公开安全提交信息自动生成Known LimitationsNoneReferencesCHANGELOG.md这个版本号本身很小但它所针对的推断用量归一化是上一版本刚刚落地的重要能力。理解 v2.7.0 的前提是先理解 v2.6.0 引入的遥测基础查看 docs/release/skillspector-2.6.0.md 可以看到v2.6.02026-08-05的 Added 段落在 feat(release): auto-generate versioned release notes 之外正是 feat(telemetry): export provider inference usage。也就是说v2.6.0 让扫描报告能够导出 provider 上报的 LLM 用量v2.7.0 则负责把这些用量的归一化逻辑加固到足以对外部集成方承诺的程度。为什么需要推断用量归一化SkillSpector 的语义分析节点例如semantic_security_discovery、semantic_quality_policy、meta_analyzer会在扫描时调用 LLM而它的运行环境是多 Provider 的Anthropic、Bedrock、OpenAI、NVIDIA 推理服务、各类 CLI 适配器Claude CLI、Codex CLI、Gemini CLI 等都可能作为活动 Provider。不同 Provider 对 token 计数的汇报方式差异极大LangChain 的usage_metadata遵循input_tokens 已包含缓存分区的契约Anthropic 原生响应中input_tokens不包含单独上报的缓存读取与缓存创建字段OpenAI 兼容接口把缓存读取作为prompt_tokens内的嵌套分区上报CLI 传输层可能完全不上报任何计数。如果把这些原始形态直接塞进扫描报告下游做成本核算的 CI 消费者将无法统一处理。因此 SkillSpector 定义了一套归一化契约它只规范化 token 计数器与模型溯源不附加价格、不换算货币。这让下游系统可以在不重跑安全扫描的前提下套用任意带生效日期的定价目录effective-dated pricing catalog。JSON 契约metadata.inference_usage官方文档 docs/INFERENCE_USAGE.md 给出了完整的机器可读输出方式与字段定义。运行一次带 JSON 输出的扫描skillspector scan ./my-skill --format json每个被成功观察到的 provider 响应都会向metadata.inference_usage贡献一条记录{ metadata: { llm_requested: true, llm_available: true, inference_usage: [ { node: semantic_security_discovery, request_kind: structured_output, provider: nv_inference, model: azure/anthropic/claude-opus-4-6, model_source: provider_response, usage_source: provider_response, prompt_tokens: 1000, completion_tokens: 100, cached_tokens: 400, cache_write_tokens: 50, reasoning_tokens: 25, total_tokens: 1100 } ] } }字段含义对照表摘自 docs/INFERENCE_USAGE.md字段含义node发起请求的 SkillSpector 分析器。request_kind调用形态如structured_output、chat_completion。provider净化后的 provider 标识绝不包含端点或凭据。model可用时取 provider 返回的模型身份否则取实际请求的模型。model_source响应明确给出不同的已解析模型时为provider_response身份缺失或与客户端配置的回退模型无法区分时为requested_model。usage_source恒为provider_response。SkillSpector 不会发出估算的用量记录。prompt_tokens归一化后的输入 token 总数包含缓存读取与缓存写入。completion_tokensprovider 上报的输出 token。cached_tokens缓存读取输入 token是prompt_tokens的子集。cache_write_tokens缓存创建输入 token是prompt_tokens的子集。reasoning_tokensprovider 上报的推理 token 分区通常是 completion 用量的子集。total_tokensprovider 总数当两个分区都已知时归一化为prompt_tokens completion_tokens。计数类字段都是可选的因为不同 Provider 和传输层暴露的细节粒度不同。契约里有一条关键约定存在的 0是观察到的 0字段缺失意味着 provider 没有暴露该计数器绝不能把它当作 0 处理。模型溯源model_source 与 usage_source 回答不同的问题v2.7.0 加固的一个重要维度是模型身份的可信度区分。两者看似相似实际语义完全不同usage_sourceprovider_response表示记录中所有 token 计数都来自已完成的 provider 响应。SkillSpector 永远不会根据提示词长度、本地分词器或分析器的 token 预算去推导计费计数。model_sourceprovider_response表示 provider 返回了一个可与请求值区分开的有效模型身份。这对定价是最强的身份证据——因为网关可能把某个别名路由到不同的已部署模型。model_sourcerequested_model表示响应带有用量计数但没有可独立验证的模型身份。包括 LangChain 客户端在 provider 省略该字段时把自己的配置模型复制进响应元数据的情况。此时model就是 SkillSpector 实际请求的模型下游可以做定价但应保留较弱的溯源标记。配置的模型会为每个分析器槽位slot独立解析一般优先级为SKILLSPECTOR_MODEL_SLOTSKILLSPECTOR_MODEL活动 provider 对该槽位的默认模型活动 provider 的通用默认模型例如SKILLSPECTOR_MODEL_META_ANALYZER只影响meta_analyzer槽位而SKILLSPECTOR_MODEL覆盖所有没有槽位级覆盖的槽位。需要注意配置了某个槽位并不证明有请求真的运行了只有出现对应的inference_usage记录才能证明 SkillSpector 收到了带用量计数器的 provider 响应。缓存与 total token 语义OpenAI 与 Anthropic 的归一化v2.7.0 加固的核心正是把 Provider 差异收敛成一个可加性的定价形态uncached prompt prompt_tokens - cached_tokens - cache_write_tokens total tokens prompt_tokens completion_tokens背后的分歧点在于OpenAI 兼容响应一般把缓存读取作为prompt_tokens内已包含的分区上报Anthropic 原生响应把普通输入、缓存读取、缓存创建分开上报。SkillSpector 的归一化逻辑会恰好一次地把 Anthropic 原始缓存分区并入prompt_tokens从而对两种响应形态都保证prompt_tokens是包含式的。当 Anthropic 的缓存创建带 TTL 明细5 分钟与 1 小时两个独立分区时会被合并进cache_write_tokens。SkillSpector 当前不会主动发送 prompt-cache 控制指令因此不会在 5 分钟与 1 小时缓存写入档位之间做选择——下游定价不得推断 provider 响应未保留的 TTL。另外两条不得重复相加的红线reasoning_tokens是诊断性分区不得再次加到completion_tokens上归一化之后缓存读取与缓存写入不得再次加到prompt_tokens上。源码级实现从回调收集到报告净化v2.7.0 的加固落在 src/skillspector/inference_usage.py 这个模块上。整个设计分三层。第一层InferenceUsageCollector——以 LangChain 回调的形式挂在调用期模块文档字符串解释了关键设计动因收集器是在调用时作为 LangChain callback 挂载的。这对结构化输出很重要——parser 返回 Pydantic 对象时原本会丢弃携带 token 计数器的 provider 消息回调机制能拦截到它。对应类InferenceUsageCollector(BaseCallbackHandler)inference_usage.pyon_llm_end(response: LLMResult, **kwargs)在 provider 响应成功后捕获用量。它会从response.generations中找到携带消息的第一个 generation再交给_usage_record归一化L308-L330mark_response_received()供非 LangChain 传输层例如 CLI 适配器标记响应已返回L332-L335set_provider(provider)在观察到首个响应之前设置生效 provider一旦响应已返回再改 provider 会抛出RuntimeError防止计数归属被篡改L337-L343response_received表示 provider 已返回即使没有上报任何 token 用量snapshot()返回脱离原始对象的拷贝供图状态序列化使用L351-L354。收集器用threading.Lock保护内部状态L306支持并发场景。第二层_usage_record——把多种用量形态归一化成一条记录_usage_recordL126-L286是归一化的核心函数。它同时读取四类来源message.usage_metadataLangChain 标准化字段如input_tokens/input_token_detailsmessage.response_metadata.usageAnthropic 原生字段如cache_read_input_tokensmessage.response_metadata.token_usageOpenAI 兼容字段如prompt_tokens_detailsllm_output.token_usageLLMResult 层面的回退。几个关键规则标准化 prompt 优先只有usage_metadata.input_tokens / prompt_tokens缺失时才启用 raw-direct 模式去读取 Anthropic 原始缓存字段L155-L172。原因正是文档里强调的契约差异——LangChain 的 input 计数已含缓存分区而 Anthropic 原始input_tokens不含。Anthropic 原始缓存字段的并入当direct_cache_read或direct_cache_write存在时prompt_tokens (prompt_tokens or 0) direct_cache_read direct_cache_writeL233-L234并明确注释OpenAI 兼容的嵌套缓存计数器已经是prompt_tokens的子集绝不能再加一次。TTL 缓存写入合并ephemeral_5m_input_tokens与ephemeral_1h_input_tokens通过_positive_counter_sum求和且只在和为正时取值L78-L82、L176-L202。total 重算只要prompt_tokens与completion_tokens都已知total_tokens一律重算为两者之和L247-L248覆盖个别 provider如 Bedrock上报总数不一致的情况。模型溯源判定provider 响应里的模型标签只有在_strict_model_label通过不包含://或即不可能编码 URL 或 userinfo时才采用否则回退到请求模型并标记model_sourcerequested_modelL98-L107、L261-L280。此外provider_nameL110-L123把各 Provider 类名映射为稳定、无端点无凭据的标识AnthropicProvider → anthropic、BedrockProvider → bedrock、OpenAIProvider → openai、NvInferenceProvider → nv_inference等。第三层sanitize_inference_usage——报告写盘前的白名单净化sanitize_inference_usageL357-L397是报告出口的最后一道闸门由 src/skillspector/nodes/report.py 在拼装报告时调用。它执行只接受usage_source provider_response的 Mapping 记录用_strict_label正则[A-Za-z0-9][A-Za-z0-9._:/\-]{0,255}见 L21校验node、request_kind、provider用_strict_model_label校验modelmodel_source必须是provider_response或requested_model二者之一计数经_counter校验必须是 0 到2^63-1之间的整数布尔值、负数、超界浮点数一律拒绝L30、L60-L67只保留_COUNTER_KEYS白名单内的 6 个计数键L22-L29其余字段如api_key、原始元数据全部丢弃。收集链路从分析器调用到报告字段从源码结构看收集器的挂载链路在 src/skillspector/llm_utils.pynew_inference_usage_collectorL438-L450以node、request_kind、model、chat_model为参数构造收集器provider 取自聊天模型注册信息回退到活动 provider_invoke_with_usage/_ainvoke_with_usageL404-L435把收集器作为config{callbacks: [collector]}传入 LangChainRunnable.invoke对 CLI 适配器走各自的invoke_with_usage对不支持用量的AgentCLIChatModel则调用后手动mark_response_received()chat_completionL453-L491统一了普通 chat 与结构化输出两条路径的收集器创建与 provider 修正。各语义分析器节点把analyzer.inference_usage透传到图状态例如 src/skillspector/nodes/analyzers/semantic_security_discovery.py、src/skillspector/nodes/analyzers/semantic_quality_policy.py、src/skillspector/nodes/meta_analyzer.pysrc/skillspector/cli.py 在合并多结果时汇聚inference_usage最终由 report 节点净化后写入 JSON。测试验证加固点的行为契约v2.7.0 的加固逻辑在 tests/unit/test_inference_usage.py 中有成体系的回归测试它们实际上就是归一化行为的契约清单LangChain 标准用量不重复计算缓存input_tokens100内含cache_read60、cache_creation10最终prompt_tokens100、cached_tokens60、cache_write_tokens10L20-L57Anthropic 原始缓存并入 prompt 总数input_tokens30cache_read50cache_creation20→prompt_tokens100L75-L104Anthropic TTL 缓存写入被计入ephemeral_5m10ephemeral_1h5→cache_write_tokens15L107-L137标准化 prompt 与原始 Anthropic 缓存同时存在时以标准化为准、缓存字段只作分区L140-L172OpenAI 嵌套的缓存与 reasoning 分区只是子集不参与加法L217-L245Bedrock 上报的 total 与分区不符时用归一化分区重算total_tokensL248-L274provider 返回 URL/带 userinfo 的模型标签时回退到请求模型并标记requested_modelL332-L349净化器拒绝 URL/userinfo 模型标签、非记录类型、含换行的标签、负数计数、越界计数1 63、未知来源并剥离api_key等非白名单字段L352-L419。这些测试与 v2.7.0 的 harden 定位完全吻合不是新增能力而是把已有能力的边界行为恰好一次并入、子集不得重加、白名单净化、防越界、防凭据泄漏用测试钉死。缺失用量与 fail-closed 集成metadata.inference_usage在 JSON 输出中始终是数组。空数组表示用量不可观测但不等于没有 LLM 运行过、请求免费或 token 数为零。典型原因包括provider 或 CLI 传输层不暴露计数器、LLM 调用在响应前失败、或纯静态扫描。成本可观测性与安全门有效性是两个独立的决策。文档 docs/INFERENCE_USAGE.md 建议 JSON 消费者按以下顺序处理要求可解析的顶层 JSON 对象把致命进程退出或execution_successful: false视为阻塞性校验错误为诊断输出analysis_completeness.ledger_exceptions对risk_assessment.recommendation应用自己的安全策略摄入每一条有效的inference_usage记录包括失败的 LLM 尝试中保留的记录——因为失败的扫描同样可能产生 provider 成本。两条边界原则畸形遥测必须被丢弃且不能把一个本来有效的扫描变成失败反过来有效的用量遥测也绝不能让一次不完整的安全扫描通过。当集成工具以静态模式重试失败的 LLM 扫描时应摄入失败尝试的用量一次避免重试载荷被重复计数。隐私与信任边界报告采用显式白名单allowlist。用量记录只包含有界的标签和非负的 provider 计数器不包含提示词、补全内容、被分析的 skill 内容、凭据、请求头、端点 URL、provider 请求 ID、原始 provider 元数据。来源未知、标签非法、计数为负或越界、没有任何计数的记录都会被剔除。同时文档明确提醒在每一个下游边界都应把 JSON 报告视为不可信输入。追加指标或套用价格之前要再次校验白名单字段与计数范围——这正是 v2.7.0 加固 要反复强调的信任模型。下游交接成本核算的推荐链路SkillSpector 设计的目标交接链路docs/INFERENCE_USAGE.mdSkillSpector provider response - metadata.inference_usage in the SkillSpector JSON report - integrating evaluator validates and projects raw usage - CI publishes a versioned metrics artifact - dashboard applies an effective-dated pricing catalog评估器应保留provider、model、model_source、usage_source、分析器/请求身份以及每一个观察到的 token 分区。货币换算属于下游当定价目录被修正时历史用量可以重定价而无需重写原始扫描产物。验证、已知限制与参考v2.7.0 的 Validation 段落说明发布说明由发布驱动从 release/2.6.0 以来的公开安全提交信息自动生成没有额外的验证命令被记录Known Limitations 为 NoneBreaking Changes 与 Deprecations 均为 None因此对 v2.6.0 用户而言该版本是可平滑升级的纯修复版本。所有变更的最终权威清单位于 CHANGELOG.md2.7.0 条目见 L111-L113。对本主题的进一步阅读入口docs/INFERENCE_USAGE.md——推断用量遥测的完整契约文档JSON 示例、字段表、隐私边界、下游交接src/skillspector/inference_usage.py——v2.7.0 加固的归一化与净化实现src/skillspector/llm_utils.py——收集器挂载与调用链路src/skillspector/nodes/report.py——报告出口的净化调用tests/unit/test_inference_usage.py——归一化与净化行为的行为契约测试docs/release/skillspector-2.6.0.md——推断用量遥测能力的引入版本。总结来说v2.7.0 虽然没有新增任何用户可见功能但它是 SkillSpector 遥测体系从能用走向可对外承诺的关键一步通过标准化计数优先、原始缓存恰好并入一次、子集绝不重加、total 强制重算、模型标签防注入、出口白名单净化这一整套规则让metadata.inference_usage成为 CI 消费者可以放心做成本核算与失败扫描对账的可信数据源。【免费下载链接】SkillSpectorSecurity scanner for AI agent skills. Detect vulnerabilities, malicious patterns, security risks, prompt injection, data exfiltration, and supply-chain risks in Claude Code, Codex, and MCP skills before you install them.项目地址: https://gitcode.com/GitHub_Trending/sk/SkillSpector创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表