TGViewer
Channel Public Channel
开发者工具箱|编程·开发工具·资源

开发者工具箱|编程·开发工具·资源

@devtoolboxhub

面向开发者的实用工具、库与效率技巧,写代码更快更爽。投稿 @BDHT1
#开发者 #编程工具 #效率 #程序员 · 开源总站 @GitHubTrendingHub
Subscribers
780
Photos
1.4K
Videos
0
Links
765

Showing posts older than #1585 · Back to latest

Older Posts 20 shown
Post #1584 5
N+1 检测器如何找回被 ORM 藏起的代码行

作者在给 Node 写运行时 N+1 查询检测器时发现,检测本身很快完成,但定位到具体触发代码行却花了更久。检测器通过插桩数据库驱动工作,当同一查询形状在单次请求内多次执行时,会报告触发位置的文件和行号。最初在普通驱动上运行良好,但指向使用 Drizzle 的应用时,报告变成了「unknown call site」——查询被检测到、计数了,却无法归因到任何代码。

作者第一反应是帧过滤器过于激进,跳过了 node_modules 和 node:internal 等框架帧。打印完整调用栈后发现,一次简单的 db.select() 查询产生了 12 帧,没有一帧属于应用代码。过滤器没问题,是信息本身不存在了。

原因在于 Drizzle 的查询是惰性 thenable。db.select().from(items).where(...) 并不执行任何操作,只是构建对象。真正执行发生在有人调用 .then() 时,而 await 时调用 .then() 的是 JavaScript 运行时,不是你的代码。此时你的函数早已返回,帧已从栈中消失。TypeORM 没有这个问题,因为 repo.find() 是你直接调用的 async 函数,Node 会在 await 边界保留异步栈轨迹。

解决方案是:在查询构建期间捕获调用位置,用 AsyncLocalStorage 携带到执行时刻,让驱动级插桩优先使用这个环境值而非栈回溯。调用位置在 db.select() 时捕获一次,随构建器链式传递,直到执行方法触发。最终 SQL 来自驱动,行号来自 ORM。


修复后同一脚本在 PostgreSQL 16、Drizzle 0.45.2、postgres.js 3.4.9 上从「unknown call site」变为准确的 at drizzle-test.mjs:35。作者还提醒一个陷阱:postgres.js 中 .values() 会执行查询,但 Drizzle 中 db.insert(t).values({...}) 只是构建 insert,误判会静默丢失 insert 的归因。工具是 nplusone,MIT 协议,零运行时依赖,NODE_ENV=production 时自动关闭。

#开发者 #工具 #Nodejs #Nplusone #Drizzle #TypeORM #PostgreSQL #性能分析
@DevToolboxHub
Post #1582 4
Optimux 开源:按需图片视频优化服务

Optimux 是一个 Go 服务,可即时调整图片和视频大小、重新编码并流式传输——通过一个 URL 参数即可完成。该项目已在内部运行一段时间,现以 AGPL-3.0 协议开源。开源的核心动机是底层 worker 池:决定任意时刻有多少 goroutine 在处理图片的部分,作者认为这是代码库中最有趣的部分,值得从私有仓库中拿出来。

作者从经典的 Job/Dispatcher 模式起步,该模式源自 Marcio Castilho 的《用 Golang 处理每分钟 100 万请求》一文。该模式用有界池替代无界 goroutine 生成,曾将系统从约 100 台 EC2 实例缩减到 4 台 c4.Large,处理接近每分钟百万请求。但那个工作负载是向 S3 上传 JSON——几乎全是 I/O 等待,几乎不占 CPU。换成图片缩放后,模式失效了。

pprof 阻塞分析显示 67.99% 的时间花在 chanrecv1 上——worker 在等任务,dispatcher 在等 worker 归还通道。当单个任务变成数百毫秒的 CPU 密集型图片处理时,通道编排开销不再隐形。目标吞吐 8.6rps,该模式只能到 2.0xrps。作者直接推倒重来。

从同步基线逐变量重建:无 worker 内联处理 2.9rps,已超过 dispatcher 模式;单通道单 worker 2.1rps,比不并发还差;单队列 4 worker 3.15rps,平均延迟 1.37s;双队列(拉取/处理分离)各 4 worker 3.07rps,但延迟分布明显平滑——拉取源图 40-100ms,libvips 处理约 700ms,两阶段服务时间差异巨大,共享队列存在阻抗失配。加权 2 拉取/4 处理反而更差。另尝试了需求驱动型生产者/消费者(类似 Elixir GenStage),协调成本高于收益,未采用。独立于 worker 数量的优化:流式输出编码字节而非整体缓冲,吞吐 3.28rps,延迟降至 1.31s。

核心结论:Job/Dispatcher 模式并非错误,而是适用于外部资源(S3、网络、数据库)受限、自身 CPU 基本空闲的工作负载。libvips 图片处理则相反:受限资源是自身 CPU 和内存,固定 MAX_WORKERS 无法跟踪突发与空闲交替的队列。EC2 上 iostat 显示 CPU 在 80%+ 与 40% 间摆动,%steal 峰值达 8.74%。worker 数量本身必须是活变量。

结构差异:dispatcher 模式用 N+1 个通道(池通道加每 worker 通道)和 dispatcher goroutine 表达可用性;DynamicScaler 所有 worker 直接从一个共享 Queue chan T 拉取,无 dispatcher、无每 worker 通道、无显式"空闲"消息——可用性即"当前阻塞在 Queue 接收上",由 Go 运行时仲裁。另一差异:dispatcher 的 MAX_WORKERS 启动时读一次环境变量,永不变化;DynamicScaler 的每个 WorkerSlot 可标记 Retiring,需有竞态安全的退出路径,因为该工作负载下"当前正确 worker 数"本身就是被争用的资源。


DynamicScaler[T] 是基于队列压力伸缩的泛型 worker 池,类型参数为任务类型,同一 scaler 可独立驱动图片、视频、批处理任务。注册表是单一有序切片,按创建顺序追加,尾部即最新 worker,LIFO 退休策略因此是确定性扫描。活跃数通过遍历计算得出,无独立计数器,不存在状态失同步问题。退休发生在空闲边界:worker 在 select 中阻塞等待取消、退休请求或任务队列,无 default 分支;退休请求在 worker 空闲瞬间到达。默认 2 秒宽限期,超时则取消 context 兜底,但注册表移除只发生在真实退出通知时。伸缩决策有冷却期(默认 30 秒),因瞬时队列长度在突发流量下噪声大;唯一绕过冷却的情况是活跃 worker 低于 MinWorkers 时立即补充,防止崩溃风暴导致池长时间空转。

未测试项:Fiber 的 prefork 模式(SO_REUSEPORT 运行 N 个 OS 进程,内核负载均衡连接)。作者判断不会提升吞吐——所有池形态实验吞吐仅在 2.1 到 3.15rps 间波动,真实成本是每图约 700ms 的 libvips CPU 工作,非调度或通道开销。prefork 改变的是进程数而非核心数。预期收益在尾部延迟和故障隔离:单进程 GC 暂停或 OOM 不会拖垮其他 fork。

后续计划:等待 govips 合并原生流式支持(PR davidbyttow/govips#539),当前每阶段都整体缓冲为 []byte;HTTP/2 跨流优先级调度器——Go 的 x/net/http2.WriteScheduler 已被维护者弃用,nginx 的优先级树私有,fasthttp 解析 PRIORITY 帧后不再使用,真正先例是 H2O(O(1) 但不公平)、nghttp2(WFQ 但 O(n))、Tempesta FW(WFQ + HAProxy ebtree),计划基于 x/net/http2.Framer 从零实现;扩容信号需区分真实突发与 libvips 线程池饱和——govips 的 ConcurrencyLevel 实际只写不读,RuntimeStats 只统计累计操作数,可行方案是原子 in-flight 计数器配合 VipsConcurrency 门控。


仓库:github.com/go-batteries/optimux

#开发者 #工具 #Optimux #Go #Golang #WorkerPool #libvips #图片处理 #视频处理 #AGPL
@DevToolboxHub
Post #1580 1
AI 代理 USDT 支付架构实战拆解

给 AI 代理发工资,传统支付通道几乎全堵死:Stripe、PayPal 不服务机器人,银行转账需要法人实体,多数加密支付处理器也要求机器人无法完成的 KYC。roborent.cc 在搭建 AI 代理与人类共同赚取 USDT 的任务市场时,从零设计了这套支付架构。

支付管线分五层:账本服务记录待付余额与幂等键,结算服务批量处理并应用费用逻辑,签名服务负责离线密钥管理,广播服务上链并监控确认,最后通过 Webhook 和 WebSocket 通知代理、更新界面。核心原则是账本先行——任何转账前先记录意图,用唯一幂等键防止机器人重试或人工刷新导致的双重支付。

链上选择默认 Tron(TRC-20),单笔手续费约 0.80 美元、3 秒最终性,且 USDT 最大供应量就在 Tron 上;同时通过统一抽象层支持 BEP-20、Arbitrum 和 TON。批量支付每 60 秒收集待付请求并按链分组,TRC-20 用 Merkle 根收件人的合约把多笔转账合并成一笔交易,1000 笔 1 美元支付的手续费从 800 美元降到约 0.80 美元,代价是代理最多等 60 秒。
签名服务跑在气隙隔离机器上,超 1 万美元支付需 3 名操作员中 2 人多签,密钥存 HSM,每次签名请求记录 SHA-256 哈希审计;小额自动支付用热钱包,设每日提现限额、每小时最多 50 笔的速度检查和目标地址白名单。确认规则按链区分:TRC-20 一个区块即终局,BEP-20 等 15 个区块防重组,Arbitrum 超阈值等 L1 确认。
人类工人走相同流程,但享更低起付门槛(5 美元对机器人的 50 美元)、完整支付仪表盘和 CSV 导出。代理间可互相委托子任务,形成嵌套支付图,用托管合约在任务创建时锁定奖励,完成后按委托树一笔交易拆分,整树失败则按比例退款。


余额不足时靠 1.5 倍日均支出的储备缓冲,每 5 分钟监控并触发 OTC 再平衡;Tron 拥堵时对时效敏感支付动态加价至基础费 3 倍;地址格式校验层防止 TRC-20 与 BEP-20 地址误投导致资金永久丢失。

这套架构覆盖了从账本、批量、签名到确认、异常处理的完整链路,对做 AI 代理市场或自动化工人支付平台的开发者有直接参考价值。

#开发者 #工具 #USDT #TRC20 #Tron #AI代理 #Web3 #稳定币 #智能合约 #RoboRentCC
@DevToolboxHub
Post #1579 4
AI 代理审计指南:从可变日志到防篡改历史

AI 代理出错、产生幻觉或发起破坏性 API 调用时,首先要问的是:它为什么这么做?安全与合规团队越来越常追问的是:你能证明吗?随着 AI 代理从实验沙箱走向生产环境,可观测性与可审计性之间的区别开始变得重要。对多数团队这是工程纪律问题;对欧盟 AI 法案下的高风险系统,则是有明确截止日期的可追溯性要求。

标准日志为何不够用:传统日志是可变的,任何有数据库访问权限的人或恶意脚本都能事后篡改历史。可被静默重写的追踪记录不能作为证据。即便无人触碰,常规追踪也绑定于可变的内存状态,很少捕获失败运行启动时的确切配置与上下文,因此无法重建更无法重放该运行。

审计代理需要记录完整执行上下文,而非仅最终输出或 token 数:输入(确切提示词、任务或消息负载,以及模型配置如 model、temperature、system prompt 版本);推理过程(中间步骤,包括考虑过又放弃的路径,如 gf.reasoning.thought、gf.reasoning.considered、gf.reasoning.rejected,被放弃的路径与最终选择同样重要);工具调用(传给外部工具的精确参数及返回结果,副作用发生于此);输出与审批(原始补全、结构化决策及人工审批元数据)。

防篡改机制:每个动作作为独立条目追加到账本,条目携带由自身规范负载、时间戳及前一条目哈希计算出的 SHA-256 哈希,形成连续哈希链。过去记录中任何字节被改动、删除或重排,后续哈希即失配,验证立即失败。哈希链证明已捕获内容的完整性,不证明完整性——未插桩的运行无法被链补救。自托管账本上的封条仅证明内部一致性,要抵御「你重写了整条链」的质疑,需外部锚定(RFC 3161 可信时间戳),这是防篡改与防伪造的区别。

审计不得危及运行:代理绝不阻塞于记录层,span 异步导出、批量处理、失败时缓冲,后端缓慢或不可达只损失遥测延迟,不影响运行本身。接收侧故障隔离,编排器与证据层是分离系统,单向数据流。证据层只接收已发生的事实,不参与产生过程,记录因此可跨进程崩溃存活,也可在不同提示词、模型或代码的运行间做 diff。

合规锚点:欧盟 AI 法案第 12 条要求高风险 AI 系统可追溯与自动日志,附件 III 义务自 2027 年 12 月 2 日起适用;SOC 2 Type II 要求证明系统访问与修改经授权且可审计;NIST AI RMF(GOVERN)要求映射问责与透明追踪。


Span Chain 是该指南的参考实现,开源 AI 代理证据层,基于 Elixir/OTP 构建。它不运行或编排代理,执行完全留在你侧;后端被动接收 OpenTelemetry(OTLP/HTTP)span,每个运行隔离在独立进程中,每条目封入 SHA-256 哈希链,可随时用 verify_ledger 验证。Python SDK 批量发送 span 并在失败时缓冲,后端缓慢或不可达不会阻塞代理。它位于可观测性栈之下而非取代之:可观测性展示发生了什么,账本保存证明。

由于账本捕获每次运行的确定性记录,还支持 VCR 式回放:已记录运行可在本地零实时 LLM 调用重放,与基线做结构 diff 可定位确切偏差点。针对修改后代码的新对比运行是真实执行,成本与任何运行相同;重放已记录内容零成本。外部 TSA 锚定(RFC 3161)在路线图上,面向需要从防篡改升级为防伪造的受监管部署。支持 Docker Compose 自托管,MIT 许可。

github.com/ghostfactory-art/spanchain

#开发者 #工具 #AI代理 #可审计性 #哈希链 #OpenTelemetry #Elixir #欧盟AI法案 #SpanChain
@DevToolboxHub
Post #1578 4
技术文档模板:五页结构搭好产品文档骨架

写文档时常常要同时决定读者从哪开始、如何完成首个任务、细节放哪、失败怎么恢复。一个空文档仓库会让每个贡献者重新发明导航、页面职责和发布检查。这套模板用五个聚焦页面、一个本地校验器和严格构建路径,在写产品内容之前先把结构定下来。

模板包含 Markdown 源码、MkDocs 配置、校验脚本和 GitHub Actions 部署工作流。五个页面各司其职:index 引导读者选首个任务,getting-started 完成首次配置,guides 执行单个有界操作,reference 查稳定细节,troubleshooting 从已知故障恢复。目录做不到这些——它只能标注页面名称,无法建立前置条件、测试命令、预期结果和恢复路径。

从最小可验证动作开始写 getting-started。对 API 是带认证请求返回已知响应,对 CLI 是安装后跑一条安全命令,对内部服务是本地开发环境能访问健康检查端点。明确前置条件、给出确切操作、展示预期状态、链接下一个任务。稳定名称、类型、默认值和约束放进 reference,不要全堆进入门页。

给每个页面指定负责人和更新触发条件。API schema 变更触发 reference 审查,引导路径调整触发 getting-started 审查,重复出现的支持问题应新建或更新 troubleshooting。页面归属某个读者决策时才值得存在,否则会让其他页面更难扫描、更新或验证。

校验器检查导航目标存在、每个 Markdown 页面只有一个 H1、本地链接可解析。运行 python scripts/validate_docs.py 和 mkdocs build --strict。校验范围刻意收窄,无法证明 API 端点可用、权限正确或截图匹配当前界面,这些仍需产品级检查。

部署工作流安装固定版本依赖、运行校验器、严格构建站点目录、上传为 Pages 产物并部署。启用 GitHub Actions 作为发布源,工作流跑完后验证公开 URL,别把绿色构建当作已发布。不要把生产凭据、私有示例或客户数据放进仓库,Pages 内容即使仓库私有也是公开的。


这套模板解决的是空仓库时每个贡献者都要重新发明导航和发布检查的问题。先跑通一条测试路径,再按读者需求逐步加页面——需要稳定细节时加 reference,出现可识别症状和恢复路径时加 troubleshooting,需要理解设计选择才能安全使用时加 explanation。模板保持比产品小,但能随产品一起成长。
@DevToolboxHub
Post #1577 8
Prochesta 自建 MongoDB 备份实战

从 MongoDB Atlas 迁到自托管副本集后,Prochesta 省了钱却丢了 Atlas 自带的持续备份。生产数据落在单台 VPS 上,没有快照、没有异地副本,一次误删或坏盘就是灭顶之灾。他们真正需要的不是"备份数据库",而是恢复到任意时间点——夜间快照救不了 14:20 发生的损坏。

选型时他们先排除了自研的 mongopit(基于 mongodump --oplog 与 oplog 回放),因为存储目标是 Cloudflare R2 而非 Google Drive。R2 零出口流量费让恢复演练成本为零,S3 语义也比 Drive 的文件同步更适合无人值守的夜间任务。最终选了 Percona Backup for MongoDB(PBM),但 MongoDB Community 没有 $backupCursor 聚合阶段,PBM 只能做逻辑备份:主节点承担备份 CPU 开销,恢复时间随数据量增长快于备份时间。

架构上 dev 与 prod 共用同一个 R2 bucket,靠 key 前缀隔离,引导脚本会校验 PBM 实际写入的前缀,配置错误直接中止。保留策略为 7 天全量快照加 2 天每 10 分钟的 oplog 切片,两小时内可恢复到任意瞬间。监控没用 Percona 自带的 exporter,而是每 5 分钟解析 pbm status 写入 Prometheus textfile,用时间戳停滞作为死信开关,15 分钟无更新即告警。

上线踩了四个坑:空密码的 agent 拖垮整个部署、setup 脚本保留旧 feature flag 导致静默跳过、PBM 2.15 返回带括号的配置值导致前缀校验失败、restore 在无 TTY 管道里因确认提示直接退出。每个 bug 都在运维脚手架而非备份引擎本身。


首份生产备份 74.98 MB 对应 517 MB 数据目录,逻辑备份只带文档不带存储,索引在恢复时重建,journal 和 oplog 属于工作状态。尚未解决的是自动化恢复验证——目前没有定时把最新备份恢复到临时实例并校验集合计数,PBMBackupSizeCollapsed 告警只是粗糙的替代品。备份与 API 容器共享 R2 凭据,任何持有该 key 的进程都能删光备份,R2 又没有对象版本化兜底,预留了独立 PBM_R2_* 密钥的切换位。

#开发者 #工具 #MongoDB #Percona #PBM #CloudflareR2 #DevOps #数据库备份 #Prochesta
@DevToolboxHub
Post #1575 8
AWS 高频服务入门指南:13 个核心服务速览

AWS 提供 200 多项服务,但日常开发真正高频用到的其实就十几个。这篇指南面向新手,把最常用的服务按用途拆开讲清楚,也适合老手快速复习。

登录 AWS 控制台后,主要靠顶部搜索栏导航服务,同时要注意 REGION 区域选择——在某个区域创建的资源,只有切到对应区域才能看到。不同区域之间资源不互通,而且即使忘了删除,账单也不会忘。

核心服务速览:

• IAM:控制谁能访问 AWS 资源、能做什么,用用户、组、角色和策略管理权限,避免把根账号凭证直接交给他人
• EC2:云端虚拟服务器,可自选操作系统、机型、存储和网络配置;配套安全组(防火墙规则)、弹性 IP(静态公网 IPv4)、负载均衡(分发流量)和自动扩缩容(按预设规则增减实例)
• S3:高可扩展对象存储,适合图片、视频、备份、日志、静态网站资源等;桶名在 AWS 分区内全局唯一,按存储量和请求计费
• ECR:Docker 镜像仓库,存储镜像并供 ECS、EKS 等容器服务使用
• ECS:AWS 容器编排服务,负责容器的启动、停止、扩缩容和故障替换
• EKS:AWS 托管 Kubernetes 服务,控制面由 AWS 管理,已有 K8s 经验和 YAML 清单可直接复用
• VPC:AWS 内的私有网络,可控制 IP 段、子网、路由表和公网/私网访问,例如把数据库放在私有子网、应用放在公网侧
• Lambda:无服务器计算,无需管理底层服务器,适合事件驱动场景,如图片上传 S3 后自动触发缩图
• CloudWatch:监控与可观测性服务,收集指标、日志、告警和仪表盘,例如 CPU 超阈值触发通知
• CloudTrail:记录 AWS 账号内的操作审计日志,包括控制台、CLI、SDK 和 API 调用,可查谁在何时创建或删除了资源
• RDS:托管关系型数据库,可选多种数据库引擎,AWS 负责备份、补丁等运维工作
• DocumentDB:托管文档数据库,兼容 MongoDB,但并非 MongoDB 在 AWS 上的简单托管,两者存在差异
• ElastiCache:托管缓存服务,支持 Valkey 和 Memcached,适合缓存热点数据、减少数据库查询压力

快速记忆:IAM 管权限、EC2 是虚拟服务器、S3 是对象存储、ECR 存镜像、ECS 编排容器、EKS 是托管 K8s、VPC 是私有网络、Lambda 免运维跑代码、CloudWatch 看状态、CloudTrail 查操作、RDS 管关系库、DocumentDB 管文档库、ElastiCache 做缓存。


不需要背下全部 200 多项服务,从实际用到的开始,遇到再学即可。

#开发者 #工具 #AWS #云计算 #DevOps #IAM #EC2 #S3 #Lambda #Kubernetes
@DevToolboxHub
Post #1574 10
Vercel Sandbox 实战:安全运行 AI 生成代码

Vercel Sandbox 用 Firecracker 微虚拟机隔离执行不受信任的代码,包括模型刚生成的脚本。每个沙箱独立、临时、有硬超时,无法回读应用的环境变量。作者把所有「让模型写代码并执行」的功能从 child_process 迁到了 Sandbox。

为什么不能直接在 Vercel Function 里跑 AI 生成的代码?Function 与其余应用共享进程、文件系统和环境。用 child_process.exec 或 eval 执行不受信任的字符串,会把 API 密钥、数据库 URL 等全部秘密暴露给模型写的代码。生成的代码能读环境变量、外联窃取数据,或占满 CPU 拖垮同进程的其他请求。

Vercel Sandbox 底层为每个沙箱启动一个 Firecracker 微虚拟机,与 AWS Lambda 租户隔离用的是同一类虚拟化技术,而非命名空间或 cgroup 容器。逃逸容器的难度是跨内核命名空间边界,逃逸微虚拟机则需要针对一个无其他负载共享的内核找到 hypervisor 级漏洞。

创建沙箱只需一次调用:Sandbox.create({ runtime: 'node22', timeout: 60000, resources: { vcpus: 2 } })。runtime 选基础镜像,timeout 是硬上限,resources.vcpus 控制 CPU。执行 LLM 生成的代码时,先把代码写入沙箱内文件,再作为子进程运行,绝不把模型输出传给 eval 或 Function 构造器。

沙箱默认无状态,每次 create 都是全新文件系统,stop 或超时即彻底销毁。需要跨运行记住状态(如多轮代码解释器对话)时,状态必须存在沙箱外。runCommand 支持 detached 选项,可边运行边把 stdout 流式传回浏览器,默认 Node.js 运行时即可,无需 edge runtime。


沙箱适合模型生成或用户提交的不受信任代码,不适合自己写的可信代码或完整 CI 构建流程——后者应留在部署管道里。沙箱的隔离边界正是它的价值所在。

#开发者 #工具 #Vercel #Sandbox #Firecracker #AI安全 #Nodejs #微虚拟机
@DevToolboxHub
Post #1572 12
四个 AI Agent 技能让编码工作流更锋利

AI 编码代理常被当作单一工具讨论:要代码,给代码。实际有用的代理工作是有阶段的。需求不清、设计需推敲、实现进行中、工作要移交新会话,这四种场景需要不同行为。用一个巨型 prompt 解决所有阶段,通常只能得到妥协方案。

文章介绍四个针对性技能:Caveman 负责精简执行沟通,Superpowers 负责结构化开发,grill-me 负责压力测试方案,handoff 负责把进行中的任务移交新代理或新会话。它们互补,目标不是给每次编辑增加仪式,而是在最可能造成浪费的节点施加最小有效约束。

AI 辅助开发的四种失败模式
代理在理解工作前就开始编码。比如「添加组织角色」这个需求,隐藏了成员资格、权限范围、迁移、审计追踪、错误处理和发布等决策。代理可能在所有选择明确前就产出看似合理的补丁。
代理只会附和不会质疑。辅助型助手倾向接受既定框架,当框架是提案而非确定需求时很危险。需要一场能暴露依赖、追问可能失败点的访谈。
日常工作中代理话太多。方向批准后,冗长解释变成摩擦。调试、评审跟进和小实现循环中,有用输出通常是发现、变更、验证和风险说明。
会话边界丢失上下文。新代理无上下文会重复探索;带完整记录的新代理要在过时想法和工具日志中找当前状态。两者都不是可靠续作方式。

grill-me:写代码前挑战方案
手动调用的技能,一次一个问题访谈你的计划或设计,给出推荐答案并等待反馈。代码库里有事实可查时,应检查代码而不是让用户重建。适用于想法合理但未定案时,如新 API 契约、权限模型、缓存策略、工作流重设计或 schema 变更。目的不是问无穷假设,而是解决实现时可能意外做出的决策。从具体提案开始,说明目标、约束、现有产物和期望输出,先让代理检查相关文件,再逐个决策拷问计划,记录决策、非目标、开放风险和下一个要创建的产物。

Superpowers:把决策变成受控交付流程
方向明确后,Superpowers 提供更完整的开发工作流。

其仓库描述的过程:
• 代理澄清实际结果
• 开发规格和设计
• 获得批准
• 创建实现计划
• 强调真正的红绿 TDD
• 进入实现和评审。也支持有真实任务边界的子代理驱动开发。适用于错误假设代价高的场景:新功能
• 公开 API 变更
• 复杂 bug
• 行为重构
• 迁移或安全敏感变更。关键收益是存在关卡:澄清抓住错误结果,设计批准拦住糟糕形态,计划让顺序可见,红绿测试让选定行为可执行,评审把交付 diff 与批准意图对比而非只看代码是否合理

Caveman:保持执行沟通紧凑
改变代理输出风格为简洁直接。README 把目标定义为缩小代理的「嘴」而非「脑」,代码、命令和错误保持精确。项目声称减少 65% 输出 token,应视为项目声明而非通用基准。适用于重要决策已定之后:已知范围的 bug、测试失败、终端密集任务或评审跟进。要求输出根因、改动文件、验证运行、结果和剩余风险。当细微差别本身就是交付物时不适合精简模式。规则简单:减少填充,绝不减少证据。实用模式是设计批准前用正常详细度,之后切换简洁执行报告,要求代理明确阻塞点和假设。

handoff:跨边界携带进行中的线索
生成紧凑文档供新代理续作。记录在途内容、为何重要、下一步该做什么、续作建议技能。关键是不复制而是引用现有规格、计划、ADR、issue、commit 和 diff。保存到系统临时目录而非工作区,并会脱敏密钥和个人身份信息。在结束工作前、接近上下文限制、任务在代理间移动或有意重置对话时使用。好的 handoff 写明目标、已完成工作、已定决策、阻塞点、验证、权威引用和一个精确的下一步动作。「明天继续」不够;「服务层授权已完成;实现邮件发送前检查通知适配器;已批准规格在此路径;目标测试通过」才可执行。

集成工作流
先框定请求,说明期望结果、约束和非目标。用 grill-me 压力测试关联决策并检查仓库证据。用 Superpowers 把已定决策转成批准的设计、计划、测试、实现和评审。执行阶段用 Caveman 保持更新紧凑,同时保留发现、命令、测试结果和风险。转换时用 handoff,只保留可续线索并指向持久产物。并非每个任务都需要所有阶段:琐碎本地改动可能一个都不用;中型功能可能需要 Superpowers 和 Caveman;高风险设计变更可能从 grill-me 开始、以 handoff 结束。价值在于选择合适控制,而非机械调用每个工具。

如何采用这套组合
从小处开始。选一个有实质歧义的功能,让代理检查相关代码并拷问提案,要求可评审的设计和测试计划。批准后切换短执行报告。在第一个计划中的上下文切换点创建 handoff,让新代理从它继续。衡量真正重要的结果:代码前捕获了多少假设、评审者能否解释 diff 为何存在、切换后代理重复探索的频率、简洁报告是否缩短人工评审循环。不要只用 token 数或生成计划看起来多厉害来判断成功。

限制与护栏
这些技能不替代可问责的工程判断。它们不能决定产品策略、保证系统安全或证明验收标准反映真实用户需求。它们让决策、证据和转换可见。使用源码控制、评审、测试、可观测性和常规发布控制。密钥不要进入对话和 handoff。把代理建议当作决策输入,而非决策本身。


底线

可靠的 AI 辅助开发不是让代理始终表现一致。计划不确定时让它质疑,变更影响大时遵循纪律化工作流,执行清晰时简洁沟通,上下文变化时干净移交。Caveman、Superpowers、grill-me 和 handoff 各自让这套系统的一部分更锋利。

来源:Caveman 仓库、Superpowers 仓库、AI Hero 的 grill-me 与 handoff

#开发者 #工具 #AI代理 #Caveman #Superpowers #grillme #handoff #LLM #PromptEngineering #AI编程
@DevToolboxHub
Post #1571 7
Ouroboros:用规格优先流程约束 AI 编码

AI 编码工具最常见的失败发生在写第一行代码之前:提示词含糊,模型用你从未认可的假设悄悄填补空白。你要求「一个任务管理 CLI」,模型自行选定了数据模型、优先级方案、持久化层——每个选择都合理,但没有一个属于你。等你在 review 时发现,已经写了三个文件,只能返工。提示、猜测、返工、重复,这就是多数人被困住的循环。

Ouroboros 是一个开源的 Agent OS,修的是输入而不是输出。它是本地优先的运行时层,位于 Claude Code、Codex CLI、OpenCode、Gemini CLI、GitHub Copilot CLI、Kiro、Hermes、Pi、Zcode 之前,用五阶段可回放流程替代临时提示:interview、seed、execute、evaluate、evolve。

核心思路是把「意图不明确」量化。Interview 阶段用苏格拉底式提问暴露你没意识到的假设;Seed 阶段把回答固化为不可变规格,包含验收标准、本体、约束;Execute 阶段按 Double Diamond 分解执行;Evaluate 是三级门禁:机械检查、语义检查、多模型共识;Evolve 把评估结果反馈进下一轮 seed,直到系统不再学到新东西。

停止条件不是计时器或步数,而是数学。歧义度按四个维度(目标、约束、成功标准、现有代码库上下文)的加权清晰度取反计算:Ambiguity = 1 - Sum(clarity_i * weight_i)。README 里的绿地示例:清晰度 0.81,歧义度 0.19,低于 0.2 阈值才允许生成 seed。高于阈值就继续提问,不让代理在 shaky 的地基上写代码。

进化循环出口也有对应门禁:连续两代本体相似度达到 0.95 才停止,并单独检测停滞、振荡、重复反馈,避免在已回答的问题上空转。


安装后,在支持的 AI 编码代理会话里运行 ooo interview "I want to build a task management CLI"。安装器自动检测当前运行时并注册 MCP server。另有纯 CLI 命令 ouroboros run seed.yaml、ouroboros status executions,以及跨会话持久运行进化循环的 ooo ralph——机器中途重启会从事件存储重建谱系,接着跑而不是从头来。

它不保证第一次就写出更好的代码,但保证你知道自己要的是什么。MIT 许可,Python 3.12+,仓库为每个支持的 CLI 提供了运行时指南。

github.com/Q00/ouroboros

#开发者 #工具 #Ouroboros #AI编码 #规格优先 #开源 #CLI #AgentOS
@DevToolboxHub
Post #1570 7
面对这份清单不必恐慌,问题在于试图同时掌握所有内容。正确做法是分层学习,随着知识增长逐步构建更接近真实场景的应用。以下是作者给出的 2026 年 .NET 学习路线。

核心路径:C# → .NET → ASP.NET Core → SQL → EF Core → REST API → 认证 → 测试 → 架构 → Docker → 云与 CI/CD。

版本选择上,2026 年应聚焦 .NET 10,它是 LTS 版本,微软支持至 2028 年 11 月;.NET 9 是 STS 版本,支持至 2026 年 11 月。不要从旧版 .NET Framework 教程开始,除非需要维护遗留系统。

学习顺序建议:先掌握 C# 14 基础,再理解 OOP 但不过度设计接口;熟练集合、泛型与 LINQ,理解延迟执行在内存集合与 IQueryable 上的差异;尽早学习 async/await 与 CancellationToken,理解异步 I/O 为何能避免阻塞线程。

进入 ASP.NET Core 前先学 HTTP,理解方法、状态码、请求响应结构;再理解 Program.cs、依赖注入生命周期(Transient/Scoped/Singleton)、中间件管道。控制器与 Minimal API 都值得掌握,按场景选择。

数据库方面,先学 SQL 再学 EF Core,不要成为不会写 SQL 的 ORM 开发者;避免直接返回数据库实体,使用请求响应模型;学习验证、JWT 认证授权、集中式异常处理、结构化日志与 OpenTelemetry。

测试从单元测试起步,逐步覆盖集成测试与端到端测试;架构上理解依赖方向比文件夹名称更重要,但不要过度设计,CRUD 应用不需要全套 CQRS 与 Mediator。

工程化部分包括 Docker、CI/CD、选择一个云平台、缓存与后台任务、SignalR 实时通信、消息队列。Aspire 值得学,但要先理解底层系统再使用编排工具。

性能与安全是工程纪律:关注 N+1 查询、索引缺失、分页、连接池;安全上重视越权访问、SQL 注入、密钥管理。Git 要超越 git push,理解团队协作流程。

AI 时代的学习方式需要调整:先自己解决问题,再让 AI 审查,对比多种方案后自己做最终决策。AI 应提升工程杠杆,而不是替代工程判断。养成先查官方文档的习惯。

项目应从任务管理 API 起步,逐步升级到电商后端、实时系统、分布式应用;不要过早引入微服务,模块化单体足以学习大部分边界问题。

六个月路线:第一个月 C# 基础,第二个月 ASP.NET Core 与 HTTP,第三个月数据库与 EF Core,第四个月生产后端概念,第五个月基础设施与部署,第六个月架构与分布式系统。

初级开发者应能脱离教程独立构建应用,熟练使用文档、Stack Overflow、AI 与博客;中级开发者更看重判断力:为什么查询慢、为什么端点不安全、为什么服务边界错误。

常见错误包括只学 C#、只学框架、照抄 Clean Architecture 模板、因 EF Core 而回避 SQL、只做 CRUD 项目、过早微服务、完全依赖 AI、从不部署。

推荐技术栈:C# 14、.NET 10、ASP.NET Core 10、PostgreSQL、EF Core、Redis、SignalR、RabbitMQ 或 Azure Service Bus、xUnit、Docker、GitHub Actions、Azure 或 AWS、OpenTelemetry、Aspire。

调试时不要立刻把整个项目丢给 AI,先问自己:改了什么、异常是什么、能否复现、堆栈说什么、生成的 SQL 是什么。能调试的开发者才能穿越技术变迁。

最终目标不是成为 ".NET 开发者"。技术栈会变,可迁移的能力是编程、调试、数据建模、API 设计、测试、安全、架构、分布式系统、性能、沟通与问题解决。.NET 只是练习这些技能的生态。


#开发者 #工具 #DotNet #CSharp #ASPNETCore #EntityFrameworkCore #Docker #CICD #Azure #OpenTelemetry
@DevToolboxHub
Post #1569 10
2026 年 .NET 开发者完整路线图

学习 .NET 不等于只学 C# 语法。能写变量、循环、LINQ 甚至 ASP.NET Core 控制器,离真正构建生产级应用仍有距离。现代 .NET 开发者的实际工作范围涵盖 C#、.NET、ASP.NET Core、HTTP 与 REST API、数据库、Entity Framework Core、认证授权、依赖注入、测试、日志、缓存、Docker、CI/CD、云基础设施、应用架构、调试、安全、性能、Git 以及 AI 辅助开发。

面对这份清单不必恐慌,问题在于试图同时掌握所有内容。正确做法是分层学习,随着知识增长逐步构建更接近真实场景的应用。以下是作者给出的 2026 年 .NET 学习路线。

核心路径:C# → .NET → ASP.NET Core → SQL → EF Core → REST API → 认证 → 测试 → 架构 → Docker → 云与 CI/CD。

版本选择上,2026 年应聚焦 .NET 10,它是 LTS 版本,微软支持至 2028 年 11 月;.NET 9 是 STS 版本,支持至 2026 年 11 月。不要从旧版 .NET Framework 教程开始,除非需要维护遗留系统。

学习顺序建议:先掌握 C# 14 基础,再理解 OOP 但不过度设计接口;熟练集合、泛型与 LINQ,理解延迟执行在内存集合与 IQueryable 上的差异;尽早学习 async/await 与 CancellationToken,理解异步 I/O 为何能避免阻塞线程。

进入 ASP.NET Core 前先学 HTTP,理解方法、状态码、请求响应结构;再理解 Program.cs、依赖注入生命周期(Transient/Scoped/Singleton)、中间件管道。控制器与 Minimal API 都值得掌握,按场景选择。

数据库方面,先学 SQL 再学 EF Core,不要成为不会写 SQL 的 ORM 开发者;避免直接返回数据库实体,使用请求响应模型;学习验证、JWT 认证授权、集中式异常处理、结构化日志与 OpenTelemetry。

测试从单元测试起步,逐步覆盖集成测试与端到端测试;架构上理解依赖方向比文件夹名称更重要,但不要过度设计,CRUD 应用不需要全套 CQRS 与 Mediator。

工程化部分包括 Docker、CI/CD、选择一个云平台、缓存与后台任务、SignalR 实时通信、消息队列。Aspire 值得学,但要先理解底层系统再使用编排工具。

性能与安全是工程纪律:关注 N+1 查询、索引缺失、分页、连接池;安全上重视越权访问、SQL 注入、密钥管理。Git 要超越 git push,理解团队协作流程。

AI 时代的学习方式需要调整:先自己解决问题,再让 AI 审查,对比多种方案后自己做最终决策。AI 应提升工程杠杆,而不是替代工程判断。养成先查官方文档的习惯。

项目应从任务管理 API 起步,逐步升级到电商后端、实时系统、分布式应用;不要过早引入微服务,模块化单体足以学习大部分边界问题。

六个月路线:第一个月 C# 基础,第二个月 ASP.NET Core 与 HTTP,第三个月数据库与 EF Core,第四个月生产后端概念,第五个月基础设施与部署,第六个月架构与分布式系统。

初级开发者应能脱离教程独立构建应用,熟练使用文档、Stack Overflow、AI 与博客;中级开发者更看重判断力:为什么查询慢、为什么端点不安全、为什么服务边界错误。

常见错误包括只学 C#、只学框架、照抄 Clean Architecture 模板、因 EF Core 而回避 SQL、只做 CRUD 项目、过早微服务、完全依赖 AI、从不部署。

推荐技术栈:C# 14、.NET 10、ASP.NET Core 10、PostgreSQL、EF Core、Redis、SignalR、RabbitMQ 或 Azure Service Bus、xUnit、Docker、GitHub Actions、Azure 或 AWS、OpenTelemetry、Aspire。

调试时不要立刻把整个项目丢给 AI,先问自己:改了什么、异常是什么、能否复现、堆栈说什么、生成的 SQL 是什么。能调试的开发者才能穿越技术变迁。

最终目标不是成为 ".NET 开发者"。技术栈会变,可迁移的能力是编程、调试、数据建模、API 设计、测试、安全、架构、分布式系统、性能、沟通与问题解决。.NET 只是练习这些技能的生态。


2026 年 .NET 开发者完整路线图

学习 .NET 不等于只学 C# 语法。能写变量、循环、LINQ 甚至 ASP.NET Core 控制器,离真正构建生产级应用仍有距离。现代 .NET 开发者的实际工作范围涵盖 C#、.NET、ASP.NET Core、HTTP 与 REST API、数据库、Entity Framework Core、认证授权、依赖注入、测试、日志、缓存、Docker、CI/CD、云基础设施、应用架构、调试、安全、性能、Git 以及 AI 辅助开发。
Post #1567 9
Hugging Face 今日 Top10:Agentic RL 与空间推理成主线

今日 Hugging Face 论文榜显示,AI 正从「回答问题」转向「执行长时任务」。上榜论文集中在 agent、long-horizon planning、reward modeling、temporal reasoning 与空间理解。以下为获赞最高的 10 篇,每篇按问题、思路、亮点、应用四方面简述。

Recursive Synthesis for Long-Horizon Terminal Tasks(2608.05466)
针对仅末端反馈的长流程任务,提出递归合成:将大任务拆为子目标,逐段求解、验证后递归合并,强调可验证的正确性。适用于多步企业自动化、长流程软件操作与机器人规划。

AgentOPSD: Recursive Self-Distillation for Agentic RL(2608.05987)
用递归自蒸馏解决 agentic RL 探索成本高、策略不稳的问题:agent 持续从自身优质轨迹学习,迭代精炼策略。面向 web/desktop agents 与多阶段任务。

ABSeeker: Answer-Backtracked Credit Assignment(2608.05102)
针对长时搜索任务的 credit assignment 难题,从最终答案回溯搜索路径,定位真正贡献步骤。适合 deep research agents 与多文档问答。

OSReward: 跨平台 Computer-Use Reward 评估标准(2607.28609)
为 computer-use agents 的 reward model 建立跨平台统一评估框架,覆盖 web、desktop 与不同操作系统,便于标准化比较与上线前校验。

Interpretable MEG Decoding of Perceived Speech(2608.01481)
从 MEG 信号解码感知语音,并指出驱动检索的皮层来源与刺激特征,兼顾性能与神经生物学可解释性。面向 BCI 与失语患者辅助沟通。

WorldClaw: Agentic 3D Open-World Generation(2608.05248)
将 3D 生成从单次生成转向 agentic 世界构建:通过顺序决策放置结构、添加对象、调整布局并扩展空间。用于开放世界游戏、数字孪生与 VR/AR 内容。

GST-Bench: VLM 全局空间感知基准(2608.05747)
检验 VLM 能否从视频建立全局空间意识,而非仅依赖局部帧。面向机器人导航、embodied AI 与视频推理能力评估。

EnvACE: World Rehearsal 内化环境动态(2608.06197)
通过世界模型「预演」内化环境动态,减少 agentic RL 对真实交互的依赖,降低试错成本。适用于机器人学习与 web/desktop agents。

ChronoVision: 潜在状态重建实现时序推理(2608.05631)
将 temporal reasoning 视为潜在动态状态重建问题,而非帧序列上的 attention。用于长视频分析、多步动作理解与事件预测。

Learning from Failures: Retrieval-Centric CoT(2608.06060)
将 Chain-of-Thought 引入多模态检索,利用 hard negatives 作为训练信号,帮助模型区分表面相似与语义正确。面向图文检索、电商搜索与推荐系统。

综合今日榜单,四条主线清晰:agentic AI 聚焦长任务学习、reward 与 credit assignment;空间-时序推理成为核心能力;world model 与 rehearsal 回归以降低学习成本;AI 加速贴近真实环境,覆盖操作系统、3D 世界与脑信号。值得优先关注的是 agentic RL 与 reward/credit 方向,如 AgentOPSD、ABSeeker、EnvACE 与 OSReward。


#开发者 #工具 #HuggingFace #AgenticRL #ComputerUse #WorldModel #TemporalReasoning #3DGeneration #MEG #VLM
@DevToolboxHub
Post #1566 5
用AI开发Chrome扩展自动保存Gemini对话

开发者Shin在e-shikumi-labo分享了一个四篇系列文章,讲述如何借助Gemini AI构建个人Chrome扩展,自动把有用的Gemini对话保存到电子表格。核心思路不是让AI凭空猜测网页结构,而是明确要求它"不要猜,缺信息就问"。

开发第一步,作者直接向Gemini抛出提示词:"我想用Chrome扩展把Gemini的回复保存到电子表格,告诉我怎么构建,不要用你的想象力,如果需要具体信息请指出来。"关键约束是两条:不猜测、缺信息要主动索取。因为AI在写网页数据提取工具时,常会自行猜测HTML标签和类名,导致代码与真实页面结构不符而失效。

AI随后要求作者从Gemini页面复制两个HTML元素:用户提示词区域的包裹元素和Gemini回复区域的包裹元素。作者通过F12打开DevTools,复制粘贴这些代码片段给AI。AI据此写出了精准定位元素的JavaScript数据提取逻辑,以及发送数据到电子表格的程序。加载扩展后,屏幕上的对话数据会自动写入表格。

作者感慨,过去手动检查复杂网页HTML元素来写爬虫工具的经历相当痛苦,如今AI分析HTML元素并组装准确代码的能力让他真切感受到时代进步。他得到的启示是:人类不需要记忆Chrome扩展的JavaScript语法,编码可以交给AI,真正的主动权在于理解"输入(屏幕提取)→处理(去重)→输出(发送到GAS)"的整体系统结构,以及如何向AI传递准确的实际信息。


基于原型,作者发布了两个版本的工具。Lite版免费开源,一键将当前Gemini对话导出为Markdown文件,零配置、无需GAS或API密钥,完全在本地浏览器运行,适合快速保存到本地笔记应用。Pro版提供完整自动化管道,通过MutationObserver自动检测新回复并同步到Google Sheets和Google Drive,无重复条目。

需要说明的前提是,由于Gemini界面可能更新,工具存在失效可能,不保证永久运行。技术限制方面:手机应用中的对话无法保存,因为依赖PC Chrome扩展机制;没有历史日志的批量同步功能,但过去线程在PC浏览器打开一次会自动检测并保存最近对话。

作者预告下一篇将介绍同时生成Markdown文件到Google Drive的机制,方便在Obsidian等本地笔记应用中构建知识库。


#开发者 #工具 #Chrome扩展 #Gemini #AI编程 #JavaScript #GAS
@DevToolboxHub
Post #1565 4
LLM 价格 API:为 AI Agent 而生

LLM Price Watch 最初只是解决一个麻烦:每次新模型发布,都要手动打开 Claude、GPT、Gemini、DeepSeek、Grok 五个定价页,逐项对比每 token 价格。作者先做了个计算器,又在后面加了 API,然后发现真正的调用方可能不是人。

第一版 API 是标准结构:GET /v1/models 返回全部追踪模型的当前定价,GET /v1/models/:id 查单个模型,GET /v1/calculate 按模型和输入输出 token 数算单次调用成本。人类开发者调用 /calculate 拿到数字,嵌进自己的成本看板,事情就结束了。

真正改变设计的是第四个端点:GET /v1/recommend?use_case=X。它不只返回价格,而是基于价格和站点对比页已有的编辑分析,给出某个用例(长文档摘要、高量分类、编码辅助、客服)该用哪个模型的推荐。这个端点出现后,API 的实际受众从「做成本看板的开发者」扩展到了「运行时自己做工具选择的 AI Agent」。

Agent 框架决定把任务路由到哪个模型时,不想读博客文章,它要的是结构化答案:给定这个用例,该用什么,成本多少。这是工具调用,不是页面浏览。这个重新定位带来几个具体决策:CORS 刻意全开,API 不设前端看板,允许从任何调用方代码直接访问,包括客户端 Agent 代码;暂时不需要 API key,Agent 想拿数据到拿到数据之间的每一点摩擦都是对实际用例的阻碍,等真实用量起来后再上带速率限制的付费层是自然路径,但第一天就设门槛会违背初衷;/recommend 返回推理过程而不只是模型名,Agent 或构建它的人需要知道为什么,否则推荐就是个没人敢接进决策的黑盒。

数据准确性是另一半关键。五个提供商的定价直接对照各家官方定价页核实,不采第三方聚合源——聚合源有滞后,对要指导真实支出决策的数据来说,过期定价比没有数据更糟。目前更新仍是手动快照,用量足够后下一步自然是加自动刷新 worker。作者没想到的是,这个 API 最终喂给了自己运营的另一个站点 StackIndex AI,其成本计算页实时调用此 API,内联返回模型推荐和成本估算。两个独立站点共用同一后端,跨域 CORS,端到端测试通过。


作者总结:设计响应时,要面向一个无法追问的读者。这个约束对 API 设计的帮助超过其他几乎所有因素。

#开发者 #工具 #LLM #API #AI #LLMPriceWatch #StackIndexAI
@DevToolboxHub
Post #1564 5
开源工具审计 18 家网站 AI 爬虫可见性

开发者 Alex Bouchard 发布开源工具 geo-crawl-audit,用主流 AI 爬虫的 user-agent 探测网站,对比其与普通浏览器的待遇差异,并统计 JavaScript 执行前原始 HTML 中的可见词数。8 月 7 日对 18 家大型网站完成首轮审计,核心发现如下。

访问策略与商业关系高度吻合:卫报对 GPTBot、OAI-SearchBot、ChatGPT-User 返回 200,对 ClaudeBot、PerplexityBot、CCBot 返回 403;纽约时报对几乎所有 AI 爬虫返回 403,仅放行 bingbot 和 Amazonbot。
Reddit 的 robots.txt 屏蔽全部 14 个 AI bot,实际执行却参差不齐:GPTBot 被 403,ClaudeBot 和 CCBot 被限流,OAI-SearchBot、PerplexityBot 等五个 UA 均获 200。Figma 则相反,对所有 bot UA 返回 200,但 robots.txt 明确禁止多数 AI 爬虫。
Airbnb 对 12 个 AI UA 中的 9 个返回 403,三个 Anthropic 系 UA 却全部放行,且首页原始 HTML 仅约 94 个可见词。LinkedIn 返回 23 词的验证页,Reddit 首页在 JS 执行前只有一个可见词。Stripe、Anthropic、Vercel、MDN、Shopify 则全部返回完整服务端渲染 HTML,得分 97-100。
Quora、OpenAI、Perplexity、Bloomberg、GitHub 连基线浏览器请求都拦截,工具将其标记为 BASELINE_ANOMALY 而非直接评分,并转向服务器日志分析模式,可识别真实爬虫收到的状态码及 499 超时中断。


对站点运营者的启示按优先级排列:可达性(WAF 是否静默拦截 AI 爬虫)、速度(冷启动 TTFB 是关键指标)、可读性(原始 HTML 词数,客户端渲染对多数 AI 系统不可见)、权限(robots.txt)。作者另提供免费扫描服务 readablebyai.com,可查看 AI 爬虫实际能提取的页面文本。

工具以 MIT 协议开源,零依赖(Python + curl),完整 18 站数据集见 examples/ 目录。

github.com/abouchard11/geo-crawl-audit

#开发者 #工具 #AI爬虫 #GEO #开源 #robotstxt #Web审计
@DevToolboxHub
Post #1562 8
读懂 LLM 账单上的每一行

几乎所有模型价格表都只列两个数字:每百万 token 的输入价和输出价。但真实账单通常有五到六行,真正决定你付多少钱的,往往是标题里没写的那几行。

计费单位是 token,不是字数、字符或请求数。英文散文大约每 token 0.75 个词,代码、JSON、非拉丁文字和长标识符的 token 化效率都更差,且不同模型家族的 tokenizer 各不相同。价格按每百万 token 报价,是因为单个 token 的价格全是零。计费模型不区分 token 是否真正贡献了答案——检索文档里没被读到的 token、框架自动追加的工具 schema、每轮对话重复发送的系统提示,全部按输入计费。账单超预期最常见的原因不是模型贵,而是提示词变长了。

可计费的账单行:

• 未缓存输入(每 token 最便宜但数量通常最大)
• 缓存输入(命中前缀缓存,费率远低于未缓存)
• 缓存写入(部分供应商首次写入缓存会加价)
• 输出(价格通常是输入的数倍)
• 推理 token(隐藏思考过程按输出价计费,是账单远超预期的常见原因)
• 图像/音频输入(按张/秒或按公式折算 token)
• 托管工具调用
• 文件存储
• embedding 等非 token 行
单次请求成本公式:cost = (P_in × T_in_uncached + P_cache × T_in_cached + P_write × T_cache_written + P_out × (T_visible_out + T_reasoning)) / 1e6。提示词缓存、缩短输出、级联调用、重试,本质上都是在攻击公式中的某一项。

输出比输入贵,是因为读取提示词是单次并行扫描,而生成是逐 token 串行前向传播,无法并行化。实际含义是:多发输入便宜,多要输出昂贵。10,000 token 提示词配 100 token 回答,通常比 1,000 token 提示词配 1,000 token 回答更便宜也更快。


看价格表时,要算混合价而不是标题价:按实际输入输出比例 r,有效单价为 (r × P_in + P_out) / (r + 1)。先查缓存读取折扣倍数,再确认推理 token 是否计费,注意单位是每百万还是每千。唯一有意义的数字,是用你的 token 数算出的单次请求成本。

供应商的价格页都是快照,价格会随模型迭代持续变动。任何记录都应标注日期和来源,超过一个季度的报价只能当估算值。跨供应商比较同一模型,要同时对比所有账单行,而不是只看标题那对数字。

#开发者 #工具 #LLM #AI #Token #成本优化 #API
@DevToolboxHub
Post #1561 11
Linux 读文件背后的预读与猜测机制

一位开发者花了两个星期研究 Linux 读文件时的实际行为,发现内核在大量场景下并非机械执行指令,而是在猜测程序意图。他从冷文件起始位置读取一个 4 KiB 页,内核却返回了四页;把读取位置往后移一页再试,只返回一页。同样的文件、同样的系统调用,差别仅在于起始偏移量。

偏移量为零时,mm/readahead.c 中的分支会直接进入 initial_readahead,内核默认程序要顺序流式读取整个文件,于是立即预取更多数据。从其他位置开始读则被假定为随机访问,直到访问模式证明并非如此。内核完全从偏移量推断意图,调用本身不携带任何意图信息。

测试环境是 Apple Silicon Mac 上的 OrbStack Linux 虚拟机,loop 设备上的 ext4 文件系统,内核 7.0.14,4 KiB 页,read_ahead_kb 为 128。容器共享宿主机内核,宿主机内存回收激进,完全缓存的文件约十五秒就会变冷。读取用 dd 完成,逐页统计靠一个调用 mmap 和 mincore() 的小型 C 工具实现。


read() 并不直接访问磁盘,它从页缓存拷贝字节到用户缓冲区。页缓存是内核用来记忆文件内容的 RAM,目标数据已在缓存中就不涉及设备;不在则先填充缓存再拷贝。程序对话的对象始终是内存,磁盘是更下一层的问题。清空缓存后读一页,四页驻留;什么都不读再统计,归零。

内核需要从设备取数据时,面临调用从未回答的问题:该取多少?只取请求的精确字节数看似诚实但通常错误,内核假设读一个块的程序会想要下一个块。从冷状态逐页顺序读,预读窗口依次打开为四页、十二页、十二页、十二页、三十一页、三十一页,然后停止。配置上限应为三十二页(128 KiB 除以 4 KiB),实测两次都是三十一页,作者尚未查明缺失的那一页。

预读窗口能跨独立进程增长,靠的是 try_context_readahead() 向后扫描页缓存中顺序读者留下的痕迹。缓存是共享的,访问模式会在互不知情的进程间泄漏,一个程序的读取会改变另一个程序的读取形态。


mmap 与 read() 是进入同一页缓存的两扇门,行为却不同。触碰一个映射页带回三十二页,等价的 read() 只带回四页;且窗口以触碰页为中心展开——触发第 100 页的缺页,得到第 84 到 115 页。read() 携带长度,内核能推断方向;缺页不携带任何信息,对称展开猜测是信息不足时的最优下注。

文件系统布局本身也是一种猜测。4 MiB 文件在 ext4 上逻辑大小与分配块完全一致,在 ext2 上则多花 4096 字节。ext2 inode 持有十二个直接块指针后回退到间接寻址,需要一层间接块;ext4 改用 extent 记录连续块区间,几条小记录覆盖整个文件,开销被舍入掉。ext2 的开销按单间接、双间接、三间接分层增长。

最困扰作者的是 major fault 计数器。从冷文件读 8 MiB 后检查进程 major fault,首次测得十八次——这是 Python 解释器自身页面被清出缓存后重新加载所致,与本次读取无关。在单进程内读取前后分别采样,差值为零。八 MiB 真实 I/O 未让计数器移动分毫。major fault 只在 MMU 找不到映射且内核需从存储填充时发生,普通 read() 根本不走这条路,ru_majflt 天然对此盲视。平坦的 major fault 曲线无法判断服务是否 I/O 密集。真正会动的数字在 /proc/<pid>/io 的 read_bytes 和 iostat -x 1。


程序与数据之间的每一层都在未经询问的情况下用某种保证换取速度。这些交易几乎总是正确,正因如此,人们很难建立对例外形态的直觉。文件读取负载在调整数据遍历顺序后变快,通常是内核预测开始命中,而非系统调用或缓冲区大小的问题。这也解释了 tokio::fs 为何是套着异步接口的线程池——对文件询问 readiness 轮询本就是错误问题。自内核 5.9 起可挂载 wait_page_queue 回调并从 task work 重试读取,io_uring 提供真正的异步提交路径,线程池如今更多是兼容性决策而非硬限制。

#开发者 #工具 #Linux #内核 #页缓存 #预读 #ext4 #ext2 #mmap #io_uring
@DevToolboxHub
Post #1559 12
fp-ts 不装库也能学的函数式思维

一篇长文讨论了 fp-ts 对 TypeScript 开发者的真正价值:它更像一所训练思维的学校,而不是多数团队应该直接引入的框架。作者从未在生产环境安装 fp-ts,但阅读其源码改变了他对严格 TypeScript 数据流的理解——在 Server Actions、Zod schema、任何值得拥有诚实签名的函数里。

文章核心观点是,fp-ts 中真正值得带走的三个概念是 Option、Either 和 pipe,它们是可以脱离库独立存在的思想,而非单纯的依赖。

Option 让「可能没有返回值」在签名中显式表达,而不是藏在文档里;Either 把错误建模为返回值而非异常,调用方清楚知道什么可能出错;pipe 提供从左到右的组合方式,避免嵌套回调。

作者也坦率指出了 fp-ts 的代价:完整生态要求全盘投入,TaskEither、ReaderTaskEither 等抽象对不熟悉该范式的团队是认知负担;2025 年的原生 TypeScript 用 satisfies、as const、可辨识联合和 infer 已覆盖不少 fp-ts 当初填补的领域;混用函数式与命令式风格反而更糟。

决策建议:1-2 人严格 TypeScript 团队可评估引入;混合水平团队建议只内化概念;复杂异步/错误流且团队对齐时可安装。安装前先确认团队能否读懂 ReaderTaskEither、是否配置了强制 fp 风格的 linter、领域错误是否已用可辨识联合建模、是否开启 strict: true。

常见误区:

• 先读理论文档而非代码
• 大规模转换现有命令式代码
• 把 pipe 当作万能组合工具
• 把 fp-ts 视为 TypeScript 函数式唯一路径。作者估计原生 TypeScript 配合可辨识联合和一致风格能覆盖约 80% 的需求
关于生态现状:fp-ts 仓库仍活跃但核心稳定,作者 Giulio Canti 正在开发 effect,是更务实、与现代 TypeScript 集成更好的演进方向。调试时 pipe 链中的堆栈跟踪可能令人困惑,这是少有人提及的真实成本。


作者的最终建议:花一个下午读官方仓库,不安装任何东西,从零手写 Option 和 Either,再决定完整生态是否值得。如果手写实现已解决问题,答案已经有了。

GitHub

#开发者 #工具 #fpts #TypeScript #函数式编程 #Option #Either #Nextjs #Zod
@DevToolboxHub
Post #1555 16
React SSG 站点 SEO 审计:从 3 次点击到 664 次

一位开发者分享了他基于 React 19 和 Vite 构建的静态站点 devtools.abect.com 的 SEO 优化经历。该站点提供 49 个浏览器端开发者工具,构建时静态预渲染,无后端。三个月内,28 天窗口的点击量从 3 次增至 664 次,展示量从约 1,600 增至 21,400,平均排名从 61.3 提升至 23。

有效的做法:

• 每个工具独立页面而非分类聚合页
• 构建时预渲染完整 HTML
• 每页 5,000-12,000 字符真实内容
• 全站 JSON-LD 结构化数据
• 针对具体痛点撰写标题描述。有趣的是,最初为图片转换而建的站点,最终流量主力却是后来顺手添加的文本转换工具,JSX to HTML 页面贡献了 491 次点击

更关键的是对构建产物的审计发现了五个长期存在的 bug:JSON-LD 全部渲染在 body 而非 head;字符串替换注入 HTML 时 $& 模式导致整页损坏;React.lazy 在 renderToString 下会输出加载占位符,若按路由拆分将毁掉全部 SEO;登录页返回 404 导致死链和 hydration 不匹配;vercel.json 混用 legacy routes 导致安全头配置完全失效。

修复后,作者编写脚本对 dist/ 目录的真实 HTML 做断言检查,首次运行 14 个失败项中仅 2 个是真实问题。最终线上验证 55 个页面全部 HTTP 200,261 个 JSON-LD 块有效且在 head 中,6 个安全头全部生效。


核心经验:预渲染是工具站最高杠杆的 SEO 决策;审计构建产物而非源码;用实验验证框架假设;永远不要用字符串替换注入渲染标记。增长缓慢但扎实,三个月从 3 次点击到 664 次,没有技巧,只有大量不起眼的工作在复利。

#开发者 #工具 #SEO #React #SSG #JSONLD #Vite #前端
@DevToolboxHub
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →