Ollama System One 端点
/v1/systemone 是个特殊端点:它不做文本生成,只做分类、判断、打分。你给它一段状态和若干问题,它返回答案和概率分布。
版本基线 v0.40.12,官方
docs.ollama.com/api/systemone。需要 Ollama v0.35.0+;用云端模型需 v0.40.5+。
一、它解决什么问题
普通生成模型回答「这段工单属于哪个类别」时,你会得到一段自然语言。要拿到结构化结果得靠 JSON schema + 后处理,还要担心模型自由发挥。
System One 直接返回标签和概率:
{
"label": {
"choice": "bug",
"probabilities": { "billing": 0.0125, "bug": 0.9781, "account": 0.0093 },
"confidence": 0.8906
}
}
一次前向传播就给出概率分布,比生成式分类更快、更稳定,而且概率可用于阈值判断和人工复核分流。
二、最小调用
curl http://localhost:11434/v1/systemone \
-H 'Content-Type: application/json' \
-d '{
"model": "nimble",
"state": "Our checkout has returned 500 errors since 9am.",
"questions": {
"label": {
"type": "choice",
"instructions": "Which label fits this ticket?",
"criteria": {
"billing": "Payments and refunds",
"bug": "Software errors",
"account": "Login and account access"
}
}
}
}'
返回:
{
"model": "nimble",
"answers": {
"label": {
"type": "choice",
"choice": "bug",
"probabilities": {
"billing": 0.0125,
"bug": 0.9781,
"account": 0.0093
},
"confidence": 0.8906
}
},
"usage": { "input_tokens": 174, "output_tokens": 1 }
}
三、请求字段
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
model |
string | 是 | System One 模型,如 nimble、clef:cloud |
state |
string | object | array | 是 | 待判断的状态,不是对话消息 |
questions |
object | 是 | 命名问题集合,key 为你自定的名字 |
images |
string[] | base64 图片,所有问题共享(需视觉模型) | |
keep_alive |
string | number | 模型驻留时长 |
state 的三种形态
可以是字符串、对象或数组。对象/数组会被序列化成 JSON 文本处理。关键是:它不会被当成对话消息或多媒体输入——不要指望模型「理解上下文」,它只判断这一段状态。
questions 可以是多个
"questions": {
"category": { "type": "choice", "criteria": {...} },
"urgent": { "type": "noul" },
"priority": { "type": "score" }
}
官方提到三类问题:choice(选择)、noul(是/否)、score(打分)。
重要限制:答案不会传递给后续问题。每个问题独立基于 state 判断,不能做「先分类再按类别细分」的链式推理。
四、规模限制
这是落地前必须算清楚的:
本地请求
| 项 | 限制 |
|---|---|
| 文本 + schema(不含图片) | 64 KiB |
| 整个请求(含 base64 和 JSON) | 32 MiB |
| 输入 | 必须完整装入已加载的上下文窗口 |
| 截断 | 永不截断,超了直接失败 |
Nimble 和 Tev 还需要两个 token 位置用于打分。
「输入永不截断」这点与 embed 端点相反:这里宁可报错也不静默丢数据。
云端请求
| 项 | 限制 |
|---|---|
| 问题数量 | 最多 64 个 |
| 问题命名 | 最多 100 字符,仅限 ASCII 字母/数字/_/./- |
| 图片 | 最多 4 张,每张 ≤ 4 MiB 且 ≤ 16 兆像素,总计 ≤ 8 MiB |
| 请求体 | ≤ 13 MiB |
| 上下文 | 65536 token |
云端模型需要付费计划或购买 usage credits。
五、明确不支持的
流式、视频、工具调用、生成控制(temperature 等)都不支持。
它是一次性的判断调用,只返回一个 JSON。这个设计取舍很明确:牺牲灵活性换确定性和速度。
六、典型用法
工单自动分类 + 置信度分流
import requests, os
def classify(text, model="nimble"):
r = requests.post("http://localhost:11434/v1/systemone", json={
"model": model,
"state": text,
"questions": {
"category": {
"type": "choice",
"instructions": "这条工单属于哪一类?",
"criteria": {
"billing": "付款与退款",
"bug": "软件错误",
"account": "登录与账号",
},
}
},
}, headers={"Authorization": f"Bearer {os.environ.get('OLLAMA_API_KEY','')}"})
r.raise_for_status()
a = r.json()["answers"]["category"]
# 置信度低于阈值转人工
return (a["choice"], a["confidence"]) if a["confidence"] >= 0.75 else ("needs_review", a["confidence"])
print(classify("支付页面一直报错,扣款了但订单没生成"))
用 confidence 做阈值分流是这类模型最有价值的地方:高置信自动路由,低置信转人工,比纯生成式方案更可控。
垃圾内容判断
curl http://localhost:11434/v1/systemone -H 'Content-Type: application/json' -d '{
"model": "nimble",
"state": "限时优惠!点击链接领取 iPhone 17",
"questions": { "is_spam": { "type": "noul" } }
}'
七、和普通 chat 的取舍
| 维度 | System One | 普通 chat |
|---|---|---|
| 输出 | 标签 + 概率 | 自然语言 |
| 速度 | 一次前向,快 | 逐 token 生成,慢 |
| 确定性 | 高 | 受采样影响 |
| 多问题 | 支持(各自独立) | 要额外约束 |
| 流式 / 工具 | 不支持 | 支持 |
| 适合 | 分类、判断、打分 | 生成、对话、代理 |
判断标准很简单:要文本用 chat,要标签用 systemone。
常见问题
| 现象 | 原因 | 处理 |
|---|---|---|
| 404 | Ollama 版本太低 | 升级(本地 ≥0.35.0 / 云端 ≥0.40.5) |
| 413 或报输入过大 | 超过 64 KiB / 13 MiB | 裁短 state |
| 输入被拒 | 超上下文窗口(此处不截断) | 精简输入或换更大上下文的模型 |
| 模型不支持 decision | 用了普通生成模型 | 换 nimble / tev / clef 等 |
| 想流式返回 | 设计上不支持 | 改用 chat |
| 402 | 云端需付费 | 购买 credits |
动手试
## ① 先确认模型支持 decision 能力
curl -s http://localhost:11434/api/show -d '{"model":"nimble"}' | python -c "
import sys,json;print(json.load(sys.stdin).get('capabilities'))"
## ② 跑一次三分类
curl -s http://localhost:11434/v1/systemone -H 'Content-Type: application/json' -d '{
"model": "nimble",
"state": "我的账号登录不进去了,提示密码错误",
"questions": { "label": { "type": "choice",
"criteria": { "billing": "付款退款", "bug": "软件故障", "account": "登录账号" } } }
}' | python -m json.tool
第一条返回里有 decision 才能用这个端点。

TRAE-AI编程


更多建议: