Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 12 additions & 2 deletions AGENTS.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,24 @@

- 模型查询详情应提供可直接用于生成命令的参数值;图片 `ratio` 只接受服务端数字枚举,查询的 `options/default` 同样使用数字,并用 `option_labels` 展示比例含义;视频 `ratio` 保持其接口要求的比例字符串。不提供数字和比例字符串两套图片输入,映射不按数组位置或展示文案推断。
- 覆盖 IDL 已定义且生成入口可消费的枚举;未知枚举直接跳过,不猜测或回退到其他值。已定义但没有 CLI 请求表达方式的枚举须明确识别为不可用。
- 内部配置指纹不向用户输出;原始配置缓存和用户展示结构分离,保留可选字段缺失与零值的区别。参数通用元数据(`label`、`description`、`required_field`、`active_when_any`)统一保留,只在确有契约差异时按模型类型分支。
- 内部配置指纹不向用户输出;原始配置缓存和用户展示结构分离,保留可选字段缺失与零值的区别。参数通用元数据(`label`、`description`、`required_field`、`active_when_any`)统一保留,只在确有契约差异时按模型类型分支。创作模式的提交值按服务端下发的模式 key 映射,不额外硬编码模型名单;模型特例必须有明确契约依据。
- 模型级 `is_default` 不向 CLI 用户输出;服务端默认标记不等于用户授权代选模型。参数级默认值继续展示,原始配置缓存保持完整。
- API 模型查询保留上游 `name` 展示名称和 `key` 模型枚举,白名单只控制准入,不用枚举覆盖名称。CLI 图片模型列表、搜索、详情、帮助和示例只向宿主展示 `name`,详情不透传含枚举的计费等内部配置;查询和生成使用完整名称,仅提交时从原始配置解析 key。不维护静态名称映射,不按简称猜模型;名称缺失、与 key 相同、重复或未找到时明确失败。视频保持 key 契约。
- 模型发现验收必须分别核对用户确认的预期模型集合与真实接口返回值转换;CLI 与接口同时少返回模型不能判为完整通过。请求携带 PPE 头也不能替代实际路由和生效配置证据。
- 模型发现验收必须分别核对用户确认的预期模型集合与真实接口返回值转换;CLI 与接口同时少返回模型不能判为完整通过。
- `Seedance_2.0_mini` 和 `Seedance_2.0_mini_lite` 允许省略生成分辨率,由服务端默认 `720p`;CLI 不主动补值,不因模型查询缺少分辨率维度而将该参数标为必填或伪造配置。

- 安装引导的最小兼容修复只补必需命令检查;可选参数已有 `--help` 判断约定时复用该约定,不另增能力返回字段或升级条件。

# 短剧 Skill 描述约定

- description 应覆盖剧本创作与解析、资产素材生成、故事板规划生成、视频产物交付的完整能力及触发场景,不能将短剧 Agent 缩窄为剧本文本创作或文件查询工具。

# 最小改动范围

- 用户要求最小接入时,只新增用户明确要求的能力和完成流程不可缺少的字段;不能因为下游协议包含某字段,就顺手扩展 CLI 参数、素材入口或配套抽象。先证明它属于本次必需范围,再修改。放宽某一阶段的参数要求时,只调整该阶段所需条件,保留无关的既有校验;服务端校验简化不得自动扩展为删除 CLI 原有校验。

# 宿主来源统计

- `--source` 由宿主 Agent 根据可信运行环境填写真实、稳定的平台标识;不得固定为 `codex` 或默认代填,来源未知时省略。示例中的平台名仅为示例,生成提交由 CLI 透传为服务端 `platform`;安装/更新的 `report_telemetry` 用新增 `host_platform` 承载宿主标识,保留已有 `source` 的安装入口语义和 `platform` 的操作系统语义。已有上报字段被消费时,不得改写其含义,应新增独立字段。

- 来源采集应尽力而为:显式 `--source` 优先,其次宿主提供的 `PIPPIT_CLI_SOURCE`,最后使用已核实的运行标记;显式空值禁用兜底。仅上报稳定宿主名,不上传会话 ID,不用安装痕迹、API Key 或 prompt 猜来源,冲突时省略。新增运行标记须有实际环境或官方实现依据。
47 changes: 44 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -274,7 +274,7 @@ pippit-tool-cli generate-video \
--resolution "720p"
```

命令输出 `thread_id`、`run_id` 和 `web_thread_link`。提交生视频 HTTP 请求时,参考图、参考视频和参考音频会使用上传接口返回的 `pippit_asset_id`,并分别写入 `video_part_tool_param.images`、`video_part_tool_param.videos` 和 `video_part_tool_param.audios`。图片支持 `.jpg`、`.jpeg`、`.png`、`.gif`、`.bmp`、`.webp`、`.svg`;视频支持 `.mp4`、`.avi`、`.mov`、`.wmv`、`.flv`、`.webm`、`.mkv`、`.m4v`;音频仅支持 `.mp3`、`.wav`。当前可用模型通过 `model list` 查询,参数详情通过 `model describe MODEL_KEY` 查询。CLI 会在提交前校验 prompt 和文件后缀;模型、比例、分辨率等语义校验由服务端处理。
命令输出 `thread_id`、`run_id` 和 `web_thread_link`。提交生视频 HTTP 请求时,参考图、参考视频和参考音频会使用上传接口返回的 `pippit_asset_id`,并分别写入 `video_part_tool_param.images`、`video_part_tool_param.videos` 和 `video_part_tool_param.audios`。图片支持 `.jpg`、`.jpeg`、`.png`、`.gif`、`.bmp`、`.webp`、`.svg`;视频支持 `.mp4`、`.avi`、`.mov`、`.wmv`、`.flv`、`.webm`、`.mkv`、`.m4v`;音频仅支持 `.mp3`、`.wav`。当前可用模型通过 `model list` 查询,参数详情通过 `model describe MODEL_KEY` 查询。CLI 会在提交前校验 prompt 和文件后缀,仅传入非空 `--draft-task-id` 时允许省略 prompt;模型、比例、分辨率等语义校验由服务端处理。

首尾帧生视频时,按首帧、尾帧的顺序传入两次 `--image`,并设置 `--generate-type 1`:

Expand All @@ -292,6 +292,25 @@ pippit-tool-cli generate-video \

`--generate-type` 可选,填写后原样写入 `video_part_tool_param.generate_type`;值 `1` 表示首尾帧生成。CLI 保持图片上传和请求中的输入顺序,不在本地校验该参数的枚举值,具体能力与约束由服务端决定。

### Seedance 2.5 Draft

复用 `generate-video` 分两次提交。需要目标服务端支持 Draft 协议和无 prompt 的成片请求。

```bash
# 样片
pippit-tool-cli generate-video --model Seedance_2.5_draft --draft \
--prompt "小猫钓鱼视频" --task-type reference --duration 10 --ratio 16:9
pippit-tool-cli query-result --thread-id DRAFT_THREAD_ID --run-id DRAFT_RUN_ID --download-dir ./draft

# 用户预览后要求生成成片:使用 videos[].draft_task_id 原值
pippit-tool-cli generate-video --model Seedance_2.5_draft --draft-task-id DRAFT_TASK_ID
pippit-tool-cli query-result --thread-id FINAL_THREAD_ID --run-id FINAL_RUN_ID --download-dir ./final
```

`query-result` 在视频结果中保留可选的 `draft`、`draft_task_id`,继续返回 `download_url` 和 `output_path`。两阶段分别计费,下游固定生成 480p 样片和 1080p 成片;样片创建后 7 天内可转成片。CLI 不自动续跑,不要求重复提示词和素材。

新增 `--task-type`、`--seed` 透传生成模式与 seed。完整参数与两阶段示例见 [生视频命令](skills/xyq-nest-skill/commands/generate-video.md)。

## 视频处理工具 CLI

`video-super-resolution` 会上传一个本地视频并提交视频超分任务:
Expand Down Expand Up @@ -340,11 +359,33 @@ pippit-tool-cli query-result \

CI 或 Agent 可继续显式设置 `XYQ_ACCESS_KEY`,它会覆盖本机网页登录凭证;配置错误时不会静默回退到个人登录。会话提交和查询共享上述凭据。

### 安装与更新来源统计

宿主执行安装/更新时,按可信运行环境静默传入真实稳定标识,未知时省略;不固定为某个平台,不询问用户。以下 `HOST` 是占位符:

```bash
pippit-tool-cli install --source HOST
npx @pippit-dev/cli install --source HOST
pippit-tool-cli update --source HOST
```

直接使用 `npm install -g @pippit-dev/cli` 时,可由宿主在该次命令的环境中设置 `PIPPIT_CLI_SOURCE`。install/update 的显式 `--source` 优先于此环境变量;首尾空白去除,显式空值清空来源。该值不持久化;生成命令运行环境中若也存在此变量,同样会读取它作为宿主来源,具体兜底规则见下文。

`report_telemetry` 新增可选请求字段 `host_platform` 上报宿主标识;原有 `source` 保留 `npm_install`、`npx_install`、`cli_update`,`event` 区分 install/update,`platform` 仍表示操作系统。当前仅完成 CLI 字段上报,服务端协议和指标接收仍需适配。帮助不安装也不上报,`PIPPIT_CLI_DISABLE_TELEMETRY=1` 仍可关闭上报。内部 `install-cli.js` 仅安装二进制,沿用不安装 Skill、不上报的原有行为。

### 宿主来源统计

调用 Skill 提交接口的命令均支持可选 `--source`:`submit-run`、`generate-image`、`generate-video`、`video-super-resolution`、`erase-video-subtitle`、`short-drama +submit-run`。
生成提交命令均支持可选 `--source`:`submit-run`、`generate-image`、`generate-video`、`video-super-resolution`、`erase-video-subtitle`、`short-drama +submit-run`、`marketing generate`。

由宿主 Agent 根据实际环境静默填写稳定标识,例如豆包办公 `doubao_office`、WorkBuddy `workbuddy`、Codex `codex`。其它来源可使用其真实产品标识;来源未知时省略,不询问用户,也不从 prompt 猜测。该值去掉首尾空白后写入请求顶层 `platform`,仅供统计,不参与创作、模型选择或鉴权;无法解析来源或显式空值时不发送该字段。省略 `--source` 时,CLI 按以下顺序尽力补齐来源:

1. 宿主显式设置的 `PIPPIT_CLI_SOURCE`。
2. 运行标记:`CODEX_THREAD_ID` / `CODEX_SESSION_ID` → `codex`,`CLAUDECODE` → `claude_code`,`CURSOR_AGENT` → `cursor`,`GEMINI_CLI` → `gemini_cli`。
3. 标记缺失、为 0/false 或不同宿主标记冲突时不猜测,省略来源。

显式 `--source` 始终优先,显式空值可关闭本次归因。仅消费环境标记是否存在,不上传会话标识,不根据 API Key、已安装软件、普通终端名或用户 prompt 猜来源,也不持久化。查询、上传、下载、Canvas 不附加来源。营销脚本的预览与提交采用相同规则;原生 update 也复用该解析,仍写入 `host_platform`,保留旧 source。豆包办公、WorkBuddy 等尚无已核实运行标记的宿主,应优先主动传参或设置上述环境变量。

由宿主 Agent 根据实际环境静默填写稳定标识,例如豆包办公 `doubao_office`、WorkBuddy `workbuddy`、Codex `codex`。其它来源可使用其真实产品标识;来源未知时省略,不询问用户,也不从 prompt 猜测。该值去掉首尾空白后写入请求顶层 `platform`,仅供统计,不参与创作、模型选择或鉴权;未提供/空值时不发送该字段。不会自动读取环境变量、持久化来源或影响查询、上传、下载、Canvas 命令。
Cursor 标记依据:[官方终端文档](https://docs.cursor.com/en/agent/terminal);Gemini 标记依据:[官方命令文档](https://geminicli.com/docs/reference/commands/)。Codex 标记已在本机运行环境核实;Claude Code 标记已在本机安装产物核实。

```bash
pippit-tool-cli generate-video --prompt "小猫在花园散步" --model Seedance_2.0_mini --source workbuddy
Expand Down
14 changes: 13 additions & 1 deletion cmd/generate_video/generate_video.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ func NewCommand(stdout, stderr io.Writer, runner *common.Runner) *cobra.Command
opts := &internalgen.Options{}
var durationSec int
var generateType int64
var seed int64
var draft bool

cmd := &cobra.Command{
Use: "generate-video",
Expand All @@ -26,6 +28,12 @@ func NewCommand(stdout, stderr io.Writer, runner *common.Runner) *cobra.Command
if cmd.Flags().Changed("generate-type") {
opts.GenerateType = &generateType
}
if cmd.Flags().Changed("seed") {
opts.Seed = &seed
}
if cmd.Flags().Changed("draft") {
opts.Draft = &draft
}

result, err := internalgen.Run(cmd.Context(), opts, runner)
if err != nil {
Expand All @@ -43,7 +51,7 @@ func NewCommand(stdout, stderr io.Writer, runner *common.Runner) *cobra.Command
cmd.SetErr(stderr)
flags := cmd.Flags()
flags.StringVar(&opts.Source, "source", "", "optional host agent/platform identifier for statistics only; filled silently by the host agent (e.g. doubao_office, workbuddy, codex)")
flags.StringVar(&opts.Prompt, "prompt", "", "video generation prompt")
flags.StringVar(&opts.Prompt, "prompt", "", "video generation prompt; may be omitted when rendering a draft")
flags.StringArrayVar(&opts.ImagePaths, "image", nil, "local reference image path; repeat for multiple images")
flags.StringArrayVar(&opts.VideoPaths, "video", nil, "local reference video path; repeat for multiple videos")
flags.StringArrayVar(&opts.AudioPaths, "audio", nil, "local reference audio path; repeat for multiple audios")
Expand All @@ -52,5 +60,9 @@ func NewCommand(stdout, stderr io.Writer, runner *common.Runner) *cobra.Command
flags.StringVar(&opts.Model, "model", "", "video model key; use 'model list' to discover available models")
flags.StringVar(&opts.Resolution, "resolution", "", "video resolution; optional for Seedance_2.0_mini and Seedance_2.0_mini_lite (server defaults to 720p); use 'model describe <key>' for current configuration")
flags.Int64Var(&generateType, "generate-type", 0, "generation type passed to the service; set 1 for first-and-last-frame generation and provide --image values in first-frame, last-frame order; MiniMax and Wan also accept a single first-frame image in this mode")
flags.StringVar(&opts.TaskType, "task-type", "", "video task type passed to the service: auto, reference, edit, extend")
flags.Int64Var(&seed, "seed", 0, "custom generation seed; omitted when not supplied")
flags.BoolVar(&draft, "draft", false, "generate a Seedance_2.5_draft preview; --draft=false explicitly requests a final video")
flags.StringVar(&opts.DraftTaskID, "draft-task-id", "", "original draft_task_id returned by query-result, used to render a final video")
return cmd
}
Loading
Loading