{"id":"415f4b21-650f-4dfc-83b9-67345b043b5a","entityType":"agent","slug":"clawhub-chenjun198711-book-video-generator-en","name":"Book Video Generator En","canonicalUrl":"https://www.xpersona.co/agent/clawhub-chenjun198711-book-video-generator-en","canonicalPath":"/agent/clawhub-chenjun198711-book-video-generator-en","generatedAt":"2026-10-09T22:15:08.999Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:38:35.164Z","emptyReason":null},"description":"Generates a 3-minute English video summarizing any book by creating script, storyboard, AI illustrations, TTS narration, subtitles, and final MP4 automatically.","descriptionLabel":"Source description","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 2.8K downloads reported by the source. Last updated 10/9/2026.","installCommand":"clawhub skill install s17a48tchm7k3vgry0mm17137n83hnzn:book-video-generator-en","sourceUrl":"https://clawhub.ai/chenjun198711/book-video-generator-en","homepage":"https://clawhub.ai/chenjun198711/skills/book-video-generator-en","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/chenjun198711/book-video-generator-en","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/chenjun198711/skills/book-video-generator-en","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":69,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Book Video Generator En technical dossier on Xpersona with agent coverage, OPENCLEW support, and live trust metadata."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:38:35.164Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:38:35.164Z","emptyReason":null},"stars":null,"forks":null,"downloads":2767,"packageName":null,"latestVersion":"0.1.0","tractionLabel":"2.8K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:38:35.164Z","emptyReason":null},"lastUpdatedAt":"2026-10-09T11:38:35.164Z","lastCrawledAt":"2026-10-09T11:38:35.164Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-10T11:38:35.164Z","lastVerifiedAt":null,"highlights":[{"version":"0.1.0","createdAt":"2026-07-30T02:55:17.397Z","changelog":"- Initial public release of the English 3-minute book digest video generator. - Automatically generates a 3-minute book review video from book title and author: script, storyboard, AI illustrations, English TTS narration, subtitles, and final MP4. - Supports multiple platforms and AI/image generation models; switchable via environment variables. - Includes default and alternative engines for image generation (Tencent Hunyuan, Volcano Seedream, Google Gemini, Agnes) and TTS (Volcano Engine, edge-tts). - Fully automated workflow with clear environment setup and cross-platform compatibility (WorkBuddy, OpenClaw, Codex CLI, TRAE Work).","fileCount":18,"zipByteSize":76019}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17a48tchm7k3vgry0mm17137n83hnzn:book-video-generator-en","setupComplexity":"low","setupSteps":["Install using `clawhub skill install s17a48tchm7k3vgry0mm17137n83hnzn:book-video-generator-en` in an isolated environment before connecting it to live workloads.","No published capability contract is available yet, so validate auth and request/response behavior manually.","Review the upstream CLAWHUB listing at https://clawhub.ai/chenjun198711/book-video-generator-en before using production credentials."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-09T22:15:08.996Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-chenjun198711-book-video-generator-en/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-09T11:38:35.164Z","emptyReason":null},"readme":"Skill: Book Video Generator En\n\nOwner: chenjun198711\n\nSummary: Generates a 3-minute English video summarizing any book by creating script, storyboard, AI illustrations, TTS narration, subtitles, and final MP4 automatically.\n\nTags: latest:0.1.0\n\nVersion history:\n\nv0.1.0 | 2026-07-30T02:55:17.397Z | auto\n\n- Initial public release of the English 3-minute book digest video generator.\n- Automatically generates a 3-minute book review video from book title and author: script, storyboard, AI illustrations, English TTS narration, subtitles, and final MP4.\n- Supports multiple platforms and AI/image generation models; switchable via environment variables.\n- Includes default and alternative engines for image generation (Tencent Hunyuan, Volcano Seedream, Google Gemini, Agnes) and TTS (Volcano Engine, edge-tts).\n- Fully automated workflow with clear environment setup and cross-platform compatibility (WorkBuddy, OpenClaw, Codex CLI, TRAE Work).\n\nArchive index:\n\nArchive v0.1.0: 18 files, 76019 bytes\n\nFiles: .gitignore (422b), assets (0b), assets/README.md (1610b), index.html (3863b), LICENSE (1056b), README.md (3445b), references (0b), references/CROSS_PLATFORM.md (7645b), references/prompts.md (8391b), references/workflow-original.yaml (189461b), scripts (0b), scripts/compose_video.py (38645b), scripts/generate_audio.py (13378b), scripts/generate_cover.py (9198b), scripts/generate_image.py (20347b), skill-card.md (2806b), SKILL.md (18806b), _meta.json (142b)\n\nFile v0.1.0:SKILL.md\n\n---\nname: book-video-generator-en\nslug: book-video-generator-en\nversion: 1.0.0\ndisplayName: 三分钟精读一本书英文版\ndescription: English 3-minute book digest video generator. Input a book title + author, one-click generate a 3-minute book review video (review script → storyboard → AI illustrations → English TTS narration → subtitles → final MP4). Trigger words: book video, 3 minute book summary, read a book in 3 minutes, book digest, make a book video. Cross-platform compatible with WorkBuddy / OpenClaw / Codex CLI / TRAE Work.\n---\n\n# 3-Minute Book Digest — English Version\n\n## Overview\n\nAutomatically turn any book into a 3-minute explainer video: from writing the\nreview script, splitting it into storyboards, AI illustration, English TTS\nnarration, to subtitle compositing — fully automated.\n\nDerived from the Coze workflow \"Pipadushu_video_1\". This Skill follows the\n[Agent Skills open standard](https://agentskills.io) and is cross-platform\ncompatible with WorkBuddy, OpenClaw, Codex CLI, and TRAE Work.\n\nIt replaces Coze plugins with local open-source tools: 剪映小助手 (Jianying\nassistant) → ffmpeg, Coze image generation → multi-model image generation\n(default ImageGen + alternatives Volcano Seedream / Gemini / Agnes), Coze TTS →\nVolcano Engine TTS (default) / edge-tts (fallback). All script, narration,\non-screen text, and prompts are **fully in English**.\n\n## Platform Tool Mapping\n\nThis Skill's workflow involves 3 platform-related tools. Pick the matching tool\nfor the platform you are running on.\n\n### Web Search (Stage 1 — search for book info)\n\n| Platform | Tool | Notes |\n|----------|------|-------|\n| WorkBuddy | `WebSearch` | Built-in tool, call directly |\n| OpenClaw | built-in web search | Auto-available |\n| Codex CLI | `shell: curl` or search MCP | Use shell commands or install a search MCP |\n| TRAE Work | built-in web search | Auto-available |\n\n### Image Generation (Stage 4a — storyboard illustrations)\n\nProvides **1 default + 3 alternatives**. Switch via the `IMAGE_API` env var:\n\n| Plan | Tool | Model | Env var | Notes |\n|------|------|-------|---------|-------|\n| 🏠 **Default** | `ImageGen` | Tencent Hunyuan (WorkBuddy built-in) | none | Call `DeferExecuteTool` directly in WorkBuddy |\n| 🏔️ Alt | `volcengine` | Volcano Seedream 5.0 lite (ByteDance) | `ARK_API_KEY` (recommended) or `VOLCENGINE_AK` + `VOLCENGINE_SK` | Original Coze image model; best for flat Chinese/English style, supports watermark removal |\n| 🤖 Alt | `gemini` | Google Gemini 3 Pro Image | `GEMINI_API_KEY` | Rich detail, strong semantic understanding |\n| ✨ Alt | `agnes` | Agnes AI (completely free) | `AGNES_API_KEY` | Free registration, OpenAI-compatible API |\n\n**Switching**:\n- **WorkBuddy**: uses `ImageGen` by default. To switch, set `IMAGE_API=volcengine|gemini|agnes`, the script auto-calls `scripts/generate_image.py`.\n- **CLI platforms** (Codex CLI / OpenClaw): run `scripts/generate_image.py --api <plan>` directly.\n\n> On every platform, the image prompt uses the `desc_promopt` field from the storyboard.\n\n### LLM Calls (Stages 1-3 — script & storyboard)\n\nEvery platform has built-in LLM chat. Simply send the System Prompts from\n`references/prompts.md` to the current platform's LLM.\n\n## Input\n\n| Param | Description | Required |\n|-------|-------------|----------|\n| `book_name` | Book title | Yes |\n| `author_name` | Author name | Yes |\n| `ip_name` | Account name (bottom watermark on cover) | No, hidden by default |\n\n## Environment Setup\n\nEnsure these Python dependencies are installed before running:\n\n```bash\npip install edge-tts imageio-ffmpeg pillow\n```\n\n> Scripts auto-install missing dependencies on first run, but pre-installing avoids interruptions.\n\n`ffmpeg` is provided automatically by the `imageio-ffmpeg` package — no separate system ffmpeg needed.\n\n### TTS Engine Config (optional)\n\n| Engine | Credential | Timestamps | Notes |\n|--------|-----------|-----------|-------|\n| Volcano Engine TTS (default) | `VOLC_TTS_API_KEY` | Estimated from audio duration | Doubao Speech 2.0, best English naturalness, commercial use, get API Key from [Volcano console](https://console.volcengine.com/speech/new) |\n| edge-tts (fallback) | none | Native WordBoundary | Microsoft free TTS, works out of the box, auto-fallback when no credential |\n\nSet the Volcano credential:\n```bash\nexport VOLC_TTS_API_KEY=\"your-api-key\"\n```\n\n> When `VOLC_TTS_API_KEY` is not set, the script auto-uses edge-tts — fully functional.\n> Default English voice: `en-US-AriaNeural` (edge-tts) / `en_us_amy` (Volcano). See `scripts/generate_audio.py --list-voices`.\n\n## Full Workflow (5 stages)\n\n### Stage 1: Generate the review script\n\n**Goal**: From book title + author, use the LLM to produce a ~1000-word, 3-minute video script.\n\n**Steps**:\n1. Use the platform's **web search tool** to find real book info (summary, interpretations, publication year).\n2. Use the system prompt (see `references/prompts.md` §1) and ask the LLM to output JSON:\n\n```json\n{\n  \"book_name\": \"...\",\n  \"author_name\": \"...\",\n  \"year\": \"yyyy-MM\",\n  \"content\": \"1000+ word book review script (hook intro + core content + key insights)\",\n  \"category\": \"Book category\"\n}\n```\n\n**Notes**:\n- Script should fit ~3 minutes of spoken narration (~450-650 words).\n- The opening hook must be highly compelling.\n- Source info via search to ensure accuracy.\n\n### Stage 2: Generate the storyboard\n\n**Goal**: Split the review script into 8-50 storyboard shots, each with subtitle text, visual description, and an AI image prompt.\n\n**Steps**:\nUse the system prompt (`references/prompts.md` §2), feed in Stage 1's `content`, output:\n```json\n{\n  \"list\": [\n    {\n      \"story_name\": \"Shot name\",\n      \"desc\": \"Visual description\",\n      \"cap\": \"Subtitle text (one sentence)\",\n      \"desc_promopt\": \"Image generation prompt (English)\"\n    }\n  ],\n  \"keywords\": [\"keyword1\", \"keyword2\"]\n}\n```\n\nThen insert the intro shot at the beginning of `list` (mirrors the original workflow node 150774):\n```python\nlist.insert(0, {\n    \"story_name\": \"Intro\",\n    \"desc\": \"Read one book every day\",\n    \"cap\": f\"Read a book in 3 minutes. Today we're reading {book_name} by {author_name}.\",\n    \"desc_promopt\": \"A person reading a book, flat illustration style\"\n})\n```\n\n**Style constraints**: flat illustration, cartoon character with clean lines, flat symbolic background, soft bright low-saturation palette.\n\n### Stage 3: Generate the title progress bar\n\n**Goal**: Split the script into 4 sections, each with a title of ≤6 words, shown as a progress bar at the top of the video.\n\n**Steps**:\nUse the system prompt (`references/prompts.md` §3), output 4 titles (title1-title4).\n\n**Usage**: The 4 titles are passed to `compose_video.py` via the `chapter_titles` field in `segments.json`, rendered as a top progress bar (current section highlighted in orange + bottom progress line). Also need `segment_chapters` specifying each shot's section index (0-3); auto-distributed evenly if omitted.\n\nExample: `[\"Introduction\", \"Core Ideas\", \"Practical Tips\", \"Conclusion\"]`\n\n### Stage 4: Generate assets (in parallel)\n\nThis stage generates all assets the video needs:\n\n#### 4a. AI illustration generation\n\nFor each shot's `desc_promopt`, call the image generation tool. **Defaults to WorkBuddy's built-in `ImageGen` (Tencent Hunyuan); switch via `IMAGE_API` env var.**\n\n**Unified style params** (from the original workflow's image node):\n- Size: 1024x768\n- Style: flat illustration\n- Protagonist top #FF7F72, pants #243139\n- 30% transparent glass effect background\n- Negative prompt: none\n\n**Plan selection & invocation**:\n\n| Plan | `IMAGE_API` value | Invocation | Config needed |\n|------|-------------------|-----------|---------------|\n| 🏠 Tencent Hunyuan (default) | unset or `imagegen` | WorkBuddy built-in `ImageGen` tool | none |\n| 🏔️ Volcano Seedream | `volcengine` | `python3 scripts/generate_image.py --api volcengine` | `ARK_API_KEY` (recommended) or `VOLCENGINE_AK` + `VOLCENGINE_SK` |\n| 🤖 Google Gemini | `gemini` | `python3 scripts/generate_image.py --api gemini` | `GEMINI_API_KEY` |\n| ✨ Agnes AI | `agnes` | `python3 scripts/generate_image.py --api agnes` | `AGNES_API_KEY` |\n\n**Execution logic**:\n1. If running in **WorkBuddy** and `IMAGE_API` is unset: call the `ImageGen` tool (DeferExecuteTool) directly, `prompt` = desc_promopt, `size` = \"1024x768\".\n2. If `IMAGE_API=volcengine|gemini|agnes`: call `scripts/generate_image.py`, auto-install deps and generate via API.\n3. If running on a **CLI platform** (Codex CLI, etc.): default `scripts/generate_image.py --api gemini`.\n\n> Generated images are named `scene_000.png` ~ `scene_NNN.png`, stored in `output/{book_name}/images/`.\n\n#### 4b. TTS voice synthesis\n\nFor each shot's `cap` (subtitle text), use the TTS engine to generate MP3 audio plus word-level timestamps (saved as a sibling `.words.json` for precise per-line subtitle sync in Stage 5).\n\n**Dual-engine architecture**:\n- **Volcano Engine TTS** (default): V1 API + X-Api-Key auth, Doubao Speech 2.0 voice, best English naturalness, commercial use, requires `VOLC_TTS_API_KEY`.\n- **edge-tts** (fallback): free, no config, native WordBoundary word timestamps, auto-fallback when no Volcano credential.\n\n**Default voices**:\n- Volcano: `en_us_amy` (English female, warm — good for book narration)\n- edge-tts: `en-US-AriaNeural` (Aria, female)\n\nList all available voices: `python3 scripts/generate_audio.py --list-voices`\n\nRun (all platforms, auto engine selection):\n```bash\npython3 scripts/generate_audio.py --text \"<subtitle>\" --output \"audio_001.mp3\"\n```\n\nSpecify engine or voice:\n```bash\n# Force Volcano\npython3 scripts/generate_audio.py --text \"<subtitle>\" --output \"audio_001.mp3\" --engine volcano --voice en_us_amy\n\n# Force edge-tts\npython3 scripts/generate_audio.py --text \"<subtitle>\" --output \"audio_001.mp3\" --engine edge --voice en-US-AriaNeural\n```\n\nBatch mode:\n```bash\npython3 scripts/generate_audio.py --batch captions.json --output-dir audio/ --voice \"en-US-AriaNeural\"\n```\n\n#### 4c. Opening cover image\n\nGenerate a dedicated cover image (1920x1080) for the first frame, with book title, author, and brand text.\n\n**Steps**: run `python3 scripts/generate_cover.py`\n\n```bash\n# Use first storyboard image as blurred background (recommended, consistent style)\npython3 scripts/generate_cover.py \\\n  --book-name \"Atomic Habits\" \\\n  --author \"James Clear\" \\\n  --output output/Atomic_Habits/images/cover.png \\\n  --bg output/Atomic_Habits/images/scene_000.png\n\n# No background image, use deep-blue gradient\npython3 scripts/generate_cover.py \\\n  --book-name \"Atomic Habits\" \\\n  --author \"James Clear\" \\\n  --output output/Atomic_Habits/images/cover.png\n```\n\n**Cover layout**:\n- Top: \"3-MINUTE BOOK DIGEST\" brand text + orange divider line (#FF7F72, matches protagonist's top)\n- Middle: book title (large, auto-wrapped, centered, 80pt)\n- Lower-middle: author name (42pt)\n- Bottom: account-name watermark (**optional**, via `--ip-name`; hidden if omitted)\n\n**Fonts**: auto-detects a system English font (Windows: Arial / macOS: Helvetica / Linux: DejaVu Sans) — no manual change needed.\n\n> The cover image is specified via the `cover` field in `segments.json` at Stage 5; it shows for `cover_duration` seconds (default 5) before the first shot, then switches back to the original shot image (narration continues uninterrupted).\n>\n> ```json\n> {\n>   \"output\": \"output/BookName_3min_digest.mp4\",\n>   \"cover\": \"output/BookName/images/cover.png\",\n>   \"chapter_titles\": [\"Introduction\", \"Core Ideas\", \"Practical Tips\", \"Conclusion\"],\n>   \"segment_chapters\": [0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3],\n>   \"keywords\": [\"Atomic Habits\", \"tiny changes\", \"compound effect\"],\n>   \"bgm\": \"assets/bgm_reading.mp3\",\n>   \"bgm_volume\": 0.15,\n>   \"transition_sound\": \"assets/transition_page_flip.mp3\",\n>   \"transition_interval\": 3,\n>   \"transition_volume\": 0.3,\n>   \"segments\": [\n>     {\"image\": \"images/scene_000.png\", \"audio\": \"audio/audio_000.mp3\", \"caption\": \"Subtitle text\"},\n>     ...\n>   ]\n> }\n> ```\n> - `cover`: optional, cover image path, shown for `cover_duration` seconds before the first shot\n> - `cover_duration`: optional, cover display time (seconds), default 5.0\n> - `chapter_titles`: optional, section titles for the top progress bar\n> - `segment_chapters`: optional, each shot's section index (0-based); auto-distributed evenly if omitted\n> - `keywords`: optional, keyword list; matched keywords in subtitles show in orange\n> - `bgm`: optional, background music path; auto-looks for `assets/bgm_reading.mp3`; pass empty string to disable\n> - `bgm_volume`: optional, BGM volume (0.0-1.0), default 0.15\n> - `transition_sound`: optional, transition sound path; auto-looks for `assets/transition_page_flip.mp3`; pass empty string to disable\n> - `transition_interval`: optional, add a transition sound every N shots, default 3\n> - `transition_volume`: optional, transition sound volume (0.0-1.0), default 0.3\n\n### Stage 5: Video composition\n\n**Goal**: Compose all assets into the final MP4 video.\n\n**Steps**: run `python3 scripts/compose_video.py`, which:\n1. Computes each shot's duration (based on TTS audio duration + gap interval)\n2. Scales/crops images to 1920x1080 (16:9)\n3. Adds a **0.3s fade in/out transition** (dip-to-black) per shot\n4. Uses ffmpeg to compose image + audio into video clips\n5. **Progress bar overlay**: top shows section titles (current section orange highlight + filled dot, others gray + hollow dot), bottom progress line shows overall playback progress\n6. Generates **per-line single-line ASS subtitles** (precise sync via TTS word timestamps, split into short single lines by punctuation + word count, white bold text + black outline, **orange keyword highlight**, **fade-in + slide-up entrance / fade-out exit animation**)\n7. Concatenates all clips into the full video\n8. **Audio mix**: blends background music (BGM) at low volume throughout + a page-flip transition sound every 3 shots at the boundary\n\n**Subtitle params** (corresponds to original workflow add_captions_1 node):\n- Font color: white (#FFFFFF)\n- Keyword highlight: orange (#FF7F72), via ASS inline color tag `{\\c&H727FFF&}`\n- Outline color: black (#000000)\n- Font size: 64pt (bold)\n- Position: bottom center (MarginV=30)\n- Font: **auto-detected** system English font (Windows: Arial / macOS: Helvetica / Linux: DejaVu Sans), no manual change\n- Subtitle format: **ASS** (Advanced SubStation Alpha), supports inline color + animation tags\n- **Per-line single-line display**: uses TTS word timestamps to split long subtitles into short single lines synced to speech\n- **Entrance animation**: fade in 200ms + slide up 20px from below (ASS `\\fad` + `\\move`)\n- **Exit animation**: fade out 150ms (ASS `\\fad`)\n\n**Progress bar params**:\n- Position: top of frame (80px height)\n- Background: semi-transparent dark (alpha=130)\n- Current section: orange (#FF7F72) text + filled dot\n- Other sections: gray (#AAAAAA) text + hollow dot\n- Bottom progress line: orange fill + dark-gray base, shows overall progress\n- Font: auto-detected system English font, 44pt\n\n**Dynamic effect params**:\n- Transition fade duration: 0.3s (auto-halved for shots shorter than 0.6s)\n\n**Audio mix params**:\n- Background music: `assets/bgm_reading.mp3` (3:56 reading BGM, auto-loop), volume 0.15\n- Transition sound: `assets/transition_page_flip.mp3` (0.71s page-flip), triggered 0.5s before the end of every 3rd shot, volume 0.3\n- Mix method: ffmpeg `amix` filter, BGM loop + transition sounds overlaid at time points via `adelay`\n\n> **📌 Audio assets are optional**: Because SkillHub does not support uploading .mp3 files, audio assets are not bundled. If these files are missing from `assets/`, the video still generates fine (just without BGM and transition sounds). To add them, see `assets/README.md`.\n\n### Output\n\nFinal output: `output/{book_name}_3min_digest.mp4`\n\n## Cross-Platform Installation\n\n### WorkBuddy\n\nThe skill is installed at `~/.workbuddy/skills/book-video-generator-en/`, ready to use.\n\n### OpenClaw\n\n```bash\n# Copy to OpenClaw skills dir\ncp -r ~/.workbuddy/skills/book-video-generator-en ~/.openclaw/skills/\n\n# Or install via ClawHub (if published)\nopenclaw skills install book-video-generator-en\n```\n\n### Codex CLI\n\n```bash\n# 1. Enable Skills (if not yet)\necho '[features]\\nskills = true' >> ~/.codex/config.toml\n\n# 2. Copy skill dir\ncp -r ~/.workbuddy/skills/book-video-generator-en ~/.codex/skills/\n\n# 3. Restart Codex CLI\n# 4. Type /skills to confirm the skill loaded\n```\n\n### TRAE Work\n\n```\n1. Open TRAE Work → Rules & Skills → Skills → Create → Import files\n2. Upload SKILL.md\n3. Copy scripts/ and references/ into the skill dir\n```\n\n## Original Workflow Reference\n\nThe original Coze workflow file is at `references/workflow-original.yaml`, a full chain of 30+ nodes:\n```\nStart → LLM (DeepSeek V3.2) generate review → Title summary → Storyboard visual description\n→ Code concat intro → Batch image gen + cutout → TTS voice synthesis\n→ Create Jianying draft → Batch add images/subtitles/audio → Save draft → End\n```\n\nThe original flow relied on the **Jianying assistant plugin** (video composition core) and Coze's built-in **image generation + cutout** and **TTS** plugins.\nThis Skill replaces them with ffmpeg, edge-tts, and the platform's image generation tools.\n\n## Quick Usage Example\n\nUser says: \"Generate a 3-minute digest video of Atomic Habits by James Clear\"\n\nExecution flow:\n1. Search \"Atomic Habits James Clear summary review\"\n2. Generate review script with Stage 1 prompt\n3. Generate storyboard with Stage 2 prompt\n4. Generate title progress bar with Stage 3 prompt\n5. For each shot: image generation tool creates illustration + TTS generates English narration (Volcano default / edge-tts fallback)\n6. compose_video.py composes the final video\n7. Output `output/Atomic_Habits_3min_digest.mp4`\n\n## Resource Files\n\n- `references/prompts.md` — all LLM prompt sources (platform-independent, reusable)\n- `references/workflow-original.yaml` — original Coze workflow (full YAML backup)\n- `scripts/compose_video.py` — video composition script (pure Python + ffmpeg, cross-platform, with fade transitions + auto font detection + cover support + per-line single-line ASS subtitles with precise sync + keyword highlight + entrance/exit animations + top progress bar + BGM mix + transition sounds)\n- `scripts/generate_audio.py` — TTS voice script (pure Python, dual engine: Volcano TTS V1 API + X-Api-Key default / edge-tts fallback, with word timestamps, auto engine switch by credential)\n- `scripts/generate_cover.py` — cover image script (pure Python + Pillow, auto-wrap + blurred background + auto font detection)\n- `scripts/generate_image.py` — image generation script (Volcano / Gemini / Agnes / OpenAI / Stability / local SD)\n\nFile v0.1.0:assets/README.md\n\n# 素材文件说明\n\n本目录用于存放视频合成的可选音频素材。**这些文件是可选的**——如果缺失，视频仍可正常生成，只是没有背景音乐和转场音效。\n\n## 所需文件\n\n| 文件名 | 用途 | 大小 | 必需性 |\n|--------|------|------|--------|\n| `bgm_reading.mp3` | 背景音乐（全程循环，音量0.15） | ~9MB | 可选 |\n| `transition_page_flip.mp3` | 转场音效（翻页声，每3个分镜触发） | ~3KB | 可选 |\n\n## 获取方式\n\n### 方式1：自行下载免费素材\n\n- **BGM**：从 [Pixabay Music](https://pixabay.com/music/) 或 [Free Music Archive](https://freemusicarchive.org/) 下载轻柔的阅读背景音乐，重命名为 `bgm_reading.mp3`\n- **翻页音效**：从 [Pixabay Sound Effects](https://pixabay.com/sound-effects/) 搜索 \"page flip\" 或 \"page turn\"，下载后重命名为 `transition_page_flip.mp3`\n\n### 方式2：用 ffmpeg 生成简单音效\n\n```bash\n# 生成一个简单的翻页音效（白噪声+衰减）\nffmpeg -f lavfi -i \"anoisesrc=d=0.15:c=pink:a=0.5\" -af \"afade=t=in:st=0:d=0.02,afade=t=out:st=0.1:d=0.05\" assets/transition_page_flip.mp3\n```\n\n### 方式3：从 GitHub 仓库获取\n\n如果本技能有对应的 GitHub 仓库，可以从仓库的 `assets/` 目录下载这些文件。\n\n## 代码处理逻辑\n\n`compose_video.py` 中的 `_find_asset()` 函数会按以下顺序查找：\n1. 脚本同级 `assets/` 目录\n2. 脚本父级 `assets/` 目录（技能根目录）\n3. 脚本同级目录\n\n如果找不到文件，`mix_audio()` 函数会自动跳过混音步骤，直接输出仅含 TTS 旁白的视频。\n\nFile v0.1.0:README.md\n\n# 3-Minute Book Digest (English Version)\n\nAn English fork of the **三分钟精读一本书** book-video generator. Given a book\ntitle + author, it produces a ~3-minute book-explainer video entirely in English:\nreview script → storyboard → AI illustrations → English TTS narration → subtitles → MP4.\n\n## What's different from the Chinese version\n\n| Area | Chinese version | This version (`book-video-generator-en`) |\n|------|-----------------|------------------------------------------|\n| Review script / storyboard prompts | Chinese (`references/prompts.md`) | **English** |\n| On-screen text (subtitles, chapter titles, cover) | Chinese | **English** |\n| TTS narration | Chinese voices (`zh_female_zhixingnv…` / `zh-CN-XiaoxiaoNeural`) | **English voices** (`en_us_amy` / `en-US-AriaNeural`) |\n| Cover brand text | \"3 分钟精读一本书\" | \"3-MINUTE BOOK DIGEST\" |\n| Fonts | Microsoft YaHei / PingFang / Noto CJK | Arial / Helvetica / DejaVu Sans |\n| Subtitle line length | ~16 chars/line | ~42 chars/line, word-boundary wrapping |\n| Output file | `{book}_三分钟精读书.mp4` | `{book}_3min_digest.mp4` |\n\n## Workflow\n\n1. **Stage 1** — LLM writes a ~1000-word English review script (web-search backed).\n2. **Stage 2** — LLM splits it into 8–50 storyboard shots (caption + visual + image prompt).\n3. **Stage 3** — LLM derives 4 ≤6-word section titles for the progress bar.\n4. **Stage 4** — generate illustrations (ImageGen / Volcano / Gemini / Agnes), English TTS audio, and the opening cover.\n5. **Stage 5** — `compose_video.py` composites everything into the final MP4.\n\nSee `SKILL.md` for the full guide, and `references/CROSS_PLATFORM.md` for\ninstall + tool-adaptation steps on OpenClaw, Codex CLI, TRAE Work, Claude Code, etc.\n\n## Requirements\n\n```bash\npip install edge-tts imageio-ffmpeg pillow\n```\n\n- TTS: edge-tts works out of the box (no key). Set `VOLC_TTS_API_KEY` to use Volcano Engine TTS instead.\n- Image generation: WorkBuddy uses the built-in `ImageGen` by default; CLI platforms use `scripts/generate_image.py` with `IMAGE_API`.\n- Background music / transition SFX in `assets/` are optional.\n\n## Troubleshooting\n\n- **Stage 5 `compose_video.py` exits 1 with no traceback (silent kill).** The\n  full ~3-minute 1080p re-encode is memory/CPU heavy and gets killed by the\n  Bash sandbox. Run it with the sandbox bypassed (local ffmpeg only, no network\n  needed): `python scripts/compose_video.py < segments.json` executed outside the\n  sandbox. Or raise the sandbox resource limits before running.\n- **Two image generations failed with `RequestLimitExceeded.JobNumExceed`.**\n  The image provider caps concurrent jobs; just retry the failed shots after a\n  moment. Order them into `scene_NNN.png` afterward.\n- **TTS uses edge-tts (English) by default** because no `VOLC_TTS_API_KEY` is\n  set. Set the key to switch to Volcano Engine TTS (`en_us_amy`).\n\n## Files\n\n- `SKILL.md` — skill spec and full workflow\n- `references/prompts.md` — all LLM prompts (English)\n- `references/CROSS_PLATFORM.md` — install/adapt for OpenClaw, Codex CLI, TRAE Work, Claude Code\n- `references/workflow-original.yaml` — original Coze workflow backup\n- `scripts/compose_video.py` — video composition (ffmpeg + ASS subtitles)\n- `scripts/generate_audio.py` — English TTS (Volcano / edge-tts)\n- `scripts/generate_cover.py` — cover image generator\n- `scripts/generate_image.py` — multi-provider image generation\n\nFile v0.1.0:_meta.json\n\n{\n  \"ownerId\": \"kn7eq2qd3rr9x7qsqf30dbt3b58120ra\",\n  \"slug\": \"book-video-generator-en\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1785380117397\n}\n\nFile v0.1.0:references/CROSS_PLATFORM.md\n\n# 跨平台适配指南（English Edition）\n\n本文件说明 `book-video-generator-en`（三分钟精读一本书 · 英文版）技能在各 AI Agent 平台上的安装与工具适配方法。\n\n技能遵循 [Agent Skills 开放标准](https://agentskills.io)，核心组件（`SKILL.md` 格式、LLM 提示词、Python 脚本）**跨平台通用**，仅需适配平台专有工具（主要是图像生成）。\n\n---\n\n## 平台兼容性总览\n\n| 组件 | WorkBuddy | OpenClaw | Codex CLI | TRAE Work | Claude Code |\n|------|-----------|----------|-----------|-----------|-------------|\n| SKILL.md 格式 | 原生 | 兼容 | 兼容 | 兼容 | 兼容 |\n| LLM 提示词（英文） | 直接用 | 直接用 | 直接用 | 直接用 | 直接用 |\n| Python 脚本 | 直接用 | 直接用 | 直接用 | 直接用 | 直接用 |\n| 联网搜索 | WebSearch | 内置 | Shell/MCP | 内置 | 内置 |\n| 图像生成 | ImageGen（内置） | 插件 / generate_image.py | generate_image.py | MCP / generate_image.py | 内置 / generate_image.py |\n| 英文 TTS | edge-tts（默认） | edge-tts | edge-tts | edge-tts | edge-tts |\n| 技能目录 | ~/.workbuddy/skills/ | ~/.openclaw/skills/ | ~/.codex/skills/ | ~/.trae/skills/ | ~/.claude/skills/ |\n\n> 核心脚本**无任何平台硬编码路径**，统一使用 `os.path.join` / `pathlib.Path` 与 `sys.executable`，在 Windows / macOS / Linux 均可直接运行。\n\n---\n\n## 1. WorkBuddy（当前平台）\n\n无需额外配置，技能已安装。\n\n- 联网搜索：内置 `WebSearch` 工具\n- 图像生成：内置 `ImageGen` 延迟工具（通过 ToolSearch + DeferExecuteTool 调用，Tencent Hunyuan）\n- 英文 TTS：`generate_audio.py` 默认 `en-US-AriaNeural`（edge-tts，免费、无需 Key）\n- Python 运行：托管 Python `C:/Users/chenjun/.workbuddy/binaries/python/versions/3.13.12/python.exe`\n\n---\n\n## 2. OpenClaw\n\n### 安装\n\n```bash\n# 方式一：直接复制\ncp -r ~/.workbuddy/skills/book-video-generator-en ~/.openclaw/skills/\n\n# 方式二：通过 ClawHub 安装（需先发布）\nopenclaw skills install book-video-generator-en\n\n# 方式三：从 Git 仓库安装\nopenclaw skills install git:yourname/book-video-generator-en\n```\n\n### 工具适配\n\nOpenClaw 支持在 `SKILL.md` frontmatter 中声明 `tools`。如需原生图像生成，可声明一个指向 `scripts/generate_image.py` 的 handler；否则 CLI 阶段直接调用该脚本即可。\n\n联网搜索：OpenClaw 内置 web search，无需配置。\n\n图像生成：\n\n```bash\n# 任选一种 API（需对应 Key）\nexport GEMINI_API_KEY=\"...\"      # 或 AGNES_API_KEY / OPENAI_API_KEY / ARK_API_KEY\npython3 scripts/generate_image.py --prompt \"flat illustration ...\" --output images/scene_000.png --api gemini\n# 批量（从 storyboard.json）\npython3 scripts/generate_image.py --batch storyboard.json --output-dir images/ --api gemini\n```\n\n### 验证\n\n```bash\nopenclaw skills verify book-video-generator-en\n```\n\n---\n\n## 3. Codex CLI（OpenAI）\n\n### 安装\n\n```bash\n# 1. 开启 Skills 功能（config.toml）\ncat >> ~/.codex/config.toml << 'EOF'\n[features]\nskills = true\nEOF\n\n# 2. 复制技能目录\ncp -r ~/.workbuddy/skills/book-video-generator-en ~/.codex/skills/\n\n# 3. 重启 Codex CLI\n# 4. 验证：在 Codex CLI 输入 /skills，确认 book-video-generator-en 出现\n```\n\n### 工具适配\n\n**联网搜索**：Codex CLI 无内置搜索，两种方案：\n\n方案 A — Shell 命令搜索（免安装）：\n```bash\ncurl -s \"https://www.google.com/search?q=book+title+author+summary\" | python3 -c \"...\"\n```\n方案 B — 安装搜索 MCP 插件。\n\n**图像生成**：Codex CLI 无内置图像生成，使用 `scripts/generate_image.py`（见上方 OpenClaw 示例）。`IMAGE_API` 环境变量可设默认 API（默认 `gemini`）。\n\n**英文 TTS**：`generate_audio.py` 默认走 edge-tts，免费且无需 Key，联网即用。\n\n### 注意事项\n\n- Codex CLI 的 `SKILL.md` frontmatter 支持 `metadata.short-description`\n- 技能也可放在项目级 `.codex/skills/` 或仓库根 `.agents/skills/`\n- 渐进式披露：启动时仅加载 name + description\n\n---\n\n## 4. TRAE Work（字节跳动）\n\n### 安装\n\n```\n1. 打开 TRAE Work IDE\n2. 进入「规则和技能 → 技能 → 创建」\n3. 选择「导入文件」，上传 SKILL.md\n4. 将 scripts/ 和 references/ 目录复制到技能目录下\n```\n\n技能目录结构（TRAE 只扫描一级子目录）：\n```\n~/.trae/skills/\n  book-video-generator-en/\n    SKILL.md\n    scripts/\n      compose_video.py\n      generate_audio.py\n      generate_image.py\n      generate_cover.py\n    references/\n      prompts.md\n      CROSS_PLATFORM.md\n      workflow-original.yaml\n```\n\n### 工具适配\n\n- 联网搜索：TRAE Work 内置，直接可用。\n- 图像生成：通过 MCP 接入图像服务，或用 `scripts/generate_image.py` + 环境变量。\n- 英文 TTS：edge-tts 直接可用。\n\n---\n\n## 5. 其他兼容平台\n\nAgent Skills 开放标准还被以下平台支持，本技能同样适用：\n\n- **Claude Code** — `~/.claude/skills/`，与 WorkBuddy 格式几乎一致\n- **Cursor** — 支持 Agent Skills 标准\n- **GitHub Copilot** — 支持 Agent Skills 标准\n- **VS Code** — 通过 Agent Skills 扩展\n- **Letta** — 支持 Agent Skills 标准\n\n安装方式统一为：将技能目录复制到对应平台的 skills 目录下。\n\n---\n\n## 通用注意事项\n\n### Python 环境\n\n所有平台执行脚本时使用 `python3`（Windows 上为 `python`）。确保依赖已安装：\n\n```bash\npip install edge-tts imageio-ffmpeg pillow\n```\n\n如使用 `generate_image.py` 的火山引擎 / Gemini 后端，按需安装：\n```bash\npip install volcengine-python-sdk[ark] google-genai   # 仅对应后端需要\n```\n\n### 英文 TTS（跨平台一致）\n\n- 默认 `en-US-AriaNeural`（edge-tts，免费、无需 Key，联网即用）。\n- 可选火山引擎英文音色 `en_us_amy` 等（需 `VOLC_TTS_API_KEY`）；未配置时自动回退 edge-tts。\n\n### 字体（英文）\n\n视频字幕烧录与封面图均使用英文/拉丁字体，脚本已内置跨平台自动检测：\n\n| 系统 | 字体路径 | FontName |\n|------|----------|----------|\n| Windows | C:/Windows/Fonts/arial.ttf | Arial |\n| macOS | /System/Library/Fonts/Supplemental/Arial.ttf | Arial / Helvetica |\n| Linux | /usr/share/fonts/truetype/dejavu/DejaVuSans.ttf | DejaVu Sans |\n\n兜底顺序：优先检测上述路径 → `fc-list :lang=en` → 最后返回 `\"Sans\"`（交给 ffmpeg/libass 默认）。无中文字体需求，纯英文渲染无障碍。\n\n### 路径分隔符\n\nPython 脚本统一使用 `os.path.join()` 与 `pathlib.Path`，自动适配不同 OS 路径分隔符；ffmpeg 的 `subtitles` 滤镜对 Windows 路径已做特殊处理。\n\n### 合成性能注意（重要）\n\n`compose_video.py` 会对全部分镜做完整重编码（1080p + libx264 + libass 字幕烧录 + BGM/转场混音）。在**资源受限的沙箱/容器**中，整段重编码可能被静默杀进程（无报错、无输出）。\n\n- 若在本机/有完整资源的终端运行，正常完成（约 2–3 分钟）。\n- 若在受限沙箱运行失败，请在**关闭沙箱/资源不受限**的环境下重新执行合成步骤（仅本地 ffmpeg，无需联网）。\n- 分步排错：可先单独跑 `make_ass` 看字幕、再单独跑短片段烧录验证滤镜，最后跑完整合成。\n\n---\n\n## 版本历史\n\n| 日期 | 版本 | 变更 |\n|------|------|------|\n| 2026-07-29 | 1.0 | 从中文版 book-video-generator 派生英文版：提示词/字幕/配音全英文，字体改 Arial/Helvetica/DejaVu |\n| 2026-07-29 | 1.1 | 补充跨平台适配文档（OpenClaw / Codex CLI / TRAE Work / Claude Code 等） |\n\nFile v0.1.0:references/prompts.md\n\n# Coze Workflow LLM Prompt Collection (English Version)\n\nThese prompts are extracted from the original Coze workflow `Pipadushu_video_1`\nand can be used directly in WorkBuddy. All output is in English — scripts,\nstoryboards, subtitles, and narration.\n\n---\n\n## 1. Review Script Generation (Node 132962)\n\n**Model**: DeepSeek-V3.2\n**Input**: book_name, author_name\n**Output**: JSON (book_name, author_name, year, content, category)\n\n### System Prompt\n\n```\n# Role\nYou are a professional and engaging book-review creator who excels at writing captivating book-explainer video scripts. Based on the book title and author provided by the user, you deeply analyze the book's content, accurately extract its core ideas and the problem it solves, and deliver original insights and explanations — producing a compelling 3-minute book-review video script.\n\n## Skills\n### Skill 1: Write the book-review video script\n1. When the user provides a book title and author, use tools to search for real information about the book, including its summary, others' interpretations, and publication year.\n2. Deeply analyze the gathered information and extract the book's core content (no less than 1000 words) and the key problem the book tries to solve.\n3. Form original insights and explain them clearly and logically.\n4. Write a 3-minute book-review video script with a highly compelling opening hook. The script must be logically clear, fluent, and vividly convey the book's appeal.\n5. Output in JSON format. The content must include the book title, author, publication year (format: yyyy-MM), and book category.\n=== Reply Example ===\n{\n  \"book_name\": \"[specific book title]\",\n  \"author_name\": \"[author name]\",\n  \"year\": \"yyyy-MM\",\n  \"content\":  \"A highly compelling opening line + detailed explanation of the book's core content, insight extraction and explanation, the key problem it solves, etc. No less than 1000 words.\",\n  \"category\": \"Book category (e.g., Self-Help, Economics, Psychology)\"\n}\n=== Example Ends ===\n\n## Constraints:\n- Only produce book-review video script content about the book the user provides. Refuse topics unrelated to the script.\n- Output must follow the given reply example format and not deviate from the framework.\n- The script should fit a roughly 3-minute duration: concise language but rich content.\n- Source information must be obtained through tool search to ensure accuracy.\n```\n\n### User Prompt\n\n```\nBook title: {{book_name}}\nAuthor: {{author_name}}\n```\n\n---\n\n## 2. Storyboard Visual Description (Node 173538)\n\n**Model**: DeepSeek-V3.2\n**Input**: content (the review script from Stage 1)\n**Output**: JSON (list[story_name, desc, cap, desc_promopt], keywords)\n\n### System Prompt\n\n```\n# Role\nYou are a professional and creative video storyboard description expert, specializing in storyboard creation for \"read a book in 3 minutes\" video scripts. You can transform book content into vivid, visual, and well-structured storyboard descriptions.\n\n## Skills\n### Skill 1: Create video storyboard descriptions\n1. Carefully study the \"read a book in 3 minutes\" video script provided by the user, fully understanding its core content, narrative progression, and emotional tone.\n2. Create storyboard descriptions following these rules:\n    - Subtitle text segmentation: each segment is exactly one sentence, concise and clear, fluent, with good rhythm.\n    - Visual description: the scene must accurately reflect the book's content and plot, precisely and delicately conveying plot details and emotional tone.\n    - Subtitle text must strictly follow the provided script split; do not modify the original content.\n    - Number of shots: at least 8, no more than 50.\n### Skill 2: Generate storyboard image prompts\n- Based on the visual description and the whole book's content, generate the corresponding [storyboard image prompt].\n- Style description:\n  Characters: cartoonish, clean lines.\n  Background: symbolic, flat-design elements (e.g., a house, a credit card, a piggy bank).\n  Palette: soft, bright, low-saturation tones.\n  Action: simple but expressive (e.g., scratching head, thinking, surprised).\n  Details: use simple shapes and lines to express complex concepts (e.g., arrows, currency symbols).\n- Example: A young person scratching their head deep in thought, surrounded by a piggy bank, a credit card, a house, and a downward arrow — symbolic flat-design background, soft tones, clean lines, exaggerated expression, light and humorous overall style.\n\n### Skill 3: Pick key words from the script\n- Based on the original script, extract the corresponding key words and output them as keywords.\n- Extract the exact original words, without punctuation, and they must appear in the sentences.\n\n### Skill 4: Output format\nOutput content containing the shot name, visual description, subtitle text, and image prompt, in this exact format:\n{\n \"list\":[\n{\n    \"story_name\":\"Shot name\",\n    \"desc\":\"Visual description\",\n    \"cap\":\"Corresponding subtitle text\",\n    \"desc_promopt\":\"Storyboard image prompt (English)\"\n}\n],\n\"keywords\":[\"keyword1\",\"keyword2\"]\n}\n\n## Constraints\n- The video script and storyboard descriptions must stay consistent.\n- Output must strictly follow the given format and not deviate from the framework.\n- Only storyboard the \"read a book in 3 minutes\" script the user provided; do not alter the original text.\n- Storyboard image prompts must fit the context of the whole book and the current segment.\n- Output keywords must exist within the corresponding sentence.\n```\n\n### User Prompt\n\n```\nScript content:\n{{content}}\n```\n\n---\n\n## 3. Title Progress Bar (Node 115560)\n\n**Model**: Doubao·1.8·DeepThink\n**Input**: content (the review script)\n**Output**: 4 section titles\n\n### System Prompt\n\n```\n# Role\nYou are a professional \"read a book in 3 minutes\" workflow assistant. You excel at analyzing the logical structure and thematic direction of given content, dividing the script clearly into four sections, and summarizing each section's core content in no more than six words — building a complete content-framework progress bar that helps users grasp the pace intuitively.\n\n## Skills\n### Skill 1: Precisely divide content sections\n1. When the user provides {{content}}, deeply analyze its logical structure and thematic direction.\n2. Divide the content reasonably and smoothly into four sections.\n\n### Skill 2: Concisely summarize each section\n1. For each divided section, accurately extract the core point.\n2. Summarize each section's main content in no more than six words.\n\n### Skill 3: Generate the progress bar properly\n1. Based on the four summarized sections, build a clear, complete content-framework progress bar so users can quickly see the pace.\n\n## Constraints:\n- Only divide, summarize, and build the progress bar for the content the user provided; do not handle other unrelated topics.\n- Output must strictly follow the above requirements and not deviate.\n- Each section's no-more-than-six-word summary must accurately reflect its core content.\n```\n\n---\n\n## 4. Image Generation Parameters (Original Workflow Node 126048)\n\n### Positive Prompt Template\n\n```\nflat illustration style, protagonist's top color #FF7F72, pants color #243139, flat background: {{desc_info}}, transparent glass with 30% opacity\n```\n\n### Negative Prompt\n\n```\n(empty)\n```\n\n### Generation Parameters\n\n- Size: 1024×768 (fixed)\n- Steps: 40\n- Model: Coze built-in image generation model_id=8\n\n---\n\n## 5. Code Node: Intro Concatenation (Original Workflow Node 150774)\n\n```javascript\nasync function main({ params }: Args): Promise<Output> {\n    const data = params.c_list;\n    const book_name = params.book_name;\n    const author_name = params.author_name;\n\n    data.unshift({\n        story_name: \"Intro\",\n        desc: \"Read one book every day\",\n        cap: \"Read a book in 3 minutes. Today we're reading \" + book_name + \" by \" + author_name + \".\",\n        desc_promopt: \"A person reading a book, flat illustration style\"\n    });\n\n    const ret = {\n        list: data\n    };\n\n    return ret;\n}\n```\n\n---\n\n## 6. Original Workflow Compile Parameters\n\n| Parameter | Value |\n|-----------|-------|\n| Jianying plugin ID | 7457837925833801768 |\n| Cutout plugin ID | 7438919188246413347 |\n| Batch size | 50 |\n| Concurrency | 2 |\n| Subtitle font color | #FFFFFF |\n| Subtitle outline color | #000000 |\n| Subtitle font size | 7 (relative) |\n| Default account name | Chen's AI |\n\nFile v0.1.0:references/workflow-original.yaml\n\nschema_version: 1.0.0\nname: Pipadushu_video_1\nid: 7534653326350565414\ndescription: \"生成《三分钟精读一本书》视频\"\nmode: workflow\nicon: FileBizType.BIZ_BOT_ICON/3230818915596240_1754298180874579070.jpeg\nnodes:\n    - id: \"100001\"\n      type: start\n      title: 开始\n      icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Start-v2.jpg\n      description: \"工作流的起始节点，用于设定启动工作流需要的信息\"\n      position:\n        x: -121.44768516942305\n        y: 605.0112986374794\n      parameters:\n        node_outputs:\n            auther_name:\n                type: string\n                required: true\n                value: null\n                description: 作者名称\n            book_name:\n                type: string\n                required: true\n                value: null\n                description: 书籍名称\n            ip_name:\n                type: string\n                required: true\n                value: null\n                default_value: 陈老师AI\n                description: 个人账号名称\n    - id: \"900001\"\n      type: end\n      title: 结束\n      icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-End-v2.jpg\n      description: \"工作流的最终节点，用于返回工作流运行后的结果信息\"\n      position:\n        x: 13554.654454389107\n        y: 592.0112986374795\n      parameters:\n        node_inputs:\n            - name: output\n              input:\n                type: string\n                value:\n                    path: draft_url\n                    ref_node: \"104782\"\n        terminatePlan: returnVariables\n    - id: \"180681\"\n      type: batch\n      title: 批处理\n      icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Batch-v2.jpg\n      description: \"通过设定批量运行次数和逻辑，运行批处理体内的任务\"\n      position:\n        x: 2825.504871544083\n        y: 592.0112986374795\n      canvas_position:\n        x: 2415.504871544083\n        y: 886.7112986374796\n      parameters:\n        batchSize:\n            type: integer\n            value:\n                content: 50\n                rawMeta:\n                    type: 2\n                type: literal\n        concurrentSize:\n            type: integer\n            value:\n                content: 2\n                rawMeta:\n                    type: 2\n                type: literal\n        node_inputs:\n            - name: list\n              input:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        cap:\n                            type: string\n                            value: null\n                        desc:\n                            type: string\n                            value: null\n                        desc_promopt:\n                            type: string\n                            value: null\n                        story_name:\n                            type: string\n                            value: null\n                    value: null\n                value:\n                    path: list\n                    ref_node: \"150774\"\n        node_outputs:\n            data_list:\n                value:\n                    type: image\n                    items:\n                        type: string\n                        value: null\n                    value:\n                        path: data\n                        ref_node: \"192530\"\n      nodes:\n        - id: \"126048\"\n          type: image_generate\n          title: 图像生成\n          icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-ImageGeneration-v2.jpg\n          description: \"通过文字描述/添加参考图生成图片\"\n          position:\n            x: 180\n            y: 0\n          parameters:\n            modelSetting:\n                custom_ratio:\n                    height: 768\n                    ratio_type: fixed\n                    width: 1024\n                ddim_steps: 40\n                model: 8\n            node_inputs:\n                - name: desc_info\n                  input:\n                    type: string\n                    value:\n                        path: list.desc_promopt\n                        ref_node: \"180681\"\n                - name: desc\n                  input:\n                    type: string\n                    value:\n                        path: list.desc\n                        ref_node: \"180681\"\n            node_outputs:\n                data:\n                    type: image\n                    value: null\n                msg:\n                    type: string\n                    value: null\n            prompt:\n                negative_prompt: \"\"\n                prompt: 扁平风，主角上衣颜色#FF7F72，裤子颜色#243139，扁平背景：{{desc_info}}，Transparent glass with 30% opacity\n            references: []\n            settingOnError:\n                processType: 1\n                retryTimes: 0\n                timeoutMs: 60000\n        - id: \"192530\"\n          type: plugin\n          title: cutout\n          icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-plugin-cutout-v2.jpg\n          description: \"保留图片前景主体，输出透明背景(.png)\"\n          position:\n            x: 640\n            y: 14\n          parameters:\n            apiParam:\n                - name: apiID\n                  input:\n                    type: string\n                    value: \"7438919188246429731\"\n                - name: apiName\n                  input:\n                    type: string\n                    value: \"cutout\"\n                - name: pluginID\n                  input:\n                    type: string\n                    value: \"7438919188246413347\"\n                - name: pluginName\n                  input:\n                    type: string\n                    value: \"抠图\"\n                - name: pluginVersion\n                  input:\n                    type: string\n                    value: \"\"\n                - name: tips\n                  input:\n                    type: string\n                    value: \"\"\n                - name: outDocLink\n                  input:\n                    type: string\n                    value: \"\"\n            inputDefs:\n                - defaultValue: 0\n                  description: 输出图模式，可选透明背景图/蒙版矢量图, enum list is [0,1], default value is 0\n                  enum:\n                    - 0\n                    - 1\n                  enumVarNames:\n                    - 透明背景图\n                    - 蒙版矢量图\n                  input: {}\n                  name: output_mode\n                  required: false\n                  title: 输出图模式\n                  type: integer\n                - description: 自定义抠图内容的提示词，不填时默认保留主体抠图\n                  input: {}\n                  name: prompt\n                  required: false\n                  title: 提示词\n                  type: string\n                - assistType: 2\n                  description: 待抠图的图片\n                  input: {}\n                  name: url\n                  required: true\n                  title: 上传图\n                  type: image\n            node_inputs:\n                - name: url\n                  input:\n                    value:\n                        path: data\n                        ref_node: \"126048\"\n                - name: only_mask\n                  input:\n                    type: string\n                    value: \"0\"\n                - name: output_mode\n                  input:\n                    type: string\n                    value: \"0\"\n            node_outputs:\n                data:\n                    type: image\n                    value: null\n                    description: 透明背景图，在输出模式为透明背景时生效\n                errorBody:\n                    type: object\n                    properties:\n                        errorCode:\n                            type: string\n                            value: null\n                        errorMessage:\n                            type: string\n                            value: null\n                    value: null\n                isSuccess:\n                    type: boolean\n                    value: null\n                mask:\n                    type: string\n                    value: null\n                    description: 抠图区域蒙板矢量图，在输出模式为蒙版矢量图时生效\n                msg:\n                    type: string\n                    value: null\n            settingOnError:\n                dataOnErr: |-\n                    {\n                        \"data\": \"\",\n                        \"mask\": \"\",\n                        \"msg\": \"\"\n                    }\n                processType: 2\n                retryTimes: 0\n                switch: true\n                timeoutMs: 180000\n      edges:\n        - source_node: \"180681\"\n          target_node: \"126048\"\n          source_port: batch-function-inline-output\n        - source_node: \"126048\"\n          target_node: \"192530\"\n        - source_node: \"192530\"\n          target_node: \"180681\"\n          target_port: batch-function-inline-input\n    - id: \"173538\"\n      type: llm\n      title: 大模型_分镜画面描述\n      icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-LLM-v2.jpg\n      description: \"调用大语言模型,使用变量和提示词生成回复\"\n      version: \"3\"\n      position:\n        x: 1551.79189047078\n        y: 574.1809851799528\n      parameters:\n        fcParamVar:\n            knowledgeFCParam: {}\n        llmParam:\n            - name: generationDiversity\n              input:\n                type: string\n                value: default_val\n            - name: apiMode\n              input:\n                type: integer\n                value: \"0\"\n            - name: maxTokens\n              input:\n                type: integer\n                value: \"9999\"\n            - name: spCurrentTime\n              input:\n                type: boolean\n                value: false\n            - name: spAntiLeak\n              input:\n                type: boolean\n                value: false\n            - name: thinkingType\n              input:\n                type: string\n                value: disabled\n            - name: responseFormat\n              input:\n                type: integer\n                value: \"2\"\n            - name: modelName\n              input:\n                type: string\n                value: DeepSeek-V3.2\n            - name: modelType\n              input:\n                type: integer\n                value: \"1764929611\"\n            - name: maxCompletionTokens\n              input:\n                type: string\n                value: \"0\"\n            - name: parameters\n              input:\n                type: object\n                value: null\n            - name: prompt\n              input:\n                type: string\n                value: |-\n                    文案内容如下：\n                    {{content}}\n            - name: enableChatHistory\n              input:\n                type: boolean\n                value: false\n            - name: chatHistoryRound\n              input:\n                type: integer\n                value: \"3\"\n            - name: systemPrompt\n              input:\n                type: string\n                value: |-\n                    # 角色\n                    你是一位专业且富有创意的视频分镜描述专家，专注于3分钟读完一本书视频文案的分镜创作，能够将书籍内容转化为生动、形象且符合要求的视频分镜描述。\n\n                    ## 技能\n                    ### 技能 1: 创作视频分镜描述\n                    1. 仔细研读用户提供的3分钟读完一本书的视频文案内容，全面理解其中的书籍核心内容、情节发展以及情感氛围等关键要素。\n                    2. 按照要求创作视频分镜描述，确保：\n                        - 字幕文案分段：每个段落均由一句话构成，语句简洁明了，表达清晰流畅，同时具备节奏感。\n                        - 分镜描述：画面需能准确体现书籍内容情节，描述要精准、细致地展现情节细节以及情感氛围等方面。\n                        - 字幕文案必须严格按照用户给的文案拆分，不能修改提供的内容。\n                        - 分镜数量至少8个， 不超过50个。\n                    ### 技能 2: 生成分镜图像提示词\n                    - 依据分镜描述和整本书的内容，生成对应的[分镜图像提示词]\n                    - 风格描述：\n                    人物：卡通化、简洁线条\n                    背景：符号化、扁平化设计（如房子、信用卡、存钱罐等）\n                    色调：柔和、明亮、低饱和度\n                    动作：简单但富有表现力（如抓头、思考、惊讶等）\n                    细节：用简单的图形和线条表现复杂概念（如箭头、货币符号等）\n                    -示例：一个人正在思考财务问题，周围有存钱罐、信用卡、房子、下降箭头等符号。\n                    提示词风格参考：\n                    “一个年轻人正在抓头思考，周围有存钱罐、信用卡、房子、下降箭头等符号，卡通化风格，柔和色调，简洁线条，表情夸张，背景用扁平化符号表现，整体风格轻松幽默。”\n\n                    ### 技能3: 挑选文案中重点词\n                    - 依据原始文案，从文案中截取对应的重点词汇，输出keywords\n                    - 注意直接截取出原有词，不要带标点符号，且要在句子中存在\n\n                    ### 技能4：输出内容\n                    输出包含分镜名称、分镜描述、字幕文案、图像提示词的内容，具体格式如下：\n                    {\n                     \"list\":[\n                    {\n                        \"story_name\":\"分镜名称\",\n                        \"desc\":\"分镜描述\",\n                        \"cap\":\"对应字幕文案\",\n                        \"desc_promopt\":\"分镜图像提示词\"\n                    }\n                    ],\n                    \"keywords\":[\"重点词1\",\"重点词2\"]\n                    }\n\n                    ## 限制\n                    - 视频文案及分镜描述必须保持一致。\n                    - 输出内容必须严格按照给定的格式进行组织，不得偏离框架要求。\n                    - 只对用户提供的3分钟读完一本书的视频文案内容进行分镜，不能更改原文。\n                    - 分镜图像提示词要符合整本书和当前段落的语境。\n                    - 输出的keywords必须在对应句子中存在。\n            - name: stableSystemPrompt\n              input:\n                type: string\n                value: \"\"\n            - name: canContinue\n              input:\n                type: boolean\n                value: false\n            - name: loopPromptVersion\n              input:\n                type: string\n                value: \"\"\n            - name: loopPromptName\n              input:\n                type: string\n                value: \"\"\n            - name: loopPromptId\n              input:\n                type: string\n                value: \"\"\n        node_inputs:\n            - name: content\n              input:\n                type: string\n                value:\n                    path: content\n                    ref_node: \"132962\"\n        node_outputs:\n            keywords:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value: null\n            list:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        cap:\n                            type: string\n                            value: null\n                        desc:\n                            type: string\n                            value: null\n                        desc_promopt:\n                            type: string\n                            value: null\n                        story_name:\n                            type: string\n                            value: null\n                    value: null\n                value: null\n        settingOnError:\n            processType: 1\n            retryTimes: 0\n            switch: false\n            timeoutMs: 600000\n    - id: \"169595\"\n      type: loop\n      title: 循环\n      icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Loop-v2.jpg\n      description: \"用于通过设定循环次数和逻辑，重复执行一系列任务\"\n      position:\n        x: 4865.504871544083\n        y: 579.0112986374794\n      canvas_position:\n        x: 4455.504871544083\n        y: 962.0176527152933\n      parameters:\n        loopCount:\n            type: integer\n            value:\n                content: 10\n                rawMeta:\n                    type: 2\n                type: literal\n        loopType: array\n        node_inputs:\n            - name: input\n              input:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        cap:\n                            type: string\n                            value: null\n                        desc:\n                            type: string\n                            value: null\n                        desc_promopt:\n                            type: string\n                            value: null\n                        story_name:\n                            type: string\n                            value: null\n                    value: null\n                value:\n                    path: list\n                    ref_node: \"150774\"\n        node_outputs:\n            duration_list:\n                value:\n                    type: list\n                    items:\n                        type: integer\n                        value: null\n                    value:\n                        path: duration\n                        ref_node: \"199916\"\n            output:\n                value:\n                    type: list\n                    items:\n                        type: string\n                        value: null\n                    value:\n                        path: data.link\n                        ref_node: \"122703\"\n        variableParameters: []\n      nodes:\n        - id: \"122703\"\n          type: plugin\n          title: speech_synthesis\n          icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Plugin-v2.jpg\n          description: \"根据音色和文本合成音频\"\n          position:\n            x: 180\n            y: 0\n          parameters:\n            apiParam:\n                - name: apiID\n                  input:\n                    type: string\n                    value: \"7426655854067367946\"\n                - name: apiName\n                  input:\n                    type: string\n                    value: \"speech_synthesis\"\n                - name: pluginID\n                  input:\n                    type: string\n                    value: \"7426655854067351562\"\n                - name: pluginName\n                  input:\n                    type: string\n                    value: \"语音合成\"\n                - name: pluginVersion\n                  input:\n                    type: string\n                    value: \"\"\n                - name: tips\n                  input:\n                    type: string\n                    value: \"\"\n                - name: outDocLink\n                  input:\n                    type: string\n                    value: \"\"\n            inputDefs:\n                - defaultValue: 爽快思思/Skye\n                  description: 音色ID，默认为爽快思思/Skye。详细音色列表参考 https://bytedance.larkoffice.com/docx/WdDOdiB1BoRyBNxlkXWcn0n3nLc, default value is 爽快思思/Skye\n                  input: {}\n                  name: speaker_id\n                  required: false\n                  type: string\n                - defaultValue: 1\n                  description: 语速，范围是[0.2,3]，默认为1，通常保留一位小数即可, default value is 1\n                  input: {}\n                  name: speed_ratio\n                  required: false\n                  type: float\n                - description: 要合成音频的文本内容\n                  input: {}\n                  name: text\n                  required: true\n                  type: string\n                - assistType: 12\n                  description: voice id\n                  input: {}\n                  name: voice_id\n                  required: false\n                  type: string\n                - description: 语音语种，非必填，参考 https://bytedance.larkoffice.com/docx/WdDOdiB1BoRyBNxlkXWcn0n3nLc\n                  input: {}\n                  name: language\n                  required: false\n                  type: string\n            node_inputs:\n                - name: text\n                  input:\n                    type: string\n                    value:\n                        path: input.cap\n                        ref_node: \"169595\"\n                - name: speed_ratio\n                  input:\n                    type: float\n                    value: 1.2\n                - name: voice_id\n                  input:\n                    type: voice\n                    value: \"7426720361733144585\"\n            node_outputs:\n                code:\n                    type: float\n                    value: null\n                data:\n                    type: object\n                    properties:\n                        duration:\n                            type: float\n                            value: null\n                            description: 音频时长，单位是s\n                        link:\n                            type: string\n                            value: null\n                    value: null\n                log_id:\n                    type: string\n                    value: null\n                msg:\n                    type: string\n                    value: null\n            settingOnError:\n                processType: 1\n                retryTimes: 0\n                timeoutMs: 180000\n        - id: \"199916\"\n          type: plugin\n          title: get_audio_duration\n          icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Plugin-v2.jpg\n          description: \"获取音频时长\"\n          position:\n            x: 640\n            y: 0\n          parameters:\n            apiParam:\n                - name: apiID\n                  input:\n                    type: string\n                    value: \"7474863657353117750\"\n                - name: apiName\n                  input:\n                    type: string\n                    value: \"get_audio_duration\"\n                - name: pluginID\n                  input:\n                    type: string\n                    value: \"7457837925833801768\"\n                - name: pluginName\n                  input:\n                    type: string\n                    value: \"视频合成_剪映小助手\"\n                - name: pluginVersion\n                  input:\n                    type: string\n                    value: \"\"\n                - name: tips\n                  input:\n                    type: string\n                    value: \"\"\n                - name: outDocLink\n                  input:\n                    type: string\n                    value: \"\"\n            inputDefs:\n                - description: 音频链接\n                  input: {}\n                  name: mp3_url\n                  required: true\n                  type: string\n            node_inputs:\n                - name: mp3_url\n                  input:\n                    value:\n                        path: data.link\n                        ref_node: \"122703\"\n            node_outputs:\n                duration:\n                    type: integer\n                    value: null\n                message:\n                    type: string\n                    value: null\n            settingOnError:\n                processType: 1\n                retryTimes: 0\n                timeoutMs: 180000\n      edges:\n        - source_node: \"169595\"\n          target_node: \"122703\"\n          source_port: loop-function-inline-output\n        - source_node: \"122703\"\n          target_node: \"199916\"\n        - source_node: \"199916\"\n          target_node: \"169595\"\n          target_port: loop-function-inline-input\n    - id: \"168118\"\n      type: plugin\n      title: create_draft\n      icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Plugin-v2.jpg\n      description: \"插件入口-创建草稿\"\n      position:\n        x: 8415.504871544083\n        y: 592.0112986374795\n      parameters:\n        apiParam:\n            - name: apiID\n              input:\n                type: string\n                value: \"7457837955684515874\"\n            - name: apiName\n              input:\n                type: string\n                value: \"create_draft\"\n            - name: pluginID\n              input:\n                type: string\n                value: \"7457837925833801768\"\n            - name: pluginName\n              input:\n                type: string\n                value: \"视频合成_剪映小助手\"\n            - name: pluginVersion\n              input:\n                type: string\n                value: \"\"\n            - name: tips\n              input:\n                type: string\n                value: \"\"\n            - name: outDocLink\n              input:\n                type: string\n                value: \"\"\n        inputDefs:\n            - description: 高\n              input: {}\n              name: height\n              required: false\n              type: integer\n            - description: 关联创作者\n              input: {}\n              name: user_id\n              required: false\n              type: integer\n            - description: 宽\n              input: {}\n              name: width\n              required: false\n              type: integer\n        node_inputs:\n            - name: height\n              input:\n                type: integer\n                value: 1080\n            - name: user_id\n              input:\n                type: integer\n                value: 10299\n            - name: width\n              input:\n                type: integer\n                value: 1440\n        node_outputs:\n            draft_url:\n                type: string\n                value: null\n            tip_url:\n                type: string\n                value: null\n        settingOnError:\n            processType: 1\n            retryTimes: 0\n            timeoutMs: 180000\n    - id: \"125268\"\n      type: plugin\n      title: add_audios\n      icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Plugin-v2.jpg\n      description: \"批量添加音频\"\n      position:\n        x: 8875.504871544083\n        y: 592.0112986374795\n      parameters:\n        apiParam:\n            - name: apiID\n              input:\n                type: string\n                value: \"7457837925833834536\"\n            - name: apiName\n              input:\n                type: string\n                value: \"add_audios\"\n            - name: pluginID\n              input:\n                type: string\n                value: \"7457837925833801768\"\n            - name: pluginName\n              input:\n                type: string\n                value: \"视频合成_剪映小助手\"\n            - name: pluginVersion\n              input:\n                type: string\n                value: \"\"\n            - name: tips\n              input:\n                type: string\n                value: \"\"\n            - name: outDocLink\n              input:\n                type: string\n                value: \"\"\n        inputDefs:\n            - description: '[{\"audio_url\": \"http://example.com/audio1.mp3\",\"duration\":120,\"start\":0,\"end\":12000000,\"audio_effect\":\"教堂\"}]'\n              input: {}\n              name: audio_infos\n              required: true\n              type: string\n            - description: 草稿地址，使用create_draft输出的draft_url即可\n              input: {}\n              name: draft_url\n              required: true\n              type: string\n        node_inputs:\n            - name: audio_infos\n              input:\n                type: string\n                value:\n                    path: infos\n                    ref_node: \"180223\"\n            - name: draft_url\n              input:\n                value:\n                    path: draft_url\n                    ref_node: \"168118\"\n        node_outputs:\n            audio_ids:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value: null\n            draft_url:\n                type: string\n                value: null\n            track_id:\n                type: string\n                value: null\n        settingOnError:\n            processType: 1\n            retryTimes: 0\n            timeoutMs: 180000\n    - id: \"152586\"\n      type: code\n      title: 代码\n      icon: https://lf3-static.bytednsdoc.com/obj/eden-cn/dvsmryvd_avi_dvsm/ljhwZthlaukjlkulzlp/icon/icon-Code-v2.jpg\n      description: \"编写代码，处理输入变量来生成返回值\"\n      version: v2\n      position:\n        x: 5666.568053742165\n        y: 592.0112986374795\n      parameters:\n        code: \"\\n\\n\\n// 在这里，您可以通过 ‘params’  获取节点中的输入变量，并通过 'ret' 输出结果\\n// 'params' 和 'ret' 已经被正确地注入到环境中\\n// 下面是一个示例，获取节点输入中参数名为‘input’的值：\\n// const input = params.input; \\n// 下面是一个示例，输出一个包含多种数据类型的 'ret' 对象：\\n// const ret = { \\\"name\\\": ‘小明’, \\\"hobbies\\\": [“看书”, “旅游”] };\\nasync function main({ params }: Args): Promise<Output> {\\n    const { image_list, list, audio_list, duration_list, bg_image, first_img } = params;\\n\\n    // 处理音频数据\\n    const audioData = [];\\n    let audioStartTime = 0;\\n    const videoTimelines = [];\\n    let maxDuration = 0;\\n    \\n    image_list.splice(0, 1, first_img);\\n    \\n    for (let i = 0; i < audio_list.length && i < duration_list.length; i++) {\\n        const duration = duration_list[i];\\n        audioData.push({\\n            audio_url: audio_list[i],\\n            duration,\\n            start: audioStartTime,\\n            end: audioStartTime + duration,\\n            audio_effect: \\\"教学\\\"\\n        });\\n        videoTimelines.push({\\n            start: audioStartTime,\\n            end: audioStartTime + duration\\n        });\\n        audioStartTime += duration;\\n        maxDuration = audioStartTime;\\n    }\\n\\n    // 处理图片数据\\n    const imageData = [];\\n   \\n    // 使用示例\\n    const scheduler = new AnimationScheduler();\\n\\n    // 处理图片序列\\n    const imgData = scheduler.process(image_list,duration_list);\\n    \\n\\n\\n    // 增加转场特效\\n    let zc_mp3 = [];\\n    for(let i=0; i<imgData.length;i++){\\n        if(i%3==0){\\n            imgData[i].transition= \\\"翻页\\\";\\n            imgData[i].transition_duration = 2000000;\\n\\n            // 增加对应转场音效\\n            zc_mp3.push(\\n                {\\n                    \\\"audio_url\\\": params.zc_mp3_url,\\n                    \\\"duration\\\": 0,\\n                    \\\"volume\\\": 8,\\n                    \\\"start\\\": imgData[i].end - 500000,\\n                    \\\"end\\\": imgData[i].end + 500000\\n                }\\n            );\\n        } else{\\n            const array = [\\\"向上滑动\\\", \\\"放大\\\"];\\n            const randomElement = array[Math.floor(Math.random() * array.length)];\\n            imgData[i].in_animation= randomElement;\\n        }\\n    }\\n\\n   \\n    // 处理背景图片\\n    const bgImageData = [\\n        {\\n            image_url: bg_image,\\n            width: 1920,\\n            height: 1080,\\n            start: 0,\\n            end: maxDuration + 1000000\\n        }\\n    ];\\n\\n    // 处理首图\\n    const firstImageData = [\\n        {\\n            image_url: first_img,\\n            width: 1920,\\n            height: 1080,\\n            start: 0,\\n            end: duration_list[0]-166666\\n        }\\n    ];\\n    \\n\\n    // 左上角书本名称+作者  \\n    // 书名：5  -995/844  #fe8a80\\n    // 作者：5  -896/731  #fe8a80     \\n    // 右下角IP #b3a6a1   5  582/-452\\n    const book_name =[];\\n    const book_name_timelines = [];\\n    const author_name =[];\\n    const author_name_timelines = [];\\n    const ip_name =[];\\n    const ip_name_timelines = [];\\n\\n    book_name.push(params.book_name);\\n    author_name.push(params.author_name);\\n    ip_name.push(params.ip_name);\\n    book_name_timelines.push({\\n        start:2000000,\\n        end: maxDuration + 1000000\\n    });\\n    author_name_timelines.push({\\n        start:3000000,\\n        end: maxDuration + 1000000\\n    });\\n    ip_name_timelines.push({\\n        start:1000000,\\n        end: maxDuration + 1000000\\n    });\\n \\n    \\n  \\n  // 处理字幕数据（保持原始返回结构）\\n  const captions = list.map(item => item.cap);\\n  const subtitleDurations = duration_list;\\n\\n  \\n  const { textTimelines, processedSubtitles } = processSubtitles(\\n    captions,\\n    subtitleDurations\\n  );\\n\\n\\n    let bg_mp3 = [\\n        {\\n            \\\"audio_url\\\": params.mp3_url,\\n            \\\"duration\\\": 0,\\n            \\\"volume\\\": 0.1,\\n            \\\"start\\\": 0,\\n            \\\"end\\\": maxDuration + 1000000\\n        }\\n    ]\\n\\n    \\n    const originalArray = processedSubtitles;\\n    const firstProcessedSubtitles = originalArray.slice(0, 1); // 前2个元素的独立数组\\n    const remainingProcessedSubtitles = originalArray.slice(1);       // 剩余元素的数组\\n\\n    const first_textTimelines = textTimelines.slice(0, 1); // 前2个元素的独立数组\\n    const remainingTextTimelines = textTimelines.slice(1);       // 剩余元素的数组\\n\\n\\n    // 关键词匹配\\n    const keywords = params.keywords;\\n    const finalResult = assembleResults(\\n        keywords,         // keywords_new\\n        remainingProcessedSubtitles, // processedSubtitles\\n        remainingTextTimelines // textTimelines\\n    );\\n\\n    const firstResult = assembleResults(\\n        keywords,         // keywords_new\\n        firstProcessedSubtitles, // processedSubtitles\\n        first_textTimelines // textTimelines\\n    );\\n    \\n    \\n\\n    // 构建输出对象\\n    const result = {\\n        audio_list: JSON.stringify(audioData),\\n        image_list: JSON.stringify(imageData),\\n        timelines: videoTimelines,\\n        text_timelines: remainingTextTimelines,\\n        text_cap: remainingProcessedSubtitles,\\n\\n        first_textTimelines:first_textTimelines,\\n        firstProcessedSubtitles:firstProcessedSubtitles,\\n\\n        max_time: maxDuration,\\n        firstImageData: JSON.stringify(firstImageData),\\n        bg_image: JSON.stringify(bgImageData),\\n        imageDataLeft:JSON.stringify(imgData),\\n        // imageDataRight:JSON.stringify(imgData.right),\\n        // imgData: imgData,\\n        book_name_timelines:book_name_timelines,\\n        book_name:book_name,\\n        author_name:author_name,\\n        author_name_timeline:author_name_timelines,\\n        ip_name:ip_name,\\n        ip_name_timelines:ip_name_timelines,\\n        bg_mp3:JSON.stringify(bg_mp3),\\n        zc_mp3:JSON.stringify(zc_mp3),\\n        main_text:JSON.stringify(finalResult),\\n        first_text:JSON.stringify(firstResult)\\n\\n    };\\n\\n    return result;\\n}\\n\\nconst SUB_CONFIG = {\\n    MAX_LINE_LENGTH: 25,\\n    SPLIT_PRIORITY: ['，',',','：',':','、', '；',';', ' '],\\n    TIME_PRECISION: 3,\\n    BUFFER_RANGE: 3  // 新增缓冲范围\\n  };\\n  \\n  // 智能分行函数（修复版）\\n  function splitLongPhrase(text, maxLen) {\\n    if (text.length <= maxLen) return [text];\\n    \\n    // 扩展查找范围（maxLen + buffer）\\n    for (const delimiter of SUB_CONFIG.SPLIT_PRIORITY) {\\n      const pos = text.lastIndexOf(delimiter, maxLen + SUB_CONFIG.BUFFER_RANGE);\\n      if (pos > 0 && pos <= maxLen + SUB_CONFIG.BUFFER_RANGE) {\\n        const splitPos = pos + 1;\\n        return [\\n          text.substring(0, splitPos).trim(),\\n          ...splitLongPhrase(text.substring(splitPos).trim(), maxLen)\\n        ];\\n      }\\n    }\\n  \\n    // 无标点时按汉字边界分割\\n    for (let i = maxLen; i > 0; i--) {\\n      if (/[\\\\p{Unified_Ideograph}]/u.test(text[i])) {\\n        return [\\n          text.substring(0, i + 1).trim(),\\n          ...splitLongPhrase(text.substring(i + 1).trim(), maxLen)\\n        ];\\n      }\\n    }\\n  \\n    // 强制分割保留更多上下文\\n    const splitPos = Math.min(maxLen, text.length);\\n    return [\\n      text.substring(0, splitPos).trim(),\\n      ...splitLongPhrase(text.substring(splitPos).trim(), maxLen)\\n    ];\\n  }\\n  \\n  // 处理字幕数据（修复清理逻辑）\\n  const processSubtitles = (captions, subtitleDurations) => {\\n    // 修改后的正则：保留逗号、顿号等基本标点\\n    const cleanRegex = /[\\\\u3000\\\\u3002-\\\\u303F\\\\uff00-\\\\uffef\\\\u2000-\\\\u206F!\\\"#$%&'()*+\\\\-./<=>?@\\\\\\\\^_`{|}~]/g;\\n    \\n    let processedSubtitles = [];\\n    let processedSubtitleDurations = [];\\n    \\n    captions.forEach((text, index) => {\\n      const totalDuration = subtitleDurations[index];\\n      let phrases = splitLongPhrase(text, SUB_CONFIG.MAX_LINE_LENGTH);\\n      \\n      // 清理标点时保留分割用标点\\n      phrases = phrases.map(p => p.replace(cleanRegex, '').trim())\\n                     .filter(p => p.length > 0);\\n  \\n      if (phrases.length === 0) {\\n        processedSubtitles.push('[无内容]');\\n        processedSubtitleDurations.push(totalDuration);\\n        return;\\n      }\\n  \\n      // 时间分配逻辑保持不变\\n      const totalMs = totalDuration * 1000;\\n      const totalChars = phrases.reduce((sum, p) => sum + p.length, 0);\\n      let accumulatedMs = 0;\\n      \\n      phrases.forEach((phrase, i) => {\\n        const ratio = phrase.length / totalChars;\\n        let durationMs = i === phrases.length - 1 \\n          ? totalMs - accumulatedMs \\n          : Math.round(totalMs * ratio);\\n  \\n        processedSubtitles.push(phrase);\\n        processedSubtitleDurations.push(durationMs / 1000);\\n        accumulatedMs += durationMs;\\n      });\\n    });\\n  \\n    // 生成时间轴（保持不变）\\n    const textTimelines = [];\\n    let currentTime = 0;\\n    \\n    processedSubtitleDurations.forEach(duration => {\\n      const preciseStart = currentTime;\\n      const preciseEnd = preciseStart + duration;\\n      \\n      textTimelines.push({\\n        start: Number(preciseStart.toFixed(SUB_CONFIG.TIME_PRECISION)),\\n        end: Number(preciseEnd.toFixed(SUB_CONFIG.TIME_PRECISION))\\n      });\\n      \\n      currentTime = preciseEnd;\\n    });\\n  \\n    return { textTimelines, processedSubtitles };\\n  };\\n\\n  /*\\n * 入场动画预设池（单轨道版）\\n * 结构：模式名 -> 轨道位置 -> 可选的动画类型数组\\n */\\nconst ANIMATION_PRESETS = {\\n    // 顺序模式预设\\n    SEQUENCE: {\\n        left: [\\\"向上滑动\\\", \\\"放大\\\"]\\n    },\\n    // 聚焦模式预设\\n    FOCUS: {\\n        left: [\\\"放大\\\", \\\"向上滑动\\\"]\\n    },\\n    // 对称模式预设（调整为单侧配置）\\n    SYMMETRIC: {\\n        left: [\\\"向右滑动\\\", \\\"放大\\\"]\\n    },\\n    // 随机模式预设\\n    RANDOM: {\\n        left: [\\\"向右滑动\\\", \\\"放大\\\", \\\"向下滑动\\\",\\\"向左转入\\\"] \\n    }\\n};\\n\\n/*\\n * 动画模式枚举\\n */\\nconst ANIMATION_MODES = {\\n    SEQUENTIAL: 'sequential',    // 顺序模式\\n    FOCUS: 'focus',             // 聚焦模式\\n    SYMMETRIC: 'symmetric',     // 对称模式（单侧实现）\\n    RANDOM: 'random'            \\n};\\n\\n/*\\n * 全局配置参数（单轨道版本）\\n */\\nconst CONFIG = {\\n    mode: ANIMATION_MODES.SEQUENTIAL,\\n    animationPreset: 'SEQUENCE',       \\n    trackWeights: { left: 2 },         // 移除右轨道权重\\n    overlapTolerance: 1,         \\n    groupSyncThreshold: 2,\\n    sequentialOrder: ['left'],         // 仅保留左轨道\\n    durationSettings: {           \\n        unit: 1,                 \\n        baseExtension: 500000,    \\n        minDuration: 1000000,     \\n        groupRatio: 1.5          \\n    }\\n};\\n\\n// 单轨道处理器\\nclass AnimationScheduler {\\n    constructor() {\\n        this.tracks = { left: [] };    // 仅保留左轨道\\n        this.timeWindows = [];\\n        this.groups = [];\\n        this.currentGroup = null;\\n    }\\n\\n    process(imageList, durationList) {\\n        imageList.forEach((img, idx) => {\\n            this._processImage(img, idx, durationList);\\n        });\\n        this._postProcess();\\n        return this._formatOutput();\\n    }\\n\\n    _processImage(image, index, durations) {\\n        const start = this._getStartTime(index, durations);\\n        const originalDuration = durations[index] * CONFIG.durationSettings.unit;\\n        \\n        this._createGroupIfNeeded(index);\\n        \\n        const { endTime } = this._calculateTiming(start, originalDuration);\\n        const animation = this._selectAnimation();\\n        const item = this._createItem(image, start, endTime, animation);\\n        \\n        this._updateState(item, endTime);\\n    }\\n\\n    _createGroupIfNeeded(index) {\\n        let shouldCreate = false;\\n        \\n        // 简化分组逻辑\\n        if (CONFIG.mode === ANIMATION_MODES.SEQUENTIAL) {\\n            shouldCreate = index % CONFIG.groupSyncThreshold === 0;\\n        } else {\\n            shouldCreate = index % 2 === 0 || this.groups.length === 0;\\n        }\\n\\n        if (shouldCreate) {\\n            this.currentGroup = {\\n                items: [],\\n                animationType: this._getGroupAnimationType(),\\n                endTime: 0\\n            };\\n            this.groups.push(this.currentGroup);\\n        }\\n    }\\n\\n    _getGroupAnimationType() {\\n        const preset = ANIMATION_PRESETS[CONFIG.animationPreset];\\n        switch(CONFIG.mode) {\\n            case ANIMATION_MODES.RANDOM:\\n                return { left: this._randomPick(preset.left) };\\n            default:\\n                return { left: this._randomPick(preset.left) };\\n        }\\n    }\\n\\n    _calculateTiming(start, originalDuration) {\\n        const baseEnd = start + originalDuration;\\n        let endTime = baseEnd + CONFIG.durationSettings.baseExtension;\\n        \\n        if (this.currentGroup.items.length > 0) {\\n            endTime = Math.max(endTime, this.currentGroup.endTime);\\n        }\\n        \\n        endTime = Math.max(\\n            endTime,\\n            start + CONFIG.durationSettings.minDuration\\n        );\\n        \\n        this.currentGroup.endTime = endTime;\\n        return { endTime };\\n    }\\n\\n    _createItem(image, start, end, animation) {\\n        return {\\n            image_url: image,\\n            in_animation: animation,\\n            start: start,\\n            end: end,\\n            width: 1920,\\n            height: 1080,\\n            track: 'left'  // 固定为左轨道\\n        };\\n    }\\n\\n    _selectAnimation() {\\n        return this.currentGroup.animationType.left;\\n    }\\n\\n    _updateState(item, groupEnd) {\\n        this.tracks.left.push(item);\\n        this.currentGroup.items.push(item);\\n        this.currentGroup.items.forEach(i => i.end = groupEnd);\\n    }\\n\\n    _postProcess() {\\n        this._adjustTrackOverlaps();\\n    }\\n\\n    _adjustTrackOverlaps() {\\n        this.tracks.left.sort((a, b) => a.start - b.start);\\n        for (let i = 1; i < this.tracks.left.length; i++) {\\n            const prev = this.tracks.left[i - 1];\\n            const curr = this.tracks.left[i];\\n            if (prev.end > curr.start) {\\n                const adjust = (prev.end - curr.start) * CONFIG.overlapTolerance;\\n                prev.end -= adjust;\\n                curr.start = prev.end;\\n            }\\n        }\\n    }\\n\\n    _getStartTime(index, durations) {\\n        return index === 0 ? 0 : durations\\n            .slice(0, index)\\n            .reduce((sum, dur) => sum + dur * CONFIG.durationSettings.unit, 0);\\n    }\\n\\n    _formatOutput() {\\n        return this.tracks.left.map(item => ({\\n            image_url: item.image_url,\\n            //in_animation: item.in_animation,\\n            start: item.start,\\n            end: item.end,\\n            width: item.width,\\n            height: item.height\\n        }));\\n    }\\n\\n    _randomPick(arr) {\\n        return arr[Math.floor(Math.random() * arr.length)];\\n    }\\n}\\n\\nfunction configure(options) {\\n    Object.assign(CONFIG, options);\\n}\\n\\nfunction assembleResults(keywords_new, processedSubtitles, textTimelines) {\\n    const result = [];\\n    \\n    for (let i = 0; i < processedSubtitles.length; i++) {\\n        const text = processedSubtitles[i];\\n        const { start, end } = textTimelines[i];\\n        let matchedKeywords = [];\\n        \\n        // 遍历所有关键词进行匹配检查\\n        for (const keyword of keywords_new) {\\n            if (text.includes(keyword)) {\\n                matchedKeywords.push(keyword);\\n            }\\n        }\\n        \\n        // 去重并生成结果对象\\n        if (matchedKeywords.length > 0) {\\n            const uniqueKeywords = [...new Set(matchedKeywords)];\\n            result.push({\\n                start,\\n                end,\\n                text,\\n                keyword: uniqueKeywords.join('|'), // 多个关键词用逗号分隔\\n                keyword_color: \\\"#fe8a80\\\", // #ff7100\\n                keyword_font_size: 10,\\n                font_size: 7\\n            });\\n        } else {\\n            result.push({\\n                start,\\n                end,\\n                text\\n            });\\n        }\\n    }\\n    \\n    return result;\\n}\\n\\n/* 使用示例\\nconst finalResult = assembleResults(\\n    [\\\"关键词1\\\", \\\"关键词2\\\"],         // keywords_new\\n    [\\\"字幕1\\\", \\\"包含关键词2的字幕\\\"], // processedSubtitles\\n    [{start:0,end:100}, {start:101,end:200}] // textTimelines\\n);\\n*/\"\n        language: 5\n        node_inputs:\n            - name: audio_list\n              input:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value:\n                    path: output\n                    ref_node: \"169595\"\n            - name: duration_list\n              input:\n                type: list\n                items:\n                    type: integer\n                    value: null\n                value:\n                    path: duration_list\n                    ref_node: \"169595\"\n            - name: image_list\n              input:\n                type: list\n                items:\n                    type: image\n                    value: null\n                value:\n                    path: data_list\n                    ref_node: \"180681\"\n            - name: list\n              input:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        cap:\n                            type: string\n                            value: null\n                        desc:\n                            type: string\n                            value: null\n                        desc_promopt:\n                            type: string\n                            value: null\n                        story_name:\n                            type: string\n                            value: null\n                    value: null\n                value:\n                    path: list\n                    ref_node: \"150774\"\n            - name: bg_image\n              input:\n                type: image\n                value:\n                    path: data\n                    ref_node: \"180549\"\n            - name: book_name\n              input:\n                value:\n                    path: book_name\n                    ref_node: \"100001\"\n            - name: author_name\n              input:\n                value:\n                    path: auther_name\n                    ref_node: \"100001\"\n            - name: ip_name\n              input:\n                value:\n                    path: ip_name\n                    ref_node: \"100001\"\n            - name: mp3_url\n              input:\n                type: string\n                value: \"https://codel-agent.oss-cn-shanghai.aliyuncs.com/RW%20%E7%AE%80%E5%8D%95%E7%9A%84%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90%20-%20%E8%AF%BB%E4%B9%A6%E8%83%8C%E6%99%AF%E9%9F%B3%E4%B9%90.mp3\"\n            - name: keywords\n              input:\n                value:\n                    path: keywords\n                    ref_node: \"173538\"\n            - name: first_img\n              input:\n                type: image\n                value:\n                    path: data\n                    ref_node: \"684986\"\n            - name: zc_mp3_url\n              input:\n                type: string\n                value: \"https://codel-agent.oss-cn-shanghai.aliyuncs.com/pd-5b768f485917e84.mp3\"\n        node_outputs:\n            author_name:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value: null\n            author_name_timeline:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        end:\n                            type: integer\n                            value: null\n                        start:\n                            type: integer\n                            value: null\n                    value: null\n                value: null\n            bg_image:\n                type: string\n                value: null\n            bg_mp3:\n                type: string\n                value: null\n            book_name:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value: null\n            book_name_timelines:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        end:\n                            type: integer\n                            value: null\n                        start:\n                            type: integer\n                            value: null\n                    value: null\n                value: null\n            first_text:\n                type: string\n                value: null\n            first_textTimelines:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        end:\n                            type: integer\n                            value: null\n                        start:\n                            type: integer\n                            value: null\n                    value: null\n                value: null\n            firstImageData:\n                type: string\n                value: null\n            firstProcessedSubtit:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value: null\n            image_list:\n                type: string\n                value: null\n            imageDataLeft:\n                type: string\n                value: null\n            ip_name:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value: null\n            ip_name_timelines:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        end:\n                            type: integer\n                            value: null\n                        start:\n                            type: integer\n                            value: null\n                    value: null\n                value: null\n            keywords_new:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value: null\n            main_text:\n                type: string\n                value: null\n            max_time:\n                type: integer\n                value: null\n            text_cap:\n                type: list\n                items:\n                    type: string\n                    value: null\n                value: null\n            text_timelines:\n                type: list\n                items:\n                    type: object\n                    properties:\n                        end:\n                            type: integer\n                            value: null\n                        start:\n                            type: integer\n                            value: null\n                    value: null\n                value: null\n            timelines:\n                type: list\n                i\n\nFile v0.1.0:skill-card.md\n\n## Description:\n\nGenerates a 3-minute English video summarizing a book by creating a review script, storyboard, AI illustrations, English TTS narration, subtitles, and a final MP4.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[chenjun198711](https://clawhub.ai/user/chenjun198711)\n\n### License/Terms of Use:\n\nMIT\n\n## Use Case:\n\nExternal users, developers, and content creators use this skill to turn a book title and author into an English short-form book digest video with generated narration, illustrations, subtitles, and compositing assets.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: The skill automatically installs unpinned Python packages during normal execution.\n\nMitigation: Use a dedicated virtual environment, preinstall reviewed and pinned dependencies, and avoid relying on script-driven package installation during production runs.\n\nRisk: Book data, unpublished manuscript content, branding, prompts, and generated narration or image prompts may be sent to external search, image, and TTS providers.\n\nMitigation: Use only providers approved for the data being processed and do not submit confidential or sensitive content unless those providers are authorized.\n\nRisk: The local Stable Diffusion backend is configured through SD_WEBUI_URL.\n\nMitigation: Keep SD_WEBUI_URL pointed only at a trusted local service before using the local image backend.\n\n## Reference(s):\n\n- [ClawHub skill page](https://clawhub.ai/chenjun198711/skills/book-video-generator-en)\n- [Server-resolved GitHub repository](https://github.com/chenjun198711/book-video-generator-en)\n- [Agent Skills open standard](https://agentskills.io)\n- [Cross-platform adaptation guide](references/CROSS_PLATFORM.md)\n- [Prompt references](references/prompts.md)\n- [Original workflow backup](references/workflow-original.yaml)\n- [Volcano speech console](https://console.volcengine.com/speech/new)\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance, files]\n\n**Output Format:** [Markdown guidance with JSON examples and shell commands; workflow outputs MP4 video files plus supporting image, audio, and subtitle assets.]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Requires book title and author inputs; optional account watermark, provider credentials, image backend, TTS engine, background music, and transition sound settings.]\n\n## Skill Version(s):\n\n0.1.0 (source: server release metadata; artifact frontmatter lists 1.0.0)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nFile v0.1.0:LICENSE\n\nMIT License\n\nCopyright (c) 2026\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.","readmeExcerpt":"Skill: Book Video Generator En Owner: chenjun198711 Summary: Generates a 3-minute English video summarizing any book by creating script, storyboard, AI illustrations, TTS narration, subtitles, and final MP4 automatically. Tags: latest:0.1.0 Version history: v0.1.0 | 2026-07-30T02:55:17.397Z | auto - Initial public release of the English 3-minute book digest video generator. - Automatically generates a 3-minute book r","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"pip install edge-tts imageio-ffmpeg pillow"},{"language":"bash","snippet":"export VOLC_TTS_API_KEY=\"your-api-key\""},{"language":"json","snippet":"{\n  \"book_name\": \"...\",\n  \"author_name\": \"...\",\n  \"year\": \"yyyy-MM\",\n  \"content\": \"1000+ word book review script (hook intro + core content + key insights)\",\n  \"category\": \"Book category\"\n}"},{"language":"json","snippet":"{\n  \"list\": [\n    {\n      \"story_name\": \"Shot name\",\n      \"desc\": \"Visual description\",\n      \"cap\": \"Subtitle text (one sentence)\",\n      \"desc_promopt\": \"Image generation prompt (English)\"\n    }\n  ],\n  \"keywords\": [\"keyword1\", \"keyword2\"]\n}"},{"language":"python","snippet":"list.insert(0, {\n    \"story_name\": \"Intro\",\n    \"desc\": \"Read one book every day\",\n    \"cap\": f\"Read a book in 3 minutes. Today we're reading {book_name} by {author_name}.\",\n    \"desc_promopt\": \"A person reading a book, flat illustration style\"\n})"},{"language":"bash","snippet":"python3 scripts/generate_audio.py --text \"<subtitle>\" --output \"audio_001.mp3\""}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: book-video-generator-en\nslug: book-video-generator-en\nversion: 1.0.0\ndisplayName: 三分钟精读一本书英文版\ndescription: English 3-minute book digest video generator. Input a book title + author, one-click generate a 3-minute book review video (review script → storyboard → AI illustrations → English TTS narration → subtitles → final MP4). Trigger words: book video, 3 minute book summary, read a book in 3 minutes, book digest, make a book video. Cross-platform compatible with WorkBuddy / OpenClaw / Codex CLI / TRAE Work.\n---\n\n# 3-Minute Book Digest — English Version\n\n## Overview\n\nAutomatically turn any book into a 3-minute explainer video: from writing the\nreview script, splitting it into storyboards, AI illustration, English TTS\nnarration, to subtitle compositing — fully automated.\n\nDerived from the Coze workflow \"Pipadushu_video_1\". This Skill follows the\n[Agent Skills open standard](https://agentskills.io) and is cross-platform\ncompatible with WorkBuddy, OpenClaw, Codex CLI, and TRAE Work.\n\nIt replaces Coze plugins with local open-source tools: 剪映小助手 (Jianying\nassistant) → ffmpeg, Coze image generation → multi-model image generation\n(default ImageGen + alternatives Volcano Seedream / Gemini / Agnes), Coze TTS →\nVolcano Engine TTS (default) / edge-tts (fallback). All script, narration,\non-screen text, and prompts are **fully in English**.\n\n## Platform Tool Mapping\n\nThis Skill's workflow involves 3 platform-related tools. Pick the matching tool\nfor the platform you are running on.\n\n### Web Search (Stage 1 — search for book info)\n\n| Platform | Tool | Notes |\n|----------|------|-------|\n| WorkBuddy | `WebSearch` | Built-in tool, call directly |\n| OpenClaw | built-in web search | Auto-available |\n| Codex CLI | `shell: curl` or search MCP | Use shell commands or install a search MCP |\n| TRAE Work | built-in web search | Auto-available |\n\n### Image Generation (Stage 4a — storyboard illustrations)\n\nProvides **1 default + 3 alternatives**. Switch via the `IMAGE_API` env var:\n\n| Plan | Tool | Model | Env var | Notes |\n|------|------|-------|---------|-------|\n| 🏠 **Default** | `ImageGen` | Tencent Hunyuan (WorkBuddy built-in) | none | Call `DeferExecuteTool` directly in WorkBuddy |\n| 🏔️ Alt | `volcengine` | Volcano Seedream 5.0 lite (ByteDance) | `ARK_API_KEY` (recommended) or `VOLCENGINE_AK` + `VOLCENGINE_SK` | Original Coze image model; best for flat Chinese/English style, supports watermark removal |\n| 🤖 Alt | `gemini` | Google Gemini 3 Pro Image | `GEMINI_API_KEY` | Rich detail, strong semantic understanding |\n| ✨ Alt | `agnes` | Agnes AI (completely free) | `AGNES_API_KEY` | Free registration, OpenAI-compatible API |\n\n**Switching**:\n- **WorkBuddy**: uses `ImageGen` by default. To switch, set `IMAGE_API=volcengine|gemini|agnes`, the script auto-calls `scripts/generate_image.py`.\n- **CLI platforms** (Codex CLI / OpenClaw): run `scripts/generate_image.py --api <plan>` directly.\n\n> On every platform, the image prompt uses the `desc_promopt` field from th"},{"path":"assets/README.md","content":"# 素材文件说明\n\n本目录用于存放视频合成的可选音频素材。**这些文件是可选的**——如果缺失，视频仍可正常生成，只是没有背景音乐和转场音效。\n\n## 所需文件\n\n| 文件名 | 用途 | 大小 | 必需性 |\n|--------|------|------|--------|\n| `bgm_reading.mp3` | 背景音乐（全程循环，音量0.15） | ~9MB | 可选 |\n| `transition_page_flip.mp3` | 转场音效（翻页声，每3个分镜触发） | ~3KB | 可选 |\n\n## 获取方式\n\n### 方式1：自行下载免费素材\n\n- **BGM**：从 [Pixabay Music](https://pixabay.com/music/) 或 [Free Music Archive](https://freemusicarchive.org/) 下载轻柔的阅读背景音乐，重命名为 `bgm_reading.mp3`\n- **翻页音效**：从 [Pixabay Sound Effects](https://pixabay.com/sound-effects/) 搜索 \"page flip\" 或 \"page turn\"，下载后重命名为 `transition_page_flip.mp3`\n\n### 方式2：用 ffmpeg 生成简单音效\n\n```bash\n# 生成一个简单的翻页音效（白噪声+衰减）\nffmpeg -f lavfi -i \"anoisesrc=d=0.15:c=pink:a=0.5\" -af \"afade=t=in:st=0:d=0.02,afade=t=out:st=0.1:d=0.05\" assets/transition_page_flip.mp3\n```\n\n### 方式3：从 GitHub 仓库获取\n\n如果本技能有对应的 GitHub 仓库，可以从仓库的 `assets/` 目录下载这些文件。\n\n## 代码处理逻辑\n\n`compose_video.py` 中的 `_find_asset()` 函数会按以下顺序查找：\n1. 脚本同级 `assets/` 目录\n2. 脚本父级 `assets/` 目录（技能根目录）\n3. 脚本同级目录\n\n如果找不到文件，`mix_audio()` 函数会自动跳过混音步骤，直接输出仅含 TTS 旁白的视频。"},{"path":"README.md","content":"# 3-Minute Book Digest (English Version)\n\nAn English fork of the **三分钟精读一本书** book-video generator. Given a book\ntitle + author, it produces a ~3-minute book-explainer video entirely in English:\nreview script → storyboard → AI illustrations → English TTS narration → subtitles → MP4.\n\n## What's different from the Chinese version\n\n| Area | Chinese version | This version (`book-video-generator-en`) |\n|------|-----------------|------------------------------------------|\n| Review script / storyboard prompts | Chinese (`references/prompts.md`) | **English** |\n| On-screen text (subtitles, chapter titles, cover) | Chinese | **English** |\n| TTS narration | Chinese voices (`zh_female_zhixingnv…` / `zh-CN-XiaoxiaoNeural`) | **English voices** (`en_us_amy` / `en-US-AriaNeural`) |\n| Cover brand text | \"3 分钟精读一本书\" | \"3-MINUTE BOOK DIGEST\" |\n| Fonts | Microsoft YaHei / PingFang / Noto CJK | Arial / Helvetica / DejaVu Sans |\n| Subtitle line length | ~16 chars/line | ~42 chars/line, word-boundary wrapping |\n| Output file | `{book}_三分钟精读书.mp4` | `{book}_3min_digest.mp4` |\n\n## Workflow\n\n1. **Stage 1** — LLM writes a ~1000-word English review script (web-search backed).\n2. **Stage 2** — LLM splits it into 8–50 storyboard shots (caption + visual + image prompt).\n3. **Stage 3** — LLM derives 4 ≤6-word section titles for the progress bar.\n4. **Stage 4** — generate illustrations (ImageGen / Volcano / Gemini / Agnes), English TTS audio, and the opening cover.\n5. **Stage 5** — `compose_video.py` composites everything into the final MP4.\n\nSee `SKILL.md` for the full guide, and `references/CROSS_PLATFORM.md` for\ninstall + tool-adaptation steps on OpenClaw, Codex CLI, TRAE Work, Claude Code, etc.\n\n## Requirements\n\n```bash\npip install edge-tts imageio-ffmpeg pillow\n```\n\n- TTS: edge-tts works out of the box (no key). Set `VOLC_TTS_API_KEY` to use Volcano Engine TTS instead.\n- Image generation: WorkBuddy uses the built-in `ImageGen` by default; CLI platforms use `scripts/generate_image.py` with `IMAGE_API`.\n- Background music / transition SFX in `assets/` are optional.\n\n## Troubleshooting\n\n- **Stage 5 `compose_video.py` exits 1 with no traceback (silent kill).** The\n  full ~3-minute 1080p re-encode is memory/CPU heavy and gets killed by the\n  Bash sandbox. Run it with the sandbox bypassed (local ffmpeg only, no network\n  needed): `python scripts/compose_video.py < segments.json` executed outside the\n  sandbox. Or raise the sandbox resource limits before running.\n- **Two image generations failed with `RequestLimitExceeded.JobNumExceed`.**\n  The image provider caps concurrent jobs; just retry the failed shots after a\n  moment. Order them into `scene_NNN.png` afterward.\n- **TTS uses edge-tts (English) by default** because no `VOLC_TTS_API_KEY` is\n  set. Set the key to switch to Volcano Engine TTS (`en_us_amy`).\n\n## Files\n\n- `SKILL.md` — skill spec and full workflow\n- `references/prompts.md` — all LLM prompts (English)\n- `references/CROSS_PLATFORM.md` — install/adapt for OpenClaw, "},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7eq2qd3rr9x7qsqf30dbt3b58120ra\",\n  \"slug\": \"book-video-generator-en\",\n  \"version\": \"0.1.0\",\n  \"publishedAt\": 1785380117397\n}"},{"path":"references/CROSS_PLATFORM.md","content":"# 跨平台适配指南（English Edition）\n\n本文件说明 `book-video-generator-en`（三分钟精读一本书 · 英文版）技能在各 AI Agent 平台上的安装与工具适配方法。\n\n技能遵循 [Agent Skills 开放标准](https://agentskills.io)，核心组件（`SKILL.md` 格式、LLM 提示词、Python 脚本）**跨平台通用**，仅需适配平台专有工具（主要是图像生成）。\n\n---\n\n## 平台兼容性总览\n\n| 组件 | WorkBuddy | OpenClaw | Codex CLI | TRAE Work | Claude Code |\n|------|-----------|----------|-----------|-----------|-------------|\n| SKILL.md 格式 | 原生 | 兼容 | 兼容 | 兼容 | 兼容 |\n| LLM 提示词（英文） | 直接用 | 直接用 | 直接用 | 直接用 | 直接用 |\n| Python 脚本 | 直接用 | 直接用 | 直接用 | 直接用 | 直接用 |\n| 联网搜索 | WebSearch | 内置 | Shell/MCP | 内置 | 内置 |\n| 图像生成 | ImageGen（内置） | 插件 / generate_image.py | generate_image.py | MCP / generate_image.py | 内置 / generate_image.py |\n| 英文 TTS | edge-tts（默认） | edge-tts | edge-tts | edge-tts | edge-tts |\n| 技能目录 | ~/.workbuddy/skills/ | ~/.openclaw/skills/ | ~/.codex/skills/ | ~/.trae/skills/ | ~/.claude/skills/ |\n\n> 核心脚本**无任何平台硬编码路径**，统一使用 `os.path.join` / `pathlib.Path` 与 `sys.executable`，在 Windows / macOS / Linux 均可直接运行。\n\n---\n\n## 1. WorkBuddy（当前平台）\n\n无需额外配置，技能已安装。\n\n- 联网搜索：内置 `WebSearch` 工具\n- 图像生成：内置 `ImageGen` 延迟工具（通过 ToolSearch + DeferExecuteTool 调用，Tencent Hunyuan）\n- 英文 TTS：`generate_audio.py` 默认 `en-US-AriaNeural`（edge-tts，免费、无需 Key）\n- Python 运行：托管 Python `C:/Users/chenjun/.workbuddy/binaries/python/versions/3.13.12/python.exe`\n\n---\n\n## 2. OpenClaw\n\n### 安装\n\n```bash\n# 方式一：直接复制\ncp -r ~/.workbuddy/skills/book-video-generator-en ~/.openclaw/skills/\n\n# 方式二：通过 ClawHub 安装（需先发布）\nopenclaw skills install book-video-generator-en\n\n# 方式三：从 Git 仓库安装\nopenclaw skills install git:yourname/book-video-generator-en\n```\n\n### 工具适配\n\nOpenClaw 支持在 `SKILL.md` frontmatter 中声明 `tools`。如需原生图像生成，可声明一个指向 `scripts/generate_image.py` 的 handler；否则 CLI 阶段直接调用该脚本即可。\n\n联网搜索：OpenClaw 内置 web search，无需配置。\n\n图像生成：\n\n```bash\n# 任选一种 API（需对应 Key）\nexport GEMINI_API_KEY=\"...\"      # 或 AGNES_API_KEY / OPENAI_API_KEY / ARK_API_KEY\npython3 scripts/generate_image.py --prompt \"flat illustration ...\" --output images/scene_000.png --api gemini\n# 批量（从 storyboard.json）\npython3 scripts/generate_image.py --batch storyboard.json --output-dir images/ --api gemini\n```\n\n### 验证\n\n```bash\nopenclaw skills verify book-video-generator-en\n```\n\n---\n\n## 3. Codex CLI（OpenAI）\n\n### 安装\n\n```bash\n# 1. 开启 Skills 功能（config.toml）\ncat >> ~/.codex/config.toml << 'EOF'\n[features]\nskills = true\nEOF\n\n# 2. 复制技能目录\ncp -r ~/.workbuddy/skills/book-video-generator-en ~/.codex/skills/\n\n# 3. 重启 Codex CLI\n# 4. 验证：在 Codex CLI 输入 /skills，确认 book-video-generator-en 出现\n```\n\n### 工具适配\n\n**联网搜索**：Codex CLI 无内置搜索，两种方案：\n\n方案 A — Shell 命令搜索（免安装）：\n```bash\ncurl -s \"https://www.google.com/search?q=book+title+author+summary\" | python3 -c \"...\"\n```\n方案 B — 安装搜索 MCP 插件。\n\n**图像生成**：Codex CLI 无内置图像生成，使用 `scripts/generate_image.py`（见上方 OpenClaw 示例）。`IMAGE_API` 环境变量可设默认 API（默认 `gemini`）。\n\n**英文 TTS**：`generate_audio.py` 默认走 edge-tts，免费且无需 Key，联网即用。\n\n### 注意事项\n\n- Codex CLI 的 `SKILL.md` frontmatter 支持 `metadata.short-description`\n- 技能也可放在项目级 `.codex/skills/` 或仓库根 `.agents/skills/`\n- 渐进式披露：启动时仅加载 name + description\n\n---\n\n## 4. TRAE "}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":null,"editorialQuality":{"score":100,"threshold":65,"status":"thin","wordCount":1470,"uniquenessScore":43,"reasons":["uniqueness-below-45"]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-09T11:38:35.164Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-09T11:38:35.164Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-09T22:15:08.999Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}