跳到正文Skip to content

HTTP 翻译端点

当脚本、扩展或第三方应用需要把漫画图片提交给 Manga Translator 服务端翻译时使用本页。它记录 /translate 前缀下提交翻译任务的端点、请求与响应格式,以及任务在排队与执行过程中的状态。这里不重复流式帧协议的完整规范(见流式协议)、会话与权限错误约定(见认证与错误),也不描述导出原文/译文、导入渲染、仅上色/超分/修复等辅助端点(见批量、导出与导入流程)。Web 用户界面的操作入口见上传、配置与翻译

接口范围

  • 内容包括“提交翻译任务并取回结果”的端点:POST /translate/json/bytes/image 及其 /stream 变体,/with-form/* 表单变体,/batch/json/batch/imagesPOST /translate/queue-size
  • manga_translator/server/routes/translation.py 一共注册 31 个 /translate 路由声明;其中导出(/export/*)、导入(/import/*)、处理(/upscale/colorize/inpaint)和 /complete 属于其他页面。
  • queue-size 外,所有翻译端点都在路由内调用 verify_translation_auth():缺少或无效的 X-Session-Token 返回 401,无翻译器/OCR/上色/渲染权限返回 403,用户或用户组禁用的参数会被管理员默认值覆盖后再执行。
  • 单张与批量请求共用同一个全局翻译器实例与线程池,模型在请求之间复用;服务端翻译请求统一强制 cli.use_gpu=False,并禁用替换翻译、模板对齐等桌面专有模式。

端点清单

单张翻译端点

方法与路径请求响应工作流
POST /translate/jsonJSON:TranslateRequestJSON TranslationResponsesave_json
POST /translate/bytesJSON:TranslateRequest自定义字节流(见自定义字节格式save_json
POST /translate/imageJSON:TranslateRequestPNG StreamingResponsenormal
POST /translate/with-form/jsonmultipart/form-dataimage 文件 + config JSON 字符串JSON TranslationResponsesave_json
POST /translate/with-form/bytes同上自定义字节流save_json
POST /translate/with-form/image同上PNG StreamingResponsenormal

JSON 变体把整张图片编码为带 data:image/...;base64, 前缀的 data URI 放进 image 字段;表单变体以文件上传。两种入口都接收同一个 config:JSON 变体里是 Pydantic Config 对象,表单变体里是 JSON 字符串,由 parse_config() 校验。

流式翻译端点

方法与路径请求响应
POST /translate/json/streamJSON:TranslateRequest流式帧,结果载荷为 JSON
POST /translate/bytes/streamJSON:TranslateRequest流式帧,结果载荷为自定义字节
POST /translate/image/streamJSON:TranslateRequest流式帧,结果载荷为 PNG
POST /translate/with-form/json/stream表单:image + config流式帧,结果载荷为 JSON
POST /translate/with-form/bytes/stream表单:image + config流式帧,结果载荷为自定义字节
POST /translate/with-form/image/stream表单:image + config + user_env_vars流式帧,结果载荷为 PNG(通用模式,适合 API 调用与脚本)
POST /translate/with-form/image/stream/web表单:image + config + user_env_vars流式帧,结果载荷为 PNG(Web 前端优化模式)

流式端点通过 while_streaming() 注册活动任务、发送排队与阶段进度、执行翻译,最后用 transform_to_json / transform_to_bytes / transform_to_image 生成结果帧。/image/stream/web 把配置标记 _web_frontend_optimized 设为 truetransform_to_image()ctx.use_placeholder 为真时返回 1×1 占位 PNG 以加快响应,最终图片仍写入历史。

批量与队列端点

方法与路径请求响应
POST /translate/batch/jsonJSON:BatchTranslateRequestlist[TranslationResponse]
POST /translate/batch/imagesJSON:BatchTranslateRequestZIP 字节流,响应头 X-Content-Type: application/zip
POST /translate/queue-size无请求体JSON 整数

POST /translate/batch/images 在没有图片时返回 400;每个结果按 config.cli.format 或原始文件名决定输出格式与扩展名。POST /translate/queue-size 返回模块级 task_queue.queue 的长度;当前活跃的翻译路径用翻译信号量(task_manager.translation_semaphore)控制并发,该端点是遗留队列结构的只读快照,不代表信号量等待人数。

在 Web 界面中提交任务

Web 前端(static/index.html + static/script.js)是这些端点的主要消费者。页面顶部的工作流下拉框决定请求走哪个端点;多张图片的“普通翻译”走 /translate/batch/images(图片转 data URI,JSON 请求体),单张或特殊工作流走对应的 /translate/* 表单端点。

请求与响应契约

单张请求 TranslateRequest

字段类型说明
imagebytesstr表单上传的图片字节,或带 data:image/...;base64, 前缀的 data URI
configConfig完整翻译配置(Pydantic),缺省为 Config()

to_pil_image() 只接受这两类输入;其他输入(如裸 base64 或文件路径字符串)返回 422 及 “Invalid image data” 或 data URI 提示。

批量请求 BatchTranslateRequest

字段类型默认说明
imageslist[bytes | str]必填每张图片为字节或 data URI
configdictConfig{}配置;为 dict 时用 parse_config() 转换
batch_sizeint4每批处理的图片数
filenameslist[str][]原始文件名,用于输出命名与历史记录

响应 TranslationResponse

字段类型说明
regionslist[Translation]按阅读顺序排列的文本区域
original_width / original_heightint输入图片尺寸
upscale_ratio / upscaler可选开启超分时才出现
colorizer可选使用非 none 上色器时才出现
mask_raw可选精炼蒙版的 PNG base64(保存优化后的 ctx.mask
mask_is_refinedbool保存蒙版时恒为 true

每个 Translation 区域包含 texttranslationtranslation_rawtranslation_richanglefont_sizefg_colorsbg_colorsdirectionalignmenttarget_langsource_langline_spacingletter_spacingstroke_widthfont_familyprob 等字段。不要在文档或共享日志中粘贴响应里的 mask_raw 等用户图片数据。

自定义字节格式

TranslationResponse.to_bytes() 的结构:int32 区域数量 + 每个区域依次为 minX/minY/maxX/maxY(4 个 int32)、is_bulleted_list(1 字节)、anglefloat32)、probfloat32)、前景色(3 字节 RGB)、背景色(3 字节 RGB)、文本映射(int32 条目数;每条为 uint32 键长度 + UTF-8 键 + uint32 值长度 + UTF-8 值)。解码示例见 examples/response.*

流式帧格式

每个流式帧为“1 字节状态 + 4 字节大端长度 + 载荷”:状态 0 为结果字节,1 为进度 JSON,2 为错误 JSON。进度 JSON 的 stage 覆盖 queuedslot_acquiredtask_idstartimage_loadingtranslator_inittranslatingtranslate_doneprocessingtransforming。完整协议与客户端解析见流式协议

任务状态、队列与并发

flowchart TD
    A["客户端提交 /translate/* 请求"] --> B{"verify_translation_auth 校验会话与权限"}
    B -->|401 / 403| X["HTTP 错误响应"]
    B -->|通过| C{"track_task_start 检查并发与每日配额"}
    C -->|429| Y["HTTP 429 CONCURRENT_LIMIT_EXCEEDED / DAILY_QUOTA_EXCEEDED"]
    C -->|通过| D["申请翻译信号量槽位"]
    D --> E["线程池执行 translator.translate 或 translate_batch"]
    E --> F["组装 JSON / 字节 / PNG / 流式帧"]
    F --> G["返回响应;流式与批量端点同时写入历史"]
  • 并发槽位来自 task_manager.translation_semaphore,默认 max_concurrent_tasks=3(从 server_config 读取);while_streaming() 等待槽位时先发送 stage: queued(含 queue_position),拿到槽位后发送 stage: slot_acquired
  • 活动任务注册在 task_manager.active_tasks,初始状态 queued,拿到槽位后更新为 running;管理员取消任务后,流式任务收到 CancelledError 并发送状态 2 的错误帧。
  • 批量端点把 task_id 传给 get_batch_ctx(),每张图片转换与翻译前都检查 is_task_cancelled();取消或检测到取消时返回 499
  • 拥有离线翻译权限(allow_offline_translation)的用户在 /batch/images 中会使用永不断开的请求包装器,客户端断线后任务仍继续执行并写入历史。

接口约束

  • 会话与权限:所有翻译端点依赖 X-Session-Token;账号停用、令牌过期或活动刷新失败都会返回 401。权限过滤先覆盖禁用参数,再检查翻译器/OCR/上色/渲染权限。
  • 配置来源:请求中的 config 是完整配置快照;服务端启动用 config/config.json(不存在时复制 config-example.json)。用户提交的值会被用户组/用户白名单黑名单覆盖,不能当作最终生效值。
  • user_env_vars:表单端点可携带大写环境变量键值,与用户预设合并后经 API Key 策略校验;键与当前翻译器不匹配时返回 403。文档与日志不得展示真实 Key。
  • 与相邻页面:流式帧解码与任务取消时序见流式协议;导出/导入/上色/超分/修复端点见批量、导出与导入流程;会话、权限与全局错误格式见认证与错误
  • 并发与历史:翻译同时受信号量与用户并发/每日配额限制;流式与批量成功后写入历史,历史读取与下载见历史、文件与下载票据

开发指南

选项中英对照

工作流选项与端点映射

UI 调用 keyEnglish 实际值简体中文实际值
Translation Workflow Mode:Translation Workflow Mode:翻译流程模式:
Normal TranslationNormal Translation正常翻译流程
Export TranslationExport Translation导出翻译
Export Original TextExport Original Text导出原文
Import Translation and RenderImport Translation and Render导入翻译并渲染
Colorize OnlyColorize Only仅上色
Upscale OnlyUpscale Only仅超分
Inpaint OnlyInpaint Only仅修复
Start TranslationStart Translation开始翻译
Log output...Log output...日志输出...

工作流存储值到端点的映射:normal/translate/with-form/image/streamexport_trans/translate/export/translatedexport_raw/translate/export/originalimport_trans/translate/import/jsoncolorize/translate/colorizeupscale/translate/upscaleinpaint/translate/inpaint。前端在 localStorage.session_token 存在时把令牌放进 X-Session-Token 请求头,批量请求另设 30 分钟 AbortController 超时。

错误、取消与状态码

状态码触发条件(当前代码)来源
200成功:JSON、图片、流、字节或 queue-size 整数FastAPI 默认
400/batch/images 未提供图片;导入/导出校验失败translation.py:449
401X-Session-Token 缺失(NO_TOKEN)或无效/过期(INVALID_TOKENtranslation_auth.py:253
403翻译器/OCR/上色/渲染权限不足;用户 API Key 与翻译器不匹配translation_auth.py:345core/response_utils.py
422请求体校验失败或图片数据非法;全局 handler 返回 detail 与请求体main.py:255
429超过用户并发任务数(CONCURRENT_LIMIT_EXCEEDED)或每日配额(DAILY_QUOTA_EXCEEDEDcore/middleware.py:326:365
499批量任务被强制取消或检测为取消translation.py:421:518
500无结果图片、翻译异常或服务未初始化translation.py:527request_extraction.py

流式端点不会在翻译中途失败时抛出 HTTP 错误,而是发送状态 2 的错误帧,载荷为 {"error": ..., "stage": ...};只有认证、权限、并发、配额和请求校验阶段才返回 HTTP 状态码。

文件/格式本页实际作用注意事项
manga_translator/server/routes/translation.py31 个 /translate 路由声明与参数绑定端点清单、工作流与错误码以本文件为准
manga_translator/server/request_extraction.pyTranslateRequestBatchTranslateRequestget_ctxwhile_streamingget_batch_ctx图片解码、槽位、任务注册与历史保存
manga_translator/server/to_json.pyTranslationResponseTranslation 与自定义字节格式响应字段与 to_bytes() 布局
manga_translator/server/core/response_utils.pytransform_to_json/bytes/imageapply_user_env_vars占位图、字节/JSON 转换与 API Key 策略
manga_translator/server/routes/translation_auth.pyverify_translation_auth、任务计数与配额401/403/429 与禁用参数过滤
manga_translator/server/core/task_manager.py信号量、线程池、活动任务与取消并发默认值与任务状态
manga_translator/server/myqueue.py遗留 TaskQueuequeue-size 的数据源只读快照,不代表信号量等待数
manga_translator/server/runtime_api.py运行时 API 覆盖(Sakura/OCR/上色/渲染)环境变量优先级,不写真实密钥
manga_translator/server/static/index.htmlstatic/script.jsWeb 前端提交入口与流解析UI 文案 key 与请求头

代码位置

层级文件本页核对内容
路由manga_translator/server/routes/translation.py端点路径、方法、请求/响应模型、工作流与状态码
请求/响应manga_translator/server/request_extraction.pyto_json.pycore/response_utils.pyTranslateRequest/BatchTranslateRequest/TranslationResponse、字节与流式帧格式
鉴权与限制manga_translator/server/routes/translation_auth.pycore/middleware.py401/403/429、禁用参数过滤、并发与配额
队列与任务manga_translator/server/core/task_manager.pymyqueue.py信号量、线程池、活动任务、取消与 queue-size
运行覆盖manga_translator/server/runtime_api.pyAPI Key/Base/Model 环境变量优先级
Web UImanga_translator/server/static/index.htmlstatic/script.jsdesktop_qt_ui/locales/en_US.jsonzh_CN.json工作流下拉、提交端点与 UI 三列文案