REST API(旧版 v3 端点)
Server AI Toolkit 提供用于 AI 智能体工具的 REST API 端点。
已弃用的端点
这些 API 端点已弃用,请参阅新的 API 端点。
向后兼容性
之前的 API 名称,例如 schemaAwarenessData、getSchemaAwarenessData、
/v3/ai/toolkit/tools 和 /v3/ai/toolkit/schema-awareness-prompt,为了
向后兼容仍然可用,但它们已弃用。对于新的集成,请使用 editorContext、
getEditorContext 和 /v3/ai/toolkit/tools。
Postman 集合
浏览 Server AI Toolkit REST API 的 Postman 集合。
认证
所有请求都必须包含:
Authorization: Bearer <JWT>X-App-Id: <APP_ID>
使用你的 AI 密钥在服务端生成 JWT。请在 Server AI Toolkit 设置 页面获取你的 App ID 和密钥。
import jwt from 'jsonwebtoken'
const JWT_TOKEN = jwt.sign(
{
experimental_document_server_id: 'your-document-server-id',
experimental_document_server_management_api_secret:
'your-document-server-management-api-secret',
},
'your-ai-secret-key',
{ expiresIn: '1h' },
)更多信息请参阅 授权指南。
Document Server 凭据
当你希望 Server AI Toolkit 自动获取并保存 Tiptap Cloud 文档时,请在 JWT 中包含以下声明:
experimental_document_server_idexperimental_document_server_management_api_secret
基础 URL
托管的基础 URL 是:
https://api.tiptap.dev在下面的示例中,请求被写作 BASE_URL/v3/ai/...。
如何提供文档
工具端点只接受一种文档来源:
document:内联 Tiptap JSONexperimental_documentOptions:Tiptap Cloud 文档引用
experimental_documentOptions 具有以下结构:
documentId(string,必填):Tiptap Cloud 文档标识符。userId?(string | null,可选):归因于 AI 执行编辑操作的标识符。field?(string | null,可选,默认值:"default"):在省略或为null时,目标为文档中的特定协作字段(Y.js XML 片段)。当你的文档在同一个documentId下存储多个可编辑字段时——例如标题和正文分开存储——请使用此项。
Tiptap Cloud 文档示例:
{
"experimental_documentOptions": {
"documentId": "your-document-id",
"userId": "ai-assistant"
}
}针对非默认协作字段的示例:
{
"experimental_documentOptions": {
"documentId": "your-document-id",
"userId": "ai-assistant",
"field": "title"
}
}内联文档示例:
{
"document": {
"type": "doc",
"content": []
}
}线程需要云文档
线程和评论端点始终需要 experimental_documentOptions.documentId。
格式
大多数端点接受一个 format 字段:
"json":标准 JSON 表示形式"shorthand":Tiptap Shorthand,一种适用于提示词和模型输出的高效令牌格式
工具端点
获取工具定义
POST /v3/ai/toolkit/tools返回可供 AI 代理使用的工具定义。
请求体:
editorContext(EditorContext,必需)。通过getEditorContext函数获取的编辑器上下文。请参阅安装指南。tools?(Record<string, boolean>,可选):启用或禁用单个工具。支持的键请参阅工具参考。operationMeta?(string,可选,默认值:"")format?('json' | 'shorthand',可选,默认值:'json')schemaAwarenessData?(SchemaAwarenessData,可选,已弃用):请改用editorContext。为向后兼容而保留。
响应:
prompt(string):将其添加到 AI 请求的系统提示中。它会教 AI Tiptap 文档如何工作、可以包含哪些元素,以及文档格式如何工作。tools(array)name(string)description(string)inputSchema(object):AI 生成的工具input的 JSON schema。
执行工具
POST /v3/ai/toolkit/execute-tool执行一个 Server AI Toolkit 工具,例如 tiptapRead、tiptapEdit、getThreads 或
editThreads。有关每个受支持工具及其类型形状,请参阅工具参考。
请求体:
toolName(string,必需)input(必需):由 AI 模型生成的工具输入。其结构取决于toolName;请参阅工具参考。editorContext(EditorContext,必需,除非提供了schemaAwarenessData)schemaAwarenessData?(SchemaAwarenessData,可选,已弃用):请改用editorContext。为向后兼容而保留。toolConfig?(可选):由开发者提供、而非 AI 模型提供的工具特定参数。请参阅工具参考。format?('json' | 'shorthand',可选,默认值:'json')reviewOptions?(ReviewOptions,可选,默认值:{ mode: 'disabled' })experimental_commentsOptions?({ threadData?: Record<string, unknown>, commentData?: Record<string, unknown> },可选):在与线程相关的工具执行期间创建的新线程和评论所附加的元数据。- 恰好以下二者之一:
documentexperimental_documentOptions
响应:
output:工具响应,应由 AI 模型读取。请参阅工具参考。toolResult:以适合开发者解析的格式提供的工具响应。不应由 AI 读取。请参阅工具参考。docChanged(boolean):文档是否因工具调用而发生更改document(object | null):AI 对文档进行更改后的文档
流式执行工具
POST /v3/ai/toolkit/stream-tool流式执行工具。请求结构与 POST /v3/ai/toolkit/execute-tool 相同。流式响应格式仍在最终确定中。
由于此端点在实时连接上操作文档,它可能会返回 REST 端点不会返回的连接和并发错误。它们会在响应流中以 error 事件的形式到达——请参阅流式传输和会话错误。
旧版工作流端点
工作流端点已弃用
工作流端点会保留给现有集成使用。它们将在未来版本中移除。
获取工作流定义
使用以下任一端点:
POST /v3/ai/toolkit/workflows/editPOST /v3/ai/toolkit/workflows/insert-contentPOST /v3/ai/toolkit/workflows/proofreaderPOST /v3/ai/toolkit/workflows/threads
请求体:
format?('json' | 'shorthand', 可选,默认:'json').proofreader工作流仅接受'shorthand'。
响应:
systemPrompt(string)outputSchema(object)
示例:
curl --location 'BASE_URL/v3/ai/toolkit/workflows/edit' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--header 'X-App-Id: YOUR_APP_ID' \
--data '{
"format": "shorthand"
}'
读取工作流的文档内容
POST /v3/ai/toolkit/read/read-document读取文档内容并返回可供工作流使用的内容。
请求体:
range?({ from: number, to: number }, 可选,默认:整个文档)schemaAwarenessData(SchemaAwarenessData, 必需)format?('json' | 'shorthand', 可选,默认:'json')chunkSize?(number, 可选,默认:32000)reviewOptions?(ReviewOptions, 可选,默认:{ mode: 'disabled' })- 恰好一个:
documentexperimental_documentOptions
响应:
outputsuccess(boolean)content?(unknown)error?(string)
docChanged(boolean)document(object | null)
示例:
curl --location 'BASE_URL/v3/ai/toolkit/read/read-document' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--header 'X-App-Id: YOUR_APP_ID' \
--data '{
"schemaAwarenessData": { /* 模式感知数据 */ },
"format": "shorthand",
"reviewOptions": {
"mode": "disabled"
},
"experimental_documentOptions": {
"documentId": "your-document-id",
"userId": "ai-assistant"
}
}'
读取当前选区
POST /v3/ai/toolkit/read/read-selection读取选区并返回选区负载或明确的空状态。
请求体:
range({ from: number, to: number }, 必需)schemaAwarenessData(SchemaAwarenessData, 必需)format?('json' | 'shorthand', 可选,默认:'json')chunkSize?(number, 可选,默认:32000)reviewOptions?(ReviewOptions, 可选,默认:{ mode: 'disabled' })- 恰好一个:
documentexperimental_documentOptions
响应:
output- 当选区为空时:
isEmpty(true)
- 当选区包含内容时:
isEmpty(false)content(unknown)nodeHashes(string[])nodeRange({ from: number, to: number })prompt(string)
- 当选区为空时:
docChanged(boolean)document(object | null)
示例:
curl --location 'BASE_URL/v3/ai/toolkit/read/read-selection' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--header 'X-App-Id: YOUR_APP_ID' \
--data '{
"schemaAwarenessData": { /* 模式感知数据 */ },
"range": { "from": 10, "to": 42 },
"format": "shorthand",
"experimental_documentOptions": {
"documentId": "your-document-id"
}
}'
读取线程
POST /v3/ai/toolkit/read/threads读取 Tiptap Cloud 文档中的所有线程和评论。
请求体:
schemaAwarenessData(SchemaAwarenessData, 必需)format('json' | 'shorthand', 必需)experimental_documentOptions({ documentId: string, userId?: string, field?: string | null }, 必需)
响应:
outputthreads?(unknown[])error?(string)
docChanged(boolean)document(object | null)
示例:
curl --location 'BASE_URL/v3/ai/toolkit/read/threads' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--header 'X-App-Id: YOUR_APP_ID' \
--data '{
"schemaAwarenessData": { /* 模式感知数据 */ },
"format": "shorthand",
"experimental_documentOptions": {
"documentId": "your-document-id",
"userId": "ai-assistant"
}
}'
执行插入内容工作流
POST /v3/ai/toolkit/execute-workflow/insert-content请求体:
input(unknown, 必需):生成的插入内容负载range?({ from: number, to: number }, 可选)schemaAwarenessData(SchemaAwarenessData, 必需)format?('json' | 'shorthand', 可选,默认:'json')chunkSize?(number, 可选,默认:32000)reviewOptions?(ReviewOptions, 可选,默认:{ mode: 'disabled' })- 恰好一个:
documentexperimental_documentOptions
响应:
outputerror?(string)range?({ from: number, to: number })
docChanged(boolean)document(object | null)
示例:
curl --location 'BASE_URL/v3/ai/toolkit/execute-workflow/insert-content' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--header 'X-App-Id: YOUR_APP_ID' \
--data '{
"schemaAwarenessData": { /* 模式感知数据 */ },
"input": "This is the replacement content.",
"range": { "from": 10, "to": 42 },
"format": "shorthand",
"reviewOptions": {
"mode": "disabled"
},
"experimental_documentOptions": {
"documentId": "your-document-id",
"userId": "ai-assistant"
}
}'
执行 Tiptap 编辑工作流
POST /v3/ai/toolkit/execute-workflow/tiptap-edit请求体:
input(object, 必需):编辑工作流操作schemaAwarenessData(SchemaAwarenessData, 必需)format?('json' | 'shorthand', 可选,默认:'json')chunkSize?(number, 可选,默认:32000)reviewOptions?(ReviewOptions, 可选,默认:{ mode: 'disabled' })- 恰好一个:
documentexperimental_documentOptions
响应:
outputoperationResults?(array)reason?('validationError' | 'unexpectedError')error?(string)
docChanged(boolean)document(object | null)
示例:
curl --location 'BASE_URL/v3/ai/toolkit/execute-workflow/tiptap-edit' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--header 'X-App-Id: YOUR_APP_ID' \
--data '{
"schemaAwarenessData": { /* 模式感知数据 */ },
"input": {
"operations": [
{
"type": "replace",
"target": "abc123",
"content": "# Updated heading\n\nUpdated paragraph content."
}
]
},
"format": "shorthand",
"reviewOptions": {
"mode": "disabled"
},
"experimental_documentOptions": {
"documentId": "your-document-id",
"userId": "ai-assistant"
}
}'
执行校对者工作流
POST /v3/ai/toolkit/execute-workflow/proofreader请求体:
input(object, 必需):校对者操作schemaAwarenessData(SchemaAwarenessData, 必需)format('shorthand', 必需)chunkSize?(number, 可选,默认:32000)reviewOptions?(ReviewOptions, 可选,默认:{ mode: 'disabled' })- 恰好一个:
documentexperimental_documentOptions
响应:
outputoperationResults(array)
docChanged(boolean)document(object | null)
示例:
curl --location 'BASE_URL/v3/ai/toolkit/execute-workflow/proofreader' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--header 'X-App-Id: YOUR_APP_ID' \
--data '{
"schemaAwarenessData": { /* 模式感知数据 */ },
"input": {
"operations": []
},
"format": "shorthand",
"reviewOptions": {
"mode": "trackedChanges",
"trackedChangesOptions": {
"userId": "ai-assistant"
}
},
"experimental_documentOptions": {
"documentId": "your-document-id"
}
}'
执行评论工作流
POST /v3/ai/toolkit/execute-workflow/threads请求体:
input(object, 必需):线程操作schemaAwarenessData(SchemaAwarenessData, 必需)format?('json' | 'shorthand', 可选,默认:'json')experimental_documentOptions({ documentId: string, userId?: string, field?: string | null }, 必需)experimental_commentsOptions?({ threadData?: Record<string, unknown>, commentData?: Record<string, unknown> }, 可选):工作流创建的新线程和评论所附加的元数据。
响应:
outputoperations?(array)error?(string)
docChanged(boolean)document(object | null)
示例:
curl --location 'BASE_URL/v3/ai/toolkit/execute-workflow/threads' \
--header 'Content-Type: application/json' \
--header 'Authorization: Bearer YOUR_JWT_TOKEN' \
--header 'X-App-Id: YOUR_APP_ID' \
--data '{
"schemaAwarenessData": { /* 模式感知数据 */ },
"input": {
"operations": [
{
"type": "createComment",
"threadId": "thread-123",
"content": "请澄清这一点。"
}
]
},
"format": "shorthand",
"experimental_documentOptions": {
"documentId": "your-document-id",
"userId": "ai-assistant"
},
"experimental_commentsOptions": {
"threadData": {
"source": "ai"
},
"commentData": {
"source": "ai"
}
}
}'
错误处理
REST 端点返回错误时采用以下结构:
{
"error": {
"message": "对出错原因的人类可读描述。",
"status": 502,
"code": "document_load_failed"
}
}message(string):人类可读描述。不要基于它进行匹配——措辞可能会变化。status(number):HTTP 状态码,也会设置在响应中。code(string):一个可用于分支判断的稳定标识。验证失败会使用code: "validation_failed",并附加一个issues数组。
API 使用标准 HTTP 错误码:
400 Bad Request:无效正文、无效格式、缺少文档来源,或缺少 Document Server 凭据401 Unauthorized:缺少或无效的 JWT 或 App ID404 Not Found:未知端点或工具422 Unprocessable Entity:验证失败429 Too Many Requests:重复请求或限流保护500 Internal Server Error:意外的服务器错误502 Bad Gateway:加载或保存 Tiptap Cloud 文档失败
流式传输和会话错误
POST /v3/ai/toolkit/stream-tool 通过实时
连接在 Tiptap Cloud 文档上运行:它会实时加入该文档,因此 AI 会与其他协作者一起编辑最新内容。建立或使用该连接时发生的错误会以内联方式作为响应流中的 error 事件传递,而不是作为 HTTP 状态码:
{ "type": "error", "code": "concurrent_edit_conflict", "status": 409, "message": "..." }status 字段会映射到对应的 HTTP 状态码。可能的 code 值:
code | status | 发生时机 | 处理方式 |
|---|---|---|---|
concurrent_edit_conflict | 409 | 文档在工具运行期间发生了变化(例如,某个用户编辑了它),因此无法在过期内容之上应用更改。 | 重新运行请求。AI 会在下一次尝试时读取最新内容。可以安全地自动重试。参见 处理并发编辑。 |
schema_mismatch | 409 | 请求中的编辑器 schema 与该文档当前使用的 schema 不匹配,或者存储的文档无法用该 schema 解析。 | 为同一文档发送一致的 editorContext schema。不要用相同的 schema 重试。 |
websocket_auth_failed | 401 | 打开连接时,Tiptap Cloud 拒绝了文档凭据。 | 刷新 Document Server JWT 声明,然后重试。不要使用相同的 token 重试。 |
websocket_connection_failed | 502 | 与 Tiptap Cloud 的连接在初始同步完成前就已关闭。 | 使用退避策略重试。检查连通性和 Tiptap Cloud 状态。 |
websocket_sync_timeout | 504 | 文档在时限内没有完成初始同步。 | 使用退避策略重试。大文档和网络连接退化会让这种情况更容易发生。 |
session_limit_reached | 503 | 服务器正在处理的并发文档会话数量已达到上限。 | 使用退避策略重试。会话在进入空闲时会被释放。 |
session_creation_cancelled | 503 | 会话在完成连接之前就被拆除,通常发生在服务器重启期间。 | 重试。 |
仅适用于 Tiptap Cloud 文档
这些错误只会出现在 stream-tool 使用的实时连接路径中。发送内联 document 的请求不会打开连接,因此不会返回会话或 WebSocket 错误。
处理并发编辑
concurrent_edit_conflict 在协作文档中是预期内的。AI 读取文档、
调用模型并写回更改的同时,用户可能会在中间编辑同一个文档。与其
覆盖该编辑,工具包会拒绝此次写入,以免丢失任何工作。
把它当作一个安全、可重试的信号:当你收到一个 code: "concurrent_edit_conflict" 的 error 事件时,再次运行相同的工具调用。工具包会重新读取文档,
因此 AI 会基于用户的最新更改继续工作。请限制重试次数,以避免在一个被频繁编辑的
文档上陷入长循环。
// `runStream` 发送 start/delta/end 消息,并解析为流的
// 最终 `error` 事件;如果流成功完成,则返回 `null`。
async function streamToolWithRetry(body: unknown, maxRetries = 3) {
for (let attempt = 0; attempt <= maxRetries; attempt++) {
const error = await runStream(body)
if (!error) {
return // 成功完成
}
if (error.code !== 'concurrent_edit_conflict') {
throw new Error(`stream-tool failed: ${error.code}`)
}
// 文档在传输过程中发生了变化——使用最新内容重试。
}
throw new Error('工具调用因并发编辑而持续冲突。')
}可用工具
以下是可用工具列表。
tiptapRead
读取一部分顶层文档节点。它也会编辑文档,以便为高效编辑做准备。
工具配置(toolConfig)
null
工具输入(toolInput)
from(number): 要读取的第一个顶层节点的零基索引。
工具输出(toolOutput)
成功响应:
success(true): 表示读取请求成功。totalNodeCount(number): 文档中顶层节点总数。nodeRange([number, number]): 读取的顶层节点范围。content(JSONContent[] | string): 返回范围内的文档内容。当format为json时,这是一个 Tiptap JSON 片段。当format为shorthand时,这是一个 Tiptap Shorthand 字符串。
错误响应:
success(false): 表示读取请求失败。error(string): 错误信息。totalNodeCount?(number): 顶层节点总数。
工具结果(toolResult)
null
tiptapEdit
通过替换目标、在目标之前插入或在目标之后插入来编辑文档节点。
目标是来自 tiptapRead 的节点哈希,或者针对整个文档使用 "doc"。
工具配置(toolConfig)
null
工具输入(toolInput)
operations(array): 按顺序应用的编辑操作。操作格式在工具定义中有说明。如果你是客户,请联系我们以获取有关操作格式的更多信息。
工具输出(toolOutput)
成功或部分成功响应:
success(boolean): 所有操作是否都成功完成。operationResults(array): 每个操作的结果。success(boolean): 该操作是否成功完成。target(string): 该操作所针对元素的字符串标识符。error(string | null): 失败原因;如果操作成功则为null。
错误响应:
success(false): 表示编辑请求失败。reason('validationError' | 'unexpectedError'): 错误类别。error(string): 错误信息。
工具结果(toolResult)
null
getThreads
读取持久化的评论线程、其评论以及它们在文档中的位置。
需要 Tiptap Cloud 文档
由于线程存储在 Tiptap Document Server 上,此工具要求请求体中包含 experimental_documentOptions。请传入一个引用你的 Tiptap Cloud 文档的 documentId。
工具配置(toolConfig)
null
工具输入(toolInput)
from(number): 要读取的第一个线程的零基索引。
工具输出(toolOutput)
成功响应:
success(true): 表示读取请求成功。totalThreadCount(number): 文档中的线程总数。threadRange([number, number]): 读取的线程范围,格式为[from, to)。threads(array): 返回的线程对象。id(string): 唯一线程标识符。nodeRange([number, number] | null): 线程所在的节点范围;如果线程未在文档中被标注,则为null。content(JSONContent[] | string | null): 线程标记的内容。当format为json时,这是一个 Tiptap JSON 片段。当format为shorthand时,这是一个 Tiptap Shorthand 字符串。null表示线程未在文档中被标注。comments(array): 线程中的评论。id(string): 唯一评论标识符。content(string): 评论文本。userId(string): 创建该评论的用户 ID。createdAt(string): 评论创建时的 ISO 时间戳。updatedAt(string): 评论最后更新时间的 ISO 时间戳。
resolvedAt?(string | null): 线程被解决时的 ISO 时间戳;如果未解决,则为null。createdAt(string): 线程创建时的 ISO 时间戳。updatedAt(string): 线程最后更新时间的 ISO 时间戳。data?(Record<string, unknown>): 公开的线程元数据。
错误响应:
success(false): 表示读取请求失败。error(string): 错误信息。totalThreadCount?(number): 已持久化线程的总数(如果已知)。
工具结果(toolResult)
null
editThreads
创建、更新、删除、解决或取消解决评论线程和评论。
需要 Tiptap Cloud 文档
由于线程存储在 Tiptap Document Server 上,此工具要求请求体中包含 experimental_documentOptions。请传入一个引用你的 Tiptap Cloud 文档的 documentId。
工具配置(toolConfig)
null
要为新的 AI 生成线程或评论附加元数据,请在 execute-tool 请求中传入 experimental_commentsOptions。
工具输入(toolInput)
operations(array): 按顺序应用的线程操作。操作格式在工具定义中有说明。如果你是客户,请联系我们以获取有关操作格式的更多信息。
工具输出(toolOutput)
成功或部分成功响应:
success(boolean): 表示所有操作是否都成功完成。operations(array): 每个操作的结果。type(string): 已执行的操作类型。success(boolean): 该操作是否成功完成。message(string): 人类可读的操作结果。threadId?(string): 创建或引用线程的操作所对应的线程 ID。
错误响应:
success(false): 表示在处理操作之前请求就已失败。error(string): 错误信息。
工具结果(toolResult)
null
readDocument
读取整个文档的内容。
工具配置(toolConfig)
null
工具输入(toolInput)
{}
工具输出(toolOutput)
成功响应:
success(true): 表示文档读取成功。content(JSONContent[] | string): 整个有效文档内容。当format为json时, 这是一个 Tiptap JSON 片段。当format为shorthand时,这是一个 Tiptap Shorthand 字符串。
返回整个文档
该工具输出包含整个文档的内容,这可能会超出上下文窗口。为避免这种情况,你必须自行管理上下文窗口。
工具结果(toolResult)
与 toolOutput 结构相同。
proofreader
对文档进行小幅编辑。针对 AI 只进行一两个词的小编辑场景进行了优化。例如,对文档进行校对或检查拼写错误。
此工具仅支持 format: "shorthand"。
工具配置(toolConfig)
null
工具输入(toolInput)
operations(array): 按顺序应用的校对操作。操作格式在工具定义中有说明。如果你是客户,请联系我们以获取有关操作格式的更多信息。
工具输出(toolOutput)
成功或部分成功响应:
success(boolean): 表示所有操作是否都成功完成。operationResults(array): 每个操作的结果。target(string): 该操作所针对元素的字符串标识符。success(boolean): 该操作是否成功完成。error(string | null): 失败原因;操作成功时为null。
工具结果(toolResult)
null