3046 lines
89 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

openapi: 3.0.3
info:
title: Muse Content API
version: 1.0.0
paths:
# ========== 作品(Work) ==========
/app-api/content/works:
get:
tags: [Content]
summary: 获取作品列表
operationId: listWorks
parameters:
- $ref: '../openapi-base.yaml#/components/parameters/pageNo'
- $ref: '../openapi-base.yaml#/components/parameters/pageSize'
- name: status
in: query
schema:
type: string
enum: [draft, active, archived]
description: 作品状态过滤
responses:
'200':
description: 作品分页列表
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/PaginatedResult'
- type: object
properties:
list:
type: array
items:
$ref: '#/components/schemas/WorkSummary'
post:
tags: [Content]
summary: 创建新作品
operationId: createWork
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [title]
properties:
title:
type: string
minLength: 1
maxLength: 200
description:
type: string
maxLength: 2000
genre:
type: string
coverImageUrl:
type: string
format: uri
responses:
'201':
description: 作品创建成功
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/Work'
/app-api/content/works/{workId}:
get:
tags: [Content]
summary: 获取作品详情
operationId: getWork
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 作品详情
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/Work'
put:
tags: [Content]
summary: 更新作品
operationId: updateWork
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
title:
type: string
maxLength: 200
description:
type: string
maxLength: 2000
genre:
type: string
coverImageUrl:
type: string
format: uri
status:
type: string
enum: [draft, active, archived]
responses:
'200':
description: 更新成功
content:
application/json:
schema:
$ref: '../openapi-base.yaml#/components/schemas/CommonResult'
delete:
tags: [Content]
summary: 删除作品
operationId: deleteWork
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 删除成功
'404':
$ref: '../openapi-base.yaml#/components/responses/NotFound'
# ========== 章节(Chapter) ==========
/app-api/content/works/{workId}/chapters:
get:
tags: [Content]
summary: 获取作品章节列表
operationId: listChapters
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 章节列表(按 sortOrder 排序)
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Chapter'
post:
tags: [Content]
summary: 创建章节
operationId: createChapter
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [title]
properties:
title:
type: string
minLength: 1
maxLength: 500
sortOrder:
type: integer
description: 插入位置,默认追加到末尾
responses:
'201':
description: 创建成功
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/Chapter'
/app-api/content/chapters/{chapterId}:
get:
tags: [Content]
summary: 获取章节详情
operationId: getChapter
parameters:
- name: chapterId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 章节详情(含 Block 列表)
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/ChapterDetail'
put:
tags: [Content]
summary: 更新章节
operationId: updateChapter
parameters:
- name: chapterId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
properties:
title:
type: string
maxLength: 500
sortOrder:
type: integer
status:
type: string
enum: [draft, completed]
responses:
'200':
description: 更新成功
delete:
tags: [Content]
summary: 删除章节
operationId: deleteChapter
parameters:
- name: chapterId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 删除成功
/app-api/content/chapters/{chapterId}/reorder:
put:
tags: [Content]
summary: 调整章节排序
operationId: reorderChapters
parameters:
- name: chapterId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [newSortOrder]
properties:
newSortOrder:
type: integer
minimum: 0
responses:
'200':
description: 排序更新成功
# ========== Block ==========
/app-api/content/chapters/{chapterId}/blocks:
get:
tags: [Content]
summary: 获取章节 Block 列表
operationId: listBlocks
parameters:
- name: chapterId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: Block 列表
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/Block'
post:
tags: [Content]
summary: 创建 Block
operationId: createBlock
parameters:
- name: chapterId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [content, blockType]
properties:
content:
type: string
description: Block 正文内容JSON 格式的 ProseMirror 文档)
blockType:
type: string
enum: [scene, section, note]
description: Block 类型
sortOrder:
type: integer
title:
type: string
maxLength: 500
responses:
'201':
description: 创建成功
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/Block'
/app-api/content/blocks/{blockId}:
get:
tags: [Content]
summary: 获取 Block 详情
operationId: getBlock
parameters:
- name: blockId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: Block 详情
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/Block'
put:
tags: [Content]
summary: 保存 Block 正文
operationId: saveBlock
parameters:
- name: blockId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [content, sourceVersion]
properties:
content:
type: string
description: Block 正文ProseMirror JSON
sourceVersion:
type: integer
description: 客户端持有的版本号,用于乐观锁冲突检测
responses:
'200':
description: 保存成功
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: object
properties:
newVersion:
type: integer
description: 保存后的新版本号
'409':
description: 版本冲突,需客户端处理
content:
application/json:
schema:
$ref: '../openapi-base.yaml#/components/schemas/ErrorResponse'
delete:
tags: [Content]
summary: 删除 Block
operationId: deleteBlock
parameters:
- name: blockId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 删除成功
/app-api/content/blocks/{blockId}/split:
post:
tags: [Content]
summary: 分割 Block
operationId: splitBlock
parameters:
- name: blockId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [splitPosition]
properties:
splitPosition:
type: integer
description: 分割位置(字符偏移量)
responses:
'200':
description: 分割成功,返回两个新 Block
/app-api/content/blocks/{blockId}/merge:
post:
tags: [Content]
summary: 合并 Block
operationId: mergeBlocks
parameters:
- name: blockId
in: path
required: true
schema:
type: string
format: uuid
description: 与下一个 Block 合并
responses:
'200':
description: 合并成功
# ========== 导出(旧版保留) ==========
/app-api/content/works/{workId}/export:
post:
tags: [Content]
summary: 导出作品
operationId: exportWork
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [format]
properties:
format:
type: string
enum: [txt, epub, docx]
includeChapters:
type: array
items:
type: string
format: uuid
description: 指定导出章节,空数组表示导出全部
responses:
'200':
description: 导出任务已创建,返回任务 ID 供轮询
'202':
description: 导出文件二进制流(小文件直接返回)
# ================================================================
# 以下为 Phase 0 新增接口
# ================================================================
# ========== Admin 内容管理 (Section 3.2) ==========
/admin-api/muse/content/works:
get:
tags: [Content-Admin]
summary: 查询作品列表和治理摘要
description: |
管理员查询作品列表,返回治理摘要信息。
默认不返回用户私有正文全文,确需查看必须另有合规访问设计。
operationId: adminListWorks
parameters:
- $ref: '../openapi-base.yaml#/components/parameters/pageNo'
- $ref: '../openapi-base.yaml#/components/parameters/pageSize'
- name: status
in: query
schema:
type: string
enum: [draft, active, archived]
description: 作品状态过滤
- name: keyword
in: query
schema:
type: string
description: 标题关键词搜索
- name: riskFlag
in: query
schema:
type: boolean
description: 是否只返回有异常标记的作品
responses:
'200':
description: 作品列表与治理摘要
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/PaginatedResult'
- type: object
properties:
list:
type: array
items:
$ref: '#/components/schemas/AdminWorkSummary'
/admin-api/muse/content/works/{workId}:
get:
tags: [Content-Admin]
summary: 查看作品元信息、章节摘要、异常摘要
description: |
管理员查看作品元信息。默认不返回用户私有正文全文,
确需查看必须另有合规访问设计、审计和最小化字段。
operationId: adminGetWork
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 作品元信息、章节摘要、异常摘要
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/AdminWorkDetail'
/admin-api/muse/content/works/{workId}/chapters:
get:
tags: [Content-Admin]
summary: 查看章节列表
description: 管理员查看作品的章节列表,不含正文全文。
operationId: adminListChapters
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 章节列表
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/AdminChapterSummary'
/admin-api/muse/content/import-tasks:
get:
tags: [Content-Admin]
summary: 查询导入任务
operationId: adminListImportTasks
parameters:
- $ref: '../openapi-base.yaml#/components/parameters/pageNo'
- $ref: '../openapi-base.yaml#/components/parameters/pageSize'
- name: status
in: query
schema:
type: string
enum: [queued, processing, completed, failed]
description: 任务状态过滤
- name: workId
in: query
schema:
type: string
format: uuid
description: 按作品过滤
responses:
'200':
description: 导入任务列表
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/PaginatedResult'
- type: object
properties:
list:
type: array
items:
$ref: '#/components/schemas/ImportTaskSummary'
/admin-api/muse/content/export-tasks:
get:
tags: [Content-Admin]
summary: 查询导出任务
operationId: adminListExportTasks
parameters:
- $ref: '../openapi-base.yaml#/components/parameters/pageNo'
- $ref: '../openapi-base.yaml#/components/parameters/pageSize'
- name: status
in: query
schema:
type: string
enum: [queued, processing, completed, failed]
description: 任务状态过滤
- name: workId
in: query
schema:
type: string
format: uuid
description: 按作品过滤
responses:
'200':
description: 导出任务列表
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/PaginatedResult'
- type: object
properties:
list:
type: array
items:
$ref: '#/components/schemas/ExportTaskSummary'
/admin-api/muse/content/works/{workId}/risk-actions:
post:
tags: [Content-Admin]
summary: 异常内容治理动作
description: |
管理员对异常内容执行治理动作。必须带 commandId、操作者、权限点、变更理由和审计字段。
高危治理进入业务审计。
operationId: adminRiskAction
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RiskActionRequest'
responses:
'200':
description: 治理动作执行成功
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/RiskActionResult'
# ========== App 来源归因 (Section 4.3) ==========
/app-api/muse/blocks/{blockId}/source-attribution:
get:
tags: [Content]
summary: 查看当前 Block revision 来源归因
description: |
返回 Block 当前 revision 的来源归因信息,包含来源对象、来源版本、
授权快照和许可限制。前端可据此展示内容来源标签和合规提示。
operationId: getBlockSourceAttribution
parameters:
- name: blockId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: Block 来源归因信息
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/SourceAttribution'
'404':
$ref: '../openapi-base.yaml#/components/responses/NotFound'
# ========== App Meta 投影 (Section 4.3) ==========
/app-api/muse/works/{workId}/meta-projections:
get:
tags: [Content-Meta]
summary: 查询作品维度用户可见 MetaSchema 投影
description: |
返回作品维度用户可见的 MetaSchema 投影列表。
投影不是事实源,只是 MetaSchema、用户权限、来源状态和目标对象版本计算后的 read model。
operationId: listMetaProjections
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 作品维度 MetaSchema 投影列表
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/MetaProjectionSummary'
/app-api/muse/works/{workId}/meta-projections/{projectionKey}:
get:
tags: [Content-Meta]
summary: 查询指定投影结构、字段数据和版本
description: |
返回指定投影的结构、字段数据和版本信息。
包含 schemaVersion、projectionVersion、dataRevision、sourceSnapshot 和可见字段列表。
operationId: getMetaProjection
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
- name: projectionKey
in: path
required: true
schema:
type: string
description: 投影标识,如 setting、worldview、character 等
responses:
'200':
description: 投影详情
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/MetaProjectionDetail'
/app-api/muse/works/{workId}/dynamic-fields/validate:
post:
tags: [Content-Meta]
summary: 校验动态字段数据,不写入
description: |
只做校验和路由建议,不写入任何 Canonical fact。
正式写入必须回到目标 owner API。Schema 过期返回 SCHEMA_STALE
字段已废弃返回 FIELD_DEPRECATED投影过期返回 PROJECTION_STALE。
operationId: validateDynamicFields
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DynamicFieldValidationRequest'
responses:
'200':
description: 校验结果
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/DynamicFieldValidationResult'
# ========== App 作品规划 (Section 4.4) ==========
/app-api/muse/works/{workId}/planning:
get:
tags: [Content-Planning]
summary: 查询当前作品可见规划结构
description: |
返回作品可见规划结构、已确认规划数据、revision 和来源摘要。
规划正式数据由用户确认后进入 content ownerAI 只能产生 Planning Candidate不直接写正式规划。
operationId: getPlanning
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 作品规划结构
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/PlanningStructure'
/app-api/muse/works/{workId}/planning/{sectionKey}:
put:
tags: [Content-Planning]
summary: 保存规划项
description: |
保存规划项,必须带 commandId 和 expectedRevision。
涉及 MetaSchema 管控的动态字段写入时expectedSchemaVersion 和 expectedProjectionVersion 必须校验。
operationId: savePlanningItem
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
- name: sectionKey
in: path
required: true
schema:
type: string
description: 规划项标识,如 setting、worldview、character、plot-beat 等
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/SavePlanningItemRequest'
responses:
'200':
description: 保存成功
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/PlanningItemSaveResult'
'409':
description: 版本冲突或 Schema/投影过期
content:
application/json:
schema:
$ref: '../openapi-base.yaml#/components/schemas/ErrorResponse'
/app-api/muse/works/{workId}/planning/candidates:
post:
tags: [Content-Planning]
summary: 创建规划候选任务
description: |
创建规划候选任务,支持生成、补全、整理和多组选项。
返回异步任务 ID 供轮询。Planning Candidate 是 Shadow 对象。
operationId: createPlanningCandidate
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreatePlanningCandidateRequest'
responses:
'202':
description: 规划候选任务已创建
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: object
properties:
jobId:
type: string
description: 异步任务 ID供轮询
status:
type: string
enum: [queued, processing]
pollUrl:
type: string
description: 轮询地址
get:
tags: [Content-Planning]
summary: 查询规划候选
description: 查询待确认、已确认和已丢弃的规划候选列表。
operationId: listPlanningCandidates
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
- name: status
in: query
schema:
type: string
enum: [pending, confirmed, discarded]
description: 候选状态过滤
- name: sectionKey
in: query
schema:
type: string
description: 按规划项过滤
responses:
'200':
description: 规划候选列表
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/PlanningCandidateSummary'
/app-api/muse/works/{workId}/planning/candidates/{candidateId}:
get:
tags: [Content-Planning]
summary: 查询候选详情
description: 返回候选详情、来源、质量结果和 diff。
operationId: getPlanningCandidate
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
- name: candidateId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 规划候选详情
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/PlanningCandidateDetail'
/app-api/muse/works/{workId}/planning/candidates/{candidateId}/confirm:
post:
tags: [Content-Planning]
summary: 确认候选进入正式规划
description: |
确认候选进入正式规划,必须带 commandId 和 expectedRevision。
确认时目标 owner 必须重验 work 权限、候选状态、来源状态、授权快照、
质量结果和目标 revision。确认成功只写正式规划项和业务审计
不写正文或 Local KB。
operationId: confirmPlanningCandidate
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
- name: candidateId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ConfirmPlanningCandidateRequest'
responses:
'200':
description: 确认成功
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/PlanningCandidateDecisionResult'
/app-api/muse/works/{workId}/planning/candidates/{candidateId}/discard:
post:
tags: [Content-Planning]
summary: 丢弃候选
description: 丢弃候选,必须带 commandId 和原因。
operationId: discardPlanningCandidate
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
- name: candidateId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/DiscardPlanningCandidateRequest'
responses:
'200':
description: 丢弃成功
content:
application/json:
schema:
$ref: '../openapi-base.yaml#/components/schemas/CommonResult'
/app-api/muse/works/{workId}/planning/style-checks:
post:
tags: [Content-Planning]
summary: 创建文风检查任务
description: 创建文风检查任务,返回 jobId 供轮询。
operationId: createStyleCheck
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateStyleCheckRequest'
responses:
'202':
description: 文风检查任务已创建
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: object
properties:
jobId:
type: string
description: 异步任务 ID
status:
type: string
enum: [queued, processing]
pollUrl:
type: string
/app-api/muse/works/{workId}/planning/style-checks/{jobId}:
get:
tags: [Content-Planning]
summary: 查询文风检查结果
description: 查询文风检查结果、风险标记和建议入口。
operationId: getStyleCheckResult
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
- name: jobId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 文风检查结果
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/StyleCheckResult'
# ========== App 导入导出 (Section 4.9) ==========
/app-api/muse/works/{workId}/import-tasks:
post:
tags: [Content-ImportExport]
summary: 上传并创建导入任务
description: |
上传文件并创建导入任务。导入上传必须绑定 owner、用途、大小、MIME、hash、
扫描状态、source snapshot、authorization snapshot、保留期和清理策略
扫描 blocked/failed 的文件不得创建 Parse Job。
operationId: createImportTask
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateImportTaskRequest'
responses:
'202':
description: 导入任务已创建
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/ImportTaskDetail'
/app-api/muse/import-tasks/{taskId}:
get:
tags: [Content-ImportExport]
summary: 查询导入任务
operationId: getImportTask
parameters:
- name: taskId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 导入任务详情
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/ImportTaskDetail'
/app-api/muse/works/{workId}/parse-jobs:
post:
tags: [Content-ImportExport]
summary: 创建 AI 全书解析任务
description: |
创建 AI 全书解析任务,读取 Content 导入文件或章节上下文。
Parse Job 必须绑定 workId、发起人、Content 上下文引用、source snapshot、
authorization snapshot、解析配置版本、Runtime Permission Envelope 和重试组。
operationId: createParseJob
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateParseJobRequest'
responses:
'202':
description: AI 解析任务已创建
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/ParseJobDetail'
/app-api/muse/parse-jobs/{jobId}:
get:
tags: [Content-ImportExport]
summary: 查询 AI 解析任务
operationId: getParseJob
parameters:
- name: jobId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: AI 解析任务详情
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/ParseJobDetail'
/app-api/muse/parse-jobs/{jobId}/retry:
post:
tags: [Content-ImportExport]
summary: 重试解析任务
description: 重试可重试解析任务或失败阶段。
operationId: retryParseJob
parameters:
- name: jobId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
type: object
required: [commandId]
properties:
commandId:
type: string
description: 幂等键
retryStage:
type: string
description: 指定重试的失败阶段,不传则重试整个任务
responses:
'200':
description: 重试已发起
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: object
properties:
jobId:
type: string
status:
type: string
enum: [queued, processing]
pollUrl:
type: string
/app-api/muse/parse-jobs/{jobId}/chapters:
get:
tags: [Content-ImportExport]
summary: AI 章节解析结果
description: 返回 Parse Job 下所有章节的 AI 解析结果列表。
operationId: listParseJobChapters
parameters:
- name: jobId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 章节解析结果列表
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: array
items:
$ref: '#/components/schemas/ChapterParseResult'
/app-api/muse/chapter-parse-results/{resultId}/confirm:
post:
tags: [Content-ImportExport]
summary: 章节审阅确认
description: |
章节审阅确认,通知 Knowledge 生成或刷新知识草稿。
章节确认只表示 AI Chapter Parse Result 审阅通过并进入 Knowledge Draft 处理,不写正式知识。
operationId: confirmChapterParseResult
parameters:
- name: resultId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/ConfirmChapterParseResultRequest'
responses:
'200':
description: 确认成功
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
type: object
properties:
draftId:
type: string
description: 生成的知识草稿 ID
status:
type: string
enum: [confirmed, draft_created]
/app-api/muse/chapter-parse-results/{resultId}/reject:
post:
tags: [Content-ImportExport]
summary: 章节驳回
description: |
章节驳回,记录原因并作废对应 AI Shadow 结果。
不删除原始导入文件。
operationId: rejectChapterParseResult
parameters:
- name: resultId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/RejectChapterParseResultRequest'
responses:
'200':
description: 驳回成功
content:
application/json:
schema:
$ref: '../openapi-base.yaml#/components/schemas/CommonResult'
/app-api/muse/parse-jobs/{jobId}/chapters/batch-confirm:
post:
tags: [Content-ImportExport]
summary: 批量确认章节
description: |
批量确认章节,返回逐章成功、失败和部分失败摘要。
以章节为事务边界,允许部分失败;某章失败不得回滚已成功章节。
operationId: batchConfirmChapters
parameters:
- name: jobId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/BatchConfirmChaptersRequest'
responses:
'200':
description: 批量确认结果
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/BatchConfirmChaptersResult'
/app-api/muse/works/{workId}/export-tasks:
post:
tags: [Content-ImportExport]
summary: 创建导出任务
description: |
创建导出任务,必须带 commandId 幂等键。
下载凭证必须携带来源传播版本和授权快照。
operationId: createExportTask
parameters:
- name: workId
in: path
required: true
schema:
type: string
format: uuid
requestBody:
required: true
content:
application/json:
schema:
$ref: '#/components/schemas/CreateExportTaskRequest'
responses:
'202':
description: 导出任务已创建
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/ExportTaskDetail'
/app-api/muse/export-tasks/{taskId}:
get:
tags: [Content-ImportExport]
summary: 查询导出任务
operationId: getExportTask
parameters:
- name: taskId
in: path
required: true
schema:
type: string
format: uuid
responses:
'200':
description: 导出任务详情
content:
application/json:
schema:
allOf:
- $ref: '../openapi-base.yaml#/components/schemas/CommonResult'
- type: object
properties:
data:
$ref: '#/components/schemas/ExportTaskDetail'
/app-api/muse/downloads/{credentialId}:
get:
tags: [Content-ImportExport]
summary: 下载导出包
description: |
使用下载凭证下载导出包。来源 revoked/recalled/blocked/unauthorized
或授权过期时返回 SOURCE_BLOCKED、SOURCE_NEEDS_RECHECK 或 PRECHECK_EXPIRED
不能继续下载。
operationId: downloadExportPackage
parameters:
- name: credentialId
in: path
required: true
schema:
type: string
description: 下载凭证 ID
responses:
'200':
description: 导出文件二进制流
content:
application/octet-stream:
schema:
type: string
format: binary
'404':
$ref: '../openapi-base.yaml#/components/responses/NotFound'
'410':
description: 下载凭证已过期或已消费
content:
application/json:
schema:
$ref: '../openapi-base.yaml#/components/schemas/ErrorResponse'
components:
schemas:
# ========== 原有 Schema ==========
Work:
type: object
required: [id, title, status, createdAt, updatedAt]
properties:
id:
type: string
format: uuid
title:
type: string
description:
type: string
genre:
type: string
coverImageUrl:
type: string
format: uri
status:
type: string
enum: [draft, active, archived]
wordCount:
type: integer
description: 总字数
chapterCount:
type: integer
description: 章节数
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
WorkSummary:
type: object
required: [id, title, status, updatedAt]
properties:
id:
type: string
format: uuid
title:
type: string
genre:
type: string
status:
type: string
enum: [draft, active, archived]
wordCount:
type: integer
chapterCount:
type: integer
updatedAt:
type: string
format: date-time
Chapter:
type: object
required: [id, workId, title, sortOrder, status, createdAt, updatedAt]
properties:
id:
type: string
format: uuid
workId:
type: string
format: uuid
title:
type: string
sortOrder:
type: integer
status:
type: string
enum: [draft, completed]
wordCount:
type: integer
blockCount:
type: integer
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
ChapterDetail:
allOf:
- $ref: '#/components/schemas/Chapter'
- type: object
properties:
blocks:
type: array
items:
$ref: '#/components/schemas/Block'
Block:
type: object
required: [id, chapterId, blockType, content, sortOrder, version, createdAt, updatedAt]
properties:
id:
type: string
format: uuid
chapterId:
type: string
format: uuid
blockType:
type: string
enum: [scene, section, note]
title:
type: string
content:
type: string
description: ProseMirror JSON 格式的正文内容
sortOrder:
type: integer
version:
type: integer
description: 乐观锁版本号,每次保存 +1
wordCount:
type: integer
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
# ========== Admin 内容管理 Schema ==========
AdminWorkSummary:
type: object
description: 管理员视角的作品列表项,含治理摘要
required: [id, title, status, ownerId, updatedAt]
properties:
id:
type: string
format: uuid
title:
type: string
genre:
type: string
status:
type: string
enum: [draft, active, archived]
ownerId:
type: string
description: 作品所有者用户 ID
wordCount:
type: integer
chapterCount:
type: integer
riskFlags:
type: array
description: 异常标记列表
items:
type: object
properties:
riskType:
type: string
description: 异常类型,如 content_violation、copyright_issue
severity:
type: string
enum: [low, medium, high, critical]
description:
type: string
description: 异常描述摘要
lastGovernanceActionAt:
type: string
format: date-time
description: 最近一次治理动作时间
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
AdminWorkDetail:
type: object
description: 管理员视角的作品详情,含章节摘要和异常摘要
required: [id, title, status, ownerId, createdAt, updatedAt]
properties:
id:
type: string
format: uuid
title:
type: string
description:
type: string
genre:
type: string
status:
type: string
enum: [draft, active, archived]
ownerId:
type: string
description: 作品所有者用户 ID
wordCount:
type: integer
chapterCount:
type: integer
chapterSummaries:
type: array
description: 章节摘要列表(不含正文全文)
items:
$ref: '#/components/schemas/AdminChapterSummary'
exceptionSummary:
type: object
description: 异常摘要
properties:
totalRiskFlags:
type: integer
description: 总异常标记数
criticalCount:
type: integer
description: 严重异常数
activeGovernanceActions:
type: integer
description: 进行中的治理动作数
latestRiskType:
type: string
description: 最近异常类型
governanceHistory:
type: array
description: 治理操作历史摘要
items:
type: object
properties:
action:
type: string
description: 治理动作类型
operatorId:
type: string
description: 操作者 ID
reason:
type: string
operatedAt:
type: string
format: date-time
createdAt:
type: string
format: date-time
updatedAt:
type: string
format: date-time
AdminChapterSummary:
type: object
description: 管理员视角的章节摘要,不含正文全文
required: [id, title, sortOrder, status]
properties:
id:
type: string
format: uuid
title:
type: string
sortOrder:
type: integer
status:
type: string
enum: [draft, completed]
wordCount:
type: integer
blockCount:
type: integer
riskFlags:
type: array
items:
type: object
properties:
riskType:
type: string
severity:
type: string
enum: [low, medium, high, critical]
RiskActionRequest:
type: object
description: 异常内容治理动作请求
required: [commandId, action, reason]
properties:
commandId:
type: string
description: 幂等键
action:
type: string
enum: [warn, restrict, block_content, force_archive, notify_owner]
description: |
治理动作类型:
warn - 发出警告通知
restrict - 限制部分功能
block_content - 阻断内容访问
force_archive - 强制归档作品
notify_owner - 通知作品所有者
reason:
type: string
description: 治理原因,必须填写
targetScope:
type: string
enum: [work, chapter, block]
description: 治理范围粒度,默认 work
targetIds:
type: array
items:
type: string
format: uuid
description: 指定治理的章节或 Block ID粒度非 work 时必填)
expectedVersion:
type: integer
description: 作品当前版本号,用于乐观锁
duration:
type: string
description: 限制时长,如 P7D7 天),仅 restrict 动作适用
RiskActionResult:
type: object
description: 治理动作执行结果
properties:
actionId:
type: string
description: 治理动作记录 ID
status:
type: string
enum: [executed, pending_notification]
affectedScope:
type: string
description: 实际影响的范围描述
auditLogId:
type: string
description: 审计日志 ID
ImportTaskSummary:
type: object
description: 导入任务摘要(管理端列表用)
required: [id, workId, status, createdAt]
properties:
id:
type: string
format: uuid
workId:
type: string
format: uuid
workTitle:
type: string
fileName:
type: string
fileSize:
type: integer
format: int64
format:
type: string
enum: [txt, epub, docx, markdown]
status:
type: string
enum: [queued, processing, completed, failed]
ownerId:
type: string
createdAt:
type: string
format: date-time
completedAt:
type: string
format: date-time
ExportTaskSummary:
type: object
description: 导出任务摘要(管理端列表用)
required: [id, workId, status, createdAt]
properties:
id:
type: string
format: uuid
workId:
type: string
format: uuid
workTitle:
type: string
format:
type: string
enum: [txt, epub, docx]
status:
type: string
enum: [queued, processing, completed, failed]
ownerId:
type: string
createdAt:
type: string
format: date-time
completedAt:
type: string
format: date-time
# ========== 来源归因 Schema ==========
SourceAttribution:
type: object
description: Block 当前 revision 的来源归因信息
required: [blockId, revision]
properties:
blockId:
type: string
format: uuid
revision:
type: integer
description: Block 当前 revision 号
sources:
type: array
description: 来源归因列表
items:
type: object
required: [sourceType, sourceId, contributionType]
properties:
sourceType:
type: string
enum: [user_original, ai_suggestion, knowledge_reference, market_asset, imported_content]
description: 来源类型
sourceId:
type: string
description: 来源对象 ID
sourceName:
type: string
description: 来源对象名称
contributionType:
type: string
enum: [full, partial, reference, context]
description: 贡献类型
authorizationSnapshotId:
type: string
description: 授权快照 ID
sourceVersion:
type: integer
description: 来源版本号
licenseRestrictions:
type: array
description: 许可限制列表
items:
type: string
lineage:
type: object
description: 来源谱系信息
properties:
parentSuggestionId:
type: string
description: 关联的 AI 候选 ID
acceptedAt:
type: string
format: date-time
acceptMode:
type: string
enum: [accept_as_is, merge_after_edit]
# ========== Meta 投影 Schema ==========
MetaProjectionSummary:
type: object
description: 作品维度 MetaSchema 投影摘要
required: [projectionKey, schemaVersion, projectionVersion]
properties:
projectionKey:
type: string
description: 投影标识,如 setting、worldview、character
projectionName:
type: string
description: 投影名称
schemaVersion:
type: integer
description: 本次投影使用的 MetaSchema 版本
projectionVersion:
type: integer
description: 可见投影版本,用于判断前端缓存是否过期
dataRevision:
type: integer
description: 目标对象动态字段数据 revision
fieldCount:
type: integer
description: 可见字段数量
MetaProjectionDetail:
type: object
description: 投影详情,含结构和字段数据
required: [projectionKey, schemaVersion, projectionVersion, dataRevision, fields]
properties:
projectionKey:
type: string
projectionName:
type: string
schemaVersion:
type: integer
description: 使用的 MetaSchema active 或灰度版本
projectionVersion:
type: integer
description: 可见投影版本
dataRevision:
type: integer
description: 目标对象动态字段数据 revision
sourceSnapshot:
type: object
description: 来源对象、来源版本、授权快照和来源状态摘要
properties:
sourceType:
type: string
sourceId:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
sourceStatus:
type: string
enum: [active, stale, revoked, recalled, blocked, owner_missing, unauthorized]
fields:
type: array
description: 仅包含当前用户可见、可编辑、可搜索或可导出的字段
items:
type: object
required: [fieldKey, fieldType, uiVisible]
properties:
fieldKey:
type: string
fieldName:
type: string
fieldType:
type: string
enum: [text, number, boolean, enum, reference, structured, date]
required:
type: boolean
uiVisible:
type: boolean
description: 是否进入用户可见投影
aiContext:
type: boolean
description: 是否允许进入 AI 上下文组装
userEditable:
type: boolean
description: 用户端是否允许保存该动态字段
userSearchable:
type: boolean
description: 是否允许用户搜索或筛选
exportable:
type: boolean
description: 是否可被导出预检纳入
deprecated:
type: boolean
description: 字段是否已废弃
migrationHint:
type: string
description: 废弃时的迁移提示
writeOwner:
type: string
description: 写入 owner 标识
ownerCommand:
type: string
description: owner 写入命令路径
value:
description: 当前字段值
enumValues:
type: array
description: 枚举可选值fieldType=enum 时)
items:
type: string
DynamicFieldValidationRequest:
type: object
description: 动态字段校验请求
required: [fields, schemaVersion, projectionVersion]
properties:
fields:
type: array
description: 待校验的动态字段数据
items:
type: object
required: [fieldKey, value]
properties:
fieldKey:
type: string
value:
description: 字段值
schemaVersion:
type: integer
description: 调用方持有的 MetaSchema 版本
projectionVersion:
type: integer
description: 调用方持有的投影版本
dataRevision:
type: integer
description: 调用方持有的数据 revision
DynamicFieldValidationResult:
type: object
description: 动态字段校验结果
properties:
valid:
type: boolean
description: 整体是否合法
fieldResults:
type: array
items:
type: object
properties:
fieldKey:
type: string
valid:
type: boolean
errors:
type: array
items:
type: object
properties:
errorCode:
type: string
enum: [REQUIRED_MISSING, TYPE_MISMATCH, ENUM_INVALID, REFERENCE_INVALID, FIELD_DEPRECATED, VALUE_OUT_OF_RANGE]
message:
type: string
schemaStale:
type: boolean
description: Schema 是否已过期
projectionStale:
type: boolean
description: 投影是否已过期
currentSchemaVersion:
type: integer
currentProjectionVersion:
type: integer
currentDataRevision:
type: integer
routeSuggestions:
type: array
description: 写入路由建议,指引前端到正确的 owner 命令
items:
type: object
properties:
fieldKey:
type: string
writeOwner:
type: string
ownerCommand:
type: string
description: 建议的 owner 命令路径
# ========== 规划 Schema ==========
PlanningStructure:
type: object
description: 作品规划结构
required: [workId, revision]
properties:
workId:
type: string
format: uuid
revision:
type: integer
description: 规划数据 revision
sections:
type: array
description: 已确认的规划项列表
items:
$ref: '#/components/schemas/PlanningSection'
sourceSnapshot:
type: object
description: 来源摘要
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
PlanningSection:
type: object
description: 规划项数据
required: [sectionKey, revision]
properties:
sectionKey:
type: string
description: 规划项标识,如 setting、worldview、character、plot-beat
sectionName:
type: string
content:
type: object
description: 规划项内容(结构化 JSON
revision:
type: integer
description: 该规划项的 revision
schemaVersion:
type: integer
description: 使用的 MetaSchema 版本
projectionVersion:
type: integer
description: 使用的投影版本
updatedAt:
type: string
format: date-time
SavePlanningItemRequest:
type: object
description: 保存规划项请求
required: [commandId, content, expectedRevision]
properties:
commandId:
type: string
description: 幂等键
content:
type: object
description: 规划项内容(结构化 JSON
expectedRevision:
type: integer
description: 目标规划 section 的当前 revision
expectedSchemaVersion:
type: integer
description: 调用方持有的 MetaSchema 版本(涉及动态字段时必须)
expectedProjectionVersion:
type: integer
description: 调用方持有的投影版本(涉及动态字段时必须)
sourceSnapshot:
type: object
description: 来源快照摘要
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
auditReason:
type: string
description: 用户保存或覆盖原因
PlanningItemSaveResult:
type: object
description: 规划项保存结果
properties:
sectionKey:
type: string
newRevision:
type: integer
updatedAt:
type: string
format: date-time
CreatePlanningCandidateRequest:
type: object
description: 创建规划候选任务请求
required: [sectionKey, taskType]
properties:
sectionKey:
type: string
description: 目标规划项标识
taskType:
type: string
enum: [generate, supplement, organize, multi_option]
description: |
任务类型:
generate - 生成新内容
supplement - 补全已有内容
organize - 整理已有内容
multi_option - 生成多组选项
context:
type: object
description: 生成上下文,如已有规划内容、用户指令等
commandId:
type: string
description: 幂等键
sourceSnapshot:
type: object
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
PlanningCandidateSummary:
type: object
description: 规划候选摘要
required: [id, sectionKey, status, createdAt]
properties:
id:
type: string
format: uuid
sectionKey:
type: string
taskType:
type: string
enum: [generate, supplement, organize, multi_option]
status:
type: string
enum: [pending, confirmed, discarded]
revision:
type: integer
qualityScore:
type: number
description: 质量评分
createdAt:
type: string
format: date-time
confirmedAt:
type: string
format: date-time
PlanningCandidateDetail:
type: object
description: 规划候选详情
required: [id, sectionKey, status, content, revision, createdAt]
properties:
id:
type: string
format: uuid
sectionKey:
type: string
taskType:
type: string
enum: [generate, supplement, organize, multi_option]
status:
type: string
enum: [pending, confirmed, discarded]
content:
type: object
description: 候选内容(结构化 JSON
revision:
type: integer
qualityResult:
type: object
description: 质量检查结果
properties:
score:
type: number
passed:
type: boolean
issues:
type: array
items:
type: object
properties:
severity:
type: string
enum: [info, warning, critical]
code:
type: string
message:
type: string
diff:
type: object
description: 与当前正式规划的差异
properties:
hasChanges:
type: boolean
summary:
type: string
additions:
type: integer
deletions:
type: integer
modifications:
type: integer
sourceSnapshot:
type: object
properties:
sourceType:
type: string
sourceId:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
createdAt:
type: string
format: date-time
confirmedAt:
type: string
format: date-time
ConfirmPlanningCandidateRequest:
type: object
description: 确认规划候选请求
required: [commandId, expectedRevision]
properties:
commandId:
type: string
description: 幂等键
expectedRevision:
type: integer
description: 目标规划 section 的当前 revision
expectedSchemaVersion:
type: integer
description: MetaSchema 版本(涉及动态字段时必须)
expectedProjectionVersion:
type: integer
description: 投影版本(涉及动态字段时必须)
sourceSnapshot:
type: object
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
auditReason:
type: string
description: 用户确认原因
PlanningCandidateDecisionResult:
type: object
description: 候选确认结果
properties:
candidateId:
type: string
newRevision:
type: integer
description: 规划项新 revision
sectionKey:
type: string
auditLogId:
type: string
DiscardPlanningCandidateRequest:
type: object
description: 丢弃规划候选请求
required: [commandId, reason]
properties:
commandId:
type: string
description: 幂等键
reason:
type: string
description: 丢弃原因
CreateStyleCheckRequest:
type: object
description: 创建文风检查任务请求
required: [commandId]
properties:
commandId:
type: string
description: 幂等键
checkScope:
type: string
enum: [full_work, selected_chapters, selected_blocks]
description: 检查范围,默认 full_work
targetIds:
type: array
items:
type: string
format: uuid
description: 指定检查的章节或 Block IDcheckScope 非 full_work 时必填)
styleRules:
type: object
description: 自定义文风规则(可选,不传则使用作品设定)
sourceSnapshot:
type: object
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
StyleCheckResult:
type: object
description: 文风检查结果
required: [jobId, status]
properties:
jobId:
type: string
format: uuid
status:
type: string
enum: [queued, processing, completed, failed]
riskMarkers:
type: array
description: 风险标记列表
items:
type: object
properties:
markerType:
type: string
enum: [consistency, tone_shift, pacing, vocabulary, repetition]
severity:
type: string
enum: [info, warning, critical]
location:
type: object
properties:
chapterId:
type: string
blockId:
type: string
position:
type: string
description:
type: string
summary:
type: object
properties:
overallScore:
type: number
consistencyScore:
type: number
checkedWordCount:
type: integer
markerCount:
type: integer
suggestions:
type: array
description: 建议入口
items:
type: object
properties:
suggestionType:
type: string
enum: [rewrite, adjust, review]
targetSectionKey:
type: string
description:
type: string
completedAt:
type: string
format: date-time
# ========== 导入导出 Schema ==========
CreateImportTaskRequest:
type: object
description: 创建导入任务请求
required: [commandId, fileName, fileSize, fileHash]
properties:
commandId:
type: string
description: 幂等键
fileName:
type: string
description: 文件名
fileSize:
type: integer
format: int64
description: 文件大小(字节)
fileHash:
type: string
description: 文件哈希值
mimeType:
type: string
description: 文件 MIME 类型
format:
type: string
enum: [txt, epub, docx, markdown]
description: 导入文件格式
uploadUrl:
type: string
format: uri
description: 已上传文件的存储引用
sourceSnapshot:
type: object
description: 来源快照
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
ImportTaskDetail:
type: object
description: 导入任务详情
required: [id, workId, status, createdAt]
properties:
id:
type: string
format: uuid
workId:
type: string
format: uuid
fileName:
type: string
fileSize:
type: integer
format: int64
format:
type: string
enum: [txt, epub, docx, markdown]
status:
type: string
enum: [queued, processing, completed, failed]
scanStatus:
type: string
enum: [pending, passed, blocked, failed]
description: 文件扫描状态
progress:
type: integer
description: 处理进度百分比0-100
errorMessage:
type: string
description: 失败时的错误信息
failedStage:
type: string
description: 失败阶段
retryable:
type: boolean
description: 是否可重试
nextActions:
type: array
description: 下一步建议动作
items:
type: string
sourceSnapshot:
type: object
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
createdAt:
type: string
format: date-time
completedAt:
type: string
format: date-time
CreateParseJobRequest:
type: object
description: 创建 AI 全书解析任务请求
required: [commandId, importTaskId]
properties:
commandId:
type: string
description: 幂等键
importTaskId:
type: string
format: uuid
description: 关联的导入任务 ID
parseConfig:
type: object
description: 解析配置
properties:
chapterDetectionMode:
type: string
enum: [auto, manual_outline, hybrid]
description: 章节检测模式
languageHint:
type: string
description: 语言提示
customInstructions:
type: string
description: 自定义解析指令
sourceSnapshot:
type: object
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
ParseJobDetail:
type: object
description: AI 解析任务详情
required: [id, workId, status, createdAt]
properties:
id:
type: string
format: uuid
workId:
type: string
format: uuid
importTaskId:
type: string
format: uuid
status:
type: string
enum: [queued, processing, completed, failed]
progress:
type: integer
description: 处理进度百分比0-100
totalChapters:
type: integer
description: 检测到的总章节数
confirmedChapters:
type: integer
description: 已确认章节数
pendingChapters:
type: integer
description: 待审阅章节数
errorMessage:
type: string
failedStage:
type: string
retryable:
type: boolean
nextActions:
type: array
items:
type: string
parseConfigVersion:
type: integer
description: 解析配置版本
sourceSnapshot:
type: object
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
createdAt:
type: string
format: date-time
completedAt:
type: string
format: date-time
ChapterParseResult:
type: object
description: AI 章节解析结果
required: [id, jobId, title, status, revision]
properties:
id:
type: string
format: uuid
jobId:
type: string
format: uuid
title:
type: string
description: AI 检测到的章节标题
sortOrder:
type: integer
contentPreview:
type: string
description: 内容预览(截取摘要,非全文)
wordCount:
type: integer
status:
type: string
enum: [pending_review, confirmed, rejected]
description: |
审阅状态:
pending_review - 待审阅
confirmed - 已确认
rejected - 已驳回
revision:
type: integer
qualityResult:
type: object
properties:
score:
type: number
issues:
type: array
items:
type: object
properties:
severity:
type: string
code:
type: string
message:
type: string
ConfirmChapterParseResultRequest:
type: object
description: 章节审阅确认请求
required: [commandId, expectedRevision]
properties:
commandId:
type: string
description: 幂等键
expectedRevision:
type: integer
description: 当前 parse result revision
RejectChapterParseResultRequest:
type: object
description: 章节驳回请求
required: [commandId, reason]
properties:
commandId:
type: string
description: 幂等键
reason:
type: string
description: 驳回原因
expectedRevision:
type: integer
description: 当前 parse result revision
BatchConfirmChaptersRequest:
type: object
description: 批量确认章节请求
required: [commandId, resultIds]
properties:
commandId:
type: string
description: 幂等键
resultIds:
type: array
description: 待确认的 chapter parse result ID 列表
items:
type: string
format: uuid
BatchConfirmChaptersResult:
type: object
description: 批量确认章节结果
properties:
confirmedChapterResultIds:
type: array
description: 成功确认的章节 result ID 列表
items:
type: string
format: uuid
createdDraftIds:
type: array
description: 生成的知识草稿 ID 列表
items:
type: string
format: uuid
failedChapters:
type: array
description: 失败章节列表
items:
type: object
properties:
resultId:
type: string
format: uuid
errorCode:
type: string
errorMessage:
type: string
skippedChapters:
type: array
description: 跳过章节列表
items:
type: object
properties:
resultId:
type: string
format: uuid
reason:
type: string
partialFailure:
type: boolean
description: 是否存在部分失败
CreateExportTaskRequest:
type: object
description: 创建导出任务请求
required: [commandId, format]
properties:
commandId:
type: string
description: 幂等键
format:
type: string
enum: [txt, epub, docx]
description: 导出格式
includeChapters:
type: array
description: 指定导出章节 ID空数组表示导出全部
items:
type: string
format: uuid
includeMetadata:
type: boolean
default: true
description: 是否包含元数据
includePlanning:
type: boolean
default: false
description: 是否包含规划数据
sourceSnapshot:
type: object
description: 来源快照
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
ExportTaskDetail:
type: object
description: 导出任务详情
required: [id, workId, format, status, createdAt]
properties:
id:
type: string
format: uuid
workId:
type: string
format: uuid
format:
type: string
enum: [txt, epub, docx]
status:
type: string
enum: [queued, processing, completed, failed]
progress:
type: integer
description: 处理进度百分比0-100
downloadCredentialId:
type: string
description: 完成后的下载凭证 ID
downloadExpiresAt:
type: string
format: date-time
description: 下载凭证过期时间
errorMessage:
type: string
sourceSnapshot:
type: object
properties:
sourceType:
type: string
sourceVersion:
type: integer
authorizationSnapshotId:
type: string
createdAt:
type: string
format: date-time
completedAt:
type: string
format: date-time