[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6EX0XAFJKTDN38VZTVMSWX3":3,"skill-same:01M6EX0XAFJKTDN38VZTVMSWX3":215},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":46,"linkOnly":47,"markdownContent":48,"markdownBody":49,"frontMatter":50,"refName":53,"commitSha":54,"skillDirectory":55,"forksCount":56,"repositoryHtmlUrl":57,"repositoryHomepageUrl":58,"ownerHtmlUrl":59,"ownerBlogUrl":6,"ownerDescription":60,"updatedAt":61,"install":62,"resources":75},"01M6EX0XAFJKTDN38VZTVMSWX3","ponyflash",null,"Generate images, videos, speech audio, and music using the PonyFlash Python SDK. Also handle local media editing with FFmpeg, including clip, concat, transcode, extract audio, frame capture, subtitle capability checks, and ASS subtitle prep. Use when the user asks to create, generate, produce, edit, trim, merge, concatenate, transcode, subtitle, or render AI-generated media content.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000016","图像与多媒体","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[5,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45],"editing","with","render","local","images","clip","use","generated","edit","python","python sdk","music","Audio","Media","produce","speech","generate","create","merge","2026-11-10 10:12:30",false,"---\nname: ponyflash\ndescription: >-\n  Generate images, videos, speech audio, and music using the PonyFlash Python SDK.\n  Also handle local media editing with FFmpeg, including clip, concat, transcode,\n  extract audio, frame capture, subtitle capability checks, and ASS subtitle prep.\n  Use when the user asks to create, generate, produce, edit, trim, merge, concatenate,\n  transcode, subtitle, or render AI-generated media content.\nlicense: MIT\nmetadata:\n  author: ponyflash\n  version: \"0.3.0\"\n---\n\n# PonyFlash Skill\n\n## Step 0: Decide Which Capability Path Applies\n\nThis skill now contains **two capability families**:\n\n1. **Cloud generation via PonyFlash Python SDK**\n   - image generation\n   - video generation\n   - speech synthesis\n   - music generation\n   - model listing\n   - file management\n   - account \u002F credits\n   - These tasks **require a valid PonyFlash API key**.\n\n2. **Local media editing via FFmpeg toolchain**\n   - ffmpeg \u002F ffprobe detection\n   - installation planning\n   - clip \u002F concat \u002F transcode\n   - extract audio \u002F capture frame\n   - subtitle capability checks\n   - ASS subtitle generation and burn-in workflow\n   - These tasks **do NOT require a PonyFlash API key**, but they **do require local `ffmpeg` \u002F `ffprobe` support**.\n\nBefore doing anything, classify the request:\n\n- If the user is asking to **generate** media with PonyFlash models, follow the SDK path and require API key setup.\n- If the user is asking to **edit or process local media**, follow the FFmpeg path and do dependency checks first.\n- If the user wants an **end-to-end production workflow**, you may use both: generate assets with PonyFlash, then assemble or export with FFmpeg.\n\n## Step 1A: API Key Setup for PonyFlash SDK Tasks\n\nOnly do this section when the request needs PonyFlash cloud capabilities.\n\n**The FIRST time this skill is activated for a cloud generation task**, tell the user the following in your own words:\n\n1. PonyFlash skill is ready to use.\n2. It can handle:\n   - image generation\n   - video generation\n   - speech synthesis\n   - music generation\n   - local media editing with FFmpeg\n3. For complex multi-step productions, there are **Creative Playbooks** in the `playbooks\u002F` directory.\n4. To use PonyFlash cloud generation, the user needs an API key:\n   - Register \u002F log in at **https:\u002F\u002Fwww.ponyflash.com**\n   - Get API key at **https:\u002F\u002Fwww.ponyflash.com\u002Fapi-key** (starts with `rk_`)\n   - Check credits at **https:\u002F\u002Fwww.ponyflash.com\u002Fusage**\n   - Paste the key back in the chat\n\n**On subsequent SDK activations**, check whether `PONYFLASH_API_KEY` is set in the environment. If not, ask the user for the key again.\n\nOnce received, set it up:\n\n```bash\nexport PONYFLASH_API_KEY=\"rk_xxx\"\n```\n\nThen install the SDK:\n\n```bash\npip install ponyflash\n```\n\n**Always verify the key works before any generation task:**\n\n```python\nfrom ponyflash import PonyFlash\n\npony_flash = PonyFlash(api_key=\"\u003Ckey from user>\")\nbalance = pony_flash.account.credits()\nprint(f\"Balance: {balance.balance} {balance.currency}\")\n```\n\nIf verification fails:\n- **Key invalid or missing** → direct user to https:\u002F\u002Fapi.ponyflash.com\u002Fapi-key\n- **Balance is zero** → direct user to https:\u002F\u002Fapi.ponyflash.com\u002Fusage to top up credits\n\n## Step 1B: Local Dependency Setup for FFmpeg Tasks\n\nOnly do this section when the request needs local editing, subtitle, or export work.\n\n1. First check local dependencies:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\"\n```\n\n2. If the task involves subtitles, do **capability checks**, not just existence checks:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\" --require-subtitles-filter\n```\n\n3. If `ffmpeg` \u002F `ffprobe` or required filters are missing:\n- Tell the user what is missing.\n- Ask whether the user wants platform-appropriate FFmpeg installation guidance.\n- After the user installs FFmpeg, rerun the dependency checks before continuing.\n\n## What this Skill Can Do\n\n| Capability | Resource | Description |\n|---|---|---|\n| Image generation | `pony_flash.images` | Text-to-image, image editing with mask\u002Freference images |\n| Video generation | `pony_flash.video` | Text-to-video, first-frame-to-video, OmniHuman, Motion Transfer |\n| Speech synthesis | `pony_flash.speech` | Text-to-speech with voice cloning, emotion control, speed, pitch |\n| Music generation | `pony_flash.music` | Text-to-music with lyrics, style, instrumental mode, continuation |\n| Model listing | `pony_flash.models` | List available models, get model details and supported modes |\n| File management | `pony_flash.files` | Upload, list, get, delete files |\n| Account | `pony_flash.account` | Check credit balance, get recharge link |\n| Local media editing | `scripts\u002Fmedia_ops.sh` | Clip, concat, transcode, extract audio, frame capture |\n| FFmpeg environment checks | `scripts\u002Fcheck_ffmpeg.sh` | Detect ffmpeg \u002F ffprobe and subtitle capabilities |\n| Subtitle font prep | `scripts\u002Fensure_subtitle_fonts.sh` | Keep a reusable local copy of the default subtitle font when explicitly requested |\n| ASS subtitle prep | `scripts\u002Fbuild_ass_subtitles.py` | Adaptive ASS subtitle generation with pre-wrapping |\n\n## Creative Playbooks (production workflows)\n\nThe `playbooks\u002F` directory contains **Creative Playbooks** — step-by-step production workflow guides for specific content types. Playbooks act as a director layer: they tell you **what to create and in what order**, while this SKILL.md tells you **how to execute generation and editing**.\n\n### When to use a playbook\n\n1. **User explicitly requests a playbook by name** → Read the corresponding file from `playbooks\u002F` and follow its workflow.\n2. **User asks to see available playbooks** → Read [playbooks\u002FINDEX.md](playbooks\u002FINDEX.md) and display the full list.\n3. **User's request is clearly a multi-step production task** → Suggest a matching playbook from [playbooks\u002FINDEX.md](playbooks\u002FINDEX.md) and ask whether to use it.\n4. **User's request is a single-step generation or editing task** → Proceed directly with the relevant SDK or FFmpeg capability. No playbook needed.\n\n### How to execute a playbook\n\nOnce a playbook is loaded:\n- Follow its workflow (asset prep → content generation → voice \u002F music → editing → output).\n- Use PonyFlash SDK for generation tasks and FFmpeg scripts for local assembly \u002F export tasks.\n- Confirm key creative decisions with the user before expensive generation.\n- Adapt prompts, durations, output format, and export strategy to the user's actual goal.\n\n### Creating custom playbooks\n\nWhen the user asks to create a new playbook, generate a markdown file in `playbooks\u002F` following this template:\n\n```markdown\n---\nname: Playbook Name\ndescription: One-line summary of what this playbook produces\ntags: [keyword1, keyword2, keyword3]\ndifficulty: beginner | intermediate | advanced\nestimated_credits: credit range estimate\noutput_format: format description (e.g., \"vertical 9:16 MP4\")\n---\n\n# Playbook Name\n\n## Use Cases\nWhen to use this playbook.\n\n## Workflow\n### Step 1: Asset Preparation\nWhat the user needs to provide; how to generate missing assets.\n\n### Step 2: Visual Content Generation\nWhich models to use, recommended parameters, prompt guidance.\n\n### Step 3: Voice \u002F Music\nSpeech synthesis + background music guidance.\n\n### Step 4: Editing \u002F Assembly\nHow to assemble, trim, subtitle, transcode, and export with the local FFmpeg workflow.\n\n### Step 5: Output \u002F Optimization\nRender settings, format recommendations.\n\n## Prompt Templates\nReusable prompt examples for this content type.\n\n## Notes\nBest practices, common pitfalls.\n```\n\nAfter creating the file, update [playbooks\u002FINDEX.md](playbooks\u002FINDEX.md) to include the new playbook.\n\n## PonyFlash SDK Core Concepts\n\n### Client initialization\n\n```python\nfrom ponyflash import PonyFlash\n\npony_flash = PonyFlash(api_key=\"rk_xxx\")\n```\n\nReads `PONYFLASH_API_KEY` from environment if `api_key` is omitted.\n\n### FileInput — zero-friction file handling\n\nAll file parameters accept any of these types:\n\n| Input type | Example | Behavior |\n|---|---|---|\n| URL string | `\"https:\u002F\u002Fexample.com\u002Fphoto.jpg\"` | Passed directly to API |\n| file_id string | `\"file_abc123\"` | Passed directly to API |\n| `Path` object | `Path(\"photo.jpg\")` | Auto-uploaded via presigned URL |\n| `open()` file | `open(\"photo.jpg\", \"rb\")` | Auto-uploaded via presigned URL |\n| `bytes` | `image_bytes` | Auto-uploaded via presigned URL |\n| `(filename, bytes)` tuple | `(\"photo.jpg\", data)` | Auto-uploaded with filename |\n\nTemp uploads are cleaned up automatically after `generate()` completes.\n\nPlain local string paths such as `\".\u002Fphoto.jpg\"` are not supported. For local files, always use `Path(...)` or `open(..., \"rb\")`.\n\n### Generation result\n\n`Generation` object fields: `request_id`, `status`, `outputs`, `usage`, `error`.\n\nConvenience properties:\n- `gen.url` — first output URL (or `None`)\n- `gen.urls` — list of all output URLs\n- `gen.credits` — credits consumed\n\n## Quick Examples (PonyFlash SDK)\n\n### Image\n\n```python\ngen = pony_flash.images.generate(\n    model=\"nano-banana-pro\",\n    prompt=\"A sunset over mountains\",\n    resolution=\"2K\",\n    aspect_ratio=\"16:9\",\n)\nprint(gen.url)\n```\n\n### Video\n\n```python\ngen = pony_flash.video.generate(\n    model=\"veo-3.1-fast\",\n    prompt=\"A timelapse of a city at night\",\n    duration=4,\n    resolution=\"720p\",\n    aspect_ratio=\"16:9\",\n    generate_audio=False,\n)\nprint(gen.url)\n```\n\n### Speech\n\n```python\ngen = pony_flash.speech.generate(\n    model=\"speech-2.8-hd\",\n    input=\"Hello, welcome to PonyFlash!\",\n    voice=\"English_Graceful_Lady\",\n)\nprint(gen.url)\n```\n\n### Music\n\n```python\ngen = pony_flash.music.generate(\n    model=\"music-2.5\",\n    prompt=\"An upbeat electronic dance track\",\n    duration=30,\n)\nprint(gen.url)\n```\n\n### List models\n\n```python\npage = pony_flash.models.list()\nfor model in page.items:\n    print(f\"{model.id} ({model.type})\")\n```\n\n### Check balance\n\n```python\nbalance = pony_flash.account.credits()\nprint(f\"Balance: {balance.balance} {balance.currency}\")\n```\n\n## Local Media Editing with FFmpeg\n\n> No PonyFlash API key is needed for local editing, but local FFmpeg capability checks are mandatory.\n\n### When to use this path\n\nUse the local FFmpeg workflow when the user asks to:\n\n- trim or cut a video\n- merge or concatenate clips\n- transcode to a target format\n- extract audio\n- capture a frame \u002F thumbnail\n- verify subtitle support\n- prepare adaptive ASS subtitles\n- export a final edited file after PonyFlash generation\n\n### Preferred workflow\n\n1. Check dependencies:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\"\n```\n\n2. If subtitle work is needed:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\" --require-subtitles-filter\n```\n\n3. Prefer the stable script entrypoint:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" help\n```\n\n4. Before any multi-step editing task, create a temporary task workspace and keep **all** staged inputs and intermediate outputs inside it:\n\n```bash\ntaskDir=\"$(mktemp -d \"${TMPDIR:-\u002Ftmp}\u002Fponyflash-task.XXXXXX\")\"\n```\n\nUse this directory for:\n\n- downloaded source media;\n- generated `.srt` \u002F `.ass` files;\n- intermediate clips;\n- intermediate subtitled renders;\n- reusable inspection outputs that were not explicitly requested as final deliverables.\n\n5. Validate outputs after execution.\n\n6. After the task finishes, delete the temporary task workspace unless the user explicitly asked to keep intermediate artifacts.\n\n### Capability profiles\n\n- `basic`: requires `ffmpeg + ffprobe + libx264 + aac`\n- `full`: `basic` plus `subtitles` filter support\n\n### Preferred commands\n\n#### Probe media\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" probe --input \"input.mp4\"\n```\n\n#### Clip video\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" clip --input \"$taskDir\u002Finput.mp4\" --output \"$taskDir\u002Fclip.mp4\" --start \"00:00:05\" --duration \"8\"\n```\n\nFast copy mode only when the user explicitly wants speed \u002F near-lossless slicing:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" clip --mode copy --input \"$taskDir\u002Finput.mp4\" --output \"$taskDir\u002Fclip.mp4\" --start \"00:00:05\" --duration \"8\"\n```\n\n#### Concat clips\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" concat --input \"$taskDir\u002Fpart1.mp4\" --input \"$taskDir\u002Fpart2.mp4\" --output \"$taskDir\u002Fmerged.mp4\"\n```\n\nFallback to reencode if copy concat fails:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" concat --mode reencode --input \"$taskDir\u002Fpart1.mp4\" --input \"$taskDir\u002Fpart2.mp4\" --output \"$taskDir\u002Fmerged.mp4\"\n```\n\n#### Extract audio\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" extract-audio --input \"$taskDir\u002Finput.mp4\" --output \"$taskDir\u002Faudio.m4a\"\n```\n\n#### Transcode\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" transcode --input \"$taskDir\u002Finput.mov\" --output \"$taskDir\u002Foutput.mp4\"\n```\n\n#### Capture frame\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" frame --input \"$taskDir\u002Finput.mp4\" --output \"$taskDir\u002Fcover.jpg\" --time \"00:00:03\"\n```\n\n### Subtitle workflow\n\nFor `.srt` \u002F `.ass` burn-in:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\" --require-subtitles-filter\n```\n\nIf subtitle style is unspecified, the agent should use the default subtitle workflow, which stages its runtime font temporarily and cleans it up after export.\n\nPreferred stable entrypoint:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" subtitle-burn --input \"$taskDir\u002Finput.mp4\" --subtitle-file \"$taskDir\u002Fsubtitles.srt\" --output \"final-output.mp4\"\n```\n\nIf the task needs adaptive line wrapping or controlled subtitle layout, or if you need to understand the underlying steps:\n\n```bash\npython3 \"{baseDir}\u002Fscripts\u002Fbuild_ass_subtitles.py\" --help\n```\n\nDefault burn pattern:\n\n1. Probe width and height:\n\n```bash\nffprobe -hide_banner -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0:s=x \"input.mp4\"\n```\n\n2. Use the stable subtitle entrypoint when the user only wants the final rendered video:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" subtitle-burn --input \"$taskDir\u002Finput.mp4\" --subtitle-file \"$taskDir\u002Fsubtitles.srt\" --output \"final-output.mp4\"\n```\n\nThis path keeps only the final `final-output.mp4` by default and removes temporary ASS files and staged fonts. If the user did not explicitly request any staged files, the agent should also delete `$taskDir` after moving or confirming the final deliverable.\n\n3. Build a default ASS subtitle file only when the user explicitly wants to keep or inspect it:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fensure_subtitle_fonts.sh\"\n\npython3 \"{baseDir}\u002Fscripts\u002Fbuild_ass_subtitles.py\" \\\n  --subtitle-file \"$taskDir\u002Fsubtitles.srt\" \\\n  --output-ass \"$taskDir\u002Fsubtitles.ass\" \\\n  --video-width 1920 \\\n  --video-height 1080 \\\n  --latin-font-file \"$HOME\u002F.cache\u002Fponyflash\u002Ffonts\u002FNotoSansCJKsc-Regular.otf\" \\\n  --cjk-font-file \"$HOME\u002F.cache\u002Fponyflash\u002Ffonts\u002FNotoSansCJKsc-Regular.otf\"\n```\n\n4. Burn subtitles with the prepared runtime font:\n\n```bash\nffmpeg -i \"$taskDir\u002Finput.mp4\" \\\n  -vf \"subtitles=$taskDir\u002Fsubtitles.ass:fontsdir=$HOME\u002F.cache\u002Fponyflash\u002Ffonts\" \\\n  -c:v libx264 -preset medium -crf 18 -c:a aac -b:a 192k -movflags +faststart \"final-output.mp4\"\n```\n\nDefault subtitle references:\n\n- Font notes: `{baseDir}\u002Fassets\u002Ffonts.md`\n- Subtitle style: `{baseDir}\u002Fassets\u002Fsubtitle-style.md`\n- Decision rules: `{baseDir}\u002Freference\u002Foperations.md`\n- Examples: `{baseDir}\u002Freference\u002Fexamples.md`\n\n### Decision rules\n\n- Clip tasks: default to `reencode`; use `copy` only when the user explicitly wants speed \u002F minimal loss.\n- Concat tasks: default to `copy`; fallback to `reencode` if source parameters differ.\n- Audio extraction: default to AAC in `.m4a`.\n- Transcode: default to `mp4 + libx264 + aac`.\n- Subtitle tasks: if subtitle style is unspecified, use the default subtitle workflow, prepared runtime font, and default subtitle styling rules.\n- Subtitle tasks: prefer `subtitles`; use `drawtext` only as a plain text fallback.\n- Do not overwrite outputs unless the user explicitly allows it.\n- Unless the user explicitly asks to keep intermediate artifacts, remove temporary ASS files, temporary font directories, concat lists, and failed partial outputs after the task finishes.\n- Unless the user explicitly asks to keep intermediate artifacts, stage all non-final files inside `taskDir` and delete `taskDir` at the end of the task.\n\n### Failure handling\n\n- If `ffmpeg` or `ffprobe` is missing, pause the task, help the user install FFmpeg if needed, and rerun the checks first.\n- If subtitle burn-in is requested but `subtitles` is missing, do not claim the machine can burn `.srt` \u002F `.ass`.\n- If only `drawtext` exists, explain that this is text overlay fallback, not full subtitle burn-in.\n- If concat copy mode fails, retry with `reencode`.\n- If scripts do not cover the exact request, explain the limitation and fall back to a raw `ffmpeg` command.\n\n## Error Handling for PonyFlash SDK\n\n```python\nfrom ponyflash import (\n    PonyFlash,\n    InsufficientCreditsError,\n    RateLimitError,\n    GenerationFailedError,\n    AuthenticationError,\n)\n\npony_flash = PonyFlash()\n\ntry:\n    gen = pony_flash.images.generate(model=\"nanobanana-pro\", prompt=\"A cat\")\nexcept AuthenticationError:\n    print(\"Invalid or missing API key.\")\n    print(\"Get your API key at: https:\u002F\u002Fapi.ponyflash.com\u002Fapi-key\")\nexcept InsufficientCreditsError as e:\n    print(f\"Not enough credits. Balance: {e.balance}, required: {e.required}\")\n    print(\"Top up credits at: https:\u002F\u002Fapi.ponyflash.com\u002Fusage\")\nexcept RateLimitError:\n    print(\"Rate limited — wait and retry\")\nexcept GenerationFailedError as e:\n    print(f\"Generation failed: {e.generation.error.code}\")\n```\n\n## More Examples\n\nFor advanced PonyFlash SDK usage:\nSee [examples\u002Fadvanced.md](examples\u002Fadvanced.md)\n\nFor FFmpeg task patterns:\n- [reference\u002Foperations.md](reference\u002Foperations.md)\n- [reference\u002Fexamples.md](reference\u002Fexamples.md)\n\n## API Reference\n\nFor complete method signatures, parameter types, and return type fields:\n\n- **Image generation**: [reference\u002Fimages.md](reference\u002Fimages.md)\n- **Video generation**: [reference\u002Fvideo.md](reference\u002Fvideo.md)\n- **Speech synthesis**: [reference\u002Fspeech.md](reference\u002Fspeech.md)\n- **Music generation**: [reference\u002Fmusic.md](reference\u002Fmusic.md)\n- **Model listing**: [reference\u002Fmodels.md](reference\u002Fmodels.md)\n- **File management**: [reference\u002Ffiles.md](reference\u002Ffiles.md)\n- **Account \u002F credits**: [reference\u002Faccount.md](reference\u002Faccount.md)\n- **FFmpeg operation strategy**: [reference\u002Foperations.md](reference\u002Foperations.md)\n- **FFmpeg examples**: [reference\u002Fexamples.md](reference\u002Fexamples.md)\n- **Subtitle fonts**: [assets\u002Ffonts.md](assets\u002Ffonts.md)\n- **Subtitle style**: [assets\u002Fsubtitle-style.md](assets\u002Fsubtitle-style.md)\n\n## Model Catalog\n\nFor all available models and their specific parameters, capabilities, and examples:\nSee [reference\u002Fmodels\u002FINDEX.md](reference\u002Fmodels\u002FINDEX.md)\n","# PonyFlash Skill\n\n## Step 0: Decide Which Capability Path Applies\n\nThis skill now contains **two capability families**:\n\n1. **Cloud generation via PonyFlash Python SDK**\n   - image generation\n   - video generation\n   - speech synthesis\n   - music generation\n   - model listing\n   - file management\n   - account \u002F credits\n   - These tasks **require a valid PonyFlash API key**.\n\n2. **Local media editing via FFmpeg toolchain**\n   - ffmpeg \u002F ffprobe detection\n   - installation planning\n   - clip \u002F concat \u002F transcode\n   - extract audio \u002F capture frame\n   - subtitle capability checks\n   - ASS subtitle generation and burn-in workflow\n   - These tasks **do NOT require a PonyFlash API key**, but they **do require local `ffmpeg` \u002F `ffprobe` support**.\n\nBefore doing anything, classify the request:\n\n- If the user is asking to **generate** media with PonyFlash models, follow the SDK path and require API key setup.\n- If the user is asking to **edit or process local media**, follow the FFmpeg path and do dependency checks first.\n- If the user wants an **end-to-end production workflow**, you may use both: generate assets with PonyFlash, then assemble or export with FFmpeg.\n\n## Step 1A: API Key Setup for PonyFlash SDK Tasks\n\nOnly do this section when the request needs PonyFlash cloud capabilities.\n\n**The FIRST time this skill is activated for a cloud generation task**, tell the user the following in your own words:\n\n1. PonyFlash skill is ready to use.\n2. It can handle:\n   - image generation\n   - video generation\n   - speech synthesis\n   - music generation\n   - local media editing with FFmpeg\n3. For complex multi-step productions, there are **Creative Playbooks** in the `playbooks\u002F` directory.\n4. To use PonyFlash cloud generation, the user needs an API key:\n   - Register \u002F log in at **https:\u002F\u002Fwww.ponyflash.com**\n   - Get API key at **https:\u002F\u002Fwww.ponyflash.com\u002Fapi-key** (starts with `rk_`)\n   - Check credits at **https:\u002F\u002Fwww.ponyflash.com\u002Fusage**\n   - Paste the key back in the chat\n\n**On subsequent SDK activations**, check whether `PONYFLASH_API_KEY` is set in the environment. If not, ask the user for the key again.\n\nOnce received, set it up:\n\n```bash\nexport PONYFLASH_API_KEY=\"rk_xxx\"\n```\n\nThen install the SDK:\n\n```bash\npip install ponyflash\n```\n\n**Always verify the key works before any generation task:**\n\n```python\nfrom ponyflash import PonyFlash\n\npony_flash = PonyFlash(api_key=\"\u003Ckey from user>\")\nbalance = pony_flash.account.credits()\nprint(f\"Balance: {balance.balance} {balance.currency}\")\n```\n\nIf verification fails:\n- **Key invalid or missing** → direct user to https:\u002F\u002Fapi.ponyflash.com\u002Fapi-key\n- **Balance is zero** → direct user to https:\u002F\u002Fapi.ponyflash.com\u002Fusage to top up credits\n\n## Step 1B: Local Dependency Setup for FFmpeg Tasks\n\nOnly do this section when the request needs local editing, subtitle, or export work.\n\n1. First check local dependencies:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\"\n```\n\n2. If the task involves subtitles, do **capability checks**, not just existence checks:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\" --require-subtitles-filter\n```\n\n3. If `ffmpeg` \u002F `ffprobe` or required filters are missing:\n- Tell the user what is missing.\n- Ask whether the user wants platform-appropriate FFmpeg installation guidance.\n- After the user installs FFmpeg, rerun the dependency checks before continuing.\n\n## What this Skill Can Do\n\n| Capability | Resource | Description |\n|---|---|---|\n| Image generation | `pony_flash.images` | Text-to-image, image editing with mask\u002Freference images |\n| Video generation | `pony_flash.video` | Text-to-video, first-frame-to-video, OmniHuman, Motion Transfer |\n| Speech synthesis | `pony_flash.speech` | Text-to-speech with voice cloning, emotion control, speed, pitch |\n| Music generation | `pony_flash.music` | Text-to-music with lyrics, style, instrumental mode, continuation |\n| Model listing | `pony_flash.models` | List available models, get model details and supported modes |\n| File management | `pony_flash.files` | Upload, list, get, delete files |\n| Account | `pony_flash.account` | Check credit balance, get recharge link |\n| Local media editing | `scripts\u002Fmedia_ops.sh` | Clip, concat, transcode, extract audio, frame capture |\n| FFmpeg environment checks | `scripts\u002Fcheck_ffmpeg.sh` | Detect ffmpeg \u002F ffprobe and subtitle capabilities |\n| Subtitle font prep | `scripts\u002Fensure_subtitle_fonts.sh` | Keep a reusable local copy of the default subtitle font when explicitly requested |\n| ASS subtitle prep | `scripts\u002Fbuild_ass_subtitles.py` | Adaptive ASS subtitle generation with pre-wrapping |\n\n## Creative Playbooks (production workflows)\n\nThe `playbooks\u002F` directory contains **Creative Playbooks** — step-by-step production workflow guides for specific content types. Playbooks act as a director layer: they tell you **what to create and in what order**, while this SKILL.md tells you **how to execute generation and editing**.\n\n### When to use a playbook\n\n1. **User explicitly requests a playbook by name** → Read the corresponding file from `playbooks\u002F` and follow its workflow.\n2. **User asks to see available playbooks** → Read [playbooks\u002FINDEX.md](playbooks\u002FINDEX.md) and display the full list.\n3. **User's request is clearly a multi-step production task** → Suggest a matching playbook from [playbooks\u002FINDEX.md](playbooks\u002FINDEX.md) and ask whether to use it.\n4. **User's request is a single-step generation or editing task** → Proceed directly with the relevant SDK or FFmpeg capability. No playbook needed.\n\n### How to execute a playbook\n\nOnce a playbook is loaded:\n- Follow its workflow (asset prep → content generation → voice \u002F music → editing → output).\n- Use PonyFlash SDK for generation tasks and FFmpeg scripts for local assembly \u002F export tasks.\n- Confirm key creative decisions with the user before expensive generation.\n- Adapt prompts, durations, output format, and export strategy to the user's actual goal.\n\n### Creating custom playbooks\n\nWhen the user asks to create a new playbook, generate a markdown file in `playbooks\u002F` following this template:\n\n```markdown\n---\nname: Playbook Name\ndescription: One-line summary of what this playbook produces\ntags: [keyword1, keyword2, keyword3]\ndifficulty: beginner | intermediate | advanced\nestimated_credits: credit range estimate\noutput_format: format description (e.g., \"vertical 9:16 MP4\")\n---\n\n# Playbook Name\n\n## Use Cases\nWhen to use this playbook.\n\n## Workflow\n### Step 1: Asset Preparation\nWhat the user needs to provide; how to generate missing assets.\n\n### Step 2: Visual Content Generation\nWhich models to use, recommended parameters, prompt guidance.\n\n### Step 3: Voice \u002F Music\nSpeech synthesis + background music guidance.\n\n### Step 4: Editing \u002F Assembly\nHow to assemble, trim, subtitle, transcode, and export with the local FFmpeg workflow.\n\n### Step 5: Output \u002F Optimization\nRender settings, format recommendations.\n\n## Prompt Templates\nReusable prompt examples for this content type.\n\n## Notes\nBest practices, common pitfalls.\n```\n\nAfter creating the file, update [playbooks\u002FINDEX.md](playbooks\u002FINDEX.md) to include the new playbook.\n\n## PonyFlash SDK Core Concepts\n\n### Client initialization\n\n```python\nfrom ponyflash import PonyFlash\n\npony_flash = PonyFlash(api_key=\"rk_xxx\")\n```\n\nReads `PONYFLASH_API_KEY` from environment if `api_key` is omitted.\n\n### FileInput — zero-friction file handling\n\nAll file parameters accept any of these types:\n\n| Input type | Example | Behavior |\n|---|---|---|\n| URL string | `\"https:\u002F\u002Fexample.com\u002Fphoto.jpg\"` | Passed directly to API |\n| file_id string | `\"file_abc123\"` | Passed directly to API |\n| `Path` object | `Path(\"photo.jpg\")` | Auto-uploaded via presigned URL |\n| `open()` file | `open(\"photo.jpg\", \"rb\")` | Auto-uploaded via presigned URL |\n| `bytes` | `image_bytes` | Auto-uploaded via presigned URL |\n| `(filename, bytes)` tuple | `(\"photo.jpg\", data)` | Auto-uploaded with filename |\n\nTemp uploads are cleaned up automatically after `generate()` completes.\n\nPlain local string paths such as `\".\u002Fphoto.jpg\"` are not supported. For local files, always use `Path(...)` or `open(..., \"rb\")`.\n\n### Generation result\n\n`Generation` object fields: `request_id`, `status`, `outputs`, `usage`, `error`.\n\nConvenience properties:\n- `gen.url` — first output URL (or `None`)\n- `gen.urls` — list of all output URLs\n- `gen.credits` — credits consumed\n\n## Quick Examples (PonyFlash SDK)\n\n### Image\n\n```python\ngen = pony_flash.images.generate(\n    model=\"nano-banana-pro\",\n    prompt=\"A sunset over mountains\",\n    resolution=\"2K\",\n    aspect_ratio=\"16:9\",\n)\nprint(gen.url)\n```\n\n### Video\n\n```python\ngen = pony_flash.video.generate(\n    model=\"veo-3.1-fast\",\n    prompt=\"A timelapse of a city at night\",\n    duration=4,\n    resolution=\"720p\",\n    aspect_ratio=\"16:9\",\n    generate_audio=False,\n)\nprint(gen.url)\n```\n\n### Speech\n\n```python\ngen = pony_flash.speech.generate(\n    model=\"speech-2.8-hd\",\n    input=\"Hello, welcome to PonyFlash!\",\n    voice=\"English_Graceful_Lady\",\n)\nprint(gen.url)\n```\n\n### Music\n\n```python\ngen = pony_flash.music.generate(\n    model=\"music-2.5\",\n    prompt=\"An upbeat electronic dance track\",\n    duration=30,\n)\nprint(gen.url)\n```\n\n### List models\n\n```python\npage = pony_flash.models.list()\nfor model in page.items:\n    print(f\"{model.id} ({model.type})\")\n```\n\n### Check balance\n\n```python\nbalance = pony_flash.account.credits()\nprint(f\"Balance: {balance.balance} {balance.currency}\")\n```\n\n## Local Media Editing with FFmpeg\n\n> No PonyFlash API key is needed for local editing, but local FFmpeg capability checks are mandatory.\n\n### When to use this path\n\nUse the local FFmpeg workflow when the user asks to:\n\n- trim or cut a video\n- merge or concatenate clips\n- transcode to a target format\n- extract audio\n- capture a frame \u002F thumbnail\n- verify subtitle support\n- prepare adaptive ASS subtitles\n- export a final edited file after PonyFlash generation\n\n### Preferred workflow\n\n1. Check dependencies:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\"\n```\n\n2. If subtitle work is needed:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\" --require-subtitles-filter\n```\n\n3. Prefer the stable script entrypoint:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" help\n```\n\n4. Before any multi-step editing task, create a temporary task workspace and keep **all** staged inputs and intermediate outputs inside it:\n\n```bash\ntaskDir=\"$(mktemp -d \"${TMPDIR:-\u002Ftmp}\u002Fponyflash-task.XXXXXX\")\"\n```\n\nUse this directory for:\n\n- downloaded source media;\n- generated `.srt` \u002F `.ass` files;\n- intermediate clips;\n- intermediate subtitled renders;\n- reusable inspection outputs that were not explicitly requested as final deliverables.\n\n5. Validate outputs after execution.\n\n6. After the task finishes, delete the temporary task workspace unless the user explicitly asked to keep intermediate artifacts.\n\n### Capability profiles\n\n- `basic`: requires `ffmpeg + ffprobe + libx264 + aac`\n- `full`: `basic` plus `subtitles` filter support\n\n### Preferred commands\n\n#### Probe media\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" probe --input \"input.mp4\"\n```\n\n#### Clip video\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" clip --input \"$taskDir\u002Finput.mp4\" --output \"$taskDir\u002Fclip.mp4\" --start \"00:00:05\" --duration \"8\"\n```\n\nFast copy mode only when the user explicitly wants speed \u002F near-lossless slicing:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" clip --mode copy --input \"$taskDir\u002Finput.mp4\" --output \"$taskDir\u002Fclip.mp4\" --start \"00:00:05\" --duration \"8\"\n```\n\n#### Concat clips\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" concat --input \"$taskDir\u002Fpart1.mp4\" --input \"$taskDir\u002Fpart2.mp4\" --output \"$taskDir\u002Fmerged.mp4\"\n```\n\nFallback to reencode if copy concat fails:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" concat --mode reencode --input \"$taskDir\u002Fpart1.mp4\" --input \"$taskDir\u002Fpart2.mp4\" --output \"$taskDir\u002Fmerged.mp4\"\n```\n\n#### Extract audio\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" extract-audio --input \"$taskDir\u002Finput.mp4\" --output \"$taskDir\u002Faudio.m4a\"\n```\n\n#### Transcode\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" transcode --input \"$taskDir\u002Finput.mov\" --output \"$taskDir\u002Foutput.mp4\"\n```\n\n#### Capture frame\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" frame --input \"$taskDir\u002Finput.mp4\" --output \"$taskDir\u002Fcover.jpg\" --time \"00:00:03\"\n```\n\n### Subtitle workflow\n\nFor `.srt` \u002F `.ass` burn-in:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fcheck_ffmpeg.sh\" --require-subtitles-filter\n```\n\nIf subtitle style is unspecified, the agent should use the default subtitle workflow, which stages its runtime font temporarily and cleans it up after export.\n\nPreferred stable entrypoint:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" subtitle-burn --input \"$taskDir\u002Finput.mp4\" --subtitle-file \"$taskDir\u002Fsubtitles.srt\" --output \"final-output.mp4\"\n```\n\nIf the task needs adaptive line wrapping or controlled subtitle layout, or if you need to understand the underlying steps:\n\n```bash\npython3 \"{baseDir}\u002Fscripts\u002Fbuild_ass_subtitles.py\" --help\n```\n\nDefault burn pattern:\n\n1. Probe width and height:\n\n```bash\nffprobe -hide_banner -v error -select_streams v:0 -show_entries stream=width,height -of csv=p=0:s=x \"input.mp4\"\n```\n\n2. Use the stable subtitle entrypoint when the user only wants the final rendered video:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fmedia_ops.sh\" subtitle-burn --input \"$taskDir\u002Finput.mp4\" --subtitle-file \"$taskDir\u002Fsubtitles.srt\" --output \"final-output.mp4\"\n```\n\nThis path keeps only the final `final-output.mp4` by default and removes temporary ASS files and staged fonts. If the user did not explicitly request any staged files, the agent should also delete `$taskDir` after moving or confirming the final deliverable.\n\n3. Build a default ASS subtitle file only when the user explicitly wants to keep or inspect it:\n\n```bash\nbash \"{baseDir}\u002Fscripts\u002Fensure_subtitle_fonts.sh\"\n\npython3 \"{baseDir}\u002Fscripts\u002Fbuild_ass_subtitles.py\" \\\n  --subtitle-file \"$taskDir\u002Fsubtitles.srt\" \\\n  --output-ass \"$taskDir\u002Fsubtitles.ass\" \\\n  --video-width 1920 \\\n  --video-height 1080 \\\n  --latin-font-file \"$HOME\u002F.cache\u002Fponyflash\u002Ffonts\u002FNotoSansCJKsc-Regular.otf\" \\\n  --cjk-font-file \"$HOME\u002F.cache\u002Fponyflash\u002Ffonts\u002FNotoSansCJKsc-Regular.otf\"\n```\n\n4. Burn subtitles with the prepared runtime font:\n\n```bash\nffmpeg -i \"$taskDir\u002Finput.mp4\" \\\n  -vf \"subtitles=$taskDir\u002Fsubtitles.ass:fontsdir=$HOME\u002F.cache\u002Fponyflash\u002Ffonts\" \\\n  -c:v libx264 -preset medium -crf 18 -c:a aac -b:a 192k -movflags +faststart \"final-output.mp4\"\n```\n\nDefault subtitle references:\n\n- Font notes: `{baseDir}\u002Fassets\u002Ffonts.md`\n- Subtitle style: `{baseDir}\u002Fassets\u002Fsubtitle-style.md`\n- Decision rules: `{baseDir}\u002Freference\u002Foperations.md`\n- Examples: `{baseDir}\u002Freference\u002Fexamples.md`\n\n### Decision rules\n\n- Clip tasks: default to `reencode`; use `copy` only when the user explicitly wants speed \u002F minimal loss.\n- Concat tasks: default to `copy`; fallback to `reencode` if source parameters differ.\n- Audio extraction: default to AAC in `.m4a`.\n- Transcode: default to `mp4 + libx264 + aac`.\n- Subtitle tasks: if subtitle style is unspecified, use the default subtitle workflow, prepared runtime font, and default subtitle styling rules.\n- Subtitle tasks: prefer `subtitles`; use `drawtext` only as a plain text fallback.\n- Do not overwrite outputs unless the user explicitly allows it.\n- Unless the user explicitly asks to keep intermediate artifacts, remove temporary ASS files, temporary font directories, concat lists, and failed partial outputs after the task finishes.\n- Unless the user explicitly asks to keep intermediate artifacts, stage all non-final files inside `taskDir` and delete `taskDir` at the end of the task.\n\n### Failure handling\n\n- If `ffmpeg` or `ffprobe` is missing, pause the task, help the user install FFmpeg if needed, and rerun the checks first.\n- If subtitle burn-in is requested but `subtitles` is missing, do not claim the machine can burn `.srt` \u002F `.ass`.\n- If only `drawtext` exists, explain that this is text overlay fallback, not full subtitle burn-in.\n- If concat copy mode fails, retry with `reencode`.\n- If scripts do not cover the exact request, explain the limitation and fall back to a raw `ffmpeg` command.\n\n## Error Handling for PonyFlash SDK\n\n```python\nfrom ponyflash import (\n    PonyFlash,\n    InsufficientCreditsError,\n    RateLimitError,\n    GenerationFailedError,\n    AuthenticationError,\n)\n\npony_flash = PonyFlash()\n\ntry:\n    gen = pony_flash.images.generate(model=\"nanobanana-pro\", prompt=\"A cat\")\nexcept AuthenticationError:\n    print(\"Invalid or missing API key.\")\n    print(\"Get your API key at: https:\u002F\u002Fapi.ponyflash.com\u002Fapi-key\")\nexcept InsufficientCreditsError as e:\n    print(f\"Not enough credits. Balance: {e.balance}, required: {e.required}\")\n    print(\"Top up credits at: https:\u002F\u002Fapi.ponyflash.com\u002Fusage\")\nexcept RateLimitError:\n    print(\"Rate limited — wait and retry\")\nexcept GenerationFailedError as e:\n    print(f\"Generation failed: {e.generation.error.code}\")\n```\n\n## More Examples\n\nFor advanced PonyFlash SDK usage:\nSee [examples\u002Fadvanced.md](examples\u002Fadvanced.md)\n\nFor FFmpeg task patterns:\n- [reference\u002Foperations.md](reference\u002Foperations.md)\n- [reference\u002Fexamples.md](reference\u002Fexamples.md)\n\n## API Reference\n\nFor complete method signatures, parameter types, and return type fields:\n\n- **Image generation**: [reference\u002Fimages.md](reference\u002Fimages.md)\n- **Video generation**: [reference\u002Fvideo.md](reference\u002Fvideo.md)\n- **Speech synthesis**: [reference\u002Fspeech.md](reference\u002Fspeech.md)\n- **Music generation**: [reference\u002Fmusic.md](reference\u002Fmusic.md)\n- **Model listing**: [reference\u002Fmodels.md](reference\u002Fmodels.md)\n- **File management**: [reference\u002Ffiles.md](reference\u002Ffiles.md)\n- **Account \u002F credits**: [reference\u002Faccount.md](reference\u002Faccount.md)\n- **FFmpeg operation strategy**: [reference\u002Foperations.md](reference\u002Foperations.md)\n- **FFmpeg examples**: [reference\u002Fexamples.md](reference\u002Fexamples.md)\n- **Subtitle fonts**: [assets\u002Ffonts.md](assets\u002Ffonts.md)\n- **Subtitle style**: [assets\u002Fsubtitle-style.md](assets\u002Fsubtitle-style.md)\n\n## Model Catalog\n\nFor all available models and their specific parameters, capabilities, and examples:\nSee [reference\u002Fmodels\u002FINDEX.md](reference\u002Fmodels\u002FINDEX.md)\n",{"name":5,"license":15,"metadata":51,"description":7},{"author":5,"version":52},"0.3.0","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill ponyflash",{"tool":68,"command":69},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill ponyflash",{"tool":71,"command":72},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill ponyflash","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002FSKILL.md",true,[76,82,86,92,98,103,107,111,115,119,123,127,131,135,139,143,147,151,155,159,163,167,171,175,179,183,187,191,195,199,203,207,211],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"assets\u002Ffonts.md","ASSET","资产文件",1629,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fassets\u002Ffonts.md",{"path":83,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":84,"sourceHtmlUrl":85},"assets\u002Fsubtitle-style.md",3031,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fassets\u002Fsubtitle-style.md",{"path":87,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":90,"sourceHtmlUrl":91},"examples\u002Fadvanced.md","REFERENCE","参考文档",3377,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fexamples\u002Fadvanced.md",{"path":93,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":96,"sourceHtmlUrl":97},"examples\u002Fquickstart.py","SCRIPT","脚本",1954,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fexamples\u002Fquickstart.py",{"path":99,"resourceType":99,"resourceTypeDesc":100,"sizeBytes":101,"sourceHtmlUrl":102},"LICENSE","许可证",1080,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002FLICENSE",{"path":104,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":105,"sourceHtmlUrl":106},"playbooks\u002Fcrepal-director.md",21681,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fplaybooks\u002Fcrepal-director.md",{"path":108,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":109,"sourceHtmlUrl":110},"playbooks\u002FINDEX.md",1270,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fplaybooks\u002FINDEX.md",{"path":112,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":113,"sourceHtmlUrl":114},"README.md",6479,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002FREADME.md",{"path":116,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":117,"sourceHtmlUrl":118},"reference\u002Faccount.md",1134,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Faccount.md",{"path":120,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":121,"sourceHtmlUrl":122},"reference\u002Fexamples.md",6118,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fexamples.md",{"path":124,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":125,"sourceHtmlUrl":126},"reference\u002Ffiles.md",2001,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Ffiles.md",{"path":128,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":129,"sourceHtmlUrl":130},"reference\u002Fimages.md",1768,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fimages.md",{"path":132,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":133,"sourceHtmlUrl":134},"reference\u002Fmodels.md",2565,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels.md",{"path":136,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":137,"sourceHtmlUrl":138},"reference\u002Fmodels\u002FINDEX.md",9799,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002FINDEX.md",{"path":140,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":141,"sourceHtmlUrl":142},"reference\u002Fmodels\u002Fmusic-2.5.md",3137,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fmusic-2.5.md",{"path":144,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":145,"sourceHtmlUrl":146},"reference\u002Fmodels\u002Fnano-banana-2.md",1878,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fnano-banana-2.md",{"path":148,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":149,"sourceHtmlUrl":150},"reference\u002Fmodels\u002Fnano-banana-pro.md",1797,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fnano-banana-pro.md",{"path":152,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":153,"sourceHtmlUrl":154},"reference\u002Fmodels\u002Fnanobanana-pro.md",1834,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fnanobanana-pro.md",{"path":156,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":157,"sourceHtmlUrl":158},"reference\u002Fmodels\u002Fseedance-1.5-pro.md",1803,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fseedance-1.5-pro.md",{"path":160,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":161,"sourceHtmlUrl":162},"reference\u002Fmodels\u002Fseedream-5-lite.md",1942,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fseedream-5-lite.md",{"path":164,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":165,"sourceHtmlUrl":166},"reference\u002Fmodels\u002Fspeech-2.8-hd.md",3294,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fspeech-2.8-hd.md",{"path":168,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":169,"sourceHtmlUrl":170},"reference\u002Fmodels\u002Fspeech-2.8-turbo.md",1535,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fspeech-2.8-turbo.md",{"path":172,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":173,"sourceHtmlUrl":174},"reference\u002Fmodels\u002Fveo-3.1-fast.md",643,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fveo-3.1-fast.md",{"path":176,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":177,"sourceHtmlUrl":178},"reference\u002Fmodels\u002Fveo-3.1.md",1877,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmodels\u002Fveo-3.1.md",{"path":180,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":181,"sourceHtmlUrl":182},"reference\u002Fmusic.md",1363,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fmusic.md",{"path":184,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":185,"sourceHtmlUrl":186},"reference\u002Foperations.md",8725,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Foperations.md",{"path":188,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":189,"sourceHtmlUrl":190},"reference\u002Fspeech.md",1717,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fspeech.md",{"path":192,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":193,"sourceHtmlUrl":194},"reference\u002Fvideo.md",1849,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Freference\u002Fvideo.md",{"path":196,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":197,"sourceHtmlUrl":198},"scripts\u002Fbuild_ass_subtitles.py",14895,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fscripts\u002Fbuild_ass_subtitles.py",{"path":200,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":201,"sourceHtmlUrl":202},"scripts\u002Fcheck_ffmpeg.sh",5542,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fscripts\u002Fcheck_ffmpeg.sh",{"path":204,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":205,"sourceHtmlUrl":206},"scripts\u002Fensure_subtitle_fonts.sh",2472,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fscripts\u002Fensure_subtitle_fonts.sh",{"path":208,"resourceType":94,"resourceTypeDesc":95,"sizeBytes":209,"sourceHtmlUrl":210},"scripts\u002Fmedia_ops.sh",16334,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fscripts\u002Fmedia_ops.sh",{"path":212,"resourceType":88,"resourceTypeDesc":89,"sizeBytes":213,"sourceHtmlUrl":214},"skill-report.json",199650,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fponyflash\u002Fponyflash\u002Fskill-report.json",[216,226,236,245,251,258],{"skillNo":217,"name":218,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":219,"categories":220,"keywords":222,"publishedAt":46},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[221],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[223,224,225],"model","model hierarchy","model hierarchy skill",{"skillNo":227,"name":228,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":229,"categories":230,"keywords":232,"publishedAt":46},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[231],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[233,234,235],"MCP","zoom","zoom mcp",{"skillNo":237,"name":238,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":239,"categories":240,"keywords":241,"publishedAt":46},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[242,243,244,234],"sdk","zoom apps sdk","apps",{"skillNo":246,"name":247,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":248,"categories":249,"keywords":250,"publishedAt":46},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[247],{"skillNo":252,"name":253,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":254,"categories":255,"keywords":257,"publishedAt":46},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[256],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[253],{"skillNo":259,"name":260,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":261,"categories":262,"keywords":263,"publishedAt":46},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[260]]