@aswless_854771076/ai_short_studio_cli 0.1.103 → 0.1.104

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (22) hide show
  1. package/README.md +5 -5
  2. package/dist/commands/auth/login.js +2 -2
  3. package/dist/commands/project/create.d.ts +1 -0
  4. package/dist/commands/project/create.js +18 -2
  5. package/dist/domain/vvicat-api.d.ts +1 -0
  6. package/dist/domain/vvicat-api.js +18 -1
  7. package/dist/runtime.js +2 -1
  8. package/package.json +1 -1
  9. package/skills/using-vvicat-ai-short-studio-cli/SKILL.md +13 -10
  10. package/skills/using-vvicat-ai-short-studio-cli/references/assets-and-storyboard.md +4 -4
  11. package/skills/using-vvicat-ai-short-studio-cli/references/commands/canvas.md +19 -0
  12. package/skills/using-vvicat-ai-short-studio-cli/references/commands/project.md +1 -2
  13. package/skills/using-vvicat-ai-short-studio-cli/references/hypit/SKILL.md +1 -1
  14. package/skills/using-vvicat-ai-short-studio-cli/references/hypit/creation/reference-video.md +1 -1
  15. package/skills/using-vvicat-ai-short-studio-cli/references/hypit/environment/local-tools.md +1 -1
  16. package/skills/using-vvicat-ai-short-studio-cli/references/hypit/playbooks/craft/recreation-policy.md +1 -1
  17. package/skills/using-vvicat-ai-short-studio-cli/references/project-and-canvas.md +8 -2
  18. package/skills/using-vvicat-ai-short-studio-cli/references/short-drama/generation/configure-generation-providers.md +3 -1
  19. package/skills/using-vvicat-ai-short-studio-cli/references/short-drama/generation/design-drama-audio.md +2 -0
  20. package/skills/using-vvicat-ai-short-studio-cli/references/short-drama/generation/drama-generation-service.md +1 -1
  21. package/skills/using-vvicat-ai-short-studio-cli/references/short-drama/review/review-drama-shots.md +1 -1
  22. package/skills/using-vvicat-ai-short-studio-cli/references/short-drama/starrouter-provider.md +2 -2
package/README.md CHANGED
@@ -6,8 +6,8 @@ VVICAT 新链路无限画布的官方命令行客户端。要求 Node.js 22 或
6
6
  npm view @aswless_854771076/ai_short_studio_cli dist-tags.latest
7
7
  npm install --global @aswless_854771076/ai_short_studio_cli@latest
8
8
  ai-short-studio --version
9
- ai-short-studio auth login --google
10
- ai-short-studio auth login --memhub
9
+ ai-short-studio auth login
10
+ ai-short-studio auth login --provider supabase
11
11
  ai-short-studio project list --json
12
12
  ai-short-studio canvas node types --json
13
13
  ```
@@ -19,8 +19,8 @@ npm 包只内置一个 `using-vvicat-ai-short-studio-cli` Agent Skill。hypit、
19
19
  生产环境登录使用 MemHub 浏览器授权;兼容 Supabase 的邮箱注册和登录从 stdin 读取密码:
20
20
 
21
21
  ```bash
22
- ai-short-studio auth signup --email user@example.com --password-stdin
23
- ai-short-studio auth login --email user@example.com --password-stdin
22
+ ai-short-studio auth signup --provider supabase --email user@example.com --password-stdin
23
+ ai-short-studio auth login --provider supabase --email user@example.com --password-stdin
24
24
  ```
25
25
 
26
26
  Agent 代操作时,用户已在当前会话明确提供的密码只能直接写入正在等待的隐藏密码提示,不得复述、拼入 shell 命令、落盘或跨会话保存。
@@ -135,7 +135,7 @@ CLI 通过 `/api/v1/bootstrap` 完成版本、连通性与 Supabase 公共配置
135
135
 
136
136
  `canvas settings set` 支持项目级 `imageResolution`、`imageQuality`、`videoResolution`,未覆盖的图片、图片编辑和视频节点会继承这些默认值。候选值来自 `settings get` 对应字段的实时 `options`;节点仅在需要偏离项目默认时,按当前模型 `capabilities` 写入 `resolution`、`quality` 覆盖。
137
137
 
138
- 项目输出语言通过 `ai-short-studio canvas settings set --project <PROJECT_ID> --field outputLanguage --value pt-BR` 设置,接受任意规范 BCP 47 标签;用 `null` 恢复自动跟随输入。语言变化只把相关下游节点标为 stale,不删除历史资产或自动生成。交付时只下载每镜 selected 原始 MP4,按 `S001.mp4` 顺序命名,并用 manifest 记录镜号、节点、资产、版本和文件名;字幕单独交付,不烧录进原始视频。
138
+ 项目交付语言在创建时用 `ai-short-studio project create --language pt-BR` 固定,接受任意规范 BCP 47 标签;剧本、拆镜、台词、配音、画面文字和字幕都沿用该值。`canvas settings get` 只回读项目语言,画布设置接口不能清空或修改它。交付时只下载每镜 selected 原始 MP4,按 `S001.mp4` 顺序命名,并用 manifest 记录镜号、节点、资产、版本和文件名;字幕单独交付,不烧录进原始视频。
139
139
 
140
140
  百炼 CosyVoice 的 `tts` 节点通过实时 schema 提供音色、语言、格式、采样率、音量、语速、音调和声音指令。先用 `canvas settings get` 确认最终 `audioModel`,再从 `canvas node types` 返回的 `tts.configSchema` 选择字段和值;CLI 会在写入前校验必填字段、类型、整数、枚举和数值上下限。
141
141
 
@@ -4,7 +4,7 @@ import { createRuntime } from '../../runtime.js';
4
4
  import { promptLine, promptPassword, readStdinText } from '../../terminal/prompt.js';
5
5
  import { loginWithMemHubPkce } from '../../auth/memhub-oauth.js';
6
6
  export default class AuthLogin extends BaseCommand {
7
- static description = '通过 Supabase 或 MemHub 登录,并将长期凭据保存到系统钥匙串';
7
+ static description = '通过 MemHub 或 Supabase 登录,并将长期凭据保存到系统钥匙串';
8
8
  static flags = {
9
9
  ...BaseCommand.baseFlags,
10
10
  email: Flags.string({ description: '登录邮箱' }),
@@ -12,7 +12,7 @@ export default class AuthLogin extends BaseCommand {
12
12
  provider: Flags.string({
13
13
  description: '登录提供方',
14
14
  options: ['supabase', 'memhub'],
15
- default: 'supabase',
15
+ default: 'memhub',
16
16
  }),
17
17
  'password-stdin': Flags.boolean({ description: '从标准输入读取密码', default: false }),
18
18
  'supabase-publishable-key': Flags.string({ description: 'Supabase publishable key', env: 'VVICAT_SUPABASE_PUBLISHABLE_KEY' }),
@@ -3,6 +3,7 @@ export default class ProjectCreate extends BaseCommand {
3
3
  static flags: {
4
4
  name: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
5
5
  description: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
6
+ language: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
6
7
  'base-url': import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
7
8
  json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
8
9
  locale: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
@@ -2,6 +2,22 @@ import { Flags } from '@oclif/core';
2
2
  import { BaseCommand } from '../../base-command.js';
3
3
  import { commandApi } from '../../command-helpers.js';
4
4
  export default class ProjectCreate extends BaseCommand {
5
- static flags = { ...BaseCommand.baseFlags, name: Flags.string({ required: true }), description: Flags.string() };
6
- async run() { const { flags } = await this.parse(ProjectCreate); const { api } = await commandApi(flags); this.print(await api.createProject({ name: flags.name, description: flags.description })); }
5
+ static flags = {
6
+ ...BaseCommand.baseFlags,
7
+ name: Flags.string({ required: true }),
8
+ description: Flags.string(),
9
+ language: Flags.string({
10
+ required: true,
11
+ description: '项目交付语言(BCP 47,如 zh、en、ja、pt-BR)',
12
+ }),
13
+ };
14
+ async run() {
15
+ const { flags } = await this.parse(ProjectCreate);
16
+ const { api } = await commandApi(flags);
17
+ this.print(await api.createProject({
18
+ name: flags.name,
19
+ description: flags.description,
20
+ outputLanguage: flags.language,
21
+ }));
22
+ }
7
23
  }
@@ -53,6 +53,7 @@ export declare class VvicatApi {
53
53
  createProject(input: {
54
54
  name: string;
55
55
  description?: string | null;
56
+ outputLanguage: string;
56
57
  }): Promise<JsonObject>;
57
58
  project(projectId: string): Promise<JsonObject>;
58
59
  updateProject(projectId: string, input: {
@@ -1,5 +1,18 @@
1
1
  import { randomUUID } from 'node:crypto';
2
2
  const ASSET_BOUND_NODE_KINDS = new Set(['image', 'video', 'audio']);
3
+ function normalizeRequiredOutputLanguage(value) {
4
+ if (!value.trim())
5
+ throw new Error('创建项目时必须通过 --language 指定交付语言');
6
+ try {
7
+ const language = Intl.getCanonicalLocales(value.trim())[0];
8
+ if (language)
9
+ return language;
10
+ }
11
+ catch {
12
+ // 统一转成下面稳定的 CLI 错误信息。
13
+ }
14
+ throw new Error('项目交付语言必须是有效的 BCP 47 语言标签');
15
+ }
3
16
  function validateConfigSchema(nodeType, config, requiredValues = config ?? {}) {
4
17
  const values = config ?? {};
5
18
  if (nodeType.kind === 'storyboard-breakdown' && requiredValues.storyboardPipelineVersion === 2) {
@@ -71,6 +84,7 @@ export class VvicatApi {
71
84
  return payload.projects.filter((project) => project.type === 'INFINITE_CANVAS');
72
85
  }
73
86
  async createProject(input) {
87
+ const outputLanguage = normalizeRequiredOutputLanguage(input.outputLanguage);
74
88
  const config = await this.config();
75
89
  const defaultModels = config.defaultModels;
76
90
  const analysisModel = defaultModels && typeof defaultModels === 'object' && !Array.isArray(defaultModels)
@@ -79,7 +93,10 @@ export class VvicatApi {
79
93
  if (typeof analysisModel !== 'string' || !analysisModel.trim()) {
80
94
  throw new Error('创建项目前请先配置默认分析模型');
81
95
  }
82
- return this.client.request('/api/projects', { method: 'POST', body: { ...input, type: 'INFINITE_CANVAS' } });
96
+ return this.client.request('/api/projects', {
97
+ method: 'POST',
98
+ body: { ...input, outputLanguage, type: 'INFINITE_CANVAS' },
99
+ });
83
100
  }
84
101
  project(projectId) {
85
102
  return this.client.request(`/api/projects/${projectId}`);
package/dist/runtime.js CHANGED
@@ -18,7 +18,8 @@ export async function createRuntime(flags) {
18
18
  ...selected,
19
19
  name: flags.profile || selected?.name || 'default',
20
20
  baseUrl,
21
- authProvider: flags['auth-provider'] || selected?.authProvider || 'supabase',
21
+ // CLI 默认使用 MemHub 浏览器授权;已保存 profile 和显式参数仍可覆盖默认值。
22
+ authProvider: flags['auth-provider'] || selected?.authProvider || 'memhub',
22
23
  }, flags);
23
24
  if (profile.authProvider === 'supabase' && (!profile.supabaseUrl || !profile.supabasePublishableKey)) {
24
25
  const bootstrap = await fetchBootstrap(baseUrl);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aswless_854771076/ai_short_studio_cli",
3
- "version": "0.1.103",
3
+ "version": "0.1.104",
4
4
  "description": "VVICAT 无限画布项目命令行工具",
5
5
  "license": "MIT",
6
6
  "private": false,
@@ -32,8 +32,9 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
32
32
  | 导演手册、摄影、表演、分镜和镜头变体 | `references/short-drama/creation/write-drama-director-book.md`、`references/short-drama/storyboard/build-drama-storyboard.md`、`references/short-drama/director-composition.md` | `drama-director-book → storyboard-breakdown → storyboard-image/storyboard-board-image`;读取构图受控词表,证据不足时降级构图,不补陈设或天气 |
33
33
  | 逐镜制作、跨镜连续性、previous-tail | `references/short-drama/storyboard/plan-drama-production.md`、`references/short-drama/storyboard/plan-shot-continuity.md` | 先生成 `drama-production-plan`,再生成 `drama-continuity-plan`;只有前镜已审核且选版时允许 previous-tail |
34
34
  | 视频提示词、H3、Seedance、原生音频 | `references/short-drama/generation/write-drama-video-prompts.md`、`references/h3-video-delivery.md`、`references/short-drama/generation/design-drama-audio.md` | 按实时 Provider schema 选择协议;每镜完成画面、声音、字幕和转场审计后才提交生成 |
35
+ | 背景音乐、主题曲、纯音乐 | `references/short-drama/generation/design-drama-audio.md`、`references/short-drama/starrouter-provider.md` | 使用画布 `music-generate` 和实时音频模型目录;有自定义歌词时不得同时开启纯音乐;生成后试听并回读 AUDIO 资产版本 |
35
36
  | 去字幕、参考视频复刻、深度视频 | `references/hypit/playbooks/formats/reference-recreation-canvas.md`、`references/short-drama/generation/transform-drama-media.md` | 使用 `recreation-subtitle-remove → recreation-depth-preprocess/depth-video → video-generate`;不得把参考板或字幕带入成片 |
36
- | 参考对白转写、剪辑、字幕和多图模板 | `references/hypit/SKILL.md`、`references/hypit/environment/local-tools.md`、`references/short-drama/editing-workflow.md` | WAV 音频使用 `recreation-transcribe`(StarRouter `qwen3-asr-flash`);剪辑和字幕进入现有编辑器/Remotion 时间线;多图合板使用 `grid` 或分镜宫格节点 |
37
+ | 参考对白转写、剪辑、字幕和多图模板 | `references/hypit/SKILL.md`、`references/hypit/environment/local-tools.md`、`references/short-drama/editing-workflow.md` | WAV 音频使用 `recreation-transcribe`(默认 StarRouter `whisper-1`);剪辑和字幕进入现有编辑器/Remotion 时间线;多图合板使用 `grid` 或分镜宫格节点 |
37
38
  | 逐镜审计、剪辑、字幕、声音平衡、成片交付 | `references/short-drama/review/review-drama-shots.md`、`references/short-drama/editing/edit-drama-timeline.md`、`references/short-drama/editing/edit-deliver-drama.md` | `drama-shot-review → drama-edit-plan → drama-delivery-review`;未通过的镜头、无 provenance 或未完整观看不得交付 |
38
39
 
39
40
  网站无限画布上的短剧节点按同一顺序连接:
@@ -53,20 +54,22 @@ description: Use when an agent needs to inspect or operate VVICAT infinite-canva
53
54
  ## 主流程
54
55
 
55
56
  1. **预检**:运行 `preflight --json`;更新后重跑。再读取 `config get`、实时 `canvas node types` 和目标项目。`skill status --target codex` 非 current 时先询问再更新,禁止强制覆盖用户修改。
56
- 2. **项目配置门禁**:读取 `canvas settings get`,展示 `currentValue`、`effectiveValue`、`source`、建议值和实时 options。确认 `aspectRatio`、`artStyle`、`visualBible`、`storyboardImageType`、`outputLanguage`、`analysisModel`、`imageModel`、`imageResolution`、`imageQuality` 和 `videoResolution`,以及 `editModel`、`videoModel`、`videoPromptType`、`audioModel`;`$ART_STYLE_ID` 必须解析实时 `option.value`。标准创作门禁使用 `--file settings.json` 原子写入并携带 `expectedVersion`,回读一致前不得创建或运行付费节点。节点确需不同参数时才按实时能力覆盖。
57
- 3. **剧本和目标集**:已有专业剧本时直接复用,不得重复执行 `novel-to-script`。需要创作微短剧时,按需读取 `references/short-drama/`,再读取 `references/humanizer/` 去除 AI 味;不得改动已经确认的剧情事实,润色后回到短剧 reference 复核。确认目标集数后,只生产该集实际需要的资产。
58
- 4. **资产门禁**:先完成人物、场景、道具及其派生版本,展示真实预览并确认 selected version。执行资产—剧情匹配审计;缺失、多余、错版、stale、错边未清零时拆镜前门禁失败。
59
- 5. **拆镜和滚动生成**:拆镜前按 [语言匹配门禁](references/assets-and-storyboard.md#拆镜语言匹配门禁) 核对源剧本语言、交付语言、项目 `outputLanguage` 和节点 `targetLanguage`,不一致时禁止执行。把该集剧本与全部确认资产连接到 `storyboard-breakdown`,复用服务端自动创建的 `storyboard-shot` / `storyboard-image`。完成后逐镜执行语言与镜头质量审计且不抽样;P0/P1 未清零不得继续。分镜图生成前按实时 schema 确认画幅、布局、格数和费用。进入付费生成后读取 [滚动异步调度](references/async-pipeline.md):分镜图完成一镜即审计并提交该镜视频提示词,提示词完成即审计、显式写入视频配置并提交该镜视频;不得等待同阶段全部镜头完成。单镜可恢复失败只标记并重试该镜,不阻塞其他已就绪镜头。
60
- 6. **视频规划**:视频生成前依次完成素材连线、镜头逻辑和上下镜连续性审计。读取实时 `durationOptions`;只有选项恰为 5、10、15 秒时才按这三档向上取整。RunningHub MiniMax H3 支持纯文本和 0–9 张参考图、0–2 个参考视频、0–2 个参考音频,5–15 秒逐秒可选,1–4 秒归一为 5 秒;参考视频只传画面。画幅为 16:9 / 9:16,分辨率为 480p / 720p / 1K / 2K。
61
- 7. **H3 生成门禁**:`videoModel` 为 `comfly::minimax-h3` 或 `runninghub::minimax-h3-reference-to-video` 时,同次设置 `videoPromptType: "h3"`。仅有效的节点 `promptType` 可覆盖项目值;旧 `seedance` 覆盖必须清除并回读,否则不得执行视频提示词或视频生成。编写或改写 H3 提示词时读取 `references/hypit/playbooks/craft/h3-prompt-writing.md`;进入生成前必须读取 [H3 成片规则](references/h3-video-delivery.md)。
62
- 8. **逐镜后验**:每个视频镜头完成后实际看画面、听完整音轨,并完成视觉、音频、转场、字幕四项验收。任一 P0/P1 失败只修复并重跑受影响镜头;未通过不得进入成片剪辑。
63
- 9. **成片和交付**:剪辑只使用通过验收的 selected 版本,并完整执行 [剪辑与交付](references/editing-delivery.md)。默认对白/旁白字幕进入成片,人物与场景介绍仅在首次出现时显示短暂角标,同时输出独立 SRT/ASS。根据叙事动机选择硬切、动作切、J/L-cut、遮挡匹配或短淡化,不给所有镜头机械套淡入淡出。完成节奏裁切、声音平衡、画面统一、字幕和必要技术处理后,从头到尾观看成片并执行完整成片验收;未通过不得声称完成。原始视频按 `selectedOutputVersionId` 下载,字幕独立保存,`manifest` 记录镜号、节点、任务、资产、版本、时间线和文件名。
57
+ 2. **项目语言门禁**:新建项目前必须从用户确认交付语言,并用 `project create --language <BCP47>` 写入;界面 `--locale` 不能代替内容语言。创建后回读 `project get` 与 `canvas settings get`,确认两者语言一致且不可修改。项目语言约束剧本、分镜、台词、配音、画面文字和字幕;任何下游节点含有不同语言时停止执行。
58
+ 3. **项目配置门禁**:读取 `canvas settings get`,展示 `currentValue`、`effectiveValue`、`source`、建议值和实时 options。确认 `aspectRatio`、`artStyle`、`visualBible`、`storyboardImageType`、`outputLanguage`、`analysisModel`、`imageModel`、`imageResolution`、`imageQuality` 和 `videoResolution`,以及 `editModel`、`videoModel`、`videoPromptType`、`audioModel`、`musicModel`;`$ART_STYLE_ID` 必须解析实时 `option.value`。标准创作门禁使用 `--file settings.json` 原子写入并携带 `expectedVersion`,回读一致前不得创建或运行付费节点。节点确需不同参数时才按实时能力覆盖。
59
+ 4. **剧本和目标集**:已有专业剧本时直接复用,不得重复执行 `novel-to-script`。需要创作微短剧时,按需读取 `references/short-drama/`,再读取 `references/humanizer/` 去除 AI 味;不得改动已经确认的剧情事实,润色后回到短剧 reference 复核。确认目标集数后,只生产该集实际需要的资产。
60
+ 5. **资产门禁**:先完成人物、场景、道具及其派生版本,展示真实预览并确认 selected version。执行资产—剧情匹配审计;缺失、多余、错版、stale、错边未清零时拆镜前门禁失败。
61
+ 6. **拆镜和滚动生成**:拆镜前按 [语言匹配门禁](references/assets-and-storyboard.md#拆镜语言匹配门禁) 核对源剧本语言、交付语言、项目 `outputLanguage` 和节点 `targetLanguage`,不一致时禁止执行。把该集剧本与全部确认资产连接到 `storyboard-breakdown`,复用服务端自动创建的 `storyboard-shot` / `storyboard-image`。完成后逐镜执行语言与镜头质量审计且不抽样;P0/P1 未清零不得继续。分镜图生成前按实时 schema 确认画幅、布局、格数和费用。进入付费生成后读取 [滚动异步调度](references/async-pipeline.md):分镜图完成一镜即审计并提交该镜视频提示词,提示词完成即审计、显式写入视频配置并提交该镜视频;不得等待同阶段全部镜头完成。单镜可恢复失败只标记并重试该镜,不阻塞其他已就绪镜头。
62
+ 7. **视频规划**:视频生成前依次完成素材连线、镜头逻辑和上下镜连续性审计。读取实时 `durationOptions`;只有选项恰为 5、10、15 秒时才按这三档向上取整。RunningHub MiniMax H3 支持纯文本和 0–9 张参考图、0–2 个参考视频、0–2 个参考音频,5–15 秒逐秒可选,1–4 秒归一为 5 秒;参考视频只传画面。画幅为 16:9 / 9:16,分辨率为 480p / 720p / 1K / 2K。
63
+ 8. **H3 生成门禁**:`videoModel` 为 `comfly::minimax-h3` 或 `runninghub::minimax-h3-reference-to-video` 时,同次设置 `videoPromptType: "h3"`。仅有效的节点 `promptType` 可覆盖项目值;旧 `seedance` 覆盖必须清除并回读,否则不得执行视频提示词或视频生成。编写或改写 H3 提示词时读取 `references/hypit/playbooks/craft/h3-prompt-writing.md`;进入生成前必须读取 [H3 成片规则](references/h3-video-delivery.md)。
64
+ 9. **逐镜后验**:每个视频镜头完成后实际看画面、听完整音轨,并完成视觉、音频、转场、字幕四项验收。任一 P0/P1 失败只修复并重跑受影响镜头;未通过不得进入成片剪辑。
65
+ 10. **成片和交付**:剪辑只使用通过验收的 selected 版本,并完整执行 [剪辑与交付](references/editing-delivery.md)。默认对白/旁白字幕进入成片,人物与场景介绍仅在首次出现时显示短暂角标,同时输出独立 SRT/ASS。根据叙事动机选择硬切、动作切、J/L-cut、遮挡匹配或短淡化,不给所有镜头机械套淡入淡出。完成节奏裁切、声音平衡、画面统一、字幕和必要技术处理后,从头到尾观看成片并执行完整成片验收;未通过不得声称完成。原始视频按 `selectedOutputVersionId` 下载,字幕独立保存,`manifest` 记录镜号、节点、任务、资产、版本、时间线和文件名。
64
66
 
65
67
  ## 强制分流
66
68
 
67
69
  - H3 成片中的人物说话、旁白、环境音和 BGM 全部由 H3 原生生成;不得用 `voice-design`、`voice-clone`、`tts` 或其他外部 TTS 覆盖。独立音频交付才读取专项 TTS 流程。
70
+ - 独立交付的背景音乐、主题曲或纯音乐使用 `music-generate`,不要用 TTS 模型模拟。默认模型键为 `starrouter::suno_music`;运行前以 `canvas settings get` 和实时节点 schema 为准。
68
71
  - 涉及剪辑、字幕、转场、音频编排或渲染时,读取 `references/hypit/` 中对应的制作规则。
69
- - 编辑镜头用 `canvas node edit-shot`,编辑结构化资源用 `canvas node edit-resource`,均追加不可变版本。`outputLanguage` 变化只标记下游 stale;手工首尾帧使用 `video-frame-extract`。
72
+ - 编辑镜头用 `canvas node edit-shot`,编辑结构化资源用 `canvas node edit-resource`,均追加不可变版本。项目 `outputLanguage` 在创建后固定,画布只读;手工首尾帧使用 `video-frame-extract`。
70
73
 
71
74
  ## 安全与完成条件
72
75
 
@@ -12,11 +12,11 @@
12
12
 
13
13
  ## 拆镜语言匹配门禁
14
14
 
15
- 拆镜前先输出并核对一行语言契约:`源剧本语言 / 用户交付语言 / 项目 outputLanguage / 节点 targetLanguage / H3 人声语言 / 字幕语言`。专有名词、品牌、咒语或剧情要求保留的外语另列白名单;除此之外任一项不明确或冲突都禁止执行。
15
+ 拆镜前先输出并核对一行语言契约:`源剧本语言 / 用户交付语言 / 项目 outputLanguage / 节点 targetLanguage / H3 人声语言 / 字幕语言`。项目交付语言在创建时确定,创建后不可修改;专有名词、品牌、咒语或剧情要求保留的外语另列白名单,除此之外任一项不明确或冲突都禁止执行。
16
16
 
17
- - **普通拆镜**:项目 `outputLanguage` 留空时自动跟随输入的主要语言;显式交付语言使用规范 BCP 47 标签,如 `en`、`ar`、`fr`、`pt-BR`、`zh-Hant`。写入后必须回读服务端规范值。节点若残留 `targetLanguage`,先按实时 schema 清除,避免把专业模式字段误当普通模式覆盖。
18
- - **专业 Markdown 拆镜**:`targetLanguage` 使用任意规范 BCP 47 标签,源文件必须为每段对白、旁白、屏显和场景标题提供同标签的本地化块。例如巴西葡萄牙语使用 `- **PT-BR:** ...`,场景标题使用 `**PT-BR:** ...`。专业 `targetLanguage` 是内容语言事实来源;项目 `outputLanguage` 和 CLI `--locale` 都不能代替它。
19
- - **写前回读**:执行前重新读取 settings、拆镜节点原始 config 和 selected 剧本,确认语言契约仍一致;`outputLanguage` 或 `targetLanguage` 改变后,从 stale 链起点重新拆镜,不复用旧语言镜头。
17
+ - **普通拆镜**:直接使用项目创建时的规范 BCP 47 `outputLanguage`,如 `en`、`ar`、`fr`、`pt-BR`、`zh-Hant`;不能留空、自动猜测或通过 settings 修改。节点若残留 `targetLanguage`,先按实时 schema 清除,避免把专业模式字段误当普通模式覆盖。
18
+ - **专业 Markdown 拆镜**:`targetLanguage` 必须与项目 `outputLanguage` 完全一致;服务端在读取剧本和调用模型前校验,不一致时返回 `STORYBOARD_PROJECT_LANGUAGE_MISMATCH`。源文件必须为每段对白、旁白、屏显和场景标题提供同标签的本地化块,例如巴西葡萄牙语使用 `- **PT-BR:** ...`。CLI `--locale` 只控制界面消息,不能代替内容语言。
19
+ - **写前回读**:执行前重新读取 `project get`、settings、拆镜节点原始 config 和 selected 剧本,确认项目语言与 `targetLanguage` 一致;创建后若发现语言选错,必须停止当前项目并新建项目,不能修改旧项目语言或复用旧语言镜头。
20
20
 
21
21
  拆镜完成后不抽样,逐镜检查所有语言字段:场景标题、description/action、对白、旁白、表演说明、摄影计划、图像提示词和视频提示词。专业流程还必须确认没有 `STORYBOARD_LANGUAGE_MISMATCH`;普通流程没有同等级服务端校验时,由本审计补齐。白名单外出现其他语言、台词被翻译成错误目标语言、角色名被错误翻译或同一镜混入两种输出语言,均记为 P1。
22
22
 
@@ -28,6 +28,25 @@ ai-short-studio canvas node delete <nodeId> --project <projectId> --yes --json
28
28
 
29
29
  `--asset-id` 仅用于 `image`、`video`、`audio` 媒体节点,把已有资产的 selected 版本绑定为节点输出;CLI 会先按实时节点目录拒绝非媒体节点,资产类型仍由服务端校验。上传资产后先用 `canvas asset list` 或上传响应取得资产 ID,再创建媒体节点并连线。
30
30
 
31
+ 音乐节点使用 `music-generate`,输出 AUDIO。`prompt` 必填,可配置 `model`、`title`、`tags`、`lyrics` 和 `makeInstrumental`;`lyrics` 与 `makeInstrumental: true` 不能同时提交。`--config` 读取 JSON 文件,不接受内联 JSON 字符串。
32
+
33
+ ```json
34
+ {
35
+ "model": "starrouter::suno_music",
36
+ "prompt": "60 秒轻快电子氛围音乐,节奏清晰,适合片头",
37
+ "title": "片头测试",
38
+ "tags": "electronic, light, 100 bpm",
39
+ "makeInstrumental": true
40
+ }
41
+ ```
42
+
43
+ ```bash
44
+ ai-short-studio canvas node add music-generate \
45
+ --project "$PROJECT_ID" \
46
+ --config ./music-node.json \
47
+ --json
48
+ ```
49
+
31
50
  H3 批量启用原生音频的 `updates.json`:
32
51
 
33
52
  ```json
@@ -19,7 +19,7 @@ ai-short-studio auth logout
19
19
  ```bash
20
20
  ai-short-studio project list --json
21
21
  ai-short-studio project get <projectId> --json
22
- ai-short-studio project create --name <name> [--description <text>] --json
22
+ ai-short-studio project create --name <name> --language <BCP47> [--description <text>] --json
23
23
  ai-short-studio project update <projectId> [--name <name>] [--description <text>] --json
24
24
  ai-short-studio project delete <projectId> --yes --json
25
25
  ```
@@ -38,7 +38,6 @@ ai-short-studio canvas settings set --project "$PROJECT_ID" --file settings.json
38
38
  {
39
39
  "expectedVersion": 3,
40
40
  "values": {
41
- "outputLanguage": "zh",
42
41
  "aspectRatio": "9:16",
43
42
  "imageResolution": "2K",
44
43
  "imageQuality": "high",
@@ -22,7 +22,7 @@ description: Direct and produce videos with Hypit, primarily through generated m
22
22
  每项付费生成仍须先展示厂商、模型、参数和请求数并取得用户确认;最终提示词和成片 Run 要等
23
23
  相关镜头的资产与深度结果均审核选定后再定稿。
24
24
  若需免下载模型的参考对白转写,可在 `shots` 后逐镜使用 `hypit recreate transcribe` 的
25
- StarRouter `qwen3-asr-flash`。先看计划,再按用户确认执行 `--approve`、`--confirmed`;
25
+ StarRouter `whisper-1`。先看计划,再按用户确认执行 `--approve`、`--confirmed`;
26
26
  其结果只有待审核文本,没有逐词时间戳,不能冒充已对齐字幕。
27
27
  最终计划前,在 `<project>/.hypit/recreation/required-assets.json` 逐镜登记并审阅所需人物、
28
28
  场景和道具的稳定资产键;格式为
@@ -82,7 +82,7 @@ open. Preserve those questions at their source times so the next view can sharpe
82
82
  ## Make time visible
83
83
 
84
84
  For native reference recreation, review the shot cuts first, then use `hypit recreate transcribe`
85
- per shot when speech needs transcription. Its StarRouter `qwen3-asr-flash` result is text pending human
85
+ per shot when speech needs transcription. Its StarRouter `whisper-1` result is text pending human
86
86
  review, without word-level timestamps. Inspect the speech against its shot and confirm the speaker and
87
87
  language. When the work needs word-aligned timing, select `hypit transcribe` with an alignment service
88
88
  such as WhisperX separately; local WhisperX may require model preparation. Keep either transcript
@@ -323,7 +323,7 @@ user's network context and actual transfer evidence to choose a reachable source
323
323
  inferring connectivity from the language they speak. Preserve useful downloads and caches while
324
324
  changing the part that is actually blocked. Explain the changed outlook promptly and recommend
325
325
  a practical alternative when local preparation would dominate the production time. StarRouter
326
- `qwen3-asr-flash` can transcribe without local model preparation, but returns text without word-level
326
+ `whisper-1` can transcribe without local model preparation, but returns text without word-level
327
327
  timing; choose it only when that limitation fits the work. Continue independent reference and
328
328
  component work meanwhile.
329
329
 
@@ -34,7 +34,7 @@ shot_policy:
34
34
  ## 逐镜制作
35
35
 
36
36
  1. 用 `hypit recreate init <source> --project <project>` 导入原片并检测镜头,再由导演观看、修订镜头清单,执行 `hypit recreate shots <project>`。镜头按时间顺序连续覆盖整段参考片,不能漏段或重叠;每个提交 Comfly 的镜头必须独立成片,最长 15 秒且不超过 100 MiB。超限镜头先按动作边界人工修订,不按固定秒数盲切。微小剪辑和叙事功能另记在时间线,不把像素切点当成叙事判断。
37
- 2. 先确认对白转写的厂商、模型和费用。[StarRouter 官方文档](https://starrouter.io/docs/zh-CN.md)列出 `/v1/audio/transcriptions`,示例模型为 `qwen3-asr-flash` 和 `whisper-1`。原生复刻已接入 StarRouter `qwen3-asr-flash`:对已切好的镜头先执行 `hypit recreate transcribe <project> --shot <id> --runtime <profile>` 看厂商、模型、语言、音频哈希与预计付费请求;用户确认后分别执行 `--approve` 和 `--confirmed`。结果保存为待审核文本,不含逐词时间戳;必须人工校对原文和说话人,并另行确认时间位置,不能把它当作已对齐字幕。提交结果未知时会阻断重试;查验 StarRouter 日志及费用后,才能用 `--approve --acknowledge-unknown` 显式重新授权。需要逐词时间戳时仍可选 `hypit transcribe` 的 WhisperX 对齐能力,但它可能下载本地模型。原文、译文和字幕分开保存,不从中文字幕倒推对白。
37
+ 2. 先确认对白转写或翻译的厂商、模型和费用。[StarRouter 官方文档](https://starrouter.io/docs/zh-CN.md)列出 `/v1/audio/transcriptions` 和 `/v1/audio/translations`。原生复刻默认使用已验证可用的 StarRouter `whisper-1`:对已切好的镜头先执行 `hypit recreate transcribe <project> --shot <id> --runtime <profile>` 看厂商、模型、语言、音频哈希与预计付费请求;用户确认后分别执行 `--approve` 和 `--confirmed`。`qwen3-asr-flash` 已从默认目录移除并禁用,其 transcription/translation 实测均返回上游 404。结果保存为待审核文本,不含逐词时间戳;必须人工校对原文和说话人,并另行确认时间位置,不能把它当作已对齐字幕。提交结果未知时会阻断重试;查验 StarRouter 日志及费用后,才能用 `--approve --acknowledge-unknown` 显式重新授权。需要逐词时间戳时仍可选 `hypit transcribe` 的 WhisperX 对齐能力,但它可能下载本地模型。原文、译文和字幕分开保存,不从中文字幕倒推对白。
38
38
 
39
39
  Hypit 对该模型按[上游规格](https://help.aliyun.com/zh/model-studio/asr-model)施加单次 10 MB、5 分钟的本地限制;StarRouter 文档没有声明自己的文件大小或时长上限。复刻仍须先切镜,再按镜头转写。
40
40
 
@@ -6,8 +6,8 @@
6
6
 
7
7
  1. `preflight --json` 检查地址、CLI 版本、认证和标准能力;`restartRequired` 为真时重跑。仅缺可确定的账户 `capabilityDefaults` 时,从实时 options、目标项目有效值或模型默认值补齐并回读;模型不可用或候选缺失时停下询问。
8
8
  2. `config get` 只管理个人默认模型、能力默认值和工作流并发。供应商、密钥和全局模型目录由管理员维护。
9
- 3. 新项目按“确认名称/用途 → `project create` → `project get` + 一次 `canvas inspect`”执行;既有项目先聚合读取。项目配置回读通过前不得创建创作节点。
10
- 4. `canvas settings get` 必须确认项目覆盖值、继承后的有效值、来源和实时候选。默认推荐 `storyboardImageType: grid`;`visualBible` 按实时 schema 构造。`outputLanguage` 必须与用户确认的交付语言一致;“自动”只适合用户明确要求跟随输入且源剧本语言单一的普通拆镜。CLI `--locale` 只影响命令界面和输出消息,不代表内容语言。
9
+ 3. 新项目按“确认名称/用途与交付语言 → `project create --language <BCP47>` → `project get` + 一次 `canvas inspect`”执行;既有项目先聚合读取。项目配置回读通过前不得创建创作节点。
10
+ 4. `canvas settings get` 必须确认项目覆盖值、继承后的有效值、来源和实时候选。默认推荐 `storyboardImageType: grid`;`visualBible` 按实时 schema 构造。音频配音与音乐生成使用独立槽位:`audioModel` 只服务 TTS,`musicModel` 只服务 `music-generate`;不要用 TTS 模型填充音乐槽位。项目 `outputLanguage` 必须与创建时用户确认的交付语言一致;它在创建后不可修改,画布设置只读返回,不能使用 `null` 或清空。CLI `--locale` 只影响命令界面和输出消息,不代表内容语言。
11
11
  5. `imageResolution`、`imageQuality`、`videoResolution` 优先由项目统一设置;节点只有确需不同且实时能力允许时才覆盖。H3 模型必须与 `videoPromptType: "h3"` 同次写入。
12
12
  6. 用一次 `canvas settings set --file` 原子写入全部确认项并携带最近的 `expectedVersion`。409 后重新读取、展示变化并确认;写后立即回读。
13
13
 
@@ -22,6 +22,12 @@
22
22
 
23
23
  先用 `canvas episode list/create` 确认分集,再用 `canvas folder list` 取得真实目录 ID。预设的道具、人物、场景、配音、分镜目录不可重命名、移动或删除;用户子目录最多 32 层,删除后有 30 天恢复窗口。移动不得形成环,删除被引用目录前先解除引用。跨项目复制只复制资产及版本,不复制目录结构,写后用目标项目回读。
24
24
 
25
+ ## 音乐生成节点
26
+
27
+ 背景音乐、主题曲和纯音乐使用 `music-generate`,默认模型为 `starrouter::suno_music`。节点只接收可选的 `prompt` 文本输入,输出 AUDIO;在画布设置中通过 `musicModel` 继承项目音乐模型,节点 config 的 `model` 可以按实时目录覆盖。`prompt` 必须有实际内容,`title`、`tags`、`lyrics` 和 `makeInstrumental` 按实时 schema 提交;`lyrics` 与 `makeInstrumental: true` 互斥。不要用 `tts` 节点生成音乐,也不要把 `audioModel` 的 TTS 模型写到 `musicModel`。
28
+
29
+ 创建后先回读节点类型、config 和 AUDIO 输出端口,再运行并等待任务。成功后回读 selected 版本,确认媒体类型为 `audio/*`、时长和文件非空并实际试听;任务失败或提交回执未知时先查任务,不自动重复发起付费请求。
30
+
25
31
  ## 不可变编辑和并发
26
32
 
27
33
  - `canvas node edit-shot` 只编辑镜头内容,不能改 `shotKey`、`shotIndex` 或来源身份。
@@ -12,6 +12,8 @@ node "${CODEX_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-.}}/scripts/provider-setup.mjs"
12
12
 
13
13
  命令只做非付费连接探测,写入 `.short-drama/provider-setup.json`,并绑定项目模型、参数和 Runtime 文件哈希。更改模型、参数或 Runtime 后重新探测。旧项目中的 RunningHub、Comfly 直连、百炼、MuseTalk 及自定义远端厂商配置不得继续制作,先改为 StarRouter 并重新确认。
14
14
 
15
- StarRouter 已列出的主要模型包括图片 `gpt-image-2`,视频 `MiniMax-H3`、`MiniMax-H3-Max` 与 Seedance,语音 `speech-2.8-hd`、`speech-2.8-turbo`,音乐 `suno_music`,转写 `qwen3-asr-flash`、`whisper-1`。具体可用性以 Runtime 探测和用户确认的制作计划为准。
15
+ StarRouter 已列出的主要模型包括图片 `gpt-image-2`,视频 `MiniMax-H3`、`MiniMax-H3-Max` 与 Seedance,语音 `speech-2.8-hd`、`speech-2.8-turbo`,音乐 `suno_music`,以及默认转写/翻译 `whisper-1`。`qwen3-asr-flash` 已从默认目录移除并禁用,其 transcription/translation 实测均返回上游 404;渠道恢复前不要选用。
16
+
17
+ 无限画布使用音乐时,模型键为 `starrouter::suno_music`,节点 kind 为 `music-generate`,输出 AUDIO。节点 config 使用 `prompt`、`title`、`tags`、`lyrics` 和 `makeInstrumental`;`prompt` 必填,`lyrics` 与 `makeInstrumental: true` 互斥。提交使用 `/suno/submit/MUSIC`,结果通过 `/suno/fetch/{task_id}` 轮询,成功结果只登记实际音频而非封面或视频。
16
18
 
17
19
  StarRouter 当前未验证 CosyVoice 自定义音色设计/克隆、SeedVR2.5 超分和 MuseTalk 口型驱动的等价能力;相关远端操作暂时禁用并提示用户。短剧最终视频统一通过 `hypit short-drama production plan/build` 执行现有审核与付费门禁。
@@ -9,3 +9,5 @@ CosyVoice 自定义音色设计/克隆在独立 TTS 流程中可用,但必须
9
9
  现有 `cinematic-tts` 和 `generate_audio_fallback` 合同暂存以读取旧项目,但因自定义音色能力未验证,调用会明确拒绝。重新设计时先从当前 selected 原声资产建立对齐证据;最多三轮,每轮必须经八维审核并绑定最终 selected 音频,禁止自动追加第四次。
10
10
 
11
11
  `character_voice_recommend`、`character_voice_description` 可辅助写人物声音档案,`music_track_design` 用于音乐计划;这些文本提示词不构成已验证的自定义音色生成能力。
12
+
13
+ 需要实际生成背景音乐、主题曲或纯音乐时,把审核后的曲目计划写入无限画布 `music-generate` 节点。使用 `starrouter::suno_music` 时,`prompt` 必填,`title`、`tags`、`lyrics` 和 `makeInstrumental` 非空时才提交;纯音乐不能同时提供歌词。生成成功后必须回读 AUDIO 资产版本并试听,确认时长、响度、风格、歌词与画面节奏后再选版,不能把音乐计划文本当作已生成音频。
@@ -6,7 +6,7 @@
6
6
 
7
7
  参考素材只取当前 selected 且未失效的资产版本。需要公网 URL 时,经 TempFile.org 临时发布;发布前确认素材权利、公开暴露和使用范围。请求快照与任务账本保存模型、参数、文档引用、资产版本和任务 ID,禁止记录密钥。一次提交结果未知时先核对原任务,不自动重试;失败镜头可在重新确认后单独重建。
8
8
 
9
- 同一依赖层的图片目标可批量提交;派生资产等母资产审核选版后进入下一层。并发由 Runtime Endpoint 和现有任务门禁控制,不通过切换厂商绕开限流。模型目录以项目配置探测为准,当前主要包括 `gpt-image-2`、`MiniMax-H3`、Seedance、`speech-2.8-hd`、`speech-2.8-turbo`、`suno_music` 和 `qwen3-asr-flash`。
9
+ 同一依赖层的图片目标可批量提交;派生资产等母资产审核选版后进入下一层。并发由 Runtime Endpoint 和现有任务门禁控制,不通过切换厂商绕开限流。模型目录以项目配置探测为准,当前主要包括 `gpt-image-2`、`MiniMax-H3`、Seedance、`speech-2.8-hd`、`speech-2.8-turbo`、`suno_music` 和默认转写 `whisper-1`。
10
10
 
11
11
  StarRouter 尚无已验证的 CosyVoice 自定义音色设计/克隆、SeedVR2.5 超分和 MuseTalk 口型驱动等价能力。这些操作暂时禁用,调用时明确报错。旧项目中保存的 RunningHub、Comfly 直连、百炼或 MuseTalk 配置不能继续提交付费任务,需先改为 StarRouter 并重新确认计划。
12
12
 
@@ -24,7 +24,7 @@ visual 必须 passed;无声音或字幕时使用 not-applicable,不得伪造
24
24
 
25
25
  每个缺陷先记录实际症状,再判断最可能的生成机制,并给出只改变一个变量的最小修复;无法从成片区分原因时明确标为待验证,不把猜测写成结论。重生成后对照旧版验证该症状是否消失;同一修复连续失败两次就停止盲重试,回到分镜、参考绑定、提示词或模型能力边界重新定位。
26
26
 
27
- H3 原生音频镜头在候选选版后整集批量审计:先跑 `node "${CODEX_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-.}}/scripts/native-audio-audit.mjs" audit-episode <项目> <ep-001>` 取待审计清单(自动跳过无 speech_timeline、未选版和已按当前 sha256 审计过的镜头),向用户展示 ASR 模型、镜头数和请求次数,不计算具体价格;确认后加 `--confirmed` 顺序执行。单镜重生成后用 `audit <项目> <ep-001> <镜号> <视频资产 key> <候选版本> --confirmed` 单审。默认使用 StarRouter `qwen3-asr-flash`(可用 `STARROUTER_ASR_MODEL` 改为 `whisper-1`)核对 speech_timeline 的对白文本、说话人和时间偏差;接口未返回时间戳或说话人时不能自动通过,命令对未通过项返回非零退出码。再人工核对统一 music_anchor 和相邻 transition_pair;任一对白错位、音乐断层或声音桥不成对都记为 audio/transition 缺陷,不用后配音静默掩盖。
27
+ H3 原生音频镜头在候选选版后整集批量审计:先跑 `node "${CODEX_PLUGIN_ROOT:-${CLAUDE_PLUGIN_ROOT:-.}}/scripts/native-audio-audit.mjs" audit-episode <项目> <ep-001>` 取待审计清单(自动跳过无 speech_timeline、未选版和已按当前 sha256 审计过的镜头),向用户展示 ASR 模型、镜头数和请求次数,不计算具体价格;确认后加 `--confirmed` 顺序执行。单镜重生成后用 `audit <项目> <ep-001> <镜号> <视频资产 key> <候选版本> --confirmed` 单审。默认使用 StarRouter `whisper-1`(可用 `STARROUTER_ASR_MODEL` 显式切换)核对 speech_timeline 的对白文本、说话人和时间偏差;接口未返回时间戳或说话人时不能自动通过,命令对未通过项返回非零退出码。再人工核对统一 music_anchor 和相邻 transition_pair;任一对白错位、音乐断层或声音桥不成对都记为 audio/transition 缺陷,不用后配音静默掩盖。
28
28
 
29
29
  审片不可只看首帧、联系表或任务状态:逐镜至少按 0.5–1 秒间隔抽查,并对关键动作的入点、接触点、完成点和镜尾逐帧复核;记录实际观察而非复述提示词。整集审片必须完整观看和听完,六个维度分别填写观察;“计划写了动作”不能作为“画面已经实现”的证据。整集剪辑审查还要在每个转场的前一帧、精确切点、淡化中点和完成帧抽检,单帧黑闪、跳轴或动作断裂即记为 P1,即使长时段黑帧/静音检测没有报警;标为 action-cut 的接缝还必须检查地点、主体姿态、运动方向和道具状态,任一突变均不能按动作连续通过。
30
30
 
@@ -7,14 +7,14 @@
7
7
  - 图片:`/v1/images/generations`;有本地参考图时使用 multipart `/v1/images/edits`。支持 `1K/2K/4K + aspect_ratio` 尺寸推导和常用输出参数。
8
8
  - 视频:Seedance 使用 `/volcengine/doubao/contents/generations/tasks`;MiniMax H3/H3-Max 使用 OpenAI 兼容 `/v1/videos`,并通过 `/v1/videos/{task_id}` 查询。适配器按模型选择协议。
9
9
  - 语音:同步 `POST /v1/audio/speech`,支持 `speech-2.8-hd`、`speech-2.8-turbo`、Qwen3 TTS、PawSense 与 `tts-1`;通用模型的 `instructions` 和 `metadata` 原样转发,当前 MCP 不缓冲 SSE 流式结果。
10
- - 语音识别:同步 multipart `POST /v1/audio/transcriptions` 或 `/v1/audio/translations`;默认模型为 `qwen3-asr-flash`、`whisper-1`。词级或分段时间戳必须使用 `response_format=verbose_json`,`timestamp_granularities` 只接受 `word|segment` 并按 multipart 同名重复字段发送;未知粒度和其他响应格式在请求前拒绝。
10
+ - 语音识别:同步 multipart `POST /v1/audio/transcriptions` 或 `/v1/audio/translations`;默认使用已验证可用的 `whisper-1`。`qwen3-asr-flash` 已从默认目录移除并禁用,其 transcription/translation 实测均返回上游 404。词级或分段时间戳必须使用 `response_format=verbose_json`,`timestamp_granularities` 只接受 `word|segment` 并按 multipart 同名重复字段发送;未知粒度和其他响应格式在请求前拒绝。
11
11
  - 音乐:`POST /suno/submit/MUSIC` 提交 `suno_music`,`GET /suno/fetch/{task_id}` 轮询;生成结果作为 audio 资产保存。
12
12
  - 认证:优先使用 Hypit Runtime 指定的 Credential Store;旧适配器仍支持从 `STARROUTER_API_KEY` 读取 Bearer Token。
13
13
  - 保底目录:图片 `gpt-image-2`,视频为适配器登记的 Seedance 系列及 `MiniMax-H3`、`MiniMax-H3-Max`,语音和 ASR 为上述模型,音乐为 `suno_music`。可分别用 `STARROUTER_IMAGE_MODELS`、`STARROUTER_VIDEO_MODELS`、`STARROUTER_AUDIO_MODELS`、`STARROUTER_ASR_MODELS`、`STARROUTER_MUSIC_MODELS` 和 `STARROUTER_MULTIMODAL_VIDEO_MODELS` 提供逗号分隔目录;自定义模型仍需补能力合同。
14
14
 
15
15
  ## Suno 音乐合同
16
16
 
17
- `generate_music` 使用项目路由模型 `suno_music` 和非空 `prompt`,可选 `title`、`tags`、`lyrics` 与 `make_instrumental`。StarRouter 当前不读取请求体的 `model`,由 `/MUSIC` 路径映射计费模型;无歌词时把音乐方向提交为上游 `gpt_description_prompt`,有自定义歌词时只把批准歌词提交为上游 `prompt`,音乐方向仍保存在本地创作合同并以 `tags` 辅助上游。纯音乐不能同时提供歌词。远端 task id 在本地加 `music:` 路由前缀,查询时移除前缀;只提取音乐响应中的音频 URL,避免把封面或 MV 视频误登记为音频。
17
+ `generate_music` 使用系统模型键 `starrouter::suno_music`。提交到 `POST /suno/submit/MUSIC` 的 JSON 为 `prompt`、可选 `title`、`tags`、`lyrics` 与 `make_instrumental`;StarRouter 当前不读取请求体的 `model`,由 `/MUSIC` 路径映射系统模型 `suno_music`。`prompt` 必填,`lyrics` 与 `make_instrumental: true` 不能同时提交。远端返回的公开 task id 会编码为本地 `SUNO:MUSIC:b64_<providerConfigId>:<task_id>`,查询使用 `GET /suno/fetch/{task_id}`,并由 externalId 中的 provider 配置找回账号和密钥;只提取 `audio_url`、`audioUrl`、`stream_audio_url` 或 `streamAudioUrl`,避免把封面、MV 视频或其他媒体误登记为音频。
18
18
 
19
19
  ## MiniMax H3/H3-Max 视频合同
20
20