应用场景 / JevModel

Jira Issue 智能分类:用 Jira Automation 和 Jev 自动给工作项打标签

自动给新建的 Jira 工作项打标签:Jira Cloud 自动化规则用“发送 Web 请求”操作把摘要和描述发给 JevModel,等待响应,再从你的固定列表里加一个标签;失败时加 needs-triage,文本表明有阻塞时加一条评论。涵盖用智能值做 JSON 编码、大家常漏掉的响应选项、数据敏感性、用已解决的工作项做测试,以及与 Rovo 智能体操作的对比。

最近更新:

速读:发送、等待、再打标签

  • 在 Jira Cloud 自动化里,用“工作项已创建”(Work item created)触发器开始一条规则,再用“发送 Web 请求”(Send web request)操作把摘要和描述 POST 到 JevModel 的 /api/v1/systemone。用智能值函数 asJsonString 构造 JSON 请求体,让引号和换行不会弄坏请求,并把 Authorization 头标记为 Hidden。
  • 勾选“Delay execution of subsequent rule actions until we’ve received a response for this web request”(等收到这个 Web 请求的响应后再执行后续操作);不勾的话,后续步骤里的 {{webResponse.body}} 是空的。然后读取 {{webResponse.body.data.answers.kind.choice}},用“编辑工作项”把它加成标签;响应 code 不为 0 时退回 needs-triage。
  • 用 abbreviate 截短描述,让请求不超过 JevModel 的 8,000 字符上限;不要发送报告人信息;并限制谁能编辑这条规则,因为能编辑“发送 Web 请求”操作的人就能改变数据的去向。每个被打标签的工作项都是一次按 Token 计费的 Jev 请求;验证邮箱的账号先获赠 100,000 免费 Token。

Jira Issue 的 AI 分类实际上指什么?

Jira Cloud 现在把 issue 叫作工作项(work item),把项目叫作空间(space);自动化文档用的是新名称,而智能值仍以 issue 开头。接收大量请求的团队——无论来自服务台、收集表单,还是同事直接提单——都会在同一个第一步上花时间:读每个新工作项,判断它属于哪类工作。分类就是把这一步自动化:从一张简短固定的列表里贴一个标签,例如 bug、feature_request、question 或 other,让看板筛选、队列或下一条规则接手。把这个类别和另一个同样重要的问题分开:文本是否表明现在有人被阻塞?把它作为独立的是/否问题来问,而不是做成标签,用它来加评论或通知某人;在测出准确程度之前,不要用它改优先级。先从标签开始,因为加标签成本低、删起来也容易;改工作类型、经办人或状态会影响工作流和报表,那里的自动改错代价很高。如果你的 issue 在 GitHub 而不是 Jira,GitHub Issue 自动打标签指南用 GitHub Actions 讲了同样的思路。

用 AI 自动给 GitHub Issue 打标签:调用 Jev 的 GitHub Actions 工作流用 Jev 进行客服分流Choice、Score 与 Noul

如何一步步搭建这条 Jira 自动化规则?

六个组件。1)触发器:工作项已创建(Work item created),可用 JQL 限定只对需要分类的工作类型生效。2)操作:重新获取工作项数据(Re-fetch work item data),让创建时填写的字段在构造请求前加载完;Jira 在一次运行中不会自动刷新 {{issue}} 数据。3)操作:发送 Web 请求到 https://jevmodel.app/api/v1/systemone,方法 POST,加 Content-Type: application/json 头,以及 Authorization 头(Bearer 加上用已验证邮箱的账号在 JevModel Console → API keys 创建的密钥;勾选 Hidden,保存后该值会被遮蔽),请求体选 Custom data。勾选“Delay execution of subsequent rule actions until we’ve received a response for this web request”;如果希望 API 返回错误状态时仍走兜底分支,再勾选“Continue running the rule even if the request response is not successful”。4)If/else 块,用高级比较条件:{{webResponse.body.code}} 等于 0。5)在 if 分支里,用“编辑工作项”的附加字段 JSON 修改 Labels,添加 ai- 加上选中的标签;对是/否答案再加一个条件,可以添加评论。6)在 else 分支里加 needs-triage 标签。Jira 标签不能包含空格,这也是标签 ID 用 feature_request 这种写法的原因之一。

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

最常出什么问题,怎样避免?

四个问题涵盖了大部分失败的规则。响应值为空:Atlassian 知识库列出的常见原因是没勾选等待响应选项、在发出请求的 if 块之外读取响应,以及响应的 Content-Type 不是 application/json;JevModel 返回的是 JSON,所以要重点检查前两条。JSON 被弄坏:带引号的摘要或带换行的描述原样粘进去会产生无效 JSON,所以每个值都用 asJsonString 包一层,它会转义特殊字符并加上引号。如果描述可能为空,加一个“描述不为空”的条件,或者只发送摘要。请求大小:整个 JevModel 请求(state 加 questions)必须在 8,000 字符以内,所以对描述用 abbreviate(示例保留 5,000 字符)。重复运行:JevModel 没有幂等键,如果规则挂在“工作项已更新”上,每次编辑都会发出一次新的计费请求,还可能在有人纠正标签之后再叠加标签;只在创建时触发。另有两点治理同样重要。Atlassian 提醒,能编辑规则的人就能把“发送 Web 请求”操作改成把数据发到别处,所以要限制规则编辑者。规则或该操作被复制、导出或导入时,Hidden 的头部值会丢失,之后要重新填入密钥。只发送摘要和描述,不发报告人姓名或邮箱。

运行记录与隐私JevModel 价格与 Jev 免费额度在工具调用前增加判断关口

对比:发送 Web 请求 + Jev vs Rovo 智能体操作 vs 导出 CSV 走 Batch

Jira 自动化还提供“使用 Rovo 智能体”(Use Rovo agent)操作:它让智能体生成一段回复,再交给评论这类文本输出的操作。下表按文档对比各条路径的形态,不是准确率,也没有任何一行是基准测试。

Zendesk AI 工单分类与分流:内置 Intelligent Triage 与自定义分类器怎么选Jev API 批量文本分类:CSV 与 JSONLJev vs GPT 与 Claude:如何选择判断层
对比:发送 Web 请求 + Jev vs Rovo 智能体操作 vs 导出 CSV 走 Batch
维度发送 Web 请求 → Jev“使用 Rovo 智能体”操作导出 CSV → Console → Batch
输出你列表中的一个 ID,附概率根据提示词生成的文本逐行答案(未购买前每批 50 行,购买后 1,000 行)
下一步“编辑工作项”直接加标签与评论这类文本操作搭配与真实标签对比;不改动 Jira
配置API 密钥放在 Hidden 头里;用智能值写 JSON 请求体站点已启用 Rovo;编写提示词只需浏览器
适合需要被筛选或规则依赖的标签供人阅读的摘要和建议测试定义和一次性处理积压

规则示例:请求体与标签更新(示意)

规则在规则构建器里搭建,所以示例把每个组件写成文本,并给出要粘贴的值。请求遵循 JevModel 文档化的契约:用已验证邮箱账号的 Bearer 密钥 POST /api/v1/systemone,发送 state 和具名问题,这里是名为 kind 的 Choice 和名为 blocking 的 Noul;成功响应 code 为 0 并带 data.answers。没有 model 字段,因为本站始终通过 OpenRouter 调用 typesafe/jev-1.13;JevModel 与开发 Jev 的 TypeSafe AI 相互独立。ai- 前缀让自动标签容易查找和删除。Jira 智能值不方便按动态键取概率,所以这条规则直接加标签,把概率检查留给测试样本;如果需要按标签设阈值,就对 {{webResponse.body.data.answers.kind.probabilities.bug}} 等每个标签各加一个条件。blocking 的 0.8 只是占位值,不是推荐值。测试时用“记录”(Log)操作输出 {{webResponse.body}},并查看规则的审计日志。

JevModel API:请求与响应Choice、Score 与 NoulJev 概率、置信度与人工复核阈值
# Illustrative only. Jira Cloud automation rule, written out component by component.
# Trigger:  Work item created            (optional JQL: type in (Bug, Task, Story))
# Action:   Re-fetch work item data
# Action:   Send web request
#   Web request URL:  https://jevmodel.app/api/v1/systemone
#   HTTP method:      POST
#   Headers:          Content-Type = application/json
#                     Authorization = Bearer <your JevModel key>   [x] Hidden
#   Web request body: Custom data
#   [x] Delay execution of subsequent rule actions until we've received a response
#   [x] Continue running the rule even if the request response is not successful
{
  "state": {
    "summary": {{issue.summary.asJsonString}},
    "description": {{issue.description.abbreviate(5000).asJsonString}}
  },
  "questions": {
    "kind": {
      "type": "choice",
      "instructions": "Which kind of work item is this, based on its summary and description?",
      "criteria": {
        "bug": "Something that used to work is broken, slow, or shows an error.",
        "feature_request": "Asks for new behavior the product does not have yet.",
        "question": "Asks how to do something; nothing is broken.",
        "other": "Anything that fits none of the labels above."
      }
    },
    "blocking": {
      "type": "noul",
      "instructions": "Does the text say that users, customers, or a release are blocked right now?",
      "criteria": {
        "true": "Someone cannot continue their work until this is resolved.",
        "false": "Work can continue while this waits in the backlog."
      }
    }
  }
}
# If:  Advanced compare  {{webResponse.body.code}}  equals  0
#   Action: Edit work item → More options → Additional fields:
{ "update": { "labels": [ { "add": "ai-{{webResponse.body.data.answers.kind.choice}}" } ] } }
#   If:  Advanced compare  {{webResponse.body.data.answers.blocking.noul}}  greater than  0.8   (placeholder)
#     Action: Comment on work item: "Automatic check: this may be blocking someone. Please confirm."
# Else:
#   Action: Edit work item → Additional fields:
{ "update": { "labels": [ { "add": "needs-triage" } ] } }

在对所有人开启之前,如何测试这条规则?

已解决的工作项就是现成的标注集:它们的工作类型、组件或已有标签都是人设定的。用 JQL 筛选(例如上一季度已解决的工作项)导出几百条,保留摘要、描述和人工类别,把文本放进 JevModel Console → Batch,用同一个 Choice 问题跑一遍。Batch 返回逐行答案,但不会计算准确率,所以要在表格里和人工那一列对上。查看每个标签的一致率、哪些类别容易混淆(报告人把使用失误说成 bug 时,bug 和 question 经常混在一起),以及在并不紧急的工作项上 blocking 有多常为真。改写含糊的定义,用同一份样本重跑。然后先在一个空间里开启规则,读一周审计日志,统计人们删掉 ai- 标签的频率。别忘了旧类别是在时间压力下设定的;先读一些分歧,再判断是不是模型的问题。在这之后再考虑改经办人或优先级,并保持可撤销。

评估 Jev 工作流Jev 概率、置信度与人工复核阈值多标签文本分类:一次 Choice、多道是否题,还是第二轮请求

你的 Jira 团队该选哪种方案?

如果你想要的标签来自你掌控的列表,能被筛选器、看板和后续规则可靠地使用,而且你能维护一条带 JSON 请求体的规则,就选“发送 Web 请求 + Jev”。如果目标是生成一段供人在评论里阅读的摘要或建议,就选 Rovo 智能体操作。如果要测试定义,或在完全不改动 Jira 的情况下给一次性积压打标签,就选导出 CSV 加 Console → Batch。如果请求是以 Zendesk 工单、Slack 消息或 GitHub Issue 的形式到达的,有专门的指南覆盖这些来源。无论哪种的检查清单:1)写带明确 other 的标签定义;2)紧急程度用单独的是/否问题;3)只在创建时触发,因为 JevModel 没有幂等键;4)只发送摘要和描述,并截到 8,000 字符上限以内;5)限制谁能编辑规则,密钥放在 Hidden 头里;6)先用 ai- 标签和 needs-triage 兜底,在已解决的工作项上测过一致率后再扩大规则。JevModel 只处理文本,且不是开源项目;工作项上附带的截图、附件和日志不会被这条规则分类。

Zendesk AI 工单分类与分流:内置 Intelligent Triage 与自定义分类器怎么选Slack 消息分类:用 Events API 和 Jev 给频道消息分流产品与客服文本的意图分类:规则、LLM 与类型化 APIJev 是多模态 / 可下载模型吗?JevModel 实际是什么

常见问题

为什么我的 Jira 规则里 {{webResponse.body}} 是空的?

最常见的原因是“发送 Web 请求”操作没有勾选“Delay execution of subsequent rule actions until we’ve received a response”,后续步骤在响应到达前就执行了。Atlassian 列出的其他原因包括:在发出请求的 if 块之外读取该值,以及响应不是以 application/json 返回的。

规则能直接设置优先级或经办人,而不是加标签吗?

技术上可以,用“编辑工作项”或“分配工作项”配合同样的响应值即可。但仍建议从标签开始:标签容易删除,也不会改变工作流或报表。先在已解决的工作项上测出答案与人工选择的一致频率,再改为设置优先级或经办人。

把 Jira 工作项文本发到外部 API 安全吗?

像评估任何集成一样做决定:只发送摘要和描述,绝不发报告人邮箱或内部字段;密钥放在 Hidden 头里;限制谁能编辑自动化规则,因为 Atlassian 提醒编辑者可以改变“发送 Web 请求”的去向。JevModel 会存储哪些内容,请看隐私指南。

用 Jev 给 Jira 工作项打标签要花多少钱?

每个被打标签的工作项都是一次普通 API 请求,按 Token 从 JevModel 余额扣费;验证邮箱的账号先获赠 100,000 免费 Token,同一请求里的 Choice 和 Noul 一起计费。规则的运行也会按你的 Atlassian 方案计入 Jira 自动化用量。当前套餐见定价指南。

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