[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EWGWTHPCGAA8ZHYY2YQ9BJ":3,"skill-same:01M6EWGWTHPCGAA8ZHYY2YQ9BJ":112},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":31,"publishedAt":45,"linkOnly":46,"markdownContent":47,"markdownBody":48,"frontMatter":49,"refName":58,"commitSha":59,"skillDirectory":60,"forksCount":61,"repositoryHtmlUrl":62,"repositoryHomepageUrl":63,"ownerHtmlUrl":64,"ownerBlogUrl":6,"ownerDescription":65,"updatedAt":66,"install":67,"resources":79},"01M6EWGWTHPCGAA8ZHYY2YQ9BJ","libtv-skill",null,"agent-im 会话技能 - 通过 liblib.tv 的 AI 能力生成和编辑图片\u002F视频。覆盖场景包括：生成（文生图、文生视频、图生视频、做动画、画一个xxx、来段xxx）、编辑修改（把xxx换成yyy、去掉xxx、加上xxx、改成xxx、调整xxx、局部修改、改镜头）、风格转换（风格迁移、转绘、换风格）、视频续写延长、复刻视频\u002FTVC\u002F宣传片、短剧\u002F短漫剧生成、音乐MV生成、产品广告\u002F展示片制作、分镜\u002F故事板设计、教育视频\u002F短视频制作。当用户提到 liblib、libtv、上传参考图\u002F视频、查看生成进度时也应触发。关键判断：只要用户的请求涉及 AI 图片或视频的创作、生成、编辑、修改，无论措辞如何（如\"画只猫\"、\"做个海报\"、\"把纸船换成爱心\"、\"这个视频帮我改一下\"、\"帮我复刻这段视频\"、\"用这首歌做个MV\"、\"一句话生成短剧\"），都必须触发此技能。","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002FSKILL.md",[18,23,26],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",{"categoryNo":27,"categoryName":28,"taxonomyType":29,"taxonomyTypeDesc":30},"01JBSEEDCAT000000000000036","内容创作者","PROFESSION","适用职业",[32,33,34,35,36,37,38,39,40,41,42,43,44],"libtv skill","design","image","access","视频","生成","海报","python3","视频制作","分镜","短剧","创作","动画","2026-11-10 10:12:30",false,"---\nname: libtv-skill\ndescription: agent-im 会话技能 - 通过 liblib.tv 的 AI 能力生成和编辑图片\u002F视频。覆盖场景包括：生成（文生图、文生视频、图生视频、做动画、画一个xxx、来段xxx）、编辑修改（把xxx换成yyy、去掉xxx、加上xxx、改成xxx、调整xxx、局部修改、改镜头）、风格转换（风格迁移、转绘、换风格）、视频续写延长、复刻视频\u002FTVC\u002F宣传片、短剧\u002F短漫剧生成、音乐MV生成、产品广告\u002F展示片制作、分镜\u002F故事板设计、教育视频\u002F短视频制作。当用户提到 liblib、libtv、上传参考图\u002F视频、查看生成进度时也应触发。关键判断：只要用户的请求涉及 AI 图片或视频的创作、生成、编辑、修改，无论措辞如何（如\"画只猫\"、\"做个海报\"、\"把纸船换成爱心\"、\"这个视频帮我改一下\"、\"帮我复刻这段视频\"、\"用这首歌做个MV\"、\"一句话生成短剧\"），都必须触发此技能。\nuser-invocable: true\nmetadata:\n  {\n    \"openclaw\":\n      {\n        \"emoji\": \"?\",\n        \"requires\":\n          {\n            \"bins\": [\"python3\"],\n            \"env\": [\"LIBTV_ACCESS_KEY\"]\n          },\n        \"primaryEnv\": \"LIBTV_ACCESS_KEY\"\n      }\n  }\n---\n\n# agent-im 会话（生图 \u002F 生视频）\n\n通过 agent-im 的 OpenAPI 创建会话、发送消息（生图、生视频、编辑视频等）、上传图片\u002F视频文件，并查询会话消息进展。\n\nLibTV 是 LiblibAI 推出的 AI 视频创作平台，同时为人类创作者和 Agent 设计。Agent 通过 Skill 入口理解任务、调用模型并自动编排工作流。\n\n**平台核心能力：**\n- **生成**：文生图、文生视频、图生视频、视频续写\n- **编辑**：局部修改、元素替换、镜头调整、风格迁移\n- **复杂创作**：一句话生成完整短剧（剧本→分镜→成片）、复刻已有视频风格做 TVC\u002F宣传片、用音乐生成 MV、产品展示片制作\n- **模型**：Seedance 2.0、Kling 3.0\u002FO3、Wan 2.6、NanoBanana、Midjourney、Seedream 5.0 等顶级模型\n\n用户的所有创作和编辑需求都通过发送自然语言消息来完成，Agent 会自主编排工作流。复杂任务（短剧、MV）耗时较长，需耐心轮询。\n\n## 功能\n\n1. **创建会话 \u002F 发消息** - 创建新会话或向已有会话发送一条消息（如「生一个动漫视频」「把纸船换成爱心」）\n2. **查询会话进展** - 根据 sessionId 拉取该会话的消息列表，用于轮询生图\u002F生视频结果\n3. **切换项目** - 将当前 accessKey 绑定的项目切换到新项目，后续 create_session 将使用新 projectUuid\n4. **上传文件** - 上传图片或视频文件到 OSS，返回可访问的 OSS 地址（编辑已有视频\u002F图片时需要先上传）\n5. **下载结果** - 将会话中生成的图片\u002F视频批量下载到本地，自动提取 URL 并命名\n\n## 前置要求\n\n```bash\nexport LIBTV_ACCESS_KEY=\"your-access-key\"\n```\n\n可选：`OPENAPI_IM_BASE` 或 `IM_BASE_URL`，默认 `https:\u002F\u002Fim.liblib.tv`。\n\n无需安装额外依赖，仅使用 Python 标准库。\n\n## 使用方法\n\n### 1. 创建会话 \u002F 发送消息\n\n```bash\n# 创建新会话并发送「生一个动漫视频」\npython3 {baseDir}\u002Fscripts\u002Fcreate_session.py \"生一个动漫视频\"\n\n# 向已有会话发送消息\npython3 {baseDir}\u002Fscripts\u002Fcreate_session.py \"再生成一张风景图\" --session-id SESSION_ID\n\n# 只创建\u002F绑定会话，不发消息\npython3 {baseDir}\u002Fscripts\u002Fcreate_session.py\n```\n\n### 2. 查询会话进展\n\n```bash\n# 查询会话消息列表\npython3 {baseDir}\u002Fscripts\u002Fquery_session.py SESSION_ID\n\n# 增量拉取（只返回 seq 大于 N 的消息）\npython3 {baseDir}\u002Fscripts\u002Fquery_session.py SESSION_ID --after-seq 5\n\n# 附带项目地址（传入 create_session 返回的 projectUuid，结果中带 projectUrl）\npython3 {baseDir}\u002Fscripts\u002Fquery_session.py SESSION_ID --project-id PROJECT_UUID\n```\n\n### 3. 切换项目\n\n```bash\n# 切换当前 accessKey 绑定的项目（后续创建会话将使用新项目）\npython3 {baseDir}\u002Fscripts\u002Fchange_project.py\n```\n\n### 4. 上传文件\n\n当用户提供了参考的文件地址时，进行上传，仅支持图片、视频，文件大小必须在200M以下。\n\n```bash\n# 上传图片\npython3 {baseDir}\u002Fscripts\u002Fupload_file.py \u002Fpath\u002Fto\u002Fimage.png\n\n# 上传视频\npython3 {baseDir}\u002Fscripts\u002Fupload_file.py \u002Fpath\u002Fto\u002Fvideo.mp4\n```\n\n### 5. 下载结果\n\n生成完成后，可以将会话中的所有图片\u002F视频批量下载到本地。\n\n```bash\n# 从会话自动提取并下载所有结果\npython3 {baseDir}\u002Fscripts\u002Fdownload_results.py SESSION_ID\n\n# 指定输出目录\npython3 {baseDir}\u002Fscripts\u002Fdownload_results.py SESSION_ID --output-dir ~\u002FDesktop\u002Fmy_project\n\n# 指定文件名前缀（如 storyboard_01.png, storyboard_02.png ...）\npython3 {baseDir}\u002Fscripts\u002Fdownload_results.py SESSION_ID --prefix \"storyboard\"\n\n# 直接下载指定 URL 列表（不需要 session_id）\npython3 {baseDir}\u002Fscripts\u002Fdownload_results.py --urls URL1 URL2 URL3 --output-dir .\u002Foutput\n```\n\n## 典型工作流\n\n理解这些工作流，才能正确组合上面的脚本完成用户需求。\n\n### 场景 1：用户要求生成图片\u002F视频（最常见）\n\n```\n1. create_session.py \"用户的描述\"  →  拿到 sessionId + projectUuid\n2. 每隔 8 秒调用 query_session.py SESSION_ID --after-seq 0 轮询\n3. 检查 messages：当出现 assistant 角色的消息且包含图片\u002F视频 URL → 任务完成\n4. 自动下载：download_results.py SESSION_ID --output-dir ~\u002FDownloads\u002F项目名 --prefix 有意义的前缀\n5. 向用户展示：本地文件列表 + projectUrl（画布链接）\n```\n\n生成完成后**自动执行下载**，不需要用户额外请求。下载目录和前缀根据任务语义自动命名（如分镜用 `storyboard`，角色设定用 `character` 等）。\n\n### 场景 2：用户提供图片\u002F视频要求编辑修改（如\"把纸船换成爱心\"）\n\n```\n1. upload_file.py \u002Fpath\u002Fto\u002Fvideo.mp4  →  拿到 OSS URL\n2. create_session.py \"把四周的纸船都换成白色的纸爱心 参考视频：{oss_url}\"\n3. 后续同场景 1 的步骤 2-5\n```\n\n用户给了文件路径 + 编辑指令 = 先上传文件，再把编辑指令和 OSS URL 一起发送。\n\n### 场景 3：用户提供参考图\u002F视频要求生成新内容\n\n```\n1. upload_file.py \u002Fpath\u002Fto\u002Fref.png  →  拿到 OSS URL\n2. create_session.py \"根据参考图生成xxx，参考图：{oss_url}\"\n3. 后续同场景 1 的步骤 2-5\n```\n\n### 场景 4：在已有会话中追加新需求\n\n```\n1. create_session.py \"新的描述\" --session-id SESSION_ID\n2. 后续同场景 1 的步骤 2-5\n```\n\n### 轮询策略\n\n- **间隔**：每 8 秒查询一次\n- **增量拉取**：首次用 `--after-seq 0`，后续用上次拿到的最大 seq 值\n- **完成判断**：messages 中出现 assistant 消息且 content 包含结果 URL（图片\u002F视频地址）\n- **超时**：连续轮询 3 分钟仍无结果，告知用户\"生成时间较长，可稍后通过项目画布链接查看\"，不再继续轮询\n- **错误重试**：单次查询失败可重试 1 次，连续 3 次失败则停止并告知用户\n\n## 输出格式\n\n**create_session** 返回：\n```json\n{\n  \"projectUuid\": \"aa3ba04c5044477cb7a00a9e5bf3b4d0\",\n  \"sessionId\": \"90f05e0c-...\",\n  \"projectUrl\": \"https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=aa3ba04c5044477cb7a00a9e5bf3b4d0\"\n}\n```\n\n**query_session** 返回：\n```json\n{\n  \"messages\": [\n    {\"id\": \"msg-xxx\", \"role\": \"user\", \"content\": \"生一个动漫视频\"},\n    {\"id\": \"msg-yyy\", \"role\": \"assistant\", \"content\": \"...\"}\n  ],\n  \"projectUrl\": \"https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=...\"\n}\n```\n（`projectUrl` 仅在传入 `--project-id` 时存在）\n\n**change_project** 返回：\n```json\n{\n  \"projectUuid\": \"新项目UUID\",\n  \"projectUrl\": \"https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=新项目UUID\"\n}\n```\n\n**upload_file** 返回：\n```json\n{\n  \"url\": \"https:\u002F\u002Flibtv-res.liblib.art\u002Fclaw\u002F{projectUuid}\u002F{uuid}.png\"\n}\n```\n\n**download_results** 返回：\n```json\n{\n  \"output_dir\": \"\u002FUsers\u002Fxxx\u002FDownloads\u002Flibtv_results\",\n  \"downloaded\": [\"\u002FUsers\u002Fxxx\u002FDownloads\u002Flibtv_results\u002F01.png\", \"...\"],\n  \"total\": 9\n}\n```\n\n## 最终向用户展示时（OpenClaw）\n\n- **视频地址**：来自 `query_session` 返回的 `messages` 中 assistant 消息的 content 或结果里的视频\u002F图片 URL，即「返回的结果」。\n- **项目地址**：使用 `create_session` 返回的 `projectUrl`，或自行拼接 `https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=` + `projectUuid`。查询进展时若传入 `--project-id PROJECT_UUID`，`query_session` 会直接返回 `projectUrl`，便于一并展示。\n\n在任务完成时，同时给出：**视频\u002F图片结果链接** + **项目画布链接（projectUrl）**。\n过程中，不要给出 **项目画布链接（projectUrl）**。\n\n## 核心原则：用户侧不做创作，只做传话\n\n你（用户侧 Agent）的职责是**搬运工**，不是创作者。后端有专门的 Agent 负责理解需求、拆解分镜、编排工作流、选模型、写 prompt。你要做的只有三件事：\n\n1. **上传**：用户给了本地文件 → `upload_file.py` 拿到 OSS URL\n2. **传话**：把用户的原始描述 + OSS URL 原封不动发给 `create_session.py`\n3. **取件**：轮询结果 → 下载到本地 → 展示给用户\n\n**绝对不要做的事：**\n- 不要替用户扩写、润色、翻译 prompt（用户说\"帮我推演分镜\"，就直接传\"帮我推演分镜\"，不要自己先写个分镜表再逐条发）\n- 不要自行拆解任务步骤（如把\"生成9张分镜图\"拆成9次独立请求）\n- 不要自行编排镜头描述、剧情推演、风格分析\n- 不要在消息中添加自己编的 prompt（如\"超写实风格，电影级光影，8K分辨率\"之类的描述词）\n\n后端 Agent 对模型能力、参数配置、prompt 工程远比用户侧更专业。用户侧越俎代庖只会降低生成质量，换个弱模型更是灾难。\n\n**正确示例：**\n```\n用户说：「帮我推演后续的故事，来个分镜大爆炸，帮我出一个16:9的九宫格的图。新建一个任务。」\n用户给了参考图：\u002Fpath\u002Fto\u002Fref.png\n\n→ upload_file.py \u002Fpath\u002Fto\u002Fref.png  →  拿到 oss_url\n→ create_session.py \"帮我推演后续的故事，来个分镜大爆炸，帮我出一个16:9的九宫格的图。参考图：{oss_url}\"\n→ 轮询 → 下载 → 展示\n```\n\n**错误示例：**\n```\n❌ 用户侧自己先写了个九宫格分镜表（对峙、交锋、危机...）\n❌ 然后把自己编的描述发给后端\n❌ 或者拆成9次 create_session 分别发送\n```\n\n## 注意事项\n\n- 鉴权方式为请求头 `Authorization: Bearer \u003CLIBTV_ACCESS_KEY>`\n- 创建会话时若不传 `message`，仅创建\u002F绑定会话，不会调用 SendMessage\n- 查询会话时可用 `--after-seq` 做增量拉取，便于轮询新消息（含 assistant 回复与生图\u002F生视频结果）\n- 项目画布地址固定为：`https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=` + projectUuid\n- 切换项目后，Redis 缓存会更新，下次 create_session 将使用新的 projectUuid\n- 上传文件仅支持图片（image\u002F*）和视频（video\u002F*）类型，其他类型会被拒绝，文件大小须在 200MB 以下\n- 上传返回的 OSS 地址格式为 `https:\u002F\u002Flibtv-res.liblib.art\u002Fclaw\u002F{projectUuid}\u002F{uuid}{ext}`\n- 生成过程中只告知用户\"正在生成中\"，不要提前给出 projectUrl；任务完成后再同时给出：**结果链接（图片\u002F视频 URL）** + **项目画布链接（projectUrl）**\n","# agent-im 会话（生图 \u002F 生视频）\n\n通过 agent-im 的 OpenAPI 创建会话、发送消息（生图、生视频、编辑视频等）、上传图片\u002F视频文件，并查询会话消息进展。\n\nLibTV 是 LiblibAI 推出的 AI 视频创作平台，同时为人类创作者和 Agent 设计。Agent 通过 Skill 入口理解任务、调用模型并自动编排工作流。\n\n**平台核心能力：**\n- **生成**：文生图、文生视频、图生视频、视频续写\n- **编辑**：局部修改、元素替换、镜头调整、风格迁移\n- **复杂创作**：一句话生成完整短剧（剧本→分镜→成片）、复刻已有视频风格做 TVC\u002F宣传片、用音乐生成 MV、产品展示片制作\n- **模型**：Seedance 2.0、Kling 3.0\u002FO3、Wan 2.6、NanoBanana、Midjourney、Seedream 5.0 等顶级模型\n\n用户的所有创作和编辑需求都通过发送自然语言消息来完成，Agent 会自主编排工作流。复杂任务（短剧、MV）耗时较长，需耐心轮询。\n\n## 功能\n\n1. **创建会话 \u002F 发消息** - 创建新会话或向已有会话发送一条消息（如「生一个动漫视频」「把纸船换成爱心」）\n2. **查询会话进展** - 根据 sessionId 拉取该会话的消息列表，用于轮询生图\u002F生视频结果\n3. **切换项目** - 将当前 accessKey 绑定的项目切换到新项目，后续 create_session 将使用新 projectUuid\n4. **上传文件** - 上传图片或视频文件到 OSS，返回可访问的 OSS 地址（编辑已有视频\u002F图片时需要先上传）\n5. **下载结果** - 将会话中生成的图片\u002F视频批量下载到本地，自动提取 URL 并命名\n\n## 前置要求\n\n```bash\nexport LIBTV_ACCESS_KEY=\"your-access-key\"\n```\n\n可选：`OPENAPI_IM_BASE` 或 `IM_BASE_URL`，默认 `https:\u002F\u002Fim.liblib.tv`。\n\n无需安装额外依赖，仅使用 Python 标准库。\n\n## 使用方法\n\n### 1. 创建会话 \u002F 发送消息\n\n```bash\n# 创建新会话并发送「生一个动漫视频」\npython3 {baseDir}\u002Fscripts\u002Fcreate_session.py \"生一个动漫视频\"\n\n# 向已有会话发送消息\npython3 {baseDir}\u002Fscripts\u002Fcreate_session.py \"再生成一张风景图\" --session-id SESSION_ID\n\n# 只创建\u002F绑定会话，不发消息\npython3 {baseDir}\u002Fscripts\u002Fcreate_session.py\n```\n\n### 2. 查询会话进展\n\n```bash\n# 查询会话消息列表\npython3 {baseDir}\u002Fscripts\u002Fquery_session.py SESSION_ID\n\n# 增量拉取（只返回 seq 大于 N 的消息）\npython3 {baseDir}\u002Fscripts\u002Fquery_session.py SESSION_ID --after-seq 5\n\n# 附带项目地址（传入 create_session 返回的 projectUuid，结果中带 projectUrl）\npython3 {baseDir}\u002Fscripts\u002Fquery_session.py SESSION_ID --project-id PROJECT_UUID\n```\n\n### 3. 切换项目\n\n```bash\n# 切换当前 accessKey 绑定的项目（后续创建会话将使用新项目）\npython3 {baseDir}\u002Fscripts\u002Fchange_project.py\n```\n\n### 4. 上传文件\n\n当用户提供了参考的文件地址时，进行上传，仅支持图片、视频，文件大小必须在200M以下。\n\n```bash\n# 上传图片\npython3 {baseDir}\u002Fscripts\u002Fupload_file.py \u002Fpath\u002Fto\u002Fimage.png\n\n# 上传视频\npython3 {baseDir}\u002Fscripts\u002Fupload_file.py \u002Fpath\u002Fto\u002Fvideo.mp4\n```\n\n### 5. 下载结果\n\n生成完成后，可以将会话中的所有图片\u002F视频批量下载到本地。\n\n```bash\n# 从会话自动提取并下载所有结果\npython3 {baseDir}\u002Fscripts\u002Fdownload_results.py SESSION_ID\n\n# 指定输出目录\npython3 {baseDir}\u002Fscripts\u002Fdownload_results.py SESSION_ID --output-dir ~\u002FDesktop\u002Fmy_project\n\n# 指定文件名前缀（如 storyboard_01.png, storyboard_02.png ...）\npython3 {baseDir}\u002Fscripts\u002Fdownload_results.py SESSION_ID --prefix \"storyboard\"\n\n# 直接下载指定 URL 列表（不需要 session_id）\npython3 {baseDir}\u002Fscripts\u002Fdownload_results.py --urls URL1 URL2 URL3 --output-dir .\u002Foutput\n```\n\n## 典型工作流\n\n理解这些工作流，才能正确组合上面的脚本完成用户需求。\n\n### 场景 1：用户要求生成图片\u002F视频（最常见）\n\n```\n1. create_session.py \"用户的描述\"  →  拿到 sessionId + projectUuid\n2. 每隔 8 秒调用 query_session.py SESSION_ID --after-seq 0 轮询\n3. 检查 messages：当出现 assistant 角色的消息且包含图片\u002F视频 URL → 任务完成\n4. 自动下载：download_results.py SESSION_ID --output-dir ~\u002FDownloads\u002F项目名 --prefix 有意义的前缀\n5. 向用户展示：本地文件列表 + projectUrl（画布链接）\n```\n\n生成完成后**自动执行下载**，不需要用户额外请求。下载目录和前缀根据任务语义自动命名（如分镜用 `storyboard`，角色设定用 `character` 等）。\n\n### 场景 2：用户提供图片\u002F视频要求编辑修改（如\"把纸船换成爱心\"）\n\n```\n1. upload_file.py \u002Fpath\u002Fto\u002Fvideo.mp4  →  拿到 OSS URL\n2. create_session.py \"把四周的纸船都换成白色的纸爱心 参考视频：{oss_url}\"\n3. 后续同场景 1 的步骤 2-5\n```\n\n用户给了文件路径 + 编辑指令 = 先上传文件，再把编辑指令和 OSS URL 一起发送。\n\n### 场景 3：用户提供参考图\u002F视频要求生成新内容\n\n```\n1. upload_file.py \u002Fpath\u002Fto\u002Fref.png  →  拿到 OSS URL\n2. create_session.py \"根据参考图生成xxx，参考图：{oss_url}\"\n3. 后续同场景 1 的步骤 2-5\n```\n\n### 场景 4：在已有会话中追加新需求\n\n```\n1. create_session.py \"新的描述\" --session-id SESSION_ID\n2. 后续同场景 1 的步骤 2-5\n```\n\n### 轮询策略\n\n- **间隔**：每 8 秒查询一次\n- **增量拉取**：首次用 `--after-seq 0`，后续用上次拿到的最大 seq 值\n- **完成判断**：messages 中出现 assistant 消息且 content 包含结果 URL（图片\u002F视频地址）\n- **超时**：连续轮询 3 分钟仍无结果，告知用户\"生成时间较长，可稍后通过项目画布链接查看\"，不再继续轮询\n- **错误重试**：单次查询失败可重试 1 次，连续 3 次失败则停止并告知用户\n\n## 输出格式\n\n**create_session** 返回：\n```json\n{\n  \"projectUuid\": \"aa3ba04c5044477cb7a00a9e5bf3b4d0\",\n  \"sessionId\": \"90f05e0c-...\",\n  \"projectUrl\": \"https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=aa3ba04c5044477cb7a00a9e5bf3b4d0\"\n}\n```\n\n**query_session** 返回：\n```json\n{\n  \"messages\": [\n    {\"id\": \"msg-xxx\", \"role\": \"user\", \"content\": \"生一个动漫视频\"},\n    {\"id\": \"msg-yyy\", \"role\": \"assistant\", \"content\": \"...\"}\n  ],\n  \"projectUrl\": \"https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=...\"\n}\n```\n（`projectUrl` 仅在传入 `--project-id` 时存在）\n\n**change_project** 返回：\n```json\n{\n  \"projectUuid\": \"新项目UUID\",\n  \"projectUrl\": \"https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=新项目UUID\"\n}\n```\n\n**upload_file** 返回：\n```json\n{\n  \"url\": \"https:\u002F\u002Flibtv-res.liblib.art\u002Fclaw\u002F{projectUuid}\u002F{uuid}.png\"\n}\n```\n\n**download_results** 返回：\n```json\n{\n  \"output_dir\": \"\u002FUsers\u002Fxxx\u002FDownloads\u002Flibtv_results\",\n  \"downloaded\": [\"\u002FUsers\u002Fxxx\u002FDownloads\u002Flibtv_results\u002F01.png\", \"...\"],\n  \"total\": 9\n}\n```\n\n## 最终向用户展示时（OpenClaw）\n\n- **视频地址**：来自 `query_session` 返回的 `messages` 中 assistant 消息的 content 或结果里的视频\u002F图片 URL，即「返回的结果」。\n- **项目地址**：使用 `create_session` 返回的 `projectUrl`，或自行拼接 `https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=` + `projectUuid`。查询进展时若传入 `--project-id PROJECT_UUID`，`query_session` 会直接返回 `projectUrl`，便于一并展示。\n\n在任务完成时，同时给出：**视频\u002F图片结果链接** + **项目画布链接（projectUrl）**。\n过程中，不要给出 **项目画布链接（projectUrl）**。\n\n## 核心原则：用户侧不做创作，只做传话\n\n你（用户侧 Agent）的职责是**搬运工**，不是创作者。后端有专门的 Agent 负责理解需求、拆解分镜、编排工作流、选模型、写 prompt。你要做的只有三件事：\n\n1. **上传**：用户给了本地文件 → `upload_file.py` 拿到 OSS URL\n2. **传话**：把用户的原始描述 + OSS URL 原封不动发给 `create_session.py`\n3. **取件**：轮询结果 → 下载到本地 → 展示给用户\n\n**绝对不要做的事：**\n- 不要替用户扩写、润色、翻译 prompt（用户说\"帮我推演分镜\"，就直接传\"帮我推演分镜\"，不要自己先写个分镜表再逐条发）\n- 不要自行拆解任务步骤（如把\"生成9张分镜图\"拆成9次独立请求）\n- 不要自行编排镜头描述、剧情推演、风格分析\n- 不要在消息中添加自己编的 prompt（如\"超写实风格，电影级光影，8K分辨率\"之类的描述词）\n\n后端 Agent 对模型能力、参数配置、prompt 工程远比用户侧更专业。用户侧越俎代庖只会降低生成质量，换个弱模型更是灾难。\n\n**正确示例：**\n```\n用户说：「帮我推演后续的故事，来个分镜大爆炸，帮我出一个16:9的九宫格的图。新建一个任务。」\n用户给了参考图：\u002Fpath\u002Fto\u002Fref.png\n\n→ upload_file.py \u002Fpath\u002Fto\u002Fref.png  →  拿到 oss_url\n→ create_session.py \"帮我推演后续的故事，来个分镜大爆炸，帮我出一个16:9的九宫格的图。参考图：{oss_url}\"\n→ 轮询 → 下载 → 展示\n```\n\n**错误示例：**\n```\n❌ 用户侧自己先写了个九宫格分镜表（对峙、交锋、危机...）\n❌ 然后把自己编的描述发给后端\n❌ 或者拆成9次 create_session 分别发送\n```\n\n## 注意事项\n\n- 鉴权方式为请求头 `Authorization: Bearer \u003CLIBTV_ACCESS_KEY>`\n- 创建会话时若不传 `message`，仅创建\u002F绑定会话，不会调用 SendMessage\n- 查询会话时可用 `--after-seq` 做增量拉取，便于轮询新消息（含 assistant 回复与生图\u002F生视频结果）\n- 项目画布地址固定为：`https:\u002F\u002Fwww.liblib.tv\u002Fcanvas?projectId=` + projectUuid\n- 切换项目后，Redis 缓存会更新，下次 create_session 将使用新的 projectUuid\n- 上传文件仅支持图片（image\u002F*）和视频（video\u002F*）类型，其他类型会被拒绝，文件大小须在 200MB 以下\n- 上传返回的 OSS 地址格式为 `https:\u002F\u002Flibtv-res.liblib.art\u002Fclaw\u002F{projectUuid}\u002F{uuid}{ext}`\n- 生成过程中只告知用户\"正在生成中\"，不要提前给出 projectUrl；任务完成后再同时给出：**结果链接（图片\u002F视频 URL）** + **项目画布链接（projectUrl）**\n",{"name":5,"metadata":50,"description":7,"user-invocable":57},{"openclaw":51},{"emoji":52,"requires":53,"primaryEnv":55},"?",{"env":54,"bins":56},[55],"LIBTV_ACCESS_KEY",[39],true,"main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":68,"prompt":78,"zipAvailable":57},[69,72,75],{"tool":70,"command":71},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill libtv-skill",{"tool":73,"command":74},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill libtv-skill",{"tool":76,"command":77},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill libtv-skill","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002FSKILL.md",[80,86,90,94,98,102,106],{"path":81,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":84,"sourceHtmlUrl":85},"scripts\u002F_common.py","SCRIPT","脚本",3294,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002Fscripts\u002F_common.py",{"path":87,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":88,"sourceHtmlUrl":89},"scripts\u002Fchange_project.py",680,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002Fscripts\u002Fchange_project.py",{"path":91,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":92,"sourceHtmlUrl":93},"scripts\u002Fcreate_session.py",1914,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002Fscripts\u002Fcreate_session.py",{"path":95,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":96,"sourceHtmlUrl":97},"scripts\u002Fdownload_results.py",5215,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002Fscripts\u002Fdownload_results.py",{"path":99,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":100,"sourceHtmlUrl":101},"scripts\u002Fquery_session.py",1667,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002Fscripts\u002Fquery_session.py",{"path":103,"resourceType":82,"resourceTypeDesc":83,"sizeBytes":104,"sourceHtmlUrl":105},"scripts\u002Fupload_file.py",3521,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002Fscripts\u002Fupload_file.py",{"path":107,"resourceType":108,"resourceTypeDesc":109,"sizeBytes":110,"sourceHtmlUrl":111},"skill-report.json","REFERENCE","参考文档",11959,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Flibtv-labs\u002Flibtv-skill\u002Fskill-report.json",[113,123,133,142,148,155],{"skillNo":114,"name":115,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":116,"categories":117,"keywords":119,"publishedAt":45},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[118],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[120,121,122],"model","model hierarchy","model hierarchy skill",{"skillNo":124,"name":125,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":126,"categories":127,"keywords":129,"publishedAt":45},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[128],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[130,131,132],"MCP","zoom","zoom mcp",{"skillNo":134,"name":135,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":45},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[139,140,141,131],"sdk","zoom apps sdk","apps",{"skillNo":143,"name":144,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":145,"categories":146,"keywords":147,"publishedAt":45},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[144],{"skillNo":149,"name":150,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":151,"categories":152,"keywords":154,"publishedAt":45},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[153],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[150],{"skillNo":156,"name":157,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":158,"categories":159,"keywords":160,"publishedAt":45},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[157]]