MAX API v1.0.4-preview.1 发布:强化 Seedance 视频任务、通用视频任务计费、Responses 兼容能力与部分bug修复
[!NOTE]当前 MAX API 分为正式版和 Preview 预览版。Preview 预览版用于提前开放新能力和修复便于在真实环境中验证兼容性、稳定性和安全性正式版将在对应 Preview 预览版稳定运行 1 周后正式发布以保障系统安全性和可靠性。MAX API v1.0.4-preview.1 发布强化 Seedance 视频任务、通用视频任务计费、Responses 兼容能力与部分bug修复GitHub 地址https://github.com/MAX-API-Next/MAX-API/releases/tag/v1.0.4-preview.1Highlights完善豆包 Seedance 2.0 视频任务支持新增官方safety_identifier、priority参数透传并保留对 Seedance 响应形态的结果解析兼容。补齐豆包视频任务对火山 Seedance 官方请求体的支持content[]和ratio、generate_audio、duration、seed等顶层参数可继续透传到 DoubaoVideo 上游封装。收紧 DoubaoVideo 官方可选字符串处理ratio、callback_url、service_tier、safety_identifier可区分未传和显式空字符串带空白的ratio会在转发前规范化。修正豆包 Seedance 2.0 动态计费按输出分辨率和是否包含视频输入计算倍率避免 1080p、4k 或视频输入请求被错误按基础档计费。新增通用任务参数化计费兜底能力任意视频模型只要配置任务 rate card就可以按最终请求体中的时长、分辨率、音频、媒体输入等字段计费不再局限于 Kling / Seedance 专属适配。通用视频任务协议聚焦路径、状态和结果解析配置请求体透传复用渠道级Pass Through Body字段改写和默认值复用现有Param Override。任务提交链路会在计费前应用最终Param Override请求体避免视频时长、分辨率、尺寸或输入媒体被改写后仍按旧请求预扣费。修复通用视频任务计费边界场景multipart 请求经Param Override改写后会按最终上游 JSON 计费顶层image/images也不会被同步后的请求上下文重复计数。任务Param Override的 header 联动现在会真正发送到上游return_error和无效改写会按本地配置错误处理不再误触发渠道处罚。清理历史协议配置前端保存会移除旧协议值和已废弃的视频任务请求体配置。修复异步视频任务可能卡在in_progress 100%的问题非终态任务不会再因为进度为100%而退出后台轮询。修复多节点异步任务结算日志归属任务完成轮询可以发生在任意节点但消费日志和用量数据会归属到任务发起节点。增强用量看板数据维度支持按分组、令牌、渠道和节点记录消费聚合降低多节点部署下排查账单归属的难度。增强 OpenAI Responses 兼容层新增 Responses ↔ Chat Completions 双向转换能力便于把/v1/responses请求接入 Chat 形态上游。新增 Gemini/v1/responses兼容路径支持将 Responses 请求转换为 Gemini generateContent并将 Gemini 非流式 / 流式结果回转为 Responses 响应。Advanced Custom 新增openai_responses_to_openai_chat_completions转换器可为自定义通道配置 Responses 入站、Chat Completions 上游的转发链路。修复 Claude / Gemini 工具调用响应兼容性问题assistant 文本和工具调用同时存在时不会再丢失文本内容。加强 Claude 工具调用参数校验空参数继续按{}兼容无效 JSON 参数会明确报错避免向上游发送被静默改写的空输入。强化前端 Markdown / HTML 富文本渲染安全公告、首页、关于页、法律文档等可配置内容统一经过安全渲染链路处理。优化通知中心状态管理提升已读状态、通知弹窗去重和本地缓存恢复的稳定性。Playground 改善模型 / 分组等选择器在数据刷新、异常和空选项下的状态恢复。Playground 输入区补充长文本布局保护连续超长提示词不会再横向撑开输入框或把配置、发送按钮挤出屏幕。用量日志新增更细的重试筛选语义可区分普通错误重试和空输出重试方便定位重试来源。修复历史时间窗口下用量统计 RPM / TPM 显示为 0 的问题实时速率指标继续按最近 60 秒计算。New Features豆包视频任务新增火山 Seedance 官方请求体支持可直接接收官方content[]请求不再要求同时提供顶层prompt。callback_url、return_last_frame、service_tier、execution_expires_after、generate_audio、draft、tools可透传到上游封装。ratio、resolution、duration、frames、seed、camera_fixed、watermark等生成控制参数会合并进最终上游 payload。generate_audio: false、return_last_frame: false、priority: 0、seed: 0等显式零值会被保留。ratio、callback_url、service_tier、safety_identifier等可选字符串会保留“未传”和“显式空字符串”的差异。豆包 Seedance 2.0 任务请求新增参数支持safety_identifier可透传到上游。priority可透传到上游。priority: 0会被保留并发送不会因为零值被omitempty丢弃。Seedance 2.0 计费支持官方分辨率档位480p/720p作为基础档。1080p使用独立倍率。4k使用独立倍率。是否包含视频输入会参与同一套价格表计算。任务参数化计费支持通用 rate card 兜底适配器专属计费仍优先执行Kling / Ali 等已有专属实现保持原有优先级。适配器未返回参数化计费结果时会按模型名或上游模型名匹配task_billing_setting.rate_cards。可按duration、resolution、ratio、quality/mode、has_audio、has_video_input、image_count、video_count等通用字段匹配价格行。未配置 rate card 的模型继续回退到原有模型价格和OtherRatios计费逻辑。通用视频任务协议支持渠道级请求体透传开启渠道Pass Through Body后JSON 请求会保留客户端字段并继续应用模型映射。通用视频任务协议提交请求统一经过Param Override可复用现有参数覆盖能力完成字段改写、默认值注入和上游适配。任务请求头现在复用普通 relay 的 header override 处理set_header、delete_header、copy_header、move_header和pass_headers可用于异步任务上游请求。异步任务私有数据新增任务发起节点记录提交任务时保存当前NODE_NAME轮询结算时复用该节点名写入消费数据。quota_data用量聚合新增分组、令牌、渠道和节点维度便于后续按更细粒度做数据导出、审计和多节点归因。新增 Responses → Chat Completions 请求转换能力支持instructions、字符串 / 数组input、多模态 content parts、function call、function call output、tools、tool_choice 和text.format。保留可选参数显式零值例如temperature: 0、parallel_tool_calls: false和max_output_tokens。text.format.json_schema会转换为 Chat Completionsresponse_format.json_schema并移除 Responses 外层type字段。新增 Chat Completions → Responses 响应转换能力支持普通文本、reasoning summary、function call、usage 和length/content_filter不完整结束状态。流式 Chat Completions 可回转为 Responses SSE 事件包括response.created、文本增量、reasoning summary、function call arguments 和最终完成事件。Gemini 通道新增 Responses 模式处理非流式/v1/responses返回 OpenAI Responses 结构。流式/v1/responses返回 Responses SSE 事件。上游缺少 usage 时会按输出内容估算 usage并写入最终response.completed事件。Advanced Custom 新增openai_responses_to_openai_chat_completions转换器入站路径支持/v1/responses。上游可配置到 OpenAI Chat Completions 兼容路径。前端高级自定义配置补齐转换器选项、路径提示和校验。Responses → Chat 标准转换会拒绝custom_tool_call和非 function tool避免把不符合 Chat Completions 协议的type: custom请求发给标准 Chat 上游。前端新增安全富文本渲染能力新增 HTML 内容组件和共享 sanitizer。Markdown 渲染统一走可审计的安全处理。iframe 类型内容仅允许安全来源和安全嵌入路径。通知系统新增前端状态工具和存储测试支持更可靠的通知去重、状态恢复和本地已读记录维护。Playground 新增聊天历史清空入口用户可以在不刷新页面的情况下快速重置当前对话。用量日志前端筛选新增重试子类型支持列表筛选可匹配retry_log与empty_retry两类标记。Improvements豆包 Seedance 2.0 价格表从旧的固定视频输入折扣升级为按(模型, 分辨率, 是否视频输入)计算相对倍率。管理员仍只需把 Seedance 2.0ModelRatio配置为基础档无视频输入单价系统会按实际请求自动追加OtherRatio。Seedance 2.0 计费逻辑同时读取通用任务metadata和官方 protocol 原始请求避免请求转换链路与计费链路使用不同字段来源。Seedance 2.0 计费逻辑会额外检查客户端原始请求中的顶层video_url/video避免官方媒体请求的视频输入被漏算。DoubaoVideo 请求构建会先合并官方顶层 Seedance 字段再应用metadata保留历史metadata覆盖优先级。使用通用任务协议并开启渠道请求体透传时后端只要求model必填promptless image-driven 请求不会再被基础任务校验提前拒绝。通用任务上下文会从客户端原始 JSON 同步ratio、generate_audio、priority、seed等官方字段让透传、字段映射和计费读取同一份最终上下文。generate_audio在任务上下文中使用独立字段保存with_audio只作为兼容回退减少同一个官方字段被重复映射造成的歧义。DoubaoVideo 转发官方顶层可选字符串时改为按字段是否存在判断显式空callback_url、service_tier、safety_identifier和ratio不会被误当作未传字段丢弃。视频输入检测补充兼容metadata.video_url、metadata.video和metadata.content[].video_url等结构。视频输入计费检测会校验实际值是否可用空字符串、null、false和空video_url.url不再触发视频输入倍率。通用任务 URL 拼接会识别并去除与base_url重复的 path 前缀减少/v1/v1/...这类配置错误。通用任务请求会先生成最终提交体再进入计费估算、预扣费和上游发送Doubao、Gemini / Vertex、Ali 和 Kling 计费路径会优先参考最终提交体中的计费字段。视频任务最终请求上下文会从最终 JSON 提交体回填duration_seconds、with_audio、generate_audio、input、parameters、images和reference_images等常见字段保证字段映射后仍能被计费估算读取。通用参数化计费会优先读取最终上游 JSON 请求体再回退到标准化任务请求和metadata渠道字段映射、模型映射和参数覆盖后的计费输入与实际上游请求保持一致。通用参数化计费不会强制所有任务渠道实现新接口没有配置 rate card 或没有命中价格行的模型会继续走原有计费路径降低对既有视频渠道的兼容影响。Ali / Kling 动态任务计费会优先解析最终上游 payloadGemini / Vertex 会优先读取最终parameters.durationSeconds与parameters.resolution降低通用协议字段映射后的计费偏差。任务路径的Param Override错误会保留本地错误语义跳过自动重试和渠道健康处罚header override 配置错误同样不会被误当作上游失败。通用任务响应解析在拿到结果 URL 时会优先视为成功兼容上游状态字段仍停留在in_progress但结果已生成的任务。异步任务后台轮询和超时扫描改为按任务状态判断未完成任务不再因为非终态任务的进度被写成100%就跳过后续处理。普通消费日志的数据导出也会记录分组、令牌、渠道和当前节点和异步任务消费日志保持一致的数据结构。旧的用户级用量查询继续按用户、模型和小时聚合返回内部新增维度不会改变现有用户查询的总量语义。Responses 兼容层增强消息回放逻辑手动 replayresponse.output时会跳过reasoning、computer_call、web_search_call、file_search_call、item_reference等非 Chat message 形态条目避免注入空用户消息。Responses → Chat 转换补齐 reasoning、工具调用、工具结果和多模态输入的映射并对不支持的 stateful 字段提前返回明确错误。Chat → Responses 转换补齐 officialincomplete_details.reason字段避免继续输出非官方字段名。Responses ↔ Chat usage 转换保留更完整的 token detail 信息包括 cached creation、文本、音频、图片和 reasoning token 细分减少兼容层造成的用量明细丢失。Responses → Chat 流式转换复用同一套 usage 明细映射逻辑流式和非流式的 cached creation、text、audio、image、reasoning token 细分保持一致。OpenAI Chat → Responses 流式转换减少每个 SSE chunk 的重复 JSON 解析仅在检测到错误字段时进入错误响应解析。Responses → Chat 转换会校验function_call/function_call_output的调用 ID缺少call_id/id时提前返回错误避免转发空tool_call_id到上游。Gemini Responses 工具转换对不支持的非 function tool 改为显式报错不再静默丢弃搜索、代码执行、文件搜索等 managed tool 配置。Gemini Responses 流式处理与 OpenAI Chat → Responses 流式处理保持一致最终事件包含 usage 兜底估算并在开启响应审计时写入审计内容。Gemini Responses 转换会过滤 Gemini 不兼容的 custom / freeform Responses 工具和 custom tool call 输入输出降低转换后被 Gemini 上游拒绝的概率。Chat Completions 响应转换为 Claude / Gemini 格式时若同一 assistant 消息同时包含文本和tool_calls文本和工具调用都会保留。Claude Chat → Claude Messages 工具调用转换更稳健arguments为空时发送{}arguments不是合法 JSON object 时返回明确错误。Claude 响应格式转换更符合 Anthropic 协议无法解析为 JSON object 的 tool callarguments会包装到input.arguments确保tool_use.input始终是 object。Claude / Gemini 响应转换复用统一的 tool call 参数解析逻辑并统一使用项目 JSON wrapper减少不同通道之间的异常参数处理差异。豆包 legacy task protocol 的计费分辨率现在复用实际上游请求 payload避免顶层请求字段和metadata转发字段不一致时出现计费 / 请求分歧。豆包 legacy task protocol 的可选resolution/ratio改为指针字段显式空字符串会被保留未传字段仍会省略符合上游请求 DTO 的零值语义。豆包 Seedance 2.0 fast 模型补齐高分辨率视频输入价格组合1080p / 4k 搭配视频输入时也会应用 fast 模型的视频输入倍率。用量日志 retry 标记补齐独立索引字段和读前 backfill 机制旧日志会在首次 retry 筛选查询前完成标记回填减少升级窗口期筛选不准的问题。用量统计中的 RPM / TPM 查询继续只统计最近 60 秒但不再叠加页面选择的历史起止时间历史窗口下也能显示当前实时速率。消费日志创建时的 retry 标记同步只保留一次 GORM hook减少写入日志时重复解析OtherJSON 的开销。富文本渲染失败时采用更保守的失败关闭策略避免 sanitizer 异常导致未清洗内容直接展示。登录、注册、关于页、首页和法律文档等页面的 Markdown / HTML 显示逻辑收敛到共享渲染工具减少不同页面对同一内容的展示差异。通知弹窗去重改为当前页面生命周期内的内存状态避免同一批通知在短时间内重复打扰用户。Playground 输入框对连续无空格长文本启用容器内换行并限制模型 / 分组选择器宽度避免长内容或长模型名影响底部操作区布局。Playground 底部工具栏允许在窄屏下收缩和换行发送 / 停止按钮保持固定可见不会被输入内容或配置控件挤出可视区域。Bug Fixes修复doubao-seedance-2-0-260128顶层resolution: 1080p请求被按基础档计费的问题。修复 1080p 无视频输入请求可能从应有的51/46倍率被错误计为1.0的问题。修复 1080p / 4k 搭配视频输入时仍按旧固定视频折扣计费的问题。修复priority: 0这类显式零值可选参数在请求转换时可能无法可靠表达的问题。修复多节点部署下异步任务由非提交节点轮询完成时消费日志和用量导出被归属到轮询节点的问题。修复任务消费日志此前未写入quota_data导出维度导致任务结算数据与普通消费日志在用量看板链路中不一致的问题。修复quota_data缓存聚合 key 过粗可能把不同分组、令牌、渠道或节点的同小时同用户同模型数据合并到同一条记录的问题。修复空video_url、null/falsevideo或空video_url.url仅因字段存在就触发 Seedance 2.0 视频输入折扣的问题。修复官方媒体请求将视频输入放在顶层video_url时Seedance 2.0 计费没有应用视频输入价格的问题。修复 DoubaoVideo 通道丢弃火山 Seedance 官方顶层参数导致ratio/generate_audio: false未生效、视频可能按默认比例生成并带音频的问题。修复 DoubaoVideo 官方ratio带前后空白时可能原样转发的问题现在会按非空校验后的规范值发送。修复官方顶层callback_url、service_tier、safety_identifier显式传入空字符串时无法和未传字段区分导致空值覆盖无法表达的问题。修复generate_audio同时写入WithAudio和GenerateAudio造成官方字段和兼容回退字段语义混在一起的问题。修复仅使用官方content[]且无顶层prompt的 Seedance JSON 请求在 DoubaoVideo 校验阶段可能被拒绝的问题。修复通用视频任务启用渠道请求体透传时promptless 图片驱动请求被基础校验错误拒绝的问题。修复任务Param Override改写duration、resolution、size、视频输入等计费字段后预扣费仍按改写前请求计算的问题。修复 multipart 视频任务经过Param Override改写最终上游 JSON 后计费上下文可能没有同步最终请求体导致分辨率、时长、音频或模型按改写前请求计费的问题。修复任务Param Override return_error或无效规则被包装成build_request_failed500 上游错误可能触发自动重试或渠道处罚的问题。修复任务Param Override中的set_header/pass_headers等 header 联动只写入运行时状态、没有真正发送到上游的问题。修复通用任务Param Override将计费字段写入上游专用parameters、input或媒体数组后计费上下文没有同步这些最终字段的问题。修复通用参数化计费在最终请求体包含顶层image/images时又从同步后的TaskSubmitReq镜像字段重复累加image_count可能放大按图片数量匹配或计量的价格行的问题。修复任务 header override 配置错误从任务请求发送阶段返回时可能继续被包装为上游请求失败的问题。修复旧request_body_mode、request_body_mapping、request_body_defaults配置在前端保存后仍可能残留导致后端拒绝或重复提交旧协议值的问题。修复通用视频任务 submit path 与base_url同时包含/v1时可能拼出重复路径的问题。修复 Seedance 上游已经生成结果但本地任务仍停留在in_progress 100%的问题解析到结果 URL 时会转为完成。修复非终态视频任务写入progress: 100%后从后台轮询和超时扫描中消失导致任务长期卡住的问题。修复 Advanced Custom 缺少 Responses → Chat 转换器导致/v1/responses难以接入只兼容 Chat Completions 的自定义上游的问题。修复 Gemini Responses 流式上游缺少 usageMetadata 时最终response.completed事件可能没有 usage 的问题。修复 Gemini Responses 流式调用未写入响应审计内容的问题。修复 Responses 手动回放response.output时reasoning、搜索、电脑操作、文件搜索和 item reference 等非消息条目可能变成空 user 消息的问题。修复 Chat Completions 转 Responses 时不完整结束原因字段与官方 Responses 结构不一致的问题。修复 Responses → Chat 转换可能把custom_tool_call转成标准 Chat Completions 不支持的type: custom工具调用并继续转发的问题。修复 Responses → Chat 转换可能生成空tool_call_id导致 assistant tool call 和 tool result 无法正确关联的问题。修复 Responses usage 回转到 Chat usage 时会丢失 cached creation、text、audio、image 等 token detail 字段的问题。修复 Responses → Chat 流式回转仍使用旧的 inline usage 映射导致流式请求丢失 cached creation、text 和完整 completion details 的问题。修复 Gemini Responses 工具过滤静默丢弃非 function 工具导致调用方难以发现上游能力未被支持的问题。修复 Claude / Gemini 输出格式在 assistant 消息同时包含文本和tool_calls时仅保留工具调用、丢失文本说明的问题。修复 Claudetool_use在 OpenAI tool callarguments为空时被跳过的问题无效 JSON 参数现在会返回错误避免静默发送空input。修复 Claude 响应转换中 malformed tool callargumentsfallback 可能把tool_use.input输出为裸字符串、不符合 Anthropic object 要求的问题。修复 Gemini malformed tool callarguments缺少对齐测试覆盖的问题Claude / Gemini fallback 行为现在都有回归测试保护。修复豆包 legacy task protocol 中实际上游请求使用metadata.resolution但计费仍可能读取顶层resolution导致请求按 720p 转发却按 1080p 计费的问题。修复豆包 legacy task protocol 中显式传入空resolution/ratio时无法和未传字段区分的问题。修复doubao-seedance-2-0-fast-260128在 1080p / 4k 搭配视频输入时缺少价格组合可能没有应用视频输入倍率的问题。修复 retry 日志中同时带有retry_log和empty_retry标记时只被归类为空输出重试导致错误重试筛选和统计少算的问题。修复前端用量日志 retry 筛选只看合并标记、无法区分错误重试和空输出重试的问题。修复用量统计在查询历史时间窗口时RPM / TPM 因同时套用历史范围和最近 60 秒范围而显示为 0 的问题。修复日志写入时BeforeCreate与BeforeSave同时同步 retry 标记导致OtherJSON 每次创建被重复解析的问题。修复 Markdown / HTML 渲染链路中部分页面缺少统一清洗逻辑公告或配置内容在不同入口显示安全性不一致的问题。修复通知重复展示和已读状态恢复不稳定的问题减少刷新或重新打开页面后的重复提醒。修复 Playground 查询失败或选项列表为空时模型 / 分组选择器可能保留不可用旧值的问题。修复 Playground 输入连续超长文本时输入框宽度可能无限变宽并把配置、发送按钮顶到屏幕外的问题。清理jsonwrapcheck过期 allowlist 条目避免移除直接encoding/json调用后 CI 仍因 stale baseline 失败。Compatibility Notestasks.private_data新增node_nameJSON 字段历史任务没有该字段时会回退使用当前处理节点保持兼容。quota_data表新增use_group、token_id、channel_id、node_name字段升级后会随迁移自动补齐。现有用户维度用量查询会继续返回聚合后的总量新增维度主要影响数据导出、内部归因和后续更细粒度分析。多节点部署建议显式配置稳定的NODE_NAME这样异步任务日志和用量数据可以稳定归属到提交任务的实例。Seedance 2.0 的基础计费配置仍以无视频输入基础档为准1080p、4k 和视频输入组合由系统根据请求内容自动计算倍率。Seedance 2.0 fast 模型高分辨率请求仍不额外叠加分辨率倍率但 1080p / 4k 搭配视频输入时会应用 fast 模型的视频输入倍率上游不支持的参数仍由上游校验。旧渠道重新保存时前端会清理已废弃的request_body_mode/ mapping / defaults 字段只保留路径覆盖的渠道会继续作为路径覆盖配置保存。task_protocol_config不再包含请求体生成 DSL需要原样透传请求体时使用渠道Pass Through Body需要字段映射或默认值时使用Param Override。任务Param Override现在会影响最终计费输入如果旧配置曾通过默认值或字段改写改变时长、分辨率、尺寸或输入媒体升级后预扣费会与实际上游请求保持一致。如果任务Param Override把字段改写到上游专用的parameters/input/ 媒体数组结构升级后这些字段也会进入计费推断建议检查旧规则是否依赖改写前的低价默认值。新增通用任务 rate card 后管理员可为任意视频模型配置参数化计费未配置任务 rate card 的模型仍保持旧的模型价格 / 倍率计费行为。使用image_count作为匹配条件或数量字段时顶层image/images只会按最终请求体计一次reference_images仍作为独立参考图输入计入。任务 header override 会在适配器默认请求头之后应用配置中的运行时 header 可覆盖默认上游请求头请确认set_header/pass_headers规则不会意外覆盖认证或内容类型。Seedance 响应形态仍通过通用结果解析和豆包响应形态兜底兼容但旧协议值本身不会再启用专用请求体构建路径。Responses → Chat 兼容模式不支持需要服务端状态管理的 Responses 字段请求包含conversation、previous_response_id、prompt或context_management时会返回明确错误。Responses → Chat 兼容模式面向标准 Chat Completions 上游不支持custom_tool_call、custom tool 或 freeform toolGemini 通道会在自身兼容路径中过滤这类不兼容工具。Gemini Responses 兼容路径以 Chat Completions 中间形态转换为基础Gemini 不支持的 custom / freeform 输入项会被过滤非 function tool 会返回明确错误不再静默丢弃。Advanced Custom 的openai_responses_to_openai_chat_completions转换器只匹配/v1/responses入站路径其它路径仍按各自注册的转换器校验。Responses 兼容层会保留可选参数显式零值语义避免客户端明确传入的0或false在转发时丢失。Responses → Chat replay 要求function_call带有call_id或idfunction_call_output带有call_id缺失时会返回错误调用方需要补齐有效 tool call 关联 ID。Claude 工具调用参数为空字符串时会继续按空 object 兼容参数存在但不是合法 JSON object 时会失败返回不再静默改写为{}。Claude 响应转换遇到 malformed tool callarguments时会把原始字符串保存在tool_use.input.arguments不再把裸字符串直接作为input。豆包 legacy task protocol 中resolution/ratio作为可选字段处理显式空字符串会继续发送给上游未提供字段才会省略。DoubaoVideo 官方顶层callback_url、service_tier、safety_identifier和ratio也按可选字段处理显式空字符串会保留未传字段才会省略。DoubaoVideo 的 Seedance 官方参数合并不会改变既有metadata覆盖优先级已有通过metadata改写上游参数的渠道配置会继续优先生效。multipart 任务请求仍走原有基础校验路径本次官方content[]和顶层参数支持主要影响 JSON 请求体。前端富文本内容现在统一经过 sanitizer依赖自定义 HTML 的部署需要确认内容符合允许的标签、属性和 iframe 来源规则。Playground 输入区布局修复仅影响前端展示和响应式布局不改变聊天请求体、模型 / 分组选择逻辑或后端计费语义。.tmp/RELEASE_NOTES_v1.0.4.md为内部发布草稿不会进入 Git 提交发布前如需公开版本应复制到正式发布流程中重新审阅。Verificationgo test ./relay/channel/task/doubaogo test ./relay/channel/task/taskcommon ./relay/channel/task/doubao ./relay/channelgo test ./relay/channel/task/taskcommon ./relay/channel/task/doubao ./relay/channel/openai ./model ./servicego test ./model ./servicego test ./model -run TestGetAllUnFinishSyncTasksIncludesNonTerminalHundredProgress|TestGetTimedOutUnfinishedTasksIncludesNonTerminalHundredProgress -count1go test ./service -run TestShouldApplyTaskResultProgressSkipsNonTerminalCompleteProgress -count1go test ./service ./service/openaicompatgo test ./service/openaicompat ./relay/channel/claude ./relay/channel/gemini ./relay/channel/advancedcustom ./relay/channel/openaigo test ./service/openaicompat ./relay/channel/gemini ./relay/channel/advancedcustomgo test ./service/openaicompat -run TestResponsesResponseToChatCompletionsResponse|TestResponsesRequestToChatCompletionsRequestgo test ./service -run TestResponseOpenAI2(Gemini|Claude)go test ./model -run Test(SumUsedQuotaRetryFilter|GetAllLogsRetrySubtypeFilters|SumUsedQuotaRetrySubtypeFilters|RetryFilterIgnoresNestedRetryMarker|RetryFilterBackfillsLegacyMarkersBeforeCompletion|RetryFilterUsesIsRetryAfterBackfillCompletion)$go test ./model -run TestSumUsedQuotaKeepsRpmTpmLiveForHistoricalWindowgo run ./tools/jsonwrapcheckbun test src/components/html-content.test.ts src/components/ui/markdown.test.ts src/lib/renderable-content.test.ts src/hooks/notification-utils.test.ts src/stores/notification-store.test.ts src/features/usage-logs/lib/utils.test.ts src/features/playground/lib/query-state.test.ts src/features/playground/lib/selection-state.test.tsbun test tests/channel-form.test.tsbun run typecheckbun run buildHeadless Chrome layout check for/playground/with a 4000-character continuous prompt at 390px and 1280px viewport widthsgo test ./service -run TestRecalculate_PositiveDeltaAttributesQuotaDataToSubmitNodego test ./relay ./relay/channel ./relay/channel/task/taskcommon ./relay/channel/task/doubao ./relay/channel/task/gemini ./relay/channel/task/vertex ./relay/channel/task/ali ./relay/channel/task/kling ./controller -run Test(PrepareTaskSubmitRequestBody|DoTaskApiRequestAppliesRuntimeHeaderOverride|ApplyTaskParamOverride|BuildConfiguredTask|EstimateBilling|EstimateTaskBilling|ShouldRetry) -count1go test ./controller ./relay ./relay/channel ./relay/channel/task/taskcommon ./relay/channel/task/doubao ./relay/channel/task/ali ./relay/channel/task/gemini ./relay/channel/task/kling ./relay/channel/task/vertex ./relay/common ./servicego test ./relay/channel/task/doubao ./relay/channel/task/taskcommon ./relay/channel ./relay -count1go test ./relay/channel/task/taskcommon -run TestEstimateGenericTaskBilling -count1go test ./relay -run TestPrepareTaskSubmitRequestBody|TestEstimateTaskBilling -count1go test ./relay/channel/task/taskcommon ./relay/channel/task/doubao ./relay/channel/task/kling ./relay/channel/task/ali -count1go test ./relay/channel ./relay -count1bunx eslint src\features\channels\types.ts src\features\channels\lib\advanced-custom.tsgit diff --check -- relay/common/relay_info.go relay/channel/task/doubao/adaptor.go relay/channel/task/doubao/adaptor_billing_test.go relay/channel/task/taskcommon/request_body.go relay/channel/task/taskcommon/path_config_test.gogit diff --checkFull Changelog: https://github.com/MAX-API-Next/MAX-API/compare/v1.0.3-preview.2…v1.0.4-preview.1