Praxist 产品使用数据收集机制全解析:Notice V3 同意流程、闭式 Schema V2 与撤回实践

发布时间:2026/10/13 10:30:46
Praxist 产品使用数据收集机制全解析:Notice V3 同意流程、闭式 Schema V2 与撤回实践 人工智能AI Agent多智能体Agent 工作流深度研究AI 评测【免费下载链接】PRAXISTAutonomous research system for measurable, computer-executable research.项目地址https://gitcode.com/gh_mirrors/pr/PRAXIST点击查看免费下载本文以 Praxist 仓库中随产品内置的 Praxist 用户数据收集通知Notice version 3为骨架结合 产品使用模块技术文档、隐私声明 以及praxist/product_usage/下的真实源码与测试完整拆解这套可选、伪匿名、可随时撤回的遥测系统的设计边界与实现细节。读完本文你将掌握数据在什么条件下才会被采集、闭式 Schema V2 允许传输哪些字段、四个生命周期事件的生成时机、开发版与正式版端点差异以及如何通过 CLI 查看、授权、撤回并自行审计全部行为。1. 核心前提三重条件同时满足才可能采集Notice 的第一节定义了整件事的法律与技术前提Praxist 只在以下三个条件同时成立时才会采集并发送产品使用数据当前安装的构建包含经过批准的采集传输通道approved collection transport该构建启用了产品使用采集能力用户在本文档可供审阅之后单独选择了Share product usage或以其他显式受支持的方式完成 opt-in。三条中的任何一条不满足——例如构建本身没有采集能力、状态为unset未表态或明确denied拒绝——则不产生、不发送任何产品使用事件。特别重要的是接受 Praxist Fair Source License 与用户协议并不等于同意数据收集两者相互独立拒绝或撤回同意不会降低研究功能Research Run的能力。即使 opt-in 后出现临时网络或采集器故障最多只在本地 outbox 中暂存有限的事件等待补发也绝不影响 Research Run 本身。这一fail-closed故障即关闭语义在源码中可以被直接验证consent.py 用ConsentStatusunset/granted/denied三态状态机管理本地同意记录任何缺失、损坏或版本不匹配的记录都按unset处理——测试用例 中test_missing_corrupt_and_wrong_version_fail_closed证实文件不存在、内容为{、或consent_notice_version为旧版本时status()一律返回UNSET。client.py 的UsageSdk是采集的门面capture()在任何异常路径下都返回False即采集失败绝不外泄到 Research Run。Notice 还披露了两种构建的接收端点差异构建类型端点说明开发构建.devhttp://45.78.201.249/v1/events明文 HTTP仅用于内部开发/测试数据正式发布版https://telemetry.theaiscientist.com/v1/eventsHTTPS 证书校验且不跟随重定向端点的选择逻辑位于 transport.pydefault_batch_sender()依据 Praxist 版本字符串是否包含.dev来决定返回DevHttpBatchSender还是ProductionHttpsBatchSender后者在构造时会校验端点必须是合法 HTTPS URL否则直接拒绝。2. 同意Consent机制的实现原子写入、版本绑定与 Agent 交互Notice 第 1 节末尾和 PRIVACY 文档第 2 节共同描述了一套显式、可撤回、绑定版本的同意机制源码将其落成了严格的持久化语义三态状态机失败即关闭。ConsentStore负责读写固定路径的consent.json。写入采用临时文件 fsyncos.replace的原子替换流程目录权限 0700、文件权限 0600Linux 下路径为~/.config/praxist/product-usage/consent.json并通过跨进程文件锁POSIXflock/ Windowsmsvcrt.locking串行化同意变更与上传。测试test_state_permissions_are_user_only明确断言父目录0o700、记录文件0o600。同意记录绑定 Notice 版本。每条记录包含consent_notice_version字段只有与当前CONSENT_NOTICE_VERSION 3完全一致时才被视为有效。当 Notice 内容变更导致版本号上升时旧版本下记录的同意不会自动沿用而会在升级后的首次使用中重新征求——这正是版本化通知在存储层的落地。每次授权都有独立的持久化身份。每条granted记录带一个decision_idUUID4。这个 grant 身份被用于绑定 outbox 中的待发送事件撤回后重新授权会产生新的 grant_id旧授权期间入队但未发送的事件会被discard_other_grants()清掉避免新旧同意周期之间的数据串扰详见 consent.py 与测试test_each_explicit_grant_has_a_distinct_durable_identity。Agent 辅助安装的显式回复。Notice 明确规定在 Agent 辅助的 OOBE 过程中受支持的明确共享回复只有Yes/Agree受支持的拒绝回复只有No/DisagreeAgent 不得从其他措辞推断用户选择。源码parse_agent_reply()严格实现这一规则测试用例 用参数化数据验证yes、YES、I agree、同意、Agree to collect等一律返回None即不构成同意只有精确的Yes/Agree/No/Disagree容忍首尾空白才被接受。对应的 CLI 操作praxist/cli/product_usage.py# 查看完整的通知文本 praxist product-usage notice # 记录明确的同意/拒绝交互式终端会展示选项菜单 praxist product-usage consent # Agent 辅助安装场景显式传参 praxist product-usage consent --agent-reply Yes praxist product-usage consent --agent-reply No # 查看当前状态JSON 形式 praxist product-usage status --json # 随时撤回停止未来采集并删除本地未发送事件 praxist product-usage withdrawstatus --json的输出包含collection_available当前构建是否存在可用传输通道与statusunset/granted/denied两个字段。在非交互式环境无终端输入中不会弹出同意提示状态保持unset即默认不采集任何数据。3. 采集边界闭式 Schema V2 与公共生命周期字段Notice 第 2 节的核心论断是产品使用协议拥有一个闭式 schemaclosed schema只允许采集下述字段。这句话在代码里的对应物是 protocol.py 中的StrictModelmodel_config ConfigDict(extraforbid, strictTrue, frozenTrue)——客户端与服务端共享同一套模型任何 schema 之外的字段都会被客户端或服务端直接拒绝。服务端 collector.py 通过parse_batch_bytes()走同一套 Pydantic 模型完成校验。闭式 Schema V2 的边界常量 全部集中在protocol.py顶部常量值含义SCHEMA_VERSION2事件结构版本CONSENT_NOTICE_VERSION3当前 Notice 版本同意记录绑定它MAX_BATCH_EVENTS50每批最多事件数MAX_REQUEST_BYTES32 KB单次请求体大小上限MAX_ERROR_SUMMARIES16每事件最多错误摘要分组数MAX_ERROR_COUNT65,535每组错误计数的上限MAX_DURATION_MINUTES43,20030 天记录的活动运行时长上限对应的机器可读约束同时以 JSON Schema 形式固化在 usage-event.schema.json 与 usage-batch.schema.json 中客户端与服务器共用。3.1 公共生命周期字段每个事件都必须携带以下字段详见 protocol.py 的CommonEventschema_version事件结构版本固定为 2praxist_version公开的 Praxist 版本写入前经过canonical_product_version()归一化——本地构建元数据如linux.x86-64会被剥离只保留规范公共版本测试test_context_strips_local_build_metadata_from_wire_events验证了这一点consent_notice_version本次同意所对应的 Notice 版本environment_id环境 ID本地随机生成的 UUIDv4在同一 Praxist 环境中跨 Research Run 保持稳定telemetry_run_id单个 Research Run 的独立随机标识event_id单个事件的随机标识用于关联与去重event_sequence同一 Research Run 内的序号从 1 开始递增event_type四类生命周期事件之一occurred_at客户端事件时间UTC、秒级精度error_summaries/error_summaries_truncated有界的结构化错误分类计数及其截断标记。随机标识的生成规则是伪匿名化的关键它们不从用户名、账户、设备序列号、MAC 地址、IP 地址、主机名、项目路径或任务内容中派生也不是简单的递增序列。源码中三个标识全部来自uuid4()见 identity.py 与 lifecycle.pyenvironment_id首次需要时生成并持久化在~/.local/share/praxist/product-usage/environment.json权限 0600telemetry_run_id与event_id则每次运行/每个事件单独生成。3.2 四个生命周期事件Praxist 最多只发出四类事件全部由 lifecycle.py 中的RunTelemetryContext生成并且带有一组可验证的不变量invariantrun_started在 Research Run 开始边界记录当前 generation 序号、计划 Peer 总数以及 planning / running / completed / cancelled / failed / unknown 六种状态的 Peer 聚合计数。run_started在每个 Run 生命周期内至多发出一次包括恢复场景重复发出会抛出LifecycleInvariantError。generation_finished在持久化的 generation 边界记录同样的聚合字段。状态计数必须加总等于计划 Peer 数PeerStatusEvent.peer_counts_match_plan校验器强制这一约束completed仅表示 Peer 生命周期正常返回并不断言科学结果有效unknown表示无法确认规范终态。run_finished记录活动运行时长完整分钟数上限 43,200 分钟即 30 天以及是否触及上限时长无法确定时可为null。duration_capped为true时active_duration_minutes必须恰好等于 43,200DurationEvent校验器。run_reconciled当之前未完成的 Run 被恢复、且后续完成了可信的终态处理时记录同样的有界时长字段。事件类型还约束了各自允许携带的错误阶段窗口run_started的错误摘要只能来自setup或launch阶段generation_finished只能来自launch/execution/finalizationrun_finished只能来自finalizationrun_reconciled只能来自reconciliation。这些都在对应事件模型的model_validator中强制校验测试 同时验证了序列号连续递增、同一 Run 内telemetry_run_id恒定、不同 Run 绝不复用telemetry_run_id等行为。Notice 特别强调单个 Peer 的标识、输出、提示词、研究结论和原始错误细节都不会被采集——事件里只有聚合后的计数。3.3 结构化错误摘要分类而非原文每个生命周期事件最多携带16 组错误摘要每组只能包含以下闭式取值scoperun/generation/peerstagesetup/launch/execution/finalization/reconciliationerror_typeconfiguration/resource/orchestration/runtime/external_dependency/storage/unknownerror_codePRX-CAPACITY/PRX-PEER-LAUNCH/PRX-PEER-RUNTIME/PRX-RUNTIME/PRX-RUN-FAILED/PRX-UNKNOWNreason_codeauth_error、quota_exhausted、rate_limited、timeout、provider_unavailable、runtime_error、tool_unavailable、invalid_request、budget_denied、budget_expired、capacity_unavailable、process_start_failed、state_unreadable、unexpected_termination、unknowncount匹配错误的数量上限 65,535另有count_capped标记是否触及上限为true时count必须等于 65,535。在 protocol.py 中这些枚举被建模为ErrorScope、ErrorStage、ErrorType、ReasonCode等StrEnum与PraxistErrorCode字面量联合类型因此结构上不可能携带原始错误消息、日志、堆栈跟踪、provider 响应或任意文本。集成层 infrastructure/product_usage.py 在把 Research Run 的PeerLifecycleSummary投影为事件时只把失败计数映射为scopepeer、stagelaunch/execution、error_codePRX-PEER-LAUNCH/PRX-PEER-RUNTIME、reason_codeprocess_start_failed/runtime_error的计数型摘要——即使 10 个 Peer 失败也只是一个count10的分组而不是 10 条错误详情。3.4 时间字段客户端事件时间与服务器接收时间occurred_at由本地 Praxist 客户端在生命周期里程碑处生成通过本地系统时钟转换为 UTC因此可能反映时钟不准确其格式被严格限定为 RFC 3339 秒级 UTC正则^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}Z$。received_at由服务端在事件校验通过后追加客户端无法提供或篡改它表示到达时间而非任务完成时间仅用于存储管理与保留期计算。4. 明确不采集的清单Notice 第 3 节与 PRIVACY 文档第 4 节给出了清晰的否定清单产品使用事件不包含研究任务内容、提示词、研究结果、文件、文件名、项目路径或命令环境变量、API 密钥、已保存的登录凭据、日志、堆栈跟踪、原始错误消息或任意文本模型名称、服务提供方名称、provider 响应或账户信息姓名、邮箱地址、操作系统细节、硬件信息、Python 版本、客户端时区、Cookie 或任意请求头单个 Peer 的身份或单个 Peer 的输出。这份清单不仅是文档承诺更是可测试的代码约束test_privacy.py 用一个包含ip_address、path、filename、hostname、prompt、task_content、command、environment、log、stack_trace、raw_error、provider、model、credential、operating_system、python_version、timezone、user_agent、cookie、metadata、received_at、peer_id等 30 余个字段名的参数化测试逐个注入事件载荷并断言全部触发ValidationError同时用PRX-/Users/alice/project、PRX-raw error message、PRX-provider.example.com等伪造错误码验证error_code只能取自闭式枚举。5. 网络传输与请求契约Notice 第 4 节说明事件体不包含 IP 地址、Cookie 或任意请求头网络服务为投递请求、保护服务与限流而临时处理连接信息。Praxist Collector 的部署禁用访问日志并在应用处理前剥离 forwarded IP、Cookie 和客户端 User-Agent 头不会将其作为产品使用事件数据持久化客户端只发送固定的协议级 User-Agent。transport.py 与 DOCUMENTATION.md 给出了完整的请求契约POSTContent-Type: application/json请求体上限 32 KB每批最多 50 个事件只携带固定的协议级 User-AgentPraxist-Product-Usage/2——没有 Cookie也没有额外请求头网络超时 2 秒成功响应为202响应体{accepted: n, duplicates: n}其中accepted duplicates必须等于本批事件数客户端据此精确确认哪些event_id已送达并从 outbox 删除错误响应400请求格式错误 / schema 版本不支持、413过大、415非 JSON、503采集暂停或暂不可用拒绝跟随重定向_RejectRedirects处理器正式版端点强制 HTTPS 证书校验。传输失败绝不阻塞或影响 Research Run事件先进入本地有界 outboxoutbox.sqlite3Linux 下位于~/.local/share/praxist/product-usage/权限 0600outbox.py 限定最多 1,000 条事件 / 1 MB单条事件 7 天过期上传由UploadCoordinator在隔离的 worker 线程中执行网络恢复后自动补发。6. 保留、撤回与本地文件6.1 服务端保留已送达的原始事件保留不超过 180 天随后由定时保留任务删除。实现细节在 retention.py 中MAX_RETENTION_DAYS 180但事件在第 179 天即进入删除窗口预留 1 天调度余量保证每天至少运行一次的定时任务永远不越过 180 天上限保留任务在服务启动时运行一次此后每 24 小时至少一次失败则退出并依赖容器重启重试。6.2 撤回与状态查看Notice 给出了两条核心命令均以praxist product-usage子命令形式提供# 撤回立即禁用当前用户的未来采集并删除所有本地未发送事件 praxist product-usage withdraw # 查看当前状态 praxist product-usage status --json撤回的语义边界需要精确理解立即生效停止未来采集删除本地未发送事件包括outbox.sqlite3及其 WAL/SHM 文件见Outbox.close_and_delete()不追溯已送达的事件不会被删除它们只能保留到计划保留期到期最长 180 天撤回/拒绝不影响Praxist 的安装与研究功能服务端当前不提供按环境标识删除已送达事件的接口——这是一个在 PRIVACY.md 第 8 节中坦诚披露的设计约束对于 GDPR 场景下的删除请求可以附上本地environment.json中的environment_id以证明环境归属再由运营方人工处理。6.3 本地文件路径一览依据 paths.py各平台路径全部固定、仅当前用户可读写0600/0700平台同意记录出站队列 / 环境标识Linux~/.config/praxist/product-usage/consent.json~/.local/share/praxist/product-usage/outbox.sqlite3、environment.jsonmacOS~/Library/Application Support/Praxist/product-usage/consent.json同目录下的outbox.sqlite3、environment.jsonWindows%LOCALAPPDATA%\Praxist\product-usage\consent.json同目录下的outbox.sqlite3、environment.json此外本地运行状态文件位于runs/hash.json与environment.json同目录文件以运行目录路径的SHA-256 哈希命名先用expanduserresolve规范化路径再 UTF-8 编码后哈希。SHA-256 的单向性意味着无法从文件名反推原始路径且这些文件只留在本机、永不上传。集成层还会把这些状态文件限制在 512 个 / 4 MB 总量 / 512 KB 单文件以内并保留 180 天。7. 关于伪匿名的诚实定位PRIVACY 文档第 5 节对方法论给出了诚实的定性这是伪匿名化而非完全匿名化。environment_id、telemetry_run_id、event_id全部由标准uuid4()随机生成且不与任何个人、设备或任务信息派生相关environment_id在同一环境内跨 Run 稳定——因此理论上有把同一环境的事件相互关联的可能性这正是伪匿名而非完全匿名的原因同时项目承诺绝不以任何方式利用这些数据识别个人不销售数据、不用于广告营销、不与其他数据集关联以识别个人。Notice 第 5 节也完整承接了这一承诺并把用途限定为分析产品可靠性、改进功能与体验、以及永远不会指向特定用户的匿名聚合统计。8. 自行审计清单Notice 与 DOCUMENTATION.md 第 8 节共同提供了一套可独立完成的验证路径核对字段白名单阅读 protocol.py 与 schemas/v2/usage-event.schema.json、schemas/v2/usage-batch.schema.json确认事件结构与闭式枚举查看同意状态praxist product-usage status --json检查本地文件按第 6.3 节路径核对consent.json、environment.json、outbox.sqlite3的权限与内容抓包验证端点地址、固定 User-Agent 与请求体内容都可以用标准网络抓包工具复现查看完整通知文本praxist product-usage notice或直接阅读 docs/legal/product-usage-data-notice.md阅读测试佐证test_privacy.py禁止字段与错误码边界、test_consent.pyAgent 关键词与 fail-closed、test_lifecycle.py事件不变量覆盖了本文提到的绝大部分机制。9. 版本化与变更管理最后需要理解整套机制的版本耦合关系protocol.py 集中定义了SCHEMA_VERSION 2、CONSENT_NOTICE_VERSION 3以及全部边界常量。schema 扩展必须显式修改protocol.py并提升版本Notice 内容变化时CONSENT_NOTICE_VERSION递增旧版本下记录的同意不再有效升级后的首次使用会重新征求。当实现发生变化时技术文档、隐私声明 与产品内置通知即本文主题文档必须同步更新——这也解释了为什么 docs/operations/DOCUMENTATION.md 明确要求保持与 product-usage 契约的对齐。综上Praxist 的产品使用数据收集是一个默示关闭、显式开启、随时撤回、结构受限的闭环系统从三重前提的同意机制、闭式 Schema V2 的字段白名单与四类生命周期事件到 180 天保留期与本地有界 outbox每一层都有对应的源码实现与测试用例可查证。对于企业 IT 与安全审计人员而言这条链路从 docs/legal/product-usage-data-notice.md 出发可以一路追溯到praxist/product_usage/的每一行实现形成完整的可审计证据链。赞分享人工智能AI Agent多智能体Agent 工作流深度研究AI 评测【免费下载链接】PRAXISTAutonomous research system for measurable, computer-executable research.项目地址https://gitcode.com/gh_mirrors/pr/PRAXIST点击查看免费下载相关推荐Kedro 匿名遥测机制详解数据收集字段、同意撤回方式与底层实现Kedro 匿名遥测机制详解数据收集字段、同意撤回方式与底层实现 Kedro 作为一套面向生产环境数据科学工作流的工具箱通过可选的匿名遥测Anonymou数据工程工作流自动化akshare数据反馈用户意见收集与产品改进流程akshare数据反馈用户意见收集与产品改进流程 作为一款开源的金融数据接口库akshare在数据采集与处理方面展现出了强大的能力。为了让这个优秀的工具持续金融科技数据分析网页爬虫想把微信聊天记录永久保存WeChatMsg 免费导出 HTML、Word、CSV 并生成年度聊天报告想把微信聊天记录永久保存WeChatMsg 免费导出 HTML、Word、CSV 并生成年度聊天报告 换新手机时最舍不得删的就是那几年的微信聊天记录。WeC创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询