应用场景 / JevModel

Airtable 文本分类:用“运行脚本”自动化和 Jev 自动给记录打标签

不离开 Airtable 就给长文本字段分类:记录满足条件时触发自动化,在“运行脚本”操作里用 fetch() 调用 JevModel,再把标签、概率和“待复核”标记写回记录。涵盖密钥、Airtable 脚本限制、通过 CSV 与 Batch 补跑历史记录、测试方法,以及何时用无代码工具更合适。

最近更新:

速读:一个脚本操作,每条记录一次请求

  • Airtable 自动化没有通用的“发送 HTTP 请求”操作,调用外部 AI API 要在“运行脚本”(Run a script)操作里用 fetch()。用“当记录满足条件时”触发(文本字段不为空、类别字段为空),把记录 ID 和文本作为输入变量传入,API 密钥放进 Airtable 的 secret,用 input.secret() 读取。
  • 脚本只把文本发到 JevModel 的 /api/v1/systemone,配一个你定义的 2–12 个类别的 Choice,然后用 table.updateRecordAsync() 把选中的标签写进单选字段、把概率写进数字字段,遇到低概率、other 或出错时勾选“待复核”复选框。
  • Airtable 为每次脚本运行写明了限制,包括 50 次 fetch 请求和 30 秒的 fetch 超时,而且 Team 方案试用期不能用这个操作。每条被打标签的记录都是一次普通 Jev 请求,按 Token 计费;验证邮箱的账号先获赠 100,000 免费 Token。已有的历史记录可以导出 CSV,用 Console → Batch 处理(未购买前每批 50 行,购买后 1,000 行)。

Airtable 里的文本分类是什么样的?

Airtable 的 base 里常常堆着需要人工分拣的自由文本:表单提交、客户请求、反馈、项目报名、内容选题。分类指的是读取某个长文本字段,从一张简短固定的列表里填一个类别,让视图、筛选和下一个自动化不必等人逐行读完就能工作。一张实用的表需要四个字段:原文(Long text)、Category(单选,选项与标签 ID 完全一致,例如 billing、bug、feature_request、other)、Confidence(保留两位小数的数字)和 Needs review(复选框)。类别列表要短、互斥,并且始终包含 other,让模型对什么都不符合的文本有一个诚实的去处。如果紧急程度也重要,就单独问一个是/否问题,不要把 urgent 加进类别列表;两者混在一起,两边都会变差。本文讨论每条记录一个类别的情况。如果一条记录可能同时属于多个类别,请用多选字段,并先阅读多标签分类指南。

用户反馈分类:一个主题、一个优先级,以及为什么情感分析不够用 Jev 进行客服分流Choice、Score 与 Noul

如何一步步搭建 Airtable 自动化?

五步。1)创建上面四个字段,并在第一次运行前把每个标签 ID 都加成单选选项;脚本按名称写入选项,所以名称必须一致。2)在 Automations 里新建自动化,触发器选“当记录满足条件时”(When a record matches conditions),设两个条件:文本字段不为空、Category 为空。记录进入这个状态时就会触发,比如收到一条表单提交;而写入 Category 会让记录离开条件,所以自动化不会因为自己的更新而循环。3)添加“运行脚本”(Run a script)操作。在输入变量侧栏里添加 recordId(映射为触发器给出的 Airtable 记录 ID)和 text(映射为文本字段)。4)用已验证邮箱的账号在 Console → API keys 创建 JevModel API 密钥,在脚本编辑器的 Secrets 标签页里添加为 JEVMODEL_API_KEY;脚本用 input.secret("JEVMODEL_API_KEY") 读取。Airtable 会把使用 secret 的脚本限制为只有能访问这些 secret 的人才能编辑,并在控制台输出里隐去 secret。5)先用一条样例记录测试这个操作,查看运行历史和执行日志,再开启自动化。Jev 调用失败时应让 Category 保持为空并勾选 Needs review,这样临时错误不会给记录贴错标签。

JevModel API:请求与响应第一次运行 Jev 判断

需要提前考虑哪些 Airtable 和 JevModel 的限制?

Airtable 方面,帮助中心列出了“运行脚本”操作的限制:脚本超时写明为 30 秒(撰写本文时临时放宽到 120 秒),每次 fetch 超时 30 秒,脚本 API 调用超时 12 秒,内存 512 MB,每次运行最多 50 次 fetch 请求和 30 次 selectRecords 查询,每秒最多 15 次修改,每次修改最多改 50 条记录。所有方案都能用这个操作,但限制各不相同,而且 Team 方案试用期内不可用。像示例那样每次运行处理一条记录,远在这些限制之内。JevModel 方面,整个请求(state 加 questions)必须在 8,000 字符以内,所以发送前要截断长文本;示例只保留前 6,000 个字符。一次请求可问 1 到 8 个问题;Choice 有 2 到 12 个选项,ID 以小写字母开头,只能用小写字母、数字和下划线;Score 有 2 到 10 个有序等级。没有 model 字段,也没有幂等键:对同一条记录重新运行自动化就是一次新请求,会再次计费。失败的运行会退还额度。每条被打标签的记录都是一次普通 API 请求,从你的 Token 余额扣费;验证邮箱的账号先获赠 100,000 免费 Token,付费套餐见定价页。

JevModel 价格与 Jev 免费额度JevModel API:请求与响应

对比:运行脚本 vs 无代码工具 vs 导出 CSV 走 Batch

三条路发送的是同一个 Jev 问题,区别在于逻辑放在哪里、结果怎样回到 base。下表对比工作流形态,不是准确率,也没有任何一行是基准测试。

Zapier 文本分类:AI by Zapier Classify vs Vertex Classify Text vs HTTP → JevMake.com Categorize Text:AI Toolkit vs HTTP → Jev(类型化标签与置信度阈值)Jev API 批量文本分类:CSV 与 JSONL
对比:运行脚本 vs 无代码工具 vs 导出 CSV 走 Batch
维度Airtable 运行脚本 → Jev无代码工具(Zapier、Make、n8n…)导出 CSV → Console → Batch
运行位置在 base 内部,作为自动化操作在工具里,用它的 Airtable 触发器和操作在浏览器里,一次性
时效记录满足条件后不久取决于工具的轮询或 Webhook 方案事后处理历史积压
结果回写同一脚本里的 table.updateRecordAsync()工具里的“更新记录”步骤重新导入或粘贴导出的答案
Jev 输出Choice 标签与概率同样的答案,由工具做字段映射逐行答案(未购买前每批 50 行,购买后 1,000 行)

代码示例:给一条记录分类并回写标签(示意)

把脚本粘贴进“运行脚本”操作,并把表名、字段名和标签定义改成你自己 base 里的。请求遵循 JevModel 文档化的契约:用已验证邮箱账号的 Bearer 密钥 POST /api/v1/systemone,发送 state 和具名问题,这里是一个名为 category 的 Choice;成功响应 code 为 0 并带 data.answers。没有 model 字段,因为本站始终通过 OpenRouter 调用 typesafe/jev-1.13;JevModel 与开发 Jev 的 TypeSafe AI 相互独立。脚本只发送文本,不发姓名、邮箱或其他列。单选字段的值要写成带 name 的对象,而且该选项必须已经存在于字段中。低于占位阈值、被标为 other 以及调用失败的记录都会勾选 Needs review,这样按该复选框筛选的视图就成了人工处理队列。0.7 只是占位值,请根据标注样本自己定阈值。

JevModel API:请求与响应Choice、Score 与 NoulJev 概率、置信度与人工复核阈值
// Illustrative only. Airtable automation → "Run a script" action.
// Input variables: recordId (Airtable record ID from the trigger), text (the long-text field).
// Secret: JEVMODEL_API_KEY (Secrets tab in the script editor).
// Fields: Category (single select), Confidence (number), Needs review (checkbox).
const { recordId, text } = input.config();
const table = base.getTable("Requests");

const res = await fetch("https://jevmodel.app/api/v1/systemone", {
  method: "POST",
  headers: {
    Authorization: "Bearer " + input.secret("JEVMODEL_API_KEY"),
    "Content-Type": "application/json",
  },
  body: JSON.stringify({
    // The whole request must stay within 8,000 characters.
    state: { text: String(text || "").slice(0, 6000) },
    questions: {
      category: {
        type: "choice",
        instructions: "Which team should handle this request submitted through our form?",
        criteria: {
          billing: "Invoices, payments, refunds, or plan changes.",
          bug: "Something is broken, shows an error, or behaves unexpectedly.",
          feature_request: "Asks for something the product does not do yet.",
          other: "Anything that fits none of the labels above.",
        },
      },
    },
  }),
});
const out = await res.json();

if (out.code !== 0) {
  // Leave Category empty and hand the record to a person.
  await table.updateRecordAsync(recordId, { "Needs review": true });
  console.log("Jev call failed: " + out.message);
} else {
  const { choice, probabilities } = out.data.answers.category;
  const p = probabilities ? probabilities[choice] : 0;
  await table.updateRecordAsync(recordId, {
    Category: { name: choice }, // the option must already exist in the field
    Confidence: p,
    "Needs review": p < 0.7 || choice === "other", // 0.7 is a placeholder
  });
}

如何测试标签效果并处理已有记录?

先从已经有人工类别的记录开始。导出几百条,CSV 里带上文本和人工标签,把文本上传到 JevModel Console → Batch,用同一个 Choice 问题跑一遍,再导出逐行答案。然后在表格里按标签对比两列;Batch 不会替你计算准确率。看哪些类别之间容易混淆,以及提高概率阈值时一致率怎样变化,改写含糊的定义,用同一份样本重跑,然后再开启自动化。同样的 CSV 路径也是给历史积压打标签的最简单办法:自动化只对新进入条件的记录触发,而在一次运行里循环处理大量记录的脚本很快就会碰到 50 次 fetch 的上限。上线后,保留一个按 Needs review 筛选、按 Confidence 排序的视图,并每周查看 other 的占比;占比上升说明类别列表已经跟不上人们提交的内容。在测出出错频率之前,不要让标签去删除、隐藏或发送邮件,并保持标签字段可编辑,方便人工纠正。

评估 Jev 工作流Jev 概率、置信度与人工复核阈值Google Sheets 文本分类:=AI() 函数 vs Apps Script 调用 Jev API

Airtable 该选哪种方案?

如果工作本来就在 base 里进行、你能改一段简短脚本,而且你的方案包含这个操作,就选“运行脚本”。如果无代码工具已经在跑你的其他自动化,或者同样的文本还要送到 Slack、邮件或 CRM,就选无代码工具;Zapier、Make、n8n、Power Automate 和 Pipedream 的指南分别演示了同一个 Jev 请求。一次性处理历史积压,或在搭任何自动化之前先测试标签定义,就选 CSV 加 Console → Batch。如果数据在 Google Sheets 而不是 Airtable,Google Sheets 指南用 Apps Script 讲了同样的模式。无论哪种的检查清单:1)写带明确 other 的标签定义;2)紧急程度用单独的是/否问题;3)只发文本,并截到 8,000 字符的请求上限以内;4)调用失败时让类别保持为空并标记记录;5)先只打标签、建复核视图,在标注样本上测过一致率后再加下游动作。JevModel 只处理文本,且不是开源项目;Airtable 里的附件、图片和音频不会被这套方案分类。

多标签文本分类:一次 Choice、多道是否题,还是第二轮请求n8n Text Classifier 节点:内置分类 vs 在工作流中调用 JevPower Automate 文本分类:AI Builder 类别模型 vs HTTP → JevPipedream 文本分类:Hugging Face 动作 vs HTTP → Jev(类型化标签)Jev 是多模态 / 可下载模型吗?JevModel 实际是什么

常见问题

Airtable 自动化不写脚本能调用 AI API 吗?

不能调用任意 API。Airtable 帮助中心说明,自动化没有通用的“发送 HTTP 请求”操作;对外调用要在“运行脚本”操作里用 fetch() 完成。不想写脚本,就用 Zapier、Make 或 n8n 这类无代码工具,配它们的 Airtable 触发器和 HTTP 步骤。

为什么用“当记录满足条件时”触发,而不是“当记录被创建时”?

在网格里手动新建的记录可能一开始是空的,过一会儿才填入文本,所以“创建时”触发可能会发出空字段。要求“文本不为空且 Category 为空”会等到真的有内容可分类,而填入 Category 后记录就离开了条件,同一条记录不会被再次发送。

已有的几千条 Airtable 记录怎么打标签?

把一个视图导出成 CSV,用同一个 Choice 问题在 JevModel Console → Batch 里跑(未购买前每批 50 行,购买后 1,000 行),再按记录 ID 把答案导回。自动化是为新记录设计的;一次脚本运行只允许 50 次 fetch 请求,在一次运行里循环处理大表行不通。

用 Jev 给 Airtable 记录分类要花多少钱?

每条被分类的记录都是一次普通 API 请求,按 Token 从 JevModel 余额扣费;验证邮箱的账号先获赠 100,000 免费 Token,同一请求里的多个问题一起计费。文本短、每条记录只发一次请求,用量就低。Airtable 自动化的运行次数另按你的 Airtable 方案计算。当前套餐见定价指南。

JevModel 为独立项目,与 TypeSafe AI 无关联。