RWKV
Ai00 教程

Ai00 API 文档

本页介绍 Ai00 Server v0.7.1 当前提供的推理与管理接口。如果你第一次调用 Ai00,可以先完成下面的最小聊天请求;需要查找字段时,再展开对应接口的请求主体和响应结构。

发送第一个聊天请求

开始之前,请先按照 Ai00 轻松使用 启动服务并加载一个 RWKV 模型。可以先查询当前模型:

curl http://localhost:65530/api/oai/v1/models

如果响应的 data 中出现模型名称,说明服务和模型已经准备完成。接着发送一条最小聊天请求:

curl http://localhost:65530/api/oai/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      { "role": "user", "content": "请用一句话介绍 RWKV" }
    ],
    "max_tokens": 128,
    "stream": false
  }'
$body = @{
  messages = @(
    @{ role = "user"; content = "请用一句话介绍 RWKV" }
  )
  max_tokens = 128
  stream = $false
} | ConvertTo-Json -Depth 4

Invoke-RestMethod `
  -Uri "http://localhost:65530/api/oai/v1/chat/completions" `
  -Method Post `
  -ContentType "application/json" `
  -Body $body

成功响应的 choices[0].message.content 是模型生成的回答。如果请求无法连接,请先确认 Ai00 的监听地址、端口和 TLS 配置;如果接口可以访问但不能生成,请检查模型是否已经加载,以及终端中是否出现显存或模型格式错误。

上面的请求只使用了最必要的字段。namestemplate、采样器和 State 等配置可以在确认基础调用成功后逐步添加。

按任务选择接口

大多数应用只会使用聊天补全或文本续写。State、候选排序和管理接口用于更具体的集成场景,不需要在第一次调用时全部实现。

OpenAI 风格与推理接口

方法与路径说明
POST /api/oai/v1/chat/completions聊天补全,支持普通和 SSE 流式响应
POST /api/oai/v1/completions单条或批量文本续写
POST /api/oai/v1/chooses按困惑度为候选文本排序
POST /api/oai/v1/states从输入文本生成 RWKV State
POST /api/oai/v1/embeds可选外部 Embedding 模型;仅启用 embed feature 时存在
GET /api/oai/v1/models返回当前模型名称

/api/oai/v1/embeds 使用独立的文本 Embedding 模型,并不是从当前加载的 RWKV 模型中提取向量。只需要聊天或续写时,可以忽略这个接口。

运行时与管理接口

方法与路径说明
GET /api/adapters列出可用 GPU / WebGPU Adapter
GET /api/models/info当前模型、量化、LoRA、State 等运行时信息
GET /api/models/list列出模型目录中的模型
GET /api/models/state每半秒推送运行时信息的 SSE
POST /api/auth/exchange使用 app_id / app_secret 换取管理员 JWT
POST /admin/models/load加载模型、LoRA 和初始 State
POST /admin/models/save将当前模型保存为 prefab
GET /admin/models/unload卸载当前运行时
POST /admin/files/unzip解压服务器文件
POST /admin/files/dir/admin/files/ls列出服务器目录
POST /admin/files/config/load读取配置文件
POST /admin/files/config/save写入配置文件

聊天补全

聊天补全适合多轮对话,也是普通应用最常用的接口。每次请求应把当前对话所需的消息放入 messages;Ai00 会按照 template 将它们拼接后交给 RWKV 模型。

POST/api/oai/v1/chat/completions
按照 template 拼接 messages,并让当前 RWKV 模型继续生成。实际调用至少应提供一条有内容的消息。
请求主体application/json
messagesMessage | array<Message>可选
对话消息。虽然源码允许省略,但空消息没有实际生成意义。
收起子字段
roleSystem | User | Assistant | Observation必填
消息角色。
contentstring必填
消息内容。
namesobject<Role, string>可选
角色显示名映射;未指定时使用角色枚举名称。
templateobject可选
消息拼接模板。
收起子字段
recordstring可选
单条消息模板。
默认值:{role}: {content}
prefixstring可选
生成前缀。
默认值:{assistant}:
sepstring可选
消息分隔符。
默认值:\\n\\n
stateuuid | StateValue | StateFile可选
初始 State。通常传已加载 State 的 UUID。
max_tokensinteger可选
最大生成 token 数。
默认值:256
stopstring | array<string>可选
停止字符串。
默认值:\\n\\n
streamboolean可选
为 true 时返回 SSE。
默认值:false
biasobject<token_id, number>可选
Token ID 到 logit 权重的映射。
bnf_schemastring | null可选
用 BNF 约束输出。
samplerNucleus | Mirostat | Typical | null可选
完整采样器配置。
top_pnumber可选
未提供 sampler 时使用的 Nucleus 参数。
默认值:0.5
top_kinteger可选
未提供 sampler 时使用的 Nucleus 参数。
默认值:128
temperaturenumber可选
未提供 sampler 时使用的 Nucleus 参数。
默认值:1.0
非流式响应200application/json
objectstring始终返回
chat.completion。
modelstring始终返回
当前模型路径。
choicesarray<ChatChoice>始终返回
message、index 与 finish_reason。
usageTokenCounter始终返回
prompt、completion、total 与 duration。
流式响应200text/event-stream
objectstring始终返回
chat.completion.chunk。
choices[].deltaobject始终返回
先发送 role,再发送 content 增量,最后发送空对象。
choices[].finish_reasonstop | length | content_filter | null始终返回
最后一个事件给出停止原因。

文本续写

文本续写直接接在 prompt 后生成内容,不会自动组织 system、user、assistant 等聊天角色。它适合补全文本、批量续写,或由你的应用自行拼接提示词的场景。

POST/api/oai/v1/completions
prompt 可为字符串或字符串数组;非流式模式会并发处理数组中的多条输入。
请求主体application/json
promptstring | array<string>可选
一条或多条续写输入。
stateuuid | StateValue | StateFile可选
初始 State。
max_tokensinteger可选
每条输入的最大生成 token 数。
默认值:256
stopstring | array<string>可选
停止字符串。
默认值:\\n\\n
streamboolean可选
流式模式返回 SSE。
默认值:false
biasobject<token_id, number>可选
Token ID 到 logit 权重的映射。
bnf_schemastring | null可选
BNF 输出约束。
samplerNucleus | Mirostat | Typical | null可选
完整采样器配置。
top_p / top_k / temperaturenumber可选
未提供 sampler 时使用。默认 0.5 / 128 / 1.0。
非流式响应200application/json
objectstring始终返回
text_completion。
choicesarray<CompletionChoice>始终返回
每条输入对应一个 text、index 和 finish_reason。
usageTokenCounter始终返回
合并后的 token 统计和耗时。

候选排序

如果你的应用已经准备了多个候选答案,可以使用这个接口计算每个候选项的困惑度,并让 Ai00 按匹配程度排序。困惑度越低,表示候选文本越符合当前模型对输入内容的预测。

POST/api/oai/v1/chooses
对 choices 逐项计算困惑度,并按从低到高排序。calibrate 用于启用困惑度校准。
请求主体application/json
inputstring | array<string>可选
候选文本之前的输入;数组会直接拼接。
choicesarray<string>可选
待排序候选项。
calibrateboolean可选
是否启用困惑度校准。
默认值:false
stateuuid | StateValue | StateFile可选
初始 State。
成功响应200application/json
data[].indexinteger始终返回
候选项在原数组中的索引。
data[].rankinteger始终返回
从 0 开始的排序名次。
data[].choicestring始终返回
候选文本。
data[].perplexitynumber始终返回
困惑度,越低越匹配。

生成 State

RWKV State 可以理解为模型阅读一段文本后的内部状态。这个接口适合预先处理固定背景、角色设定或较长的公共前缀,再在后续请求中复用结果。返回的 State 数据可能很大,请不要把完整响应直接写入普通业务日志。

POST/api/oai/v1/states
把输入文本前向计算为可复用的模型状态。
请求主体application/json
inputstring | array<string>可选
用于构造 State 的文本;数组会直接拼接。
stateuuid | StateValue | StateFile可选
可从已有 State 继续计算。
成功响应200application/json
data[].dataarray<number>始终返回
展平的 State 浮点数据,体积可能很大。
data[].shape[integer, integer, integer, integer]始终返回
State 四维形状。
usageTokenCounter始终返回
输入 token 和耗时。

外部 Embedding 模型

这个接口不使用当前加载的 RWKV 模型。只有在 Ai00 构建时启用了 embed feature,并且另外加载了文本 Embedding 模型时,路由才可用。

POST/api/oai/v1/embeds
仅在 Ai00 构建时启用 embed feature 且成功加载独立文本 Embedding 模型后存在。输入会按 token 上限分块。
请求主体application/json
inputstring可选
要向量化的文本;不能为空。
max_tokensinteger可选
每个分块的 token 上限;服务端强制限制到 1..510。
默认值:510
prefixstring可选
加到每个文本分块前的模型任务前缀。
默认值:query:
成功响应200application/json
modelstring始终返回
Embedding 模型代码。
data[].chunksarray<ChunkData>始终返回
每个分块包含原文 chunk 和二维 embed 数组。
可用性feature-gated
routeconditional
未启用 embed feature 时路由不会注册。
modelconditional
路由存在但未加载 Embedding 模型时返回 400。

模型信息

在发送生成请求前,可以先调用这个接口确认 Ai00 当前加载的是哪个模型。它也适合作为应用启动时的简单连通性检查。

GET/api/oai/v1/models
返回当前加载模型的文件名。
成功响应200application/json
dataarray<ModelChoice>始终返回
当前模型数组,通常只有一项。
data[].objectstring始终返回
固定为 models。
data[].idstring始终返回
模型路径的文件名部分,不包含扩展名。

采样器格式

普通调用可以直接使用请求顶层的 top_ptop_ktemperature。只有需要完整控制采样方法时,才传入 sampler 对象;一旦提供 sampler,其中的配置会覆盖顶层采样参数。

Nucleus

{
  "type": "Nucleus",
  "top_p": 0.5,
  "top_k": 128,
  "temperature": 1,
  "presence_penalty": 0.3,
  "frequency_penalty": 0.3,
  "penalty_decay": 0.99654026
}

Mirostat

{
  "type": "Mirostat",
  "tau": 3,
  "rate": 0.1
}

Typical

{
  "type": "Typical",
  "tau": 0.5,
  "top_k": 128,
  "temperature": 1,
  "presence_penalty": 0.3,
  "frequency_penalty": 0.3,
  "penalty_decay": 0.99654026
}

管理员鉴权

推理接口用于生成内容,管理接口则可以加载模型、修改配置或操作服务器文件。两类接口应使用不同的访问控制策略。

/admin/* 会读取、写入或重新加载服务器文件。生产环境应关闭 force_pass,通过 /api/auth/exchange 获取管理员 JWT,并把管理端点限制在可信网络内。

先在 Config.toml 中配置管理应用的 app_idapp_secret,再调用下面的接口换取 JWT。不要把 app_secret 写入浏览器端代码或公开仓库。

POST/api/auth/exchange
使用 Config.toml 中配置的 app key 换取令牌。默认过期时间为 86400 秒。
请求主体application/json
app_idstring必填
Config.toml 中的应用 ID。
app_secretstring必填
对应的 secret key。
响应200 / 400 / 403application/json
tokenstring | null始终返回
成功时返回 JWT。
codeinteger始终返回
HTTP 状态码。
messagestring | null始终返回
结果说明。

换取令牌后,推荐通过 Authorization: Bearer <token> 请求头调用管理接口。查询参数 admin_token=<token> 也能提交令牌,但它更容易出现在代理和访问日志中,不建议在生产环境使用。

加载模型、LoRA 与 State

这个管理接口会销毁当前运行时,并按照请求内容重新加载模型。第一次调试时建议只填写 model_path 和必要的精度参数;确认模型能够加载后,再逐步加入 LoRA、State 和量化设置。

POST/admin/models/load
一个请求同时指定模型、LoRA、初始 State、量化、精度、批处理和 Adapter。需要管理员权限。
请求主体application/json
model_pathstring可选
模型路径。路径会限制在配置的模型目录内。
loraarray<Lora>可选
LoRA 列表。
收起子字段
pathstring必填
LoRA 路径。
alphanumber可选
混合系数。
默认值:1.0
statearray<State>可选
启动时加载的 State。
收起子字段
pathstring必填
State 文件路径。
namestring | null可选
显示名称。
iduuid可选
省略时自动生成。
defaultboolean可选
是否作为默认 State。
默认值:false
quantinteger可选
量化层数。
默认值:0
quant_typeInt8 | NF4可选
量化类型。
precisionFp16 | Fp32可选
中间张量精度。
默认值:Fp16
token_chunk_sizeinteger可选
每次并行处理的最大 token 数。
默认值:128
max_batchinteger可选
GPU 上缓存的 State 数。
默认值:8
tokenizer_pathstring可选
Tokenizer 路径。
bnfobject可选
BNF 缓存与起始非终结符配置。
adapterAuto | Economical | Manual(index)可选
GPU Adapter 选择。
默认值:Auto
成功响应200运行时加载成功;响应主体为空。
路径错误404模型、LoRA 或 State 路径越出允许目录;响应主体为空。
加载失败500模型加载失败;响应主体为空。

如果不确定应该选择哪张显卡,先把 adapter 设置为 "Auto"。经济模式写作 "Economical";手动选择通常写作 { "Manual": 0 },其中数字来自 GET /api/adapters 返回的显卡索引。

其他管理端点

下面列出 WebUI 和自动化部署可能使用的管理接口。普通聊天客户端不需要调用这些端点。

端点请求与响应
POST /admin/models/save{ "path": "model.prefab" };成功返回空 200
GET /admin/models/unload无请求主体;卸载完成后返回空 200
GET /api/models/info返回 reloadmodelstates 完整运行时信息
GET /api/models/stateSSE,每半秒发送一次运行时信息
GET /api/adapters返回字符串数组,例如 ["NVIDIA ...", "AMD ..."]
GET /api/models/list返回允许模型目录中的模型信息

文件管理端点接收服务器路径,适合 WebUI 自身使用,不建议作为通用公网 API。调用 /admin/files/unzipdir/lsconfig/loadconfig/save 前,应同时使用 JWT、反向代理访问控制和独立的模型目录权限。

响应与类型约定

下面这些规则在多个接口中重复出现。开发客户端时可以集中实现,避免为每个端点编写不同的解析逻辑:

  • Ai00 的 token 统计字段是 promptcompletiontotal
  • finish_reason 可能是 stoplengthcontent_filternull
  • stoppromptinput 使用 Ai00 的 Array<T> 类型,通常同时接受单值和数组。
  • state 可以是 UUID,也可以传完整 State 数据或 State 文件描述对象。
  • 流式聊天使用 chat.completion.chunk;流式续写使用 text_completion.chunk

历史与兼容接口

以下路径和字段仅用于维护历史客户端,不应作为新集成的实现依据。标记为“已移除”的接口在当前版本中不可用。

兼容路径

历史或兼容路径已确认版本状态当前接口
POST /api/oai/chat/completionsv0.7.1 仍兼容POST /api/oai/v1/chat/completions
POST /api/oai/completionsv0.7.1 仍兼容POST /api/oai/v1/completions
POST /api/oai/choosesv0.7.1 仍兼容POST /api/oai/v1/chooses
POST /api/oai/statesv0.7.1 仍兼容POST /api/oai/v1/states
POST /api/oai/embedsv0.7.1 仍兼容POST /api/oai/v1/embeds
GET /api/oai/modelsv0.7.1 仍兼容GET /api/oai/v1/models

已移除接口

历史接口使用版本当前替代方式
POST /api/oai/embeddingsPOST /api/oai/v1/embeddingsv0.4.9–v0.5.14;v0.6.0 移除POST /api/oai/v1/embeds
POST /admin/models/state/loadv0.5.0–v0.5.14;v0.6.0 移除POST /admin/models/loadstate 字段中加载

兼容请求字段

历史字段v0.7.1 当前字段适用请求
logit_biasbias聊天补全、文本续写
sampler_overridesampler聊天补全、文本续写
learning_raterateMirostat 采样器
这份文档对您有帮助吗?