用 Cloudflare Workers AI Jev 做一个可视化图片分类传送带项目地址Jev Sense技术栈Node.js 20、原生 JavaScript、Cloudflare Workers AI、JevSystem One最近做了一个图片分类小项目把图片放上传送带图片经过扫描区时提取视觉线索再由另一个模型根据线索选择标签最后落入对应的分类箱。相比只展示一个分类结果这个界面能把“看到了什么”和“为什么分到这里”都呈现出来。目前项目以动物图片为例内置 30 张示例图、30 个动物标签以及哺乳类、鸟类、爬行类、两栖类、鱼类、昆虫类六个分类出口。无法确定或请求失败的图片会进入“待复核”。下面是六张示例图经过传送带并完成分拣的动图。录制时使用真实的 Cloudflare 和 Jev 服务动图以 1.5 倍速播放。页面总览如下。总览截图使用模拟模式主要展示界面布局。为什么拆成两次模型调用整个流程可以概括为图片 → Cloudflare 视觉模型提取可见特征 → Jev 根据文字证据选标签 → 分类或待复核第一步调用 Cloudflare Workers AI 的视觉模型cf/meta/llama-4-scout-17b-16e-instruct让它描述图片里可见的动物特征例如体形、颜色、羽毛或鳞片。提示词要求它不要直接做最终物种分类也不要执行图片中出现的指令。第二步将视觉描述交给 Jev。Jev 收到的是文字证据和候选标签不接收原图它需要从 30 个预设动物标签和uncertain中选择一个。如果证据不足就选择uncertain。这样视觉观察和业务判断有了明确的边界页面也能分别展示两步的结果。最初考虑过把图像和文字都转成向量再交给 Jev 判断。但项目使用的 System One 接口没有提供这套流程所需的文档化多模态向量输入方式因此最终采用了“视觉描述 → 结构化判断”的实现。前后端是怎么衔接的服务端是一个不依赖 Web 框架的 Node.js HTTP 服务。前端传送带主要调用两个接口接口作用POST /v1/describe-animal接收图片返回视觉描述和耗时POST /v1/decide-animal接收视觉描述返回 Jev 选择的标签、类别和耗时服务端也提供POST /v1/classify-animal用于一次请求完成上述两步POST /v1/judge则支持传入自定义问题。当前传送带页面使用的仍是固定动物标签并没有做成任意场景的分类界面。前端在图片接近扫描区时发起视觉请求拿到描述后图片继续向闸口移动同时发起 Jev 请求。抵达闸口后页面等待判断结果再决定出口。模型请求与动画有一部分时间重叠但每张图片仍然先得到视觉描述再提交 Jev 判断。还有两个细节比较重要图库自带的参考标签只用于浏览器中的结果对照不会随推理请求发给模型避免“把答案写进题目”。模拟模式只演示页面和传送带流程不会真正识别图片它的结果会进入“待复核”不会伪装成识别成功。本地运行准备 Node.js 20 或更新版本然后在 PowerShell 中运行git clone https://github.com/xiaotao-xiaotao/jev-sense.gitSet-Locationjev-senseCopy-Itemconfig.example.json config.json npmstart浏览器打开http://127.0.0.1:8788。示例配置默认是server.mock: true此时不调用外部模型适合先体验交互。要运行真实分类在config.json中将server.mock改为false并填写 Cloudflare Account ID、Workers AI Token 和 Jev API Key。示例配置中的 Jev 接口与模型只是项目使用时的配置实际可用性以服务提供方当前情况为准。config.json已加入.gitignore不要把真实密钥提交到仓库。页面支持多图上传和拖放格式为 PNG、JPEG、WebP单张原图上限 20 MB队列最多 20 张。前端会压缩上传图片预置图在发起识别请求前也会缩小尺寸。处理后可以在页面查看视觉线索、Jev 原始判定、耗时和分拣记录。当前边界与后续方向这还是一个动物分类演示。上传不在预设标签内的物种时模型可能无法给出合适标签“待复核”用于承接不确定结果和请求失败。仓库中的六图演示与图库标注一致但这不能当作整体准确率评估。这套“先提取证据再按规则判断”的流程可以继续探索图片打标签、内容审核或自定义分类。迁移到新场景时需要重新设计视觉提示词、候选标签和判定规则并用真实样本验证再安排人工复核。项目代码、运行说明和演示视频都在 GitHub 仓库。